围绕Parity的Substrate区块链框架的开发正在顺利进行,现在可以部署基于Ink的智能合约。 在访问通过Polkadot JS客户端调用智能合约函数的方法之前,本文将介绍Ink智能合约的编译和部署过程。
这是一个由3部分组成的系列文章的最后一部分,该系列探讨了从安装到部署的Substrate区块链的Ink智能合约创建过程。 上一篇专门介绍Ink合同编写过程的文章可以在这里找到:区块链研究实验室 | 基于substrate创建Ink智能合约-part2
测试Ink智能合约
测试Ink智能合约可以(并且应该)在链下和链上进行。 先验可以通过智能合约本身内的测试模块完成,后者可以在本地Substrate dev链上完成。
根据我的经验,在编译和部署合同之后,我发现了合同错误。强调了链上测试的重要性。这些错误成功地绕过了测试模块和编译过程,因此除了测试模块之外,还必须在测试链上测试整个契约。我们将进一步访问的polkadotJSUI允许我们轻松地完成这项工作。
测试墨迹合同的第一种方法是通过contract!下的测试模块宏。样板文件如下:
测试函数被包装在一个单独的tests模块中,该模块从父模块导入所有内容,从而了解有关智能合约的所有信息。让我们从顶部的cfg标志开始,分解一些更模糊的代码行。
测试函数被包装在一个单独的tests模块中,该模块从父模块导入所有内容,从而了解有关智能合约的所有信息。让我们从顶部的cfg标志开始,分解一些更模糊的代码行。
第一行,super::*非常简单;测试模块需要知道它正在测试的智能合约,因此所有内容都从父模块 - 智能合约本身带入*。 第二个参数将TryFrom特征带入范围。
TryFrom特性实现了简单且安全的类型转换,在某些情况下可能会以受控方式失败。
我们使用从TryFrom特征派生的try_from()方法来尝试获取AccountId地址以供我们的测试使用。 这实际上是我们在初始化合同实例后在it_works()测试中做的第一件事:
Substrate中的AccountId由32个字符组成,因此Alice的地址简单地声明为32个零。解包该帐户以从Result或Error枚举中获取实际地址。
在函数定义之前存在一个[test]语句;这是Rust语法,让编译器知道我们打算将此函数作为测试函数。 VS Code将在每个以这种方式标记为测试的功能下嵌入一个测试按钮 - 但是单击此按钮以调用cargo测试将失败,因为我们需要稍微修改的测试命令来测试Ink合同。我们将进一步访问该命令。
在it_works()中,我们使用deploy_mock()初始化合同的可变实例,deploy_mock()是Ink框架提供的模拟部署功能。现在可以通过_nftoken变量调用和操作智能合约。 deploy_mock()将调用智能合约的deploy()方法 - 它需要一个init_value参数 - 因此提供了100的值,从而在测试运行时创建100个令牌。
在测试中使用断言
从这里,剩下的部分Works()很容易理解。我们利用了Rust的断言宏,以确保我们的合同状态如我们预期的那样在转移令牌和批准其他帐户发送令牌时发生变化。
Rust包含三个可供我们在标准库中使用的断言宏:
如果断言失败,测试功能也将失败,并在测试完成后报告为失败。 为了测试我们的Ink合约,我们运行以下命令:
使用--no capture将提供更详细的输出,包括println()输出,其中它已在测试模块中使用。TEST ENV功能确保我们只测试Ink环境,如cargo.toml中所定义的:
成功的测试将产生以下输出:
编译智能合约
通过测试,我们现在可以编译合同。 在项目目录中运行build.sh来执行此操作:
生成的文件将位于target/文件夹中:
Ink智能合约被编译到Web二进制标准WebAssembly或.wasm中。我们感兴趣的是上面编译输出中的两个文件,我们将上传到Substrate:
nftoken-pruned.wasm:一个优化的.wasm文件,我们将上传到我们的Substrate链
NFToken.json:JSON格式的合同ABI代码
注意:尽管我们不关注WebAssembly,但值得一提的是,为了更高效的运行时,区块链空间中大量使用了这种格式。以太坊2.0将依赖于他们称为ewasm的Webassembly的一个子集,当然,Substrate链也采用了该标准。虽然Webassembly主要针对Web,但它绝不局限于浏览器。WebAssembly规范正在开发中,我们可以期望在未来几年发布更多的特性,这使得它成为一种非常有趣的技术。
您可能熟悉基于以太坊的智能合约中的智能合约ABI,该合同为前端DAPPS提供了与链上合同通信的方式。它们本质上描述了智能合约的结构,包括它在JSON对象中的函数和变量,使得基于JavaScript的应用程序集成起来特别简单。
现在,要部署合同,如果您还没有这样做,请启动您的本地Substrate链,然后让我们转向Polkadot JS应用程序来管理我们的部署。
部署Ink智能合约
在Substrate链上部署和实例化合同涉及首先部署合同,然后实例化它。 这个两步过程允许开发人员部署特定标准 - 可能是令牌标准 - 然后其他感兴趣的各方可以使用他们自己的令牌细节来实例化相同的合同。 这样就无需上传相同合同的副本,即可获得基本相同的功能和相同的ABI代码。
重申一下,这两步过程包括:
将合同上传到基板链
实例化合同,然后可以与之交互
Polkadot JS
现在我们将把编译好的.wasm和.json abi上传到一个底层dev链。为此,需要使用polkadotJS客户机。
您可以复制项目以在本地计算机上运行,也可以访问https://polkadot.js.org/apps以在线访问它。加载客户端以开始随后的部署过程。
步骤1:确保客户端已连接到本地Substrate节点
我们首先需要确保客户端连接到正确的链。导航到Settings选项卡,确保要连接的远程节点/端点设置为Local Node(127.0.0.1:9944)。如果需要更改,请点击保存并重新加载。
注意:其他链,Alexander和Emberic Elm,是由Parity管理的基于底物的链。使用其他Substrate链(如Polkadot)超出了本文的范围,但是,Pokakdot JS客户端实际上设计用于任何基于Substrate的区块链,因此在整个应用程序中呈现的内容非常动态。
第2步:将已编译的智能合约部署到您的节点上
要部署我们的合同,请从侧栏导航到“contract”页面,并确保您位于“code”选项卡上。如果尚未在节点上部署合同,则“code”选项卡将是唯一可用的选项卡。用户界面将类似于以下内容:
现在在Code选项卡上:
确保部署帐户设置为ALICE。 Alice将有足够的余额来部署,实例化和测试合同
将nftoken-pruned.wasm拖到已编译的合同WASM字段中
可选:修改代码包名称值以获得更加人性化的名称
将NFToken.json拖到contract ABI字段上
将允许的最大气体设置为500,000,以确保我们提供足够的气体来处理交易
配置完成后,点击Deploy,然后再次确认。 交易将进行,智能合约将被部署。
步骤3:实例化合同
您现在将注意到另外两个选项卡,Instance和Call。 我们将首先使用Instance选项卡实例化合同,然后使用Call选项卡来测试我们的功能。 Instance选项卡将类似于以下内容:
在“instance”选项卡中:
检查此 code for this contract是否指向已部署的合同。
将要生成的初始令牌金额设置为initValue值。
注意:polkadot ui现在开始使用我们的智能合约结构,特别是需要为我们为智能合约定义的部署函数提供的参数,包括预期的数据类型。这是一个例子,说明了polkadot ui的动态特性,以及它是如何设计来满足各种智能合约类型的。
将禀赋值设置为1,000,以确保新合同帐户具有某些值。这是官方Ink文档的建议值。与以太坊合同一样,墨水合同被部署到具有自己独特的AccountId和余额的单独地址。
再次,将允许的maximum gas allowed设置为500000,以确保我们为交易提供足够的燃气。
点击Initiate 并确认执行交易。
成功交易后,合约现在将被实例化并且功能可以调用。
第4步:从实例化合同中调用函数
我们现在的最终工作是确保功能按预期工作。您会注意到我们在合同中定义的所有pub(external)函数现在都可以在Call选项卡中调用和测试:
能够在Polkadot JS中调用合同函数
Polkadot JS尚未提供来自客户端本身的调用的反馈,但您终端中的节点源应在新块验证时反映事务。 我们现在拥有的UX是成功或失败事件通知,它们会在处理函数调用时弹出在浏览器窗口的右上角。
注意:反馈机制将在命令行或Polkadot JS客户端中在可用时发布。
总结
我们已经完成了从安装到链上实例化的Ink智能合约部署过程。作为一个简短的总结,让我们来看看使这个过程成为可能的各个部分:
1、安装底层的Rust语言,Cargo包管理器和Substrate框架,
2、Ink的安装,可通过自己的cargo进行访问,以及将Ink编译为.wasm所需的WebAssembly工具。
3、引导基本的Flipper Ink合约以获取Ink样板,包括环境配置和build.sh文件
4、编写符合Rust概念和惯例的NFToken合同,具有铸造,转移和批准功能,以及事件发布。
5、在使用build.sh编译合同之前,通过测试模块进行测试。
6、通过连接到本地Substrate dev链的Polkadot JS客户端部署,实例化和测试函数调用。
本文转载公众号:区块链研究实验室,专注区块链技术,产品社群,经济模型等全方位的知识体系输出,为大家带来不一样的社群学习体验。欢迎联系作者微信加入社群:csschan1120