#edsl #parity #blockchain #parity-wasm #wasm

无标准库 ink_storage_derive

[ink!] 常用 ink_storage 定义的特性宏

17个版本 (7个稳定版本)

4.0.0-alpha.12022年8月24日
3.4.0 2022年10月21日
3.3.1 2022年8月9日
3.3.0 2022年6月22日
3.0.0-rc22020年10月22日

#37 in #parity-wasm

Download history 201/week @ 2024-03-11 125/week @ 2024-03-18 134/week @ 2024-03-25 267/week @ 2024-04-01 141/week @ 2024-04-08 195/week @ 2024-04-15 178/week @ 2024-04-22 159/week @ 2024-04-29 145/week @ 2024-05-06 131/week @ 2024-05-13 138/week @ 2024-05-20 139/week @ 2024-05-27 124/week @ 2024-06-03 113/week @ 2024-06-10 168/week @ 2024-06-17 136/week @ 2024-06-24

553 每月下载量
用于 25 个包 (通过 ddc_bucket)

Apache-2.0

105KB
1.5K SLoC

ink!

Parity 的 ink! 用于编写智能合约

linux codecov coveralls loc stack-exchange

squink, the ink! mascotink! 是一个用于在 Rust 中为基于 Substrate 框架的区块链编写智能合约的 嵌入式领域特定语言 (eDSL)。ink! 合约编译为 WebAssembly。


初学者指导教程  •   ink! 文档门户  •   开发者文档


更多相关链接

目录

玩法

如果您想建立本地环境,可以使用我们的substrate-contracts-node进行快速入门。这是一个简单的Substrate区块链,其中包含用于智能合约功能的Substrate模块——contracts分页(有关更多信息,请参阅工作原理)。

我们还在Rococo上有一个名为Canvas的实时测试网。Canvas是一个基于Substrate的平行链,它支持ink!智能合约。有关使用此测试网的进一步说明,请参阅我们的文档

对于这两种类型的链,可以使用合约UI将合约实例化到链上并与之交互。

用法

编译智能合约的前提是已安装Rust和Cargo。以下是安装指南

我们还建议安装cargo-contract。这是一个CLI工具,可以帮助设置和管理使用ink!编写的WebAssembly智能合约。

cargo install cargo-contract --force

使用--force确保您已更新到最新的cargo-contract版本。

要初始化新的ink!项目,可以使用

cargo contract new flipper

这将创建一个位于您的工作目录中的flipper文件夹。文件夹包含一个脚手架Cargo.toml和一个lib.rs,它们都包含使用ink!所需的所有构建块。

lib.rs包含我们的hello world合约——Flipper,我们将在下一节中进行解释。

要构建合约,只需在flipper文件夹中执行此命令

cargo +nightly contract build

结果,您将在合约的target文件夹中获得一个文件flipper.wasm文件,一个metadata.json文件和一个文件。该文件将Wasm和元数据合并到一个文件中,在实例化合约时需要使用。

你好,世界!—— 翻转器

Flipper合约是一个简单的合约,只包含一个bool值。它提供以下方法:

  • 将值从true翻转到false(反之亦然)
  • 并返回当前状态。

下面是使用ink!的ink_lang版本的代码。

use ink_lang as ink;

#[ink::contract]
mod flipper {
    /// The storage of the flipper contract.
    #[ink(storage)]
    pub struct Flipper {
        /// The single `bool` value.
        value: bool,
    }

    impl Flipper {
        /// Instantiates a new Flipper contract and initializes
        /// `value` to `init_value`.
        #[ink(constructor)]
        pub fn new(init_value: bool) -> Self {
            Self {
                value: init_value,
            }
        }

        /// Flips `value` from `true` to `false` or vice versa.
        #[ink(message)]
        pub fn flip(&mut self) {
            self.value = !self.value;
        }

        /// Returns the current state of `value`.
        #[ink(message)]
        pub fn get(&self) -> bool {
            self.value
        }
    }

    /// Simply execute `cargo test` in order to test your contract
    /// using the below unit tests.
    #[cfg(test)]
    mod tests {
        use super::*;
        use ink_lang as ink;

        #[ink::test]
        fn it_works() {
            let mut flipper = Flipper::new(false);
            assert_eq!(flipper.get(), false);
            flipper.flip();
            assert_eq!(flipper.get(), true);
        }
    }
}

在我们的示例文件夹中,flipper/src/lib.rs文件包含这段代码。运行cargo contract build来构建您的第一个ink!智能合约。

示例

examples文件夹中,您可以找到许多ink!编写的示例。

其中一些最有趣的示例

  • delegator — 实现跨合约调用。
  • trait-erc20 — 定义了 Erc20 合约的特质并实现了它。
  • erc721Erc721 NFT 代币的示例实现。
  • dns — 一个简单的 DomainNameService 智能合约。
  • ……还有更多,只需在文件夹中翻找一下 🙃。

