Chainlink可验证随机函数详解

我们正式宣布上线Chainlink可验证随机函数(下文称Chainlink VRF),开发者可以用这个工具生成随机数,并在链上进行验证。Chainlink VRF将为众多优秀的智能合约项目带来巨大价值,尤其能证明智能合约使用的随机数不可被篡改和操控。

我们想要感谢与我们紧密合作的学术界专家和开发者社区,不断向我们反馈他们对Chainlink VRF的想法和建议。与此同时,我们还要感谢为初步实现VRF功能付出了精力和汗水的团队成员!

Chainlink VRF有助于加速区块链游戏、安全和layer2协议等众多领域的智能合约开发进程。开发者可以轻松集成Chainlink VRF,参考我们近期发布的开发者文档,在智能合约中使用可验证的随机数。

可验证随机数具有哪些价值

要开发安全的智能合约,并规避合约资金被盗风险,开发者必须在安全方面下大功夫。如果随机数是智能合约依赖的关键数据,那么开发者就自然会期望合约所有相关方都拥有同等的不确定性,并降低因某一方成功预测结果而钻空子的风险。

Chainlink VRF可以为智能合约提供随机数以及加密证明,在链上验证随机数具有不可预测性,因而可以满足上述两个要求。由于Chainlink VRF的随机数可以在链上进行验证,所以问题节点只能选择不对请求做响应,在Chainlink即将上线的staking机制下,这样的行为会遭到罚款,之后还可能会被移除出随机数生成者名单,因此会遭受经济损失。

开发者可以使用Chainlink VRF开发出基于随机数的可靠智能合约应用:

● 为游戏提供随机数,数据可在链上验证,提升游戏的可信度,并向对安全比较敏感的用户提供额外的保障。

● 为游戏带来更多挑战性和不确定性,比如随机向玩家提供奖励(如:loot drops)。

● 随机分配任务和资源,并保障可验证性,如:向案子随机分配法官,或向公司随机分配审计人员。

● 选择观察员代表投票决议智能合约提案,并达成共识(调查是实现额外抗女巫攻击能力的有效方法)

现有方法存在的安全隐患

Chainlink VRF的可验证随机数可以将现有随机数生成法存在的诸多限制一一攻克。使用区块哈希值等链上数据或将链下生成的随机数传输至链上,这两种方法都存在一定自身缺陷。

开发者应该尽量避免过度依赖基于区块哈希值产生随机数。假设一个智能合约基于某一高度的区块哈希值最后一位数的奇偶性判定结果。这样看似好像概率是50/50,但假设有一名矿工(或矿工联盟)产量占区块总量的三分之一,现在这名矿工决定把区块哈希值最后一位数是1的优胜区块全部扔掉,并放弃大约2-3个以太币的区块奖励。这样一来,这名矿工就能够将结果是0的概率从50%提升至2/3,导致所有依赖这个方法生成随机数的智能合约用户都会遭受损失。如果这样做可以为这名矿工带来12-18个以太币的额外收益,那么他的选择在经济上是合理的。因此,这个机制下的合约价值会有一定上限。

为了避免这样的问题,开发者已经转向链下解决方案,在链下生成随机数并传回至链上。然而,如果无法通过加密手段验证链下随机数,数据将有可能在链下生成和传输过程中被篡改。同样地,用户只能闭着眼睛相信链下生成的随机数是公正可靠的,并相信这些数据在传输的过程中没有被篡改过。

区块链开发者在为智能合约提供随机数的过程中还需规避以下关键痛点和安全风险:

● 智能合约无法访问或无法兼容

● 中心化的随机数生成者操纵数据

● 区块链上的矿工作为用户进行操纵以谋取私利

● 终端用户需要盲目相信应用的安全可靠性

为了解决上述问题以及其他安全风险,Chainlink VRF使随机数生成过程变得安全透明,并通过加密技术证明了每个结果的公正和公平性。

Chainlink VRF
Chainlink VRF工作原理

简而言之,智能合约会向Chainlink或Chainlink预言机网络提供一个seed来请求随机数。这个seed是预言机无法预测的,会被用来生成一个随机数。每个预言机都会使用自己专属的密钥生成随机数。当结果和证明在链上发布后,可以使用预言机的公钥和智能合约的seed进行验证。这个方法利用了区块链著名的签名验证功能,合约只能使用在同一区块链环境中被验证通过的随机数。

