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

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

您好!

最近,Waves 实验室 公布 致力于将去中心化应用程序 Ride4Dapps 的 RIDE 智能合约语言扩展发布到测试网络的开发人员竞赛!

我们选择 DAO 案例是因为 文丘里 计划开发具有社交功能的dApp:投票、筹款、信托管理等。
我们从一个简单的例子开始 问答环节骑行IDE - 示例与 共享钱包.

让我们看一下这个例子,测试假设并看看一些奇怪的地方:

让我们有 Alice - dApp 所有者
Boob 和 Cooper 是 Alice 的合伙人,Alice-BC DAO 的联合创始人
Neli 是一位需要融资的企业主
银行 - 分发代币的银行

第 1 阶段. 余额初始化

为了在waves测试网络上接收代币,您需要联系 水龙头 并指示要发送令牌的地址。
您可以通过打开帐户详细信息在 IDE 中找到该地址。
我们重点介绍 Bank 10 WAVES。 然后我们检查它们是否通过区块和交易浏览器到达: 浏览器浏览器

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

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

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

我们检查签署交易的 env.SEED 是否与我们的银行匹配:
学习在 RIDE 和 RIDE4DAPPS 上编写 Waves 智能合约。 第 1 部分(多用户钱包)

如果您没有匹配的助记词,只需在“帐户”选项卡中切换到它并再次检查即可。
此后,我们创建、宣布并签署一项用于转让 3 WAVES Alice 的交易。
您还可以通过 env.accounts 变量找到 Alice 的数据。 编号从0开始,所以Alice是env.accounts[1]。
学习在 RIDE 和 RIDE4DAPPS 上编写 Waves 智能合约。 第 1 部分(多用户钱包)

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

也可以在浏览器中观察结果,执行后会立即返回一个链接给我们 交易.

我们确保 Alice 的余额通过 3 WAVES 得到补充,并且银行余额保持在 10 - 3 - 0.01 = 0.699。
学习在 RIDE 和 RIDE4DAPPS 上编写 Waves 智能合约。 第 1 部分(多用户钱包)

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

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

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

补充所有参与者的余额后,我们看到:
学习在 RIDE 和 RIDE4DAPPS 上编写 Waves 智能合约。 第 1 部分(多用户钱包)

第 2 阶段. 创建 dApp 帐户

我们同意爱丽丝将成为去中心化应用程序的创建者和所有者。
转到帐户,将其设置为 SEED 并检查 env.SEED 是否与 Alice 匹配。

让我们尝试在 Alice 的帐户上安装最简单的脚本(合约)。
Waves 中的智能联系人是在某些条件下禁止或允许发生任何类型的传出交易的谓词。 在本例中,此条件为 ALWAYS。 合约代码真实。 调用部署()。

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

每笔 setScript 交易费用 1400000/100000000 = 0.014 WAVES。 Alice 的余额还剩 2.986 WAVES。

现在让我们尝试在 Alice 帐户上安装更复杂的智能合约逻辑,如 例子

Ride4Dapps 现在包括 2 种新的注释类型:

  1. @Callable(i) — 将有关哪个帐户调用/签署交易的数据作为参数 i。 正是这个函数的结果决定了dApp账户状态的变化。 其他帐户可以使用此注释创建交易并执行功能,并更改 dApp 帐户的状态。
  2. @验证者(tx) — 带有交易 tx 参数的交易验证器。 对应于 RIDE 中的谓词逻辑。 正是在这个表达式中,您可以允许或禁止对 dApp 帐户上的智能合约逻辑进行进一步更改。

让我们做 DAPP 帐户作为所有参与者的公共钱包。
学习在 RIDE 和 RIDE4DAPPS 上编写 Waves 智能合约。 第 1 部分(多用户钱包)

要检查您的帐户当前处于活动状态的合约,您可以在区块浏览器中复制智能合约的base64代码并使用反编译器识别它(例如)
学习在 RIDE 和 RIDE4DAPPS 上编写 Waves 智能合约。 第 1 部分(多用户钱包)
学习在 RIDE 和 RIDE4DAPPS 上编写 Waves 智能合约。 第 1 部分(多用户钱包)
学习在 RIDE 和 RIDE4DAPPS 上编写 Waves 智能合约。 第 1 部分(多用户钱包)

我们确保智能合约的逻辑符合我们的预期。
Alice 的余额还剩 2.972 WAVES。

这个 dApp 通过一种机制跟踪每个参与者向共同基金贡献了多少 数据交易 — DataEntry(currentKey, newAmount),其中currentKey是调用存款函数的账户,newAmount是充值余额的值。

Boob 和 Cooper 使用 1 WAVES 向 dApp 账户存款。
学习在 RIDE 和 RIDE4DAPPS 上编写 Waves 智能合约。 第 1 部分(多用户钱包)

我们犯了一个错误,交易没有成功。 因为,尽管我们确信我们是代表 Bob 进行交易,但我们在索引中犯了一个错误,并指出了一个没有智能合约的银行账户。 这里值得注意的一点是——尝试发起交易失败会产生费用 无法删除! Alice 的余额还剩 2.972 WAVES。 鲍勃有 3 波。

Bob 向 dApp 帐户发送了 1 个 WAVES。

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

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

鲍勃还剩 1.99 WAVES。 即Bob支付了0.01 WAVES佣金

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

Alice 的余额上有 2.972 WAVES,现在是 3.972。 Alice 账户上也注册了一笔交易,但 dApp 账户(Alice)没有收取任何佣金。
Cooper也给账户充值后,Alice的余额变成了4.972 WAVES。

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

您可以在“数据”选项卡的区块浏览器中查看谁拥有公共钱包中有多少个 WAVE。

Cooper 改变了将 1 WAVES 留在普通钱包上的想法,并决定撤回一半的亲和力。 为此,他必须调用提现函数。

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

然而,我们又错了,因为提现函数具有完全不同的参数和不同的签名。 在RIDE4DAPPS上设计智能合约时应该注意这一点

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

Cooper 现在的资产负债表上有 2.48 WAVES。 因此,3 WAVES - 1 - 0.01,然后 + 0.5 - 0.01。 因此,每次存款和取款的费用为 0.01 WAVES。 因此,dApps 所有者表中的条目发生如下更改。

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

Bob也决定从共享钱包中提取一些钱,但犯了一个错误,并尝试提取1.5 WAVES。

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

然而,智能合约对这种情况进行了检查。

Xena 是一个骗子,她试图从总账户中提取 1 WAVES。

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

她也没有成功。

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

来源: habr.com

添加评论