建议和反馈

请填写你的反馈内容

使用Golang生成加密货币私钥和公共地址

2020-01-27 ·82次阅读 ·读完需要7分钟

生成比特币和流行的Altcoins的密钥和地址信息的过程几乎相同。实际上,差异是由通常与网络相关联的私钥和公钥前缀信息定义的。

我们将了解如何使用Go编程语言为各种加密货币硬币及其地址生成和导入私钥。

获取Go项目依赖项

与其重新发明轮子并开发我们自己的与加密货币相关的算法,我们将利用一组非常流行的软件包。

假设已安装Go并配置$ GOPATH,请执行以下操作:

go get github.com/btcsuite/btcutil
 go get github.com/btcsuite/btcd

我们将使用专门为比特币设计btcutilbtcd软件包,但我们将进行一些更改以支持大多数其他Altcoins。

安装了适当的软件包后,我们可以继续计算加密货币网络信息。

获取和计算私钥和公钥的前缀信息

当涉及所有加密货币硬币时,有各种各样的密钥前缀。这些前缀只是一个字节,可更改最终键的外观。

以比特币为例:

xpubkey:0x00 
xprivatekey:0x80

在我们弄清楚上述值的确切含义之前,您可能想知道我到底是如何得出这些值的。诚实的答案是,我会针对感兴趣的每个硬币,在官方硬币源代码存储库中进行挖掘。

如果查看流行的Bitcore存储库,您会在networks.js文件中注意到以下内容

{
    name: 'livenet',
    alias: 'mainnet',
    pubkeyhash: 0x00,
    privatekey: 0x80,
    scripthash: 0x05,
    xpubkey: 0x0488b21e,
    xprivkey: 0x0488ade4,
    networkMagic: 0xf9beb4d9,
    port: 8333,
    dnsSeeds: [
        'seed.bitcoin.sipa.be',
        'dnsseed.bluematt.me',
        'dnsseed.bitcoin.dashjr.org',
        'seed.bitcoinstats.com',
        'seed.bitnodes.io',
        'bitseed.xf2.org'
    ]
}

因此,是的,Bitcore存储库是一个Node.js项目,但这只是一个示例。您可以在不是Node.js的其他存储库中轻松找到此信息。

现在让我们看一看山寨币。让我们来看看Reddcoin(RDD):

{
    name: 'livenet',
    magic: hex('fbc0b6db'),
    addressVersion: 61,
    privKeyVersion: 189,
    P2SHVersion: 5,
    hkeyPublicVersion: 0x0488b21e,
    hkeyPrivateVersion: 0x0488ade4,
    genesisBlock: {
        hash: hex('CCDEC174EBD4FA10314B3B9EF9CB8ADCF9AA87E57EC6AD0D0E3C3C5AD9E068B8'),
        merkle_root: hex('FF79AF16A9FFEB1B826DE1EA7F24539A2FE3702FE987912B09072BC41DBC02B5'),
        height: 0,
        nonce: 222583475,
        version: 1,
        prev_hash: buffertools.fill(new Buffer(32), 0),
        timestamp: 1390280400,
        bits: 504365040
    },
    dnsSeeds: [
        'seed.reddcoin.com'
    ],
    defaultClientPort: 45444,
    lastPoWBlock: 260799
}

以上块取自Reddcore项目的networks.js文件。如您所见,信息有点不同。我们没有足够的幸运为我们提取字节信息。

使用Bitcoin Wiki,我们可以了解如何实际计算前缀。有了这些知识,我们可以找到一个十进制数为十六进制的计算器比如BinaryHex转换器,采取addressVersionprivKeyVersion上述并将它转换成的东西,我们可以使用。

我们想要的Reddcoin值如下:

xpubkey:0x3d xprivatekey:0xbd

根据您要完成本教程的内容,在官方的加密货币硬币存储库中进行一些挖掘。使用前缀信息,我们将能够完成很多工作。

