基本知识

公钥加密算法使用的是成对的密钥:公钥和私钥,公钥可以公开,私钥不能被公开。比特币钱包实际上是一个密钥对,当你安装 一个钱包应用,或者是使用一个比特币客户端来生成一个新地址是,他就会为你生成一个密钥对。

代码实现

  func (cli *CLI) createWallet(nodeID string) {     //创建钱包的主函数wallets, _ := NewWallets(nodeID)   address := wallets.CreateWallet()wallets.SaveToFile(nodeID)fmt.Printf("Your new address: %s\n", address)
}

我们慢慢的分析这个程序,其中的NewWallets()函数如下,在这里先是定义了一个钱包集合,我们利用wallets结构体存储多个钱包,将他们保存到文件中或者从文件中进行加载,每个钱包都保存了一堆公钥和私钥。创建出了一个空的钱包集合后,便开始加载以前的钱包集合文件

func NewWallets(nodeID string) (*Wallets, error) {wallets := Wallets{}wallets.Wallets = make(map[string]*Wallet)err := wallets.LoadFromFile(nodeID)return &wallets, err
}type Wallets struct {Wallets map[string]*Wallet
}
type Wallet struct {PrivateKey ecdsa.PrivateKeyPublicKey  []byte
}
func (ws *Wallets) LoadFromFile(nodeID string) error {walletFile := fmt.Sprintf(walletFile, nodeID)    if _, err := os.Stat(walletFile); os.IsNotExist(err) {   //判断文件是否存在return err}fileContent, err := ioutil.ReadFile(walletFile)// ReadFile 读取文件中的所有数据,返回读取的数据和遇到的错误。//如果读取成功,则 err 返回 nil,而不是 EOF
func ReadFile(filename string) ([]byte, error)if err != nil {log.Panic(err)}var wallets Walletsgob.Register(elliptic.P256())//gob是Golang包自带的一个数据结构序列化的编码/解码工具。decoder := gob.NewDecoder(bytes.NewReader(fileContent))err = decoder.Decode(&wallets)//这里应该是一个解码的过程if err != nil {log.Panic(err)}ws.Wallets = wallets.Walletsreturn nil
}

再来看一看wallets.CreateWallet()方法,其中的NewWallet()如下, NewWallet()函数创建了一个钱包,我们可以根据公钥打印出相应的钱包对应的地址,然后将钱包存储到钱包集合结构体中

unc (ws *Wallets) CreateWallet() string {wallet := NewWallet()address := fmt.Sprintf("%s", wallet.GetAddress())ws.Wallets[address] = wallet  //存储到钱包集合中return address
}
func NewWallet() *Wallet {private, public := newKeyPair()   //得到公钥和私钥wallet := Wallet{private, public}  //存储到钱包结构体return &wallet
}
func newKeyPair() (ecdsa.PrivateKey, []byte) {curve := elliptic.P256()private, err := ecdsa.GenerateKey(curve, rand.Reader)if err != nil {log.Panic(err)}pubKey := append(private.PublicKey.X.Bytes(), private.PublicKey.Y.Bytes()...)return *private, pubKey
}//由公钥得到地址,具体方法见我的博客用 [“go语言实现比特币地址校验”](https://blog.csdn.net/m0_37719047/article/details/81945896)
func (w Wallet) GetAddress() []byte {     pubKeyHash := HashPubKey(w.PublicKey)  versionedPayload := append([]byte{version}, pubKeyHash...)checksum := checksum(versionedPayload)fullPayload := append(versionedPayload, checksum...)address := Base58Encode(fullPayload)return address
}

最后将创建好的钱包更新到存储钱包集合的文件中去

func (ws Wallets) SaveToFile(nodeID string) {var content bytes.Buffer     //开辟一个内存空间walletFile := fmt.Sprintf(walletFile, nodeID)gob.Register(elliptic.P256())encoder := gob.NewEncoder(&content)    //序列化结构体err := encoder.Encode(ws)if err != nil {log.Panic(err)}err = ioutil.WriteFile(walletFile, content.Bytes(), 0644)    //将序列化的数据写入到文件中去if err != nil {log.Panic(err)}
}

如果我们需要打印钱包集合中所有钱包对应的地址,我们可以利用以下的函数进行遍历。

func (cli *CLI) listAddresses(nodeID string) {wallets, err := NewWallets(nodeID)   //加载现有的钱包集合if err != nil {log.Panic(err)}addresses := wallets.GetAddresses()for _, address := range addresses {fmt.Println(address)}
}
func (ws *Wallets) GetAddresses() []string {var addresses []stringfor address := range ws.Wallets {addresses = append(addresses, address)}return addresses
}

通过以上的代码,我们便完成了钱包,实现了 创建钱包和遍历钱包的功能

参考

https://jeiwan.cc/

利用go语言创建钱包并遍历钱包(wallet)相关推荐

  1. C语言创建map,遍历map

    C语言创建map,遍历map 要实现的功能如下 完整源代码实现如下 要实现的功能如下 代码实现创建一个map,代码实现打印map 完整源代码实现如下 #include <iostream> ...

  2. c语言创建excel文件6,怎么利用c语言创建excel文件

    怎么利用c语言创建excel文件 想要利用c语言创建excel文件再把它导入excel其实很简单,如果数据简单的话,可以使用CSV(逗号分隔值)格式的文件.CSV格式的文件可以用OfficeExcel ...

  3. 利用C语言创建和使用DLL文件

                有感于讲C语言的DLL文件的文章很少,自己查了半天,写了这么个非常简单的教程.自己也是摸C语言不久,依然感觉处于编程苦手的阶段. 1)为什么使用DLL文件 C语言复用代码有很多 ...

  4. 利用go语言创建web server的两种方式

    相比于java/c#的mvc框架,go语言写web项目及其简单,创建一个web只需要简短的几行代码就可以实现功能: package mainimport "net/http"fun ...

  5. 利用C语言创建文件并输入文件内容。

    #include<stdio.h> #include<stdlib.h> #include<string.h> #define AS 200 char* ty(ch ...

  6. 使用ethers.js创建以太坊HD钱包(生成BIP-039 + BIP-044钱包),在根据私钥、助记词找回钱包!

    一.什么是ethers.js ethers.js库旨在成为一个完整而紧凑的库,用于与以太坊区块链及其生态系统进行交互.它最初设计用于ethers.io,后来扩展为更通用的库.官方链接:https:// ...

  7. plsql创建表提示标识符过长_创建安全多签名钱包及高级设置

    在 Mist创建多签名钱包 Mist以太坊钱包有个选项是可以用多签名钱包使钱包里的余额更安全.用多签名钱包的好处是它需要多个账号共同批准才能够从余额中提取大额资金.创建多签名钱包之前,需要创建多个账号 ...

  8. 先根序列创建二叉树c语言,用C语言创建二叉树并先序遍历.doc

    用C语言创建二叉树并先序遍历 用C语言创建二叉树并 #include "stdio.h" #include "stdlib.h" typedef struct ...

  9. flutter创建/导入区块链钱包,获取余额

    flutter创建/导入区块链钱包,获取余额 作为区块链行业小白刚接触区块链钱包几天,来开发钱包还是需要付出很多努力的.下面记录一下flutter框架下创建/导入区块链钱包,并获取余额 一.创建钱包: ...

