ink! 是 Parity 基于 Rust 用来编写 Web Assembly (Wasm) 智能合约的一种编程语言,它刚刚推出了迄今为止最大的更新。Polkadot 和 Substrate 生态中的开发者可以使用 ink! 为 Wasm 虚拟机构建高效、高性能的智能合约和去中心化应用程序,它们是以太坊 (EVM/Solidity) 智能合约的一种替代方案。

Substrate 是构建自定义的 Polkadot 兼容区块链以及“独立”区块链的框架,它包含构建一个典型区块链所需的模块化的组件,使开发者能够更轻松、更快地构建区块链。这些模块化的组件被称为模块(pallets)。Substrate 的模块库包括“合约”模块,它允许开发者将基于 Wasm 的智能合约功能构建到他们的区块链中。ink! 是 Rust 编程语言的扩展,它允许开发者为使用合约模块的区块链编写智能合约。

这是最新版本的 ink!,重写了 ink! 2.0 的所有主要组件!在此期间,许多团队在使用 ink! 构建 Wasm 智能合约,也感谢他们的贡献和反馈,ink! 3.0 比以前的版本有了很大的发展。

除了发布了 ink 3.0 版本,我们还改进了合约模块(Contracts pallet)以提高平行链性能,并添加了一些新功能以提高跨合约调用和性能提升,使开发者更容易编写更复杂的逻辑。最后,随着 `cargo-contract` 1.0 的发布,开发者使用的工具也发生了一些变化。

为什么使用 Rust 和 Wasm?

在 Parity,我们是 Rust 的忠实粉丝,并用它编写了 Polkadot 的最初实现。Rust 是一种进阶且高效的编程语言,它优先考虑正确性并有助于防止软件错误;同时它有一个强大的社区,并得到了 Mozilla、谷歌、微软和亚马逊等大公司的支持。

使用 Rust 作为 ink! 的基础为我们提供了严格的 Rust 编译器的正确性保证,它让我们可以免费利用 Rust 生态系统中发生的所有改进。这些改进包括从更好的编译器优化到非常有用的第三方库。在此处了解有关 Rust 非常适合智能合约的更多信息。https://paritytech.github.io/ink-docs/why-rust-for-smart-contracts

Wasm 是另一种在 Polkadot 设计中发挥关键作用的技术,原因有几个。Wasm 快速、安全、轻量级、高性能且执行效率高,构建时尽可能接近原生代码(Machine Code)。它可以在网络浏览器中执行,从而促进为用户体验而设计的去中心化应用程序的创新和更广泛的使用。Wasm 已经有非常广泛的使用,这点对我们有非常大的优势,同时还能享有大公司的高水平使用,并且拥有庞大的开发者社区。这也使我们能够获得编译器改进和整个生态工具的所有好处,而这些工具只会随着时间的推移而增长。

Wasm 扩展了可以编写智能合约的语言数量,包括 Go、C/C++,当然还有 Rust。它提供了所有好处,我们相信 Wasm 代表了智能合约基础设施和应用程序的未来,并且代表了对上一代系统的改进。

在此处了解有关 Wasm 为何非常适合智能合约的更多信息。https://paritytech.github.io/ink-docs/why-webassembly-for-smart-contracts

ink! 3.0

ink! 3.0 背后的主要思想是它的外观和感觉就像 Rust。ink! 语法略有变化,以更好地从 ink! 映射生成 Rust 代码。用户看到的也就是由 ink! 生成的内容。现在,语法与 Rust 编程语言几乎相同。这具有所有 Rust 开发者都知道和喜爱的开箱即用的工具优势 —— 例如 rust-analyzer 和 Clippy。

除了感觉像 Rust 之外,让我们来看看 ink! 3.0 最显着的变化:

特征支持(Trait Support ):ink! 3.0 最令人期待的功能之一是它的 Rust trait 支持,最好的一个描述就是提供了更 Rusty 的开发体验。通过新的 `#[ink::trait_definition]` 程序宏,现在可以定义你自己的特征定义,然后可以通过 ink! 智能合约实现。这允许为不同的具体实现定义共享的智能合约接口。这对定义社区定义的合约标准很有用。注意这个 ink! trait 定义可以在任何地方定义,甚至在另一个 crate 中!减少合约规模:较小的合约规模意味着更好的性能和更少的 gas 成本。以前的 ink! 生成的智能合约的 Wasm 代码量很大,这导致平行链交易吞吐量受到带宽而不是计算复杂度的限制。在许多考虑减少智能合约大小的解决方案中,有一个是减少编译合约的大小。委托调用:`delegate_call` 的添加允许合约将他们收到的调用转发到另一个合约。一个用例是为智能合约实施代理升级模式。链扩展:此功能允许开发者从他们的合约中直接调用 Substrate 模块,从而使他们能够利用 Substrate 的丰富生态。

