1. 程式人生 > >十一課堂|通過小遊戲學習Ethereum DApps程式設計(3)

十一課堂|通過小遊戲學習Ethereum DApps程式設計(3)

image

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

複習一下這個表格裡面的內容:

image

如果我們想要判斷遊戲裡面的一個角色是否是玩家的時候,可以這樣自定義一個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...

}

image

image

本系列文章作者:HiBlock區塊鏈技術佈道群-Amywu

原文釋出於簡書

加微信baobaotalk_com,加入技術佈道群

北京blockathon回顧:

成都blockathon回顧:

以下是我們的社群介紹,歡迎各種合作、交流、學習:)

image