开发用于生成Altcoin密钥的应用逻辑

安装依赖项并知道密钥的前缀信息后,我们就可以开始开发应用程序了。从以下代码开始,在新项目中的某个地方创建main.go文件:

package mainimport (
	"encoding/hex"
	"errors"

	"github.com/btcsuite/btcd/btcec"
	"github.com/btcsuite/btcd/chaincfg"
	"github.com/btcsuite/btcutil")type Network struct {
	name        string
	symbol      string
	xpubkey     byte
	xprivatekey byte}var network = map[string]Network{
	"rdd": {name: "reddcoin", symbol: "rdd", xpubkey: 0x3d, xprivatekey: 0xbd},
	"dgb": {name: "digibyte", symbol: "dgb", xpubkey: 0x1e, xprivatekey: 0x80},
	"btc": {name: "bitcoin", symbol: "btc", xpubkey: 0x00, xprivatekey: 0x80},
	"ltc": {name: "litecoin", symbol: "ltc", xpubkey: 0x30, xprivatekey: 0xb0},}func (network Network) GetNetworkParams() *chaincfg.Params { }func (network Network) CreatePrivateKey() (*btcutil.WIF, error) { }func (network Network) ImportPrivateKey(secretHex string) (*btcutil.WIF, error) { }func (network Network) ImportWIF(wifStr string) (*btcutil.WIF, error) { }func (network Network) GetAddress(wif *btcutil.WIF) (*btcutil.AddressPubKey, error) { }func main() {
    fmt.Println("Starting the application...")}

现在,我故意将这些方法留空。我们要强调的是,我们已经创建了一个数据结构,Network用于保存前缀信息。我们还将网络定义为,map以便我们可以轻松使用它们。

在使用网络信息生成密钥之前,我们需要进行设置。GetNetworkParams功能为例:

func (network Network) GetNetworkParams() *chaincfg.Params {
	networkParams := &chaincfg.MainNetParams
	networkParams.PubKeyHashAddrID = network.xpubkey
	networkParams.PrivateKeyID = network.xprivatekey
	return networkParams
}

然后,我们可以GetNetworkParams在创建或导入键的任何函数中使用该函数。例如,如果我们想创建密钥,我们将使用以下代码:

func (network Network) CreatePrivateKey() (*btcutil.WIF, error) {
	secret, err := btcec.NewPrivateKey(btcec.S256())
	if err != nil {
		return nil, err
	}
	return btcutil.NewWIF(secret, network.GetNetworkParams(), true)
}

上面的代码将使用传递的网络的网络参数生成一个新的专用WIF密钥。如果我们想解决这个问题,我们可以接受WIF密钥并针对特定网络进行验证:

func (network Network) ImportWIF(wifStr string) (*btcutil.WIF, error) {
	wif, err := btcutil.DecodeWIF(wifStr)
	if err != nil {
		return nil, err
	}
	if !wif.IsForNet(network.GetNetworkParams()) {
		return nil, errors.New("The WIF string is not valid for the `" + network.name + "` network")
	}
	return wif, nil
}

在上面的代码中,我们接受一个WIF字符串。如果WIF字符串格式错误,我们将返回错误。在这种情况下,格式不正确并不意味着对于特定网络而言不正确。确认WIF密钥没有格式错误后,我们可以验证该密钥对于特定网络是正确的,然后将其返回。

由于我们现在可能已经创建或导入了WIF密钥,因此我们可能应该创建一个公共地址。毕竟,您不想共享您的WIF密钥。

func (network Network) GetAddress(wif *btcutil.WIF) (*btcutil.AddressPubKey, error) {    
    	return btcutil.NewAddressPubKey(wif.PrivKey.PubKey().SerializeCompressed(), network.GetNetworkParams())
    }

上面的代码将使用WIF密钥,并将其与网络信息一起使用以创建公共地址。在为比特币或类似的Altcoins创建加密货币钱包时,实际上只需要WIF密钥和公共地址。

