版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bondsui/article/details/85780452
以太坊HD钱包开发 一 —— 钱包概念介绍
https://blog.csdn.net/bondsui/article/details/85780452
以太坊HD钱包开发 二 —— BIP协议介绍
https://blog.csdn.net/bondsui/article/details/85780675
以太坊HD钱包开发 三 —— 代码实现
https://blog.csdn.net/bondsui/article/details/85780940
ETH Web钱包
项目技术栈准备:
-
公钥、私钥、钱包概念
-
HD钱包、BIP32、BIP39、BIP44协议
-
nodejs
-
html 、css、react
-
semantic-react
-
ether.js
-
golang
环境支持
- ganache客户端
- ganache-cli 命令行客户端 (会通过助记词导入即可)
- geth 可选用truffle 控制台也可以 (会获取账户列表、余额即可)
1、功能预览
- 网页钱包
- 通过私钥、助记词、创建账户
- 通过私钥,助记词,keyStore导入账户
- 显示钱包信息(地址、余额、交易次数等)
- 钱包转账
- 钱包备份
2、钱包概念
钱包:容器,管理账号私钥的工具
私钥公钥:一个随机数字进行密码学运算得到私钥,公钥
地址:数字字母组成的字符串,由公钥推导而来
3、地址创建过程
图片来源于精通比特币,原理一样,下面是使用go语言实现的钱包代码
// go比特币中的钱包
type WalletKeyPair struct {
PrivateKey *ecdsa.PrivateKey
PublicKey []byte
}
func newWalletKeyPair() *WalletKeyPair {
// 椭圆曲线函数得到私钥
privateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
if err != nil {
panic(err)
}
// 私钥得到公钥
publicKey := append(privateKey.X.Bytes(), privateKey.Y.Bytes()...)
return &WalletKeyPair{PrivateKey: privateKey, PublicKey: publicKey}
}
// 通过公钥得到地址
func (w *WalletKeyPair) getAddress() string {
publicHash := HashPublicKey(w.PublicKey)
// 1字节版本号
version := 0x00
// 得到21字节的数据
payload := append([]byte{byte(version)}, publicHash...)
// 4字节校验码
checksum := CheckSum(payload)
//25字节
payload = append(payload, checksum...)
address := base58.Encode(payload)
return address
}
//ripemd160 进行hash运算
func HashPublicKey(pubKey []byte) []byte {
hash := sha256.Sum256(pubKey)
//创建一个hash160对象,向hash160中write数据
//做哈希运算
rip160Haher := ripemd160.New()
_, err := rip160Haher.Write(hash[:])
if err != nil {
log.Panic(err)
}
publicHash := rip160Haher.Sum(nil)
return publicHash
}
// 获取校验码
func CheckSum(payload []byte) []byte {
first := sha256.Sum256(payload)
second := sha256.Sum256(first[:])
checksum := second[0:4]
return checksum
}