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

孤荷凌寒自学第167天区块链081天Dapp036

|阅读量:97 |发布于2020-11-16 21:23:25


正文内容

【主要内容】

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

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

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



【在合约的广播事件中广播更多的中间信息,验证了是price的问题】

修改合约代码如下:

```

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

   function () public payable{

       require(now < endtime,"");

       uint a = msg.value;

       require(a > 0,"");

       //assert(gift[msg.sender]>=0);

       //每个节点至少捐赠大于0个eth

       if(gift[msg.sender]==0){ //判断此节点是否之前已经捐过款项

           giftcount += 1; //统计已经有多少节点参与捐助,而且要去重节点。

           alladd[alladd.length++] = msg.sender; //在地址数组中记录下当前地址,

           //alladd.push(msg.sender);//这一句代码和上一句代码是重复作用的,是同样的功能 ,只保留 一句即可,但没有 验证

           allvalue[allvalue.length++] = a;

           //allvalue.push(a);

       }else{

           //定位到指定的allvalue数组中的元素

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

               if(alladd[i]==msg.sender){

                   allvalue[i] = allvalue[i] + a;

               }

           }

       }

       gift[msg.sender] += a;

       total += a;

       if(total >= goal){

           //广播众筹金额已经达标

           emit GoalReached(owner,total);

       }

       //要执行下一句代码(这句代码用于向投资人返还自己的代币ci),则要求owner节点必须 授权此合约 (众筹合约)动用owner节点指定数量 的ci币的权限(这个授权是通ci代币合约来实现的)

       //tokenci.transferFrom(owner,msg.sender,(a/(10**18))*price); //我的这个ci币的小数位是0,所以没有作处理,如果不是的话,则要作处理:http://www.r9it.com/20180727/crowd-by-token.html

       //使用下一行,只要本合约(众筹合约所在地址)有代币ci,就可以返还投资人ci代币)

       uint ufirst = a*price;

       uint usecond = ufirst/(10**18);

       uint backci = ufirst/(10**18);

       if (backci < 10){

           backci = 10;

       }

       tokenci.transfer(msg.sender,backci);

       emit FundTransfer(msg.sender,a,backci,ufirst,usecond,price,true);

   }


   function donate() public payable returns(bool isok){

       require(now < endtime,"");

       uint a = msg.value;

       require(a > 0,"");

       //每个节点至少捐赠大于0个eth

       //每个节点至少捐赠大于0个eth

       if(gift[msg.sender]==0){ //判断此节点是否之前已经捐过款项

           giftcount += 1; //统计已经有多少节点参与捐助,而且要去重节点。

           alladd[alladd.length++] = msg.sender; //在地址数组中记录下当前地址,

           //alladd.push(msg.sender);

           allvalue[allvalue.length++] = a;

           //allvalue.push(a);

       }else{

           //定位到指定的allvalue数组中的元素

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

               if(alladd[i]==msg.sender){

                   allvalue[i] = allvalue[i] + a;

               }

           }

       }

       gift[msg.sender] += a;

       total += a;

       if(total >= goal){

           //广播众筹金额已经达标

           emit GoalReached(owner,total);

       }

       //要执行下一句代码(这句代码用于向投资人返还自己的代币ci),则要求owner节点必须 授权此合约 (众筹合约)动用owner节点指定数量 的ci币的权限(这个授权是通ci代币合约来实现的)

       //tokenci.transferFrom(owner,msg.sender,(a/(10**18))*price); //我的这个ci币的小数位是0,所以没有作处理,如果不是的话,则要作处理:http://www.r9it.com/20180727/crowd-by-token.html

       //使用下一行,只要本合约(众筹合约所在地址)有代币ci,就可以返还投资人ci代币)

       uint ufirst = a*price;

       uint usecond = ufirst/(10**18);

       uint backci = ufirst/(10**18);

       if (backci < 10){

           backci = 10;

       }

       tokenci.transfer(msg.sender,backci);

       emit FundTransfer(msg.sender,a,backci,ufirst,usecond,price,true);

       return true;

   }


```

这一次广播了更多的内容,于是收到的回执如下:

```

address : 0x7a2559f23e056f39e844a465600eb605c4e3aeabblockHash : 0xfab4a6bc95c9aa41fc688e89a87023b124fd581c6bd680226ab08b3d883002ebblockNumber : 6459690logIndex : 1removed : falsetransactionHash : 0xdcd4b44f01fce402ac56ec22be5d6ba479195a48db3ea8082382b4cea81af856transactionIndex : 0event : FundTransferargs : [object Object]

undefined,1000000000000000,100,100000000000000000000,100,100000

```

或者是这样:

```

address : 0x7a2559f23e056f39e844a465600eb605c4e3aeabblockHash : 0xf64653a6103fb4068a9533c33457f3f611e0d0166dd1374e279d9d55d0c7d604blockNumber : 6459730logIndex : 2removed : falsetransactionHash : 0xfb543180f13d6ba1f5145490eb9105ad39fcffa6345f0bef21afc89cf54d4f4ctransactionIndex : 1event : FundTransferargs : [object Object]

undefined,10000000000000000,1000,1e+21,1000,100000

```

现在的Price是设置为100000,于是返还给投资者的ci就是100(投资者投入了0.001个ether)

那就证明了之前的问题全部出在price的设置上。


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


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

【同步语音笔记】

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

 

【学习过程屏幕录屏】

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

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


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





【返回首页】