go語言實戰之實現比特幣地址校驗教程
導讀 | 這篇文章主要介紹了go語言實戰之實現比特幣地址校驗步驟,利用生產的隨機數採用橢圓加密演算法生成公鑰,具體步驟例項程式碼請參考下本文 |
由公鑰生成比特幣地址步驟
- 隨機取一個32位隨機數作為私鑰
- 利用生產的隨機數採用橢圓加密演算法生成公鑰
- 計算公鑰的sha256雜湊值
- 計算RIPEMD-160雜湊值
- 第4步結果加上版本號(比特幣為0x00)
- 對第5步結果取兩次sha256雜湊值
- 取上一步結果的前四個位元組
- 將第7步結果加到第步的結果後面作為校驗
- 利用base58對第8步結果進行變化得到地址
生成地址程式碼如下
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再次算出校驗位與地址的校驗位做出對比,即可驗證地址的正確性。 其中用到的函式有:
func checksum(payload []byte) [] //利用兩次shah256求校驗位 byte { firstSHA := sha256.Sum256(payload) secondSHA := sha256.Sum256(firstSHA[:]) return secondSHA[:addressChecksumLen] }
這是解碼的函式,已經有不少現有的程式碼支援,故不作講解
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語言實戰之實現比特幣地址校驗步驟的詳細內容
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2776051/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- go語言實戰教程:Redis實戰專案應用GoRedis
- Go 語言實戰 GraphQLGo
- Go語言SQL操作實戰GoSQL
- Go語言實現RPCGoRPC
- Go 測驗 101 Go 語言 101 學習地址Go
- Go語言實現設計模式之命令模式Go設計模式
- 基於Mixin Network的Go語言比特幣開發教程:建立機器人Go比特幣機器人
- go語言實現掃雷Go
- 比特幣指令碼語言比特幣指令碼
- go語言實戰教程:實戰專案資源匯入和專案框架搭建Go框架
- go語言實戰教程之管理員查詢功能、退出功能Go
- 實戰區塊鏈技術培訓之Go語言區塊鏈Go
- 帶讀 |《Go in Action》(中文:Go語言實戰)(一)Go
- 用 Go 語言實戰 Limit Concurrency 方法GoMIT
- Go語言實戰(三)- 內建容器Go
- GO 語言 Web 開發實戰一GoWeb
- go語言實現ssh打隧道Go
- Go語言interface底層實現Go
- go語言依賴注入實現Go依賴注入
- Go語言實現TCP通訊GoTCP
- GO語言 實現埠掃描Go
- Go語言筆記[實現一個Web框架實戰]——EzWeb框架(一)Go筆記Web框架
- 理解比特幣(4)——實現原理比特幣
- Go 語言實戰: 編寫可維護 Go 語言程式碼建議Go
- 使用JWT做RESTful API的身份驗證-Go語言實現JWTRESTAPIGo
- go語言實現自己的RPC:go rpc codecGoRPC
- Go語言map的底層實現Go
- Go語言實現的Java Stream APIGoJavaAPI
- Go語言實現HTTPS加密協議GoHTTP加密協議
- 檔案複製(Go語言實現)Go
- 線性迴歸 go 語言實現Go
- 有Go語言實戰培訓班嗎?go語言開發環境搭建Go開發環境
- [譯] Go 語言實戰: 編寫可維護 Go 語言程式碼建議Go
- 非常適合GO語言新手學習的《Go語言從入門到實戰——簡明高效的Go語言實戰指南》課程——推薦分享Go
- 帶讀 |《Go in Action》(中文:Go語言實戰) 語法和語言結構概覽(三)Go
- 帶讀 |《Go in Action》(中文:Go語言實戰)語法和語言結構概覽 (二)Go
- Go語言專案實戰:多人聊天室Go
- Go語言專案實戰:併發爬蟲Go爬蟲