- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章go语言实现简易比特币系统钱包的原理解析由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
钱包基础概念 。
钱包结构体 。
1
2
3
4
5
6
|
type Wallet struct {
//私钥
Private *ecdsa.PrivateKey
//约定,这里的PubKey不存储原始的公钥,而是存储X和Y拼接的字符串,在校验端重新拆分(参考r,s传递)
PubKey []byte
}
|
创建钱包 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
func NewWallet() *Wallet {
//创建曲线
curve := elliptic.P256()
//生成私钥
privateKey, err := ecdsa.GenerateKey(curve, rand.Reader)
if err != nil {
log.Panic(err)
}
//生成公钥
pubKeyOrig := privateKey.PublicKey
//拼接X, Y
pubKey := append(pubKeyOrig.X.Bytes(), pubKeyOrig.Y.Bytes()...)
return &Wallet{Private: privateKey, PubKey: pubKey}
}
|
钱包集结构体 。
1
2
3
4
5
|
//定一个 Wallets结构,它保存所有的wallet以及它的地址
type Wallets struct {
//map[地址]钱包
WalletsMap map[string]*Wallet
}
|
创建钱包集 。
1
2
3
4
5
6
7
|
func NewWallets() *Wallets {
var ws Wallets
ws.WalletsMap = make(map[string]*Wallet)
//加载本地钱包,把新建的钱包保存到本地
ws.loadFile()
return &ws
}
|
创建钱包到钱包集 。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
func (ws *Wallets) CreateWallet() string {
//创建一个钱包
wallet := NewWallet()
address := wallet.NewAddress()
//添加到钱包集
ws.WalletsMap[address] = wallet
//保存包本地
ws.saveToFile()
//返回创建钱包的地址
return address
}
|
保存钱包到本地 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
func (ws *Wallets) saveToFile() {
var buffer bytes.Buffer
gob.Register(elliptic.P256())
encoder := gob.NewEncoder(&buffer)
err := encoder.Encode(ws)
//一定要注意校验!!!
if err != nil {
log.Panic(err)
}
ioutil.WriteFile(walletFile, buffer.Bytes(), 0600)
}
|
读取钱包集里的钱包 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
func (ws *Wallets) loadFile() {
//在读取之前,要先确认文件是否在,如果不存在,直接退出
_, err := os.Stat(walletFile)
if os.IsNotExist(err) {
return
}
//读取内容
content, err := ioutil.ReadFile(walletFile)
if err != nil {
log.Panic(err)
}
//解码
gob.Register(elliptic.P256())
decoder := gob.NewDecoder(bytes.NewReader(content))
var wsLocal Wallets
err = decoder.Decode(&wsLocal)
if err != nil {
log.Panic(err)
}
ws.WalletsMap = wsLocal.WalletsMap
}
|
列出所有钱包的地址 。
1
2
3
4
5
6
7
8
9
|
func (ws *Wallets) ListAllAddresses() []string {
var addresses []string
//遍历钱包,将所有的key取出来返回
for address := range ws.WalletsMap {
addresses = append(addresses, address)
}
return addresses
}
|
生成钱包地址 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
//生成地址
func (w *Wallet) NewAddress() string {
//钱包公钥
pubKey := w.PubKey
//计算公钥哈希和ripe160
rip160HashValue := HashPubKey(pubKey)
//主网版本号为0x00
version := byte(00)
//拼接version
payload := append([]byte{version}, rip160HashValue...)
//校验码checksum
checkCode := CheckSum(payload)
//拼接版本、哈希值、校验码、25字节数据
payload = append(payload, checkCode...)
//base58编码
address := base58.Encode(payload)
return address
}
|
结束 。
源码:https://gitee.com/xiaoshengdada/go_bitcoin/tree/master/v5 。
到此这篇关于go语言实现简易比特币系统钱包的原理解析的文章就介绍到这了,更多相关go实现比特币钱包内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://blog.csdn.net/qq_31639829/article/details/115426339 。
最后此篇关于go语言实现简易比特币系统钱包的原理解析的文章就讲到这里了,如果你想了解更多关于go语言实现简易比特币系统钱包的原理解析的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 已关闭 9 年前。 Improve
根据其他问题的列表,要构建我需要的原始交易: listunspent - 您可以获得所有未花费交易的列表 您可以决定要花哪些钱 您使用createrawtransaction来创建您的输入/输出,tx
我想查看不在我钱包中的btc地址余额。似乎像 blockchainexplorer 这样的网站会做这类事情。他们还提供 API,但我遇到了他们的 API 使用限制。所以我下载了完整的区 block 链
我的设置:在 Mongoose 模块的帮助下,我们处理所有 Mongo 数据库操作。对于每个新用户,都会生成一个钱包并将其存储在 Mongo 集合中。 方法:如果我们使用User.find({}, f
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
我正在尝试建立一个以比特币为中心的网站,并且由于主机的限制,我需要能够执行以下操作,而无需在任何服务器上运行比特币守护程序: 创建一个新的比特币地址(getnewaddress($account))
我目前正在开发一个比特币应用程序,它涉及运行一个完整的比特币节点。 当我测试我的源代码时,我决定使用比特币注册测试模式。 这是我如何启动我的比特币节点: ./bitcoind -regtest -rp
私钥是随机生成的,不与任何钱包关联。 我想为比特币准备公钥生成的自定义(简单)实现。然而,经过几次尝试,我的结果是不正确的。我将它们与在线生成器进行了比较。我发现我使用了除法而不是 modinv。不幸
我是比特币和区 block 链的新手,希望您能帮助我解决一些问题。所以我启动了一个“regtest”网络并使用 生成了 101 个 block bitcoin-cli -regtest generat
当我在我的 bitcoind 服务器上调用 getwork 时,我得到以下信息: ./bitcoind getwork { "midstate" : "695d56ae173bbd0fd5f5
我正在编写一个 JavaScript 函数来返回当前的 BTC/USD 汇率。我做了一些研究,但我只想要一些简单的东西。它不会在服务器端用于计算值(明显的安全隐患),而只是为了方便我的用户。我有 2
我正在使用 Bitrise 生成构建并将其上传到 AppStore。当我在设备上运行应用程序或生成构建并通过 Xcode 上传到 AppStore 时没有出现任何错误,但是当我尝试通过 Bitrise
我目前正在我的 Windows 7 上创建“比特币”。 我已经完成了所有必要的步骤,现在我要进行最后一部分,以获取 .exe 文件。 这是我在 QT 4.8.5 命令提示符中输入的命令 qmake U
以下链接提供有关 BTC 地址的 JSON 数据 -> https://blockchain.info/address/1GA9RVZHuEE8zm4ooMTiqLicfnvymhzRVm?forma
我是一名优秀的程序员,十分优秀!