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

no-std ink_storage_traits

[ink!] 定义了使用 ink 存储的 traits

16 个版本 (7 个稳定版)

5.0.0 2024 年 3 月 11 日
5.0.0-rc.22024 年 2 月 28 日
5.0.0-rc2023 年 11 月 30 日
4.3.0 2023 年 8 月 24 日
4.0.0-beta2022 年 11 月 22 日

#470 in 魔法豆

Download history 1480/week @ 2024-04-14 1848/week @ 2024-04-21 1129/week @ 2024-04-28 1617/week @ 2024-05-05 1956/week @ 2024-05-12 1838/week @ 2024-05-19 1054/week @ 2024-05-26 2260/week @ 2024-06-02 1094/week @ 2024-06-09 1470/week @ 2024-06-16 1540/week @ 2024-06-23 1171/week @ 2024-06-30 871/week @ 2024-07-07 1076/week @ 2024-07-14 1391/week @ 2024-07-21 1189/week @ 2024-07-28

4,574 每月下载量
用于 51 个 crate (2 个直接使用)

Apache-2.0

125KB
1.5K SLoC

ink!

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

linux codecov coveralls loc stack-exchange

squink,ink! 的吉祥物ink! 是一个用于在基于 Substrate 框架的区块链上编写 Rust 智能合约的 eDSL。ink! 合约编译成 WebAssembly。


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


更多相关链接

目录

玩转ink!

开始的最佳方式是查看我们的文档中的入门页面。

如果您想进行本地设置,可以使用我们的substrate-contracts-node快速入门。这是一个简单的Substrate区块链,包含智能合约功能的Substrate模块——contracts组件(更多信息请见工作原理)。

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

可以使用Contracts UI将合约实例化到链上并与之交互。

用法

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

我们还建议安装cargo-contract。它是一个命令行工具,有助于设置和管理用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 contract build

结果,您将在合约的target文件夹中得到一个target/flipper.wasm文件,一个flipper.json文件和一个<contract-name>.contract文件。该.contract文件将Wasm和元数据合并到一个文件中,并在实例化合约时使用。

你好,世界!- 翻转器

Flipper合约是一个简单的合约,仅包含一个bool值。

它提供了以下方法

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

下面您可以看到使用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::*;

        #[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!编写的示例。

其中一些最有趣的

  • basic_contract_ref - 实现跨合约调用。
  • trait-erc20 - 定义了Erc20合约的特质并实现了它。
  • erc721 - Erc721 NFT代币的示例实现。
  • dns - 一个简单的DomainNameService智能合约。
  • …还有更多,只需翻阅文件夹即可 🙃。

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

cargo contract build

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

有关如何将此文件上传到链的信息,请参阅动手玩一玩部分或我们的智能合约工作坊

工作原理

  • Substrate的模块化实体运行时聚合框架(FRAME)包含一个模块,该模块实现了一个API,该API为智能合约需要的一些典型函数(存储、查询账户信息等)提供支持。这个模块被称为contracts
  • contracts模块要求智能合约以Wasm blob的形式上传到区块链。
  • ink!是一种针对contracts暴露的API的智能合约语言。因此,ink!合约被编译为Wasm。
  • 当执行cargo contract build时,会创建一个额外的文件<contract-name>.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!代码生成器将ink!事件视为匿名事件,在发射时省略事件签名作为主题。这与Solidity中的匿名事件非常相似。
#[ink(signature_topic= _)] 适用于ink!事件。 指定事件的自定义签名主题,允许手动指定共享事件定义。
#[ink(topic)] 适用于ink!事件字段。 告诉ink! codegen为给定的字段提供主题哈希。每个ink!事件只能有有限数量的此类主题字段。与Solidity中索引事件参数的语义相似。
#[ink(payable)] 适用于ink!消息。 允许在ink!消息的调用中接收值。ink!构造函数隐式为payable。
#[ink(selector=S:u32)] 适用于ink!消息和ink!构造函数。 指定一个具体的派发选择器,用于标记实体。这允许合约作者精确控制他们API的选择器,使得在不破坏的情况下重命名他们的API成为可能。
#[ink(selector= _)] 适用于ink!消息。 指定一个回退消息,如果没有任何ink!消息与选择器匹配,则调用该回退消息。
#[ink(namespace=N:string)] 适用于ink!特性实现块。 更改特性实现中所有ink!消息和ink!构造函数的生成选择器。允许区分具有重叠消息或构造函数名称的特性实现。请谨慎使用并仔细考虑!
#[ink(impl)] 适用于ink!实现块。 告诉ink! codegen某些实现块即使不包含任何ink!消息或ink!构造函数也应有权限访问ink!内部。

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

特质定义

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

链外测试

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

开发者文档

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

crate 文档 描述
ink ink!暴露的语言功能。有关您可以在#[ink::contract]中使用属性的详细描述,请参阅这里
ink_storage ink!中可用的数据结构。
ink_env 与智能合约Wasm执行器交互的底层接口。包含链下测试API
ink_prelude 用于访问alloc crate类型的通用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.7–3MB
~61K SLoC