要测试我们的代码,我们可以执行以下操作:

func main() {
    fmt.Println("Starting the application...")
    wif, _ := network["btc"].CreatePrivateKey()
    address, _ := network["btc"].GetAddress(wif)
    fmt.Printf("%s - %s", wif.String(), address.EncodeAddress())
}

看看我们如何利用map以上代码?我们要说的是,我们要创建一个比特币WIF密钥以及一个比特币的公共地址,并同时打印两者。如果我们想使用其他加密货币,我们将在map变量中对其进行不同的定义

结论

您刚刚看到了如何为比特币和其他加密货币Altcoins生成WIF密钥。通过确定所需硬币的网络信息,您可以生成,导入和验证各种硬币。

当涉及到区块链时,每个btcutilbtcd软件包都做很多事情,远远超出了本教程中使用的示例。


  • 上一篇:在Go中构建区块链 第1部分:基本原型
  • 下一篇:已经没有了!
  • 评论(0)问答(0)
    请先登录或注册

    请先登陆或注册

    相关推荐

    在Go中构建区块链 第1部分:基本原型

    区块链是21世纪最具革命性的技术之一,它仍在日趋成熟,并且其潜力尚未完全实现。从本质上讲,区块链只是记录的分布式数据库。但是,使它与众不同的是它不是私有数据库,而是一个公共数据库,即使用它的每个人都拥......
    区块链论坛 · 2020-01-27
    180阅读 · 0赞赏 · 0问答

    开发区块链Android应用的7个基本技巧

    在过去的几年中,区块链技术已经改变了我们开发和配置与互联网和移动应用程序相关的所有事物的方式,事实证明,它是近来最具突破性的技术之一,结果,数字业务一直密切关注区块链及其应用。适当配置区块链后,它可以......
    区块链论坛 · 2020-01-21
    651阅读 · 0赞赏 · 0问答

    Ubuntu安装Golang编程语言

    在本教程中,我们在Ubuntu Linux上安装了Google Go编程语言。然后,我们使用GOPATH环境变量配置Go Workspace环境。Golang,也称为Go,是Google开发的一种开源......
    波bobo · 2020-01-20
    664阅读 · 0赞赏 · 0问答

    GOPROXY手册

    1.环境手动教程,默认系统是linux,程序是proxy;所有操作都需要root特权;如果您使用的是Windows,请使用Windows版本的proxy.exe。2.使用配置文件下一个教程将通过命令行......
    江南烟雨 · 2020-01-20
    624阅读 · 0赞赏 · 0问答

    如何构建一个基于actor的简单区块链

    在本文中,我将展示构建简单区块链原型的开发过程,让我们从对区块链的一些介绍开始。之后,我们可以定义将要实现的简化模型。区块链快速入门有很多很好的文章解释了区块链的工作原理,因此我将做一个高层次的介绍,......
    区块链网 · 2020-01-19
    539阅读 · 0赞赏 · 0问答

    1591

    LK币

    18

    粉丝

    77

    笔记

    感谢"区块链网"

    这篇精彩的笔记,目前已经帮助

    • 0
    • 0
    • 0
    • 8
    • 2
    喜欢0
    链客社群 加入

    微博进入

    商务合作>

    广告投放>

    公司名称:北京链客行科技有限公司

    联系方式:010-67707199

    ICP备案号:京ICP备18032136号

    Copyright:链客区块链技术问答社区 版权所有

    感谢您的提问,问题被社区永久收入以便新人查看。一定要记得采纳最佳答案哦!加油!

    感谢您的善举,每一次解答会成为新人的灯塔,回答被采纳后获得20算力和相应的LK币奖励

    您将赞赏给对方2LK币的奖励哦!感谢您的赞赏!

    您将赞赏给对方2LK币的奖励哦!感谢您的赞赏!