学习在RIDE和RIDE4DAPPS上编写Waves智能合约。 第1部分(多用户钱包)


大家好!


最近,Waves Labs 宣布了一项针对开发人员竞赛, 这些竞赛致力于将RIDE智能合约语言扩展发布到Ride4Dapps分散式应用程序到测试网络!


我们选择了DAO案例,因为Ventuary计划开发具有社交功能的dApp:投票,筹款,信托管理等。


我们从Q&A会话RIDE IDE中的一个简单示例开始-一个具有通用钱包的示例。


让我们看一下这个例子,检验假设并考虑一些奇怪之处:


让我们拥有Alice-dApp所有者
Boob和Cooper是Alice-BC DAO的共同创始人Alice的合伙人
内里(Neli)是需要融资的企业主
银行-分发代币的银行


阶段1.余额初始化


为了在Waves测试网络中接收令牌,您需要联系水龙头并指定将令牌发送到的地址。


可以通过显示帐户信息在IDE中找到该地址。


选择Bank 10 WAVES。 在我们确认它们通过区块和事务浏览器之后浏览器


现在,让我们将代币从银行分发给其他参与者。 (注意:Waves网络中的所有交易不是免费的,因此,所有参与者完成交易都需要最低的正余额)。


1 WAVES = 100000000单位(小波),因为数量只能是整数
0.01 WAVES(交易费)= 1000000

银行-> [3 WAVES]->爱丽丝,通过TransferTransaction(类型:4)。


我们确认签署交易的环境SEED与我们的银行相对应:




如果您没有匹配的种子短语,只需在“帐户”标签中切换到它,然后再次检查即可。


之后,我们创建,宣布并签署3 WAVES Alice转让的交易。
您还可以通过env.accounts变量了解爱丽丝的数据。 编号从0开始,分别是Alice是env.accounts [1]。



broadcast(transfer({recipient:address(env.accounts[1]), amount: 300000000, fee: 1000000})) 

结果也可以在浏览器中观察到, 交易之后,指向它的链接将立即返回给我们。


我们确保通过3次WAVES补充Alice余额,并确保银行余额中剩余10-3-0.01 = 0.699。




我们以3 WAVES的方式发送Boob和Cooper,以0.2 WAVES的方式发送Neli,Xena和Mark。
(注意:我们犯了一个字符错误,并发送了Neli 0.02 WAVES。注意!)


 broadcast(transfer({recipient:address(env.accounts[4]), amount: 20000000, fee: 1000000})) 

补充所有参与者的余额后,我们看到:



阶段2.创建dApp帐户


我们同意,分散应用程序的创建者和所有者将是爱丽丝。
在``帐户''中,将其安装为SEED并检查环境SEED与Alice是否匹配。


让我们尝试在Alice帐户上安装最简单的脚本(合同)。
Waves中的智能联系人是在某些条件下禁止或允许执行任何类型的传出交易的谓词。 在这种情况下,此条件始终为。 合同代码为真。 我们称为deploy()。



setScript交易费用1400000/100000000 = 0.014 WAVES。 爱丽丝的余额为2.986波。


现在让我们尝试在Alice帐户上安装示例中描述的更复杂的智能合约逻辑


Ride4Dapps现在包括2种新的注释类型:
  1. @Callable(i) -将有关哪个帐户引起/签署交易的数据作为参数i。 该功能的结果确定dApp帐户状态的更改。 其他帐户可以使用此注释创建交易并执行功能,并更改dApp帐户的状态。
  2. @Verifier(tx) -具有事务tx参数的事务验证器。 对应于RIDE的谓词逻辑。 通过此表达式,您可以启用或禁用dApp帐户上智能合约逻辑的进一步更改。
    小心点! 重要的一点是,默认情况下,帐户上的脚本不等于true ,而是使用签名比较,并且仅允许签名所有者进行交易。
     sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPk) 


    没有这种验证,任何人都可以通过帐户进行交易!

让我们将dApp帐户作为所有参与者的通用钱包。



要检查当前在您的帐户上处于活动状态的合约,您可以在块浏览器中复制智能合约的base64代码,并通过反编译器进行识别( 例如





我们确保智能合约的逻辑符合我们的期望。
爱丽丝的余额中有2.972个WAVES。


此dApp跟踪每个参与者通过数据交易机制-DataEntry(currentKey,newAmount)向共同基金捐款的金额 ,其中currentKey是调用存款功能的帐户,而newAmount是补充余额的值。


Boob和Cooper分别以1 WAVES的价格在dApp帐户中进行存款。



我们犯了一个错误,交易没有通过。 从那时起,尽管我们确信我们代表Bob进行交易,但我们却犯了一个错误,并指出了一个没有智能合约的银行帐户。 在此值得注意一个重要的点-如果未成功发起交易,则不会撤回佣金 爱丽丝的余额中有2.972个WAVES。 鲍勃3有波。


鲍勃向dApp帐户发送了1次WAVES。


 broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"deposit",args:[]}, payment: [{amount: 100000000, asset:null }]})) 


鲍勃还有1.99波浪。 也就是说,鲍勃支付了0.01 WAVES佣金



爱丽丝的资产负债表上有2.972个WAVES,它变成了3.972。 交易也已在Alice的帐户上进行了注册,但是,没有从dApp帐户(Alice)中扣除任何佣金。
库珀还补充了爱丽丝的帐户后,资产负债表上出现4.972个WAVES。



您可以在“数据”选项卡的区块浏览器中找到普通钱包中有多少WAVES。


库珀改变了主意,将1 WAVES的金额留在一个普通钱包中,并决定撤回一半的亲和力。 为此,它必须调用撤回函数。



但是,我们再次被误认为,因为撤回函数具有完全不同的参数和不同的签名。 在RIDE4DAPPS上设计智能合约时,您应该注意这一刻。



库珀的资产负债表上有2.48个WAVES。 因此,3次WAVES-1-0.01,然后+ 0.5-0.01。 因此,每次充值和提款的费用为0.01 WAVES。 结果,dApps所有权表中的条目已更改如下。



鲍勃还决定从总钱包中提取一定金额,但被误认为是试图提取1.5 WAVES。



但是,智能合约已经检查了这种情况。


Xena是骗子,她试图从普通帐户中提取1 WAVES。



她也失败了。


在下一部分中,我们将考虑与Alice dApp帐户的不完善相关的更复杂的问题。

Source: https://habr.com/ru/post/zh-CN447790/


All Articles