From 910d4f1a70fc29d4433b9c793191e29203489d9d Mon Sep 17 00:00:00 2001 From: Ho Date: Thu, 18 May 2023 21:49:09 +0800 Subject: [PATCH] feat(trace): add storage proof about l1fee (baseFee, overhead, scalar) and withdraw root into trace (#314) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add proof for predeployed storages * reverse inneeded code * update for mainbranch merging * add coinbase storage as trace * comment for clarify * Update version.go --------- Co-authored-by: Péter Garamvölgyi Co-authored-by: HAOYUatHZ <37070449+HAOYUatHZ@users.noreply.github.com> --- eth/tracers/api_blocktrace.go | 37 +++++++++++++++++++++++++++++++++++ params/version.go | 2 +- 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/eth/tracers/api_blocktrace.go b/eth/tracers/api_blocktrace.go index 851bf95499..030cabe01f 100644 --- a/eth/tracers/api_blocktrace.go +++ b/eth/tracers/api_blocktrace.go @@ -290,6 +290,8 @@ func (api *API) getTxResult(env *traceEnv, state *state.StateDB, index int, bloc // merge required proof data proofAccounts := tracer.UpdatedAccounts() + proofAccounts[vmenv.FeeRecipient()] = struct{}{} + proofAccounts[rcfg.L1GasPriceOracleAddress] = struct{}{} for addr := range proofAccounts { addrStr := addr.String() @@ -314,6 +316,12 @@ func (api *API) getTxResult(env *traceEnv, state *state.StateDB, index int, bloc } proofStorages := tracer.UpdatedStorages() + proofStorages[rcfg.L1GasPriceOracleAddress] = vm.Storage( + map[common.Hash]common.Hash{ + rcfg.L1BaseFeeSlot: {}, // notice we do not need the right value here + rcfg.OverheadSlot: {}, + rcfg.ScalarSlot: {}, + }) for addr, keys := range proofStorages { env.sMu.Lock() trie, err := state.GetStorageTrieForProof(addr) @@ -404,6 +412,35 @@ func (api *API) fillBlockTrace(env *traceEnv, block *types.Block) (*types.BlockT txs[i] = types.NewTransactionData(tx, block.NumberU64(), api.backend.ChainConfig()) } + if _, existed := env.Proofs[rcfg.L2MessageQueueAddress.String()]; !existed { + if proof, err := statedb.GetProof(rcfg.L2MessageQueueAddress); err != nil { + log.Error("Proof for L2MessageQueueAddress not available", "error", err) + } else { + wrappedProof := make([]hexutil.Bytes, len(proof)) + for i, bt := range proof { + wrappedProof[i] = bt + } + env.Proofs[rcfg.L2MessageQueueAddress.String()] = wrappedProof + } + } + + if _, existed := env.StorageProofs[rcfg.L2MessageQueueAddress.String()]; !existed { + env.StorageProofs[rcfg.L2MessageQueueAddress.String()] = make(map[string][]hexutil.Bytes) + } + if _, existed := env.StorageProofs[rcfg.L2MessageQueueAddress.String()][rcfg.WithdrawTrieRootSlot.String()]; !existed { + if trie, err := statedb.GetStorageTrieForProof(rcfg.L2MessageQueueAddress); err != nil { + log.Error("Storage proof for WithdrawTrieRootSlot not available", "error", err) + } else if proof, _ := statedb.GetSecureTrieProof(trie, rcfg.WithdrawTrieRootSlot); err != nil { + log.Error("Get storage proof for WithdrawTrieRootSlot failed", "error", err) + } else { + wrappedProof := make([]hexutil.Bytes, len(proof)) + for i, bt := range proof { + wrappedProof[i] = bt + } + env.StorageProofs[rcfg.L2MessageQueueAddress.String()][rcfg.WithdrawTrieRootSlot.String()] = wrappedProof + } + } + blockTrace := &types.BlockTrace{ ChainID: api.backend.ChainConfig().ChainID.Uint64(), Version: params.ArchiveVersion(params.CommitHash), diff --git a/params/version.go b/params/version.go index 36583679e1..a26f0b46cb 100644 --- a/params/version.go +++ b/params/version.go @@ -24,7 +24,7 @@ import ( const ( VersionMajor = 3 // Major version component of the current release VersionMinor = 2 // Minor version component of the current release - VersionPatch = 0 // Patch version component of the current release + VersionPatch = 1 // Patch version component of the current release VersionMeta = "alpha" // Version metadata to append to the version string )