Skip to main content

椭圆曲线可验证随机函数

可验证随机函数(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!