电子发烧友网 > 区块链 > 正文

如何使用Solidity编写智能合约的异步交易模式

2019年07月05日 10:06 次阅读

许多开发人员在开发Solidity之前实现了Java,Go,Python 感觉就像回到80年代后期的DeLorean一样。 但是Solidity的稳定性非常有限。

如何使用Solidity编写智能合约的异步交易模式

我正在使用名为#ScriptIt的队长的NodeJS oracle用于以下用例:

1. 新用户获得256分

2. 每次新呼叫,用户的积分将减少log2

船长将直接从Docker容器中的Solidity运行NodeJS调用,并将结果返回给您的合约。

智能合约

异步联系将派生自usingCaptainJS,其中包括异步调用和回调功能。

要在回调发生时记住异步调用,您需要一个JobCounter以及作业ID和发件人地址的映射:

uint JobCounter = 0;

mapping (uint =》 address) JobToSenderMap;

事件

在以太坊中,当同步事务处于挂起状态,事务只有失败或成功两种状态。异步事务将要求发出事件时,通知用户事务是否挂起、成功或失败。

因此,您定义三个这些事件,并且每个事件至少应包含发件人地址:

event GetPoints_Success(address Sender, uint Points);

event GetPoints_Pending(address Sender);

event GetPoints_Failed(address Sender, string ErrorMsg);

函数

以太坊的默认模式是每个用户调用一个合约函数,并支付在一个同步事务环境中执行代码所需的GAS。

但现在我们有了一个异步事务环境, 这意味着在同步函数调用终止后将需要额外的气体。

因此,您的函数必须是payable,您的首次检查必须是验证用户是否转移了足够的额外gas费用:

uint GasRequired = DEFAULT_GAS_UNITS * tx.gasprice + 70 szabo;

require(msg.value 》= GasRequired, “please send some extra gas.。.”);

在这个演示用例中,我们将要求使用usingCaptainJS中定义的默认gas单位乘以当前的交易gas价格加上70 Szabo的交易费。

一旦用户输送了足够gas,你可以根据船长在GitHub上的描述来调用mathjs的log2函数:

Run(

JobCounter,

concat(“math:log2(”,uintToString(PointsPerUser[msg.sender]), “)”),

“”, “”, 1, DEFAULT_GAS_UNITS, tx.gasprice

);

emit GetPoints_Pending(msg.sender);

在调用Run(。..)之后,您必须发出pending事件。如果调用Run(。..)失败,则同步调用将失败。

回调

一旦船长计算了用户积分的log2值,他就会通过调用CaptainsResult函数将结果发送回合约。通过仅添加CaptainsOrdersAllowed确保只有队长调用此功能。

确保在函数结束时发出成功事件。

funcTIon CaptainsResult(uint JobCounter, string Log2Result)

external onlyCaptainsOrdersAllowed {

// the return of the async call

address sender = JobToSenderMap[JobCounter];

uint Points = StringToUint(Log2Result);

PointsPerUser[sender] = Points;

emit GetPoints_Success(sender, Points);

}

果队长无法调用您提交的代码(也许您的JavaScript代码中有拼写错误),他会通过调用合同的CaptainsError函数通知您。

确保在函数结束时发出失败的事件。

funcTIon CaptainsError(uint JobCounter, string ErrorMsg)

external onlyCaptainsOrdersAllowed {

// the return of the async call

address sender = JobToSenderMap[JobCounter];

emit GetPoints_Failed(sender, ErrorMsg);

}

这是完整的代码:

pragma solidity ^0.4.25;

import “。/usingCaptainJS_v2.sol”;

contract AsyncPattern is usingCaptainJS {

// to identify async calls

uint JobCounter = 0;

mapping (uint =》 address) JobToSenderMap;

// demo use case: points per sender

mapping (address =》 uint) PointsPerUser;

event GetPoints_Success(address Sender, uint Points);

event GetPoints_Pending(address Sender);

event GetPoints_Failed(address Sender, string ErrorMsg);

funcTIon GetPoints() public payable {

// make sure to have enough gas for the async callback

uint GasRequired = DEFAULT_GAS_UNITS * tx.gasprice + 70 szabo;

require(msg.value 》= GasRequired, “please send some extra gas.。.”);

// remember this call

JobToSenderMap[++JobCounter] = msg.sender;

// now do the math - but mix async + async.。.

// every user has 256 points at the beginning and with every next

// call it is log2 of his points

if(PointsPerUser[msg.sender] == 0) {

// first call!

PointsPerUser[msg.sender] = 256;

emit GetPoints_Success(msg.sender, 256);

}

else {

// every other call

Run(

JobCounter, concat(“math:log2(”, uintToString(PointsPerUser[msg.sender]), “)”),

“”, “”, 1, DEFAULT_GAS_UNITS, tx.gasprice

);

emit GetPoints_Pending(msg.sender);

}

}

funcTIon CaptainsResult(uint JobCounter, string Log2Result) external onlyCaptainsOrdersAllowed {

// the return of the async call

address sender = JobToSenderMap[JobCounter];

uint Points = StringToUint(Log2Result);

PointsPerUser[sender] = Points;

emit GetPoints_Success(sender, Points);

}

function CaptainsError(uint JobCounter, string ErrorMsg) external onlyCaptainsOrdersAllowed {

// the return of the async call

address sender = JobToSenderMap[JobCounter];

emit GetPoints_Failed(sender, ErrorMsg);

}

}

