lol外围投注平台

在本教程中,我们将构建一个非常简单的合约,为其撰写单元测试,并运营调试过程以查询Bug。运营该示例所需的全部是爪哇岛和集成开发环境。只需创立一个倚赖动静脉畸形近期工具库的爪哇岛项目作为库1 .撰写智能合约首先创立智能合约。

以下是可用作非常简单投票DApp的智能合约的示例。智能合约的功能:1 .只有合约所有者(部署合约的帐户(可以加到或移除成员2 .只有会员可以讲解新的议案3 .只有会员可以对议案展开投票4 .如果多达50%的成员赞同该议案并对其投票,该议案将通过。包装组织。孤独。

AVM。嵌入。temp导入avm .区块链;导入组织。

孤独。AVM。工具。ABI。

可调用;导入org。孤独。AVM。

用户库。Aionmap导入org。

孤独。AVM。用户库。Aionset导入avm .地址;导入组织。

孤独。AVM。

用户库。ABI。ReyCoderpublic class Voting { private static AIonset address members=new AIonset();私有静态AionMapInteger,提案提案=新aion map();私有静态地址所有者;私有静态实时编码器解码器=新的实时编码器(区块链。

getdata());address[]arg=decode oneaddress array();对于(地址地址:参数){成员。add(addr);} updateQuorum();所有者=区块链。GetCaller();} @ Callablepublic静态void addproposition(字符串描述){打电话者地址=区块链。

getcaller();Blockchain.require(isMember(调用者));提议提议=新提议(描述,呼叫者);int proposal id=proposes。size();求婚。put(提案id,提案);区块链。

日志(‘ NewProposaladded ‘ .getBytes(),Integer.toString(proposalId).getBytes(),caller.toByteArray(),描述。getBytes());}@Callablepublic静态无效(内部提案编号){地址呼叫者=区块链。GetCaller();Blockchain.require(isMember(调用者)提案。

LOL外围投注官网

包含密钥(建议id));命题VOTED命题=命题。获取(建议id);votedproposition。配音员。

add(呼叫者);Blockchain.log(‘已投票。getBytes(),Integer.toString(proposalId).getBytes(),调用方。tobytearray());if(!votedproposition。

ispassedvotedproposal。配音员。size()==Minimumquorum){ voted proposition。ispassed=trueBlockchain.log(‘ProposalPassed ‘ .getBytes(),Integer.toString(proposalId).getBytes());} } @ Callablepublic static void addMember(Address new member){ only owner();成员。

添加(新成员);updateQuorum();Blockchain.log(‘MemberAdded ‘ .getBytes(),新成员。tobytearray());} @ CallablePublic静态void remove成员(地址成员){仅限所有者();members.remove(成员);updateQuorum();Blockchain.log(‘MemberRemoved ‘ .getBytes(),成员。tobytearray());}@Callablepublic静态string get proposal description(int proposal id){ return propose。包含密钥(建议id)?求婚。

获取(建议书编号).描述: null } @ Callablepublic static Address get propose owner(int propose id){ return propose。包含密钥(建议id)?求婚。获取(建议书编号).所有者: null}@Callablepublic静态boolean has proposition已通过(int proposition id){ return propositions。包含关键(建议id)建议。

获取(建议id).is passed } @ callablePUblic static int GetMinimumquorum(){ return Minimumquorum;}@Callablepublic静态布尔值是成员(地址){返回成员。包含(地址);}私有静态void only owner(){区块链。

require(所有者。等于(区块链。

getcaller()));} private static void updateQuorum(){ Minimumquorum=members。size()/2 1;{}私有静态类提案{字符串描述;地址所有者;布尔isPassedAionSetAddress选民=new AionSet();建议(字符串描述,地址所有者){ this . description=description this . owner=owner } } }合约中的静电块在部署时仅有继续执行一次。我们在此块中设置初始成员,最小法定人数和所有者。

尽管我们与一组成员启动了合约,但所有者随后也可以加到和移除成员。我们用于AionSet和AionMap追踪成员及其议案。可以用于其唯一标识符从地图采访每个建议。

智能合约的主要职能是:添加提案,网卓新闻网,容许成员加到议案解释以展开投票。
投票,容许成员通过传送其编号对能用议案展开投票。夺得多数成员投票的议案将通过。

请注意,将分解提议已通过事件以记录已通过投标的身份证. 2。撰写单元测试我们将用于AvmRule撰写测试AvmRule。是用作在嵌入式动静脉畸形上测试合约的Junit规则。它创立前部缺血性视神经病内核和动静脉畸形的内存中回应形式。

每次我们运营测试时,都会创下内置的内核和动静脉畸形实例。在测试我们的合约之前,我们必须将其部署到内存中的前部缺血性视神经病区块链中,并且我们将用于AvmRule已完成此任务答。实例化AvmRule您可以看见该规则包括一个布尔参数,该布尔参数落成/停止使用调试模式。

最差在落成调试器的情况下撰写测试。您可以在下一部分中查阅如何调试合约@ rule public AVM rule AVM rule=new AVM rule(true);留意:此行将为每种测试方法实例化嵌入式AVM。如果将规则定义为@classRule,则将仅有为测试类实例化动静脉畸形和内核的一个实例b .提供合约字节现在,我们必需提供与合约冲突的内存回应比较不应的字节。为了提供字节,我们将用于AvmRule中的getDappBytes方法。

getDappBytes使用以下参数:1 .合约的主要类别2 .合约结构函数参数,可以在静态块中对其展开采访和解码3 .DApp加尔中必须包括其他类公共字节[]getdapbytes(类?mainClass,byte[]参数,类?其他类)c .部署您的智能合约用于部署功能可以精彩已完成智能合约的部署公共结果包装器部署(地址从,大整数值,字节[]数据字节(规则还获取了在前部缺血性视神经病内核中创立具备初始余额的帐户的功能。以下是由3名成员构成的小组部署投票智能合约的方法公众类投票契约测试{ @ Rulepublic AVM规则AVM规则=新AVM规则(true);公共广播电台;公共地址所有者=AVM规则。

getpremiendaccount();公共地址[]成员=新地址[3];@ public void setup(){ for(int I=0;imembers.lengthi ) {//用初始余额成员[I]=avmrule。GetRanDomaddress(BigInteger。(10 _ 000 _ 000 L)的值创建帐户;}//将成员数组编码为参数字节[]deployArgument=Abutil。

encodeoneobject(成员);//获取表示内存中jar byte[]dapbytes=avmrule。getdapbytes的字节(Voting.class,deployArgument);//部署并获取约定address dappaddress=avmrule。部署(所有者,BigInteger .零,dappBytes).getDappAddress();}}D .调用方法我们可以通过以下方式调用合约中的方法:1 .编码方法名称及其参数2 .将编码后的字节传送给AvmRule的呼叫方法公共结果包装器调用(地址从,地址数据按,大整数值,字节[]事务数据(例如我们创立一个新的议案。

我们将通过检查否分解了新提议增加事件以及事件主题和数据准确来检验议案@ Testpublic void addProposalTest(){ String description=’ new proposition description ‘;byte[]TxDATa=Buttil。对方法参数进行编码(‘ AddProposition ‘,description);AvmRule .ResultWrapper result=avmrule。call(成员[0],dappAddress,BigInteger .ZERO,TxDATa);//断言事务成功断言。

lol外围投注平台

断言真(结果。GetReceiptStatus().issue ccess());//断言事件是generatedassert。assertequils(1,result.getLogs().size());Log log=result.getLogs().get(0);//验证主题和dataassert。assertarayequals(LogSizeutils。

截断主题(‘ NewProposalAdded ‘).getBytes()),log.copyOfTopics().get(0));断言。assertarayequals(LogSizeutils。

截断主题(整数. toString(0)).getBytes()),log.copyOfTopics().get(1));断言。assertarayequals(LogSizeutils。截断主题(成员[0]).toByteArray()),log.copyOfTopics().get(2));断言。assertarrayequals(描述。

GetBytes(),日志。copy of data());{}现在我们将递交一个议案以及两个投票。由于有两个有所不同的成员以ID 0对议案展开了投票,议案不应通过。

因此我们期望为最后一个事务分解两个有所不同的事件-投票和提议通过。您还可以通过议案编号查找议案的状态。您不会看见回到的解码数据为没错,回应议案已通过@ Testpublic投票测试(){ String description=’ new proposal description ‘;byte[]TxDATa=Buttil。

对方法参数进行编码(‘ AddProposition ‘,description);AvmRule .ResultWrapper result=avmrule。call(成员[0],dappAddress,BigInteger .ZERO,TxDATa);断言。asserttrue(结果。

GetReceiptStatus().issue ccess());assert . asserteqals(1,result.getLogs().size());//投票# 1tx data=but til。编码方法参数(“投票”,0);result=avmRule.call(members[1],dappAddress,BigInteger .ZERO,TxDATa);断言。asserttrue(结果。GetReceiptStatus().issue ccess());assert . asserteqals(1,result.getLogs().size());//投票# 2tx data=but til。

编码方法参数(“投票”,0);result=avmRule.call(members[2],dappAddress,BigInteger .ZERO,TxDATa);断言。asserttrue(结果。GetReceiptStatus().issue ccess());assert . asserteqals(2,result.getLogs().size());//验证建议是否存储为passeddxdata=Abutil。

对方法参数进行编码(‘ hasProposalPassed ‘,0);result=avmRule.call(members[2],dappAddress,BigInteger .ZERO,TxDATa);//将返回数据解码为booleanasert。asserttrue ((布尔)结果。

getdecode return data());}3 .调试智能合约调试我们的智能合约非常容易,只需在源代码中设置断点才可!由于我们在落成调试的情况下创立了AvmRule,因此在超过断点时将暂停继续执行。让我们来看一个例子。

这是部署后智能合约的状态。_lol外围投注平台。

本文来源:lol外围投注平台-www.ebizthings.com

相关文章