Erc-20

erc-721 erc-20 solidity 程式碼檢查效果互動模式

  • August 19, 2021

在哪裡可以找到符合安全設計模式(例如檢查效果互動模式)的經過正式驗證的 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

因此,這是一個尾端遞歸,它遵循檢查效果互動模式。

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