Contract-Development
在非 EOA 地址上呼叫操作碼氣體消耗取決於地址是否為“新”
我有以下契約,出於測試原因減少到最低限度:
pragma solidity ^0.6.11; contract PackedMultiplexer { function multiTransfer(address _address1, uint _amount1, address _address2, uint _amount2) payable public { assembly { pop(call(2300, _address2, _amount2, 0, 0, 0, 0)) pop(call(2300, _address1, _amount1, 0, 0, 0, 0)) } } }
現在,我生成了 2 個新的私鑰。
我得到了 2 個新的公共地址
0x0c73c24c841ddDF2d476E7E2C1552Ea04364cc9A
和0xC16F1C0241B1204BC123650CfCb3A03046F2d91C
,以前網路不知道。然後我用這些地址和一些隨機(恆定)值呼叫契約。我得到了第一個消耗氣體的TX 。
87,191
我第二次呼叫具有完全相同參數的合約並獲得第二個消耗氣體的TX 。
37,191
**我的問題:**為什麼合約第一次執行和第二次執行的gas消耗不同?在我看來,在這兩種情況下執行相同的程式碼?我錯過了什麼?
正如您在調試器中看到的那樣,第一個 TX 呼叫操作碼每個都消耗
37000
氣體;第二個 TX 呼叫操作碼每個都消耗12000
氣體。這是為什麼?如何防止37000
燃氣消耗?(**注意:**如果將程式碼中的
2300
(第一個參數)替換為或,則問題成立。)call``gas()``0
對於任何想知道同樣事情的人,我最終閱讀了黃紙。
結果在第35 頁,它們增加
G_{newaccount}
了 gas 成本,即G_{newaccount}: Paid for a CALL or SELFDESTRUCT operation which creates an account (25000).
我在任何地方都找不到奇怪的“創建帳戶”的定義(例如,剛剛測試:僅向地址發送 ERC-20 令牌仍然迫使我支付 25k 額外的氣體,因此這不被視為“創建一個帳戶’…)