美文网首页NAS星云链我爱编程
星云链上的Dapp开发你会了么?如果还是不会那就在看看这个ban

星云链上的Dapp开发你会了么?如果还是不会那就在看看这个ban

作者: 蓝胖子的代码 | 来源:发表于2018-05-10 12:34 被阅读625次

    bank demo 是一个基于星云链智能合约编写的的Dapp,它的功能包括存储,取出,查询功能,而星云链是全球首个主网上线的区块链3.0公链,所有代码全部重新构建,比起以太坊更清晰,更简练,对开发者极度友好,智能合约语言基于当下最流行的javascript,此demo可以作为刚刚接触NAS 想开发Dapp的开发者作为学习参考,下面我就一步步带大家去了解怎样做出一个在星云链上的Dapp。
    https://xingyun.io/dapp/nasbank/

    image

    制作这个DApp,我们分四个步骤:

    1. 编写Web页面。
    2. 用JavaScript或者TypeScript 编写几十行代码的智能合约。
    3. 部署智能合约
    4. 完成Web页面与智能合约的交互。

    首先看下目录结构 :

    image

    img 放置图标
    lib 放库
    smartContract 放置智能合约

    第一步,Web页面制作。

    从这个页面我们可以获取到的信息有以下信息:
    1、页面的背景
    2、顶部的名称,logo,接下来的提示语NOTE:Please install WebExtensionWallet to use bank demo 是因为还没有安装星云钱包插件给个提示(什么是星云钱包插件?文章后面会说到)
    3、三个编辑框 ,三个按钮 (save, balance,takeout)

    下面是对应的布局代码:

    <body>
        <div class="contenner">
            <div class="logo">
                <div class="name">bank demo</div>
                <div class="img logo_rotate">
                    <img src="img/logo.png" alt="">
                </div>
            </div>
            <div class="noExtension hide" id="noExtension">
                NOTE: Please install <a target="_blank" href="https://github.com/ChengOrangeJu/WebExtensionWallet">WebExtensionWallet</a>  to use bank demo
            </div>
            <div class="search">
                <input id="search_value" type="text">
                <button id=search>save</button>
            </div>
            <div class="search">
                <input id="balance_value" type="text">
                <button id=balance>balance</button>
            </div>
            <div class="search">
                <input id="takeout_value" type="text">
                <button id=takeout>takeout</button>
            </div>
    
            <!-- <div class="result_success hide">
                <div id=search_banner></div>
                <p id=search_result> wait for content </p>
                <div class="author">
                    <i><p> Author:</p> <p id=search_result_author> dasdajkajksdhjasdkjahdkjad</p></i>
                </div>
            </div> -->
    
            <div class="result_faile hide">
                Failed to find related information. Do you want to <button id="add">add</button> infromation for "<i id="result_faile_add">asd</i>"?
            </div>
    
            <div class="add_banner hide">
                <input type="text" id="add_value" placeholder="input contents for your keyword">
                <button id="push">submit</button>
                </div>
        </div>
        <script src=lib/jquery-3.3.1.min.js></script>
        <script src=lib/nebPay.js></script>
        <script src=lib/bootstrap-4.0.0-dist/js/bootstrap.min.js></script>
        <script>
    
            var NebPay = require("nebpay");     //https://github.com/nebulasio/nebPay
            var nebPay = new NebPay();
    
            document.addEventListener("DOMContentLoaded", function() {
                $("#search_value").attr("disabled",true)
                $("#search").attr("disabled",true)
    
                console.log("web page loaded...")
                setTimeout(checkNebpay,100);
            });
    
            function checkNebpay() {
                console.log("check nebpay")
    
                //to check if the extension is installed
                //if the extension is installed, var "webExtensionWallet" will be injected in to web page
                if(typeof(webExtensionWallet) === "undefined"){
                    //alert ("Extension wallet is not installed, please install it first.")
                    $("#noExtension").removeClass("hide")
                }else{
                    $("#search_value").attr("disabled",false)
                    $("#search").attr("disabled",false)
                }
            }
    
        //var dappAddress = "n1uNSyJRWKDXUhoBiNsURz4GXnCkPYAc2pZ"; // 测试网合约地址
        var dappAddress = "n1s9jBuWJFARs7odyC37xxcJJUFP6MxwUKm"; // 主网合约地址
    
        var ex = 1000000000000000000;
    
        // 存钱功能
        $("#search").click(function(){
            
            console.log("********* call smart contract by \"call\" *****************")
    
            var to = dappAddress;
            var value = $("#search_value").val() // 搜索框内的值
            var callFunction = "save"
            var callArgs = "[" + value + "]"
    
            nebPay.call(to, value, callFunction, callArgs,{    //使用nebpay的call接口去调用合约,
                callback: null
                }
            );
    
        })
    
        // 余额
        $("#balance").click(function(){
    
            console.log("********* call smart contract by \"call\" *****************")
      
            var to = dappAddress;
            var value = "0"
            var callFunction = "balanceOf"
            var callArgs = ""
    
            nebPay.simulateCall(to, value, callFunction, callArgs,{    //使用nebpay的call接口去调用合约,
                callback: balanceCallback
                }
            );
    
        })
    
        function balanceCallback(resp) {
            
            console.log("response of balanceCallback resp: " + JSON.stringify(resp))
    
            var result = JSON.parse(resp.result);
    
            if (result === 'null'){
                $(".add_banner").addClass("hide");
                $(".result_success").addClass("hide");
    
                $("#result_faile_add").text($("#search_value").val())
    
                $(".result_faile").removeClass("hide");
            } else{
    
                try{
                    result = JSON.parse(e.data.data.neb_call.result)
                }catch (err){
    
                }
    
                $("#balance_value").val(result.balance / ex)
            }
        }
    
        // 取款
        $("#takeout").click(function(){
    
            console.log("********* call smart contract by \"call\" *****************")
    
            var to = dappAddress;
            var value = "0"
            var callFunction = "takeout"
            var callArgs = "[" + $("#takeout_value").val() * ex + "]"
    
            nebPay.call(to, value, callFunction, callArgs,{    //使用nebpay的call接口去调用合约,
                callback: null
                }
            );
    
        })
    
    </script>
    </body>
    

    其中我们最需要关注的有以下几点:
    1、WebExtensionWallet 星云钱包插件
    2、dappAddress 这个是合约地址,到时部署好了之后修改为你自己的就可以了
    3、neb.js 下面会说到 调用智能合约时用到

    第二步,编写智能合约

    'use strict';
    
    var DepositeContent = function (text) {
     if (text) {
       var o = JSON.parse(text);
       this.balance = new BigNumber(o.balance);
       this.expiryHeight = new BigNumber(o.expiryHeight);
     } else {
       this.balance = new BigNumber(0);
       this.expiryHeight = new BigNumber(0);
     }
    };
    
    DepositeContent.prototype = {
     toString: function () {
       return JSON.stringify(this);
     }
    };
    
    var BankVaultContract = function () {
     LocalContractStorage.defineMapProperty(this, "bankVault", {
       parse: function (text) {
         return new DepositeContent(text);
       },
       stringify: function (o) {
         return o.toString();
       }
     });
    };
    
    // save value to contract, only after height of block, users can takeout
    BankVaultContract.prototype = {
     init: function () {
       //TODO:
     },
    
     save: function (height) {
       var from = Blockchain.transaction.from;
       var value = Blockchain.transaction.value;
       var bk_height = new BigNumber(Blockchain.block.height);
       var orig_deposit = this.bankVault.get(from);
       if (orig_deposit) {
         value = value.plus(orig_deposit.balance);
       }
       var deposit = new DepositeContent();
       deposit.balance = value;
       deposit.expiryHeight = bk_height.plus(height);
       this.bankVault.put(from, deposit);
     },
    
     takeout: function (value) {
       var from = Blockchain.transaction.from;
       var bk_height = new BigNumber(Blockchain.block.height);
       var amount = new BigNumber(value);
       var deposit = this.bankVault.get(from);
       if (!deposit) {
         throw new Error("No deposit before.");
       }
       if (bk_height.lt(deposit.expiryHeight)) {
         throw new Error("Can not takeout before expiryHeight.");
       }
       if (amount.gt(deposit.balance)) {
         throw new Error("Insufficient balance.");
       }
       var result = Blockchain.transfer(from, amount);
       if (!result) {
         throw new Error("transfer failed.");
       }
       Event.Trigger("BankVault", {
         Transfer: {
           from: Blockchain.transaction.to,
           to: from,
           value: amount.toString()
         }
       });
       deposit.balance = deposit.balance.sub(amount);
       this.bankVault.put(from, deposit);
     },
    
     balanceOf: function () {
       var from = Blockchain.transaction.from;
       return this.bankVault.get(from);
     },
    
     verifyAddress: function (address) {
       // 1-valid, 0-invalid
       var result = Blockchain.verifyAddress(address);
       return {
         valid: result == 0 ? false : true
       };
     }
    };
    
    module.exports = BankVaultContract;
    

    第三部,部署智能合约

    如果是第一次部署的话,首先需要到这个网站 https://github.com/nebulasio/web-wallet 把NAS 的web 钱包代码下载下来,然后 打开 index.html

    image

    然后看到右上角有个环境切换的,现在我们是部署到测试环境,那就选择Testnet ,如果需要部署到正式环境的则选择Mainnet

    然后按照下面的步骤

    image
    image

    如果还没有钱包则可以先去创建一个钱包


    image

    如果钱包里面还没有NAS 可以扫描文章底部的二维码注册,注册完成之后点击链接https://testnet.nebulas.io/claim/ 进行操作

    当你的账户地址上有NAS 后点击提交 之后生成合约地址 然后修改第一步中的dappAddress 的值就可以了


    image

    第四步 、完成Web页面与智能合约交互

    为了解决这个问题,星云官方提供了完整的API
    https://github.com/nebulasio/neb.js
    提供用户对于已经部署好的合约进行调用的SDK。

    nebPay.call(to, value, callFunction, callArgs,{    //使用nebpay的call接口去调用合约,
                callback: null
                }
            );
    nebPay.simulateCall(to, value, callFunction, callArgs,{    //使用nebpay的simulateCall接口去调用合约,
                callback: balanceCallback
                }
            );
    

    此外,社区小伙伴为方便在Web页面进行交互,提供了浏览器插件。
    项目的地址是:https://github.com/ChengOrangeJu/WebExtensionWallet 。只需要在Web页面中向浏览器插件POST message 即可唤起插件的内置功能,调用上文已经部署的智能合约中的功能函数,完成Web端与智能合约的交互。

    本DApp网页地址:https://xingyun.io/dapp/nasbank/,欢迎大家上来测试。

    用Chrome 浏览器打开,首先我们需要给浏览器添加扩展插件,安装星云钱包插件
    首先下载点击链接去下载 https://github.com/ChengOrangeJu/WebExtensionWallet

    image 下载完成之后解压 在chrome浏览器中找到扩展程序---- 点击已解压的扩展程序 image
    image

    然后就会出现图中extensionWallet 这个开启,然后刷新主页面NOTE:Please install WebExtensionWallet to use bank 这个提示不会出现了

    这样一个Dapp开发就算完成了,是不是很简单

    2018年真是一个可以让开发者爆富的机会,就看你去不去珍惜

    如果想珍惜那就赶紧行动起来吧!仅需Javascript和一杯下午茶的时间,您就可以开发属于您的第一个DApp,这不是你爆富的机会么?不说了,就是干 干 干
    扫描下面的二维码注册

    image

    你也可以加入星云社区,了解最新信息,让你一步步实现暴富的机会:
    星云社区:https://bbs.xingyun.io/

    相关文章

      网友评论

        本文标题:星云链上的Dapp开发你会了么?如果还是不会那就在看看这个ban

        本文链接:https://www.haomeiwen.com/subject/ujlarftx.html