随机数
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; 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)");
}
}
|
灾难总是接踵而至,这正是世间的常理。你以为只要哭诉一下,就会有谁来救你?如果失败了,就只能说明我不过是如此程度的男人