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

Chainlink生成随机数的方法一 随机数在软件设计中有很广泛的应用场景,尤其是在游戏中、菠菜、彩票等业务。但在区块链产生一个真正随机的数字确不容易,主要原因是区块链的共识机制需要所有节点达成一致,这使得智能合约中不可能存在真正随机的数字,否则各节点无法达成一致。本文主要介绍预言机生成随机数的原理,以及对比Chainlink生成随机数的两种方法。 阅读详情

在这里插入图片描述

以太坊上许多智能合约都需要通过外部计时器触发链上执行,因此dApp在链上发起投票时就会遇到问题,因为投票通常都有一个时间窗口。由于Solidity中没有计时器,因此智能合约的投票机制需要接入外部工具来启动或关闭投票窗口。

其实在传统系统中,计时功能并不难实现,系统可以设置NTP时间与操作系统时间同步,也可以用实物钟表或计时器计时,甚至还可以用sleep表达式在一段时间内暂停代码运行。Solidity智能合约中的事件由链下交易触发,也就是说以太坊等区块链需要接入链下闹钟触发事件或调用函数。而好消息是,开发者可以将Chainlink节点作为闹钟,可靠地触发智能合约执行。
本文将教大家如何在dApp中轻松实现投票时间控制。现在随着越来越多dApp开始走DAO路线,将更多权力交到用户手中,这种投票机制也变得愈发重要。具体步骤如下:

  • 将Chainlink功能包导入智能合约并继承
  • 格式化并提交Chainlink sleep(“until”)请求
  • 将合约所有者设置成唯一有权限发起投票的人
  • 使用简单的KYC确认每个地址只投一次票
  • 使用Getters函数查看投票状态

本示例中使用的代码可以在GitHub中查看,你还可以查看方便部署的Remix。

当然,这只是一个最基本的示例,你可以使用Chainlink“until”请求在任何时间点触发任何事件。这个示例只是一个初始框架,你可以在上面开发其他需要时间控制功能的智能合约。

合约定义和构造函数:

import "github.com/smartcontractkit/chainlink/evm-contracts/src/v0.6/ChainlinkClient.sol";

