fix bigInt encoding (#74)

* fix bigInt encoding

* fix balance
This commit is contained in:
HAOYUatHZ 2022-04-02 10:13:04 +08:00 committed by GitHub
parent b714e22893
commit 3d3c9d3edf
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 25 additions and 30 deletions

View file

@ -1353,7 +1353,7 @@ func (bc *BlockChain) writeBlockResult(state *state.StateDB, block *types.Block,
coinbase := types.AccountProofWrapper{ coinbase := types.AccountProofWrapper{
Address: block.Coinbase(), Address: block.Coinbase(),
Nonce: state.GetNonce(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()), CodeHash: state.GetCodeHash(block.Coinbase()),
} }
// Get coinbase address's account proof. // Get coinbase address's account proof.

View file

@ -2,6 +2,7 @@ package types
import ( import (
"github.com/scroll-tech/go-ethereum/common" "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. // BlockResult contains block execution traces and results required for rollers.
@ -57,7 +58,7 @@ type ExtraData struct {
type AccountProofWrapper struct { type AccountProofWrapper struct {
Address common.Address `json:"address"` Address common.Address `json:"address"`
Nonce uint64 `json:"nonce"` Nonce uint64 `json:"nonce"`
Balance string `json:"balance"` // balance big.Int string Balance *hexutil.Big `json:"balance"`
CodeHash common.Hash `json:"codeHash,omitempty"` CodeHash common.Hash `json:"codeHash,omitempty"`
Proof []string `json:"proof,omitempty"` Proof []string `json:"proof,omitempty"`
Storage *StorageProofWrapper `json:"storage,omitempty"` // StorageProofWrapper can be empty if irrelated to storage operation Storage *StorageProofWrapper `json:"storage,omitempty"` // StorageProofWrapper can be empty if irrelated to storage operation

View file

@ -9,11 +9,11 @@ import (
) )
type BlockTrace struct { type BlockTrace struct {
Number string `json:"number"` // big.Int string Number *hexutil.Big `json:"number"`
Hash common.Hash `json:"hash"` Hash common.Hash `json:"hash"`
GasLimit uint64 `json:"gasLimit"` GasLimit uint64 `json:"gasLimit"`
Difficulty string `json:"difficulty"` // big.Int string Difficulty *hexutil.Big `json:"difficulty"`
BaseFee string `json:"baseFee"` // big.Int string BaseFee *hexutil.Big `json:"baseFee"`
Coinbase *AccountProofWrapper `json:"coinbase"` Coinbase *AccountProofWrapper `json:"coinbase"`
Time uint64 `json:"time"` Time uint64 `json:"time"`
Transactions []*TransactionTrace `json:"transactions"` Transactions []*TransactionTrace `json:"transactions"`
@ -23,16 +23,16 @@ type TransactionTrace struct {
Type uint8 `json:"type"` Type uint8 `json:"type"`
Nonce uint64 `json:"nonce"` Nonce uint64 `json:"nonce"`
Gas uint64 `json:"gas"` Gas uint64 `json:"gas"`
GasPrice string `json:"gasPrice"` // big.Int string GasPrice *hexutil.Big `json:"gasPrice"`
From common.Address `json:"from"` From common.Address `json:"from"`
To *common.Address `json:"to"` To *common.Address `json:"to"`
ChainId string `json:"chainId"` // big.Int string ChainId *hexutil.Big `json:"chainId"`
Value string `json:"value"` // big.Int string Value *hexutil.Big `json:"value"`
Data string `json:"data"` Data string `json:"data"`
IsCreate bool `json:"isCreate"` IsCreate bool `json:"isCreate"`
V string `json:"v"` // big.Int string V *hexutil.Big `json:"v"`
R string `json:"r"` // big.Int string R *hexutil.Big `json:"r"`
S string `json:"s"` // big.Int string S *hexutil.Big `json:"s"`
} }
// NewTraceBlock supports necessary fields for roller. // 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) 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{ return &BlockTrace{
Number: block.Number().String(), Number: (*hexutil.Big)(block.Number()),
Hash: block.Hash(), Hash: block.Hash(),
GasLimit: block.GasLimit(), GasLimit: block.GasLimit(),
Difficulty: block.Difficulty().String(), Difficulty: (*hexutil.Big)(block.Difficulty()),
BaseFee: baseFee.String(), BaseFee: (*hexutil.Big)(block.BaseFee()),
Coinbase: coinbase, Coinbase: coinbase,
Time: block.Time(), Time: block.Time(),
Transactions: txs, Transactions: txs,
@ -70,17 +63,17 @@ func newTraceTransaction(tx *Transaction, blockNumber uint64, config *params.Cha
result := &TransactionTrace{ result := &TransactionTrace{
Type: tx.Type(), Type: tx.Type(),
Nonce: tx.Nonce(), Nonce: tx.Nonce(),
ChainId: tx.ChainId().String(), ChainId: (*hexutil.Big)(tx.ChainId()),
From: from, From: from,
Gas: tx.Gas(), Gas: tx.Gas(),
GasPrice: tx.GasPrice().String(), GasPrice: (*hexutil.Big)(tx.GasPrice()),
To: tx.To(), To: tx.To(),
Value: tx.Value().String(), Value: (*hexutil.Big)(tx.Value()),
Data: hexutil.Encode(tx.Data()), Data: hexutil.Encode(tx.Data()),
IsCreate: tx.To() == nil, IsCreate: tx.To() == nil,
V: v.String(), V: (*hexutil.Big)(v),
R: r.String(), R: (*hexutil.Big)(r),
S: s.String(), S: (*hexutil.Big)(s),
} }
return result return result
} }

View file

@ -130,7 +130,7 @@ func getWrappedProofForAddr(l *StructLogger, address common.Address) (*types.Acc
return &types.AccountProofWrapper{ return &types.AccountProofWrapper{
Address: address, Address: address,
Nonce: l.env.StateDB.GetNonce(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), CodeHash: l.env.StateDB.GetCodeHash(address),
Proof: encodeProof(proof), Proof: encodeProof(proof),
}, nil }, nil
@ -150,7 +150,7 @@ func getWrappedProofForStorage(l *StructLogger, address common.Address, key comm
return &types.AccountProofWrapper{ return &types.AccountProofWrapper{
Address: address, Address: address,
Nonce: l.env.StateDB.GetNonce(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), CodeHash: l.env.StateDB.GetCodeHash(address),
Proof: encodeProof(proof), Proof: encodeProof(proof),
Storage: &types.StorageProofWrapper{ Storage: &types.StorageProofWrapper{

View file

@ -28,6 +28,7 @@ import (
mapset "github.com/deckarep/golang-set" mapset "github.com/deckarep/golang-set"
"github.com/scroll-tech/go-ethereum/common" "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"
"github.com/scroll-tech/go-ethereum/consensus/misc" "github.com/scroll-tech/go-ethereum/consensus/misc"
"github.com/scroll-tech/go-ethereum/core" "github.com/scroll-tech/go-ethereum/core"
@ -790,7 +791,7 @@ func (w *worker) commitTransaction(tx *types.Transaction, coinbase common.Addres
sender := &types.AccountProofWrapper{ sender := &types.AccountProofWrapper{
Address: from, Address: from,
Nonce: w.current.state.GetNonce(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), CodeHash: w.current.state.GetCodeHash(from),
} }