Random Numbers安全
不少時候咱們都須要隨機數。微信
在solidity裏面,咱們能夠經過 keccak256 來產生hash隨機數。網絡
// Generate a random number between 1 and 100: uint randNonce = 0; uint random = uint(keccak256(now, msg.sender, randNonce)) % 100; randNonce++; uint random2 = uint(keccak256(now, msg.sender, randNonce)) % 100;
在以太坊中,Dapp被調用時,被調用的這個操做將做爲一個transaction被廣播到網絡上其餘節點上。 網絡上的節點收到了transaction後,都但願Proof of Work,因此都會嘗試成爲第一個解決這個transaction的節點。而後將這組交易與他們的工做證實(PoW)一塊兒發佈到網絡的其餘節點上。數據結構
但一個節點完成了transaction的處理,其餘節點都將中止處理這個transaction,並且將盡快接受處理結果。app
屬於,一個節點能夠決定是否廣播一個transaction的結果。若是咱們生產的隨機數,不是我但願看到的,咱們能夠不廣播這個結果,顯然這樣就不是公平的。這是隨機數的脆弱的地方。dom
在這個遊戲裏面,咱們並無使用真正的以太幣,因此關於安全的話題,咱們將在之後涉及到。區塊鏈
複習一下這個表格裏面的內容:ui
若是咱們想要判斷遊戲裏面的一個角色是不是玩家的時候,能夠這樣自定義一個modifiercode
modifier ownerOf(uint _zombieId) { require(msg.sender == zombieToOwner[_zombieId]); _; }
能夠這樣使用遊戲
function feedAndMultiply() internal ownerOf(_zombieId) {}
當你有兩個限制處理的時候,能夠這樣使用,用空格連接:
function changeName(uint _zombieId, string _newName) external aboveLevel(2, _zombieId) ownerOf(_zombieId) {}
ETH網絡中存儲數據有兩種方式:memory 和 storage。
memory用於臨時存儲,相似於RAM,不須要消費Gas。
storage用於永久存儲,相似於硬盤,須要消費Gas。
怎麼定義一個storage呢?
Zombie storage myZombie = zombies[_zombieId];
數據結構類的定義:
struct Zombie { string name; uint dna; uint32 level; uint32 readyTime; uint16 winCount; uint16 lossCount; }
初始化:
Zombie(_name, _dna, 1, uint32(now + cooldownTime), 0, 0)
++ 運算符
和其餘語言很類似,能夠這樣對整數進行加一
myZombie.winCount++;
if else
if (zombieCoins[msg.sender] > 100000000) { // You rich!!!} else { // We require more ZombieCoins... }
本系列文章做者:HiBlock區塊鏈技術佈道羣-Amywu
原文發佈於簡書
加微信baobaotalk_com,加入技術佈道羣
Blockathon|48小時極客競賽,區塊鏈馬拉松等你挑戰(上海)
時間:2018年10月19-21日
地點:(上海黃浦)露香園路1號(近淮海東路)P2
北京blockathon回顧:
Blockathon(北京):48小時極客開發,區塊鬆11個現場交付項目創意公開
成都blockathon回顧: