×

超详细讲解,初体验迅雷链部署应用

标签: 暂无标签
第一次知道迅雷链,觉得迅雷链是一个不错的选择。于是觉得可以在上面进行开发来进行应用.迅雷链提供测试的沙盒环境,官方文档写的也比较详细。但是自己在这个沙盒环境又做了相关的部署,调用那就提供一个教程吧。

要用到测试环境,必须要准备好测试环境的东西,例如测试用的开发者账号,测试用的链克钱包。官方文档提供很多api来满足开发者的需要。要使用迅雷链开发自己的合约应用第一步就是注册开发者邮箱。

开发者如果要其app使用迅雷链开放平台的合约服务,只需进行构建url调用即可,通过官方文档可以看到相关的接口,例如,邮箱注册可以命令行curl命令,其中json的邮箱填自己的邮箱就可以了:

curl -H "Content-Type:application/json" -X POST -d
'{"email":"1191094115@qq.com"}' https://sandbox-
walletapi.onethingpcs.com/api/linktest/email_code

如果邮箱还没注册,此时会返回:
{"code":0,"data":{},"msg":""}

同时,此时邮箱会收到一个邮件:

1.jpg

这只是在进行迅雷链开发的第一步。当然除了直接在命令行敲命令,也可以通过官方提供的一个api调用网页进行api调用。

网页地址:
https://thunderchain.docs.apiary.io/#reference/0

打开网页可以看到:

2.jpg

点击获取邮箱验证码就可以提供。
用网页进行api调用或者通过命令行进行调用就看自己的喜好吧。
点击获取邮箱验证码按钮:页面将会变化。

3.jpg

此时需要填入Body即可,其他选项URL Parameters,Headers可以不用管

4.jpg

填入之后,点击call Resource按钮,post请求就发送成功
此时会在respond窗口看到相关信息:

5.jpg

上面是熟悉了api基本调用操作,为了更简单描述整个流程,现在就完整地通过网页来部署,调用一个合约吧。 当然,实际应用是用开发者在其软件利用网络库进行api调用来实现合约的部署和调用的。

获取邮箱验证码之后,就可以进行注册邮箱了。
在之前网页点击开发者邮箱注册的regist按钮:可以看到

6.jpg

此时填入之前注册的email还有邮箱收到的验证码就可以了。
注册后可以得到邮件:

7.jpg

这就是之后进行合约各种操作的两个签名了。

要调用合约,得向迅雷链合约虚拟机提供燃料,这就是交易费,可以通过测试账号充值接口进行实现得到一些测试环境的token(该接口一天只能调用10次)。在这里可能有童鞋不明白合约开发者与迅雷链开发平台得调用逻辑逻辑,这里就列一下官方文档的流程图吧。

8.jpg

上图比较明了,需要明确:
首先链克口袋是整个合约调用不能脱离,口袋保存的链克私钥将签发交易,而其链克地址将作为合约运行的sender

所以,第一步是向测试用的链克口袋进行充值,充值的测试接口为:
https://sandbox-walletapi.onethingpcs.com/api/linktest/recharge。

参数说明:

30.jpg

要充值,得先有一个链克地址,通过链克口袋生成一个账户。

9.jpg

构建json数据,该账户就是地址
而签名为:
md5(email=xxx&address=xxx&secret=xxx)
这里得xxx代替为个人得信息:如下图所示,个人信息已打马赛克了。通过这个可以得出签名,此时就可以调用api接口进行接口调用了

10.jpg

构建json如图所示:

11.jpg

其中一个开发者一天只能调用10次该接口,调用完,进行刷新链克口袋:

12.jpg

此时1个链克已经到账!
有了链克后,就可以将自己的合约部署到迅雷链上了,要合约部署成功,就需要提供基本的gas。
正如上面的流程图一样,部署合约得先构建相应得json数据,并将其发送到
https://sandbox-walletapi.onethingpcs.com/api/linktest/contract/deploy接口

参数说明:

31.jpg

在准备好上面的东西之后,就可以开发并且部署合约了。合约得开发可以用truffle进行开发。

用truffles开发一个Simplestorege合约,注意这里得bytecode为16进制得数,如果合约引用了Library的合约,需要将Library合约部署迅雷链上,并将真正的合约的引用Library的字段改变为Library的地址。这样bytecode才是全为二进制通过truffle compile命令就可以获得build文件夹。在需要调用得合约中找到bytecode字段信息

这里的合约为:
pragma solidity ^0.4.21;
contract SimpleStorage {
     uint myVariable;

     function set(uint x) public {
         myVariable = x;
     }

     function get() constant public returns (uint) {
         return myVariable;
     }
}
之后构建sign

13.jpg

得到json:
{
    "email": "1191094115@qq.com",
    "bytecode": "0x608060405234801561001057600080fd5b5060df8061001f6000396000f30060806
04052600436106049576000357c01000000000000000000000000000000000000000000000000000
00000900463ffffffff16806360fe47b114604e5780636d4ce63c146078575b600080fd5b34801560595
7600080fd5b5060766004803603810190808035906020019092919050505060a0565b005b3480156
08357600080fd5b50608a60aa565b6040518082815260200191505060405180910390f35b8060008
190555050565b600080549050905600a165627a7a72305820101eb74d2d65698a7fd1e6366684267
3ffb013a500c768f84643fc6b896519430029",
    "params": "",
    "sign": "0d0734ca430c7b79d332d700b0b44cd9"
}

