ブロックチェーン技術の秘密を解き明かす(V):ビットコイン取引スクリプトの深い理解

ブロックチェーン技術の秘密を解き明かす(V):ビットコイン取引スクリプトの深い理解

この記事の著者は、Huobi Blockchain Research Center の技術専門家である Liao Xuefeng です。彼はソフトウェア開発で 10 年の経験があり、Java/Python/Ruby/Visual Basic/Objective C/Lisp などのプログラミング言語に精通しています。彼はオープンソース フレームワークについて深く研究しており、「Spring 2.0 Core Technology and Best Practices」という本の著者でもあります。彼はまた、GitHub でホストされている複数のアマチュア オープン ソース プロジェクトも運営しています。

この記事では、ビットコインとビットコインブロックチェーンの関連知識を詳しく紹介します。

ビットコイン ブロックチェーンでは、各ブロックは前のブロックを指しており、SHA256 によって計算されるこれらのブロック ハッシュ チェーンが、ビットコイン元帳の改ざん防止の基礎となります。

ブロックでは、ビットコイン システムはトランザクションを使用してビットコインのトランザクションを表します。ブロックには少なくとも 1 つのトランザクションが含まれます。これらのトランザクションのハッシュは、マークル ツリーを介したすべてのトランザクションのマークル ハッシュを計算するために使用され、ブロック ハッシュに含まれるため、トランザクションは変更不可能になります。

各トランザクションを詳しく見ると、マイナーのマイニング収益である最初のトランザクションを除いて、各トランザクションには 1 つ以上の入力 (TxIn) と 1 つ以上の出力 (TxOut) があることがわかります。

最初のマイナーの収入取引は通常、Coinbase と呼ばれます。入力がないので、TxInのハッシュは常に00000000…0000とマークされます。

他のトランザクションの場合、TxIn は、ブロックチェーン上のこのブロックの前のトランザクション ハッシュとインデックスに一意に遡ることができます。

トランザクション ハッシュとインデックス (0 から始まる) を通じて、未使用のトランザクション出力 UTXO (Unspent Transaction Output) を一意に特定できます。このようにして、各 Tx 入力は前の Tx 出力に関連付けられます。

前回の取引で、ボブがアリスに 0.15 BTC を支払ったと仮定します。
ビットコインにはアカウントの概念がないため、このトランザクションの出力にはアリスの名前や公開鍵は含まれません。

では、アリスがこの 0.15 BTC を使いたい場合、自分がこの UTXO を所有していること、そして他人がアリスになりすましてこの UTXO を使うことができないことをどのように証明すればよいのでしょうか?
答えは、ビットコイン取引によって作成される出力は、実際には単純な公開鍵アドレスではなく、スクリプトであるということです。ボブがアリスに 0.15 BTC を支払うトランザクションでは、ボブによって作成された出力スクリプトは次のようになります。

OP_DUP OP_HASH160 abcd1234…9876 OP_EQUALVERIFY OP_CHECKSIG

このうち、abcd1234…9876 はアリスの公開鍵ハッシュです。スクリプト全体の意味は、このスクリプトを実行するための署名と公開鍵を提供できる人は誰でも、このトランザクションの 1.5 BTC を使用できるということです。

署名の作成にはアリスの秘密鍵のみを使用できるため、アリス以外の秘密鍵で作成された署名はこのスクリプトの検証に合格できず、他の人がアリスになりすましてこの出力を使用することはできません。

アリスが署名と自分の公開鍵を提供すると、この出力を使用する別のトランザクションが実際に作成されます。

誰もが、アリスが作成した新しいトランザクションが有効であることを確認できます。有効な場合、トランザクションはマイナーによって新しいブロックにパッケージ化され、ブロックチェーンの変更不可能な部分になります。

トランザクションが有効かどうかを確認するために、有名なピザトランザクションを例に挙げてみましょう。

トランザクション cca75078…4d79 では、唯一の TxIn 入力によって提供される sigScript は次のとおりです。

8b4830450221009908144ca6539e09512b9295c8 a27050d478fbb96f8addbc3d075544dc41328702

201aa528be2b907d316d2da068dd9eb1e23243d9 7e444d59290d2fddf25269ee0e0141042e930f39

ba62c6534ee98ed20ca98959d34aa9e057cda01c fd422c6bab3667b76426529382c23f42b9b08d78

32d4fee1d6b437a8526e59667ce9c4e9dcebcabb

sigScript は実際には 2 つの部分で構成されています。

