diff --git a/core/blockchain.go b/core/blockchain.go index 564319dc2bce..61d6f417f753 100644 --- a/core/blockchain.go +++ b/core/blockchain.go @@ -1353,7 +1353,7 @@ func (bc *BlockChain) writeBlockResult(state *state.StateDB, block *types.Block, coinbase := types.AccountProofWrapper{ Address: block.Coinbase(), Nonce: state.GetNonce(block.Coinbase()), - Balance: state.GetBalance(block.Coinbase()).String(), + Balance: (*hexutil.Big)(state.GetBalance(block.Coinbase())), CodeHash: state.GetCodeHash(block.Coinbase()), } // Get coinbase address's account proof. diff --git a/core/types/l2trace.go b/core/types/l2trace.go index e67785721a1f..920844d68ff3 100644 --- a/core/types/l2trace.go +++ b/core/types/l2trace.go @@ -2,6 +2,7 @@ package types import ( "github.com/scroll-tech/go-ethereum/common" + "github.com/scroll-tech/go-ethereum/common/hexutil" ) // BlockResult contains block execution traces and results required for rollers. @@ -57,7 +58,7 @@ type ExtraData struct { type AccountProofWrapper struct { Address common.Address `json:"address"` Nonce uint64 `json:"nonce"` - Balance string `json:"balance"` // balance big.Int string + Balance *hexutil.Big `json:"balance"` CodeHash common.Hash `json:"codeHash,omitempty"` Proof []string `json:"proof,omitempty"` Storage *StorageProofWrapper `json:"storage,omitempty"` // StorageProofWrapper can be empty if irrelated to storage operation diff --git a/core/types/l2trace_block.go b/core/types/l2trace_block.go index 1d0a27fa982b..7d8347b94c6a 100644 --- a/core/types/l2trace_block.go +++ b/core/types/l2trace_block.go @@ -9,11 +9,11 @@ import ( ) type BlockTrace struct { - Number string `json:"number"` // big.Int string + Number *hexutil.Big `json:"number"` Hash common.Hash `json:"hash"` GasLimit uint64 `json:"gasLimit"` - Difficulty string `json:"difficulty"` // big.Int string - BaseFee string `json:"baseFee"` // big.Int string + Difficulty *hexutil.Big `json:"difficulty"` + BaseFee *hexutil.Big `json:"baseFee"` Coinbase *AccountProofWrapper `json:"coinbase"` Time uint64 `json:"time"` Transactions []*TransactionTrace `json:"transactions"` @@ -23,16 +23,16 @@ type TransactionTrace struct { Type uint8 `json:"type"` Nonce uint64 `json:"nonce"` Gas uint64 `json:"gas"` - GasPrice string `json:"gasPrice"` // big.Int string + GasPrice *hexutil.Big `json:"gasPrice"` From common.Address `json:"from"` To *common.Address `json:"to"` - ChainId string `json:"chainId"` // big.Int string - Value string `json:"value"` // big.Int string + ChainId *hexutil.Big `json:"chainId"` + Value *hexutil.Big `json:"value"` Data string `json:"data"` IsCreate bool `json:"isCreate"` - V string `json:"v"` // big.Int string - R string `json:"r"` // big.Int string - S string `json:"s"` // big.Int string + V *hexutil.Big `json:"v"` + R *hexutil.Big `json:"r"` + S *hexutil.Big `json:"s"` } // NewTraceBlock supports necessary fields for roller. @@ -42,19 +42,12 @@ func NewTraceBlock(config *params.ChainConfig, block *Block, coinbase *AccountPr txs[i] = newTraceTransaction(tx, block.NumberU64(), config) } - baseFee := block.BaseFee() - // due to the special logic of `baseFee`, if `baseFee` is a nil - // we would like to use new(big.Int) to replace it so that `baseFee.String()` would return "0" - if baseFee == nil { - baseFee = new(big.Int) - } - return &BlockTrace{ - Number: block.Number().String(), + Number: (*hexutil.Big)(block.Number()), Hash: block.Hash(), GasLimit: block.GasLimit(), - Difficulty: block.Difficulty().String(), - BaseFee: baseFee.String(), + Difficulty: (*hexutil.Big)(block.Difficulty()), + BaseFee: (*hexutil.Big)(block.BaseFee()), Coinbase: coinbase, Time: block.Time(), Transactions: txs, @@ -70,17 +63,17 @@ func newTraceTransaction(tx *Transaction, blockNumber uint64, config *params.Cha result := &TransactionTrace{ Type: tx.Type(), Nonce: tx.Nonce(), - ChainId: tx.ChainId().String(), + ChainId: (*hexutil.Big)(tx.ChainId()), From: from, Gas: tx.Gas(), - GasPrice: tx.GasPrice().String(), + GasPrice: (*hexutil.Big)(tx.GasPrice()), To: tx.To(), - Value: tx.Value().String(), + Value: (*hexutil.Big)(tx.Value()), Data: hexutil.Encode(tx.Data()), IsCreate: tx.To() == nil, - V: v.String(), - R: r.String(), - S: s.String(), + V: (*hexutil.Big)(v), + R: (*hexutil.Big)(r), + S: (*hexutil.Big)(s), } return result } diff --git a/core/vm/logger_trace.go b/core/vm/logger_trace.go index 5a32ef53d46c..db100599aec3 100644 --- a/core/vm/logger_trace.go +++ b/core/vm/logger_trace.go @@ -130,7 +130,7 @@ func getWrappedProofForAddr(l *StructLogger, address common.Address) (*types.Acc return &types.AccountProofWrapper{ Address: address, Nonce: l.env.StateDB.GetNonce(address), - Balance: l.env.StateDB.GetBalance(address).String(), + Balance: (*hexutil.Big)(l.env.StateDB.GetBalance(address)), CodeHash: l.env.StateDB.GetCodeHash(address), Proof: encodeProof(proof), }, nil @@ -150,7 +150,7 @@ func getWrappedProofForStorage(l *StructLogger, address common.Address, key comm return &types.AccountProofWrapper{ Address: address, Nonce: l.env.StateDB.GetNonce(address), - Balance: l.env.StateDB.GetBalance(address).String(), + Balance: (*hexutil.Big)(l.env.StateDB.GetBalance(address)), CodeHash: l.env.StateDB.GetCodeHash(address), Proof: encodeProof(proof), Storage: &types.StorageProofWrapper{ diff --git a/miner/worker.go b/miner/worker.go index 2ab832b00658..775fe7c117ab 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -28,6 +28,7 @@ import ( mapset "github.com/deckarep/golang-set" "github.com/scroll-tech/go-ethereum/common" + "github.com/scroll-tech/go-ethereum/common/hexutil" "github.com/scroll-tech/go-ethereum/consensus" "github.com/scroll-tech/go-ethereum/consensus/misc" "github.com/scroll-tech/go-ethereum/core" @@ -790,7 +791,7 @@ func (w *worker) commitTransaction(tx *types.Transaction, coinbase common.Addres sender := &types.AccountProofWrapper{ Address: from, Nonce: w.current.state.GetNonce(from), - Balance: w.current.state.GetBalance(from).String(), + Balance: (*hexutil.Big)(w.current.state.GetBalance(from)), CodeHash: w.current.state.GetCodeHash(from), }