o w 一直以来都受到了社区开发人员的广泛关注,而目前 o w 也即将上线本体主网。在上期的技术视点中,我们简要介绍了如何进行相关环境......由此可见,阿蒂斯atis币官网有着强有力的发展脉搏,是行业发展不可或缺的动力源泉。
o w 一直以来都受到了社区开发人员的广泛关注,而目前 o w 也即将上线本体主网。在上期的技术视点中,我们简要介绍了如何进行相关环境搭建和使用合约模板来进行开发。本期我们将开始初步尝试从零开始开发 o w 合约。
新建合约
$ --
c``
新建的合约目录结构如下:
.
├── c.
└──
└── .
一个 r 版本的 w 合约包含两部分组成,一部分是c.配置文件,用于配置项目信息,一部分是/.用于编写合约逻辑。
引入o w合约开发工具库
在生成的c.文件中引入 o w 合约开发工具库-,使用[]配置项来完成引入该工具库的动作。
[]
= ""
= ".."
= ["l &;[&#;]&;"]
= ""
# s ://.-//.
[]
- = {=":////-w--."}
由于我们合约要以库的形式进行编译,所以还需要在c.文件里加上[]配置信息,一个完整的 c. 配置文件如下:
[]
= ""
= ".."
= ["l &;[&#;]&;"]
= ""
# s ://.-//.
[]
- = [""]
= "/."
[]
- = {=":////-w--."}
[]
= ["-/"]
· []用于开启一些不稳定特性,只可在版的编译器中使用。此处我们引入了-/模块,该模块模拟了与链交互的接口,也就是可以通过该模块进行合约中与链交互的模拟测试,主要方便了合约开发者在本地测试合约中与链交互的功能是否正常,无需部署到链上,就可以实现测试的功能,在后面的章节中我们会详细介绍该模块的使用方法。
生成-库api文件
虽然我们引入了开发 o w 合约需要的工具库,但是我们还不知道该工具库中都有哪些 api 可以用,我们可以通过下面的命令生成该库的 api 文档。
执行成功后的目录结构如下:
.
├── c.
├── c.
├──
│ └── .
└──
├──
└──
生成的 api 接口文档在目录下。我们可以通过浏览器打开 . 文件查看。如下图所示:
请在左侧目录栏找到 _ 库,点击该选项,如下图:
上面列出了_库中封装好的所有模块,在开发合约的过程中,可以使用这些模块中的功能。
编写合约逻辑
新建的合约.文件内容仅有一个测试代码,在项目根目录下,执行来执行该测试代码。
#[()]
{
#[]
_() {
_!( + , );
}
}
下面开始编写合约逻辑:
第一步:在.文件中引入刚才在c.配置文件中添加的-依赖,为了屏蔽标准库中的方法,我们加上#![_]注解。
#![_]
_;
#[()]
{
...
}
第二步:添加函数,该函数是 o w 默认的入口函数,在这个合约中,我们实现一个方法获得调用的参数并将参数返回出去,代码如下:
#![_]
_;
::::{s, s};
::::*;
::;
_(: &;) -&; s {
._();
}
#[_]
() {
= :);
= s:&;);
: &;[] = .().();
= s:);
{
"" =&; {
= .().();
.(_());
},
_ =&; !(" !"),
}
:.())
}
#[]
_() {
= _(" ");
_!(, " "._());
}
在合约中,我们引入了-库里面模块的s和s数据类型。s用于读取外部调用合约中的方法时传进来的方法名和方法参数信息,s用于合约中不同类型的数据序列化成 。-库里面的模块提供了一些常用的数据类型,比如a、u和s等。把合约执行的结果返回给调用合约的程序,需要使用:)方法,模块封装与链交互的接口。
至此,一个简单的返回传入参数的合约已经完成。
编译合约
用 r 编写的合约源代码需要编译成w字节码,才能部署到链上,执行下面的命令编译合约:
rustflags="-c -=--=" -- -- w--
在上面的命令中,rustflags="-c -=--="表示设置编译时使用的栈大小为, 编译默认设置的栈内存大小是mb,对合约来说是巨大的浪费,因此在编译时设置下栈的大小, 对于绝大多数合约来说是够用的。 w-- 表示在编译目标。
该代码执行后,会生成文件夹,目录结构如下:
.
├──
│ ├──
│ ├──
│ ├──
│ └──
└── w--
└──
编译好的合约字节码文件为 /w--// 目录下名为.w的文件。
优化合约字节码
编译好的w字节码文件会比较大,部署到链上需要的存储空间会比较多,费用也会比较高,但是我们可以使用-w-工具将 w 字节码减小。
执行下面的命令优化该合约字节码:
-w- /w--//.w
该命令执行完后,会在/w--//生成的文件如下:
_.w 优化后的w合约字节码;
_.w. 优化后的w合约字节码的编码格式。
测试合约
我们将在本地测试网络中测试刚刚编写的合约。
首先,生成钱包文件,本地测试网启动需要钱包文件,执行如下的命令:
其次,启动我们搭建好的本地测试网节点,执行下面的命令:
-- --
--表示以测试的模式启动。
--表示将日志级别设置为模式。
然后,部署合约:
$ ---- .w. ---- "" -- "" -- "" --
p:
d :
c a:
th:
t:
u ' ' .
--表示部署的合约类型是w合约,目前 o 链除了支持w合约还支持nvm合约,部署的时候要注明合约类型。 --表示部署合约名字是。 -- "" 表示部署合约作者是。 -- "" 表示部署合约是。 -- 表示部署合约需要的费用上限是。
最后,调用合约中的方法。由于我们在函数里仅定义了方法,并且该方法将输入的参数内容直接返回。所以,调用合约的时候,第一个参数是方法名,第二个参数是合约中的该方法需要的参数。
因为我们调用的方法没有更新链上的数据,仅仅是把输入的参数返回,我们在调用合约的时候,要加上预执行标签--,否则,我们看不到合约返回的结果。
根据合约地址调用合约中的方法。该部分详细信息请参考命令行合约调用。
$ ------ ':,: ' ----
i: p:[""," "]
c
g :
r: ( )
合约中我们的返回值是 ,就像上一篇技术视点中提到的那样,执行结果返回了该值的编码。
至此,我们在不依赖模板的情况下,完成了一个简单的 o w 合约,并进行了部署和调试。
结语
在本期技术视点中,我们简单介绍了如何在不依赖模板的情况下,完成一个简单的 o w 合约的开发,并进行了测试。同时,我们也介绍了 o w 工具库 api 文档的生成方式,方便开发者查询和调用已提供的功能。相信你一定会有所收获。下期我们将会介绍 o w 合约获得调用参数以及合约中数据的序列化和反序列化。欢迎关注!