abp 上如何使用getstoredproccommand_如何使用Chainlink VRF在以太坊上生成随机数

随机数和区块链一直很难达到“一致”(译者注:区块链要求确定性,而随机数正相反)。到目前为止,区块链上还没有可验证的随机函数。

原因是:交易被旷工出块后,需要网络上的多个节点来确认才算真实有效。就要求每个节点验证时都必须得出相同的结果。如果函数是随机的(每次运行的结果不一样),则每个节点将得出不同的结果,从而导致交易得不到确认。

有一些解决(变通)方法[1]可以生成一些 伪随机生成[2],但到目前为止,已有的方法都不算是真正的随机,或存在操控的可能。

登链社区之前也有一篇译文:区块链上生成随机数[3] 大家可以读一读。

关于 chainlink

Chainlink网络可以为任何区块链上的复杂智能合约提供可靠的防篡改输入和输出。—来自 chain.link 官网的介绍

区块链和智能合约针对一组不可变的规则执行计算是个很棒的平台。问题是规则只能应用于系统内部的数据。而如果要从系统外部获取可验证的数据则非常困难。

Chainlink想要通过提供去中心化的预言机[4]来解决这个问题,使区块链能够通过Chainlink访问生态系统之外的数据。预言机(Oracles)实质上是区块链和外部世界之间的桥梁。

真正的随机

在最近的一篇文章中,Chainlink宣布发布了其新的可验证随机函数(VRF)[5]。开发者现在可以使用该功能将其集成到多个测试网上的DApp中,从而使智能合约能够获得可在链上验证的随机数。

可验证随机函数是怎么实现的?

如果你想在Javascript中生成一个随机数,代码非常简单:

Math.random();

每执行一次,生成一个随机数。然而这不是VRF的工作方式。与Javascript不同,VRF是在一些交易实现的。

以下是 VRF 事件发生的顺序:

1.你的智能合约通过交易向VRF请求一个随机数。2.VRF会生成该随机数字并进行验证。3.VRF准备响应1 的请求。4.VRF通过另一笔交易将随机数字发送回你的智能合约。

为了使第4步成功,你的合约需要实现一个确定的函数,以便VRF调用以返回结果。如何在项目中实现呢?

如何实现随机性

让我们创建一个名为RandomGenerator的新合约,在合约里我们将调用VRF并接收结果。

第 1 步: 创建消费者合约

我们将引入 Chainlink提供的VRFConsumerBase的合约,这是一个抽象合约,它定义了一个获取和消耗VRF的最少实现(后面也会列出VRFConsumerBase的代码),我们定义“ RandomGenerator.sol”文件开头像这样:

pragma solidity ^0.6.2;import "https://raw.githubusercontent.com/smartcontractkit/chainlink/develop/evm-contracts/src/v0.6/VRFConsumerBase.sol";contract RandomGenerator is VRFConsumerBase {
    
        constructor(address _vrfCoordinator, address _link) VRFConsumerBase(_vrfCoordinator, _link) public {
    
        }}

VRFConsumerBase的合约的源码如下:

你可能感兴趣的:(abp)