symbol(catapult)におけるVRF(VerifiableRandomFunction)

catapult

symbol(catapult)におけるVRF(VerifiableRandomFunction)

symbolではブロック生成(ハーベスティング)の際にアカウントの管理に使われるキーペアとは別のキーペアを生成し、それによってブロック生成する。

symbolで新しく取り入れられたこのブロック生成の仕組みは、VRF (VerifiableRandomFunction) と呼ばれる仕組みを使っており、ブロック生成に使うキーペアを VRFキー と呼んでいたりする。

VRFキーペアのうち、公開鍵は専用のトランザクション(VrfKeyLinkTransaction)によってネットワークに通知し、それが周知される、つまり、ブロックにトランザクションが取り込まれた後にはじめてブロック生成を開始することが出来るようになる(ブロック生成用のキーペアが有効になる)。

何故こんなことをしているのか。それを説明するのがこの記事だが、結論から言うと 自分が今ブロック生成できる状態にあるか否かを他人に知られないようにするため に行っている。他にも副次的にメリットはあるのかもしれないが、メインはここだと思っている。

symbolにおいて、ブロック生成の成功不成功の判定にはブロックハッシュとは別のgeneration hashと呼ばれるハッシュ値が使われている。詳しいことは省略するがこの値をつかってくじ引きをするような仕組みになっている。

ブロック生成にVRFが導入される前、generation hashは “ハーベスターの公開鍵” と “一つ前のブロック高さのgeneration hash” によって計算されていた。これらは両方ともに公開されいる情報である。これは、今まさにある特定のアカウントがブロックを生成しようとしている(することが出来る)状態にあるかどうかを他人が知ることが出来てしまうことを意味する。そしてこれは、今まさにある特定のアカウントがブロックを生成しようとしているところを邪魔する(例えばノードを攻撃して)攻撃を生み出すことを意味する。

これを防ぐのがVRFのである。VRFでは、VRF秘密鍵と一つ前のgeneration hashによって次のブロックのgeneration hashを計算する。 VRF秘密鍵は自分の手元に隠して持っておくものなので、他人が知ることは出来ない。つまり、他人は自分が今まさにブロックを生成しようとしているか、また出来る状態に有るかどうかが分からない。しかし、これだと各々が適当に都合の良い値でgeneration hashの生成を行ってしまう。これだと仕組みが破綻するので VRF秘密鍵と一つ前のgeneration hashによって生成されった次のブロックのgeneration hashは、周知されているVRF公開鍵と証明用の付属データによってVRF秘密鍵から生成されたハッシュ値であることが確認出来るようになっている。

VRFの仕組みはこれ。元の論文の最初の一文にそれが書かれている。

A Verifiable Random Function (VRF) [MRV99] is the public-key version of a keyed cryptographic hash. Only the holder of the private VRF key can compute the hash, but anyone with corresponding public key can verify the correctness of the hash.

VRFは、公開鍵をキーとする暗号学的ハッシュ関数である。VRF秘密鍵を持つ者のみがハッシュ値を計算することが出来る一方で、 VRF公開鍵により誰でもそのハッシュ値が正当であることを(VRF公開鍵と関係する秘密鍵から生成されたハッシュ値であることを)検証することができる。
Verifiable Random Functions (VRFs) draft-irtf-cfrg-vrf-07 から引用

詳しい仕組みはまだ理解していない(今の所する予定もない)が、ざっくりとした理解は以下の図の通り。(見づらかったら画像だけ別ウィンドウで開いたりしてみてください)

draw1

これを、symbolのwhite paperのgeneration hash生成部分にあてはめてみると以下のようになる。
(正当なVRFの手順に沿って正しい各値の生成を行った時、VRF_hash(secret_key, input) = proof_to_hash(proof) となり、こっちを使っているので必要のない部分は上記図から削除している)

draw2

結論に戻るが、要は 自分がブロックを生成しようとしている(または出来る状態にある)と、攻撃の対象と鳴ってしまう可能性があるので、こっそりブロックを生成できるようにしている ということである。

参考

https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vrf-07
https://hazm.at/mox/security/vrf/ietf-draft4/index.html
https://docs.symbolplatform.com/catapult-whitepaper/main.pdf