这次通过一个例子学习 rpc 交互
运行代码
SuperDictionary 的使用过程可参见以下视频:
https://www.bilibili.com/video/av23217213/
不能直接通过 file://来访问网页
配置一个 nginx,通过localhost来访问,nginx配置好之后可能会有403权限问题我是通过 https://blog.csdn.net/litoujkl/article/details/52250782 解决的
源码中的 lib 里面有所有的依赖不用去下载源码编译,再给浏览器装上插件就可以用了
调用nebulas
查看index.html代码
<script src=lib/nebulas.js></script>
var dappAddress = "n1zXt64A4q3M5LKyyHY3EqtEUpQYcPqo3Bo";
var nebulas = require("nebulas"),
Account = nebulas.Account,
neb = new nebulas.Neb();
neb.setRequest(new nebulas.HttpRequest("https://testnet.nebulas.io"));
// 搜索功能: 查找Super-Dictionary 中有没有该词条
$("#search").click(function(){
// $("#search_value").val() 搜索框内的值
var from = Account.NewAccount().getAddressString();
var value = "0";
var nonce = "0"
var gas_price = "1000000"
var gas_limit = "2000000"
var callFunction = "get";
var callArgs = "[\"" + $("#search_value").val() + "\"]"; //in the form of ["args"]
var contract = {
"function": callFunction,
"args": callArgs
}
neb.api.call(from,dappAddress,value,nonce,gas_price,gas_limit,contract).then(function (resp) {
cbSearch(resp)
}).catch(function (err) {
//cbSearch(err)
console.log("error:" + err.message)
})
})
通过 call 调用智能合约
from: 用户的账户地址
to: 智能合约地址
value: 要存入智能合约代币数量
nonce: 比创建者当前的nonce多1,可以通过GetAccountState获取创建前当前nonce
gasPrice:部署智能合约用到的gasPrice,可以通过GetGasPrice获取,或者使用默认值:"1000000";
gasLimit: 部署合约的gasLimit,通过EstimateGas可以获取部署合约的gas消耗,不能使用默认值,也可以设置一个较大值,执行时以实际使用计算。
contract: 合约信息,部署合约时传入的参数
function: 调用合约方法
args: 合约方法参数,无参数为空字符串,有参数时为JSON数组
使用 nebPay
var NebPay = require("nebpay"); //https://github.com/nebulasio/nebPay
var nebPay = new NebPay();
var serialNumber
$("#push").click(function() {
var to = dappAddress;
var value = "0";
var callFunction = "save"
var callArgs = "[\"" + $("#search_value").val() + "\",\"" + $("#add_value").val() + "\"]"
serialNumber = nebPay.call(to, value, callFunction, callArgs, { //使用nebpay的call接口去调用合约,
listener: cbPush //设置listener, 处理交易返回信息
});
intervalQuery = setInterval(function () {
funcIntervalQuery();
}, 5000);
});
var intervalQuery
function funcIntervalQuery() {
nebPay.queryPayInfo(serialNumber) //search transaction result from server (result upload to server by app)
.then(function (resp) {
console.log("tx result: " + resp) //resp is a JSON string
var respObject = JSON.parse(resp)
if(respObject.code === 0){
alert(`set ${$("#search_value").val()} succeed!`)
clearInterval(intervalQuery)
}
})
.catch(function (err) {
console.log(err);
});
}
nebPay 共有5个方法
方法 | 简介 |
---|---|
pay | 用于账户间的NAS转账 |
nrc20pay | 用于NRC20代币的转账,仅接口实现,app不支持 |
deploy | 用于部署智能合约,仅接口实现(目前尚不支持该API) |
call | 用于调用智能合约 |
queryPayInfo | 用于查询支付结果 |
1. 用户发起交易,Dapp 调用NebPay 发送交易信息到App,此时NebPay返回交易序列号给Dapp。
3. 用户通过App将交易发送到星云链, 并得到交易的TxHash
4. App 将交易序列号和TxHash 发送到由callback指定的交易查询服务器。
Dapp调用queryPayInfo 到交易查询服务器查询交易结果.
可以看到nebulas需要设置HttpRequest(“https://testnet.nebulas.io“));但是NebPay 并不关心当前使用的是主网或测试网只是把交易信息发给浏览器插件或手机app,由后者决定将交易发送到哪个网络。callback参数也只是决定使用哪个服务器查询交易结果,并不会影响交易发送的网络。