首先ERC721的标准:

contract ERC721 {

  event Transfer(address indexed _from, address indexed _to, uint256 _tokenId);

  event Approval(address indexed _owner, address indexed _approved, uint256 _tokenId);

  function balanceOf(address _owner) public view returns (uint256 _balance);

  function ownerOf(uint256 _tokenId) public view returns (address _owner);

  function transfer(address _to, uint256 _tokenId) public;

  function approve(address _to, uint256 _tokenId) public;

  function takeOwnership(uint256 _tokenId) public;

}

1.调查代币

  balanceOf:

    function balanceOf(address _owner) public view returns(uint256 _balance)

    //这个函数的功能是传入地址参数,返回代币数量

  ownerOf:

    function ownerOf(uint256 _tokenId) public view returns(address _owner);

    //传入代币(token)的ID而返回拥有者的address

2.转移代币:

  ERC721有三种函数关于转移代币:

方法一:直接转移

  function transfer(address _to,uint256 _tokenId) public;

    将想转移的代币_tokenId转移到_to地址中

方法二:

function approve(address _to,uint256 _tokenId) public;

function takeOwnership(uint256 _tokenId) public;

  代币拥有者先调用approve,传入相同的参数后,该合约会存储谁被允许提取代币,

然后存储到一个mapping(uint256=> address)中,然后调用takeOwnershi时合约会检查msg.sender

查看是否有批准来提取代币。

这里使用私有函数来实现方法1使用//方便自己

function _transfer(address _from, address _to, uint256 _tokenId) private {
ownerZombieCount[_to]++;
ownerZombieCount[_from]--;
zombieToOwner[_tokenId] = _to;
Transfer(_from, _to, _tokenId);
再修改transfer函数的内容,只需要在transfei中使用_transfer就行了
}
 
  实现批准approve函数:
  步骤:
    1,作为所有者,用新主人的address和交易的_tokenId来调用approve
    2.接受者通过takeOwnership来获得代币
     //在这两者之间需要一个数据结构来存储什么人被批准获取什么代币

  首先建立一个映射来使得查找代币和对应人的地址,再转接,同样的这也需要ERC721的event监听

  再实现takeOwnership函数,用来检测是否确保msg.sender被批准来提取代币了,确认后就是用_transfer函数

来提取