Address-Format
如何檢查比特幣地址的校驗和?
我正在開發比特幣 ATM。我們想要檢測輸入錯誤的地址。
比特幣地址有一個校驗和 - 但我們如何檢查它?
比特幣檢查公共地址的方式是使用所謂的Base58Check。雖然比特幣 Wiki 涵蓋了 Base58Check,但我將用抽象和技術術語概述它的工作原理。
Base58Check 的整個想法是防止無效地址。這是通過將數字添加到 Base58 值的開頭 (00) 和結尾(4 個字節的雙 SHA256 雜湊)來完成的。
- 添加
00
到 Base58 值的開頭,即00
+BASE58
==>00BASE58
- 校驗和 = 第一個 8 位數字
SHA256(SHA256(00BASE58))
BASE58Check = (00)(BASE58_SHA256RIPEMD160_HEXADECIMAL_VALUE)(CHECKSUM)
(括號僅用於視覺化,所有其他數據大小正確,即 CHECKSUM = 8 個字元)視覺化這一切的最佳方式是使用The Piachu 的應用程序
Rosetta Code有多種語言的幾個範例實現。
蟒蛇 2 & 3
import codecs from hashlib import sha256 digits58 = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz' def to_bytes(n, length): s = '%x' % n s = s.rjust(length*2, '0') s = codecs.decode(s.encode("UTF-8"), 'hex_codec') return s def decode_base58(bc, length): n = 0 for char in bc: n = n * 58 + digits58.index(char) return to_bytes(n, length) def check_bc(bc): bcbytes = decode_base58(bc, 25) if bcbytes[0] not in [0x00, 0x05]: return False return bcbytes[-4:] == sha256(sha256(bcbytes[:-4]).digest()).digest()[:4] if __name__ == '__main__': print(check_bc('1111111111111111111114oLvT2'))