Solidity

為什麼ERC721有transferFrom和safeTransferFrom?

  • April 17, 2021

ERC721 同時具有safeTransferFromand transferFromsafeTransferFrom如果接收合約的onERC721Received方法沒有返回特定的幻數,則拋出 where 。這是為了確保接收合約能夠接收令牌,因此不會永久失去。

transferFrom但是,當它沒有這個檢查時,為什麼也會存在呢?我唯一的猜測是讓 ERC721 與 ERC20 兼容,ERC20 有一個transferFrom具有相同簽名的方法。然而,每個標準中方法的語義不同(uint256ERC20 中的指的是值,而 ERC721 中的指的是 tokenID),因此兼容性似乎具有誤導性。

我錯過了什麼?

原始Github ERC721 執行緒中有一個關於保持“不安全”傳遞函式的解釋(來自 Dieter Shirley 的評論,別名“dete”,EIP-721 的作者之一):

在與@flockonus 進一步思考和討論後,我們建議保留一個簡單(因此“不安全”)的 transfer() 方法。(即它會像 ERC-20 一樣工作,而不是 EIP-223。)

我們的推理如下:

  • 更簡單的標準總是更好。要求越少,就越難搞砸。(而且 NFT 已經夠複雜了!)
  • 防止所有可能的使用者錯誤不是智能合約的工作(它必須防止無效操作,而不是意外操作)。特別是,我們試圖避免的情況(將 NFT 發送給不知道如何處理它們的合約)最好通過錢包軟體中的檢查和警告來解決。錢包(或其他智能合約介面)將始終能夠進行比智能合約更強大和動態的檢查,並且還能夠與使用者進行一些“來回”對話。智能合約沒有相當於“這似乎不安全,你確定嗎?” 對話框!

因此,為了更大的靈活性和使標準盡可能簡單,保留了此功能。

引用自:https://ethereum.stackexchange.com/questions/97379