go語言實戰(zhàn)之實現(xiàn)比特幣地址校驗步驟
由公鑰生成比特幣地址步驟
- 隨機取一個32位隨機數(shù)作為私鑰
- 利用生產(chǎn)的隨機數(shù)采用橢圓加密算法生成公鑰
- 計算公鑰的sha256哈希值
- 計算RIPEMD-160哈希值
- 第4步結(jié)果加上版本號(比特幣為0x00)
- 對第5步結(jié)果取兩次sha256哈希值
- 取上一步結(jié)果的前四個字節(jié)
- 將第7步結(jié)果加到第步的結(jié)果后面作為校驗
- 利用base58對第8步結(jié)果進行變化得到地址
生成地址代碼如下
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] }
校驗比特幣
地址是否正確代碼
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是對比特幣地址進行解碼,然后取后四位校驗位actualChecksum,利用去掉校驗位的pubKeyHash再次算出校驗位與地址的校驗位做出對比,即可驗證地址的正確性。 其中用到的函數(shù)有:
func checksum(payload []byte) [] //利用兩次shah256求校驗位 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語言實戰(zhàn)之實現(xiàn)比特幣地址校驗步驟的詳細內(nèi)容,更多關(guān)于go語言比特幣地址校驗的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
golang?MySQL實現(xiàn)對數(shù)據(jù)庫表存儲獲取操作示例
這篇文章主要為大家介紹了golang?MySQL實現(xiàn)對數(shù)據(jù)庫表存儲獲取操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11使用Gin框架返回JSON、XML和HTML數(shù)據(jù)
Gin是一個高性能的Go語言Web框架,它不僅提供了簡潔的API,還支持快速的路由和中間件處理,在Web開發(fā)中,返回JSON、XML和HTML數(shù)據(jù)是非常常見的需求,本文將介紹如何使用Gin框架來返回這三種類型的數(shù)據(jù),需要的朋友可以參考下2024-08-08詳解Go語言微服務(wù)開發(fā)框架之Go chassis
分布式系統(tǒng)中每個進程的動態(tài)配置管理及運行時熱加載就成為了一個亟待解決的問題。go chassis汲取了netflix的archaius框架經(jīng)驗,并做出來自己的創(chuàng)新特性。2021-05-05