由公鑰生成比特幣地址步驟
- 隨機(jī)取一個(gè)32位隨機(jī)數(shù)作為私鑰
- 利用生產(chǎn)的隨機(jī)數(shù)采用橢圓加密算法生成公鑰
- 計(jì)算公鑰的sha256哈希值
- 計(jì)算RIPEMD-160哈希值
- 第4步結(jié)果加上版本號(hào)(比特幣為0x00)
- 對(duì)第5步結(jié)果取兩次sha256哈希值
- 取上一步結(jié)果的前四個(gè)字節(jié)
- 將第7步結(jié)果加到第步的結(jié)果后面作為校驗(yàn)
- 利用base58對(duì)第8步結(jié)果進(jìn)行變化得到地址
生成地址代碼如下
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 HashPubKey(pubKey []byte) []byte {
publicSHA256 := sha256.Sum256(pubKey)
RIPEMD160Hasher := ripemd160.New()
_, err := RIPEMD160Hasher.Write(publicSHA256[:])
publicRIPEMD160 := RIPEMD160Hasher.Sum(nil)
return publicRIPEMD160
}
func checksum(payload []byte) []byte {
firstSHA := sha256.Sum256(payload)
secondSHA := sha256.Sum256(firstSHA[:])
return secondSHA[:addressChecksumLen]
}
校驗(yàn)比特幣
地址是否正確代碼
addressChecksumLen:=4
func ValidateAddress(address string) bool {
pubKeyHash := Base58Decode([]byte(address))
actualChecksum := pubKeyHash[len(pubKeyHash)-addressChecksumLen:]
version := pubKeyHash[0]
pubKeyHash = pubKeyHash[1 : len(pubKeyHash)-addressChecksumLen]
targetChecksum := checksum(append([]byte{version}, pubKeyHash...))
return bytes.Compare(actualChecksum, targetChecksum) == 0
}
Base58Decode是對(duì)比特幣地址進(jìn)行解碼,然后取后四位校驗(yàn)位actualChecksum,利用去掉校驗(yàn)位的pubKeyHash再次算出校驗(yàn)位與地址的校驗(yàn)位做出對(duì)比,即可驗(yàn)證地址的正確性。 其中用到的函數(shù)有:
func checksum(payload []byte) [] //利用兩次shah256求校驗(yàn)位
byte {
firstSHA := sha256.Sum256(payload)
secondSHA := sha256.Sum256(firstSHA[:])
return secondSHA[:addressChecksumLen]
}
這是解碼的函數(shù),已經(jīng)有不少現(xiàn)有的代碼支持,故不作講解
func Base58Decode(input []byte) []byte {
result := big.NewInt(0)
zeroBytes := 0
for b := range input {
if b == 0x00 {
zeroBytes++
}
}
payload := input[zeroBytes:]
for _, b := range payload {
charIndex := bytes.IndexByte(b58Alphabet, b)
result.Mul(result, big.NewInt(58))
result.Add(result, big.NewInt(int64(charIndex)))
}
decoded := result.Bytes()
decoded = append(bytes.Repeat([]byte{byte(0x00)}, zeroBytes), decoded...)
return decoded
}
以上就是go語言實(shí)戰(zhàn)之實(shí)現(xiàn)比特幣地址校驗(yàn)步驟的詳細(xì)內(nèi)容,更多關(guān)于go語言比特幣地址校驗(yàn)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
您可能感興趣的文章:- golang gin框架獲取參數(shù)的操作
- golang gin 框架 異步同步 goroutine 并發(fā)操作
- go語言 xorm框架 postgresql 的用法及詳細(xì)注解
- goland 搭建 gin 框架的步驟詳解
- GO語言gin框架實(shí)現(xiàn)管理員認(rèn)證登陸接口
- Go語言框架Beego項(xiàng)目搭建的方法步驟
- Go語言快速入門圖文教程
- 詳解Go語言微服務(wù)開發(fā)框架之Go chassis