学习区块链(五)--创建僵尸军团Ⅱ

继续上一节我们使用_generateRandomDna方法随机的产生DNA,如果了解过比特币的实现,其中有一块很重要的地方就是使用哈希函数来生成随机数,在区块链中随机的生成安全的随机数是一项比较难的工作,在本章中使用Ethereum内部散列函数来生成16位的随即数。

一.生成随机数

pragma solidity ^0.4.19;

contract ZombieFactory {

    uint dnaDigits = 16;
    uint dnaModulus = 10 ** dnaDigits;

    struct Zombie {
        string name;
        uint dna;
    }

    Zombie[] public zombies;

    function _createZombie(string _name, uint _dna) private {
        zombies.push(Zombie(_name, _dna));
    }

    function _generateRandomDna(string _str) private view returns (uint) {
        uint rand = uint(keccak256(_str));
        return rand % dnaModulus;
    }
}

函数和Java也很类似,转换后类型强转也没什么说的。

二.组合函数
将随机生成dna的方法和创建僵尸的方法通过createRandomZombie组合在一起:

pragma solidity ^0.4.19;

contract ZombieFactory {

    uint dnaDigits = 16;
    uint dnaModulus = 10 ** dnaDigits;

    struct Zombie {
        string name;
        uint dna;
    }

    Zombie[] public zombies;

    function _createZombie(string _name, uint _dna) private {
        zombies.push(Zombie(_name, _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);
    }

}

到这里我们的合约基本完成了,我们直接将代码复制到http://remix.ethereum.org/ 这个在线的IDE,当然用我们之前创建的truffle环境也可以,但这个使用起来更简单,直接右上角compile后在Run里点击create就创建一个合约实例了,输入相应参数点击createRandomZombie方法就产生了相应的一个僵尸了,再点击zombies数组直接看见我们创建的僵尸了:

学习区块链(五)--创建僵尸军团Ⅱ_第1张图片

三.事件
事件是合约和区块链通讯的机制,可以在前端来监听这些事件,并作出反应,来如当僵尸创建成功时,我们就通过事件返回它们:

pragma solidity ^0.4.19;

contract ZombieFactory {

    event NewZombie(uint zombieId, string name, uint 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);
    }

    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);
    }

}

event NewZombie(uint zombieId, string name, uint dna); 这个就是事件,在_createZombie方法中调用事件 NewZombie(id, _name, _dna);就能让前端监听到:

至于前端怎么监听事件显示数据,我们在后面继续学习!!!

你可能感兴趣的:(区块链,智能合约入门)