亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(shí)間:2021年05月13日 11:42:51   作者:m0_37719047  
這篇文章主要介紹了go語(yǔ)言實(shí)戰(zhàn)之實(shí)現(xiàn)比特幣地址校驗(yàn)步驟,利用生產(chǎn)的隨機(jī)數(shù)采用橢圓加密算法生成公鑰,具體步驟實(shí)例代碼請(qǐng)參考下本文

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

  1. 隨機(jī)取一個(gè)32位隨機(jī)數(shù)作為私鑰
  2. 利用生產(chǎn)的隨機(jī)數(shù)采用橢圓加密算法生成公鑰
  3. 計(jì)算公鑰的sha256哈希值
  4. 計(jì)算RIPEMD-160哈希值
  5. 第4步結(jié)果加上版本號(hào)(比特幣為0x00)
  6. 對(duì)第5步結(jié)果取兩次sha256哈希值
  7. 取上一步結(jié)果的前四個(gè)字節(jié)
  8. 將第7步結(jié)果加到第步的結(jié)果后面作為校驗(yàn)
  9. 利用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語(yǔ)言實(shí)戰(zhàn)之實(shí)現(xiàn)比特幣地址校驗(yàn)步驟的詳細(xì)內(nèi)容,更多關(guān)于go語(yǔ)言比特幣地址校驗(yàn)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Golang如何交叉編譯各個(gè)平臺(tái)的二進(jìn)制文件詳解

    Golang如何交叉編譯各個(gè)平臺(tái)的二進(jìn)制文件詳解

    這篇文章主要給大家介紹了關(guān)于Golang如何交叉編譯各個(gè)平臺(tái)的二進(jìn)制文件的相關(guān)資料,并介紹了golang如何讓編譯生產(chǎn)的二進(jìn)制文件變小,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • golang?MySQL實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)表存儲(chǔ)獲取操作示例

    golang?MySQL實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)表存儲(chǔ)獲取操作示例

    這篇文章主要為大家介紹了golang?MySQL實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)表存儲(chǔ)獲取操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Go java 算法之括號(hào)生成示例詳解

    Go java 算法之括號(hào)生成示例詳解

    這篇文章主要為大家介紹了Go java 算法之括號(hào)生成示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 在Go中創(chuàng)建自定義錯(cuò)誤的方式總結(jié)

    在Go中創(chuàng)建自定義錯(cuò)誤的方式總結(jié)

    在程序開(kāi)發(fā)中錯(cuò)誤處理是至關(guān)重要的,下面這篇文章主要給大家介紹了關(guān)于在Go中創(chuàng)建自定義錯(cuò)誤的方式,文中通過(guò)代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Go具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-01-01
  • 詳解Go語(yǔ)言中上下文context的理解與使用

    詳解Go語(yǔ)言中上下文context的理解與使用

    在Go的日常開(kāi)發(fā)中,Context上下文對(duì)象無(wú)處不在,這篇文章小編就來(lái)帶大家深入了解一下上下文context的理解與使用,文中的示例代碼講解詳細(xì),需要的可以參考下
    2023-10-10
  • golang值接收者和指針接收者的區(qū)別介紹

    golang值接收者和指針接收者的區(qū)別介紹

    這篇文章主要介紹了golang值接收者和指針接收者的區(qū)別,它和函數(shù)的區(qū)別在于方法有一個(gè)接收者,給一個(gè)函數(shù)添加一個(gè)接收者,那么它就變成了方法,接收者可以是值接收者,也可以是指針接收者,本文通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • 使用Gin框架返回JSON、XML和HTML數(shù)據(jù)

    使用Gin框架返回JSON、XML和HTML數(shù)據(jù)

    Gin是一個(gè)高性能的Go語(yǔ)言Web框架,它不僅提供了簡(jiǎn)潔的API,還支持快速的路由和中間件處理,在Web開(kāi)發(fā)中,返回JSON、XML和HTML數(shù)據(jù)是非常常見(jiàn)的需求,本文將介紹如何使用Gin框架來(lái)返回這三種類(lèi)型的數(shù)據(jù),需要的朋友可以參考下
    2024-08-08
  • 淺談go語(yǔ)言renderer包代碼分析

    淺談go語(yǔ)言renderer包代碼分析

    本篇文章主要介紹了淺談go語(yǔ)言renderer包代碼分析,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • 淺析Golang中類(lèi)型嵌入的簡(jiǎn)介與使用

    淺析Golang中類(lèi)型嵌入的簡(jiǎn)介與使用

    類(lèi)型嵌入指的就是在一個(gè)類(lèi)型的定義中嵌入了其他類(lèi)型,Go?語(yǔ)言支持兩種類(lèi)型嵌入,分別是接口類(lèi)型的類(lèi)型嵌入和結(jié)構(gòu)體類(lèi)型的類(lèi)型嵌入,下面我們就來(lái)詳細(xì)一下類(lèi)型嵌入的使用吧
    2023-11-11
  • 詳解Go語(yǔ)言微服務(wù)開(kāi)發(fā)框架之Go chassis

    詳解Go語(yǔ)言微服務(wù)開(kāi)發(fā)框架之Go chassis

    分布式系統(tǒng)中每個(gè)進(jìn)程的動(dòng)態(tài)配置管理及運(yùn)行時(shí)熱加載就成為了一個(gè)亟待解決的問(wèn)題。go chassis汲取了netflix的archaius框架經(jīng)驗(yàn),并做出來(lái)自己的創(chuàng)新特性。
    2021-05-05

最新評(píng)論