Transactions

是否可以在單個事務中進行多個呼叫?

  • December 3, 2016

假設你的合約有一個非常簡單的函式F(),它需要 about1,000 gas來處理。假設您想呼叫該函式 100 次。由於21,000 gas每筆交易的成本約為,您將支付2,200,000 gas. 但是,如果你的合約有一個功能:

function Fs(uint n){
   for (uint i=0; i<n; ++i)
       F();
}

您可以通過一次呼叫來執行完全相同的操作Fs(100),這將只花費121,000 gas94.5% 的成本。有沒有辦法F在一個事務中發送多個呼叫,這樣即使合約沒有專門針對它進行優化,你也可以達到相同的效果?

F()你在什麼情況下反复打電話?

命名您撥打電話的地點C()。有多種可能性:

  1. C()並且F()在同一份契約中。在這種情況下,C()可以F()重複呼叫而沒有任何重大成本。
  2. C()在一個契約中,F()在另一個契約中。在這種情況下,C()可以在同一筆交易中多次呼叫F(),但每次都會消耗一些gas。(但是,少於每次發送單獨的交易)
  3. C()完全在乙太坊之外(即通過 web3 的 javascript 函式)並且F()是一個常量函式(即,它不會修改合約的狀態。)在這種情況下,C()可以免費呼叫F()任意多次。它將模擬交易而不是實際發送它們。
  4. C()在乙太坊之外,並且F()非常量的。在這種情況下,每筆交易都將花費全額。您可以編寫另一個合約以F()重複呼叫,如 2 中所示。

請注意,事務呼叫之間存在顯著差異。使用者創建交易,其中可能包含任意數量的呼叫。呼叫,也稱為內部事務或消息呼叫,是一個帳戶或事務與另一個帳戶或事務互動的時候。契約只能執行後者。

(這個術語有些晦澀難懂,你可能會發現人們混淆了這兩者——我自己就是這樣做的。)

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