solidity[46]-随机数与事件-创新互联

随机数

solidity语言中提供了内置的哈希函数keccak256来产生随机数。
由于哈希函数的特点,产生的哈希值随着传递参数值与数量的不同而不同。

成都创新互联公司专注于呈贡网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供呈贡营销型网站建设,呈贡网站制作、呈贡网页设计、呈贡网站官网定制、成都小程序开发服务,打造呈贡网络公司原创品牌,更为您提供呈贡网站排名全网营销落地服务。

keccak256函数特性

1、可以传递多了参数,多种类型的值例如:keccak256(1,2,“jonson”,0x32);
2、keccak256的返回值是bytes32类型,意味着其返回值是一个256位的随机数。
3、一般,我们使用全局属性,例如时间now,msg.sender,block.number等全局属性来构造随机数。

随机数案例

构造一个游戏,有70%的概率赢下游戏。
如下函数,通过时间来构造随机数。首先将bytes32类型强制的转换为uint256类型。
取模操作,uint256(keccak256(now,msg.sender)) % 100在0-100之间均匀分布,因此小于70的概率位70%。 从而有70%的可能性会返回正确结果。

1
2
3
4
5
function test() returns(bool){
   if(uint256(keccak256(now,msg.sender)) % 100  < 70){
     return true;
   }
}

事件

事件 是dapp程序和区块链通讯的一种机制。你的前端应用“监听”某些事件,并做出反应。
例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
// 这里建立事件
event IntegersAdded(uint x, uint y, uint result);

function add(uint _x, uint _y) public {
 uint result = _x + _y;
 //触发事件,通知app
 IntegersAdded(_x, _y, result);
 return result;
}
你的 app 前端可以监听这个事件。JavaScript 实现如下:
YourContract.IntegersAdded(function(error, result) {
 // 干些事
}

事件例子

如上面的游戏合约中,赢下游戏就会触发事件

1
2
3
4
5
6
7
8
9
10
pragma solidity ^0.4.23;
contract  random{
  event eve(string);
  function test() returns(bool){
    if(uint256(keccak256(now,msg.sender)) % 100  < 70){
      emit eve("win");
      return true;
    }
  }
}

事件本质

触发后的事件记录会存储在区块链上。
当触发事件后,在remix控制台之上会出现事件的记录。
from:代表合约地址
topic:代表的是事件的唯一标示,其本质也是hash函数,如在此例子中,为keccak256(eve(string))的结果。
event:代表事件的名字
args:参数以及长度

1
2
3
4
5
6
7
8
9
10
11
[
{
"from": "0x692a70d2e424a56d2c6c27aa97d1a86395877b3a",
"topic": "0xb753f213c434015869c7cc20def5e88c589e415518548d45d73ebbc2e4ea2ba2",
"event": "eve",
"args": {
"0": "win",
"length": 1
}
}
]

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
pragma solidity ^0.4.23;

contract  random{
  event eve(string);

  function test() returns(bool){

    if(uint256(keccak256(now,msg.sender)) % 100  < 70){
      emit eve("win");
      return true;
    }
  }

  function test2() returns(bytes32){

   emit eve("win");
   return keccak256("eve(string)");


  }

}
  • 本文链接: https://dreamerjonson.com/2018/11/23/solidity-46-random/

  • 版权声明:本博客所有文章除特别声明外,均采用 CC BY 4.0 CN协议 许可协议。转载请注明出处!

solidity[46]-随机数与事件

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


网站名称:solidity[46]-随机数与事件-创新互联
文章起源:http://ybzwz.com/article/dchhsh.html