星雲鏈智能合約開發(七):Dapp開發

安裝neb.js

neb.js提供javascript開發的API接口

  1. 創建一個neb文件夾,在終端命令行中進入該文件夾,克隆neb.js
    git clone https://github.com/nebulasio/neb.js.git
  2. 會新建一個neb.js文件夾,進入該文件夾,安裝所有依賴
    npm install
  3. 安裝gulp
    npm install gulp
  4. 打包生成neb.js等文件
    gulp
  5. 執行成功會生成/dist文件夾,文件夾中會生成我們要使用js文件。
    • neb.js:Used in browser side. Including outside dependency.
    • neb-light.js:Used in Repl console. Not including outside dependency.
    • nebulas.js: Fully functional in the browser. Users can create an address, sign a transaction, and deploy/call a smart contract.

安裝nebPay

NebPay SDK 爲不同平臺的交易提供了統一的支付接口,開發者在Dapp頁面中使用NebPay API可以通過瀏覽器插件錢包、手機app錢包等實現交易支付和合約調用。

github地址:https://github.com/nebulasio/nebPay

安裝方法同上。會生成nebPay.js文件

開發Dapp

要實現的功能非常簡單:

  • 調用合約中的save方法發佈信息
  • 調用合約中的read方法讀取信息

建立項目

將前面生成的nebulas.js和nebPay.js放在libs文件夾下,我的目錄結構如下:

image

index.html源碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>星雲鏈Dapp</title>
</head>
<body>
    <div>
        <h1>發佈信息</h1>
        <div>標題:</div>
        <div><input type="text" id="title" style="width:370px"/></div>
        <div>內容:</div>
        <div><textarea cols="50" rows="10" id="content"></textarea></div>
        <div><input type="button" value="發佈" id="publish"></div>
    </div>

    <div>
        <h1>執行結果:</h1>
        <div>
            <textarea cols="100" rows="5" id="result"></textarea>
        </div>
    </div>

    <br/>
    <hr/>

    <div>
        <h1>查詢信息:</h1>
        <div>作者地址:</div>
        <div>
            <input type="text" id="author" style="width:370px"/>&nbsp;<input type="button" id="search" value="查詢" />
        </div>
        <div>信息:</div>
        <div id="queryResult" style="height:100px;width:370px;border:1px solid #aaa">

        </div>
    </div>

    <div style="height:50px"></div>

    <script src="libs/jquery-3.3.1.min.js"></script>
    <script src="libs/nebulas.js"></script>
    <script src="libs/nebPay.js"></script>
    <script>
        "use strict";

        // 合約地址
        var dappAddress = "n1hmSwsxM2S1Zo1Q5kMuQaKcnS1Xu8ATBbx";

        // 直接訪問星雲鏈的api
        var nebulas = require("nebulas"),
            Account = nebulas.Account,
            neb = new nebulas.Neb();
        // 設置使用的網絡
        neb.setRequest(new nebulas.HttpRequest("https://testnet.nebulas.io"));

        // NebPay SDK 爲不同平臺的交易提供了統一的支付接口
        // 開發者在Dapp頁面中使用NebPay API可以通過瀏覽器插件錢包、手機app錢包等實現交易支付和合約調用。
        var NebPay = require("nebpay");
        var nebPay = new NebPay();

        // 執行合約返回的交易流水號,用於查詢交易信息
        var serialNumber;

        $("#publish").click(function () {
            var title = $("#title").val().trim();
            var content = $("#content").val().trim();

            if (title === "" || content === "") {
                alert("標題或內容不能爲空!");
                return;
            }

            // 執行合約中的save方法
            serialNumber = nebPay.call(dappAddress, "0", "save", "[\"" + title + "\",\"" + content + "\"]", {
                listener : function (resp) {
                    console.log(resp);
                    // 清空信息
                    $("#title").val("");
                    $("#content").val("");

                    // 延遲5秒執行
                    intervalQuery = setInterval(function () {
                        queryResultInfo();
                    }, 5000);
                }
            });
        });
        // 定時器
        var intervalQuery;
        // 根據交易流水號查詢執行結果數據
        function queryResultInfo() {
            nebPay.queryPayInfo(serialNumber)
                .then(function (resp) {
                    $("#result").val(resp);
                    var respObject = JSON.parse(resp)
                    if(respObject.code === 0){
                        alert(`提交信息成功!`);
                        clearInterval(intervalQuery);
                    }
                })
                .catch(function (err) {
                   console.log(err);
                })
        }

        // 查看信息
        $("#search").click(function () {
            var author = $("#author").val().trim();
            if (author === "") {
                alert("作者地址不能爲空!");
                return;
            }

            var from = Account.NewAccount().getAddressString();
            var value = "0";   // 金額
            var nonce = "0";   // 交易序號
            var gas_price = "1000000" // 手續費價格
            var gas_limit = "2000000" // 手續費限制
            var callFunction = "read";
            var callArgs = "[\"" + author + "\"]"; //in the form of ["args"]
            var contract = { // 合約
                "function": callFunction,  // 方法名
                "args": callArgs            // 參數
            }

            // 使用api.call執行合約中的方法
            neb.api.call(from, dappAddress, value, nonce, gas_price, gas_limit, contract).then(function (resp) {
                var ressultObj = JSON.parse(resp.result);
                $("#result").val(resp.result);

                var title = ressultObj.title;
                var content = ressultObj.content;
                var time = new Date(ressultObj.timestamp);

                $("#queryResult").html("標題:" + title + "<br/>" + "內容:" + content + "<br/>" + "時間:" + time);

            }).catch(function (err) {
                console.log("error:" + err.message)
            })
        });
    </script>
</body>
</html>

運行Dapp

發佈信息

第一步

image

第二步

image

第三步

image

第四步

image

第五步

image

根據流水號查詢的執行結果數據如下:

{
    "code": 0,
    "data": {
        "data": "eyJGdW5jdGlvbiI6InNhdmUiLCJBcmdzIjoiW1wi5rWL6K+V5Y+R5biD5L+h5oGvXCIsXCLmtYvor5XlnKjmmJ/kupHpk77kuIrlj5HluIPkv6Hmga9cIl0ifQ==",
        "contractAddress": "",
        "type": "call",
        "nonce": 1,
        "gasLimit": "200000",
        "gasUsed": "",
        "chainId": 1001,
        "from": "n1GjJ6CtCj9RLgcZfUD99A3fgA9fX2kuEJ5",
        "to": "n1hmSwsxM2S1Zo1Q5kMuQaKcnS1Xu8ATBbx",
        "value": "0",
        "hash": "69640cacc2075b2af7a83d3882a4da92ab5b820b08ea182f9709e0f339fc47c5",
        "gasPrice": "1000000",
        "status": 2,
        "timestamp": 1525943841
    },
    "msg": "success"
}

查詢信息

image

至此,一個基於星雲鏈開發的簡單的Dapp就完成了。

總結

  • 智能合約就好比傳統開發中的服務端,只不過是搭建在區塊鏈的節點上;
  • Dapp就好比傳統開發中的前端,通過給定的方式調用我們發佈的智能合約中的方法;
  • 數據存儲在區塊鏈上,區塊鏈存儲區類似於傳統的key-value存儲系統(比如:redis),當然我們也可以結合其他存儲方式綜合使用。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章