Solidity

什麼是solidity中的receive關鍵字?

  • March 31, 2020

Solidity 有一個receive關鍵字。它是什麼以及如何使用它?

TL; 博士

receive是 Solidity 0.6.x 中的一個新關鍵字,用作只能接收乙太幣的備份函式。

  • receive() external payable— 對於空的 calldata(和任何值)
  • fallback() external payable— 當沒有其他函式匹配時(甚至接收函式也不匹配)。可選payable

長答案

Solidity 0.6.x 引入了receive關鍵字,以便在呼叫其備份函式時使合約更加明確。該方法用作合約中的備份函式,並在將乙太幣發送到沒有 calldatareceive的合約時呼叫。如果該方法不存在,它將使用該函式。receive``fallback

文件

一個合約最多可以有一個receive函式,使用聲明receive() external payable { ... }(不帶function關鍵字)。此函式不能有參數,不能返回任何內容,並且必須具有external可見性和payable狀態可變性。它在呼叫帶有空 calldata 的合約時執行。這是在普通 Ether 傳輸中執行的函式(例如,通過 .send() 或 .transfer())。如果不存在這樣的功能,但存在應付回退功能,則回退功能將在普通的乙太幣轉賬中被呼叫。如果既不存在接收 Ether 也不存在應付回退功能,則合約無法通過正常交易接收 Ether 並引發異常。

要使用它,您可以通過以下方式將其包含在您的契約中:

pragma solidity ^0.6.0;

// This contract keeps all Ether sent to it with no way
// to get it back.
//  This is example code. Do not use it in production.
contract Sink {
   event Received(address, uint);
   receive() external payable {
       emit Received(msg.sender, msg.value);
   }
}

在評估是否使用receivefallback時,請考慮以下事項:

這就是為什麼在 0.6.x 版本中,回退函式被分成兩個獨立的函式:

  • receive() external payable— 對於空的 calldata(和任何值)
  • fallback() external payable— 當沒有其他函式匹配時(甚至接收函式也不匹配)。可選payable

這種分離為想要接收純乙太幣的合約提供了備用功能的替代方案。

根據 Ismael 的評論進行編輯:2300 gas 津貼要求.send().transfer()適用receive()於他們適用的相同方式.transfer()。此外,使用 0.6.0 之前的 solc 版本編譯的合約能夠與該receive()函式進行互動。

可以在此處的乙太坊部落格文章中找到更多資訊。

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