Gas

發射一個事件需要多少 gas?

  • August 8, 2021

發射一個事件需要多少 gas?

鑑於其參數總計為n字節數據,是否有計算事件發射將花費多少氣體的公式?

任何資訊或估計都是有用的,

謝謝 :)

首先,參數是:

LogDataGas            uint64 = 8     // Per byte in a LOG* operation's data.
LogGas                uint64 = 375   // Per LOG* operation.
LogTopicGas           uint64 = 375   
MemoryGas             uint64 = 3

https://github.com/ethereum/go-ethereum/blob/master/params/protocol_params.go

那麼,公式如下:

gas = static gas + dynamic gas
dynamic gas = cost of memory gas + cost of log gas

靜態氣體為makeLog375,記憶氣體為 3

動態氣體計算如下:

func makeGasLog(n uint64) gasFunc {
   return func(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) {
       requestedSize, overflow := stack.Back(1).Uint64WithOverflow()
       if overflow {
           return 0, ErrGasUintOverflow
       }

       gas, err := memoryGasCost(mem, memorySize)
       if err != nil {
           return 0, err
       }

       if gas, overflow = math.SafeAdd(gas, params.LogGas); overflow {
           return 0, ErrGasUintOverflow
       }
       if gas, overflow = math.SafeAdd(gas, n*params.LogTopicGas); overflow {
           return 0, ErrGasUintOverflow
       }

       var memorySizeGas uint64
       if memorySizeGas, overflow = math.SafeMul(requestedSize, params.LogDataGas); overflow {
           return 0, ErrGasUintOverflow
       }
       if gas, overflow = math.SafeAdd(gas, memorySizeGas); overflow {
           return 0, ErrGasUintOverflow
       }
       return gas, nil
   }
}

https://github.com/ethereum/go-ethereum/blob/8a24b563312a0ab0a808770e464c5598ab7e35ea/core/vm/gas_table.go#L220

例如,如果您有 2 個主題 + 200 字節log.Data的成本將是:

375 (static cost)
200 = 200 bytes of memory for log.Data x 3 cost of memory = 600 gas for memory gas
2 x 375 = 750 for topic gas
8 x 200 = 1600 for log.Data cost

總成本:375 + 600 + 750 + 1600=3,325氣體單位

本例中的 2 個主題表示主題 0 和主題 1 ,因為主題 0 用於事件簽名的索引,對於您的實際使用,只剩下主題 1 來儲存有用的東西,例如地址或雜湊。

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