十一課堂|通過小遊戲學習Ethereum DApps程式設計(3)
1
solidity語言的知識點
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,而且將盡快接受處理結果。
屬於,一個節點可以決定是否廣播一個transaction的結果。如果我們生產的隨機數,不是我希望看到的,我們可以不廣播這個結果,顯然這樣就不是公平的。這是隨機數的脆弱的地方。
在這個遊戲裡面,我們並沒有使用真正的以太幣,所以關於安全的話題,我們將在以後涉及到。
2
自定義modifier
複習一下這個表格裡面的內容:
如果我們想要判斷遊戲裡面的一個角色是否是玩家的時候,可以這樣自定義一個modifier
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) {}
3
storage
ETH網路中儲存資料有兩種方式:memory 和 storage。
memory用於臨時儲存,類似於RAM,不需要消費Gas。
storage用於永久儲存,類似於硬碟,需要消費Gas。
怎麼定義一個storage呢?
Zombie storage myZombie = zombies[_zombieId];
4
struct
資料結構類的定義:
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回顧:
成都blockathon回顧:
以下是我們的社群介紹,歡迎各種合作、交流、學習:)