ビットコインを管理しているのはあなたですか?それとも財布? BTCアドレスと取引原理の分析
安比(SECBIT)实验室
2018-09-29 02:58
本文约7152字,阅读全文需要约29分钟
ビットコインウォレットを使用している場合は、この記事が最適です。

文章

  • 編集者注: この記事は、Ambi Lab (著者: Ambi Lab) からのものであり、許可を得て公開されています。

  • ビットコインアドレスには1から始まるアドレスと3から始まるアドレスがありますが、両者に違いはあるのでしょうか?

  • アドレス上のビットコインはどのような状況でロックアップされるのでしょうか?

  • ビットコインを正確に管理しているのは誰ですか、あなた?それとも財布ですか?

    ビットコイン ウォレットを使用していて、上記の 3 つの質問に答えられない場合は、この記事が役に立ちます。

    SECBIT研究所がデジタルウォレットのソースコードを監査したところ、pywalletと呼ばれるビットコインウォレットのオープンソースライブラリに重大な欠陥が含まれていることが判明した。 pywallet によって生成された OmniLayer 受信アドレスに転送すると、資産は永久に失われます。

    SECBIT研究所のブロックチェーン技術専門家であるzer0to0ne氏によると、OmniLayerプロトコルにより、ビットコインブロックチェーン上でカスタム資産(USDTなど)の発行が可能になるという。 OmniLayer 資産取引の本質はビットコイン取引です。ビットコイントランザクションには多くのコードベースがあり、pywallet もその 1 つです。 OmniLayer 形式に準拠したビットコイン トランザクションを簡単に構築できます。現在、pywallet は一部のデジタルウォレット ソフトウェアに適用されています。

    しかし、オープンソース ライブラリの pywallet が OmniLayer ウォレット アドレスを生成したときに、誤ってアドレスのプレフィックスが逆になってしまい、いくつかのアセットが無効なアドレスにロックされてしまいました。

    以下は、pywallet 関連のエラー コードのスクリーンショットです。https://github.com/ranaroussi/pywallet/commit/eb784ea4dd62fe2a50e1352e7d24438fc66a4ac0#diff-ca3a8be6f2ab4be3bfd69a49f5f4122a

    ファイルアドレス:

    キューに加わって科学を普及させましょう: ビットコイン ネットワークには、通常の公開キー アドレス (1 アドレス)、スクリプト ハッシュ アドレス (3 アドレス)、および分離監視アドレス (bc1 アドレス) という 3 つの最も一般的なアドレス タイプがあります。区別する。このうち、1 番地のプレフィックスは 0x00、3 番地のプレフィックスは 0x05 です。

    • 1 アドレス: これは最も一般的なビットコイン アドレスで、通常は通常の送金や支払いに使用されます。 1-アドレスは実際には公開キーのハッシュのエンコードです。 1-アドレスの署名を確認した後、支払いのロックを解除できます。

    • 3-アドレス: このアドレスはスクリプトのハッシュ アドレスです。このタイプのアドレスは、実際にはビットコイン スクリプト ハッシュのコードに対応します。

    • bc1-address: bech32 でエンコードされたアドレス。分離された監視トランザクションに使用されます。

    オープン ソース ライブラリの pywallet はアドレスのプレフィックスを逆にし、1 アドレスを 3 アドレスに誤って設定します。そのため、本来1番地に移転する予定だった資産が、誤って3番地に移転されてしまうことになります。アカウント所有者が 1 アドレス検証方法、つまり秘密鍵署名を使用して資産を引き出すと、ブロックチェーン ネットワークは 3 アドレス実行スクリプトを使用して検証を実行するため、ユーザーは正常に資産を引き出すことができなくなります。

    pywallet オープンソース ライブラリは注意して使用してください。 !

    事実: ビットコインは実際に送金機能を実装したことはありません

    これは多くの人々の予想を超えています。なぜなら、ビットコインの実装は UTXO モデルに基づいており、これは私たちが直感的に理解しているアカウント モデルとは異なるからです。 zer0to0ne 氏は、実際、ビットコインには通常の意味での伝達関数が実際には実装されていないと説明しました。サトシ・ナカモトは、ビットコイン用の一連のビットコイン スクリプト オペレーターとビットコイン スクリプト エグゼキューターを設計しただけであり、いわゆる転送プロセスは、実際にはビットコイン スクリプトのロックおよびロック解除プロセスによってシミュレートされます。これは、日常生活における台帳の概念 (またはアカウント モデル) とは異なります。

    理解を容易にするために、ビットコイン ブロックチェーン上の資産取引を金庫に資産をロックすることに例えることができます。金庫の鍵を持っている人 (つまり、受取人) だけが金庫内の資産を取引のために取り出すことができます。たとえば、アリスがボブに資産を支払いたい場合、アリスは資産を金庫にロックし、ボブだけが金庫の鍵を持っています。つまり、ボブだけが資産を取り出すことができます。ボブが資産を取り出したい場合、ボブは同時に資産を使用する必要があります (つまり、資産を別の金庫にロックしなければなりません)。ボブが資産を持ち出す前は、その資産は実際にはボブのものではありません。ボブがキーを紛失した場合、資産を引き出すことができなくなると想像してください。言い換えれば、資産がまだ金庫に保管されているときは、それはアリスのものでも、完全にボブのものでもありません。もちろん、アリスは誰でも開けられる金庫に資産を入れることもできます。これは、誰でも使えるトランザクションとも呼ばれます。

    ビットコイン ブロックチェーン上の受信アドレスが異なるため、さまざまなタイプの金庫が存在します。金庫の種類が異なれば、開けるために必要な鍵の種類も異なります。支払者は受取人用に金庫をカスタマイズし、その金庫に資産を入れて施錠し、公共の場所に金庫を投げ捨てます。金庫を開けるには 2 つの方法があります。

    • 受取人が 1 アドレスの場合、その金庫を 1 型金庫と呼びます。対応するキーは、指定された受信アドレスに対応する秘密キーである必要があります。金庫の解錠プロセスは、1アドレスの公開鍵とその公開鍵に対応するデジタル署名を検証することであり、これは私たちが通常認識している普通口座アドレスへの送金の検証プロセスでもあります。

    • 受取人が 3 アドレスの場合、それを 3 型金庫と呼びます。ロック解除キーは、実行可能なビットコイン スクリプトである必要があります。金庫のロックを解除するプロセスは次のとおりです。ビットコイン スクリプトのハッシュ値は 3 つのアドレスに対応し、ビットコイン スクリプト エグゼキューターはスクリプトの実行後に正常に戻ります。つまり、元のスクリプトを持っていて、それを正常に実行できる人だけが、この金庫内の資産を取り出すことができます。

    このセクションの質問に戻ります。なぜビットコインは本当の意味での伝達関数を実現していないと言われているのでしょうか。答えは簡単です。ビットコイン システムにはアカウントの概念が存在せず、アカウント間の送金は問題外だからです。将来、一人が何個の金庫を開けることができるかも不明です。

    上記の説明を通じて、pywallet オープンソース ライブラリが 1 つのアドレスを 3 つのアドレスとして誤って認識すると、元の 1 種類の金庫を 3 種類の金庫に変換するようなものであり、アカウント所有者は依然としてその口座を保持していることがわかります。 1 - 金庫の鍵を解除すると、当然金庫は開きません。では、zer0to0ne によって誤ってロックされた OmniLayer デジタル資産は回復できるのでしょうか?

    1-アドレスキーを使用して3-金庫を開ける可能性はありますか?

    次に、zer0to0ne 氏は、P2PKH (Pay to Public Key Hash) と P2SH (Pay to Script Hash) という 2 つの重要な概念について詳しく説明しました。これら 2 つの名詞は、2 つの異なるタイプのビットコイン取引を表します。

    以下は、zer0to0ne の素晴らしい技術的な詳細分析です。

    P2PKH - サトシ・ナカモトの偉大な発明

    Base58(0x00 + + Checksum)

    Pay to Public Key Hashはその名の通り、ビットコインを金庫に入れることであり、その鍵穴が公開鍵ハッシュ(Public Key Hash)です。私たちが目にする最も一般的な 1 アドレスは、本質的には公開キー ハッシュのエンコーディングです。 1- アドレス生成プロセスも非常に簡単です。公開キーは Hash160 を通じて計算されて公開キー ハッシュを取得し、プレフィックス 0x00 が公開キー ハッシュの先頭に追加され、チェックサムがハッシュの末尾に追加されます。 1 の先頭のビットコインは Base58 アドレスを通じて取得されます。

    P2PKH トランザクション タイプの安全な構築プロセスを見てみましょう。例として、アリスがボブにビットコインを送信します。

    OP_DUP 

    OP_HASH160 

    支払人アリスは、金庫を構築するときにロック スクリプトを設定する必要があります。

    OP_EQUALVERIFY 

    OP_CHECKSIG

    (ボブの受信アドレスに含まれる公開鍵ハッシュ)

    注: このステップは、アリスがボブ用に金庫をカスタマイズし、その金庫にビットコインを入れ、ボブの公開鍵 PubKey Hash でロックすると理解できます。これで、秘密鍵を保持するボブ以外の誰もこの錠を開けることができなくなります。

    ボブがアリスから渡されたビットコインを使う必要があるとき、金庫を開けるために必要なパラメータ (トランザクション署名 + 公開鍵 (専門用語: scriptSig)) を提供する必要があるため、実行後にロック スクリプトが True を返すようになります。このステップは通常、次のとおりです。ウォレットによって自動的に行われます。

    Bitcoin ノードが scriptSig の正当性をどのように検証するかを見てみましょう。

    (画像は『Mastering Bitcoin』より) スクリプトの実行プロセスを図に示します。トランザクションの署名後に Bob によって取得されたデータ (実際にはデータ長情報が含まれます)、実際の scriptSig は次のようになります。

    , ビットコイン スクリプト エグゼキューターは PUSH データから開始されます。PUSH 操作は、スタックにプッシュされるデータの長さ情報を取得するために最初のバイトを読み取り、実行が完了するまでビットコイン スクリプトの実行を続けて、実行結果。最初のスタックは、それから, HASH160 は、スタックの最上位をポップしてハッシュを計算し、結果をスタックにプッシュしてから、EQUALVERIFY を使用してハッシュをポップアップし、等しいかどうかを比較します。等しい場合は True を返し、等しくない場合は True を返します。等しい場合、トランザクションは無効としてマークされます。このステップでは、署名者の ID の正確性を保証するために公開キーが公開されますが、ハッカーやマイナーは公開された公開キーを使用して、元のトランザクションを置き換える新しいトランザクションを構築する可能性があり、セキュリティを保証できないため、次のステップが必要です。保証されたトランザクションは偽造できません。現時点ではまだありますそしてそして

    , CHECKSIG を実行すると、デジタル署名が正しいことが検証され、署名者がアドレスに対応する秘密鍵を持っていることが確認されます。

    秘密鍵を保持している人以外はデジタル署名を偽造することはできず、これまでのところ、ビットコイン P2PKH トランザクションは安全に完了しています。

    もう一度説明します。ボブがアリスから渡されたビットコインを使いたいとき、ボブはアリスが残した金庫を正しい鍵で開け、そのお金をボブのために新しく作られた金庫に入れることしかできません。

    この時点で、一部の賢明な読者は詳細に気づくでしょう。ボブが鍵を取り出すと、ブロックチェーン上のマイナーは金庫を開ける前に鍵の形状を見ることができ、理論的にはすぐにそれをコピーできます。鍵を開けてアリスのお金を使うことができます。ボブにとっては安全です (一般にフロントランニング攻撃として知られています)。本当にそんなことが可能なのでしょうか?明らかに、サトシ・ナカモトはこの問題を検討しており、このキーのトランザクション署名は、ボブによって開始されたトランザクションの完全な署名です。ボブがアリスが作った金庫の中にあるビットコインを(チャーリー用の)新しい金庫に置きたいとします。このとき、ボブが提示した鍵にはチャーリーの公開鍵ハッシュが含まれています。マイナーはボブの鍵をコピーできますが、その鍵は次の新しい金庫の情報は隠されているため、マイナーはこの合鍵を使用して他のアクションを完了することはできません (デジタル署名を横領することはできません)。

    P2SH - ポストサトシ時代の主要なイノベーション

    サトシ・ナカモトはこのような強力なスクリプト システムを設計しましたが、これを転送トランザクションの構築にのみ使用するのはあまりにもったいないので、他の命令を使用して特別なロック スクリプトを構築し、他の方法でロックを解除してみましょう。

    OP_HASH160

    OP_EQUAL

    たとえば、ハッシュ プリイメージを使用してトランザクションのロックを解除するスクリプトを構築できます。このスクリプトの意味は、 Hash160(Pre-image)== が満たされる場合です。

    この条件が満たされると、スクリプトのロックを正常に解除できます。

    金庫の例を続けて、このタイプの金庫に 3 型金庫という名前を付けます。ここで、アリスからボブへのビットコインは、上記の Hash160 によって保護された金庫にロックされています。これをハッシュ ロックと呼びます。

    この錠前を開くには依然として正しい形状が必要ですが、セキュリティは非常に弱く、デジタル署名メカニズムがないため、鍵に隠された鍵情報はボブの新しい金庫では変更されません。ボブが鍵を見せた瞬間に、マイナーは誰でもまったく同じ鍵をコピーし、アリスがボブに残した金庫(フロントランニング)を急いで開け、そのコインを別の人、イブに移すことができるので、もともとボブが所有していたコインはビットコインになる略奪されるだろう。

    このスクリプトは非常に安全ではありませんが、2 つの非常に魔法の機能があります。

    1. トランザクション構造の出力は十分に短いため、ビットコイン ノードによって維持される UTXO キャッシュが占有するスペースが大幅に削減されます。

    2. プリイメージはトランザクションの実行時に入力として常に参照され、トランザクションの出力側には表示されません。UTXO は合理化されたままであり、手数料の負担は受信側に転嫁されます。

    説明した出力スクリプトには多くの利点があるため、このトランザクションを安全にする方法はあるでしょうか?これには、P2SH とは何かについて話す必要があります。

    Bitcoin Core の開発者 Gavin Adresen は、Pay to Script Hash (P2SH) と呼ばれる技術を提案しました。