ビットコイン ブロックチェーン開発の初心者向けガイド (パート 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は、企業のブロックチェーンプロジェクトにデータセキュリティ保護を提供するための新しいクラウドベースのブロックチェーンセキュリティサービスを研究しています。

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

推薦する

隔離された証人 vs. BU 支持者: どちらが優れているか?

過去 1 か月間、多くのビットコイン取引所、スタートアップ企業、専門家が、Segregated Wi...

分離型証人の今後の発動がライトコイン価格の継続的な上昇の理由かもしれない

Golden Finance News -調査によると、ライトコインネットワークでのSegregat...

日本政府が紙幣の印刷を開始、ビットコインは上昇するか?

ドイツの日刊紙「ディ・ヴェルト」の上級編集者ホルガー・ツェピッツ氏は、日本の低迷する経済と10年国債...

インテルの廃墟となったチップ加工工場がビットコイン鉱山に生まれ変わる

Bitcoin.comによると、カリフォルニアの投資会社3G Venture IIは、廃墟となったイ...

B9 クラウドコンピューティングパワーを B11 に置き換えることに関するお知らせ

B9クラウド コンピューティング パワーは、BiWang が発売したクラウド コンピューティング パ...

ビットコイン事業のCEOがPayPalの取締役に就任

クレイジーな解説:ウェンセス・カサレス氏を取締役会に迎え入れるというPayPalの真意はまだ分からな...

ハッカーが米国の有権者データベースをダークウェブで12ビットコインで販売

Tech Insiderによると、DataDirectという名のハッカーが、The Real Dea...

7月のブロック報酬半減期に続き、ビットコインの採掘難易度は4度目の上昇

効率的なマイニング機器の使用とビットコインの需要の増加により、ビットコインマイニングの難易度は再び上...

イングランド銀行関係者:デジタル通貨は銀行融資に影響を及ぼす可能性がある

イングランド銀行の金融政策担当副総裁ベン・ブロードベント氏は本日の演説で、ビットコインは広く普及しな...

イングランド銀行、デジタル通貨研究のリーダーシップを目指す

クレイジーな解説:英国、オランダ、カナダ、オーストラリアなどの中央銀行はすべて、デジタル通貨を発行す...

2020年のDeFi:氷と炎の歌

今年のブロックチェーン業界では、オラクル、レンディング、分散型トランザクション、パブリックチェーンな...

国家知識産権局:ブロックチェーン特許制定基準の導入計画

ブロックチェーン技術の分野では、海外が特許を独占し続けており、国内の特許配置はまだ行われていない。ブ...

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

強い買いが安値を押し上げる1. 市場動向<br/>今朝のビットコインの価格は4160元で...

Binance の新しい IE0 が注目される: Web3 の新規ユーザーを引き付ける次の StepN となるか?

11月23日、Binanceは29番目のLaunchpadプロジェクトHooked Protoco...