Gas
發射一個事件需要多少 gas?
發射一個事件需要多少 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
靜態氣體為
makeLog
375,記憶氣體為 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 } }
例如,如果您有 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 來儲存有用的東西,例如地址或雜湊。