検証ラボ
「変えると、どこに表れる?」自分で文字を書き換えて、ハッシュとブロックのつながりを確かめます。
入力はこのブラウザ内だけで計算し、保存・送信しません。秘密鍵や個人情報は入力しないでください。
1文字変えると、結果はどうなる?
ハッシュは、入力から計算する固定長の値です。ここでは文字列をUTF-8のバイト列にして、SHA-256を1回計算します。同じ入力なら、結果はいつも同じです。
比較元の入力
Bitcoin
SHA-256(16進数64桁)
b4056df6691f8dc72e56302ddad345d65fead3ead9299609a826e2344eb63aa4まず「Bitcoin」の B を小文字にしてみましょう。空白や改行も計算に含まれます。
SHA-256(16進数64桁)
b4056df6691f8dc72e56302ddad345d65fead3ead9299609a826e2344eb63aa4比較元と同じ入力なので、64桁すべてが一致しています。
前の記録を書き換えると、鎖はどうなる?
各ブロックは「文字列」と「前のブロックのハッシュ」を材料に、別のハッシュを作ります。A を A! に変えて検証すると、次のブロックに残る参照との違いを見つけられます。
参照はすべて一致しています。これは、このモデル内のつながりだけの確認です。
ブロック 1
- 保存されている前のハッシュ
0000000000000000000000000000000000000000000000000000000000000000- このブロックの計算結果
ee5a56d8291207c6c21ed6c7c9694e41651c023232bc60f654c0d77fb7fc1c29
先頭用の固定値(ゼロ64桁)
ブロック 2
- 保存されている前のハッシュ
ee5a56d8291207c6c21ed6c7c9694e41651c023232bc60f654c0d77fb7fc1c29- このブロックの計算結果
de67a93b548c3f86e4e95b627a30564175b88029bc559b2a3be4431f696a6ce4
前のブロックと一致
ブロック 3
- 保存されている前のハッシュ
de67a93b548c3f86e4e95b627a30564175b88029bc559b2a3be4431f696a6ce4- このブロックの計算結果
4ad350a24c372cc409a376695831cd39f27428c1416e8949d21256ad08b46ad9
前のブロックと一致
末尾の記録には、まだそれを参照する後続ブロックがありません。末尾だけを変えるとハッシュは変わりますが、この鎖の中では参照の不一致は起きません。
このモデルの計算方法を見る
各ハッシュは、次のJSON配列のUTF-8表現に対する1回のSHA-256です。区切りを曖昧にしないためJSONを使い、先頭の参照にはゼロ64桁を置きます。Bitcoinのブロック形式ではありません。
["bitcoin-library-lab-v1", previousHash, text]ここで分かること。まだ分からないこと。
ハッシュをつなぐと、過去の変更が後続の参照に表れます。でも「参照が一致する」ことと「正しい履歴として受け入れられる」ことは別です。
- 再現していること
- SHA-256の実計算と、前のハッシュを含めた参照のつながりだけです。ハッシュは暗号化や電子署名ではありません。
- 省いていること
- Bitcoinの80バイトのブロックヘッダー、二重SHA-256、取引とMerkle tree、電子署名、Proof of Work、ノードの検証と合意は再現していません。
- Bitcoinで必要なこと
- 実際のノードは取引やブロックのルールを検証します。過去のブロックを置き換えるには、後続も含むProof of Workをやり直し、競合する有効な鎖との累積作業量の競争が必要です。
仕組みを本文と原資料で深める
この実験の根拠
- Bitcoin whitepaper — §§3–5
前のハッシュを含む鎖、Proof of Work、ノードによる取引検証の原提案。
- Bitcoin Developer Reference — Block Headers
80バイトのヘッダーと、前ブロックを二重SHA-256で参照する形式。
- MDN — SubtleCrypto.digest()
ブラウザでのSHA-256計算、UTF-8入力と安全なコンテキストの要件。