使用Chainlink VRF工具最大的好处就是随机数是可以验证的。即使某一节点被攻陷,该节点也无法操控或影响最终结果,因为它无法通过链上的加密验证。最糟糕的情况无非是沦陷的节点不对请求做出任何响应,而这将立刻被区块链记录下来,并且会被永远保存在链上。用户可以参考有效的证明,不再使用有过无法响应或无法提供有效签名记录的节点。即使节点被操控,最终生成的随机数也不会受影响。沦陷的节点只能选择不响应请求,而在Chainlink即将上线的staking机制下,这种行为将被罚款,而且问题节点之后会从随机数生成者名单中被移除。因此,低质量或违规的节点将遭受巨大的短期和长期经济损失。简而言之,Chainlink VRF只要正确接入,就绝对无法被操控,唯一可能发生的就是问题节点下线或不响应,之后被彻底移除出去。这个机制为智能合约开发者和用户提供了极大的安全保障。

Chainlink VRF还有一个优势,那就是随着使用人数不断增加,用户支付给节点操作者的费用也会相应上涨,因此节点会更有动力提供尽可能多的安全保障。之后,用户可能会要求通过staking的方式进行加密安全保障,付更多费用获得额外的安全性。这样一来,用户付费就会形成一个全球共享资源池,本来需要花钱自主开发RNG(注:随机数生成器)解决方案的用户会将这笔钱用于提升整个区块链生态圈共享资源的安全水平。Chainlink现已接入Polkadot、Tezos等多条区块链,这意味着Chainlink生态圈用户将形成网络效应,持续扩大,用户数量和加密安全水平也将形成一个相辅相成的良性循环。

集成案例详解:PoolTogether

PoolTogether是以太坊上的一个保本型储蓄彩票游戏,我们认为这是一个非常新颖有趣的概念。PoolTogether团队在开展了广泛技术调研后,决定使用Chainlink VRF为其应用提供可验证的随机数

PoolTogether and Chainlink
PoolTogether是如何使用Chainlink可验证随机数的

PoolTogether是一个保本型储蓄游戏,将用户存款集中在一起,每天或每周进行一次抽奖,将存款利息当作奖金发放给中奖者。这个游戏通过彩票机制激励用户的储蓄行为。

PoolTogether使用Chainlink VRF生成可验证的随机数,可向其用户证明每期中奖者是由完全随机的数字选出来的。这样做除了为了保障自身安全以外,还可以向用户证明其关键环节的安全性是有迹可循的,且随机数生成过程是可以验证的。这样一来,用户就更有信心参与到智能合约中,相信他们享受着同样的中奖概率。

技术详解

Chainlink VRF是Goldberg可验证随机函数(VRF)的实现,具体细节请参考这篇论文。“可验证随机函数”中的“随机”指“任何没有seed或密钥的人都完全无法预测(即概率均匀分布)”。

