6 个版本 (稳定)
4.0.0-beta | 2023 年 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
355KB
5.5K SLoC
📢 📢 📢 我们非常高兴地宣布 Patron,它将智能合约验证功能引入 Polkadot 生态系统。 📢 📢 📢
智能合约验证确保 dApp 和区块链平台的安全、可靠和可信。使用 Patron,您可以简化部署流程,管理您的构建,并使 Polkadot 生态系统更加安全和透明。
换句话说,Patron 是一个一站式合约平台,允许您在隔离环境中构建和验证 ink! 智能合约,探索合约验证细节。
重要!
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依赖项。
构建
$ 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