Address-Format

如何檢查比特幣地址的校驗和?

  • September 15, 2017

我正在開發比特幣 ATM。我們想要檢測輸入錯誤的地址。

比特幣地址有一個校驗和 - 但我們如何檢查它?

比特幣檢查公共地址的方式是使用所謂的Base58Check。雖然比特幣 Wiki 涵蓋了 Base58Check,但我將用抽象和技術術語概述它的工作原理。

Base58Check示意圖

Base58Check 的整個想法是防止無效地址。這是通過將數字添加到 Base58 值的開頭 (00) 和結尾(4 個字節的雙 SHA256 雜湊)來完成的。

  1. 添加00到 Base58 值的開頭,即00+ BASE58==>00BASE58
  2. 校驗和 = 第一個 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'))

引用自:https://bitcoin.stackexchange.com/questions/32353