erc-721 erc-20 solidity 程式碼檢查效果互動模式
在哪裡可以找到符合安全設計模式(例如檢查效果互動模式)的經過正式驗證的 ERC20/ERC721 可靠性程式碼/模板?
正式驗證 ERC-20 實現的主要問題是 ERC-20 標準本身是非正式的。不同的開發者對待它的方式非常不同,甚至主流解釋也會隨著時間的推移而變化,尤其是在臭名昭著的黑客攻擊之後。
例如,標準狀態,該
Approval
事件必須在任何成功呼叫approve(address _spender, uint256 _value) 時觸發
然而,一些流行的實現甚至在呼叫
transferFrom
和其他可能改變容限的函式時也會記錄這一點,例如burnFrom
.另一個例子是
Transfer
事件,根據標準:必須在代幣轉移時觸發,包括零值轉移。
關於零價值轉移的註釋最近被添加到標準中,因此許多舊的代幣合約不會在零價值轉移中記錄此事件。
此外,尚不清楚
Transfer
事件是否應記錄在從地址到自身的非零值傳輸中。標準中還有許多其他模棱兩可的東西。
以下是 0xcert 參考實現中的相關程式碼:
/** * @dev Actually perform the safeTransferFrom. * @param _from The current owner of the NFT. * @param _to The new owner. * @param _tokenId The NFT to transfer. * @param _data Additional data with no specified format, sent in call to `_to`. */ function _safeTransferFrom( address _from, address _to, uint256 _tokenId, bytes _data ) internal canTransfer(_tokenId) validNFToken(_tokenId) { address tokenOwner = idToOwner[_tokenId]; require(tokenOwner == _from); require(_to != address(0)); _transfer(_to, _tokenId); if (_to.isContract()) { bytes4 retval = ERC721TokenReceiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data); require(retval == MAGIC_ON_ERC721_RECEIVED); } }
來源:https ://github.com/0xcert/ethereum-erc721/blob/master/contracts/tokens/NFToken.sol#L310-L337
這還沒有正式驗證,給了一個嚴格的定義。實際上很少有東西經過形式驗證,如果您對此感興趣,請查看 Vyper 項目——對形式感興趣的人正在使用該語言。
但非正式地,您可以看到
onERC721Received
,遞歸步驟應用於此函式的尾部。這是重要的部分。這是標准文本——https://eips.ethereum.org/EIPS/eip-721——它指出:
轉賬完成後,此函式檢查是否
_to
為智能合約(程式碼大小> 0)。如果是這樣,它呼籲onERC721Received
…_to
因此,這是一個尾端遞歸,它遵循檢查效果互動模式。