Solidity

發送 VS 呼叫 - 差異以及何時使用和何時不使用

  • December 8, 2019

有人可以解釋使用發送和呼叫契約之間的區別以及何時使用和不使用這些不同的方法嗎?

例如 :

  msg.sender.send(number);  
  msg.sender.call.value(number)();

我知道 send 使用 2300 gas,而 using call 不使用任何 gas。

編輯 2019 年 12 月:call.value()()現在應該用於轉移乙太幣。(不要使用發送或傳輸。)

請參閱: 在伊斯坦布爾更新後 transfer() 是否仍然安全?

1 Send()不再轉發氣體。它只是使用從價值轉移成本(最低 9040)中抽取的硬編碼津貼(2300 gas)。發送乙太幣就足夠了,但也足以基本上做一個額外的小型日誌記錄操作(在回退函式中)。以下操作將消耗比提供給備份功能的津貼更多的氣體:

• 寫入儲存

• 創建契約

• 呼叫消耗大量gas的外部函式

• 發送乙太幣

2 如果一個send()呼叫用完了gas,它不會拋出錯誤,它只是返回false。

來自solidity Doc:

如果合約收到 Ether(沒有呼叫函式),則執行回退函式。合約只能依靠當時可用的“gas 津貼”(2300 gas)。這筆津貼不足以以任何方式訪問儲存。為確保您的合約能夠以這種方式接收 Ether,請檢查備份功能的 gas 需求(例如在 browser-solidity 的“詳細資訊”部分中)。

• 有一種方法可以使用addr.call.value(x)() 將更多gas 轉發給接收合約。這與 addr.send(x) 基本相同,只是它轉發所有剩餘的氣體並為接收者提供執行更昂貴操作的能力。這可能包括回調發送契約或您可能沒有想到的其他狀態更改。因此,它為誠實的使用者和惡意行為者提供了極大的靈活性。

警告:接收乙太幣但未定義回退函式的合約會拋出異常,將乙太幣發回(這在 Solidity v0.4.0 之前是不同的)。所以如果你想讓你的合約接收乙太幣,你必須實現一個備份功能。

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