#run-time #testing #smart-contracts #functional #architecture #substrate #playground

no-std drink

最小化足够架构,允许进行完全功能的ink!合同开发

37 个版本 (16 个破坏性更新)

0.17.0 2024年4月3日
0.16.0 2024年3月27日
0.15.0 2024年3月19日
0.8.5 2023年12月4日
0.1.0 2023年7月6日

#472 in 魔法豆

Download history 83/week @ 2024-04-25 51/week @ 2024-05-02 74/week @ 2024-05-09 104/week @ 2024-05-16 42/week @ 2024-05-23 126/week @ 2024-05-30 42/week @ 2024-06-06 39/week @ 2024-06-13 37/week @ 2024-06-20 60/week @ 2024-06-27 144/week @ 2024-07-04 41/week @ 2024-07-11 30/week @ 2024-07-18 221/week @ 2024-07-25 87/week @ 2024-08-01 76/week @ 2024-08-08

每月下载 423
7 crates 中使用

Apache-2.0GPL-3.0-only

62KB
1K SLoC

Rust checks Built for ink!

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