Contract-Development

在非 EOA 地址上呼叫操作碼氣體消耗取決於地址是否為“新”

  • July 20, 2020

我有以下契約,出於測試原因減少到最低限度:

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 個新的公共地址0x0c73c24c841ddDF2d476E7E2C1552Ea04364cc9A0xC16F1C0241B1204BC123650CfCb3A03046F2d91C,以前網路不知道。然後我用這些地址和一些隨機(恆定)值呼叫契約。

我得到了第一個消耗氣體的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 額外的氣體,因此這不被視為“創建一個帳戶’…)

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