怎么样使用Rust语言进行Ontology的Wasm合约开发

当前位置:首页 > 币圈百科 > 怎么样使用Rust语言进行Ontology的Wasm合约开发

怎么样使用Rust语言进行Ontology的Wasm合约开发

2022-11-07币圈百科224

Ontology Wasm自测试网上线以来,受到了社区开发者的极大关注。由于该技术降低了业务逻辑复杂的dApp合约的上行成本,极大地丰富了dApp生态。本体Wasm目前支持Rust和C语言的开发。Rust语言对Wasm的支持更好,生成的字节码更简洁,可以进一步降低契约调用的成本。那么如何使用Rust进行本体的契约开发呢?

一、使用Rust进行Wasm合约开发

1.1新合约

Cargo是开发Rust程序时不可多得的项目构建和包管理工具。它可以帮助开发人员更好地组织代码和第三方库依赖。要创建一个新的空本体Wasm契约,只需执行以下命令:

cargo?新的?- lib?Hello-world

生成的项目结构是:

|-Cargo.toml|-src?|-lib.rs

其中,Cargo.toml文件用于配置项目的基本信息和依赖库的信息等。文件中的[lib]段必须设置为CRATE-type=[' CDYLIB '];lib.rs文件用于编写契约逻辑代码。另外,需要在配置文件Cargo.toml的[dependencies]部分添加依赖关系设置:

ontio-STD={ 3359 github . com/ontio/ontio-ontology-wasm-CDT-rust }

有了这个依赖关系,开发者就可以用本体区块链和参数序列化等工具调用接口。

1.2契约入口函数

每个程序都有入口函数,比如我们常见的main函数,但是契约没有main函数。用Rust开发Wasm契约时,默认使用invoke函数作为契约执行的入口函数。当Rust的源代码被编译成虚拟机可以执行的字节码时,Rust中的函数名就会被混淆。为了防止编译器生成冗余的字节码并减少契约大小,invoke函数应该用#[no_mangle]进行注释。Invoke函数如何获取事务执行的参数?Ontio_std库提供了runtime:input()函数的参数来接收事务执行,开发者可以使用ZeroCopySource来反序列化接收到的字节数组。其中,读出的第一个字节数组是被调用方法的名称,后面是方法参数。合同执行结果是如何返回的?ontio_std库提供的runtime:ret函数可以返回方法的执行结果。

一个完整的invoke函数如下:

#[no_mangle]pub?fn?invoke()。{?让?输入?=?runtime:input();让?mut?来源?=?ZeroCopySource:new(输入);让?动作:[u8]?=?source.read()。unwrap();让?mut?水槽?=?sink:new(12);匹配?行动?{?你好吗?=?sink.write(say_hello()),_?=?慌!(‘不支持?开拍!' ),}?runtime:ret(sink . bytes())}

1.3契约数据的序列化和反序列化

在契约开发的过程中,开发人员总是会遇到序列化和反序列化的问题,即如何将一个struct类型的数据保存到数据库中,以及如何反序列化从数据库中读取的字节数组以获得struct类型的数据。Ontio_std库提供了解码器和编码器接口来序列化和反序列化数据。struct结构的字段也应该实现解码器和编码器接口,以便Struct可以实现序列化和反序列化。序列化各种数据类型时,需要使用接收器实例。Sink实例有一个set type字段buf,存储字节类型的数据,所有序列化的数据都会存储在buf中。

用于固定长度的数据(例如:byte,u16,u32,u64等。),直接把数据转换成字节数组然后存入蓑衣网小编2022buf对于长度可变的数据,需要先序列化长度再序列化数据(例如大小未知的无符号整数,包括u16、u32或u64等。).

反序列化和序列化正好相反。对于所有的序列化方法,都有相应的反序列化方法。反序列化需要源实例。这个实例有两个字段buf和pos。Buf用于存储要反序列化的数据,pos用于存储当前读取的位置。 读取指定类型数据时,如果知道其长度,可以直接读取;对于长度未知的数据,先读取长度,再读取内容。

怎么样使用Rust语言进行Ontology的Wasm合约开发

1.4访问和更新链上数据

Ontology-wasm-cdt-rust已经封装了链上数据的操作方法,可以方便开发者对链上数据的添加、删除和检查。其中:

?Database:get(key)用于从链中查询数据,key需要AsRef接口的实现。

?Database:put(key,value)用于在链中存储数据。Key需要AsRef接口的实现,value需要编码器接口的实现。

?Database:delete(key)用于从链中删除数据,key需要AsRef接口的实现。

1.5契约测试

契约方法在执行时,需要访问链上的数据和对应的虚拟机来执行契约字节码,所以一般需要将契约部署到链上才能进行相关测试。不过这种测试方法比较麻烦。为了方便开发者测试契约,ontio_std库提供了模拟测试模块。该模块提供了链中数据的模拟,方便开发人员对契约中的方法进行单元测试。具体案例请参考:https://github . com/ontio/ontology-wasm-CDT-rust/blob/master/examples/oep 5 token/src/test . RS

1.6调试契约

开发者可以在其中使用console:debug(msg),msg信息会打印在节点日志中。这里有一个前提条件,就是本体的本地测试节点启动时,需要将日志级别蓑衣网小编2022设置为调试模式。此外,开发者还可以在契约调试时使用runtime:notify(msg)输出相关调试信息。该方法将打印的信息保存到链中,可以通过getSmartCodeEvent方法查询。

二。总结

Ontology作为领先的公有链,率先支持Wasm契约,为Wasm技术的成熟做出了贡献。同时也欢迎更多Wasm技术爱好者加入本体开发社区,共同构建技术生态。

怎么样使用Rust语言进行Ontology的Wasm合约开发 | 分享给朋友: