溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

solidity[46]-隨機(jī)數(shù)與事件

發(fā)布時(shí)間:2020-08-18 15:36:08 來源:網(wǎng)絡(luò) 閱讀:847 作者:jonson_jackson 欄目:開發(fā)技術(shù)

隨機(jī)數(shù)

solidity語言中提供了內(nèi)置的哈希函數(shù)keccak256來產(chǎn)生隨機(jī)數(shù)。
由于哈希函數(shù)的特點(diǎn),產(chǎn)生的哈希值隨著傳遞參數(shù)值與數(shù)量的不同而不同。

keccak256函數(shù)特性

1、可以傳遞多了參數(shù),多種類型的值例如:keccak256(1,2,“jonson”,0x32);
2、keccak256的返回值是bytes32類型,意味著其返回值是一個(gè)256位的隨機(jī)數(shù)。
3、一般,我們使用全局屬性,例如時(shí)間now,msg.sender,block.number等全局屬性來構(gòu)造隨機(jī)數(shù)。

隨機(jī)數(shù)案例

構(gòu)造一個(gè)游戲,有70%的概率贏下游戲。
如下函數(shù),通過時(shí)間來構(gòu)造隨機(jī)數(shù)。首先將bytes32類型強(qiáng)制的轉(zhuǎn)換為uint256類型。
取模操作,uint256(keccak256(now,msg.sender)) % 100在0-100之間均勻分布,因此小于70的概率位70%。 從而有70%的可能性會(huì)返回正確結(jié)果。

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

事件

事件 是dapp程序和區(qū)塊鏈通訊的一種機(jī)制。你的前端應(yīng)用“監(jiān)聽”某些事件,并做出反應(yīng)。
例子:

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;
 //觸發(fā)事件,通知app
 IntegersAdded(_x, _y, result);
 return result;
}
你的 app 前端可以監(jiān)聽這個(gè)事件。JavaScript 實(shí)現(xiàn)如下:
YourContract.IntegersAdded(function(error, result) {
 // 干些事
}

事件例子

如上面的游戲合約中,贏下游戲就會(huì)觸發(fā)事件

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;
        }
   }
}

事件本質(zhì)

觸發(fā)后的事件記錄會(huì)存儲(chǔ)在區(qū)塊鏈上。
當(dāng)觸發(fā)事件后,在remix控制臺(tái)之上會(huì)出現(xiàn)事件的記錄。
from:代表合約地址
topic:代表的是事件的唯一標(biāo)示,其本質(zhì)也是hash函數(shù),如在此例子中,為keccak256(eve(string))的結(jié)果。
event:代表事件的名字
args:參數(shù)以及長度

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/

  • 版權(quán)聲明: 本博客所有文章除特別聲明外,均采用 CC BY 4.0 CN協(xié)議 許可協(xié)議。轉(zhuǎn)載請(qǐng)注明出處!

solidity[46]-隨機(jī)數(shù)與事件

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI