溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

solidity[46]-隨機數與事件

發布時間:2020-08-18 15:36:08 來源:網絡 閱讀:894 作者:jonson_jackson 欄目:開發技術

隨機數

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]-隨機數與事件

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女