zoukankan      html  css  js  c++  java
  • 孤荷凌寒自学第166天区块链080天Dapp035

    孤荷凌寒自学第166天区块链080天Dapp035

    【主要内容】

    今天继续学习实战,做一个真正的依托于智能合约的DAPP。今天继续独立完善一个众筹的合约。共耗时23分钟。

    (此外整理作笔记花费了约40分钟)

    详细学习过程见文末学习过程屏幕录像。

    【解决了昨天监听合约事件后没有取回事件参数值的问题】

    在取回的结果

    Result

    中,所有交易信息(目前我只能监听到最近交易的一笔的事件广播)都存放于多个key键-value值对中

    所以昨天使用了:

    ```

                                for(let key in result){

                                   strls=strls + key + " : " + result[key];

                                }

    ```

    这种方法来获取返回的所有交易信息。

    很明显其最后一个key键名就是args

    对应于合约事件的参数集合。

    于是它有专门的方法来将每一个参数的值获取出来 ——

    ```

    strls2=result.args.name + "," + result.args.amount + "," + result.args.backci;

    ```

    其中,

    没有取到值;

    amout

    backci

    就正好是在合约中定义事件时指明的事件的两个参数

    ```

        event FundTransfer(address investor, uint amount,uint backci, bool isContribution); //向投资人节点返回代币成功

     ```

    于是今天顺利读出了事件广播的参数内容,结果如下:

    address : 0xc56e6ccac9b0fec59ecbe18059d615690b0d740cblockHash : 0x5ca47cdc6a342497e14acd533de0c31e9d34f8246022bd03f6c72460bca1f55cblockNumber : 6453447logIndex : 2removed : falsetransactionHash : 0x0d2eab573b94d1641e0c84ce0a3e15eeb31f2fad6409cdcc9abe36cc10164c4btransactionIndex : 2event : FundTransferargs : [object Object]

    undefined,1000000000000000,10

    【今天修改后的html前端代码】

    ```

    <!DOCTYPE html>

    <html>

    <head>

        <meta charset="UTF-8">

        <title>我要众筹</title>

        <script language="javascript" type="text/javascript" src="jquery.min.js"></script>

        <script language="javascript" type="text/javascript" src="web3.min.js"></script>

        <!-- 1. Include cryptozombies_abi.js here -->

        <script language="javascript" type="text/javascript" src="zongchou_abi4.js"></script>

     

        <script>

    // 格式化日期,如月、日、时、分、秒保证为2位数

    function formatNumber (n) {

        n = n.toString()

        return n[1] ? n : '0' + n;

    }

    // 参数number为毫秒时间戳,format为需要转换成的日期格式

    function formatTime (number, format) {

        let time = new Date(number)

        let newArr = []

        let formatArr = ['Y', 'M', 'D', 'h', 'm', 's']

        newArr.push(time.getFullYear())

        newArr.push(formatNumber(time.getMonth() + 1))

        newArr.push(formatNumber(time.getDate()))

     

        newArr.push(formatNumber(time.getHours()))

        newArr.push(formatNumber(time.getMinutes()))

        newArr.push(formatNumber(time.getSeconds()))

     

        for (let i in newArr) {

            format = format.replace(formatArr[i], newArr[i])

        }

        return format;

    }

     

                //声明一些钱包地址:

                //下面一行定义的是部署合约的节点(创世节点)的信息,公钥

                var wallet_address="0x5227C3EF48B5A1bcF784593e46D9579D26a3b592"; //狐狸钱包的公钥,就是钱包地址,是eth网络上的一个节点。

                //下面一行定义的是节点2的信息

                var w2add="0xe2d6c2f289c53B5aEA44C47293Ba179a3bfa21f0"; //公钥

        

                //下面一行定义的是节点3 的信息

                var w3add="0xb40599fB0366DCf0ffe86677b005b3f20Dfa29aE"; //公钥

        

                //下面一行定义的是节点4 的信息

                var w4add="0x70c8461366d5368B1E79CBFc2Acf4ba56C745977"; //公钥

        

        

       

                // 2. Start code here

                var cc;

                var web3;

     

                //var heyueAddress = "0x833Efb0B28AeD4C6510906fac12Deb60d98D1C23"; //这个合约地址不返回合约代币。要连接的众筹ico合约地址

                //var heyueAddress = "0xC5b33d4ca2Cf2dF9bCeD7491dFa791a9546bEE2c"; //这个合约地址是要返回ci代币的

                //var heyueAddress = "0xa0C369A8E08E5bD17401CC612d453f883cbDed16"; //这个合约是最后发布的ico众筹合约,事件广播完整

                //var heyueAddress = "0x794155739d9E18a0Ca9c133f99b11E467597D4EB"; //这个合约是保证返回的ci最后至少有一个ci

                var heyueAddress='0xC56E6CcAC9b0fEc59eCbe18059d615690B0d740c';

     

                function startApp() {

                    try {

                        $("#contractaddress").html(heyueAddress);

                        var ccc=web3.eth.contract(zongchouABI);

                        cc=ccc.at(heyueAddress); //https://www.cnblogs.com/tinyxiong/p/9046626.html

                        //cc =new web3.eth.contract(cryptozombiesABI, cryptoZombiesAddress); //如果是另一个版本可能还得加上new关键字。

                        $("#firstinfo").html("连接上合约!")

                        //alert(typeof cc);

                        web3.eth.getAccounts(function (err, accounts) {

                                if (accounts.length == 0) {

                                    $("#firstinfo").html("请检查钱包是否解锁");

                                }else{

                                    $("#accountsinfo").html("获取的默认钱包地址:" + web3.eth.defaultAccount);

                                    getCurGift();

                                }

                            });

        

                    } catch (err) {

                        alert(err);

                    }

                    $("#firstinfo").html("加载成功");

                    

                }

        

                //async () => 

     

            //现在这种通过we3.min.js来加载钱包连接的方法,在metamask钱包和麦子钱包中都测试通过。

            window.addEventListener('load',function() {

            try{

                if (typeof web3 !== 'undefined') {

                    web3 = new Web3(web3.currentProvider);

                    startApp();

                } else {

                    //$('#app_loading').hide();

                    //alert(jQuery.i18n.prop('lrn_error_alert'));

                    //mathWallet.closePage();

                    alert("这儿没有钱包环境。");

                }

     

            }catch(err){

                alert(err);

            }

            });

     

        

                //----------------下面是自定义的与合约交互的函数-------------------------

                //--查询总金额---

                function gettotal(){

                    try{

                        cc.getTotal(function(error, result){  //https://www.jianshu.com/p/15ff9da4dd8d

                        if(!error)

                        {

                            var fln=result / (10**18);

                            $("#total").html("已获得众筹总金额:" + fln + " ether");

                           //alert(result);

                        }

                        else{

                            //alert(error);

                            $("#total").html('获取出错:' + error);

                        }});

                        //return "ok"

                        $("#total").html('正在获取。。。');

                    }catch(err){

                        $("#total").html('出错 :' + err);

                    }

                }

     

                //--查询总金额---

                function gettotal2(){

                    try{

                        cc.getContractBalance(function(error, result){  //https://www.jianshu.com/p/15ff9da4dd8d

                        if(!error)

                        {

                            var fln=result / (10**18);

     

                            $("#total2").html("合约地址代币余额:" + fln + " ether");

                           //alert(result);

                        }

                        else{

                            //alert(error);

                            $("#total2").html('获取出错:' + error);

                        }});

                        //return "ok"

                        $("#total2").html('正在获取。。。');

                    }catch(err){

                        $("#total2").html('出错 :' + err);

                    }

                }

        

     

                //查询本次授权的结束日期和时间

                function getEndTimeStamp(){

                    try{

                        cc.getEndTimeStamp(function(error, result){  //https://www.jianshu.com/p/15ff9da4dd8d

                            if(!error)

                        {

                            t=formatTime(result * 1000,"Y-M-D h:m:s");

                            $("#endtime").html("本次众筹截止时间:" + t);

                           //alert(result);

                        }

                        else{

                            //alert(error);

                            $("#endtime").html('获取出错:' + error);

                        }});

                        //return "ok"

                        $("#endtime").html('正在获取。。。');

                    }catch(err){

                        alert("使用授权代币转移时出错 :" + err)

                        return err;

                    }

                }

     

                //查询参与的节点

                function getAllAddress(){

                    try{

                        cc.getalladdress(function(error, result){

                        if(!error)

                        {

                            //result本身就是一个数组对象。

                            //alert(result.length);

                            var strls="";

                            for(i=0;i<result.length;i++){

                                if(i>0){

                                    strls=strls + "<br />" + result[i]

                                }

                            }

                            $("#alladdress").html("已参与节点列表:" + strls);

                           //alert(result);

                        }

                        else{

                            //alert(error);

                            $("#alladdress").html('获取出错:' + error);

                        }});

                        //return "ok"

                        $("#alladdress").html('正在获取。。。');

                    }catch(err){

                        alert("查询所有已参与节点时出错:" + err)

                        return err;

                    }

                }

     

                //查询已参与节点的总数---

                function getAddressCount(){

                    try{

                        cc.getGiftCount(function(error, result){

                            if(!error)

                        {

                            

                            $("#addresscount").html("参与众筹的节点有" + result + "个");

                           //alert(result);

                        }

                        else{

                            //alert(error);

                            $("#addresscount").html('获取出错:' + error);

                        }});

                        //return "ok"

                        $("#addresscount").html('正在获取。。。');

                    }catch(err){

                        alert("查询所有已参与节点总数时出错:" + err)

                        return err;

                    }

                }

     

                //查询所有节点 与参与金额

                function getallgiftandvalue(){

                    try {

                        cc.getgift(function(error, result){

                        if(!error)

                        {

                            //result本身就是一个数组对象。

                            //alert(result.length);

     

                            if(result.length>1){

                                var adds=result[0];

                                var vs=result[1];

                                //alert(adds.length);

                                //alert(vs.length);

                                var strls="";

                                var fln=0.0;

                                for(i=0;i<adds.length;i++){

                                    if(i>0){

                                        fln=(vs[i] - 0.0)/(10**18);

                                        strls=strls + "<br />" + adds[i] + " 捐赠:" + fln + "ether;";

                                    }

                                }

                                $("#alladdressandvalue").html(strls);

                            }else{

                                $("#alladdressandvalue").html("获取到的结果不完整。")

                            }

                           //alert(result);

                        }

                        else{

                            //alert(error);

                            $("#alladdressandvalue").html('获取出错:' + error);

                        }});

                        //return "ok"

                        $("#alladdressandvalue").html('正在获取。。。');

                    } catch (error) {

                        alert("在查询所有参与节点与众筹金额对照关系时出错:" + error)

                    }

                }

     

                //查询指定节点地址的参与众筹金额

                function getAddressGift(a){

                    try {

                        cc.getGiftBalanceFrom(a,function(error, result){

                            if(!error)

                        {

                            //alert(result); 

                            var fln=result / (10**18);

                            $("#address").html("此节点共参与众筹:" + fln + "ether");

                           //alert(result);

                        }

                        else{

                            //alert(error);

                            $("#addresscount").html('获取出错:' + error);

                        }});

                        $("address").html('正在获取... ...');

                    } catch (error) {

                        alert("查询指定节点已众筹金额时出错 :" + error);

                        return error;

                    }

                }

     

                //---查询当前默认节点地址自己的参与众筹金额:

                function getCurGift(){

                    try {

                        cc.getGiftBalance(function(error, result){

                            if(!error)

                        {

                            //alert(result); 

                            var fln=result / (10**18);

                            $("#curinfo").html("共参与众筹:" + fln + "ether");

                           //alert(result);

                        }

                        else{

                            //alert(error);

                            $("#curinfo").html('具体参与金额获取出错:' + error);

                        }});

                        $("#curinfo").html('正在获取... ...');

     

                        //-------------------

                        cc.getgoal(function(error, result){

                            if(!error)

                        {

                            //alert(result); 

                            var fln=result / (10**18);

                            $("#goal").html("目标众筹总量:" + fln + "ether");

                           //alert(result);

                        }

                        else{

                            //alert(error);

                            $("#goal").html('获取目标众筹总量出错:' + error);

                        }});

                        $("#goal").html('正在获取... ...');




                    } catch (error) {

                        alert("查询当前节点已众筹金额时出错 :" + error);

                        return error;

                    }

                }

     

                //参与众筹---

                function dodate(intvalue){

                    //alert(intvalue);

                    try{

                        web3.eth.getTransactionCount(web3.eth.defaultAccount,function(err,res){

                            if(!err){

                                //alert(res);

                                var message = {to:heyueAddress,value:web3.toWei(intvalue,'ether'),'chainId': 3,'gas': 300000,'gasPrice': web3.toWei('40', 'gwei'),'nonce': res};

                                //cc.donate(message,function(err, res){ //使用这行所示方法,交易可以发起,但无法成功完成

                                //使用下一行的方法,执行成功

                                cc.donate.sendTransaction(message,function(err, res){

                                    var output = "";

                                    if (!err) {

                                        output += res;

                                    } else {

                                        output = err;

                                    }

                                    listendonate();

                                    document.getElementById('donateback').innerHTML = "返回信息:Transaction response= " + output + "<br />";

                                });

                                return "ok";

                            }else{

                                alert(err);

                            }

                        }); 

                        document.getElementById('donateback').innerHTML = "操作执行中...";

                    }catch(err){

                        alert('执行参与众筹出错:' + err);

                        document.getElementById('donateback').innerHTML = "执行失败:Transaction response= " + output + "<br />";

                        return err;

                    }

                }

     

                //取回自己的金额----

                function getmygiftback(){

                    try {

                        cc.withdraw(function(error, result){

                            if(!error)

                        {

                            

                            $("#getback").html("操作完成。" + result);

                           //alert(result);

                        }

                        else{

                            //alert(error);

                            $("#getback").html('操作失败:' + error);

                        }});

                        //return "ok"

                        $("#getback").html('正在操作。。。');

                    } catch (error) {

                        alert("尝试取回自己的参与众筹金额的份额时出错 :" + error)

                    }

                }

     

                //发起众筹节点取走成功众筹的总金额

                function getdraw(){

                    try {

                        cc.draw(function(error, result){

                            if(!error)

                        {

                            

                            $("#getdoback").html("操作完成。" + result);

                           //alert(result);

                        }

                        else{

                            //alert(error);

                            $("#getdoback").html('操作失败:' + error);

                        }});

                        //return "ok"

                        $("#getdoback").html('正在操作。。。');

                    } catch (error) {

                        alert("尝试取走众筹款项时出错 ;" + error)

                    }

                }

     

                //监听众筹事件

                function listendonate(){

                    try {

                        document.getElementById("listenback").innerText="监听中......";

                        //------------------------------------------

                        var event=cc.FundTransfer();

                        event.watch(function(error,result){

                            if(!error){

                                var strls="";

                                var strls2="";

                                for(let key in result){

                                   strls=strls + key + " : " + result[key];

                                }

                                //https://me.tryblockchain.org/blockchain-solidity-event.html

                                try {

                                    strls2=result.args.name + "," + result.args.amount + "," + result.args.backci;

                                } catch (error) {

                                    strls2="具体事件参数信息未能获取到:" + error;

                                }

     

                                document.getElementById("listenback").innerHTML=strls + "<br />" + strls2;

                            }else{

                               document.getElementById("listenback").innerText=error;

                            }

                        })

     

                        //上面的写法成功,但只能监听当前 一次事件

     

                        /*

                            注意参照以下代码:

                            instructorEvent.watch(function(error, result) {

                                if (!error)

                                    {

                                        $("#info").html(result.args.name + ' (' + result.args.age + ' years old)');

                                    } else {

                                        console.log(error);

                                    }

                            });

                        */

     

                        //下面这种写法报错

                        //var myEvent = cc.events.FundTransfer({

                        //    filter: {myIndexedParam: [20,23], myOtherIndexedParam: '0x123456789...'}, // Using an array means OR: e.g. 20 or 23

                        //                fromBlock: 0

                        //                },

                        //    fromBlock: 0

                        //}, function(error, event){})

                        //.on('data', function(event){

                        //    document.getElementById("listenback").innerText=event; // same results as the optional callback above

                        //})

                        //.on('changed', function(event){

                        //        // remove event from local database

                        //})        

                        //.on('error', console.error);

     

                        

                    } catch (error) {

                        document.getElementById("listenback").innerText="错误:" + error;

                    }

                }

     

                //--------------------------调用测试---------------------------------------

                //--查询total

                function cmdone_click(){

                    try{

                        gettotal();

                    }catch(err){

                        alert(err);

                    }

                }

     

                //--查询total2

                function cmdone2_click(){

                    try{

                        gettotal2();

                    }catch(err){

                        alert(err);

                    }

                }

        

                //--查询本次众筹的结束日期和时间----

                function cmdtwo_click(){

                    try{

                        getEndTimeStamp();

                    }catch(err){

                        alert(err);

                    }

                }

     

                //--查询所有已参与节点---

                function cmdthree_click(){

                    try{

                        getAllAddress();

                    }catch(err){

                        alert(err);

                    }

                }

     

                //--查询已参与节点总数--

                function cmdfoure_click(){

                    try{

                        getAddressCount();

                    }catch(err){

                        alert(err);

                    }

                }

     

                //--查询指定节点的参与总金额---

                function cmdfive_click(){

                    try{

                        var v=document.getElementById("txtaddress").value;

                        if(v.length<=0){

                            alert("请先输入要查询的节点地址");

                        }else{

                            getAddressGift(v);

                        }

                        

                    }catch(err){

                        alert(err);

                    }

                }

     

                //--查询所有节点与金额对照字典

                function cmdsix_click(){

                    try {

                        getallgiftandvalue();

                    } catch (error) {

                        alert(error);

                    }

                }

     

                //--参与众筹-------------

                function cmddonate_click(){

                    try{

                        var strls=document.getElementById("txtvalue").value;

                        //alert(strls);

                        if(/^[0-9]+.?[0-9]+?$/.test(strls)){

                            var fls=parseFloat(strls);

                            //var intls=fls * (10**18);

                            //alert(fls);

                            k=dodate(fls);

                        }else{

                            alert('只能输入数字');

                        }

                    }catch(err){

                        alert("操作失败:" + err);

                    }

                }

     

                //---参与众筹都取回自己的参与金额---

                function cmdgetback_click(){

                    try {

                        getmygiftback();

                    } catch (error) {

                        alert("操作失败:" + error);

                    }

                }

     

                //众筹发起者取走成功众筹的金额

                function cmddo_click(){

                    try {

                        getdraw();

                    } catch (error) {

                        alert("操作失败:" + error)   

                    }

                }

     

                //监听众筹事件

                function cmdlisten_click(){

                    try {

                        document.getElementById("listenback").innerText="开始监听";

                        listendonate();

                    } catch (error) {

                        alert("操作失败:" + error);

                    }

                }

     

        

            </script>

            

    </head>

    <body>

        <div>

            <p>

                众筹合约地址:

            </p>

            <p id="contractaddress" name="contractaddress">

     

            </p>

            <p id="goal" name="goal">

     

            </p>

     

            <p id="firstinfo" name="firstinfo">

     

            </p>

     

            <p id="accountsinfo" name="accountsinfo">

     

            </p>

            <p id="curinfo" name="curinfo">

     

            </p>

        

        </div>

        <div>

            <input type="button" value="查询当前众筹总金额" id="cmdone" name="cmdone" onclick="cmdone_click();" />

            <span id="total" name="total"></span>

            <br /><br />

            <input type="button" value="查询当前众筹总金额" id="cmdone2" name="cmdone2" onclick="cmdone2_click();" />

            <span id="total2" name="total2"></span>

            <br /><br />

            <input type="button" value="查询此众筹的截止日期和时间" id="cmdtwo" name="cmdtwo" onclick="cmdtwo_click();" />

            <span id="endtime" name="endtime"></span>

            <br /><br />

            <input type="button" value="查询此众筹已参与节点" id="cmdthree" name="cmdthree" onclick="cmdthree_click();" />

            <span id="alladdress" name="alladdress"></span>

            <br /><br />

            <input type="button" value="查询此众筹已参与节点和金额" id="cmdsix" name="cmdsix" onclick="cmdsix_click();" />

            <span id="alladdressandvalue" name="alladdressandvalue"></span>

            <br /><br />

            <input type="button" value="查询此众筹参与节点总数" id="cmdfoure" name="cmdfoure" onclick="cmdfoure_click();" />

            <span id="addresscount" name="addresscount"></span>

            <br /><br />

            <input type="button" value="查询指定节点参与金额" id="cmdfive" name="cmdfive" onclick="cmdfive_click();" />

            <br />

            <input type="text" value="" id="txtaddress" name="txtaddress" style="200px;" />

            <br />

            <span id="address" name="address"></span>

            <br /><br />

            <input type="button" value="我要入筹" id="cmddo" name="cmddo" onclick="cmddonate_click();" />

            <input type="text" value="0.001" id="txtvalue" name="txtvalue" />eth

            <br />

            <span id="donateback" name="donateback"></span>

            <br /><br />

            <input type="button" value="取回我的众筹" id="cmdgetback" name="cmdgetback" onclick="cmdgetback_click();" />

            <span id="getback" name="getback">只有超过众筹结束时间之后,且没有完成众筹金额时才能取回。</span>

            <br /><br />

            <input type="button" value="取走众筹款" id="cmddo" name="cmddo" onclick="cmddo_click();" />

            <span id="getdoback" name="getdoback">只有众筹合约发起节点才能取走众筹成功的款项。</span>

            <br /><br />

     

            <br /><br />

            <input type="button" value="监听合约的众筹事件" id="cmdlisten" name="cmdlisten" onclick="cmdlisten_click();" />

            <span id="listenback" name="listenback"></span>

            <br /><br />



        </div>

        

    </body>

    </html>

    ```

    github: https://github.com/lhghroom/Self-learning-blockchain-from-scratch

    原文地址:https://www.941xue.com/content.aspx?id=1663   

    【欢迎大家加入[就是要学]社群】

    如今,这个世界的变化与科技的发展就像一个机器猛兽,它跑得越来越快,跑得越来越快,在我们身后追赶着我们。

    很多人很早就放弃了成长,也就放弃了继续奔跑,多数人保持终身不变的样子,原地不动,成为那猛兽的肚中餐——当然那也不错,在猛兽的逼迫下,机械的重复着自我感觉还良好地稳定工作与生活——而且多半感觉不到这有什么不正常的地方,因为在猛兽肚子里的是大多数人,就好像大多数人都在一个大坑里,也就感觉不出来这是一个大坑了,反而坑外的世界显得有些不大正常。

    为什么我们不要做坑里的大多数人?

    因为真正的人生,应当有百万种可能 ;因为真正的一生可以有好多辈子组成,每一辈子都可以做自己喜欢的事情;因为真正的人生,应当有无数种可以选择的权利,而不是总觉得自己别无选择。因为我们要成为一九法则中为数不多的那个一;因为我们要成为自己人生的导演而不是被迫成为别人安排的戏目中的演员。

    【请注意】

    就是要学社群并不会告诉你怎样一夜暴富!也不会告诉你怎样不经努力就实现梦想!

    【请注意】

    就是要学社群并没有任何可以应付未来一切变化的独门绝技,也没有值得吹嘘的所谓价值连城的成功学方法论!

    【请注意】

    社群只会互相帮助,让每个人都看清自己在哪儿,自己是怎样的,重新看见心中的梦想,唤醒各自内心中的那个英雄,然后勇往直前,成为自己想要成为的样子!

    期待与你并肩奔赴未来!

    www.941xue.com

    QQ群:646854445 (【就是要学】终身成长)

    【同步语音笔记】

    https://www.ximalaya.com/keji/19103006/344580173

    【学习过程屏幕录屏】

    https://www.bilibili.com/video/BV1154y1v7Ce/

    欢迎大家添加我为好友: QQ: 578652607
  • 相关阅读:
    mysql 自定义排序
    arcgis 好人
    eclipse启动tomcat,提示三个端口均被占用
    oracle 查看表空间创建日期
    navacat 链接oracle oci invalid handle
    java +mysql 递归排序/* START WITH aa.parentid IN ( 10000, 20000, 30000, 40000, 50000, 60000, 70000 ) connect BY prior aa.id = aa.parentid ORDER siblings BY aa.id ASC*/ to
    Double 转 BigDecimal
    mysql 死锁 Waiting for stored function metadata lock
    Graphtree--zabbix增强功能(一屏展示所有内容)
    zabbix 分布式监控(proxy)源码安装
  • 原文地址:https://www.cnblogs.com/lhghroom/p/13978639.html
Copyright © 2011-2022 走看看