Bitcoin

Graftrootメモ

More than 1 year has passed since last update.

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等で教えてクレメンス。