ブロックの基本構造
ブロック
ブロックサイズ | BlockSize | 4バイト |
ブロックヘッダ | BlockHeader | 80バイト |
ブロックに含まれるトランザクション数 | TransactionCounter | 1-9バイト |
トランザクションリスト | Transactions | 可変 |
※ブロックサイズは最大1MB
ブロックヘッダ
バージョン | Version | 4バイト |
前ブロックのハッシュ | PreviousBlockHash | 32バイト |
マークルルート | MerkleRoot | 32バイト |
タイムスタンプ | Timestamp | 4バイト |
PoWの難易度 | DifficultyTarget | 4バイト |
ナンス | Nonce | 4バイト |
次のブロックができる仕組みがいまいち分からない。。。分散環境で本物や偽物の多くのTXがある?のにどのタイミングでブロックを生成し、Nonceを計算し出すのか・・・
分岐も当然発生するが、その配下に繋がるブロックが増えていって、最長チェーンが正当なチェーン。後ろに6ブロックできれば基本的には変更される心配はほとんどないとされる。
ブロックヘッダの詳細
Version(バージョン)
Bitcoinのルールセットを表す。
PreviousBlockhash(前ブロックのハッシュ)
SHA256でダブルハッシュ+バイト単位で反転させたもの。
※ハッシュ関数
BitcoinではSHA2(SHAー256)、RIPEMD(RIPEMD160)を利用。不可逆性ハッシュ関数でも総当たり攻撃で突破される可能性はある。すでにMD5やSHA1は突破されている。ハッシュを2回重ねるダブルハッシュを利用することでさらに総当たり攻撃の耐性を強化できる。量子コンピュータで突破される可能性もあるがそもそもその場合はインターネット自体が脅威にさらされることになる。
MerkleRoot(マークルルート)
ブロック内のTXをようやくした値。TXはMerkleTreeというデータ構造を経て出力されたハッシュ値としてまとめられ、そのRoot。
TXをそれぞれハッシュ化して、隣合うハッシュをさらにハッシュ化していって、MerkleTreeを作っていき、最終的に1つのハッシュ値が生成される。これがMerkleRoot。ブロック内のTXの数は、1 – 3000なので深い階層構造となる。
このMerkleTreeを利用してMerkleRootマークルルートにたどり着く経路をMerklePathという。これを利用することで、TXがそのブロックにあるかどうかを検証できる。
Timestamp(タイムスタンプ)
中央集権的なタイムスタンプ:事業者が管理
ブロックチェーンのタイムスタンプ:現実世界のタイムスタンプも記録されるが正確さは求められない。ブロックをチェーンでつなげているためそれがタイムスタンプとして機能する。
※「bits」がマイニングの難易度との記載があったが正しかったのか・・・Difficultyの方が正しそうなのでDiffifultyで統一。
Difficulty(難易度)
マインニングの難易度。
Nonce(ナンス)
PoWによって求められる値。
※SPVノード
ブロックヘッダ情報だけを持つノード。モバイルで利用するようなウォレットに多い。
TX(トランザクション)の詳細
1つのTXには複数のInputとOutputを含めることが可能で、Inputの合計値≧Outputの合計値となっていいて、差額はマイナーが受け取る手数料となる。
手数料がゼロの場合、ブロックに取り込まれない。Inputの合計値が多い場合は、お釣りとして自分宛のOutputを作らないと全てがマイナーの手数料になってしまう。
Version(バージョン情報)
TXのルールセット。
Input(インプット)
・トランザクション内のインプット数
・使用するUTXOが含まれるTXのID
・使用するUTXOのインデックス
・ScriptSig(送信者の秘密鍵による署名値:解除条件/送信者の公開鍵
→「UnlockingScript」とも呼ばれる。
Output(アウトプット)
・トランザクション内のアウトプット数
・各アドレスへの送金額
・ScriptPubKey(受信者のアドレス/受信者の公開鍵ハッシュ)
→「LockingScript」とも呼ばれる。
GenerationTX
マイナーに支払われる成功報酬。Script部がCoinbase Dataとなっている。コインベーストランザクションとも言われる。
送金
OutputはScriptでLockされている。送金するためにはUTXOを集めてUnlockして、Inputとする。Outputは送金相手の公開鍵を使ってLockする。TXを送信する場合は電子署名を利用してなりすまし対策をする。
ウォレット
Bitcoinは残高がない。ウォレットによって表現される。
スクリプト言語
スタック構造をベースとして順番に処理される。Opcodeが利用される。P2PKHなど。マルチシグも導入可能。スクリプトは価値の所有権移転に関わる重要なものなので不具合があるとロックが解除できず、2度と使えなくなるので、「テストネット」という開発用のブロックチェーンで確認することが推奨されている。
送金以外にも利用可能。OP_RETURNというスクリプトを使うことで80バイトまでなら関係ないデータをアウトプットに記録可能。Bitcoinは複雑な処理ができないので、Ethereumなどのブロックチェーンを使うべき。
UTXO(Unspent Transaction Output)
未使用のOutputのことで、Bitcoinでの残高を表すもの。
デジタル通貨の管理方法
・残高管理
→Ethereum
・トランザクションのIN/OUT管理(残高は計算にて求められる)=UTXO
→Bitcoin、Corda
UTXO は分割不可能なため、利用したい額より大きなUTXO を持っている場合は、自分宛のOutput を作る必要がある。
※ただし、厳密にはInput/Outputの合計値は一致しない。Input/Outputの差額はPoWのマイナーへの手数料として支払われる。Generationトランザクションを作る際に、マイニング報酬と手数料を自分宛のアウトプットの含めている。
手数料が少ないとマイナーのモチベーションにつながらないため、TXが取り込まれない。
二重支払の問題解決
従来の非中央集権型ネットワークでは、二重支払のような不正を防止する管理者がいないため、経済活動を成立させるのは難しいとされてきた。
・UTXO
・PoW
・最長チェーンを正当とみなす
・ブロックチェーンが公開されている
ことによりそれを解決することが可能となっている。