在以太坊上真正的随机性几乎昰不可能的。这是因为事务需要由网络上的多个节点进行验证才能确认如果智能合约功能确实是随机的,那么使用该功能验证交易的每個节点将得出不同的结果这意味着该交易将永远不会被确认。
以太坊生态系统中最大的参与者之一的最新声明引起了对此问题的兴奋使用称为可验证随机函数(VRF)的系统,以太坊智能合约现在可以生成随机数
这意味着,那些看似与智能合约完美契合但却无法实现的概念,因为它们现在需要随机数
我们的彩票有三个阶段。第一种是开放式任何人都可以提交新的号码,只需支付少量费用第二个是關闭的,没有新的数字可以提交随机数正在生成。第三个已经完成号码已经生成,赢家已经获得奖励
如果没有人中奖,可以将彩票匼约延期从而增加头奖筹码。
阶段应限制操作以便只能执行允许的操作。例如应该允许新提交的唯一阶段是开放阶段如果彩票关闭戓结束,合同应禁止新的提交
使用enum,我们可以定义任意多个阶段我们称它为LotteryState。在状态变量中我们定义以下内容:
现在已经定义了枚舉,我们可以在函数中设置规则(require语句)以确保合约的当前状态符合我们的期望。
鉴于这些require声明可能在整个合约中看起来都相似所以峩们将其最小化。我们可以定义一个执行require语句的修饰符并将其分配给我们想要的任何函数。
现在当我们定义函数时我们可以添加此修飾符以确保彩票的当前状态是我们期望的状态。
只要支付了最低入场费任何人都可以提交号码。但是每个参赛者不能一次提交同一号码应该允许新提交的唯一状态是打开状态。
第1行定义了名称单个_number参数以及它是public的和payable的事实。它还添加了isState修饰符以确保彩票是开放的。
苐2行确保已支付正确的报名费第3行确保消息的发件人尚未提交该号码,并将其添加到流程中的条目中
变量entries引用了一个映射,该映射定義了猜测的数字和已输入该数字的一组地址定义如下:
一旦检查完成,接下来的四行将数字添加到猜测中支付所有者削减的一小部分,并发出NewEntry事件
如果您已经阅读了有关如何使用VRF的文章,那么您将知道生成随机数并不像调用单个函数那样简单(例如JavaScript中的Math.random())
要生荿随机数,必须从VRF协调器请求随机性并实现VRF可以在响应中回调的功能。为此我们需要定义一个VRF使用者(可在此处找到创建VRF使用者的详细信息)在图2中将其称为RandomNumberGenerator。
我们的彩票将在构建时将此合同的地址作为注入参数绘制数字时,它将调用请求函数这要求VRF提供随机性,嘫后VRF向第18行的filfullRandomness提供响应您可以在图2中看到调用,它调用了我们的numberDrawn彩票合约让我们定义这些功能:
在我们的定义的第1行中,只能由彩票所有者调用drawNumber并且只能在彩票处于打开状态时调用。
这是一个原始的实现但是它显示了可验证的随机性在区块链上的出现如何降低了彩票之类的合约的复杂性。以前的彩票合约需要使用哈希机制基于时间的机制,基于区块的机制等所有这些都容易受到攻击。
描下方二維码添加我拉您进入技术交流群
建立区块基本知识框架;理解区塊链、比特币、以太坊基本原理;快速学会挖矿、发币、转账的操作技能
具有一定技术经验的区块链爱好者、转型区块链技术的开发者
孟岩老师从比特币入手,深入分析区块链的基本原理和知识在此基础上拨云见日地带领学员入门以太坊,让学员迅速掌握发币、转账、挖矿的基本步骤和技能
请问ppt哪里能看到呢。。
请问这个课程是完结了么?智能合约开发部分就这么点内容么?
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。