手把手教你如何使用Chainlink闹钟在链上发起投票

2020-10-23 10:43 栏目:经验之谈 来源:网络整理 查看()

Ethereum中的很多智能契约需要通过一个外部定时器触发才能在链上执行,所以dApp在链上发起投票时会遇到问题,因为投票通常是有时间窗的。由于Solidity中没有计时器,智能契约的投票机制需要访问外部工具来启动或关闭投票窗口。事实上,在传统系统中,定时功能并不难实现。系统可以设置NTP时间与操作系统时间同步,或者使用物理时钟或定时器计时,甚至使用睡眠表达式将代码暂停一段时间。实度智能契约中的事件由离线交易触发,这意味着区块链如以太网需要访问离线闹钟触发事件或调用函数。好消息是,开发人员可以使用Chaink节点作为闹钟来可靠地触发智能合同执行。

手把手教你如何使用Chainlink闹钟在链上发起投票

这篇文章将教你如何在dApp中轻松控制投票时间。现在,随着越来越多的dApp走DAO路线,把更多的权力交给用户,这种投票机制变得越来越重要。具体步骤如下:

将链接功能包导入智能合同并继承它

格式化并提交链链接睡眠(“直到”)请求

将合同所有人设置为唯一有权发起投票的人

用简单的KYC确认每个地址只投票一次。

使用Getters功能查看投票状态

这个例子中使用的代码可以在GitHub中查看,也可以查看Remix,方便部署。

当然,这只是一个基本的例子。您可以使用链接“直到”来请求随时触发任何事件。这个例子只是一个初始框架,你可以在这个框架上开发其他需要时间控制的智能合同。

合同定义和构造函数:

import ' github.com/smart contract kit/chainlink/EVM-contracts/src/v 0.6/chainlink client . sol ';

合同链接时间注释是链接客户端

{

uint私有oraclePayment

私有oracle地址;

字节32私有作业标识;

uint私有yesCount

uint私有noCount

bool private votingLive

映射(address=bool)公共投票人;

//只有合同所有人才能开始投票

应付业主地址;

仅修饰符所有者{

require(msg . sender==owner);

_;

{}

constructor() public {

setpublicchanlinktoken();

owner=msg.sender

oraclePayment=0.1 * 10 * * 18//0.1链接

//Kovan报警神谕

Oracle=0x2f 90 a6 d 021 db 21e 1b 2a 077 C5 a 37 B3 c7e 75d 15 b 7e;

jobId=' a7ab 70d 561d 34 EB 49 e 9 b 1612 FD 2e 044 b ';

//初始化投票

yes count=0;

no count=0;

votingLive=false

{}

导入链接客户端,并使用关键字“是”来继承,然后您可以轻松地从链接节点请求数据。然后,我们需要定义几个全局变量,包括定时器预测器的地址,可以在链接页面上查看。

此外,我们需要一个作业规范标识和一些变量来跟踪投票,并将投票者地址映射为布尔值,以确认地址是否已经投票。最后,我们需要定义一个修饰符,规定只有合同拥有者才有权发送消息调用函数。然后在构造函数中初始化合同所有者地址和其他变量。注意:映射不需要初始化,布尔类型的默认值为false。

向链接发送开始投票的请求:

函数start投票(uint voteMinutes)public only owner {

链环。request memory req=buildChainlinkRequest(JobID,address(this),this . fulfill . selector);

req.addUint('直到',现在voteMinutes * 1分钟);

//启动投票窗口,然后提交$voteMinutes睡眠请求

votingLive=true

发送链接请求至(甲骨文、请求、甲骨文支付);

{}

//开始投票请求的回调

函数实现(字节32 _requestId)公共记录链链接实现(_requestId) {

//$voteMinutes分钟已过,停止投票

votingLive=false

{}

我们合同的第一个功能,开始投票,需要向链接发送请求。在这里,我们使用onlyOwner修饰符来确保只有合同所有者有投票权。

我们在文章《怎样将智能合约和API连接在一起》中提到,链接客户端契约导出了链接的数据结构。请求,可根据具体要求更改为不同格式。在示例中,我们在数据结构中添加了“直到”而不是“获取”请求。构造函数中定义的chaink节点的地址可以标识这个直到字符串,节点收到请求后会在指定时间内挂起任务管道(注意:指定时间指的是“voteMinutes”)。

在提交请求之前,我们需要将votingLive设置为true,即投票成功启动,投票功能将检查变量状态以允许或拒绝投票。然后我们可以提交请求,链链接节点将暂停任务管道。通过这种方式,我们可以在由直到请求结束所设置的时间之后调用Fulfillcallback函数。当完成函数被调用时,设置的投票时间已经结束,所以你可以将votingLive设置回false并关闭投票。综上所述,我们应该先创建一个“直到”的请求,其中包含指定的时间,并发送给某个节点,然后在节点在指定的时间内暂停后,调用fulfill函数。链环计时器/闹钟就这么简单!使用简单的votingLive布尔逻辑,我们可以在向chaink闹钟提交请求之前开始投票,并在暂停一段时间后调用回调函数时关闭投票。在这个例子中,我们只使用一个布尔标识符,但是您可以基于它开发其他延迟函数。

投票并检查投票状态:

//如果投票是实时的,则递增适当的投票计数器

功能投票(bool voteCast)公共{

require(!投票人[msg.sender],‘已经投票了!’);

//如果投票是实时的,而地址还没有投票,请点票

if(VOTEcast){ YesCount;{}

if(!voteCast){ no count;{}

//地址已投票,标记为已投票

选民[msg . sender]=true;

{}

//输出当前投票计数

函数getVotes()公共视图返回(uint yesVotes,uint noVotes) {

返回(是计数,否计数);

{}

//让用户知道他们的投票是否被计算在内

函数haveYouVoted()公共视图返回(bool) {

返回投票人[msg . sender];

{}

这里需要用能真正实现投票的逻辑。投票功能接受真/假参数,以检查用户是否已经投票。如果验证通过,则计算投票,并且对应于其映射中的地址的值被更新为真,指示他们已经投票。我们使用require表达式而不是if表达式来验证地址。这样,已经投票的交易将被拒绝。最后,因为Ethereum事务不会返回结果,所以我们添加了一些简单的视图函数来检查当前的投票数,并确认投票是否被计数。希望本文能让大家了解chaink在主网上的一个实用功能,为你的智能合同实现更大的价值。想了解Chainlink的其他功能,请关注Chainlink发布的可验证随机数生成工具Chainlink VRF,访问Chainlink定价机制开发dApp进行流动性挖掘,或者了解Chainlink预测器的最新研究成果。

微信二维码
售前客服二维码

文章均源于网络收集编辑侵删

提示:仅接受技术开发咨询!

郑重申明:资讯文章为网络收集整理,官方公告以外的资讯内容与本站无关!
NFT开发,NFT交易所开发,DAPP开发 Keywords: NFT开发 NFT交易所开发 DAPP开发