contract ChainlinkTimedVote is ChainlinkClient
{
  uint private oraclePayment;
  address private oracle;
  bytes32 private jobId;
  uint private yesCount;
  uint private noCount;
  bool private votingLive;
  mapping(address => bool) public voters;

  //only the contract owner should be able to start voting
  address payable owner;
  modifier onlyOwner {
  require(msg.sender == owner);
  _;
  }

  constructor() public {
      setPublicChainlinkToken();
      owner = msg.sender;
      oraclePayment = 0.1 * 10 ** 18; // 0.1 LINK
      //Kovan alarm oracle
      oracle = 0x2f90A6D021db21e1B2A077c5a37B3C7E75D15b7e; 
      jobId = "a7ab70d561d34eb49e9b1612fd2e044b";
      //initialize votes
      yesCount = 0;
      noCount = 0;
      votingLive = false;
  }

导入ChainlinkClient并使用“is”关键词继承,就可以轻松向Chainlink节点请求数据。然后,我们需要定义几个全局变量,其中包括计时器预言机的地址,地址可以在Chainlinks (测试网)页面上查看。

另外,我们还需要一个job spec ID和一些追踪投票的变量,并且将投票者地址mapping为一个布尔值,以确认地址是否投过票。最后,我们要定义一个修改器,规定只有合约所有者才有权限发送消息调用函数。然后在构造函数中将合约所有者地址以及其他变量一同初始化。注:mapping不需要初始化,布尔类型默认值是false。

向Chainlink发送请求,启动投票:

function startVote(uint voteMinutes) public onlyOwner {
      Chainlink.Request memory req = buildChainlinkRequest(jobId, address(this), this.fulfill.selector);
      req.addUint("until", now + voteMinutes * 1 minutes);
      //Start voting window then submit request to sleep for $voteMinutes
      votingLive = true;
      sendChainlinkRequestTo(oracle, req, oraclePayment);
  }

  //Callback for startVote request
  function fulfill(bytes32 _requestId) public recordChainlinkFulfillment(_requestId) {
      //$voteMinutes minutes have elapsed, stop voting
      votingLive = false;
  }

我们合约的第一个函数startVote就需要向Chainlink发起请求。在这里我们用到了onlyOwner修改器,确保只有合约所有者才有权限发起投票。

我们在《怎样将智能合约和API连接在一起》一文中提到,ChainlinkClient合约导出一个Chainlink.Request的数据结构,这个数据结构可以根据具体需求变成不同的格式。示例中,我们在数据结构中添加的不是“get”请求,而是“until”。我们在构造函数中定义的Chainlink节点地址可以识别这个until字符串,节点收到请求后会在规定时间内暂停任务流水线(task pipeline)(注:规定时间指“voteMinutes”分钟时间)。

在提交请求前,我们需要将votingLive设置成true,即成功开启投票,投票函数会查看变量状态以允许或拒绝投票。然后我们就可以提交请求了,这时Chainlink节点会暂停任务流水线。这样,我们就能在until请求设定的时间结束后调用fulfill回调函数。当调用fulfill函数时,设定的投票时间已经结束,因此就可以将votingLive设置回false,将投票关闭。

综上所述,我们要先创建一个“until”请求,请求中包含规定时间,并将其发送至某一节点,节点在规定时间内暂停后再调用fulfill函数。Chainlink计时器/闹钟实现起来就是这么简单!我们使用简单的votingLive布尔逻辑,就可以在向Chainlink闹钟提交请求之前启动投票,并在暂停了一段时间后回调函数被调用时关闭投票。在这个例子中我们仅仅使用了一个布尔标识符,但是你可以在其基础上开发出其他的延时功能。

进行投票并查看投票状态:

 //Increments appropriate vote counter if voting is live
  function vote(bool voteCast) public {
    require(!voters[msg.sender], "Already voted!");
    //if voting is live and address hasn't voted yet, count vote  
      if(voteCast) {yesCount++;}
      if(!voteCast) {noCount++;}
      //address has voted, mark them as such
      voters[msg.sender] = true;
   }
   
   //Outputs current vote counts
  function getVotes() public view returns (uint yesVotes, uint noVotes) {
      return(yesCount, noCount);
  }

  //Lets user know if their vote has been counted
  function haveYouVoted() public view returns (bool) {
      return voters[msg.sender];
  }

这里就需要用到真正能实现投票的逻辑了。投票函数接受一个true/false的参数来检验用户是否已经投过票,如果验证通过,则计算投票,并将他们mapping中地址对应的值更新为true,表示他们已经投过票了。我们使用require表达式而不是if表达式来验证地址。这样一来,已经投过票的交易就会被拒绝。最后,由于以太坊交易不会返回结果,我们添加了一些简单的view函数来查看目前投票数量,并确认投票是否被统计。

希望本文能够让大家了解Chainlink在主网上的其中一个实用功能,并为你们的智能合约实现更大的价值。如果你想要了解Chainlink的其他功能,请关注Chainlink发布的可验证随机数生成工具Chainlink VRF、接入Chainlink喂价机制开发流动性挖矿dApp或了解Chainlink预言机的最新研究成果公允排序服务。

如果你是一名开发者,并希望快速将智能合约连接至链下数据和系统,请查看 我们的
并加入我们在 Discord上的技术讨论群。如果你希望透过电话具体讨论集成细节,请点击点击此处联系我们。

Chainlink Functions 介绍 & 使用案例 从社交媒体到云计算和保险协议,Chainlink Functions 使开发人员能够以高度安全和信任最小化的方式轻松安全地访问链下数据和计算,从而开辟了大量的智能合约用例。要查看更多用例或提交你自己的用例,我们建议你访问,这是一个显示社区提交的 Chainlink 函数用例和示例的网站。将世界上所有的数据和 API 引入去中心化应用程序将引发新用例的爆炸式增长,类似于Chainlink 喂价是 DeFi 增长的催化剂。 阅读详情

相关推荐

使用Chainlink为Web3钱包项目实现代币价格获取功能

确定需要的代币价格预言机地址创建与价格预言机交互的代码实现前端与预言机交互的函数扩展支持多种代币和多个网络添加价格格式化和转换功能将价格功能整合到钱包界面实现价格提醒和历史图表等进阶功能这种实现方式确保了你的钱包能获取到高质量、去中心化验证的价格数据,为用户提供准确的资产估值信息。

weixin_61918468的博客 1685

Chainlink的77种用法

Chainlink提供了构建去中心化预言机网络所需的必要开发人员工具, 对外部数据的访问为智能合约开启了全新的功能浪潮。本文汇总了77种 使用Chainlink预言机网络的方法与实际应用场景,涵盖去中心化金融、 外部支付、游戏、保险、企业系统、供应链、工具、身份授权、政府等诸多领域, 相信有助于加深学习者对预言机潜力的理解并激发探索的兴趣。 0、预言机与Chainlink简介 基本上来讲,智能合约定义了两个或多个独立方之间进行价值交换的条款和义务。 从历史上看,通常需要一个中央仲裁员来验证是否满足这些条

跨链技术践行者 1万+

价格预言机的使用总结(一):Chainlink篇

价格预言机已经成为了DeFi中不可获取的基础设施,很多 DeFi 应用都需要从价格预言机来获取稳定可信的价格数据,包括借贷协议,也包括衍生品交易所dYdX、PERP等等。目前最主流的价格预言机主要有,这几种价格预言机的接入方式和适用场景都不太一样,可以单独使用,也可以结合使用。鉴于不少同学还不知道这些预言机具体有哪些接入方式,也不了解背后的机制,更不清楚如何才能做到保证安全性的同时又能以最小的成本接入。下面,我将分享下我的经验总结,以供参考。

Keegan小钢 1882

操作指南 | 如何使用Chainlink喂价功能获取价格数据

此教程将会展现如何在Moonbeam、Moonriver或是Moonbase Alpha测试网上使用喂价功能。

Moonbuilder的博客 1638

如何使用Chainlink Keepers实现智能合约执行的自动化

在本教程中,你将学习如何使用Chainlink Keepers这种可靠的和去中心化的方式自动执行智能合约。

ChainlinkO的博客 2917

使用Chainlink预言机,十分钟开发一个DeFi项目

Chainlink 价格参考数据合约是可以在智能合约网络中值得依赖的真实价格数据的链上参考点。这些合约由多个 Chainlink 节点定时更新,提供高精度,高频率,可定制化的 DeFi 价格参考数据,可以方便的为 DeFi 项目的开发提供开箱即用的稳定基础设施。本文我们会教你如何使用这些合约。除此之外,Chainlink 还提供了通过获取链下数据的方式,从用户指定的 API 获取价格数据。我们下面就介绍一下这两种方式。 直接从 API 获取价格 首先我们先简单回顾一下,一般情况下我们如何使用 Chainli

ChainlinkO的博客 2842

(15)Chainlink Automation(定时任务) 详细介绍及用法

Chainlink Automation 是一个强大的工具,可以帮助开发者自动化智能合约的执行。无论是 DeFi、NFT 还是供应链管理,Chainlink Automation 都能显著提升智能合约的自动化能力。Chainlink Automation 是 Chainlink 提供的一个去中心化服务,专门用于自动化执行智能合约的链上操作。Chainlink 的去中心化节点网络负责监控触发条件,并在条件满足时执行任务。任务是 Chainlink Automation 的核心概念。

鱼遇海 1282

通过预言机获取任意链下数据 - Chainlink Any API 代码解析

除了获取通证价格以外,开发者还可以通过 Chainlink Any API 获得任何个性化数据。文章讲解了如何新建自己的 Chainlink 节点,并且在合约中使用 Chainlink 节点 AnyAPI 服务获得个性化数据。

ChainlinkO的博客 2236

智能合约开发者的Chainlink使用秘籍

随着DeFi的大规模应用,区块链预言机解决方案成为了热议话题,许多人都很关心如何有效地使用预言机安全访问优质数据。而智能合约如果要产生实际价值,就必须通过一个可靠的机制与底层区块链以外的数据进行交互。Chainlink为智能合约开发者提供了一套预言机解决方案,帮助链上应用与链下数据以多种方式进行交互。 智能合约开发者可以获得哪些核心功能? 价格数据——精准的去中心化价格数据,覆盖多个市场。 访问任何API接口——通过POST和GET等方法访问任何API接口 Chainlink VRF——创建可验证的随机.

ChainlinkO的博客 1256

Chainlink预言机基本原理(一)

Chainlink预言机基本原理(一) 作者:团长 本文我们来从技术上简述一下Chainlink的基本原理。如果用最短的一句话解释什么是Chainlink,可以说Chainlink一个去中心化的预言机项目,所以为了理解Chainlink的工作原理,我们首先要明白什么是预言机。 预言机 预言机的英文为Oracle,和著名的数据库服务提供商Oracle(甲骨文)重名,但是两者除了名字相同以为并没有任何关系。 Oracle这个单词是什么意思,下面是我在vocabulary.com上查到的Oracle的含义: Back in ancient times, an oracle was someone w

/lib//libclntsh.so: file format not recognized; treating as linker script

centos7.7+oracle19.3 建库过程报错:预检查都是通过的 /oracle/product/19.3.0/db_1/lib/libasmperl19.a -Wl,--no-whole-archive -lclntsh -lclntshcore -lasmclntsh19 -lhasgen19 -lskgxp19 -locr19 -lcell19 -lirc INFO: /usr/bin/ld:/home/app/oracle/product/19.3.0/db_1/li...

sqlora的专栏 9914

链上投票 VS Snapshot投票

链上投票与Snapshot投票的区别

Moonbuilder的博客 750

A B C三个气象站的小波分析结果解读

在小波分析的过程中,信号的不同频率分量会在不同的尺度上显现,而纵轴上的数值表示信号在相应尺度上的强度或能量。2. **小波方差的横轴(水平轴)**:横轴上的尺度表示用于分析的小波函数的尺度。1. **共同趋势:** 在所有三个点的小波方差图中,随着尺度的增加,方差逐渐增大,尤其是在较大的时间尺度上。3. **尺度30的特殊性:** 在所有点的小波方差图中,尺度30似乎是一个特殊的点,对应着一个较长的时间尺度上的波动或变化。2. **方差的大小:** 方差的大小反映了在相应尺度下信号的波动强度。

weixin_44259522的博客 859

Snapshot投票结果公布,Grants花落谁家由社区的你说了算!

​ Moonbeam技术委员会成员Sicco在Moonbeam社区论坛发布了第一批生态系统Grants Snapshot投票结果。

Moonbuilder的博客 462

土壤水动力学_前 言

Van Genuchten (V-G) 模型是土壤水分特征曲线中最常用的模型之一。它通过数学方程描述了土壤基质吸力与体积含水量之间的关系,被广泛应用于土壤水分运移、土壤盐渍化、边坡稳定性等研究领域。V-G模型是描述土壤水分特征曲线的重要工具,但它并不是完美的。在实际应用中,需要根据土壤类型、试验条件等因素选择合适的模型。土壤基质吸力是土壤水分学中的一个重要概念,它对土壤水分的保持、植物的生长以及土壤的工程性质都有重要影响。

weixin_44259522的博客 5331

ABP多租户实现

abp会调用ITenantStore.Find(Guid)方法去查tenant是否存在。要骗过abp就得自己实现ITenantStore并替换原来的实现。abp会自动解jwt里的tenant id,并且尝试验证它。这时候我们之前实现的ITenantStore就可以骗过abp。你要不想骗它也成,反正这个类是可以依赖注入的,你爱咋验证就咋验证。不用open id dict,只用jwt,让abp轻起来。在原来生成jwt的地方加入tenantId。module上也要加DependsOn。

m0_46704355的博客 471

谷歌连接oracle,谷歌放大招,使用ChainLink Oracle构建混合云区块链应用

本周四,科技巨头谷歌云的开发者在一篇博客文章中表示,使用谷歌软件的以太坊应用构建者,将通过使用ChainLink的Oracle智能合约,整合来自区块链外部来源的数据。这就使得预测市场、期货合约以及交易隐私等诸多区块链用例拥有了更大的可能。谷歌云的高级开发者Allen Day写道,Chainlink可充当智能合约与现实世界数据的中间件,让去中心化应用(DApp)无需依赖中心化的oracle获得链下输...

weixin_42682925的博客 454

求助:有没有基于pscad的锂电池仿真模型

求助:有没有基于pscad的锂电池仿真模型 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变没有 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写...

qq_38922523的博客 1222

揭开Chainlink的神秘面纱

本文将详细解析Chainlink网络中的各个要素如何协力为区块链开发者打造一个稳健且可扩展的系统,并与外部世界交互。Chainlink网络为复杂的智能合约提供了可靠且防篡改的数据输入和输出,将智能合约连接至链下数据、事件和支付系统。 Chainlink的底层架构是去中心化的预言机,这个概念一直以来都受到区块链社区的大力追捧。Chainlink不同于其他中心化预言机网络,其网络由多个独立节点组成,为...

ChainlinkO的博客 1829

MATLAB实战:5步搞定铣削稳定性叶瓣图(附完整代码解析)

本文提供了一份基于MATLAB的铣削稳定性叶瓣图实战指南。通过5个清晰步骤,从动力学原理出发,详细解析了利用半离散法构建稳定性判据、模块化代码设计、高效参数扫描及高级可视化的完整流程,并附有完整代码,帮助工程师快速预测和规避加工颤振,优化铣削工艺参数。

weixin_29197051的博客 196

一键熄火:在 SAP ABAP 平台停用 OAuth 2.0 Client 的正确姿势

本文是一篇面向SAP ABAP平台运维与开发团队的实战指南,重点讲解了OAuth 2.0客户端的停用操作。文章首先阐述了停用的必要性——当客户端存在泄漏风险或配置错误时,停用能在阻断访问的同时保留配置。随后详细介绍了通过SOAUTH2事务码执行停用的具体步骤,并区分了"停用"、"删除"和"撤销令牌"三个关键概念及其适用场景。 文章提供了两个真实案例:一个是怀疑客户端泄漏后的紧急处置流程,另一个是合规审计期间的冻结与恢复操作。最后总结了一份验证清单,

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 278

区块链预言机 Chainlink 测试环境部署与使用/探索区块链预言机的实现原理

Chainlink 什么是预言机:在区块链领域,预言机被认为是可以为区块链智能合约提供外部数据源的系统。 Oraclize项目:中心化预言机。 Chainlink项目:去中心化预言机。 Github https://github.com/smartcontractkit/ 文档 https://docs.chain.link/docs/running-a-chainlink-node/ 部署步骤 部署以太坊节点 或者 获取一个可以被访问的ws连接地址 部署postgresql数据库

IMPlove的博客 4696

SpringBoot实现快速导入EXCEL

MaterialMonitorController.java @Log(title = "物料监测", businessType = BusinessType.IMPORT) @RequiresPermissions("system:materialMonitor:import") @PostMapping("/importData") @ResponseBody ...

LEN程序员的一生 4817

将智能合约连接到Twitter API

像Twitter这样的社交媒体平台拥有丰富的数据,展示了全世界人们所关心的热门话题。我们正在进入一个数据驱动的世界,而Chainlink提供了一个渠道,将这个庞大的数据集安全地连接到链上世界,为我们的社交媒体生活带来智能合约的可靠性和透明度保证。 在这次的实战演练中,我们将介绍如何让你的智能合约连接到Twitter API。具体来说,我们将解释如何从智能合约中发出一条推文,但是围绕社交媒体进行数据分析和智能合约的执行所展示出来的可能性却是无限的。 构造函数 pragma solidity ^0.6.12;.

ChainlinkO的博客 594

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

定时器触发事件流程

cc2530 z-stack

bnblzq的博客 2803

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

上一篇: 智能合约开发者的Chainlink使用秘籍
下一篇: 智能合约中的OAuth和API认证
Chainlink资讯
博客等级 码龄7年 264粉丝 118原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值