要构建单个示例,请导航到示例的根目录并运行

cargo contract build

现在你应该在合约的 target 文件夹中有一个 <name>.contract 文件。

有关如何将此文件上传到链的信息,请参阅 Play with It 部分,或我们的 智能合约研讨会

工作原理

  • Substrate 的 模块化实体运行时聚合框架 (FRAME) 包含一个模块,该模块实现了智能合约需要的典型功能的 API(存储、查询账户信息等)。这个模块被称为 contracts 模块,
  • contracts 模块要求将智能合约作为一个 Wasm 块上传到区块链。
  • ink! 是一种针对 contracts 暴露的 API 的智能合约语言。因此,ink! 合约被编译为 Wasm。
  • 当执行 cargo contract build 时,将创建一个额外的文件 metadata.json。它包含有关合约提供哪些方法供他人调用的信息。

ink!宏和属性概述

入口点

在用 #[ink::contract] 注释的模块中,这些属性可用

属性 适用范围 描述
#[ink(storage)] struct 定义上。 定义 ink! 存储结构。每个合约中只能有一个 ink! 存储定义。
#[ink(message)] 适用于方法。 将 ink! 存储结构的方法标记为消息,使其可用于 API 调用合约。
#[ink(constructor)] 适用于方法。 将 ink! 存储结构的方法标记为构造函数,使其可用于 API 实例化合约。
#[ink(event)] struct 定义上。 定义 ink! 事件。合约可以定义多个此类 ink! 事件。
#[ink(anonymous)] 适用于 ink! 事件。 告诉 ink! codegen 将 ink! 事件视为匿名,在发出时省略事件签名作为主题。与 Solidity 中的匿名事件非常相似。
#[ink(topic)] 适用于 ink! 事件字段。 告诉 ink! codegen 为给定字段提供主题散列。ink! 事件只能有有限数量的此类主题字段。与 Solidity 中索引事件参数的语义类似。
#[ink(payable)] 适用于 ink! 消息。 允许在 ink! 消息调用中接收值。ink! 构造函数是隐式可支付的。
#[ink(selector=S:u32)] 适用于 ink! 消息和 ink! 构造函数。 指定标记实体的具体调度选择器。这允许合约作者精确控制其 API 的选择器,使得在不破坏的情况下重命名他们的 API 成为可能。
#[ink(selector= _)] 适用于 ink! 消息。 指定当没有其他ink!消息与选择器匹配时调用的回退消息。
#[ink(命名空间=N:字符串)] 适用于ink!特性行为块。 更改特性行为内所有ink!消息和ink!构造函数的结果选择器。允许在具有重叠消息或构造函数名称的特性行为之间消除歧义。请谨慎使用并仔细考虑!
#[ink(实现)] 适用于ink!实现块。 告诉ink!代码生成器,某些实现块应被授权访问ink!内部,即使它不包含任何ink!消息或ink!构造函数。

有关这些的更详细描述以及有关#[ink::contract]宏的详细信息,请参阅此处

特性定义

使用#[ink::trait_definition]来定义您自己的特性行为定义,然后ink!智能合约可以对其进行实现。例如,请参阅examples/trait-erc20合约以了解如何使用它或参阅文档以获取详细信息。

链下测试

#[ink::test]过程宏启用链下测试。例如,请参阅examples/erc20合约以了解如何使用这些或参阅文档以获取详细信息。

开发者文档

我们有一个非常全面的文档门户,但如果您正在寻找有关crate级别的文档本身,则以下是一些相关的链接

crate 文档 描述
ink_lang ink!公开的语言特性。有关您可以在#[ink::contract]中使用属性的详细描述,请参阅此处
ink_storage ink!中可用的数据结构。
ink_env 与智能合约Wasm执行器交互的低级接口。包含链下测试API
ink_prelude 用于访问alloc crate类型的no_std和std的通用API。

社区徽章

常规设计

Built with ink!

[![Built with ink!](https://raw.githubusercontent.com/paritytech/ink/master/.images/badge.svg)](https://github.com/paritytech/ink)

平面设计

Built with ink!

[![Built with ink!](https://raw.githubusercontent.com/paritytech/ink/master/.images/badge_flat.svg)](https://github.com/paritytech/ink)

贡献

有关更多信息,请访问我们的贡献指南

使用位于scripts/check-*目录下的脚本,以便对工作区或所有示例运行检查。请在提交PR之前进行此操作。

许可证

此存储库中的所有代码均受Apache License 2.0许可。

如果您对我们产品的许可有任何疑问,请联系我们

依赖关系

~1.5MB
~37K SLoC