2019,来一只加密猪!

本文讲解如何基于以太坊智能合约实现一个加密猪(cryptopiggies)的加密资产。效果如下:

CryptoPiggies

2017年底以太坊上发布了一款名叫加密猫(CryptoKitties)的小游戏。它是一款“撸猫”的游戏,玩家利用以太币可以进行猫的养成与繁殖,而且每只猫都是独一无二的,100%归玩家拥有;。加密猫不能被复制、带走或毁坏,但可以购买、出售或交易。加密猫的官方界面如下图所示。


加密猫
加密猫

随着加密猫的流行,其作者Axion Zen后来定义了一种称为ERC721的标准。ERC721的意思是“Non-Fungible Tokens”,翻译为不可互换的通证,英文简写为”NFT”。通证是一种数字权益证明,它是加密的并且可以流通。符合ERC721标准的通证都是独一无二的,各个通证之间无法相互替换。下面就让我们来实现一只符合ERC721标准的加密猪。

本教程环境要求:
– NODEJS 5.0以上
– Windows,Linux,或Mac OS X

一、搭建开发环境

加密猪开发基于truffle框架和OpenZeppelin库。Truffle是针对基于以太坊的一套开发框架,它致力于让以太坊上的开发变得简单。OpenZeppelin是用Solidity语言实现的一个开源库,里面包含了智能合约开发所需的各种重要功能,使开发者可以在更少的时间内创建更安全的智能合约。安装Truffle和OpenZeppelin使用NODE的包管理工具npm即可。

安装Truffle

打开终端执行命令

$ npm install -g truffle

安装成功后执行truffle命令可以看到truffle的版本信息和可以指令,如下图所示。


Truffle
Truffle

安装OpenZeppelin

安装OpenZeppelin使用如下命令:

npm install openzeppelin-solidity

安装完成后新建一个名为CryptoPiggies的文件夹,然后执行cd CryptoPiggies命令进入该文件夹,接着执行truffle init命令初始化项目,成功后可以看到如下的目录结构:


项目初始目录
项目初始目录

初始化项目后可以开始实现加密猪了。

二、实现智能合约

加密猪的智能合约实现需要继承于OpenZeppelin中的ERC721Full、ERC721Mintable和Ownable这三个智能合约。这三个合约的功能分别如下:

  • ERC721Full:这个合约实现了基于ERC721标准的所有功能,还提供了很多开发ERC721通证所需要的工具函数;
  • ERC721Mintable:这个合约实现了发行ERC721通证所需要的功能;
  • Ownable:这个合约加入了一个拥有者的地址,用来提供权限控制的功能。

加密猪的智能合约代码如下:

import 'openzeppelin-solidity/contracts/ownership/Ownable.sol';
import 'openzeppelin-solidity/contracts/token/ERC721/ERC721Full.sol';
import 'openzeppelin-solidity/contracts/token/ERC721/ERC721Mintable.sol';
import './Strings.sol';

contract OwnableDelegateProxy { }

contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}

/**
 * @title 加密猪的智能合约
 */
contract CryptoPiggies is ERC721Full, ERC721Mintable, Ownable {
  address proxyRegistryAddress;

  // 当前的通证ID
  uint256 private _currentTokenId = 0;

  /**
    * @dev 合约构建函数
    */
  constructor(address _proxyRegistryAddress) ERC721Full("CryptoPiggies", "CP") public {
    proxyRegistryAddress = _proxyRegistryAddress;
  }

  /**
    * @dev 实现发行通证至指定地址
    * @param _to 是通证的拥有者
    */
  function mintTo(address _to) public onlyOwner {
    uint256 newTokenId = _getNextTokenId();
    _mint(_to, newTokenId);
    _incrementTokenId();
  }

  /**
    * @dev 获取下一个通证ID
    * @return 返回通证ID
    */
  function _getNextTokenId() private view returns (uint256) {
    return _currentTokenId.add(1);
  }

  /**
    * @dev 在当前通证ID上加1
    */
  function _incrementTokenId() private  {
    _currentTokenId++;
  }

  /**
    * 返回通证属性的基础URI
    */
  function baseTokenURI() public pure returns (string memory) {
    return "https://cryptopiggies.herokuapp.com/api/token/";
  }

 /**
    * 返回指定通证属性的完整URI
    */
  function tokenURI(uint256 _tokenId) external view returns (string memory) {
    return Strings.strConcat(
        baseTokenURI(),
        Strings.uint2str(_tokenId)
    );
  }

  /**
   * 实现OpenSea上获取通证列表的权限控制。
   */
  function isApprovedForAll(
    address owner,
    address operator
  )
    public
    view
    returns (bool)
  {
    // Whitelist OpenSea proxy contract for easy trading.
    ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress);
    if (address(proxyRegistry.proxies(owner)) == operator) {
        return true;
    }

    return super.isApprovedForAll(owner, operator);
  }
}

