37 个版本 (16 个破坏性更新)
0.17.0 | 2024年4月3日 |
---|---|
0.16.0 | 2024年3月27日 |
0.15.0 | 2024年3月19日 |
0.8.5 |
|
0.1.0 | 2023年7月6日 |
#472 in 魔法豆
每月下载 423 次
在 7 crates 中使用
62KB
1K SLoC
DRink!
Dechained Ready-to-play ink! playground
什么是 DRink!?
简而言之
DRink! 是一个 ink! 开发者的工具箱,允许在不运行任何节点的情况下进行完全功能的 ink! 合同开发。它为您提供了独特的、非常强大的与合同交互的环境
- 同步部署和调用您的合同,没有任何与区块生产或网络相关的延迟
- 访问一些强大的功能,这些功能在标准方法(如 合同模拟、增强调试和调用跟踪)中不可用
- 同时处理 多个合同
- 处理任意 运行时 配置,包括自定义链扩展和运行时调用
- 对 运行时状态 有完全控制,包括区块编号、时间戳等。
详细说明
DRink! 背后的关键概念是提供一个无节点的环境。为了完全理解它,我们需要对 Substrate 架构有一个高级概述。
注意:虽然在这里我们使用了 Substrate 特定的术语,但这些概念相当普遍,至少适用于大多数区块链设计。
“区块链洋葱”
任何区块链网络参与者都运行一个单一的二进制文件,通常称为节点或主机。它负责基本操作,如
- 与其他节点通信(网络协议、信息传播、八卦等)
- 区块生产和最终确定(共识、区块创建等)
- 存储(区块链状态、数据库等)
- 有时还包括交易池、RPC等。
当它接收到一笔新的交易(或一个区块)时,它必须更新区块链状态。为此,它使用一个称为运行时的状态转换函数。这是一个辅助二进制文件,作为核心逻辑函数,输入为当前状态和交易,输出为更新后的状态。
如果交易是某种智能合约交互,运行时必须在隔离环境中执行它。(这就是合约托盘发挥作用并创建专用沙盒的地方。)
因此,我们有一个类似于洋葱的分层架构(实际上,还有更多层次,但这里不需要深入探讨)。
测试策略
根据涉及的技术栈部分,我们可以推导出三种主要的智能合约测试策略。
在DRink!之前,你可以使用ink!'s原生测试框架执行单元测试(使用#[ink::test]
宏)或端到端测试(使用#[ink_e2e::test]
宏)。DRink!启用了第三种选择,即准端到端测试。
准E2E测试
这种范例是两种其他策略之间的特殊折衷。我们放弃了节点层(包括网络、区块生产等),但我们仍然有一个带有附加存储的完整功能的运行时。换句话说,我们保留在内存中的裸区块链状态,我们可以直接以任何我们想要的方式与之交互。
这种方式,我们获得了对运行时的完全控制,牺牲了对区块链环境的真实模拟。然而,通常这对开发过程非常有益,因为它允许有更快的反馈循环,并有助于更好地了解执行外部性。
如何使用DRink!?
你可以用三种方式使用DRink!:
直接作为库
这种方式,你可以在你的测试套件中获得DRink!的全部功能。查看我们examples目录中的有用且详尽的示例。
drink
库持续发布到crates.io,因此你可以使用它在你的项目中,要么使用cargo add drink
,要么在你的Cargo.toml
中添加以下行
drink = { version = "0.8" }
完整的库文档可在https://docs.rs/drink找到。
快速入门指南可在此处找到。
作为ink! E2E测试框架的替代后端
DRink!已经与ink!集成,并可以用作标准E2E测试环境的直接替代。只需在测试宏的测试函数中使用相应的参数
#[ink_e2e::test(backend = "runtime_only")]
,你就可以从E2E测试用例切换到准E2E测试用例,而不需要任何在后台运行的节点!
完整的示例请参阅ink!存储库。
使用命令行工具
我们提供了一个命令行界面(CLI),它将DRink!置于友好的图形用户界面(TUI)之后。下面你可以找到它的工作演示。更多详情,请参阅它的README。
https://github.com/Cardinal-Cryptography/drink/assets/27450471/4a45ef8a-a7ec-4a2f-84ab-0a2a36c1cb4e
与drink
库类似,drink-cli
也发布到了crates.io。你可以使用以下命令安装它:
cargo install drink-cli
依赖项
~46–63MB
~1M SLoC