《智能合约Solidity学习笔记 - 僵尸军团》Part1- 搭建僵尸工厂

pragma solidity ^0.4.19; //指定版本号

/**
   关卡1 : 创建 根据输入的姓名 创建随机僵尸
   学习网址: https://cryptozombies.io/zh
**/


// 创建合约
contract ZombieFactory {

    /**
       关于事件:
       事件 是合约和区块链通讯的一种机制。你的前端应用“监听”某些事件,并做出反应。

        例子:
        // 这里建立事件
        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;
        }
        你的 app 前端可以监听这个事件。JavaScript 实现如下:

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

    //建立事件
    event NewZombie(uint zombieId, string name, uint dna);

    /**
    无符号整数: uint
    uint 无符号数据类型, 指其值不能是负数,对于有符号的整数存在名为 int 的数据类型。
    **/

    uint dnaDigits = 16; //设置僵尸DNA为16位 Digits n. 数字
    uint dnaModulus = 10 ** dnaDigits; // 10 的 16次方
    // 结构体允许你生成一个更复杂的数据类型,它有多个属性。

    struct Zombie {
        string name; //僵尸名字
        uint dna; //僵尸DNA 16位
    }
    /**
    如果你想建立一个集合,可以用 _数组_这样的数据类型. Solidity 支持两种数组:静态数组和动态数组:
        固定长度为2的静态数组:
        uint[2] fixedArray;
        固定长度为5的string类型的静态数组:
        string[5] stringArray;
        动态数组,长度不固定,可以动态添加元素:
        uint[] dynamicArray;

    公共数组
    你可以定义 public 数组, Solidity 会自动创建 getter 方法. 语法如下:
    Person[] public people;
    其它的合约可以从这个数组读取数据(但不能写入数据),所以这在合约中是一个有用的保存公共数据的模式。
    **/

    Zombie[] public zombies; //创建结构体/ java中叫对象 数组

    /**
      函数:
      1. 习惯上函数里的变量都是以(_)开头 (但不是硬性规定) 以区别全局变量
      2. 只有当你需要外部世界调用它时才将它设置为公共。
         public / private 只能内部使用 类似于java暴露或者不暴露接口
      3. 把函数定义为 view, 意味着它只能读取数据不能更改数据
         pure 函数, 表明这个函数甚至都不访问应用里的数据,例如:
                function _multiply(uint a, uint b) private pure returns (uint) {
                    return a * b;
                }
       这个函数甚至都不读取应用里的状态 — 它的返回值完全取决于它的输入参数,
       在这种情况下我们把函数定义为 pure.
      4. 指定函数返回值类型  returns(数据类型)

   **/
    function _createZombie(string _name, uint _dna) private { // 创建僵尸函数
//        zombies.push(Zombie(_name, _dna)); // 僵尸对象数组 放入创建的僵尸
        uint id = zombies.push(Zombie(_name, _dna)) - 1;
        NewZombie(id, _name, _dna);
        /**
        定义僵尸id
        array.push() 返回数组的长度类型是uint
        因为数组的第一个元素的索引是 0, array.push() - 1 将是我们加入的僵尸的索引。
        zombies.push() - 1 就是 id, 数据类型是 uint 把它用到 NewZombie 事件中。
        **/
    }

    // 创建僵尸的随机DNA 返回值类型为 uint 无符号整型
    function _generateRandomDna(string _str) private view returns (uint) {
        /**
         Ethereum 内部有一个散列函数keccak256,它用了SHA3版本。
         一个散列函数基本上就是把一个字符串转换为一个256位的16进制数字。
         字符串的一个微小变化会引起散列数据极大变化。 这里使用它来创建一个随机数 一个伪随机十六进制数
         _str 参数为僵尸的名字 rand % 10^16 得到 16位长度的DNA
        **/
        uint rand = uint(keccak256(_str));
        return rand % dnaModulus;
    }

    //最后创建一个随机的僵尸 给定一个僵尸名字
    function createRandomZombie(string _name) public {
        uint randDna = _generateRandomDna(_name); //创建随机DNA
        _createZombie(_name, randDna); //创建僵尸
    }


}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值