下载发烧友APP

打造属于您的人脉电子圈

关注电子发烧友微信

有趣有料的资讯及技术干货

关注发烧友课堂

锁定最新课程活动及技术直播

电子发烧友观察

一线报道 · 深度观察 · 最新资讯
收藏 人收藏
分享:

评论

相关推荐

迅雷链文件系统TCFS对区块链应用的高可用性和安...

开发者对于P2P技术并不陌生,它所代表的是区别于中心化网络而存在的分布式网络。李海友在现场介绍,在典...

发表于 2019-07-05 10:03 2次阅读
迅雷链文件系统TCFS对区块链应用的高可用性和安...

区块链技术正在为保险业带来重大变革

区块链革命的最新成员是保险业,欧洲14家保险公司与德勤和其他公司合作,为保险公司提供了一个简单的系统...

发表于 2019-07-04 14:05 24次阅读
区块链技术正在为保险业带来重大变革

区块链将是政府的下一个重要转型技术

区块链是一种分布式账本技术(DLT)。DLT能够允许用户以不可入侵的方式立即记录数据和交易。理解区块...

发表于 2019-07-04 11:14 246次阅读
区块链将是政府的下一个重要转型技术

Google首次将大数据变现并用于以太坊智能合约

以太坊等智能合约区块链为开发者提供了新的基础架构,设计出更加安全、可靠且高效的多方合约,并在各方面超...

发表于 2019-07-04 10:37 16次阅读
Google首次将大数据变现并用于以太坊智能合约

拥有智能合约的比特币网络—RSK

RSK是一个比特币系统的智能合约平台,集合了BTC的安全性和可编程性。

发表于 2019-07-04 10:32 15次阅读
拥有智能合约的比特币网络—RSK

区块链在未来五年内将呈现出五种发展趋势

区块链出现于1991年,是一种对数字文档进行时间戳的方式,但在2009年变得更为广为人知,当时“中本...

发表于 2019-07-04 10:21 18次阅读
区块链在未来五年内将呈现出五种发展趋势

加密货币市场将会重新洗牌吗

在比特币替代者价格崩溃后,加密货币市场将会出现重新洗牌。

发表于 2019-07-04 09:30 75次阅读
加密货币市场将会重新洗牌吗

区块链技术将怎样影响整个社会结构的信任体系

比较左右两图,我们可以看到两个简单的模型几乎都有相同的元素,模型参与者双方,信任度及对应的反馈促进下...

发表于 2019-07-03 15:08 35次阅读
区块链技术将怎样影响整个社会结构的信任体系

我国已有55家展会商确认将使用ExpoCore区...

我国每年的展会上,可以达成价值2000亿美元的合同。全国约有1700个品牌参与展会,其中有500个已...

发表于 2019-07-03 14:58 19次阅读
我国已有55家展会商确认将使用ExpoCore区...

基于一种用于边缘计算云服务的加密货币PolarC...