主要的函数和说明如上所示。其中CryptoPiggies是这个加密猪通证的名称,CP是这个通证的符号,baseTokenURI函数返回的https://cryptopiggies.herokuapp.com/api/token/是一个服务器地址,用来提供每个加密猪通证的属性信息。另外Strings.sol实现了一下字符串的处理函数,用来拼接字符串和将数字转成字符串。完成合约后下一步是编译合约并部署到以太坊。

三、编译和部署

这里使用Remix这个工具和编译智能合约。为方便在Remix上操作智能合约,可以使用一个叫truffle-flattener的工具将上面的智能合约及其依赖文件合并到一个文件中。truffle-flattener的安装命令如下:

npm install truffle-flattener -g

$ truffle-flattener安装完成后在CryptoPiggies文件夹下面执行如下命令:

$ truffle-flattener contracts/CryptoPiggies.sol > full.sol

上面这个命令会将智能合约及其依赖文件合并到一个名为full.sol的问题中。

a.编译

打开Remix然后将full.sol文件中内容复制到Remix中,如下图所示:


Remix
Remix

然后选择0.5.2版本编译器即可自动编译,编译成功的合约会显示在下面,如下图所示:

编译合约
编译合约

b.部署

编译成功后点击“Run”标签进行部署,部署时需要消耗以太币,本教程中使用以太坊测试网络Rinkeby。Rinkeby测试网络上的以太币可以通过https://faucet.rinkeby.io/这里免费申请获取。部署时选择CryptoPiggies这个合约,在Deploy后面填写自己的以太坊账户地址,如下图所示:


部署合约
部署合约

点击“Deploy”后MetaMask会弹出支付窗口,选择“CONFIRM”进行支付,如下图所示:

支付以太币
支付以太币

一般情况下,等待1分钟左右即可部署成功。成功后下面会显示部署的智能合约地址,如下图所示:

部署成功
部署成功

下面来发行一只加密猪到自己的以太坊账户。找到下面的mintTo函数,地址填写自己的账户,然后点击“transact”,在弹出的MetaMask窗口支付需要的以太币,如下图所示:

发行加密猪
发行加密猪

等待一分钟左右第一只加密猪就发行成功了,下面在OpenSea上进行查看和交易。OpenSea是一个基于区块链的数字资产去中心化交易平台,可以购买、出售、赠送和拍卖加密资产。

四、查看和交易加密猪

加密猪的查看和交易功能不需要开发,部署成功后即可OpenSea上查看和购买。如合约地址为0x88f57bc445a43be7bdc1bcc29550a8d7f43a9d4f,通证ID为3的加密资产发布到Rinkeby网络后,在OpenSea上对应的访问地址为https://rinkeby.opensea.io/assets/0x88f57bc445a43be7bdc1bcc29550a8d7f43a9d4f/3 。访问这个地址就可以查看这个加密资产的信息,并且可以在OpenSea交易或者将这个资产赠送给别人,如下图所示。


OpenSea
OpenSea

0 0 vote
Article Rating
Subscribe
提醒
guest
0 评论
Inline Feedbacks
View all comments