Blockchain Basics - 中央管理者なしで同じ履歴を共有する
ブロックチェーンは、取引の履歴を参加者がそれぞれ複製して持ち、新しい取引をまとめた塊を順に繋いで追記していくデータの持ち方です。まとめた塊をブロックと呼び、ブロックの列がチェーンになります。Bitcoin は、この持ち方で送金の履歴を共有します。 ...
ブロックチェーンは、取引の履歴を参加者がそれぞれ複製して持ち、新しい取引をまとめた塊を順に繋いで追記していくデータの持ち方です。まとめた塊をブロックと呼び、ブロックの列がチェーンになります。Bitcoin は、この持ち方で送金の履歴を共有します。 ...
Bitcoin の送金は、ウォレット(鍵を管理し、取引を組み立てるソフトウェア)が取引を作り、ネットワークに流し、マイナーがブロックに取り込むまでの段階を通ります。取引が共有された履歴の中に位置を持つのは最後の段階で、送信した時点ではまだどこにも記録されていません。以下では、Alice が Bob に 0.1 BTC(BTC は Bitcoin の通貨単位)を送る 1 件の取引で、作成からブロックへの取り込みまでを順に追います。 ...
ハッシュ関数は、任意の長さのデータを固定長の値に変換する関数です。変換後の値をハッシュ値と呼びます。ここで扱うのは、その中でも改竄の検出に耐える性質を持つ暗号学的ハッシュ関数で、通信のエラー検出だけを目的とした関数(CRC、Cyclic Redundancy Check など)は対象外です。SHA-256 の内部の計算手順も扱いません。 ...
デジタル署名は、秘密鍵の持ち主だけが作れて、対になる公開鍵を持つ誰もが検証できるデータです。メッセージに署名を添えると、受け取った側は「秘密鍵の持ち主がこのメッセージを承認した事」と「メッセージが署名の後に書き換えられていない事」を確かめられます。ここで説明するのは、署名の役割と使われ方です。楕円曲線の数学的な計算手順には踏み込みません。 ...
UTXO(Unspent Transaction Output、未使用の取引出力)は、取引の出力(金額と使う条件が書かれた、コインの置き場)のうち、まだ別の取引に消費されていない物です。Bitcoin には口座という仕組みも、残高という 1 つの値を直接更新する場所もありません。支払いは、過去の取引が作った出力を丸ごと消費し、新しい出力を作る事で表されます。まだ消費されていない出力を集めた物は、UTXO 集合(UTXO set)と呼ばれます。 ...
Bitcoin Script は、取引の出力に「使う条件」を書くための小さなプログラミング言語です。UTXO のノートで「出力には金額と使う条件が書かれる」とだけ述べ、条件式の書き方は扱わずにいました。その中身がこの言語です。ここでは代表的な条件である P2PKH(Pay to Public Key Hash)を軸に実行の仕組みを説明し、命令(opcode)の全一覧や、手数料・サイズの上限の規則は扱いません。 ...
Bitcoin のブロックは、発生した取引をまとめて 1 つに束ね、直前のブロックへの参照でチェーン状に繋いだデータの単位です。ブロックの列がブロックチェーンで、Bitcoin の参加者はこの列を送金の履歴として共有するよう動きます。 ...
Merkle Tree(マークルツリー、ハッシュ木)は、データの並びを 2 つずつハッシュ関数で畳み込み、最後に 1 つの値にまとめる木構造です。まとまった 1 つの値をルートハッシュと呼びます。全件を持つ側は、データ 1 件と少数のハッシュだけを渡して、その 1 件が並びに確かに含まれていた事を相手に検証させられます。 ...
Bitcoin は、ブロックに入った取引(transaction、以下の図では Tx と略します)の並びを Merkle Tree で 1 つのルートハッシュに畳み込み、80 バイトのブロックヘッダに収めています。ここでは、Bitcoin が何を葉にして木を組み立てているのか、その木で取引の包含をどう検証するのかを説明します。 ...
Merkle Tree の構築方法は 1 通りに決まっていません。奇数の葉をどう組むか、葉と内部ノードをどうハッシュするか、葉をどう並べるかは、それぞれのプロトコルが決める設計事項です。ルートハッシュが何を保証しているのかは、この規則を決めて初めて確定します。 ...
proof of work(作業証明)は、条件を満たすハッシュ値の提示を参加者に課す仕組みで、その値を見付けるには平均すると大量のハッシュ計算が必要です。作る側は合格が出るまで試行を繰り返す一方、入力とハッシュ値の組を受け取った側は、同じ入力に同じハッシュ計算を 1 度やり直すだけで、条件の成立を確かめられます。 ...
mempool(memory pool)は、まだブロックに入っていない取引をノードが一時的に置いておく場所です。ノードは受け取った取引を検証してから mempool に入れ、隣のノードに中継します。ブロックを作る参加者は、この置き場から取り込む取引を選びます。 ...
アカウントモデル(account model)は、アドレスごとに残高などの状態を保存し、取引がその状態を書き換える形で送金を表すモデルです。Ethereum が採用しています。UTXO で説明した Bitcoin の表し方には残高という保存された値が無く、コインは使い切りの出力として存在します。同じ送金でも、アカウントモデルは保存された数値を書き換え、UTXO モデルは出力を作り直します。 ...
取引(transaction)は、EOA(Externally Owned Account、外部所有アカウント)が秘密鍵で署名した指示のデータです。公式ドキュメントも、取引をアカウントからの、暗号で署名された指示だと定義しています。送金も、コントラクトの呼び出しも、コントラクトの作成も、この 1 つの形で表されます。 ...