導入
「時計」と聞くと振り子や水晶発振子を思い浮かべますが、Solana は計算そのものを時計として使います。ある計算を一定回数繰り返すのに必要な時間は、どんなに高性能なコンピュータを使っても短縮できない ―― この性質を利用したのが Proof of History です。
説明
Proof of History(PoH)は、検証可能な遅延関数(VDF: Verifiable Delay Function)の一種です。難しい名前ですが、やっていることは次の2つだけです。
- ハッシュ関数(SHA-256)を、前回の出力を次の入力として使いながら、何万回も逐次的に繰り返す。
- その結果の連鎖(どの入力からどの出力が得られたか)を記録として残す。
flowchart LR
H0["h0(初期値)"] --> F1["SHA-256"] --> H1["h1"]
H1 --> F2["SHA-256"] --> H2["h2"]
H2 --> F3["SHA-256"] --> H3["h3"]
H3 --> DOTS["… これを何万回も連鎖 …"] --> HN["hN"]
ここで重要なのは、この連鎖は逐次的にしか計算できないという点です。h2 を計算するには、その材料である h1 が先に手元になければなりません。h1 を飛ばして h2 だけを先回りして計算したり、複数のコンピュータで手分けして並列に計算を進めたりすることができません(ハッシュ関数の入力が「直前の出力そのもの」だからです)。
この「先回りできない・並列化できない」という性質が、そのまま時計として機能します。h0 から hN まで計算できたという事実は、「SHA-256 を N 回計算するのに必要なだけの時間が、確かに経過した」ことの動かぬ証拠になるからです。どんなに計算資源を積んでも、この連鎖だけは近道できません。
一方で、この連鎖が正しいかどうかを確かめる(検証する)作業は、並列に高速化できます。h1→h2 が正しいか、h5→h6 が正しいかは、それぞれ独立に別のCPUコアで確認できるからです。「作るのは遅い(逐次)が、確かめるのは速い(並列)」という非対称性が、PoH を実用的な時計にしています。
演習
「連鎖を作るのは遅くしか進められないのに、検証は並列で速くできる」というのは、一見矛盾しているように感じるかもしれません。なぜ両立するのか、h1→h2 の計算に何が必要かを思い出しながら整理してみましょう。
ヒント1を見る
連鎖を「作る」ときは、次の一歩を踏み出すのに必ず直前の結果が要ります。だから1歩ずつしか進めません。
ヒント2を見る
連鎖が「正しいか確かめる」だけなら、すでに全ステップの入出力の組が手元にあります。組ごとにバラバラに再計算して見比べるだけなので、同時並行でできます。