如何在本体网络上为WebAssembly编写智能合约? 第1部分:铁锈

图片

本体Wasm技术降低了将具有复杂业务逻辑的dApp智能合约转移到区块链的成本,从而大大丰富了dApp生态系统。

当前, 本体论Wasm同时支持Rust和C ++的开发 。 Rust更好地支持Wasm,并且生成的字节码更简单,这可以进一步降低合同调用的成本。 那么, 如何使用Rust在本体网络上开发合同?

与Rust的WASM合同开发


合同创建


Cargo是在Rust中开发程序时创建项目和管理程序包的好工具,可帮助开发人员更好地组织代码与第三方库的交互。 要创建新的本体论合约,只需运行以下命令:

图片

它生成的项目的结构:

图片

Cargo.toml文件用于配置基本项目信息和从属库信息。 文件中的[lib]部分必须设置为crate-type = [“ cdylib”]。 lib.rs文件用于编写合同逻辑代码。 另外,您需要将依赖性参数添加到Cargo.toml配置文件的[dependencies]部分:

图片

有了这种依赖关系,开发人员可以调用与本体区块链进行交互的接口以及诸如序列化参数之类的工具。

合约录入功能


每个程序都有一个输入功能,例如我们通常看到的主功能,但是合同没有主功能。 使用Rust开发Wasm合同时,默认情况下,invoke被用作输入功能以使用该合同。 将Rust源代码编译为虚拟机可以执行的字节码时,Rust中的函数名称将不清楚。 为了警告编译器不要生成冗余代码并减小合约大小,invoke函数添加#[no_mangle]批注。

如何调用获取参数来执行事务?


ontio_std库提供运行时::输入()函数以获取事务的参数。 开发人员可以使用ZeroCopySource反序列化生成的字节数组。 其中读取的第一个字节数组是invoke方法的名称,后跟方法参数。

合同的结果如何退还?


由ontio_std库提供的runtime :: ret函数返回该方法的结果。

完成的invoke函数如下:

图片

合同数据的序列化和反序列化


在开发合同的过程中,开发人员经常遇到序列化和反序列化的问题,特别是如何将数据的结构类型保存到数据库中,以及如何对从数据库中读取的字节进行字节数组反序列化以获取数据的结构类型。

ontio_std库提供了用于对数据进行序列化和反序列化的解码器和编码器接口。 struct结构的字段还实现了解码器和编码器的接口,因此可以对该结构进行序列化和反序列化。 序列化各种类型的数据时,需要接收器实例。 Sink类的一个实例有一个set-type字段buf,它存储字节类型数据,所有序列化数据都存储在buf中。
对于固定长度的数据(例如:byte,u16,u32,u64等),数据将直接转换为字节数组,然后存储在buf中; 对于非固定长度的数据,首先需要对长度进行序列化,然后对D \ data(例如,未知大小的无符号整数,包括u16,u32或u64等)进行序列化。

反序列化是完全相反的。 对于每种序列化方法,都有相应的反序列化方法。 反序列化要求使用Source类的实例。 该类实例有两个字段buf和pos。 Buf用于存储要反序列化的数据,而pos用于存储当前读取位置。 读取特定数据类型时,如果知道其长度,则可以直接读取它,以获取未知长度的数据-首先读取长度,然后读取内容。

访问和更新链中的数据


Ontology-wasm-cdt-rust-封装了一种处理链中数据的操作方法,它使开发人员可以方便地实现诸如添加,删除,更改和查询链中数据的操作,如下所示:

  • database :: get(key) -用于从链中请求数据,并且键请求实现AsRef接口;
  • database :: put(key,value) -用于在网络上存储数据。 键要求执行AsRef接口,值要求执行Encoder接口;
  • database :: delete(key) -用于从链中删除数据,并且key请求实现AsRef接口。

合同测试


在实施合同的方法时,我们需要访问电路中的数据,并且需要适当的虚拟机来执行合同的字节码,因此通常必须在链中部署合同以进行测试。 但是这种测试方法是有问题的。 为了使开发人员更容易进行测试合同,ontio_std库提供了一个用于测试的模拟模块。 该模块提供电路中数据的仿真,使开发人员更容易在合同中对测试方法进行单元化。 具体的例子可以在这里找到。

合同调试


console :: debug(msg)在调试合同时输出调试信息。 msg信息将输入到节点日志文件中。 前提条件是在本地本体测试节点运行时以调试模式设置日志文件的级别。

runtime :: notify(msg)在调试合同时显示适当的调试信息。 该方法会将输入的信息保存到电路中,并且可以使用getSmartCodeEvent方法从电路中请求该方法。



这篇文章是由Hashrate&Shares专为OntologyRussia翻译的。 点击

您是开发人员吗? 加入我们的Discord技术社区。 此外,请访问我们网站上的开发人员中心 ,您可以在其中找到开发人员工具,文档等。

本体论


Source: https://habr.com/ru/post/zh-CN471878/


All Articles