ERC721是什么?
ERC是Ethereum非同質(zhì)化代幣(no-fungible token)。官方詳細(xì)介紹
什么叫同質(zhì)化同質(zhì)化的意思就是本質(zhì)上是一樣的,沒有什么區(qū)別,就像RMB一樣,你的100元和我的100元購買力沒什么區(qū)別。(收藏幣除外)
。非同質(zhì)化,就是本質(zhì)不是一樣的。比如:
- 實(shí)物財(cái)產(chǎn), 房子, 獨(dú)一無二的藝術(shù)品,比如梵高畫的《星空》
- 虛擬財(cái)產(chǎn), 加密帽, 收藏卡牌等
- 負(fù)債資產(chǎn), 貸款
關(guān)鍵函數(shù)分析
safeTransferFrom vs transferFrom 與區(qū)別
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)
- 調(diào)用者必須擁有tokenId的所有權(quán)
- 接收地址不能為0
- 如果to是一個(gè)contract,應(yīng)該調(diào)用合約的onERC721Received方法,并堅(jiān)持返回值不為
bytes4(keccak256("onERC721Received(address,uint256,bytes)"))
拋出異常。
注意:接收地址,分為兩種錢包地址和合約地址。
因?yàn)闆]有人擁有合約地址的私鑰,所以轉(zhuǎn)入合約地址,不做特殊處理,就會(huì)丟失代幣。
怎么識(shí)別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);
}