著者: ショールズ・プロブースト

出典: https://sproboost.nl/2022/11/10/what-is-a-bitcoin-address/

ビットコイン アドレスはビットコイン ブロックチェーンの一部ではありませんが、ビットコイン (ウォレット) ソフトウェアがビットコインの送信先 (特定の公開キー (P2PK) または公開キーのハッシュ (P2PKH) のいずれか) を通信するために使用するトークンです。 、スクリプトのハッシュ (P2SH)、SegWit 公開キーのハッシュ (P2WPKH)、または SegWit スクリプトのハッシュ (P2WSH)。アドレスには、そのタイプに関するメタデータも含まれています。

(翻訳者注: ビットコインのアドレス タイプは、ビットコイン ネットワークのアップグレードとスクリプト手法の標準化に伴って増加し続けます。実際、P2PK と P2PKH を除く上記のアドレス タイプは、ビットコインの最初のリリースで登場しました。 、残りは後で来ました、2021年に有効化されたTaprootアップグレードにより、ビットコインには別のアドレスタイプ「P2TR」があります。

ビットコイン アドレスは、上記の支払い方法を表現するために独自の番号付けシステムを使用します。この記事では、これらの異なる番号付けシステムをそれぞれ紹介し、ビットコイン アドレス一般と bech32 アドレスの利点について詳しく分析します。さらに、bech32 アドレスの最初のバージョンに含まれる (脅威の低い) 脆弱性がどこから来たのか、そしてそれがどのように解決されたのかについても説明します。最後に、量子コンピューティングの影響について触れました。

- この記事は私の新著(ビットコイン:未完の研究)からの抜粋です -

歴史的背景

ビットコインを誰かに送るときは、基本的に複数の入力と少なくとも 1 つの出力を持つトランザクションを作成することになります。出力は、組み込みの制約 (法的には資産の所有権の移転を制限する制約と呼ばれます) を通じて誰が支出できるかを指定します。

最も些細な負担は、誰でもビットコインを使用できるようにすることです。ビットコインはすぐに盗まれるので、これは良い考えではありません。したがって、ビットコイン開発の初期には、ブロックチェーン上の大部分のビットコインは、公開鍵への支払い (P2PK) または公開鍵ハッシュへの支払い (P2PKH) という 2 つの制約のみを使用できました。前者は「公開鍵に対応する秘密鍵を持っている人だけがビットコインを使える」と理解できます。

当時、受信者のIPアドレスにビットコインを送信することもできましたが、この機能は2012年に廃止されました。これを使用するには、受取人の IP アドレスに接続し、受取人に公開キーを要求する必要があります。そうすれば、受取人は公開キーを提供します1。その後、ウォレットは P2PK スクリプトを使用してビットコインを作成します。

このワークフローは、今では少し奇妙に思えるかもしれません 2 が、当時の Napster や Kazaa などのピアツーピア アプリケーションの一般的なパターン、つまり他の人に直接接続してそこから何かをダウンロードするというパターンに適合していました。最近では、友人の IP アドレスを知らない可能性が高く、友人がモバイル デバイスを使用している場合は、IP アドレスが常に変化することさえあります。自分のビットコイン ノードに友人のノードに特に接続するように指示することもできますが、一般的にはランダムなノードにのみ接続します。第 2 章を参照してください。

より一般的な取引方法は銀行振込に似ています。受信者はあなたにアドレスを与え、あなたは銀行口座に送金するのと同じように、このアドレスにビットコインを送ります。最初は、全員がアドレスとして P2PKH を使用していました (P2PKH の意味については後述します)。

このように、トランザクションは受取人に直接送信されるのではなく、ネットワーク内のすべてのノードを通じてブロードキャストされ、最終的にはマイニング ノードによって検出され、ブロックにパッケージ化されます。カウンターパーティのノードがピアノードからトランザクションを確認したか、トランザクションが発生するブロックを受信した可能性があります。

3つ目の取引方法はマイニングで、マイニングで得られたブロック報酬を自分に送信します。当初、ビットコイン ソフトウェアにはマイニング ソフトウェアが組み込まれていました。したがって、ビットコイン ソフトウェアをダウンロードするとすぐに、ビットコイン ソフトウェアはマイニングを開始し、ビットコインをウォレットに送信します。この場合、アドレスを交換する必要はありません。これらのビットコインはすべて制約 3 として P2PK を使用します。

住所は何ですか?

アドレスは、どのスクリプトをブロックチェーンに入れる必要があるかを示す便利な方法です。上で述べたように、スクリプトの目的はビットコインに制限を課し、受信者のみがビットコインを使用できるようにすることです4。アドレス自体はブロックチェーン上に存在せず、アドレスには完全なスクリプトさえ含まれていません。

過去に最も使用されていた 2 種類のスクリプトのうち、アドレスは Pay-to-Public-Key-Hash (P2PKH) にのみ使用されていました。ウォレットがそのようなアドレスを見つけると、その中でビットコインを使う人にそのハッシュに対応する公開鍵を保持することを要求するスクリプトを生成します (実際のスクリプトは第 10 章で提供されます)。ハッシュのみが公開され、公開キーは受信者がビットコインを使用するまで秘密のままです。

P2PKH アドレスは数値 1 で始まり、その後に公開キーのハッシュが続きます。次の例に示すように、アドレスは Base58 でエンコードされます。

1HLoFgMiDL3hvACAfbkDUjcP9r9veUcqAF

ベースシステムとは何ですか?

Base58 を理解するには、まず Base システムの基本原理を理解する必要があります。

たとえば、base10 を 10 本の指と考えてください。したがって、115 (1、1、5) という数字を表現したい場合は、1、1、5 に対応する両手で 3 つのジェスチャーを行うことになります。人間は粘土板と紙を発明したので、ペンを使ってこれらの数字を書くこともでき、指を使うよりもはるかに便利です。したがって、base10 は 10 個の異なる記号を使用する 10 進法であり、これら 10 個の記号のさまざまな組み合わせを使用して任意の数 (整数) を表現します。

それ以外にも、さまざまな基本システムがあります。たとえば、古代バビロニア人はbase60を使用していました。マシンコードを読み取るには、通常、base16 とも呼ばれる 16 進数を使用します。これは、数字 0 ~ 9 と文字 A ~ F の 16 文字を使用します。一方、コンピューター内部では、トランジスタにはオンとオフの 2 つの状態しかないため、base2 (2 進数システム) が好まれます。これは、すべてが 0 と 1 の 2 つの数値だけで行われ、それらを使用して任意の数値を表すことができることを意味します。

サトシ・ナカモトは、58 個の異なる記号 (0 から 9 の数字とアルファベットの小文字と大文字のほとんど) を使用する Base58 システムを導入しました。ただし、ユーザーが混同しやすく誤認しやすい一部の文字と数字は含まれていません。たとえば、数字の 0 と大文字の O、大文字の I と小文字の l などです。

電子メールの添付ファイルのソースコードを見たことはありますか?奇妙な数字の集まり。これがbase64であり、bas64をベースにしてbase58が生まれます。ただし、base64 にはアンダースコア、プラス記号、等号、スラッシュなどの文字が含まれます。 Base58 はこれらの文字を削除して目視検査を容易にし、URL に効果的に適用できます。

Base58 と Pay-to-Public-Key-Hash

これはP2PKHと何の関係があるのでしょうか? P2PKH アドレスは 1 で始まり、その後に Base58 でエンコードされた公開キー ハッシュが続きます。

これは、他の人からビットコインを受け取りたいときに送信する必要がある情報です。単に 0x005 と公開キーを送信することもできます。おそらく 0x00 を正常に変換できるかもしれませんが、おそらくそうではありません。

理論的には、ビットコイン スクリプトはバイナリ メッセージであるため、16 進数 (ブロックチェーンで使用される形式) で表現されたビットコイン スクリプトを他の人に送信できます。ブロックチェーン上では、このようなビットコイン スクリプトは、「この人が正しい公開キー ハッシュとそれに対応する公開キーを持っている場合、このビットコインを使用できます。」ということを意味します。詳細については、ビットコイン スクリプトの仕組みについて説明します。第10章で。

選択できる表現は数多くありますが、通常は標準化された住所形式を選択します。これは、従来のビットコイン アドレスがすべて 1 で始まり、すべてほぼ同じ長さである理由を説明しています。

Base58 は、ビットコイン アドレスの送信に使用されるだけでなく、秘密キーの受け渡しにも使用できます。この場合、先頭のシンボルは 5 (バージョン バイトとして 128 を表す) で、その後に秘密キーが続きます。

以前は、ユーザーは印刷できるペーパーウォレットを使用していました。バックドアなしで安全に生成された場合、論文には片面に「1」で始まる文字列、もう片面に「5」で始まる文字列が表示されます。ただし、ビットコイン アドレスのみを提示できることに注意してください。秘密鍵は次のとおりです。共有されないこと。

「3」で始まるアドレスもあります。これは、ビットコインが公開鍵ハッシュではなくスクリプト ハッシュでロックされていることを意味します。 Pay to Script Hash (P2SH) については第 10 章で紹介します。このようなアドレスは通常マルチシグ アドレスですが、SegWit アドレスである場合もあります6。

Base58 アドレスのパフォーマンスは良好ですが、改善の余地があります。それで、bech32があります。

bech32が登場

2017 年 3 月、Pieter Wuille は新しいアドレス形式 bech32 について話しました。 Bech32 は、SegWit の有効化に成功して以来使用されています。名前が示すように、bech32 は Base32 システムです。つまり、混乱を招く可能性のあるいくつかの文字を除き、ほとんどすべての文字と数字を使用できます。

解説動画:https://youtu.be/NqiN9VFE4CU

bech32とbase58の最大の違いは、大文字と小文字が混在しないことです。各文字は 1 回だけ (すべて大文字またはすべて小文字) 表示されるため、読み上げるのがはるかに簡単になります。各文字または数字とそれに対応する値の間の正確なマッピングは固定されていますが、むしろ任意です。Q は単に 0 を意味し、P は単に 1 を意味し、背後に深い意味はありません。

- bech32 マッピング テーブル。たとえば、q は 0 を意味し、3 は 17 (1+16) - を意味します。

bech327 アドレスは、「1」で区切られた 2 つの部分で構成されます (例: bc1q9kdcd08adkhg35r4g6nwu8ae4nkmsgp9vy00gf)。

前半は、たとえば「bc」(ビットコインの場合)または「Inbc」(ビットコインのライトニングネットワーク)など、意図的に読み取り可能になっています。 「b」や「c」などの文字で表される値には意味がありません。これらは人々が認識できるようにするためだけに存在します。「わかりました、アドレスが 'bc' で始まる場合、それは暗号通貨としてビットコインを指します。ただし、ウォレットは信頼性チェックとしてこれらの値が存在するかどうかを確認し、これらの値はチェックサムにも含まれます。

「1」は単なる区切り文字であり、値を表しません。 bech32 のマッピング テーブルを見ると、「スキップ」を意味する「1」が含まれていないことがわかります。

後半は SegWit のバージョン番号から始まります。バージョン 0 は Q(bc1q…) で表されます (第 3 章を参照)。バージョン 1 は Taproot (本書の第 4 部を参照) と呼ばれるもので、「P」 (bc1p...) で表されます。バージョン 0 SegWit の場合、バージョン番号の後に 20 バイトまたは 32 バイトが続き、それぞれ公開キー ハッシュまたはスクリプト ハッシュを表します。長さの違いは、SegWit がスクリプトの RIPEMD160 ハッシュ (20 バイト) の代わりにスクリプトの SHA256 ハッシュ (32 バイト) を使用するためです。

Base58 では、スクリプト ハッシュは公開キー ハッシュと同じ長さになります。しかし、SegWit では、2 つの長さは異なります。したがって、アドレスの長さを見るだけで、スクリプトに支払っているのか、公開鍵ハッシュに支払っているのかがすぐにわかります。ちなみに、Taproot ではこの長さの違いが解消され、プライバシーがさらに向上します。

したがって、bench32 はアドレスの後半に 32 文字しか使用しないという特徴があり、それ以外はbase58 とあまり変わりません。この機能を見れば、「ああ、これは P2PKH アドレスだ」ということがわかります。この場合、Pay-to-Witness-Public-Key-Hash (P2WPKH)、「Witness」は SegWit を指しますが、中心となる概念は次のとおりです。変更されない: 人間とコンピュータは、公開キーまたはスクリプトのハッシュに続く短いプレフィックスに基づいてアドレスの種類を識別できます。

32次元ダーツゲーム

ただし、シンプルさだけが利点ではありません。もう 1 つの利点は、エラー訂正、少なくともエラー検出です。

間違ったアドレスを入力すると、間違った公開鍵ハッシュにビットコインを送信してしまうという最悪の事態が起こります。受信者がビットコインを使おうとすると、送信者が以前に間違ったアドレスを入力したため、公開鍵のハッシュがブロックチェーンの要件と一致しないことがわかります。このビットコインは決して回収されません。

幸いなことに、base58 アドレスの最後にはチェックサムが付いています。このようにすると、間違ったアドレスを入力すると、アドレスの末尾のチェックサム検証が失敗します。ウォレットは警告を発し、トランザクションの送信を拒否します (ブロックチェーンはあなたを保護しませんが、ウォレットは保護します)。ただし、本当に運が悪いと、たとえ間違っていても正しいチェックサムを取得する可能性があります。

Bech32 は、このような極端な偶然の一致を避けるように設計されています。さらに、Bech32 は、間違いを犯したかどうかだけでなく、どこで間違えたのかも教えてくれます。具体的な方法は、アドレスのすべてのバイトを取得し、複雑な数式を使用してハッシュすることです。たとえ 4 つの間違いを犯したとしても、Bech32 はどこで間違いを犯したか、そして実際の値が何であるかを認識します。 4 つ以上の間違いを犯した場合、Bech32 は何もできません。

たとえで説明しましょう。壁に重ならない円をたくさん描きます。各円の目玉は正しい値を表し、円内の他の点は入力エラーを表します。あなたが熟練したダーツプレイヤーであれば、ほとんどの場合的中することになります。これは、正しい価値を失っていることを意味します。ブルズアイをわずかに外しても円の中に収まる場合は、入力した値がわずかにずれていることを意味します。エラーチェックとは、的を外したことを知ることです。修正には、ダーツを最も近いブルズアイに移動することが含まれます。

ここでの考え方は、最も不注意なダーツプレイヤーに対応できるようにサークルをできるだけ広くしたいが、あまりにも多くのスペースを無駄にしたくないということです。同様に、ビットコイン アドレスを数百文字の長さにすることも望ましくありません。これは数学者が好む最適化問題です。

2D 壁とは異なり、bech32 は 32D 超球体を備えた 32D 壁のようなものです。住所を入力すると、この 32 次元空間のどこかにわずかなズレが生じますが、どう見ても、あなたはまだこの超球体の中にいます。この場合、ウォレットは何が問題なのかを認識しており、間違ったアドレスへの送信によるビットコインの損失を効果的に防ぐことができます8。

bech32の脆弱性

2019 年に、bech32 アドレスの最後の文字が P で、後で誤って 1 つ以上の Q を入力した場合でも、チェックサム検証は合格し、入力エラー プロンプトは表示されないことが発見されました。ウォレット ソフトウェアはアドレスが正しく入力されたと認識するため、間違ったアドレスにビットコインを送信することができ、その結果、上で説明したようにビットコインが使用できなくなります。

良いニュースは、bech32 は SegWit でのみ動作し、SegWit アドレスには長さの制限があり、20 バイトまたは 32 バイトのみであることです。幸いなことに、20 バイトまたは 32 バイトの長さのアドレスの後に余分な Q を入力すると、入力したアドレスは長さの制限を超えているため無効になります。あなたのウォレットはこの問題に気づき、ビットコインの送信を拒否します。当初は、Taproot にも同様のアドレス長制限を導入することが検討されていましたが、以下で説明する解決策により、この必要性がなくなりました。柔軟なアドレス長は、将来の Taproot の改善に役立ちます。

bech32m誕生

bech32 の脆弱性を修正するために、bech32m と呼ばれる新しい標準が提案されました9。 bech32m は実際には非常に単純な変更です。追加の文字によって無効なチェックサムが生成されるようにするために、bech32 チェックサム式に追加の数値が追加されます。

この新しい標準は、Taproot アドレスと将来のアドレスにのみ適用されます。 SegWit アドレスはすでに 20 バイトまたは 32 バイトの長さ制限によって保護されているため、何も変わりません。執筆時点では、ほとんどのウォレット ソフトウェアは新しい bech32m 標準をサポートしています。

私が不安を振り払い、量子コンピューティングに夢中になったのはなぜでしょうか?

ちなみに、Pay-to-Public-Key-Hash (P2PKH) は、公開鍵を公開する必要がないため、量子攻撃に対する耐性が高いと考えられています。欠点は、ハッシュがより多くのスペースを占有することでしたが、当時はブロックが満杯近くではなかったため、これは問題にはなりませんでした。

多くの人は、量子コンピューターが最終的にビットコイン暗号の安全性を損ない、量子ハッカーにビットコインを盗む機会を与えてしまうのではないかと心配しています。彼らが何百万ものビットコインを盗むことに成功した場合、市場の暴落を引き起こす可能性さえあります。

問題は、P2PKH が広く採用されているにもかかわらず、これらのビットコインのうち 500 万から 1,000 万枚の公開鍵が公開されていることです。皮肉なことに、非常に多くのビットコインが量子ハッカーに対して脆弱であるため、この方法で残りのビットコインを保護しようとしてもほとんど意味がありません。 P2PKHを使用しているためビットコインが盗まれないとしても、価格崩壊によりビットコインの価値が無くなるのは避けられません。

物理学者のステパン・スニギレフと数学者のアンドリュー・ポールストラは、「ビットコインがやったこと」というタイトルの 2 話のポッドキャストで、量子攻撃が短期的に壊滅的な結果をもたらす可能性と考えられる対応策について説明します。

現在、ブロック スペースが非常に不足しているため、公開キー ハッシュを貴重なブロック スペースに保存する必要がなくなるため、ユーザーはコストを節約できます。新しい Taproot ソフト フォーク (本書の第 4 部を参照) では、ビットコイン アドレスが再び P2PK10 になるのはこのためです。 Taproot アドレスの使用は必須ではないため、上記の理由に同意できない場合は、Taproot を使用しないことも選択できます。

脚注

1. コード「考古学」愛好家の好奇心を満たすために、送信側ノードには、転送量と IP アドレスを入力する UI ダイアログ ボックスが表示されます。 StartTransfer() 関数は、受信者ノードのチェックオーダーが P2PK スクリプト (scriptPubKey として) を挿入する空のチェック トランザクションを作成します。次に、OnReply2() は金額を挿入し、トランザクションに署名し、トランザクションを受信者に返し、ブロードキャストします。ソースコード。 ↩

2. そしてそれは安全ではありません、サトシ・ナカモトもこれを認めました。 ↩

3. サトシ ナカモトによって最初にリリースされたバージョンが P2PK と P2PKH の両方をサポートしたのはなぜですか?正確な理由はわかりません。 P2PK 支払い方法は、実際には IP アドレスを支払い、マイナーにブロック報酬を支払うためにのみ使用されます。どちらも人間の介入を必要としません。人間の対話が関与するシナリオでは、ユーザーは P2PKH を使用します。使用されるアドレスは P2PK ではなく P2PKH を参照します。自動化システムはスクリプトも処理できるため、アドレスの概念は必要ありません。そのため、P2PK アドレスのような概念は必要ありません。 ↩

4. ここまでのスクリプトは銀行口座に似ています。第 10 章で学習するように、スクリプトは所有者のためにお金を保持するだけではありません。 ↩

5. 0x の接頭辞が付いた 1 組の 16 進数は通常、バイトを表すために使用され、16 × 16 = 256 個の異なる値を表すことができます。したがって、0x00 はバイトを表し、その値は 0 です。 ↩

6. 第 3 章で説明したように、SegWit は通常 bech32 アドレスを使用します。ただし、すべてのウォレットと取引所が bech32 アドレスへの支払いをサポートするまでには長い時間がかかりました。 SegWit の利点の一部を引き続き活用するために、送信者の観点からは通常の P2SH のように見えますが、背後に SegWit の魔法が備わったアドレス タイプを導入しています。このタイプのアドレスは、P2SH-P2WPKH アドレスと呼ばれます。 ↩

7.BIP173によって提案されたbech32。 ↩

8. 初期のイーサリアムウォレットでは、アドレス標準にチェックサムがなかったため、エラー検出が使用されませんでした。 EIP55は2016年にチェックサムを導入しましたが、すべてのウォレットがエラー検出を実行するわけではありません。 2017 年になっても、間違ったアドレスを入力したために人々は依然としてイーサを失っていました。 ↩

9.bech32mはBIP 350によって提案されています。 ↩

10. 具体的な理由については、BIP 341 の注記を参照してください。 ↩