ERC721分析

ERC721是什么?

ERC是Ethereum非同质化代币(no-fungible token)。官方详细介绍
什么叫同质化同质化的意思就是本质上是一样的,没有什么区别,就像RMB一样,你的100元和我的100元购买力没什么区别。(收藏币除外)。非同质化,就是本质不是一样的。比如:

  • 实物财产, 房子, 独一无二的艺术品,比如梵高画的《星空》
  • 虚拟财产, 加密帽, 收藏卡牌等
  • 负债资产, 贷款

关键函数分析

safeTransferFrom vs transferFrom 与区别

function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external payable;
function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;
function transferFrom(address _from, address _to, uint256 _tokenId) external payable;

safeTransferFrom(address _from, address _to, uinit256 _tokenId, bytes data)

  • 调用者必须拥有tokenId的所有权
  • 接收地址不能为0
  • 如果to是一个contract,应该调用合约的onERC721Received方法,并坚持返回值不为bytes4(keccak256("onERC721Received(address,uint256,bytes)")) 抛出异常。
注意:接收地址,分为两种钱包地址和合约地址。
因为没有人拥有合约地址的私钥,所以转入合约地址,不做特殊处理,就会丢失代币。

怎么识别address是合约地址,并检查返回值?

function _checkOnERC721Received(
    address from,
    address to,
    uint256 tokenId,
    bytes _data
  )
    internal
    returns (bool)
  {
    if (!to.isContract()) {
      return true;
    }
    bytes4 retval = IERC721Receiver(to).onERC721Received(
      msg.sender, from, tokenId, _data);
    return (retval == _ERC721_RECEIVED);
  }

onERC721Received实现介绍 //TODO

参考

你可能感兴趣的:(ERC721分析)