比特幣中的Base58 編碼

base58和base64一樣是一種二進(jìn)制轉(zhuǎn)可視字符串的算法,主要用來轉(zhuǎn)換大整數(shù)值。區(qū)別是,轉(zhuǎn)換出來的字符串,去除了幾個看起來會產(chǎn)生歧義的字符,如 0 (零), O (大寫字母O), I (大寫的字母i) and l (小寫的字母L) ,和幾個影響雙擊選擇的字符,如/, +。結(jié)果字符集正好58個字符(包括9個數(shù)字,24個大寫字母,25個小寫字母)。不同的應(yīng)用實現(xiàn)中,base58 最后查詢的字母表可能不同,所以沒有具體的標(biāo)準(zhǔn)。下面是幾個應(yīng)用中的字母表:

比特幣地址:

123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz

Monero 地址

123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz

Ripple 地址

rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz

Flickr 的短URL

123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ

Base58 編碼與解碼

Base58 的輸入是一個[0,256)的值的流,輸出結(jié)果是一個[0,58) 的值的流。然后將每個值去查字母表,得出一個可視字符串。轉(zhuǎn)換過程實際上就是一個256進(jìn)制的值轉(zhuǎn)換為一個58進(jìn)制的值。

進(jìn)制轉(zhuǎn)換過程如下(下面?zhèn)未a描述256進(jìn)制轉(zhuǎn)換為58進(jìn)制過程, base58編碼需要將58進(jìn)制流查表得到對應(yīng)的字符流):

# 將 input 256進(jìn)制流轉(zhuǎn)換為 output 58進(jìn)制流
for carry in input: 
    for (outputPos, outputNum) in output.reverse(): 
        carry += outputNum * 256         
        output[outputPos] = carry % 58     
        carry /= 58
    # output 流處理完畢, carry依然有值, 則繼續(xù)向 output 前部插入
    while carry != 0 :
        output.insertFront(carry%58)
        carry /= 58

在實現(xiàn)的時候,開頭的0需要特殊處理下,因為0轉(zhuǎn)換后依然是0, 所以可以將輸入流開頭的0直接填充到結(jié)果前邊。

逆轉(zhuǎn)換過程(先將輸入字符串轉(zhuǎn)換為58進(jìn)制的流, 然后將58進(jìn)制的流轉(zhuǎn)換為256進(jìn)制的流, 下面?zhèn)未a描述58進(jìn)制轉(zhuǎn)換為256進(jìn)制過程):

# 將 input 58進(jìn)制流轉(zhuǎn)換為 output 256進(jìn)制流
for carry in input: 
    for (outputPos, outputNum) in output.reverse(): 
        carry += outputNum * 58        
        output[outputPos] = carry % 256      
        carry /= 256
    # output 流處理完畢, carry依然有值, 則繼續(xù)向 output 前部插入
    while carry != 0 :
        output.insertFront(carry%256)
        carry /= 256

同樣,在實現(xiàn)的時候,開頭的0需要特殊處理下,因為0轉(zhuǎn)換后依然是0, 所以可以將輸入流開頭的0直接填充到結(jié)果前邊。

Base58Check

比特幣之所以加入改進(jìn)版的 Base58 算法,主要為了解決 Base58 導(dǎo)出的字符串沒有校驗機(jī)制,這樣,在傳播過程中,如果漏寫了幾個字符,會檢測不出來。所以使用了改進(jìn)版的算法 Base58Check。

實現(xiàn)是:在encode前,在輸入流尾部加入輸入內(nèi)容的hash值(4個字節(jié))。然后再對輸入流進(jìn)行 Base58Encode。

在 decode 時候:先 Base58Decode, 然后拆成兩部分(內(nèi)容和校驗值),判斷對內(nèi)容計算的校驗值和校驗值字段是否一致。

Go 的base58庫:
https://github.com/shengdoushi/base58

比特幣Base58相關(guān)源碼地址: https://github.com/bitcoin/bitcoin/blob/master/src/base58.cpp

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,545評論 19 139
  • 〇、序言 貨幣由于其天然屬性決定了其與安全不可分割的聯(lián)系,從最早的金庫、保險柜、鏢局到后來的ATM機(jī)、運(yùn)鈔車;從存...
    怒馬2048閱讀 39,843評論 4 79
  • 已記不清你的容顏 歲月的變遷 你是否已改變 匆匆的都市 你、我的身影都在飄閃 當(dāng)生活中又一次碰撞你的記憶 只有靜靜...
    朱彥峰閱讀 365評論 0 0
  • 隨著社會的發(fā)展,生活水平的提高,西點蛋糕這些從視覺嗅覺味覺上能給人帶來愉悅體驗的美食越來越受人們青睞,隨之而來的便...
    糊花火閱讀 1,686評論 0 0
  • 1.感恩早課,感恩導(dǎo)叨的冥想音頻,謝謝。 2.感恩學(xué)校的早飯,美美噠,謝謝。 3.感恩學(xué)生和我配合,上課越來越順?biāo)?..
    丁丁_40a0閱讀 368評論 0 0

友情鏈接更多精彩內(nèi)容