Gas

在循環中使用不可預測的條件時,估計氣體如何工作?

  • August 10, 2021

我是剛接觸 Solidity 的新手,但我想到了一個問題。假設我有這個範例虛擬契約。

contract TestLoop {

   uint8 public blockNumber;
   uint8 public counter= 0;

   event LoopCalled(address addrr, uint8 blockNumber, uint8 counter);

   constructor() public {
   }

   function runLoop() public {
       blockNumber = uint8(block.number);
       counter++;

       for (uint8 i = 0; i < blockNumber; i++) {
           emit LoopCalled(msg.sender, blockNumber, counter);
       }
   }
}

如您所見,在契約中,我使用了一個(可壓的)不可變變數,例如 block.number。

在這個方法(runLoop)上呼叫eth_estimateGas是如何工作的?它不應該總是返回相同的,因為一旦被探勘,block.number 保持不變?

在您的契約中使用依賴於網路的變數的這種邊緣情況如何工作?

顧名思義,eth_estimateGas它盡最大努力估計氣體使用量。

它通過在本地呼叫中本地執行事務來做到這一點。這種呼叫不會對區塊鏈產生真正的交易,而只會在您的本地節點(或您的節點提供者的節點,如果您使用的話)中執行。由於這些呼叫沒有傳播到區塊鏈,它們也不能修改合約狀態,所以它們是只讀呼叫。

可能會發生的情況是,估計會檢查其目前資訊並據此採取行動。至於block.number,我猜它只是使用它目前已知的最高塊號(因為呼叫不是任何塊的一部分)。有時,估算器會簡單地返回完全糟糕的結果,一些客戶甚至會警告使用者對此的使用。最終,相應地調整 gas 限制是使用者的任務,儘管這很難做到。

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