就是要学社区 QQ群组:646854445
你并非已无懈可击,所以你不能逃避问题,拒绝学习!

048孤荷凌寒从零开始学区块链第48天DAPP002

|阅读量:93 |发布于2020-09-13 21:29 : 35


正文内容

【主要内容】

今天继续学习实战,做一个真正的依托于智能合约的DAPP。今天继续学习直接使用Js代码与metaMask钱包来互动完成合约的访问。共耗时30分钟。

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

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

继续参照学习的博文是:

https://www.ucloud.cn/yun/24154.html

提供有效帮助的博文是:

https://www.jianshu.com/p/15ff9da4dd8d

https://www.cnblogs.com/wanghui-garcia/p/9681984.html

https://www.jianshu.com/p/7fabac559eca


【web3.min.js中的web3对象连接并实现访问一个智能合约的方法】

1.多数教程教导的方法是:

```

//多数地方使用了new关键字:

cc =new web3.eth.contract(cryptozombiesABI, cryptoZombiesAddress);

//在有些版本中,不需要使用new关键字,具体完全没有弄明白

cc = web3.eth.contract(cryptozombiesABI, cryptoZombiesAddress);

```

但经昨天与今天的研究发现,这样也许没有连接上合约,并获取合约对象(当然没有报错,我不确定是否成功,但一调用合约内的方法就报这个方法不存在(详细见我的学习过程录屏))

根据这样说明的博文的上下文,发现在本地搭建了完整的Node.js等环境的文章这样的写法比较多。

2.分开连接之使用at关键字连接到合约节点地址

```

var ccc=web3.eth.contract(cryptozombiesABI);                  cc=ccc.at("0xf89074dcdd8798b7e20b8cd88a9a38f27479411c");

```

这是今天成功测试的连接方法 ,第二步连接的是合约所在的节点所在的地址 。

目前证实这是正确有效的写法。

3.分开连接之使用.options.address

```

           myContract.options.address = ‘0x1234FFDD…’;

来自:

https://blog.csdn.net/u012310362/article/details/83048165

```

但我现在没有明确理解,这是否真的是在指定合约地址,还恳请高手指点。

这种写法未经验证。


【调用合约对象中的方法的写法】

1.多数文章是这样的写的:

```

cc.methods.allowance(owneradd,spenderadd).call();


```

上的的对象cc就是一个智能合约对象。

即是说:

合约对象.methods.方法名称(传入此方法需要的实参)

但之前的测试均证明,总是报告找不到要调用的方法的错误。


2.不使用methods方法,而是直接在合约对象后以点语法调用方法名称

(1)不加回调函数的写法:

```

cc. allowance(owneradd,spenderadd).call();


```

直接报错:

```

           Error: The MetaMask Web3 object does not support synchronous methods like eth_call without a callback parameter.

```

(2)部分文章写的加上回调函数的写法,今天测试还是失败:

```

                   cc.allowance(owneradd,spenderadd).call({from:web3.eth.defaultAccount},function(error, result){

                   if(!error)

                   {

                       //$("#info").html(result[0]+' ('+result[1]+' years old)');

                      alert(result);

                   }

                   else{

                       alert(error);

                   }});

                   return "ok"

               }catch(err){

                   return '在尝试调用合约的查询授权节点可用余额时出错 :' + err;

               }

```

报错原因同上。

(3)后来通过试错法,使用下面的写法,受代码中注明的博文提示:

```

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

                   if(!error)

                   {

                       //$("#info").html(result[0]+' ('+result[1]+' years old)');

                      alert(result);

                   }

                   else{

                       alert(error);

                   }});

```

这次测试成功,通过异步调用回调函数的方法,收到了返回的值。

但我还没有理解——为什么智能合约中的方法函数【allowance】中只有两个形参,则只需要传入两个实参,但在上面这种写法中,却将回调函数硬作为第三个实参传入其中。

在此恳请高手指点迷津,不胜感激。



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


【同步语音笔记】

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


【学习过程屏幕录屏】

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



【就是要学】社区
一个平等,纯粹的社群
本社群旨在为真正愿意不断学习,终身成长的朋友提供一个平等互助互相鼓励的清洁纯粹的学习交流的平台。
加入社群将获得
1、与真正终身学习者为伍
2、在榜样带领下坚持每天学习,终身成长
3、养成记录时间日志,成功日记的习惯


【就是要学】社区QQ群:646854445





【返回首页】