思桦 发表于 2018-12-5 15:36:24

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

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

要用到测试环境,必须要准备好测试环境的东西,例如测试用的开发者账号,测试用的链克钱包。官方文档提供很多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":""}
同时,此时邮箱会收到一个邮件:

这只是在进行迅雷链开发的第一步。当然除了直接在命令行敲命令,也可以通过官方提供的一个api调用网页进行api调用。
网页地址:https://thunderchain.docs.apiary.io/#reference/0

打开网页可以看到:

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


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


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

上面是熟悉了api基本调用操作,为了更简单描述整个流程,现在就完整地通过网页来部署,调用一个合约吧。 当然,实际应用是用开发者在其软件利用网络库进行api调用来实现合约的部署和调用的。
获取邮箱验证码之后,就可以进行注册邮箱了。在之前网页点击开发者邮箱注册的regist按钮:可以看到

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


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


上图比较明了,需要明确:首先链克口袋是整个合约调用不能脱离,口袋保存的链克私钥将签发交易,而其链克地址将作为合约运行的sender
所以,第一步是向测试用的链克口袋进行充值,充值的测试接口为:
https://sandbox-walletapi.onethingpcs.com/api/linktest/recharge。
参数说明:


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


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


构建json如图所示:


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


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

参数说明:


在准备好上面的东西之后,就可以开发并且部署合约了。合约得开发可以用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


得到json:{    "email": "1191094115@qq.com",    "bytecode": "0x608060405234801561001057600080fd5b5060df8061001f6000396000f3006080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c146078575b600080fd5b348015605957600080fd5b5060766004803603810190808035906020019092919050505060a0565b005b348015608357600080fd5b50608a60aa565b6040518082815260200191505060405180910390f35b8060008190555050565b600080549050905600a165627a7a72305820101eb74d2d65698a7fd1e63666842673ffb013a500c768f84643fc6b896519430029",    "params": "",    "sign": "0d0734ca430c7b79d332d700b0b44cd9"}
得到结果:


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


响应


得出sign


后面可以得出合约地址


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


根据上面的流程图可以知道如果要进行合约调用,要在第三方使用链克口袋要先获取prepay_id,这里展现一下第三方获取prepay_id的流程,但只是展示。
测试环境:https://sandbox-walletapi.onethingpcs.com/getPrepayId

请求方式: post


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


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


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


params 详细


object 详细object - 交易调用对象


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


此时得到结果为



因为合约部署上去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可以尽量大点。


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


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


得到结果:


此时获取得回调为链克口袋得回调url。将url转为二维码。
然后用链克口袋扫描:如果成功:


如果合约执行成功


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

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


将该16进制转为十进制,就为256了!
上面是初体验迅雷链部署合约的流程,希望能给后面的童鞋一些帮助^.^喜欢的同学,请在右下方点个赞鼓励我哦~~

david 发表于 2018-12-27 16:30:36

请问最后怎么解码回256?我试过用ethers的abiCoder.decode不能解码回256。请高手回答一下,谢谢!

旋转跳跃 发表于 2019-1-4 11:37:54

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

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

旋转跳跃 发表于 2019-3-15 11:29:55



你好,我这边是可以的
页: [1]
查看完整版本: 超详细讲解,初体验迅雷链部署应用