ビットコインで使われているbase58checkフォーマット出力の先頭の文字が何になるかって教科書にはよく書かれていますが、
どうやって算出しているのか気になったので、確かめてみました。
取りうる最小値と最大値を与えれば出力値の範囲が分かるという理屈です。
ここでは最小値を0x0、最大値をすべて0xffとしています。
なおbase58checkとbase58は別の概念なので混同しないようにしましょう。
mainnetの公開鍵の場合、先頭が0x00で、base58によって必ず1がパディングされるので、
証明終わりです。
問題はtestnetの公開鍵です。以下で最小値、最大値を網羅しています。
公開鍵の場合、payloadがripemd160のハッシュ結果の20バイトです。
>>> import base58 >>> base58.b58encode(b'\x6f' + bytes([0x00]*20) + bytes([0x00]*4)) >>> base58.b58encode(b'\x6f' + bytes([0xff]*20) + bytes([0xff]*4))
結果
>>> base58.b58encode(b'\x6f' + bytes([0x00]*20) + bytes([0x00]*4)) b'mfWxJ45yp2SFn7UciZyNpvDKrzbhuzkU7H' >>> base58.b58encode(b'\x6f' + bytes([0xff]*20) + bytes([0xff]*4)) b'n4rZHAPGXCu8bYchjzJhK3V7VVredELJRc'
確かに値の最小値と最大値がこれなので、先頭はmまたはnだと言えますね。