总览
本页会对 Substrate 智能合约作概略的描述。
虚拟机
FRAME 提供两台智能合约虚拟机,可以添加到你的 Substrate Runtime 中。
合约 (Contracts) 模块
The FRAME Contracts pallet provides functionality for the runtime to deploy and execute WebAssembly smart-contracts. 它是在当前智能合约平台的基础上进行迭代设计的。
EVM 模块
FRAME EVM 模块 提供了一个 EVM 执行环境,允许 Substrate 区块链执 EVM 合约代码而无须修改代码。 它在 Substrate Runtime 中尽可能的模拟以太坊主网执行合约而设计的。
自定义
Substrate 是一个完全没有任何条条框框限制的平台。
我们鼓励在 Substrate Runtime 之上进一步开发其他智能合约平台。 使用这些预构模块来了解如何设计自己的系统或通过的现有系统来在 Substrate 链中工作。
智能合约语言
ink!
ink! 是一个基于 Rust 的 eDSL,专用于编写 Contracts 模块 的 Wasm 智能合约。 它的设计宗旨是正确性、简洁性、和高效性。
智能合约与 Runtime 开发的关系
Substrate Runtime 开发和 Substrate 智能合约是使用 Substrate 框架来构建 "去中心化应用" 的两种不同途径。
智能合约
传统的智能合约平台允许用户在核心区块链逻辑之上发布额外的逻辑。 由于任何人(包括恶意参与者和缺乏经验的开发者)都可以发布智能合约逻辑,这些公共智能合约平台上内建了许多刻意设计的安全防护手段。
以下是一些例子:
- Fees: 确保合约开发者因执行智能合约而被占用的计算和存储资源付费,这样出块节点的资源就不会被他们滥用。
- 沙箱: 一个合约无法直接修改核心区块链存储或其他合约的存储。 它的作用是限制合约只能修改自己所拥有的状态,且只能向其它合约或 Runtime 函数发起外部调用。
- 状态租赁:合约会因为占用了区块链的空间而需要为其付费。 这确保人们不会从 “免费、无限的存储” 中获利。
- 回滾:合约可能有导致逻辑错误的情况。 我们对合约开发者开发能力的期望很低,因此我们增加了额外的开销,以支持在交易失败时回滚整个交易。这样,在出错时不会更改任何状态。
这些不同的开销使得智能合约运行得更慢、更昂贵,但是合约开发的 “目标受众” 与 Runtime 开发者的不同。
合约可以让你的社区在你的 Runtime 逻辑上扩展和开发,无需处理各种令人发疯的提案、Runtime 升级等等。 它甚至可以作为未来的 Runtime 变更的测试基础,将你的网络隔离于日后可能发生因成长产生的痛楚或错误。
总而言之,Substrate 智能合约:
- 对网络来说是天生安全的。
- 通过经济激励来防止滥用。
- 通过额外的计算开销来支持错误处理。
- 开发门槛更低。
- 通过试验场使得社区快速互动以创建新的逻辑。
Runtime 开发
与智能合约相反,Runtime 开发不向开发者提供智能合约所提供的那些保护或安全措施。 作为 Runtime 开发者,你编写代码的门槛会上升到一定高度。
您可以完全控制网络上每个节点运行的基本逻辑。 您具有修改和控制所有模块的每一个存储条目的完整权限。 甚至可以用错误的逻辑或糟糕的错误处理代码来砸你自己的区块链。
Substrate Runtime 开发的目的是为区块链提供精炼、高性能、和快速的节点。 它不提供任何保护,不提供交易回退的开销, 也不隐式地引入区块链上节点运行的收费系统。 这意味着当您开发 Runtime 功能时, 你 必须在 Runtime 逻辑的各部分都正确地评估和收取手续费,才能使作恶者无法滥用并伤害你的网络。
总而言之,Substrate runtime 开发:
- 提供对整个区块链的底层访问权限。
- 没有内置安全措施的性能开销。
- 开发者需要逾越一定的门槛。
- 不一定要懂编写可用的代码,但必须避免写有缺陷的代码。
- 没有任何原生的经济激励机制来抵御作恶。
合您用的工具
Substrate Runtime 开发和 Substrate 智能合约都是提供给你解决问题的工具。
在二者各自能够解决的问题种类方面可能有一些重叠之处,但是也有一些明确的情况只适合其中一个。 以下每个类别举一个例子:
- Runtime 开发:在区块链中的交易之上建立一个隐私层。
- 二者都可以:构建一个可能需要建立用户社区的游戏 dApp (但倾向于使用智能合约), 或者可能需要处理每天数百万交易的规模 (但倾向于使用 Runtime 开发)。
- 智能合约:为您的区块链代币引入多重签名钱包。
除了上面写的所有内容,您还需要考虑到使用某个工具来计算创建一个 dApp 所需的成本。 部署合约是一个相对简单和容易的过程,因为你可以利用现有的网络。 唯一的成本是部署和维持合约而支付的费用。
设立自己的区块链的成本还包括构建一个可以让人发现其服务价值的社区,或者建立私有网络的云计算和日常网络维护的开销。
很难就每一种可能的情况提供直接指导,但使用下面的表格来帮助您进行决策,根据不同情形使用不同的工具:
Runtime 开发 | 二者均可 | 智能合约 |
---|---|---|
|
|
|
后续步骤
进一步学习
- 查看 Substrate 合约模块 如何在现行智能合约基础上进行迭代。
- 检查 EVM 模块 以查看你的下一个项目是否需要它。
- 阅读关于 ink! 智能合约语言。
例子
- 按照 教程,将合约模块添加到你的 FRAME Runtime 中。
- 学习如何 使用合约模块和 ink! 进行开发。
参考文档
- Visit the reference docs for the Contracts pallet.
- View source code and documentation of the EVM module.
- 查看 ink! 代码库。