得到结果:

14.jpg

获得id后就可以通过id来查询合约得地址了。
其请求信息是:
方法:POST
URL: /api/linktest/contract/address
BODY: JSON

参数说明:

32.jpg

响应

33.jpg

得出sign

15.jpg

后面可以得出合约地址

16.jpg

得到合约地址后就可以进行合约调用。

17.jpg

根据上面的流程图可以知道如果要进行合约调用,要在第三方使用链克口袋要先获取prepay_id,这里展现一下第三方获取prepay_id的流程,但只是展示。

测试环境:
https://sandbox-walletapi.onethingpcs.com/getPrepayId

请求方式: post

34.jpg

在获取prepay_id时,其输入得私钥是之前邮件发过来的secret:

18.jpg

这样求得sign
因为参数相同,所以每一次该请求的json都相同,此时得到响应:

19.jpg

合约方法有两种,一种是constant方法,一个是需要gas的方法。这次我们调用Simplestorege的get()方法。那么就需要满足:
方法:POST
URL: /call
BODY: JSON
参数说明:

35.jpg

params 详细

36.jpg

object 详细
object - 交易调用对象

37.jpg

其中data就是调用函数的一个hash字符串
其计算方法如下;
假设方法 function bar(fixed[2] x,bool y),其中x为1,y为2
此时其计算出的data为:
1.将bar(fixed[2],bool)的ascii码进行sha3,并将其结果的16进制表示取前8位
2.将x的值转为uint32的数,将y的值转为uint32的数
3.将1,2步骤得到的字符串进行拼凑得到data
可以得到get()的sha3-256的值为
6d4ce63caa65600744ac797760560da39ebd16e8240936b51f53368ef9e0e01f
取其前8位
因为没有参数,所以可以构建json

20.jpg

此时得到结果为

21.jpg

因为合约部署上去get方法得到的东西就是0,所以返回0。
调用完constant方法,可以调用需要gas的方法了
这次调用set(uint x)函数,因为虽写的是uint 但其会转化为uint256,所以
根据json格式,此时要得出set(uint256)的sha3-256的hash值并取其前8位:
cccdda2c

此时可以构造json。

同时我们使x为256,我们算出十进制的256的16进制为100,之后将100填充到32位得出
0x00000000000000000000000000000100
再拼凑得
0x60fe47b100000000000000000000000000000100
这个就是调用得data了。
这里得地址,可以直接选择链克口袋的回调地址。至于json中的gas_limit,可以通过这样的请求获得,当然要想合约成功,gas可以尽量大点。

22.jpg

得到返回得是一个16进制数,将其转为10进制即可。

23.jpg

转为10进制为:26477,而事实上,该合约用了41605,所以gas大点是没错得
构建json

24.jpg

得到结果:

25.jpg

此时获取得回调为链克口袋得回调url。将url转为二维码。

然后用链克口袋扫描:
如果成功:

26.jpg

如果合约执行成功

27.jpg

如果失败:这里我调用一个错误方法(构造错误的data)

28.jpg

至此,一个合约调用的流程已经结束。
我们将合约的变量从0变为了256,那么现在通过get方法查看吧。
通过前面的constant方法此时响应为:ps对constant方法也可以通过虚拟机用交易费来运行,但是没有这个必要。

29.jpg

将该16进制转为十进制,就为256了!

上面是初体验迅雷链部署合约的流程,希望能给后面的童鞋一些帮助^.^喜欢的同学,请在右下方点个赞鼓励我哦~~

思桦

写了 19 篇文章,拥有财富 150,被 7 人关注

反对反对
回复

使用道具

B Color Link Quote Code Smilies

0

主题

2

帖子

19

积分

新手上路

Rank: 1

积分
19
david 发表于 2018-12-27 16:30:36
请问最后怎么解码回256?我试过用ethers的abiCoder.decode不能解码回256。请高手回答一下,谢谢!
回复 支持 反对

使用道具 举报

1

主题

9

帖子

39

积分

新手上路

Rank: 1

积分
39
旋转跳跃 发表于 2019-1-4 11:37:54
david 发表于 2018-12-27 16:30
请问最后怎么解码回256?我试过用ethers的abiCoder.decode不能解码回256。请高手回答一下,谢谢! ...

哈喽~你这个详细代码可以发私人消息给我下吗~?我帮你看看是什么情况~
回复 支持 反对

使用道具 举报

1

主题

9

帖子

39

积分

新手上路

Rank: 1

积分
39
旋转跳跃 发表于 2019-3-15 11:29:55
图片.png

你好,我这边是可以的
回复 支持 反对

使用道具 举报

Archiver|手机版|小黑屋|迅雷链开发者社区
Copyright©2018 onethingcloud.com All Rights Reserved 深圳市网心科技有限公司版权所有 粤ICP备14008884号-23
返回顶部