佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > go語言實戰(zhàn)之實現(xiàn)比特幣地址校驗步驟

go語言實戰(zhàn)之實現(xiàn)比特幣地址校驗步驟

熱門標(biāo)簽:AI電銷 網(wǎng)站排名優(yōu)化 百度競價排名 呼叫中心市場需求 Linux服務(wù)器 服務(wù)外包 鐵路電話系統(tǒng) 地方門戶網(wǎng)站

由公鑰生成比特幣地址步驟

  1. 隨機(jī)取一個32位隨機(jī)數(shù)作為私鑰
  2. 利用生產(chǎn)的隨機(jī)數(shù)采用橢圓加密算法生成公鑰
  3. 計算公鑰的sha256哈希值
  4. 計算RIPEMD-160哈希值
  5. 第4步結(jié)果加上版本號(比特幣為0x00)
  6. 對第5步結(jié)果取兩次sha256哈希值
  7. 取上一步結(jié)果的前四個字節(jié)
  8. 將第7步結(jié)果加到第步的結(jié)果后面作為校驗
  9. 利用base58對第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]
}

校驗比特幣

地址是否正確代碼

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是對比特幣地址進(jìn)行解碼,然后取后四位校驗位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)比特幣地址校驗步驟的詳細(xì)內(nèi)容,更多關(guān)于go語言比特幣地址校驗的資料請關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • golang gin框架獲取參數(shù)的操作
  • golang gin 框架 異步同步 goroutine 并發(fā)操作
  • go語言 xorm框架 postgresql 的用法及詳細(xì)注解
  • goland 搭建 gin 框架的步驟詳解
  • GO語言gin框架實現(xiàn)管理員認(rèn)證登陸接口
  • Go語言框架Beego項目搭建的方法步驟
  • Go語言快速入門圖文教程
  • 詳解Go語言微服務(wù)開發(fā)框架之Go chassis

標(biāo)簽:湘潭 衡水 崇左 黃山 湖南 蘭州 銅川 仙桃

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《go語言實戰(zhàn)之實現(xiàn)比特幣地址校驗步驟》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    平邑县| 霍邱县| 仲巴县| 仁化县| 平舆县| 韩城市| 木兰县| 平顶山市| 锡林浩特市| 怀仁县| 钟山县| 和田县| 东台市| 临桂县| 康定县| 塘沽区| 南涧| 南皮县| 文安县| 鄯善县| 镇安县| 桃园市| 寻甸| 平利县| 城口县| 罗山县| 石台县| 澎湖县| 淄博市| 大兴区| 安化县| 葫芦岛市| 赫章县| 自贡市| 绿春县| 乌拉特前旗| 大关县| 东乡族自治县| 巴彦县| 庐江县| 桓台县|