G.Maxwell が提唱した Graftroot の自分なりの理解メモ。
ビットコインで条件分岐のあるコントラクトを書く場合、条件分岐先の処理のうちいずれか一つしか実行されないので、実行されなかった処理まで含めた全プログラムをブロックチェーンに書き込むのは非常に非効率。
多くのコントラクトの場合、
if (正常な場合) then
<AliceとBobが両者とも電子署名すれば送金できる>
else /* 異常系処理 */
<一週間経ってAliceが応答しなかったらBobだけの電子署名で送金できる>
endif
のように「正常処理のマルチシグ + 異常系処理のコントラクト」といった組み合わせで構成されることが多い。
多くの場合、異常系処理は呼ばれないので、正常な場合は普通のマルチシグtxになって、異常な場合だけ複雑なスクリプトをブロックチェーンに書き込めば効率的。
そこで、ビットコインのコンセンサスルールをいじってあげて、異常系スクリプトと、そのスクリプトに対するAliceとBobによる電子署名があれば、そのスクリプトを実行できるようにしてあげる。
つまり、
ScriptPubKey = Pub_{Alice} Pub_{Bob} による電子署名
に対して、通常の場合には
ScriptSig = Sig_{Alice} Sig_{Bob}
でコインをredeemできるけど、異常発生時には
ScriptSig =
<S = 異常系スクリプト>
<AliceおよびBobによる、Sに対する電子署名>
というデータを与えればコインをredeemできるようにコンセンサスルールを変更してあげればいい。
電子署名はマルチシグを作ったときに予めAliceとBobで交換しておく。
こうすることで、Merkelized Abstract Syntax Tree (MAST) のような複雑なことをしなくても、いくつでも異常系スクリプトを仕込める(AliceとBobで異常系スクリプト S1, S2, ..., に対する電子署名を交換しておけばいい。Merkle Tree を使った commitment なんて不要)。
英語力ないんで、間違ってるかも。。。変なところがあったらTwitter等で教えてクレメンス。