Gas
在循環中使用不可預測的條件時,估計氣體如何工作?
我是剛接觸 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 限制是使用者的任務,儘管這很難做到。