Solidity

為什麼ERC721 OZ合約中有兩個同名函式?

  • April 12, 2021

我在看OpenZeppelin ERC721 contract,函式_safeMint定義了兩次:

  /**
    * @dev Safely mints `tokenId` and transfers it to `to`.
    *
    * Requirements:
    d*
    * - `tokenId` must not exist.
    * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
    *
    * Emits a {Transfer} event.
    */
   function _safeMint(address to, uint256 tokenId) internal virtual {
       _safeMint(to, tokenId, "");
   }


   /**
    * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
    * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
    */
   function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual {
       _mint(to, tokenId);
       require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
   }

兩者的評論都沒有幫助我理解。我可以看到他們收到不同數量的參數,但是合約怎麼知道我在呼叫哪一個呢?

我的問題是這是如何工作的?它不應該導致編譯錯誤或至少一個覆蓋另一個嗎?為什麼要使用相同的名稱,這是我不知道的功能嗎?

您可以擁有多個具有相同名稱的函式,只要它們的簽名不同即可。參數也是簽名的一部分,所以這兩個函式的函式簽名是不同的。因此,這些功能不會以任何方式混淆。每當您呼叫合約函式時,您也必須提供參數。根據名稱和提供的參數選擇執行的函式。

第一個函式只是秒針的簡寫版本,因為它呼叫了第二個函式。它們可以有不同的名稱,並且以相同的方式工作,但可能選擇了相同的名稱,因為第一個只是指向第二個。

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