天天看點

鍊遊開發:僵屍大戰

本項目來源 https://cryptozombies.io/

0.前言

近期在關注NFT+遊戲的相關資訊,決定實際操作一下,基于solidity和web3js,實作erc721協定,開發一個僵屍大戰小遊戲,在開發過程中,也學習學習solidity和web3js的相關知識。

本篇推文作為本系列的第一篇,主要實作了一個僵屍工廠,能夠通過輸入的字元串随機産生新的僵屍。

1.重點知識

1.所有的 Solidity 源碼都必須冠以 “version pragma” — 标明 Solidity 編譯器的版本. 以避免将來新的編譯器可能破壞你的代碼。同時,Solidity 的代碼都包裹在合約裡面. 一份合約就是以太應币應用的基本子產品, 所有的變量和函數都屬于一份合約, 它是你所有應用的起點,一段簡單的代碼如下:

pragma solidity ^0.4.19;
contract ZombieFactory {

}
           

2.solidity中,狀态變量是被永久地儲存在合約中。 也就是說它們被寫入以太币區塊鍊中. 想象成寫入一個資料庫,聲明變量(uint預設是uint256類型)。如下所示

uint myUnsignedInteger = 100;
           

3.solidity具有結構體,形式與c語言類似。同時,如果想建立一個集合,可以用數組類型,solidity支援動态和靜态,因為以太坊高額的汽油費,是以普遍使用的動态數組,動态數組添加元素使用Push函數。可以用public聲明公共數組,其它的合約可以從這個數組讀取資料(但不能寫入資料),是以這在合約中是一個有用的儲存公共資料的模式。

// 固定長度為2的靜态數組:
uint[2] fixedArray;
// 固定長度為5的string類型的靜态數組:
string[5] stringArray;
// 動态數組,長度不固定,可以動态添加元素:
//給people動态數組添加Person元素
people.push(Person(16, "Vitalik"));
uint[] dynamicArray;
//聲明公共數組
Person[] public people;
           

4.在 Solidity 中函數定義的句法如下:

function eatHamburgers(string _name, uint _amount) {

}
           

5.函數的更多知識:Solidity 定義的函數的屬性預設為公共。 這就意味着任何一方 (或其它合約) 都可以調用你合約裡的函數。而在函數名字後面使用關鍵字 private 可以定義為私有。和函數的參數類似,這意味着隻有我們合約中的其它函數才能夠調用這個函數。同時,函數還有修飾符,主要應用有兩個,一個是view,意味着它隻能讀取資料不能更改資料: 還有pure, 表明這個函數甚至都不通路應用裡的資料。具體如下:

//公共函數、具有傳回值
string greeting = "What's up dog";

function sayHello() public returns (string) {
  return greeting;
}
//定義一個具有view修飾的函數
function sayHello() public view returns (string) {

}

//定義一個具有pure修飾的函數
function sayHello() public pure returns (string) {

}
           

6.散列函數:keccak256()函數接受一個字元串,生成一個段256位的16進制數字,字元串的一個微小變化會引起散列資料極大變化,如:

//6e91ec6b618bb462a4a6ee5aa2cb0e9cf30f7a052bb467b0ba58b8748c00d2e5
keccak256("aaaab");
           

7.事件 是合約和區塊鍊通訊的一種機制。你的前端應用監聽 某些事件,并做出反應,例子:

// 這裡建立事件
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;
}
           

前端監聽:

YourContract.IntegersAdded(function(error, result) {
  // 幹些事
})

           

2.代碼

代碼裡面涉及的程式設計知識都在以上的重點知識裡面。 本章中WEB3JS代碼主要用于調用生成僵屍的接口,以及對僵屍模型的渲染。

//每個僵屍有16位的DNA,前端根據這16位DNA進行渲染。

//設定版本
pragma solidity ^0.4.19;

contract ZombieFactory {
//設定監聽事件。
      event NewZombie(uint zombieId, string name, uint dna);
//用于生成DNA
    uint dnaDigits = 16;
    uint dnaModulus = 10 ** dnaDigits;
//僵屍結構體
    struct Zombie {
        string name;
        uint dna;
    }
//設定公共可查的僵屍數組。
    Zombie[] public zombies;
    
//定義私有函數 生成僵屍。
    function _createZombie(string _name, uint _dna) private {
           uint id = zombies.push(Zombie(_name, _dna)) - 1;
         NewZombie(id, _name, _dna);
    }
//生成随機DNA
    function _generateRandomDna(string _str) private view returns (uint) {
        uint rand = uint(keccak256(_str));
        return rand % dnaModulus;
    }
    
    function createRandomZombie(string _name) public {
        uint randDna = _generateRandomDna(_name);
        _createZombie(_name, randDna);
    }

}

           

3.反思

還有一些工作沒有完成:

  • 使用remix和以太坊錢包,可以在測試網上很容易的進行系統的調試。下一步會進行這系列嘗試。
  • WEB3JS的學習要加強。

繼續閱讀