什麼是solidity中的receive關鍵字?
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); } }
在評估是否使用
receive
或fallback
時,請考慮以下事項:這就是為什麼在 0.6.x 版本中,回退函式被分成兩個獨立的函式:
receive() external payable
— 對於空的 calldata(和任何值)fallback() external payable
— 當沒有其他函式匹配時(甚至接收函式也不匹配)。可選payable
。這種分離為想要接收純乙太幣的合約提供了備用功能的替代方案。
根據 Ismael 的評論進行編輯:2300 gas 津貼要求
.send()
並.transfer()
適用receive()
於他們適用的相同方式.transfer()
。此外,使用 0.6.0 之前的 solc 版本編譯的合約能夠與該receive()
函式進行互動。可以在此處的乙太坊部落格文章中找到更多資訊。