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

095孤荷凌寒自学第181天区块链095天Dapp050

|阅读量:85 |发布于2020-12-03 21:30:01


正文内容

【主要内容】

今天继续学习实战,继续完成一个菠菜类的DU大小的智能合约。共耗时31分钟。

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

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


【今天对智能合约添加了新的方法,但没有测试与发布】

dudaxiao.sol未测试的代码如下:

```

pragma solidity ^0.4.25;


contract dudaxiao{

   //原合约是一次性合约,就是只能参与一次。

   struct jilu{

       uint time; //开奖时间

       uint result; //开奖的那个数字

       uint peilv; //赢了一局后的赔率,这儿暂时没有理解

   }


   uint private createmeblocknumber; //创建合约时的以太坊网络区块高度

   address private owner; //合约部署节点

   bool private isstopthis; //是否已经停止本合约

   bool private iscanxiazhu; //是否可以下注,就是判断是否是一轮游戏的中间过程,原合约表示合约只使用一次,只投注一次即可。

   uint private yingli; //赢利,这儿暂时没有理解


   //---下面申明只存放一次参与过程参与节点信息的节点地址数组

   address[] private addsmall; //所有押小的地址

   address[] private addbig; //所有押大的地址

   uint[] private valuesmall;

   uint[] private valuebig;


   //--下面存放的是各参与节点押的金额的maping对象变量

   //--就是说,下面的mapping记录下了每一个参与游戏的节点投注的金额

   mapping(address => uint) private bigmap; //此mapping中记录了每一个压大的节点投注的金额

   mapping(address => uint) private smallmap; //此mapping中记录了每一个压小的节点投注的金额


   //定义记录此次(因为本合约只玩一次)游戏的开奖结果

   jilu private r;


   //下面开始定义函数修改器

   //判断合约是否已经不再执行了(就是说已经不能再参与游戏了,游戏已经结束 )

   modifier onlyIfNotStopped{

       require(isstopthis==false);

       _;

   }    


   //判断合约是否允许下注,就是说现在还可以下注吗?

   modifier canXiaZhu{

       require(iscanxiazhu==true);

       _;

   }


   //判断当前调用合约的节点是否是部署合约的节点

   modifier onlyOwner{

       require(msg.sender==owner);

       _;

   }


   constructor() public{

       //这是合约初始化函数,只在部署时执行一次的函数

       //--记录下当前合约部署时的以太坊的块高度

       createmeblocknumber=block.number; //当前块的Index

       owner=msg.sender; //部署合约时的节点地址

       isstopthis=false; //合约还没有停用

       iscanxiazhu=true; //当前还可以下注

       yingli=0;


   }


   //下面定义的是接收eth转入的两个函数

   //回退函数来接收eth

   function () public payable{

       xiazhu(msg.data.length > 0); //如果发起转账交易时有数据,则认为是猜大

   }


   //专门的下注函数用以接收eth

   function xiazhu(bool isda) public payable{

       require(isstopthis == false);

       require(iscanxiazhu == true);

       //现在需要看一下,节点参与此游戏时,是否给足了猜注

       uint v = msg.value; //这儿先获取到取得的金额,默认单位是wei

       require(v >= 10 finney);

       address a = msg.sender;

       //判断是猜大,还是猜小

       if(isda==true){

           //如果是猜大

           //添加到猜大的地址与金额对照表中

           bigmap[a] += v; //这种写法意味着同一个节点可以多次下注

           AddAddress(v,a,valuebig,addbig);

       }else{

           //如果是猜小

           smallmap[a] += v; //这种写法意味着同一个节点可以多次下注

           AddAddress(v,a,valuesmall,addsmall);


       }

   }


   //生成一个随机数(0-5)

   function ShengChengRandom(uint seed) internal view returns(uint){

       //这个函数是供本合约内部调用的,所以使用了internal关键词

       uint rr = uint(keccak256(blockhash(block.number-1), seed)) % 6;

       return rr;


   }


   //返回当前调用合约的节点的总下注金额

   function myXiaZhuValue() public view returns(uint,uint){

       return (bigmap[msg.sender],smallmap[msg.sender]);

       //返回的元组中,第一个是本节点猜大的金额,第二个是本节点猜小的金额

   }


   //返回本次游戏的总参与金额

   function allDuZhu() public view returns(uint,uint){

       //先分别汇总计算

       uint intallbig = 0;

       uint intallsmall = 0;

       uint i = 0;

       uint v = 0;


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

           v = bigmap[addbig[i]]; //取出下注猜大的所有节点(当前i这个节点)的实际下注金额。

           intallbig += v;

       }


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

           v = smallmap[addsmall[i]]; //取出下注猜小的所有节点(当前i这个节点)的实际下注金额。

           intallsmall += v; //所有下注金额都要增加到总下注金额中

       }


       return(intallbig,intallsmall);

   }


   //智能合约的部署节点取走合约平台抽水部分

   function getYingLi() public payable onlyOwner returns(bool){

       owner.transfer(yingli);

   }

   

   //获取最后一次开奖(其实只有一次开奖)的开奖记录

   function getKaiJiangInfo() public view returns(uint,uint,uint){

       return(r.time,r.result,r.peilv);

   }


   //查询当前合约节点自己的余额

   function getContractBalance() public view returns(uint){

       return address(this).balance;

   }


   //查询所有猜大的节点的地址与下注金额

   function getallbigaddressandvalue() public view returns(address[],uint[]){

       return(addbig,valuebig);

   }


   //查询所有猜小的节点的地址与下注金额

   function getallsmalladdressandvalue() public view returns(address[],uint[]){

       return(addsmall,valuesmall);

   }


   //查询指定的节点已经下注了多少eth

   function getxiazhuvaluefrom(address a) public view returns(uint,uint){

       return (bigmap[a],smallmap[a]);

   }


}





```

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


【同步语音笔记】

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


【学习过程屏幕录屏】

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



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


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





【返回首页】