這次通過一個例子學習 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參數也只是決定使用哪個服務器查詢交易結果,並不會影響交易發送的網絡。