#smart-contracts #blockchain #brushfam #ink #wasm

no-std openbrush

适用于 ink! 的智能合约开发 OpenBrush 库!

6 个版本 (稳定)

4.0.0-beta2023 年 9 月 15 日
3.2.0 2023 年 9 月 15 日
2.2.0 2022 年 7 月 23 日
2.1.0 2022 年 6 月 23 日
1.8.0 2022 年 5 月 27 日

#124 in 神奇豆子

每月下载量 44

MIT 许可证

355KB
5.5K SLoC

Logo

📢 📢 📢 我们非常高兴地宣布 Patron,它将智能合约验证功能引入 Polkadot 生态系统。 📢 📢 📢

智能合约验证确保 dApp 和区块链平台的安全、可靠和可信。使用 Patron,您可以简化部署流程,管理您的构建,并使 Polkadot 生态系统更加安全和透明。


换句话说,Patron 是一个一站式合约平台,允许您在隔离环境中构建和验证 ink! 智能合约,探索合约验证细节。

重要!

OpenBrush

Docs telegram chat element chat discord chat

OpenBrush 由 Brushfam 团队维护,旨在使 ink! 开发更快、更安全、更简单。我们计划将 OpenBrush 的大多数功能集成到 ink! 中。OpenBrush 提供包含常见问题解答部分的文档。

如果您对 OpenBrush 有任何疑问,您可以加入 Brushfam Element 频道 来寻找答案并结识其他 ink! 智能合约开发者,或者通过上面的链接在 Element、Discord 或 Telegram OpenBrush 频道中提问有关 ink! 开发的问题。

摘要

OpenBrush 是 ink! 上的智能合约开发库。

为什么使用这个库?

  • 为了使合约具有 互操作性,以便进行 安全的跨合约调用(通过在每份合约中具有相同的函数签名)
  • 确保使用 Polkadot 标准提案
  • 确保使用最新的、最安全的实现
  • 有用的合约,提供要在合约中实现的自定义逻辑
  • 通过不编写样板代码来 节省时间
  • 有用的功能,可以简化开发
  • 所有合约默认可升级

它提供哪些标准代币和有用的合约?

  • PSP22 - 具有扩展功能的可替换代币(ERC20等效
  • PSP34 - 具有扩展功能的非可替换代币(ERC721等效
  • PSP37 - 具有扩展功能的ERC1155等效
  • 可拥有 限制非所有者对动作的访问
  • 访问控制 定义角色集并限制角色对动作的访问
  • 重入保护 防止对函数的重入调用
  • 可暂停 暂停/恢复合约以禁用/启用某些操作
  • 定时锁控制器 延迟执行交易
  • 支付分割器 在参与者之间分割原生代币的数量

ink! 特性中的默认实现

您可以在特性方法中提供默认实现并具有内部函数。您可以将ink! 特性作为具有几个关于外部函数(标记为#[ink(message)])的限制的本地Rust特性使用。

#[openbrush::trait_definition]
pub trait Governance: AccessControl {
    #[ink(message)]
    fn execute(&mut self, transaction: Transaction) -> Result<(), GovernanceError> {
        self.internal_execute(transaction)
    }

    fn internal_execute(&mut self, transaction: Transaction) -> Result<(), GovernanceError> {
        ...
    }
}

修改器

Solidity智能合约提供了修改器来限制对某些预定义参数的函数调用。OpenBrush提供了属性宏来使用标准化修改器。您可以使用我们的有用合约作为修改器,或定义您自己的修改器。

// Before execution of `mint` method, `only_owner` should verify that caller is the owner.
#[ink(message)]
#[modifiers(only_owner)]
fn mint(&mut self, ids_amounts: Vec<(Id, Balance)>) -> Result<(), PSP37Error> {
  self._mint_to(Self::env().caller(), ids_amounts)
}

特性包装器

您只需要一个特性定义(您不需要直接实现该特性的合约)就可以从网络中的某个合约调用该特性的方法(进行跨合约调用)。

// Somewhere defined trait
#[openbrush::trait_definition]
pub trait Trait1 {
    #[ink(message)]
    fn foo(&mut self) -> bool;
}

// You can create wrapper in the place where you defined the trait
// Or if you import **everything** from the file where you define trait
#[openbrush::wrapper]
type Trait1Ref = dyn Trait1;

{
    // It should be `AccountId` of contract in the network that implements `Trait1` trait
    let callee: openbrush::traits::AccountId = [1; 32].into();
    // This code will execute a cross contract call to `callee` contract
    let result_of_foo: bool = Trait1Ref::foo(&callee);
}

注意:特性应使用openbrush::trait_definition定义。被调用合约应实现该特性。

其他功能

  • 您可以使用test_utils简化代码的单元测试。
  • 您可以使用traits,它为您的代码提供了一些额外的功能。
  • 在我们的文档中阅读我们的文档。
  • 在我们的示例中查看如何使用库和ink!。
  • 查看项目结构示例和相应的文档

不确定从哪里开始?使用交互式生成器来引导您的合约并了解OpenBrush提供的组件。

‼️ 重要 ‼️

由于ink!当前处理事件的方式,当前不支持事件。
事件标识符必须基于特性的名称。目前ink!不支持,但必须通过此问题修复。

在库成为生产就绪之前需要解决的问题

路线图 🚗

当前的OpenBrush路线图包括:https://docs.google.com/document/d/1b49juyKJN0W-UBHoJ4iS3P_I0Z5a94YoNLxylIf-As8

安装 & 测试

要使用项目,您需要安装ink!工具链和NodeJS依赖项。

  1. 因此,您需要一个实际的安装程序rustup
  2. ink!工具链
  3. 您可以通过yarn命令安装NodeJS依赖

构建

$ yarn build

如果您想以发布模式构建,可以使用以下命令

$ yarn build:release

测试

您可以通过以下命令运行单元测试:RUSTFLAGS="-D warnings" cargo test --workspace --features test-all -- --test-threads=10。从目录根目录运行。

要运行集成测试,您需要启动带有contract-pallet的节点。

之后,您可以通过npm run test命令运行测试。它将构建集成测试所需的所有合约,并运行它们。

常见问题解答

是否经过审计?

此存储库中的合约尚未经过审计,并且由于ink!的具体性,存在多个漏洞。由于ink!现在已经过审计,OpenBrush将在关于切换到稳定工具链和适应最新ink!的重大突破性更改发布后进行审计。

许可证

OpenBrush在MIT许可证下发布。

依赖关系

~11–15MB
~261K SLoC