美文网首页区块链 | Distributed Ledger TechnologyHyperledger
通过小游戏学习Ethereum DApps编程(4)

通过小游戏学习Ethereum DApps编程(4)

作者: 假装在去天使之城的路上 | 来源:发表于2018-09-02 10:15 被阅读14次

通过小游戏学习Ethereum DApps编程(4)

完全没有基础知识的童鞋,请参照:通过小游戏学习Ethereum DApps编程(1)(2)(3)。

这里我们继续总结一些关于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的结果。如果我们生产的随机数,不是我希望看到的,我们可以不广播这个结果,显然这样就不是公平的。这是随机数的脆弱的地方。
在这个游戏里面,我们并没有使用真正的以太币,所以关于安全的话题,我们将在以后涉及到。

自定义modifier

复习一下这个表格里面的内容:

用语 用法
string 字符串
address 调用智能合约的用户地址 可以通过msg.sender来获取
mapping mapping (uint => address) public zombieToOwner; 存储数据:key - value
event event NewZombie(uint zombieId, string name, uint dna); 从外部监听合约状态的变化
struct struct Zombie { string name; uint dna; } 定义一个数据结构
require require(msg.sender == owner); 判定函数,不满足条件,就发生意外
modifier modifier onlyOwner() { require(msg.sender == owner); _; } 自定义限制函数

如果我们想要判断游戏里面的一个角色是否是玩家的时候,可以这样自定义一个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) {}

storage

ETH网络中存储数据有两种方式:memory 和 storage。
memory用于临时存储,类似于RAM,不需要消费Gas。
storage用于永久存储,类似于硬盘,需要消费Gas。

怎么定义一个storage呢?

    Zombie storage myZombie = zombies[_zombieId];

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区块链技术布道 GitHub

cryptozombies

相关文章

网友评论

    本文标题:通过小游戏学习Ethereum DApps编程(4)

    本文链接:https://www.haomeiwen.com/subject/leopwftx.html