署名: 30450221…ee0e01 (71 バイト + 1 バイトの署名タイプ)。実際の署名は、最後のバイト 01 のない 30450221…ee0e です。署名タイプは SIGHASH_ALL (0×01) です。
公開鍵: 042e930f…cabb (65 バイト)

トランザクションが有効であることを確認するには、まず、TxIn: a1075db5…d48d およびインデックス 0 で宣言された以前の出力ハッシュに基づいて、前のトランザクションの出力を見つける必要があります。

https://webbtc.com/tx/a1075db55d416d3ca199f55b6084e2115b9345e16c5cf302fc80e9d5fbf5d48d

このトランザクションのスクリプト出力は次のとおりです。

1976a91446af3fb481837fadbb421727f9959c2d32a3682988ac

Bitcoin スクリプトは一連の命令とデータで構成され、各命令は 1 バイトを占め、データはデータ ヘッダーの長さによって決まります。上記のバイナリ スクリプトから変換された Bitcoin 命令は次のとおりです。

OP_DUP OP_HASH160 46af3fb481837fadbb421727f9959c2d32a36829 OP_EQUALVERIFY OP_CHECKSIG

これで、署名、公開鍵、スクリプトができました。

署名: 30450221…ee0e01
公開鍵: 042e930f…cabb OP_DUP OP_HASH160 46af3fb4…6829 OP_EQUALVERIFY OP_CHECKSIG

このスクリプトを実行すると、トランザクションが有効であることを確認できます。

Bitcoin スクリプトは、スタック上で実行される仮想マシン命令として設計されています。命令の数は限られており、ループや条件付きジャンプが意図的に排除されて設計されています。したがって、Bitcoin スクリプトはチューリング完全な言語ではありません。

Bitcoin スクリプトの実行は非常に簡単です。まず空のスタックを準備し、署名と公開鍵をスタックにプッシュする必要があります。

次に、TxOut スクリプトを実行します。

OP_DUP OP_HASH160 46af3fb481837fadbb421727f9959c2d32a36829 OP_EQUALVERIFY OP_CHECKSIG

まず、OP_DUPが実行されます。この命令はスタックの一番上の要素をコピーするので、結果は次のようになります。

次に、OP_HASH160 が実行され、スタックの最上位要素で SHA256/RipeMD160 が計算されます。これは実際に公開鍵ハッシュを計算するため、実行結果は次のようになります。

次の命令は実際にはデータであり、そのデータを直接スタックにプッシュします。

次に、OP_EQUALVERIFY を実行します。この命令は、スタックの一番上の 2 つの要素が等しいかどうかを比較します。等しくない場合、スクリプト全体の実行は失敗します。等しい場合、スクリプトは実行を継続し、実行結果は次のようになります。

最後に、署名を検証する命令 OP_CHECKSIG を実行します。まず、署名タイプSIGHASH_ALL(0×01)に基づいてトランザクション全体を検証します。検証方法は次のとおりです。

現在のトランザクションのすべての TxIn の scriptSig を削除し (赤い部分)、現在の TxIn の scriptSig を UTXO のスクリプトに置き換え (青い部分)、長さフィールドを調整します (緑の部分)。

最後に、リトルエンディアンの 4 バイト署名タイプ 0×01 (灰色の部分) を追加し、SHA256 を 2 回計算すると、次のようになります。

c2d48f45…2669

次に、ECDSA アルゴリズムを使用して署名を検証します。

ブール型ecdsa_verify_signature(byte[] メッセージ、byte[] 署名、byte[] 公開鍵)

署名の検証結果に基づいて、トランザクションが有効かどうかを確認できます。

スクリプトの導入により、ビットコインは実際にプログラミング スクリプトによるコンピュータ プログラムの検証に厳密に基づいたデジタル通貨所有権移転メカニズムを実装していることがわかります。コンピュータ プログラムのスケーラビリティにより、ビットコインの支払いは特定の公開鍵アドレスへの支払いに限定されません。スクリプトを使用すると、マルチ署名検証条件など、さまざまな支払い条件を構築できます。

2 3 OP_CHECKMULTISIGN

このマルチ署名スクリプトは、複数の公開鍵アドレスを提供し、複数の署名検証を必要とするため、M 個の署名のうち少なくとも N 個の署名を付与できます。上記のスクリプトを使用すると、3 つの公開鍵アドレスから任意の 2 つの有効な署名を提供できます。

