Transactions
是否可以在單個事務中進行多個呼叫?
假設你的合約有一個非常簡單的函式
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 gas
94.5% 的成本。有沒有辦法F
在一個事務中發送多個呼叫,這樣即使合約沒有專門針對它進行優化,你也可以達到相同的效果?
F()
你在什麼情況下反复打電話?命名您撥打電話的地點
C()
。有多種可能性:
C()
並且F()
在同一份契約中。在這種情況下,C()
可以F()
重複呼叫而沒有任何重大成本。C()
在一個契約中,F()
在另一個契約中。在這種情況下,C()
可以在同一筆交易中多次呼叫F()
,但每次都會消耗一些gas。(但是,少於每次發送單獨的交易)C()
完全在乙太坊之外(即通過 web3 的 javascript 函式)並且F()
是一個常量函式(即,它不會修改合約的狀態。)在這種情況下,C()
可以免費呼叫F()
任意多次。它將模擬交易而不是實際發送它們。C()
在乙太坊之外,並且F()
是非常量的。在這種情況下,每筆交易都將花費全額。您可以編寫另一個合約以F()
重複呼叫,如 2 中所示。請注意,事務和呼叫之間存在顯著差異。使用者創建交易,其中可能包含任意數量的呼叫。呼叫,也稱為內部事務或消息呼叫,是一個帳戶或事務與另一個帳戶或事務互動的時候。契約只能執行後者。
(這個術語有些晦澀難懂,你可能會發現人們混淆了這兩者——我自己就是這樣做的。)