cargo-contract 1.0

与 ink! 3.0 一起发布的还有 `cargo-contract` 1.0。`cargo-contract` 是一个方便的开发者工具,用于构建、测试和部署 ink! 合约。此版本中的一些值得注意的更新包括:

用于与链上合约交互的新 CLI 命令:上传、实例化和调用!这意味着用户不再需要点击浏览器 UI 来与链上的合约进行交互,他们现在也可以使用命令行。这也为编写脚本和持续集成铺平了道路。ink! 智能合约的 linting 规则:通过自动检查源代码中的程序和风格错误,ink! 开发者会收到有关常见错误的警告。未来我们会陆续构建 ink! 合约的 linting 规则集合!我们想做的是指导你降低 gas 成本、减少合约足迹、正确的 API 使用模式和指出安全漏洞的规则。

Substrate 合约模块

合约模块(Contracts pallet)是 Substrate 用于 Wasm 智能合约的执行环境。只要合约模块 API 被实施,它可以用任何编译成 Wasm 的编程语言执行智能合约。ink! 是一种为 Rust 执行此操作的语言。

先前版本的模块使用状态租金作为应对状态膨胀的机制。在最新的迭代中,状态租金被自动收取押金所取代。以前,合约需要确保始终有足够的余额来支付其存储费用。否则,它将处于禁用状态,直到有人将其恢复。这为合约编写过程增加了许多额外的工作和考虑。

在“自动收取”的机制下,该费用由合约调用方自动支付,而不是由合约本身支付。合约的调用者向每个合约支付一笔押金,在这些合约中,由于执行调用而创建了新的存储空间。同样,调用者从调用删除存储的所有合约中获得退款。

这个新系统完全消除了合约被设置为非活动状态的可能性。但是,合约作者仍然希望尽可能少地使用存储空间,并在不再需要存储空间时创建移除存储空间的方法,以降低使用合约的成本。

感谢 ink! 社区

历经多年和多次的发布,ink! 已经发展到看起来和感觉起来很像 Rust 的目标。在这个阶段,它具有 Rust 程序员认可和需要进一步增强他们编写、更新和推理复杂智能合约的能力的所有功能。虽然 ink! 现在是一种综合性语言,它仍然是一种正在开发的语言,最重要的是,它是一个以社区为中心的项目。

感谢 ink! 社区的贡献,ink! 已经发展成为一种满足我们共同未来需求的语言。

关注未来发展

你还在等什么?来看看 ink! 发生了什么和你喜欢 ink! 的什么地方!

对于有兴趣了解构建 Wasm 智能合约的更多信息的开发者,请查看 2022 年 5 月 31 日由社区组织的首届 Wasm 智能合约会议。https://wasm-conference.com/

定期更新:https://github.com/paritytech/ink/blob/master/MONTHLY_UPDATE.mdink! 存储库:https://github.com/paritytech/inkink! 入门教程:https://docs.substrate.io/tutorials/v3/ink-workshop/pt1ink! 进阶文档:https://paritytech.github.io/ink-docsink! 视频:https://youtu.be/wbai4Do_TVY, https://youtu.be/NrG3co6UWEg?t=7102

在 substrate.dev 了解 Substrate 生态系统,订阅 Substrate 开发者邮件 https://substrate.io/ecosystem/connect/newsletter/,加入 Substrate 每周的社区电话 https://substrate.io/ecosystem/resources/seminar/。

原文链接:https://www.parity.io/blog/ink-3-0-paritys-rust-based-language-gets-a-major-update

翻译:PolkaWorld 社区

PolkaWorld Telegram 群:t.me/polkaworldPolkaWorld Youtube 频道:https://www.youtube.com/c/PolkaWorldPolkaWorld Twitter:@polkaworld_orgPolkaWorld 网站:https://polkaworld.pro/