plutus

Plutus教程:#12 最佳实践

12. 智能合约最佳实践 以下是使用 Plutus 开发智能合约时应遵循的一些通用最佳实践。 12.1 了解智能合约的目标 确切地知道您的智能合约应该做什么并对其进行测试以确保它实现预期目标。 12.2 检查以前的类似合同是否存在 做同样事情的合同是否已经存在?如果是这样,你的智能合约有什么不同? 12.3 命名 为您的智能合约选择一个清晰而有意义的名称。保持简短,并尝试使用名称来传达合同的作用。 12.4 代码同行评审 代码审查的好处众所周知;审查的代码导致整个项目的一致性、无缺陷和针对性能优化的代码。代码知识在开发人员之间共享,减少了未来的维护时间和成本。对于智能合约,正确性绝对是至关重要的。 12.5 在测试网上测试 在主网上运行之前,您应该始终在测试网环境中测试您的智能合约。编写尽可能多的测试场景并运行多次测试迭代。 12.6 记录测试用例 保留您运行的测试用例的列表,以便您拥有它们以供参考和验证。 12.7 考虑正式验证 形式验证的主题太大,无法在此处充分涵盖。您可以假设您的代码将在敌对环境中运行,在该环境中,技术娴熟、资源丰富且不择手段的参与者将等待突袭任何漏洞。

Continue reading

Plutus教程:#9 抵押机制

9. 关于抵押机制 alonzo 在卡尔达诺开启了智能合约时代。抵押机制是一项重要功能,旨在确保智能合约的成功执行。依靠 Alonzo 分类账的确定性设计提供的保证,Cardano 实现了两阶段验证方案。引入两阶段验证的主要原因是限制节点未补偿的验证工作量。每个阶段都为实现这一目标服务: 第一阶段检查交易是否正确构造,是否可以支付其处理费 第二阶段运行交易中包含的脚本 如果事务是第 1 阶段有效,则运行第 2 阶段脚本。如果第 1 阶段失败,则不会运行任何脚本,并立即丢弃该事务。抵押品用于保证在第 2 阶段验证失败的情况下节点的工作得到补偿。因此,抵押品是用户提供的货币保证,以确保合约经过精心设计和彻底测试。抵押金额在构建交易时指定。不是直接,而是通过向交易添加抵押品输入。与这些特别标记的输入对应的 UTXO 中的总余额是交易的抵押品金额。如果用户满足担保条件,并且合约得到执行,则抵押品是安全的。 9.1 场景 没有抵押品,如果智能合约失败,则不会向用户收费。然而,当交易失败时,网络已经产生了一些成本来启动和验证交易。这意味着恶意行为者可以用无效交易淹没网络,以很少的成本拒绝向其他用户提供服务。 9.2 解决方案 当用户发起交易时,他们会提交足够的 ada 来支付其执行成本。在 Alonzo 中,调用和使用非本地智能合约(称为阶段 2 合约)的交易也需要足够的抵押品来支付与潜在交易失败相关的成本。这个数量可能很小,但足以使拒绝服务 (DOS) 攻击的成本高得令人望而却步。仅当交易未通过验证时才会收取抵押费用。如果合约通过验​​证,则收取交易费用,但不收取抵押品。 9.3 推理 诚实的用户永远不会面临失去抵押品的风险。Cardano 区块链在交易成本方面是确定性的,因为这些成本仅取决于本地价值和本地状态。这意味着用户可以在提交交易之前计算交易的执行成本(以 ada 为单位)。此功能不同于其他区块链,包括以太坊,其他网络活动会影响 gas 成本。所需的抵押品数量仅取决于执行成本。Cardano 测试网提供了一个安全的环境和免费的测试 ada,因此分布式应用程序 (DApp) 开发人员可以在部署到主网之前彻底测试他们的智能合约。如果测试网上的交易成功,开发人员可以完全确定所有脚本确实会成功。如果自交易构建以来链上条件发生变化,则该交易将被完全拒绝,并且不会收取任何费用。例如,如果缺少签名,则不会收取任何抵押品。 9.4 技术细节 抵押品一词是指抵押品输入所引用的 UTXO 中包含的总 ada。如果第 2 阶段脚本失败,则交易使用抵押品输入来支付其费用。Shelley 正式规范引入了“多重签名”脚本的概念。诸如此类的第一阶段脚本完全由分类帐规则捕获。因此,可以在实施处理之前轻松评估执行成本,并且可以根据包含脚本的交易大小直接在分类账规则实施中计算任何费用。相比之下,阶段 2 脚本可以执行任意(原则上,图灵完备)计算。我们要求使用第 2 阶段脚本的事务在许多抽象 ExUnit 方面有一个预算。该预算根据许多特定指标(包括内存使用或抽象执行步骤)给出了资源使用的定量限制。然后将预算用作交易费用计算的一部分。 以上摘自 Alonzo 网络的正式规范。有关更多详细信息,请阅读 Plutus Core 的 Cardano 分类帐规范。

Continue reading