椭圆曲线可验证随机函数
可验证随机函数(VRF)是一种密码原语,使你能够生成一个随机数并提供证明该数字是使用秘密密钥生成的。任何人都可以使用与秘密密钥对应的公钥验证证明,因此你可以将其用作生成任何人都可以验证的输出的随机数生成器(RNG)。在链上需要可验证的随机性的应用程序也可以从其使用中受益。
VRF 构造
在 Sui 中 Move API 中使用的 VRF 是椭圆曲线 VRF(ECVRF),遵循 CFRG VRF 草案规范版本 15。它使用 Ristretto255 椭圆曲线群构造和 SHA-512 散列函数。nonce 根据 RFC6979 生成。
任何按照带有套件字符串 sui_vrf
的相同规范实现(请参见 VRF 规范 中的第 5 节)都可以用于计算 VRF 输出和生成证明。
fastcrypto 库提供了一个 CLI 工具,用于这样的实现,并在以下示例中使用。
生成密钥
从 fastcrypto
存储库的根目录运行以下命令以生成密钥对:
cargo run --bin ecvrf-cli keygen
这会以十六进制格式输出一个秘密密钥和一个公钥。秘密密钥和公钥都是 32 字节的字符串:
Secret key: c0cbc5bf0b2f992fe14fee0327463c7b03d14cbbcb38ce2584d95ee0c112b40b
Public key: 928744da5ffa614d65dd1d5659a8e9dd558e68f8565946ef3d54215d90cba015
计算 VRF 输出和证明
要为输入字符串 Hello, World!
(十六进制为 48656c6c6f2c20776f726c6421
)使用先前生成的密钥对计算 VRF 输出和证明,请运行以下命令:
cargo run --bin ecvrf-cli prove --input 48656c6c6f2c20776f726c6421 --secret-key c0cbc5bf0b2f992fe14fee0327463c7b03d14cbbcb38ce2584d95ee0c112b40b
这将输出 80 字节的证明和 64 字节的 VRF 输出,两者都以十六进制格式:
Proof: 18ccf8bf316f00b387fc6e7b26f2d3ddadbf5e9c66d3a30986f12b208108551f9c6da87793a857d79261338a50430074b1dbc7f8f05e492149c51313381248b4229ebdda367146dbbbf95809c7fb330d
Output: 2b7e45821d80567761e8bb3fc519efe5ad80cdb4423227289f960319bbcf6eea1aef30c023617d73f589f98272b87563c6669f82b51dafbeb5b9cf3b17c73437
验证证明
你可以在智能合约中使用 Sui Move 框架的 sui::ecvrf::ecvrf_verify
来验证证明和输出:
module math::ecvrf_test {
use sui::ecvrf;
use sui::event;
/// Event on whether the output is verified
struct VerifiedEvent has copy, drop {
is_verified: bool,
}
public fun verify_ecvrf_output(output: vector<u8>, alpha_string: vector<u8>, public_key: vector<u8>, proof: vector<u8>) {
event::emit(VerifiedEvent {is_verified: ecvrf::ecvrf_verify(&output, &alpha_string, &public_key, &proof)});
}
}
你还可以使用 CLI 工具进行验证:
cargo run --bin ecvrf-cli verify --output 2b7e45821d80567761e8bb3fc519efe5ad80cdb4423227289f960319bbcf6eea1aef30c023617d73f589f98272b87563c6669f82b51dafbeb5b9cf3b17c73437 --proof 18ccf8bf316f00b387fc6e7b26f2d3ddadbf5e9c66d3a30986f12b208108551f9c6da87793a857d79261338a50430074b1dbc7f8f05e492149c51313381248b4229ebdda367146dbbbf95809c7fb330d --input 48656c6c6f2c20776f726c6421 --public-key 928744da5ffa614d65dd1d5659a8e9dd558e68f8565946ef3d54215d90cba015
前述命令返回验证结果:
Proof verified correctly!