Interplanetary File System 星际文件系统(IPFS) 是点对点(peert...

发表于 2019-07-03 14:38 27次阅读
基于一种用于边缘计算云服务的加密货币PolarC...

以太坊​2.0存款合同的正式验证

考虑到存款合约的重要性,需要进行形式验证,而这也是最终保证合同正确性的唯一已知方式。

发表于 2019-07-03 14:35 11次阅读
以太坊​2.0存款合同的正式验证

Polkadot和Cosmos为什么对区块链很重...

区块链构成的网络能通过网络效应改善去中心化的互联网。当一切都连接在一起时,它带来了更多的资本、更好的...

发表于 2019-07-03 14:18 21次阅读
Polkadot和Cosmos为什么对区块链很重...

区块链将如何被零售业应用

Fabricant是一家数字时装公司。我指的并不是一家使用数字工具来设计产品的时装公司,尽管它们可以...

发表于 2019-07-03 14:06 24次阅读
区块链将如何被零售业应用

基于Cosmos的跨链协议将帮助更多的数字货币资...

Kava认为Cosmos给了一套很好的公链开发协议,让很多团队可以更低门槛的进行开发,目前币安的交易...

发表于 2019-07-03 13:57 28次阅读
基于Cosmos的跨链协议将帮助更多的数字货币资...

基于XuperChain提出的一种智能合约并行执...

Hyperledger Fabric提出了一种方法,其中智能合约首先在多个背书节点上执行,以获得读写...

发表于 2019-07-03 13:47 44次阅读
基于XuperChain提出的一种智能合约并行执...

去中心化的DEX系统与中心化的EX交易所系统有何...

对于拥有图灵完备的智能合约编程功能的公链系统,实现币币兑换的功能,则更加方便、自然、通用。如下图所示...

发表于 2019-07-03 13:47 24次阅读
去中心化的DEX系统与中心化的EX交易所系统有何...

区块链是密码性安全的附加数据库

在财新电视辩论上,迅雷集团CEO陈磊表示,传统互联网的商业模式,无法很好地解决用户数据的收集、储存以...

发表于 2019-07-03 11:54 63次阅读
区块链是密码性安全的附加数据库

比特币网络上是否适合构建新的DeFi应用

作为加密货币领域的众多流行用语之一,DeFi 的标签还被挂到了一些并非完全去中心化的项目上。例如,T...

发表于 2019-07-03 11:48 23次阅读
比特币网络上是否适合构建新的DeFi应用

Chainlink是如何使用去中心化的预言机解决...

Chainlink的CEO Sergey Nazarov和工程师Alex Coventry(MIT博...

发表于 2019-07-03 11:45 14次阅读
Chainlink是如何使用去中心化的预言机解决...

Metavine发布了一个完整的区块链开发者堆栈...

Crowd Machine公司首席执行官Craig Sproule表示,区块链生态系统的增长速度很慢...

发表于 2019-07-02 14:57 26次阅读
Metavine发布了一个完整的区块链开发者堆栈...

印度国家银行正在计划发布测试版智能合约

据SBI创新负责人Sudin Baraokar介绍,该系统由27家银行组成的区块链联盟Bankcha...

发表于 2019-07-02 14:28 24次阅读
印度国家银行正在计划发布测试版智能合约

如何才能避免比特币现金遭到恶意延展性攻击

交易延展性,也被称作为是可锻性,即同样一个东西,它的本质和质量都没有改变,但是它的形状改变了。而这个...

发表于 2019-07-02 14:18 30次阅读
如何才能避免比特币现金遭到恶意延展性攻击

基于区块链技术的公有链网体系本体网络介绍

“本体网络”是一个基础性公有链网体系。它将信任的多样性在一体化的协议体系下进行协同,整合多样化分布式...

发表于 2019-07-02 14:08 30次阅读
基于区块链技术的公有链网体系本体网络介绍

GoChain正在使用区块链技术来保护个人的知识...

区块链是一个廉洁的数字分类账,便于在一个商业网络中记录交易和跟踪资产。资产可以是有形的,如现金、房屋...

发表于 2019-07-02 11:34 25次阅读
GoChain正在使用区块链技术来保护个人的知识...

如何在区块链系统中使用二维思维

“二维思维”也叫结构化思维,顾名思义是将知识进行结构化的一种思维方式。 同样,在区块链系统中,...

发表于 2019-07-02 11:21 29次阅读
如何在区块链系统中使用二维思维

BCH社区推出了Twitch直播视频平台的加密货...

Tipbitcoin.cash是由创建了Crescent Cash钱包的开发者推出的,它允许所有用户...

发表于 2019-07-02 11:20 21次阅读
BCH社区推出了Twitch直播视频平台的加密货...

分片技术是如何解决区块链性能问题的

分片并不是一个新的概念,早在 90 年代后期就出现在了传统的中心化数据库管理中。这个概念的流行,要归...

发表于 2019-07-02 11:15 28次阅读
分片技术是如何解决区块链性能问题的

区块链最佳的改造场将是影响世界的金融战场

尽管,去中心化的大旗,已徐徐飘扬在欧亚大陆,和美洲板块间,并形成强大的能量共振;尽管,比特网络的强势...

发表于 2019-07-02 10:57 21次阅读
区块链最佳的改造场将是影响世界的金融战场

基于一种区块链技术去中心化电商买卖服务平台介绍

互联网的出现,让买卖双方能够远程的达成交易合约,但是因为资金的划拨速度远高于商品的流动速度,导致资金...

发表于 2019-07-01 15:03 39次阅读
基于一种区块链技术去中心化电商买卖服务平台介绍

基于一个把复制交易平台带到虚拟货币市场的CCov...

CCovesting平台帮助投资者和加密货币交易员找到彼此 。 由于有技术的解决方案和智能合约...

发表于 2019-07-01 14:32 38次阅读
基于一个把复制交易平台带到虚拟货币市场的CCov...

区块链将在协调新兴劳动力方面发挥着关键作用

这种半去中心化的工作模式可能会使人们更高效地完成某些任务,也能使企业通过集中关键业务来大幅降低成本。...

发表于 2019-07-01 14:30 25次阅读
区块链将在协调新兴劳动力方面发挥着关键作用

如何才能将雷电令牌和以太坊融合

雷电网络团队解释道:在目前雷电的开发人员中,至少有3人从一开始就参与以太坊的开发,换言之,从开发团队...

发表于 2019-07-01 14:23 33次阅读
如何才能将雷电令牌和以太坊融合

为什么说区块链浏览器是信息的窗口

比特币交易虽然占整个加密货币市场50%以上的交易量,可加密货币的整体链上数据规模并不大。对于链上的企...

发表于 2019-07-01 14:04 36次阅读
为什么说区块链浏览器是信息的窗口

区块链POA零识ZK基金介绍

区块链交易是公开的,供所有人查看。当区块链上的各方之间发生交易时,人们可以查看发送交易的参与者的地址...

发表于 2019-07-01 14:04 17次阅读
区块链POA零识ZK基金介绍

国网电力公司在青海推出了基于区块链技术的电力市场...

近日,青海省和国家电网青海电力公司推出“绿电15日”活动,自2017年和2018年推出绿电7日、9日...

发表于 2019-07-01 13:44 41次阅读
国网电力公司在青海推出了基于区块链技术的电力市场...

以太坊2.0背后的设计原则探讨

自从以太坊网络诞生以来,试图将以太坊从PoW转换为PoS,是一个重大的进展。Vitalik Bute...

发表于 2019-07-01 11:19 25次阅读
以太坊2.0背后的设计原则探讨

什么是V0主网在当前的区块链世界有什么不同

v0主网的主要目的是初步开启共识,让验证者得到区块奖励,并为之后的主网阶段升级打好基础。在v0主网,...

发表于 2019-07-01 11:15 40次阅读
什么是V0主网在当前的区块链世界有什么不同

区块链链上治理的实质介绍

区块链治理实质上是在区块链平台上提出和实现变更的方法。这就带来了一个挑战:在这些变革中,必须让各种各...

发表于 2019-07-01 11:12 55次阅读
区块链链上治理的实质介绍

如何在以太坊区块链的Solidity中实现访问控...

本文旨在展示如何为以太坊区块链构建基于角色的访问控制系统。根据我们的要求从头开始编写RBAC合同,然...

发表于 2019-07-01 11:00 27次阅读
如何在以太坊区块链的Solidity中实现访问控...

以太坊智能合约安全存在漏洞吗

以太坊虚拟机(EVM)对于智能合约能够做的事情存在很多硬性限制。

发表于 2019-06-30 09:24 45次阅读
以太坊智能合约安全存在漏洞吗

什么是Hedera共识服务

分布式账本技术通过消除对单个组织的信任来改善这种情况。分布式应用程序在一组计算机上运行,每个计算机由...

发表于 2019-06-29 11:05 47次阅读
什么是Hedera共识服务

区块链可以解决哪些中心化方式都解决不了的问题

比如全球的碳交易,这个需要全球很多国家去达成共识,但目前是缺乏有力的中心组织。每个国家之间缺乏信任,...

发表于 2019-06-28 14:55 77次阅读
区块链可以解决哪些中心化方式都解决不了的问题

区块链技术将如何颠覆医疗系统

未来区块链会应用于任何领域,给人类生活带来极大影响。区块链应用项目大致分为:存在性证明、智能合约、物...

发表于 2019-06-28 14:34 45次阅读
区块链技术将如何颠覆医疗系统

区块链技术将为音乐产业提供一个完整的权利归属

美国作曲家、作家和发行商协会(American Society of Composers,Autho...

发表于 2019-06-28 14:26 42次阅读
区块链技术将为音乐产业提供一个完整的权利归属

以太坊2.0如何解决区块链的扩展性问题

以太坊的早期承诺是创建一台世界计算机——一台去中心化的世界计算机——它将执行任何人的代码以换取费用,...

发表于 2019-06-28 14:21 46次阅读
以太坊2.0如何解决区块链的扩展性问题

Chainlink预言机将为甲骨文区块链贡献出有...

甲骨文是全球第三大软件公司,业务和客户遍布世界各地。公司已基于Hyperledger Fabric超...

发表于 2019-06-28 14:09 66次阅读
Chainlink预言机将为甲骨文区块链贡献出有...

基于一款全球范围流行的加密货币支付软件Bitpa...

Bitpay的首席商务官Sonny Singh解释说,随着区块链支付继续成为主流,[Bitpay]看...

发表于 2019-06-28 14:09 31次阅读
基于一款全球范围流行的加密货币支付软件Bitpa...

基于加密货币的金融ZOS智能金融服务生态介绍

ZOS Chain为金融业务建立了分布式账本,同时也为法币借贷的金融机构建立了分布式账本,让法币接入...

发表于 2019-06-28 13:40 47次阅读
基于加密货币的金融ZOS智能金融服务生态介绍

如何设计出一种可以自我调整的共识协议

新的基础设施涌现出新的技术,而新技术中所带来的欲望则孕育着技术的自否定。原有的基础设施终因无法再满足...

发表于 2019-06-28 11:26 45次阅读
如何设计出一种可以自我调整的共识协议

维基链智能合约框架的优势特点介绍

智能合约是一种旨在以信息化方式传播、验证或执行合同的计算机协议。基于区块链技术实现的智能合约,支持可...

发表于 2019-06-27 11:36 34次阅读
维基链智能合约框架的优势特点介绍

以太坊的编程语言Solidity在TRON中异步...

目前,Solidity将智能合约简化为仅存储数值并进行一些基本的数学运算。 并且大多数智能逻辑都写在...

发表于 2019-06-27 11:29 33次阅读
以太坊的编程语言Solidity在TRON中异步...

基于Computable可计算协议模型分析

Computable使用粘合曲线在客户将加密货币存入储备时发出代币,在向制造商发出代币以提供数据时发...

发表于 2019-06-27 11:27 28次阅读
基于Computable可计算协议模型分析

区块链和大数据是如何扩大版权法范围的

我正在坚持到底。制作这张专辑向我展示了制作好的音乐是多么的复杂和昂贵。要得到歌词,给他们放曲调,找到...

发表于 2019-06-27 11:25 44次阅读
区块链和大数据是如何扩大版权法范围的

如何看待以太坊2.0启用PoS共识

黑币是一个很有意思的币种,它是全球第一个在初始阶段采用 PoW,然后转为纯 PoS 的币种(中间有一...

发表于 2019-06-27 11:15 46次阅读
 如何看待以太坊2.0启用PoS共识

Qtum量子链正在寻求新方案来降低隐私协议的ga...

但最近许多项目尝试使用以太坊的智能合约实现隐私解决方案,例如AZTEC和Zether。这些项目受益于...

发表于 2019-06-27 11:04 35次阅读
Qtum量子链正在寻求新方案来降低隐私协议的ga...

数字货币的分类有哪些

笑来先生前段时间在生存指南里说过,区块链的世界从过去只有一颗大树(比特币),到如今变成了一片森林。因...

发表于 2019-06-26 14:41 184次阅读
数字货币的分类有哪些

基于区块链技术的宠物终身管理平台All Pet介...

All Pet作为全球首款运用动物鼻纹个体鉴别技术及区块链的宠物平台,组建去中心化的宠物ID及PHR...

发表于 2019-06-26 14:17 53次阅读
基于区块链技术的宠物终身管理平台All Pet介...

如何增强以太坊区块链上的隐私性

公共区块链网络的隐私是一个矛盾体,因为根据技术设计的性质,数据必须在网络上共享和广泛分布才能被认为是...

发表于 2019-06-26 13:50 51次阅读
如何增强以太坊区块链上的隐私性

基于区块链技术staking项目的发展现状分析

stake.fish 一直致力于打造 staking 项目的安全基础。王纯建立迄今为止世界最大的Po...

发表于 2019-06-26 11:38 56次阅读
基于区块链技术staking项目的发展现状分析

去中心化的预言机网络Chainlink的发展现状...

预言机是区块链中间件,它将智能合约连接到各种所需的链下资源。预言机是区块链和API之间的中间层,将数...

发表于 2019-06-26 11:17 86次阅读
去中心化的预言机网络Chainlink的发展现状...