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