ビットコイン ブロックチェーン開発の初心者向けガイド (パート 3)

ビットコイン ブロックチェーン開発の初心者向けガイド (パート 3)

この記事では、ビットコインテストネットワーク(bitcoin-testnet)を開発テスト環境として使用し、ビットコイントランザクション(Transaction)のデータ構造を分析し、Node.jsを例に、特定のトランザクションデータを自分で整理し、署名してブロードキャストし、最終的にマイナーノードによって確認され有効になる方法を説明します。


1. ビットコインの「トランザクション」データ構造を理解する

トランザクションは情報の伝達手段であり、ビットコイン システムの最小単位です。ブロックとは、箱に詰められ、密封されたこれらの基本的な「トランザクション」単位のグループです。これらのブロックは、特定のメカニズムとシーケンスに従ってリンクされ、ブロックチェーンを形成します。

ビットコインブロックチェーンに基づくアプリケーション開発では、「トランザクション」が最も直接的に使用され、最も重要なデータ構造です。 「トランザクション」に加えて、ウォレットの秘密鍵、公開鍵とアドレス、ブロック、ブロックチェーンなど、ビットコインのブロックボリュームに関連するいくつかの基本的な用語の意味も理解する必要があります。比較的明確に説明されている書籍やオンライン資料は数多くあります。ここでは、オンライン ブック「Mastering Bitcoin」(http://zhibimo.com/read/wang-miao/mastering-bitcoin/index.html) を読むことをお勧めします。

ここでは、「トランザクション」のデータ構造の詳細な分析と理解に焦点を当てます。

ビットコインのトランザクションは、入力値と出力値を含むデータ構造であり、初期ポイント(入力値)からターゲットアドレス(出力値)に資金を転送するためのコード情報が含まれています。ビットコインのトランザクションには、次の表に示すように、いくつかのフィールドが含まれています。

サイズ フィールド名 データ型 説明
4バイトのプロトコルバージョンuint32_tは、このトランザクションが参照するルールプロトコルのバージョン番号を指定します。
1-9バイト 入力量 var_int 含まれる入力トランザクションの数は不定です 入力リスト tx_in[] 1つ以上の入力トランザクションの配列
1-9バイト出力番号var_int含まれる出力トランザクションの数は不定です出力リストtx_out[]1つ以上の出力トランザクションの配列
4バイトのロック時間 uint32_t UNIXタイムスタンプまたはブロック番号

注: ロック時間フィールドは、ブロックチェーンに追加できる最も早いトランザクション時間を定義します。ほとんどのトランザクションでは、デフォルトで 0 に設定され、即時実行を示します。ロック時間が 0 より大きく 5 億未満の場合、それはブロックの高さとみなされ、指定されたブロックの高さより前にトランザクションがブロックチェーンに含まれていなかったことを意味します。ロック時間が 5 億を超える場合、Unix エポック タイムスタンプ (1970 年 1 月 1 日からの秒数) として扱われ、この指定された時間より前のトランザクションはブロックチェーンに含まれません。ロック時間の使用は、紙の小切手の有効時間を遅らせることと同じです。

ブロックチェーン技術に基づくアプリケーション開発は、実際には主に、特定のビジネス ロジックを実行するためのトランザクションの出力データ構造に取り組むことです。たとえば、ODIN オープンソース プロジェクトは、特定の形式でビットコインの複数のトランザクション出力データ ブロックに識別属性データを埋め込みます。

2. 取引記録の分析例

以下は、ビットコイン取引の生データの例です (生のバイナリ データは、分析を容易にするために、バイトごとに 16 進 ASCII コードとして出力されます)。

0100000002eb2121e4e727bdb28525e79d39a90bd711b9e8413c054b29ffc4bb4775e69f82010000006b483045022100df82
cf6c95b4eb64e4e9cee3af88a94c65fa81650e824d515f089192b7e3c09c0220119c1fcfd9354755ea815cf714c181b56784
b8f98f59f33e977c8939cd6f75db0121022e9f31292873eee495ca9744fc410343ff373622cca60d3a4c926e58716114b9ff
ffffffc9f3b07ebfca68fd1a6339d0808fbb013c90c6095fc93901ea77410103489ab7010000008a47304402206b993231ad
ec55e6085e75f7dc5ca6c19e42e744cd60abaff957b1c352b3ef9a022022a22fec37dfa2c646c78d9a0753d56cb4393e8d0b
22dc580ef1aa6cccef208d0141042ff65bd6b3ef04253225405ccc3ab2dd926ff2ee48aac210819698440f35d785ec3cec92
a51330eb0c76cf49e9e474fb9159ab41653a9c1725c031449d31026affffffff031027000000000000475121022e9f312928
73eee495ca9744fc410343ff373622cca60d3a4c926e58716114b9210250504b2d42455441506565722d506565722d6e6574
776f726b207075626c696352aee07b9a3b000000001976a914391ef5239da2a3904cda1fd995fb7c4377487ea988ac000000
00000000000d6a0b436f6465206973204c617700000000

上記のメッセージは、プロトコル規則に従って次のようにフィールドに分解できます。

01000000 // バージョン番号、UINT32

02 // Tx入力量、可変長INT。 0×02=2入力。

/*** 次は Input Tx の最初のグループです ***/
eb2121e4e727bdb28525e79d39a90bd711b9e8413c054b29ffc4bb4775e69f82 // Txトランザクションのハッシュ値、32バイトに固定
01000000 // 消費されたTxは0番目のフォワードトランザクション出力に位置し、UINT32、固定4バイト
6b // 次は対応する署名データの長さ、0x6b = 107 バイトです。
// この 107 バイトの署名には、秘密鍵署名 + 公開鍵の 2 つの部分が含まれています。
// ここでの値が00の場合、元のトランザクションがまだ署名されていないことを意味します
48 // 秘密鍵署名に対応するデータ長、0×48 = 72 バイト

3045022100df82cf6c95b4eb64e4e9cee3af88a94c65fa81650e824d515f089192b7e3c09c022011
9c1fcfd9354755ea815cf714c181b56784b8f98f59f33e977c8939cd6f75db01 //秘密鍵署名の内容

21 // 対応する公開鍵データの長さ、0×21 = 33 バイト
022e9f31292873eee495ca9744fc410343ff373622cca60d3a4c926e58716114b9 //対応する公開鍵データ
ffffffff // シリアル番号、UINT32、固定4バイト。このフィールドは現在使用されていないトランザクション置換関数であり、デフォルトでは 0xFFFFFFFF に設定されています。

/*** 入力 Tx の 2 番目のグループ。上記と同様、分解は省略***/

c9f3b07ebfca68fd1a6339d0808fbb013c90c6095fc93901ea77410103489ab7010000008a473044
02206b993231adec55e6085e75f7dc5ca6c19e42e744cd60abaff957b1c352b3ef9a022022a22fec
37dfa2c646c78d9a0753d56cb4393e8d0b22dc580ef1aa6cccef208d0141042ff65bd6b3ef042532
25405ccc3ab2dd926ff2ee48aac210819698440f35d785ec3cec92a51330eb0c76cf49e9e474fb91
59ab41653a9c1725c031449d31026affffffff

03 // Tx はトランザクション量を可変長 INT 型で出力します。 0×03=3入力。

/*** 出力の最初のグループ ***/
10270000000000000 // 出力されるビットコインの数、UINT64、8 バイト。バイト順序を反転すると、0×00000000000002710 = 10000 satoshi = 0.0001 BTC になります。
47 // 出力記述スクリプトのバイト数、0×47 = 71バイト、いくつかのオペコードと値で構成
51 //Ox51 は OP_1 を表します (スクリプト コード 1 をスタックにプッシュします)
21 //スタックにプッシュされた最初の公開鍵のデータ長、0×21 = 33 バイト
022e9f31292873eee495ca9744fc410343ff373622cca60d3a4c926e58716114b9
21 //スタックにプッシュされた2番目の公開鍵のデータ長、0×21 = 33バイト
0250504b2d42455441506565722d506565722d6e6574776f726b207075626c6963
52 //Ox52 は OP_2 (スクリプト コード 2 をスタックにプッシュ) を表します。前の0×51と合わせて1of2マルチ署名を表す。
ae //Oxae は OP_CHECKMULTISIG (マルチ署名検証を実行する) を表します

/*** 出力の 2 番目のグループ ***/
e07b9a3b00000000 // 出力されるビットコインの量、UINT64、8 バイト。バイト順序を反転する必要があります。
19 // 出力記述スクリプトのバイト数、0×19 = 25バイト、いくつかの操作コードと値で構成される
76 //スクリプト開始操作 0×76 は OP_DUP (スタックの先頭要素をコピー) を表します
a9 //アドレスタイプ 0xa9 は OP_HASH160 を表します (スタックの最上位項目は 2 回ハッシュされ、最初は SHA-256 で、次に RIPEMD-160 でハッシュされます)
14 //アドレス長 0×14 = 20 バイト
391ef5239da2a3904cda1fd995fb7c4377487ea9 // 対応する HASH160 値、20 バイト
88 //0×88 は OP_EQUALVERIFY を表します (スクリプトのバイナリ演算と条件を実行し、結果が 0 の場合は OP_VERIFY を実行します)
ac //Oxac は OP_CHECKSIG の略です (トランザクションで使用される署名はハッシュ値と公開鍵の有効な署名である必要があり、true の場合は 1 を返します)
/*** 出力の3番目のグループ ***/
0000000000000000 // 出力されるビットコインの数、UINT64、8 バイト。通常の振替取引ではなく紙幣追加取引のため、出力金額は0となります。
0d // 出力記述スクリプトのバイト数、0x0d = 13 バイト、いくつかのオペコードと値で構成
6a //0x6a は OP_RETURN (トランザクションを無効としてマーク) を表し、トランザクションが通常の転送トランザクションではなく、単なる追加メモであることを示します。
0b //コメント内容の長さ、0x0b = 11 バイト
436f6465206973204c6177 //データ内容を注釈する(元のバイナリデータを16進ASCIIコードで表す)

00000000 // ロック時間、UINT32、固定4バイト

上記の分析を通じて、ビットコイン取引記録の一般的な構成形式を理解して習得した後、青いフォント部分に対応するデータ コンテンツ ブロックを最大限に活用してカスタマイズされたバイナリ データ コンテンツを埋め込み、独自の特定のビジネス ロジックを開発して実装できます。

3. サンプルプログラムを実行する

次のサンプル プログラムは、特定のコンテンツの文字列を特定の形式で Bitcoin トランザクションのコメント データ ブロックに埋め込み、Bitcoin ブロックチェーンに保存できるようにします。

以下のサンプルプログラムを実行する前に、Bitcoin テスト ネットワーク (bitcoin-testnet) 用の Docker ランタイム環境がインストールされていることを確認してください。まだインストールされていない場合は、前の記事「初心者から上級者まで学ぶビットコイン ブロックチェーン開発ガイド 2」の手順を参照してインストールしてください (http://www.8btc.com/ppkpub_blockchain_develope_lesson_2)。

次のサンプル コードをコピーして、ビットコイン テスト ネットワーク (bitcoin-testnet) のテスト環境に保存し (ファイル名を OpreturnTestnet.js として保存)、コマンド ラインに次のコマンドを入力して実行し、実行結果を確認します。
ノード OpreturnTestnet.js

注: テスト コードを実行するたびに、Docker ランタイム環境のコマンド ラインに「make generate BLOCKS=10」と入力して、新しいブロック レコードの生成をシミュレートし、テスト コードによって生成されたトランザクション レコードを効果的に確認する必要があります。

サンプルプログラム OpreturnTestnet.js のソースコードは次のとおりです。

/************************ サンプルコードの開始点****************************/


<<:  IBMは、企業のブロックチェーンプロジェクトにデータセキュリティ保護を提供するための新しいクラウドベースのブロックチェーンセキュリティサービスを研究しています。

>>:  世界各国におけるブロックチェーンの研究と実践

推薦する

コインゾーントレンド: 今週のビッグデータに基づくビットコインの価格動向 (2016-07-15)

三角形は終わりを迎え、その方向はすぐに明らかになるだろう。 1. 市場動向<br/>ビッ...

分散型自律組織(DAO)が直面する法的課題

スマートコントラクトの概念は1990年代にまで遡ります[1]。今でも、何か驚くべきものが発明されない...

IBMは米国政府にブロックチェーン技術を適切に規制することを推奨している

昨日、IBMのブロックチェーン技術責任者であるジェリー・クオモ氏は、米国国家サイバーセキュリティ専門...

連邦判事は、リップル社が取引所を通じてXRPを販売したことは証券法に違反していないと判断

昨年、連邦裁判所はリップル社によるXRPの機関投資家向け販売が連邦証券法に違反していると判断し、同社...

イーサリアムと同じくらい人気のコスモスエコシステムは、現在どのように発展しているのでしょうか? (優れた)

最近コスモスが元気に咲いています。エコシステムは日々成長しているだけでなく、そのパフォーマンスも B...

チップ供給の逼迫とマイニング市場の需要増加により、グラフィックカードの価格は急騰した。

BlockBeatsによると、世界的な流行の発生に伴い、市場におけるグラフィックカードの価格が大幅...

ブロックチェーンは非常に人気があるので、サーバーが受動的にマイニングされることには注意してください

ある日、VPS サーバーで CPU アラームを受信しました。サーバーにログオンすると、gpg-age...

ブロックチェーンを未来主義から守る方法

マーティン・ハゲルストロムはビットコインの愛好家です。彼は IBM で IT プロジェクト マネージ...

イーサリアムの創始者:次世代の暗号通貨

ビットコインの将来は不確実です。現在、多くの専門家がブロックチェーンの将来について議論しています。ビ...

ビットコインの半減期:デジタルゴールドと世界経済の繁栄に一歩近づく

ビットコインの半減期まであと数日しかないので、これから何が起こるのかを考えるのはいいことです。ビット...

欧州議会、デジタル通貨規制に関する公聴会を開催

クレイジー解説:今回の欧州仮想通貨公聴会では、「監督はするが規制はしない」という提案が非常に価値があ...

「エメラルドの島」アイルランドにとってビットコインが持つ特別な意味

新しいブロックチェーンとデジタル通貨センターがアイルランドにやって来ます(この国の緑化率はほぼ 90...

ENS エアドロップがまもなく登場します。分散型ドメイン名とアカウントシステムはなぜ Web3 にとってそれほど重要なのでしょうか?

執筆者: パン・ジーシオン暗号通貨の送金を初めて体験したとき、特に受取人のアドレスを確認するときに、...

イーサリアム ETF はなぜ承認されたのでしょうか?市場が本当に注目すべきは……。

5月24日、米証券取引委員会(SEC)の文書によると、 SECはブラックロック、フィデリティ、グレ...

DeFi流動性マイニングブームのレビュー:DEXには堀がない

DEX には堀がなく、SUSHI は流動性戦争の新たな次元を開きます。 6月初旬に「DEX間の競争は...