最新文章

  1. kingwell Calendar V1.0 日历时间组件
  2. 重写JFrame的扩大 缩小 关闭按钮 以及菜单等
  3. 解读三种虚拟化之路连载一:x86虚拟化概述
  4. 一个大一新生对于计算机学科的思考
  5. Mysql 连接的使用
  6. Firefox已阻止此网站安装未经验证的附加组件的解决办法
  7. winform通过WebClient调用api接口
  8. bootice添加黑苹果引导_Clover Configurator黑苹果 Clover 引导配置工具
  9. Simscape Multibody 多体动力学仿真教程(一)
  10. 傅里叶分析——傅里叶级数
  11. 短按SOS键实现开始与停止白光LED灯闪烁状态
  12. 基于python/scipy学习概率统计(3):正态分布
  13. 良心录屏工具Captura
  14. 西安工大计算机学院李颖,李颖 -西安交通大学人文社会科学学院
  15. C++实现 数字游戏之拼出最大数
  16. npm报错`webpack-dev-server --inline --progress --config build/webpack.dev.conf.js`
  17. 上海应届生落户政策计算机水平,上海直接可落户的应届生及2021具体评分标准...
  18. 20155305乔磊2016-2017-2《Java程序设计》第十周学习总结
  19. pngtree多达33000种ppt模板免费下载
  20. 计算机毕业论文java毕业设计论文题目ssm项目源码水果商城系统电商购物项目[包运行成功]

热门文章

  1. Golang后端开发学习之路
  2. linux用户管理(1)----创建用户(adduser和useradd)和删除用户(userdel)
  3. 联想g510升级换什么cpu好_老775平台还有升级CPU的必要吗?实测来告诉你
  4. OpenWrt设置路由器联网(无线)
  5. 汉信码今发布:国家自主研发的二维码技术
  6. 如何在CentOS上配置虚拟IP地址 (VIP)
  7. linux 卸载aria2,Linux一键安装Aria2 + AriaNg + Filebrowser
  8. 【001】机器学习基础-凸优化基础
  9. 【Excel-2010】四种方式筛选重复数据
  10. 给春节的宴客小吃来点小惊喜---绿茶甜心曲奇