以太坊HD錢包開發 一 —— 錢包概念介紹
阿新 • • 發佈:2019-01-09
以太坊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
}