温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

solidity[46]-随机数与事件

发布时间:2020-08-18 15:36:08 阅读:874 作者:jonson_jackson 栏目:开发技术
开发者测试专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

随机数

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%的可能性会返回正确结果。

12345
function test() returns(bool){      if(uint256(keccak256(now,msg.sender)) % 100  < 70){          return true;      } }

事件

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

12345678910111213
// 这里建立事件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) {  // 干些事}

事件例子

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

12345678910
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:参数以及长度

1234567891011
[	{		"from": "0x692a70d2e424a56d2c6c27aa97d1a86395877b3a",		"topic": "0xb753f213c434015869c7cc20def5e88c589e415518548d45d73ebbc2e4ea2ba2",		"event": "eve",		"args": {			"0": "win",			"length": 1		}	}]

完整代码

12345678910111213141516171819202122
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]-随机数与事件

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI

开发者交流群×