VRF私钥是预言机以加密的方式在均匀分布的{0, …, #secp256k1-1} 中挑选出的一个数字(注:secp256k1是以太坊加密算法中的椭圆曲线)。与该私钥相对的有一个公钥,这个公钥对应着一个预言机。预言机将公钥与链上VRF和Chainlink job-ID绑定。

当智能合约请求随机数时,它会提供一个seed(种子)。为了确保VRF结果无法被预测,需要在seed中植入无法被预测且难以被篡改的值,比如最近一次的区块哈希值,或者是经过加密验证的链下数据,比如某项资产最近更新的价格。你可以将这些数据转换成bytes32,使用keccak256算法生成seed。链上VRF将智能合约seed与其他数据混合在一起,以避免重放攻击,为合约提供一些基本的保护,但除此之外,用户提供自己的seed是必不可少的。

一旦链上VRF确定了seed,就会在以太坊日志中进行广播,向智能合约要求的预言机请求相应VRF结果。预言机看到这条日志后会做出如下操作:

首先,它将seed和预言机公钥作为数据输入, “对输入取哈希值作为曲线方程输入”,从secp256k1获得安全加密的随机样本。方法是使用keccak256算法,用递归法对数据取哈希值,直到输出位于secp256k1算法的有限域(basefield)内(即secp2561算法中描述的p值),并且是secp256k1曲线上某一点(x,y)的x坐标(比如曲线y^2 =x^3 +7 在basefield中的坐标 )。因此(x,y)是对输入取哈希得出的结果。

接着,将secp256k1曲线的(x,y)坐标乘以私钥,得出Ɣ点。用keccak256算法取Ɣ哈希值,以uint256格式作为VRF的输出结果。它会生成一个证明,证明Ɣ除以(x,y)的结果等于预言机公钥除以secp256k1基点的结果。这个证明方式与Schnorr签名很接近:首先,他从{0, …, #secp256k1-1}中随机安全地取出一个nonce,这与私钥生成的方式很像。然后,计算公式u=n×g,其中g为secp256k1基点,取u的以太坊地址。然后计算公式v=n×(x,y)。接着,将(x,y)、VRF公钥、Ɣ、u的地址以及v合并取哈希, 并将哈希与#secp256k1取模运算的结果称为c。最后,计算s=n-c×k mod #secp256k1, k为VRF私钥。因此证明包含公钥、Ɣ、c、s以及seed。然后将结果发回至链上VRF,验证证明,如果验证通过,则将数据返回至智能合约。

为了验证证明,合约应做到以下几点:

  • 检查公钥和Ɣ是否是secp256k1曲线上有效的点
  • 验证c×pk+s×g点的地址是否与u的地址一致(注:其中pk指代预言机公钥)
  • 用公钥和seed取哈希作为曲线方程的输入,检查 c×Ɣ+s×(x,y)的keccak256哈希值是否等于c。

若有兴趣直观了解此方案的加密安全逻辑,请参考Jimmy Song的《Programming Bitcoin》一书中第三章“签名和验证”中关于“箭头”的类比。我们在此希望实现的特殊“目标”是c。若想完整了解此方案的安全证明机制,请参考Making NSEC5 Practical for DNSSEC的附件B。

然而,用secp256k1做标量乘法(比如c×Ɣ),在以太坊虚拟机上直接运算的成本极其高昂。因此为了提高效率,我们借鉴了Vitalik的方法将一个证人传入证明,验证证人的c×Ɣ运算结果是否与实际相等。这样一来,我们就能把c×Ɣ的运算工作转移到链下,只需验证链下运算结果是否与实际相等即可,这样就可以大幅降低运算成本。

因此,除了上述数据输入和步骤之外,链上验证还包括c×Ɣ以及s×(x,y)的证人。需要检查这些证人是否是secp256k1曲线上有效的点,并且用Vitalik的方法验证这些证人的运算结果是否与实际匹配。另外,u是以太坊上的地址表示的,同样也用Vitalik的方法验证u是否与c×pk+s×g点匹配。

Chainlink预言机网络中包含一千多个优质节点,使用门限签名技术,网络具有高度扩展性,并以高成本效益的方式实现去中心化。这将为Chainlink VRF带来极高的去中心化水平和可用性。我们将两者合二为一,既利用Chainlink VRF的独特优势为链上提供可验证随机数,又利用Chainlink网络中几千个节点实现高成本效益和高可用性。

Chainlink Delivers Data to Smart Contracts
Chainlink以去中心化的方式实现可验证随机函数

Chainlink丰富的生态系统一旦加入Chainlink VRF,我们就能建立遍布全球的分布式节点网络,在经济激励的驱动下在链上生成并广播可验证的随机数。Chainlink门限签名技术与高度去中心化的节点网络相结合,将有效规避用户资金被盗风险。不仅Chainlink VRF端反馈的数据能在链上得到验证,还能保证极高的可用性。目前Chainlink已接入多条可能需要可验证随机数的区块链,再加上虚拟货币经济的激励机制,Chainlink VRF很有可能成为智能合约使用随机数的新标准。

除了上述优势之外,我们目前正在完善Chainlink VRF的功能,研发去中心化的随机数生成技术,并积极与其他RNG(注:随机数生成器)系统开展合作。根据我们的初步研究,我们相信Chainlink VRF能与VDF以及其他随机数生成法在链上和链下结合使用。我们很高兴能够跟区块链圈和学术圈通力合作,共同推动智能合约可验证随机数生成技术向前发展。

如果你是一名智能合约开发者,并希望了解如何使用Chainlink VRF的初始版本,请访问开发者文档,在测试网上开始使用,并加入我们的Discord技术讨论。

我们目前处于Chainlink VRF安全评估的最后阶段,并希望与开发者社区和学术界的用户交流反馈。如果你对VRF及其完善方案有任何意见或建议,欢迎发邮件至[email protected]告诉我们。

如果你热衷于开发安全可靠的智能合约并解决现实世界的问题,欢迎现在就加入我们的核心团队!详情请关注我们官网的招聘页面。

如果想要了解更多关于Chainlink的资讯,请访问Chainlink官网,或在Twitter或Reddit上关注我们。

Need Integration Support?
Talk to an expert
Faucets
Get testnet tokens
Read the Docs
Technical documentation