サードパーティのオンラインウォレットでビットコインをホストする場合、マルチ署名を使用して、出力が自分自身とサードパーティのウォレットの署名後にのみ使用されるようにすることができます。これにより、ハッカーがサードパーティのウォレットを攻撃した後でユーザーのビットコインを使うことができなくなります。

OP_CHECKLOCKTIMEVERIFY を使用すると、トランザクションのロック時間を指定できます。この時間より前には、トランザクション出力は使用できません。この指示は、実際に資金を 7 日間ロックしてから販売者に支払うという Alipay の機能を実装します。

公開鍵ハッシュを指定しないトランザクションもいくつかあります。たとえば、このトランザクションのスクリプトは次のようになります。

OP_HASH256 6fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d619000000000000 OP_EQUAL

つまり、SHA256 が 6fe28c0a…0000 であるデータを提供できる人は誰でもトランザクションを使用できるということです。
(注: このトランザクションは使用済みです。条件を満たすデータが見つかりました)

ビットコインのスクリプトから、ブロックチェーン ベースのデジタル通貨支払いは、実際にはデジタル通貨の所有権の安全な移転であることがわかります。金融資産や物理的資産をデジタル形式でブロックチェーン上に登録すれば、スクリプトを通じてさまざまな条件下で安全に所有権を移転することができます。これはブロックチェーン上のスマートコントラクトの応用です。

<<:  イエレンFRB議長:ブロックチェーンは「重要な技術」

>>:  もう一つの小さな目標:ワンダグループ初のブロックチェーン注文がデビュー、金融と税務分野に重点を置く

推薦する

ブロックチェーン投資家ガイド: この「クールな」プロジェクトには本当にブロックチェーンが必要なのか?

前回の記事では、ブロックチェーンの誇大宣伝の理由、その結果、そしてこのテクノロジーを実際にうまく活用...

ロシアの暗号通貨税は130億ドルに達する、どの国が暗号通貨に課税しているのか?

最近、ロシアの地元メディア「ザ・ベル」が発表したレポートによると、ロシア政府の暗号通貨による税収は1...

コンセンサス 2017 ビットコイン スケーリング プロトコル: 分離証人と 2MB スケーリングが同時に導入される

2017年5月23日私たちは、同時に展開され、元の SegWit 2Mb 提案に基づいて構築される以...

L1 と L2 の思考パターンの違い: 永遠に勝利するのは誰か?

暗号通貨はデータベース技術のパラダイムシフトを先導している暗号通貨の基礎はデータベースです。すべての...

スイス国鉄、11月11日から券売機でビットコイン購入可能に

BBCの報道によると、スイス国鉄(SBB)は来月から駅でデジタル通貨ビットコインの販売を開始する予定...

雄安科技はカナンクリエイティブと協力し、カナンに代わってブロックチェーン機器を1億5000万ドル以下で購入または配布する予定だ。

Hexun.comによると、雄安科技(01647)は、子会社の雄安衛成と杭州カナン創意情報技術有限...

KoiコンピューティングサーバーC16内部テスト初リリース

幸運をもたらすマイニングマシン - KoiコンピューティングパワーサーバーC16シリーズの最初の内部...

ロシア、10億ルーブルの偽造事件を摘発、容疑者は偽造紙幣を仮想通貨で販売

BlockBeatsによると、ロシア当局はダークウェブ上で大量の偽造紙幣を暗号通貨と交換に販売してい...

ブロックチェーンの微妙な暴政

過去数か月は、ブロックチェーン技術の発展における新たな章となりました。 DAOハッキング事件はイーサ...

KPL ケプラーコイン - グラフィックカードマイナーで採掘できる新しい仮想通貨の最新情報公開

グラフィックカードマイナーが採掘できる新しい仮想通貨「KPL ケプラーコイン」の最新情報が公開されま...

何一心文:意見が合わないなら、あなたの言う通りかもしれない

最近、バイナンスが複数のミームコインを発売した後、あるKOLのチャットのスクリーンショットが上場前に...

Huaweiがデジタルウォレットを発売!なぜウォレットは価値あるインターネットへの入り口となり得るのでしょうか?

2020年11月、ファーウェイはデジタル人民元ハードウェアウォレットをサポートする携帯電話Mate...

えーっと

準備まず、公式ウェブサイトからマシンのドライバーをバックアップまたはダウンロードします。重要なデータ...

イーサリアムのハードフォークにより、イーサリアムブロックチェーンのフォークバージョンであるイーサリアムクラシックが作成された。

クレイジーな解説: 先週、イーサリアムがハードフォーク計画を実施した後、イーサリアムブロックチェーン...