17个版本 (7个稳定版)
4.0.0-alpha.1 | 2022年8月24日 |
---|---|
3.4.0 | 2022年10月21日 |
3.3.1 | 2022年8月9日 |
3.3.0 | 2022年6月22日 |
0.0.0 |
|
2858 在 魔法豆
555 每月下载量
在 23 个crate中使用(21个直接使用)
565KB
8K SLoC
更多相关链接
- Substrate Stack Exchange — 回答ink!问题的论坛
cargo-contract
— ink! 合约的CLI工具- Contracts UI — 合约实例化和交互的前端
- Substrate Contracts Node — 简单的包含智能合约功能的 Substrate 区块链
- 我们在 Matrix 和 Discord(在
ink_smart-contracts
频道)发布公告。
目录
玩转它
如果您想进行本地设置,可以使用我们的 substrate-contracts-node
快速入门。它是一个简单的 Substrate 区块链,包含 Substrate 智能合约功能模块 —— contracts
库(有关更多信息,请参阅 如何工作)。
我们还在 Rococo 上有一个名为 Canvas 的实时测试网。Canvas 是一个基于 Substrate 的并行链,支持 ink! 智能合约。有关使用此测试网的进一步说明,请参阅 我们的文档。
对于这两种类型的链,可以使用 Contracts 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
文件夹中获得一个文件 target/flipper.wasm
,一个 metadata.json
文件和一个 <contract-name>.contract
文件。该 .contract
文件将 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
合约的 trait 并实现了它。erc721
——Erc721
NFT 代币的示例实现。dns
—— 一个简单的DomainNameService
智能合约。- ……还有更多,只需翻阅文件夹即可 🙃。
要构建单个示例,请导航到示例的根目录并运行
cargo contract build
现在您应该在合约的 target
文件夹中有一个 <name>.contract
文件。
有关如何将此文件上传到链的信息,请参阅玩转它部分或我们的智能合约工作坊。
它是如何工作的
- Substrate 的 模块化实体运行时聚合框架 (FRAME) 包含一个模块,该模块实现了智能合约所需的典型函数的 API(存储、查询账户信息等)。此模块称为
contracts
链模块, contracts
链模块要求智能合约以 Wasm blob 的形式上传到区块链。- 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 |
无_std和std访问alloc crate类型的通用API。 |
社区徽章
常规设计
[![Built with ink!](https://raw.githubusercontent.com/paritytech/ink/master/.images/badge.svg)](https://github.com/paritytech/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许可。
如果您对我们产品的许可有任何疑问,请联系我们。
依赖关系
~3.5–5.5MB
~104K SLoC