|
|
|
@ -46,6 +46,7 @@ import ( |
|
|
|
|
"github.com/ethereum/go-ethereum/event" |
|
|
|
|
"github.com/ethereum/go-ethereum/params" |
|
|
|
|
"github.com/ethereum/go-ethereum/rpc" |
|
|
|
|
"github.com/stretchr/testify/require" |
|
|
|
|
"golang.org/x/crypto/sha3" |
|
|
|
|
) |
|
|
|
|
|
|
|
|
@ -59,7 +60,7 @@ func TestTransaction_RoundTripRpcJSON(t *testing.T) { |
|
|
|
|
t.Parallel() |
|
|
|
|
for i, tt := range tests { |
|
|
|
|
var tx2 types.Transaction |
|
|
|
|
tx, err := types.SignNewTx(key, signer, tt) |
|
|
|
|
tx, err := types.SignNewTx(key, signer, tt.Tx) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Fatalf("test %d: signing failed: %v", i, err) |
|
|
|
|
} |
|
|
|
@ -72,7 +73,7 @@ func TestTransaction_RoundTripRpcJSON(t *testing.T) { |
|
|
|
|
t.Fatalf("test %d: stx changed, want %x have %x", i, want, have) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// rpcTransaction
|
|
|
|
|
// rpcTransaction
|
|
|
|
|
rpcTx := newRPCTransaction(tx, common.Hash{}, 0, 0, 0, nil, config) |
|
|
|
|
if data, err := json.Marshal(rpcTx); err != nil { |
|
|
|
|
t.Fatalf("test %d: marshalling failed; %v", i, err) |
|
|
|
@ -80,109 +81,132 @@ func TestTransaction_RoundTripRpcJSON(t *testing.T) { |
|
|
|
|
t.Fatalf("test %d: unmarshal failed: %v", i, err) |
|
|
|
|
} else if want, have := tx.Hash(), tx2.Hash(); want != have { |
|
|
|
|
t.Fatalf("test %d: tx changed, want %x have %x", i, want, have) |
|
|
|
|
} else { |
|
|
|
|
want, have := tt.Want, string(data) |
|
|
|
|
require.JSONEqf(t, want, have, "test %d: rpc json not match, want %s have %s", i, want, have) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func allTransactionTypes(addr common.Address, config *params.ChainConfig) []types.TxData { |
|
|
|
|
return []types.TxData{ |
|
|
|
|
&types.LegacyTx{ |
|
|
|
|
Nonce: 5, |
|
|
|
|
GasPrice: big.NewInt(6), |
|
|
|
|
Gas: 7, |
|
|
|
|
To: &addr, |
|
|
|
|
Value: big.NewInt(8), |
|
|
|
|
Data: []byte{0, 1, 2, 3, 4}, |
|
|
|
|
V: big.NewInt(9), |
|
|
|
|
R: big.NewInt(10), |
|
|
|
|
S: big.NewInt(11), |
|
|
|
|
}, |
|
|
|
|
&types.LegacyTx{ |
|
|
|
|
Nonce: 5, |
|
|
|
|
GasPrice: big.NewInt(6), |
|
|
|
|
Gas: 7, |
|
|
|
|
To: nil, |
|
|
|
|
Value: big.NewInt(8), |
|
|
|
|
Data: []byte{0, 1, 2, 3, 4}, |
|
|
|
|
V: big.NewInt(32), |
|
|
|
|
R: big.NewInt(10), |
|
|
|
|
S: big.NewInt(11), |
|
|
|
|
}, |
|
|
|
|
&types.AccessListTx{ |
|
|
|
|
ChainID: config.ChainID, |
|
|
|
|
Nonce: 5, |
|
|
|
|
GasPrice: big.NewInt(6), |
|
|
|
|
Gas: 7, |
|
|
|
|
To: &addr, |
|
|
|
|
Value: big.NewInt(8), |
|
|
|
|
Data: []byte{0, 1, 2, 3, 4}, |
|
|
|
|
AccessList: types.AccessList{ |
|
|
|
|
types.AccessTuple{ |
|
|
|
|
Address: common.Address{0x2}, |
|
|
|
|
StorageKeys: []common.Hash{types.EmptyRootHash}, |
|
|
|
|
type txData struct { |
|
|
|
|
Tx types.TxData |
|
|
|
|
Want string |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func allTransactionTypes(addr common.Address, config *params.ChainConfig) []txData { |
|
|
|
|
return []txData{ |
|
|
|
|
{ |
|
|
|
|
Tx: &types.LegacyTx{ |
|
|
|
|
Nonce: 5, |
|
|
|
|
GasPrice: big.NewInt(6), |
|
|
|
|
Gas: 7, |
|
|
|
|
To: &addr, |
|
|
|
|
Value: big.NewInt(8), |
|
|
|
|
Data: []byte{0, 1, 2, 3, 4}, |
|
|
|
|
V: big.NewInt(9), |
|
|
|
|
R: big.NewInt(10), |
|
|
|
|
S: big.NewInt(11), |
|
|
|
|
}, |
|
|
|
|
Want: `{"blockHash":null,"blockNumber":null,"from":"0x71562b71999873db5b286df957af199ec94617f7","gas":"0x7","gasPrice":"0x6","hash":"0x5f3240454cd09a5d8b1c5d651eefae7a339262875bcd2d0e6676f3d989967008","input":"0x0001020304","nonce":"0x5","to":"0xdead000000000000000000000000000000000000","transactionIndex":null,"value":"0x8","type":"0x0","chainId":"0x539","v":"0xa96","r":"0xbc85e96592b95f7160825d837abb407f009df9ebe8f1b9158a4b8dd093377f75","s":"0x1b55ea3af5574c536967b039ba6999ef6c89cf22fc04bcb296e0e8b0b9b576f5"}`, |
|
|
|
|
}, { |
|
|
|
|
Tx: &types.LegacyTx{ |
|
|
|
|
Nonce: 5, |
|
|
|
|
GasPrice: big.NewInt(6), |
|
|
|
|
Gas: 7, |
|
|
|
|
To: nil, |
|
|
|
|
Value: big.NewInt(8), |
|
|
|
|
Data: []byte{0, 1, 2, 3, 4}, |
|
|
|
|
V: big.NewInt(32), |
|
|
|
|
R: big.NewInt(10), |
|
|
|
|
S: big.NewInt(11), |
|
|
|
|
}, |
|
|
|
|
Want: `{"blockHash":null,"blockNumber":null,"from":"0x71562b71999873db5b286df957af199ec94617f7","gas":"0x7","gasPrice":"0x6","hash":"0x806e97f9d712b6cb7e781122001380a2837531b0fc1e5f5d78174ad4cb699873","input":"0x0001020304","nonce":"0x5","to":null,"transactionIndex":null,"value":"0x8","type":"0x0","chainId":"0x539","v":"0xa96","r":"0x9dc28b267b6ad4e4af6fe9289668f9305c2eb7a3241567860699e478af06835a","s":"0xa0b51a071aa9bed2cd70aedea859779dff039e3630ea38497d95202e9b1fec7"}`, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
Tx: &types.AccessListTx{ |
|
|
|
|
ChainID: config.ChainID, |
|
|
|
|
Nonce: 5, |
|
|
|
|
GasPrice: big.NewInt(6), |
|
|
|
|
Gas: 7, |
|
|
|
|
To: &addr, |
|
|
|
|
Value: big.NewInt(8), |
|
|
|
|
Data: []byte{0, 1, 2, 3, 4}, |
|
|
|
|
AccessList: types.AccessList{ |
|
|
|
|
types.AccessTuple{ |
|
|
|
|
Address: common.Address{0x2}, |
|
|
|
|
StorageKeys: []common.Hash{types.EmptyRootHash}, |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
V: big.NewInt(32), |
|
|
|
|
R: big.NewInt(10), |
|
|
|
|
S: big.NewInt(11), |
|
|
|
|
}, |
|
|
|
|
V: big.NewInt(32), |
|
|
|
|
R: big.NewInt(10), |
|
|
|
|
S: big.NewInt(11), |
|
|
|
|
}, |
|
|
|
|
&types.AccessListTx{ |
|
|
|
|
ChainID: config.ChainID, |
|
|
|
|
Nonce: 5, |
|
|
|
|
GasPrice: big.NewInt(6), |
|
|
|
|
Gas: 7, |
|
|
|
|
To: nil, |
|
|
|
|
Value: big.NewInt(8), |
|
|
|
|
Data: []byte{0, 1, 2, 3, 4}, |
|
|
|
|
AccessList: types.AccessList{ |
|
|
|
|
types.AccessTuple{ |
|
|
|
|
Address: common.Address{0x2}, |
|
|
|
|
StorageKeys: []common.Hash{types.EmptyRootHash}, |
|
|
|
|
Want: `{"blockHash":null,"blockNumber":null,"from":"0x71562b71999873db5b286df957af199ec94617f7","gas":"0x7","gasPrice":"0x6","hash":"0x121347468ee5fe0a29f02b49b4ffd1c8342bc4255146bb686cd07117f79e7129","input":"0x0001020304","nonce":"0x5","to":"0xdead000000000000000000000000000000000000","transactionIndex":null,"value":"0x8","type":"0x1","accessList":[{"address":"0x0200000000000000000000000000000000000000","storageKeys":["0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"]}],"chainId":"0x539","v":"0x0","r":"0xf372ad499239ae11d91d34c559ffc5dab4daffc0069e03afcabdcdf231a0c16b","s":"0x28573161d1f9472fa0fd4752533609e72f06414f7ab5588699a7141f65d2abf"}`, |
|
|
|
|
}, { |
|
|
|
|
Tx: &types.AccessListTx{ |
|
|
|
|
ChainID: config.ChainID, |
|
|
|
|
Nonce: 5, |
|
|
|
|
GasPrice: big.NewInt(6), |
|
|
|
|
Gas: 7, |
|
|
|
|
To: nil, |
|
|
|
|
Value: big.NewInt(8), |
|
|
|
|
Data: []byte{0, 1, 2, 3, 4}, |
|
|
|
|
AccessList: types.AccessList{ |
|
|
|
|
types.AccessTuple{ |
|
|
|
|
Address: common.Address{0x2}, |
|
|
|
|
StorageKeys: []common.Hash{types.EmptyRootHash}, |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
V: big.NewInt(32), |
|
|
|
|
R: big.NewInt(10), |
|
|
|
|
S: big.NewInt(11), |
|
|
|
|
}, |
|
|
|
|
V: big.NewInt(32), |
|
|
|
|
R: big.NewInt(10), |
|
|
|
|
S: big.NewInt(11), |
|
|
|
|
}, |
|
|
|
|
&types.DynamicFeeTx{ |
|
|
|
|
ChainID: config.ChainID, |
|
|
|
|
Nonce: 5, |
|
|
|
|
GasTipCap: big.NewInt(6), |
|
|
|
|
GasFeeCap: big.NewInt(9), |
|
|
|
|
Gas: 7, |
|
|
|
|
To: &addr, |
|
|
|
|
Value: big.NewInt(8), |
|
|
|
|
Data: []byte{0, 1, 2, 3, 4}, |
|
|
|
|
AccessList: types.AccessList{ |
|
|
|
|
types.AccessTuple{ |
|
|
|
|
Address: common.Address{0x2}, |
|
|
|
|
StorageKeys: []common.Hash{types.EmptyRootHash}, |
|
|
|
|
Want: `{"blockHash":null,"blockNumber":null,"from":"0x71562b71999873db5b286df957af199ec94617f7","gas":"0x7","gasPrice":"0x6","hash":"0x067c3baebede8027b0f828a9d933be545f7caaec623b00684ac0659726e2055b","input":"0x0001020304","nonce":"0x5","to":null,"transactionIndex":null,"value":"0x8","type":"0x1","accessList":[{"address":"0x0200000000000000000000000000000000000000","storageKeys":["0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"]}],"chainId":"0x539","v":"0x1","r":"0x542981b5130d4613897fbab144796cb36d3cb3d7807d47d9c7f89ca7745b085c","s":"0x7425b9dd6c5deaa42e4ede35d0c4570c4624f68c28d812c10d806ffdf86ce63"}`, |
|
|
|
|
}, { |
|
|
|
|
Tx: &types.DynamicFeeTx{ |
|
|
|
|
ChainID: config.ChainID, |
|
|
|
|
Nonce: 5, |
|
|
|
|
GasTipCap: big.NewInt(6), |
|
|
|
|
GasFeeCap: big.NewInt(9), |
|
|
|
|
Gas: 7, |
|
|
|
|
To: &addr, |
|
|
|
|
Value: big.NewInt(8), |
|
|
|
|
Data: []byte{0, 1, 2, 3, 4}, |
|
|
|
|
AccessList: types.AccessList{ |
|
|
|
|
types.AccessTuple{ |
|
|
|
|
Address: common.Address{0x2}, |
|
|
|
|
StorageKeys: []common.Hash{types.EmptyRootHash}, |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
V: big.NewInt(32), |
|
|
|
|
R: big.NewInt(10), |
|
|
|
|
S: big.NewInt(11), |
|
|
|
|
}, |
|
|
|
|
V: big.NewInt(32), |
|
|
|
|
R: big.NewInt(10), |
|
|
|
|
S: big.NewInt(11), |
|
|
|
|
}, |
|
|
|
|
&types.DynamicFeeTx{ |
|
|
|
|
ChainID: config.ChainID, |
|
|
|
|
Nonce: 5, |
|
|
|
|
GasTipCap: big.NewInt(6), |
|
|
|
|
GasFeeCap: big.NewInt(9), |
|
|
|
|
Gas: 7, |
|
|
|
|
To: nil, |
|
|
|
|
Value: big.NewInt(8), |
|
|
|
|
Data: []byte{0, 1, 2, 3, 4}, |
|
|
|
|
AccessList: types.AccessList{}, |
|
|
|
|
V: big.NewInt(32), |
|
|
|
|
R: big.NewInt(10), |
|
|
|
|
S: big.NewInt(11), |
|
|
|
|
Want: `{"blockHash":null,"blockNumber":null,"from":"0x71562b71999873db5b286df957af199ec94617f7","gas":"0x7","gasPrice":"0x9","maxFeePerGas":"0x9","maxPriorityFeePerGas":"0x6","hash":"0xb63e0b146b34c3e9cb7fbabb5b3c081254a7ded6f1b65324b5898cc0545d79ff","input":"0x0001020304","nonce":"0x5","to":"0xdead000000000000000000000000000000000000","transactionIndex":null,"value":"0x8","type":"0x2","accessList":[{"address":"0x0200000000000000000000000000000000000000","storageKeys":["0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"]}],"chainId":"0x539","v":"0x1","r":"0x3b167e05418a8932cd53d7578711fe1a76b9b96c48642402bb94978b7a107e80","s":"0x22f98a332d15ea2cc80386c1ebaa31b0afebfa79ebc7d039a1e0074418301fef"}`, |
|
|
|
|
}, { |
|
|
|
|
Tx: &types.DynamicFeeTx{ |
|
|
|
|
ChainID: config.ChainID, |
|
|
|
|
Nonce: 5, |
|
|
|
|
GasTipCap: big.NewInt(6), |
|
|
|
|
GasFeeCap: big.NewInt(9), |
|
|
|
|
Gas: 7, |
|
|
|
|
To: nil, |
|
|
|
|
Value: big.NewInt(8), |
|
|
|
|
Data: []byte{0, 1, 2, 3, 4}, |
|
|
|
|
AccessList: types.AccessList{}, |
|
|
|
|
V: big.NewInt(32), |
|
|
|
|
R: big.NewInt(10), |
|
|
|
|
S: big.NewInt(11), |
|
|
|
|
}, |
|
|
|
|
Want: `{"blockHash":null,"blockNumber":null,"from":"0x71562b71999873db5b286df957af199ec94617f7","gas":"0x7","gasPrice":"0x9","maxFeePerGas":"0x9","maxPriorityFeePerGas":"0x6","hash":"0xcbab17ee031a9d5b5a09dff909f0a28aedb9b295ac0635d8710d11c7b806ec68","input":"0x0001020304","nonce":"0x5","to":null,"transactionIndex":null,"value":"0x8","type":"0x2","accessList":[],"chainId":"0x539","v":"0x0","r":"0x6446b8a682db7e619fc6b4f6d1f708f6a17351a41c7fbd63665f469bc78b41b9","s":"0x7626abc15834f391a117c63450047309dbf84c5ce3e8e609b607062641e2de43"}`, |
|
|
|
|
}, |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
type testBackend struct { |
|
|
|
|
db ethdb.Database |
|
|
|
|
chain *core.BlockChain |
|
|
|
|
db ethdb.Database |
|
|
|
|
chain *core.BlockChain |
|
|
|
|
pending *types.Block |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func newTestBackend(t *testing.T, n int, gspec *core.Genesis, generator func(i int, b *core.BlockGen)) *testBackend { |
|
|
|
@ -212,6 +236,10 @@ func newTestBackend(t *testing.T, n int, gspec *core.Genesis, generator func(i i |
|
|
|
|
return backend |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (b *testBackend) setPendingBlock(block *types.Block) { |
|
|
|
|
b.pending = block |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (b testBackend) SyncProgress() ethereum.SyncProgress { return ethereum.SyncProgress{} } |
|
|
|
|
func (b testBackend) SuggestGasTipCap(ctx context.Context) (*big.Int, error) { |
|
|
|
|
return big.NewInt(0), nil |
|
|
|
@ -231,31 +259,46 @@ func (b testBackend) HeaderByNumber(ctx context.Context, number rpc.BlockNumber) |
|
|
|
|
if number == rpc.LatestBlockNumber { |
|
|
|
|
return b.chain.CurrentBlock(), nil |
|
|
|
|
} |
|
|
|
|
if number == rpc.PendingBlockNumber && b.pending != nil { |
|
|
|
|
return b.pending.Header(), nil |
|
|
|
|
} |
|
|
|
|
return b.chain.GetHeaderByNumber(uint64(number)), nil |
|
|
|
|
} |
|
|
|
|
func (b testBackend) HeaderByHash(ctx context.Context, hash common.Hash) (*types.Header, error) { |
|
|
|
|
panic("implement me") |
|
|
|
|
return b.chain.GetHeaderByHash(hash), nil |
|
|
|
|
} |
|
|
|
|
func (b testBackend) HeaderByNumberOrHash(ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash) (*types.Header, error) { |
|
|
|
|
panic("implement me") |
|
|
|
|
if blockNr, ok := blockNrOrHash.Number(); ok { |
|
|
|
|
return b.HeaderByNumber(ctx, blockNr) |
|
|
|
|
} |
|
|
|
|
if blockHash, ok := blockNrOrHash.Hash(); ok { |
|
|
|
|
return b.HeaderByHash(ctx, blockHash) |
|
|
|
|
} |
|
|
|
|
panic("unknown type rpc.BlockNumberOrHash") |
|
|
|
|
} |
|
|
|
|
func (b testBackend) CurrentHeader() *types.Header { panic("implement me") } |
|
|
|
|
func (b testBackend) CurrentBlock() *types.Header { panic("implement me") } |
|
|
|
|
func (b testBackend) CurrentHeader() *types.Header { return b.chain.CurrentBlock() } |
|
|
|
|
func (b testBackend) CurrentBlock() *types.Header { return b.chain.CurrentBlock() } |
|
|
|
|
func (b testBackend) BlockByNumber(ctx context.Context, number rpc.BlockNumber) (*types.Block, error) { |
|
|
|
|
if number == rpc.LatestBlockNumber { |
|
|
|
|
head := b.chain.CurrentBlock() |
|
|
|
|
return b.chain.GetBlock(head.Hash(), head.Number.Uint64()), nil |
|
|
|
|
} |
|
|
|
|
if number == rpc.PendingBlockNumber { |
|
|
|
|
return b.pending, nil |
|
|
|
|
} |
|
|
|
|
return b.chain.GetBlockByNumber(uint64(number)), nil |
|
|
|
|
} |
|
|
|
|
func (b testBackend) BlockByHash(ctx context.Context, hash common.Hash) (*types.Block, error) { |
|
|
|
|
panic("implement me") |
|
|
|
|
return b.chain.GetBlockByHash(hash), nil |
|
|
|
|
} |
|
|
|
|
func (b testBackend) BlockByNumberOrHash(ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash) (*types.Block, error) { |
|
|
|
|
if blockNr, ok := blockNrOrHash.Number(); ok { |
|
|
|
|
return b.BlockByNumber(ctx, blockNr) |
|
|
|
|
} |
|
|
|
|
panic("implement me") |
|
|
|
|
if blockHash, ok := blockNrOrHash.Hash(); ok { |
|
|
|
|
return b.BlockByHash(ctx, blockHash) |
|
|
|
|
} |
|
|
|
|
panic("unknown type rpc.BlockNumberOrHash") |
|
|
|
|
} |
|
|
|
|
func (b testBackend) GetBody(ctx context.Context, hash common.Hash, number rpc.BlockNumber) (*types.Body, error) { |
|
|
|
|
return b.chain.GetBlock(hash, uint64(number.Int64())).Body(), nil |
|
|
|
@ -284,7 +327,12 @@ func (b testBackend) PendingBlockAndReceipts() (*types.Block, types.Receipts) { |
|
|
|
|
func (b testBackend) GetReceipts(ctx context.Context, hash common.Hash) (types.Receipts, error) { |
|
|
|
|
panic("implement me") |
|
|
|
|
} |
|
|
|
|
func (b testBackend) GetTd(ctx context.Context, hash common.Hash) *big.Int { panic("implement me") } |
|
|
|
|
func (b testBackend) GetTd(ctx context.Context, hash common.Hash) *big.Int { |
|
|
|
|
if b.pending != nil && hash == b.pending.Hash() { |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
return big.NewInt(1) |
|
|
|
|
} |
|
|
|
|
func (b testBackend) GetEVM(ctx context.Context, msg *core.Message, state *state.StateDB, header *types.Header, vmConfig *vm.Config, blockContext *vm.BlockContext) (*vm.EVM, func() error) { |
|
|
|
|
vmError := func() error { return nil } |
|
|
|
|
if vmConfig == nil { |
|
|
|
@ -653,6 +701,7 @@ func (h *testHasher) Hash() common.Hash { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func TestRPCMarshalBlock(t *testing.T) { |
|
|
|
|
t.Parallel() |
|
|
|
|
var ( |
|
|
|
|
txs []*types.Transaction |
|
|
|
|
to = common.BytesToAddress([]byte{0x11}) |
|
|
|
@ -700,7 +749,6 @@ func TestRPCMarshalBlock(t *testing.T) { |
|
|
|
|
fullTx: false, |
|
|
|
|
want: `{"difficulty":"0x0","extraData":"0x","gasLimit":"0x0","gasUsed":"0x0","hash":"0x9b73c83b25d0faf7eab854e3684c7e394336d6e135625aafa5c183f27baa8fee","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x64","parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x296","stateRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","timestamp":"0x0","transactions":["0x7d39df979e34172322c64983a9ad48302c2b889e55bda35324afecf043a77605","0x9bba4c34e57c875ff57ac8d172805a26ae912006985395dc1bdf8f44140a7bf4","0x98909ea1ff040da6be56bc4231d484de1414b3c1dac372d69293a4beb9032cb5","0x12e1f81207b40c3bdcc13c0ee18f5f86af6d31754d57a0ea1b0d4cfef21abef1"],"transactionsRoot":"0x661a9febcfa8f1890af549b874faf9fa274aede26ef489d9db0b25daa569450e","uncles":[]}`, |
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
// full tx details
|
|
|
|
|
{ |
|
|
|
|
inclTx: true, |
|
|
|
@ -725,3 +773,257 @@ func TestRPCMarshalBlock(t *testing.T) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func TestRPCGetBlockOrHeader(t *testing.T) { |
|
|
|
|
t.Parallel() |
|
|
|
|
|
|
|
|
|
// Initialize test accounts
|
|
|
|
|
var ( |
|
|
|
|
acc1Key, _ = crypto.HexToECDSA("8a1f9a8f95be41cd7ccb6168179afb4504aefe388d1e14474d32c45c72ce7b7a") |
|
|
|
|
acc2Key, _ = crypto.HexToECDSA("49a7b37aa6f6645917e7b807e9d1c00d4fa71f18343b0d4122a4d2df64dd6fee") |
|
|
|
|
acc1Addr = crypto.PubkeyToAddress(acc1Key.PublicKey) |
|
|
|
|
acc2Addr = crypto.PubkeyToAddress(acc2Key.PublicKey) |
|
|
|
|
genesis = &core.Genesis{ |
|
|
|
|
Config: params.TestChainConfig, |
|
|
|
|
Alloc: core.GenesisAlloc{ |
|
|
|
|
acc1Addr: {Balance: big.NewInt(params.Ether)}, |
|
|
|
|
acc2Addr: {Balance: big.NewInt(params.Ether)}, |
|
|
|
|
}, |
|
|
|
|
} |
|
|
|
|
genBlocks = 10 |
|
|
|
|
signer = types.HomesteadSigner{} |
|
|
|
|
tx = types.NewTx(&types.LegacyTx{ |
|
|
|
|
Nonce: 11, |
|
|
|
|
GasPrice: big.NewInt(11111), |
|
|
|
|
Gas: 1111, |
|
|
|
|
To: &acc2Addr, |
|
|
|
|
Value: big.NewInt(111), |
|
|
|
|
Data: []byte{0x11, 0x11, 0x11}, |
|
|
|
|
}) |
|
|
|
|
withdrawal = &types.Withdrawal{ |
|
|
|
|
Index: 0, |
|
|
|
|
Validator: 1, |
|
|
|
|
Address: common.Address{0x12, 0x34}, |
|
|
|
|
Amount: 10, |
|
|
|
|
} |
|
|
|
|
pending = types.NewBlockWithWithdrawals(&types.Header{Number: big.NewInt(11), Time: 42}, []*types.Transaction{tx}, nil, nil, []*types.Withdrawal{withdrawal}, newHasher()) |
|
|
|
|
) |
|
|
|
|
backend := newTestBackend(t, genBlocks, genesis, func(i int, b *core.BlockGen) { |
|
|
|
|
// Transfer from account[0] to account[1]
|
|
|
|
|
// value: 1000 wei
|
|
|
|
|
// fee: 0 wei
|
|
|
|
|
tx, _ := types.SignTx(types.NewTx(&types.LegacyTx{Nonce: uint64(i), To: &acc2Addr, Value: big.NewInt(1000), Gas: params.TxGas, GasPrice: b.BaseFee(), Data: nil}), signer, acc1Key) |
|
|
|
|
b.AddTx(tx) |
|
|
|
|
}) |
|
|
|
|
backend.setPendingBlock(pending) |
|
|
|
|
api := NewBlockChainAPI(backend) |
|
|
|
|
blockHashes := make([]common.Hash, genBlocks+1) |
|
|
|
|
ctx := context.Background() |
|
|
|
|
for i := 0; i <= genBlocks; i++ { |
|
|
|
|
header, err := backend.HeaderByNumber(ctx, rpc.BlockNumber(i)) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Errorf("failed to get block: %d err: %v", i, err) |
|
|
|
|
} |
|
|
|
|
blockHashes[i] = header.Hash() |
|
|
|
|
} |
|
|
|
|
pendingHash := pending.Hash() |
|
|
|
|
|
|
|
|
|
var testSuite = []struct { |
|
|
|
|
blockNumber rpc.BlockNumber |
|
|
|
|
blockHash *common.Hash |
|
|
|
|
fullTx bool |
|
|
|
|
reqHeader bool |
|
|
|
|
want string |
|
|
|
|
expectErr error |
|
|
|
|
}{ |
|
|
|
|
// 0. latest header
|
|
|
|
|
{ |
|
|
|
|
blockNumber: rpc.LatestBlockNumber, |
|
|
|
|
reqHeader: true, |
|
|
|
|
want: `{"baseFeePerGas":"0xfdc7303", "difficulty":"0x20000", "extraData":"0x", "gasLimit":"0x47e7c4", "gasUsed":"0x5208", "hash":"0x97f540a3577c0f645c5dada5da86f38350e8f847e71f21124f917835003e2607", "logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "miner":"0x0000000000000000000000000000000000000000", "mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000", "nonce":"0x0000000000000000", "number":"0xa", "parentHash":"0xda97ed946e0d502fb898b0ac881bd44da3c7fee5eaf184431e1ec3d361dad17e", "receiptsRoot":"0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2", "sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", "stateRoot":"0xbb62872e4023fa8a8b17b9cc37031f4817d9595779748d01cba408b495707a91", "timestamp":"0x64", "totalDifficulty":"0x1", "transactionsRoot":"0xb0893d21a4a44dc26a962a6e91abae66df87fb61ac9c60e936aee89c76331445"}`, |
|
|
|
|
}, |
|
|
|
|
// 1. genesis header
|
|
|
|
|
{ |
|
|
|
|
blockNumber: rpc.BlockNumber(0), |
|
|
|
|
reqHeader: true, |
|
|
|
|
want: `{"baseFeePerGas":"0x3b9aca00", "difficulty":"0x20000", "extraData":"0x", "gasLimit":"0x47e7c4", "gasUsed":"0x0", "hash":"0xbdc7d83b8f876938810462fe8d053263a482e44201e3883d4ae204ff4de7eff5", "logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "miner":"0x0000000000000000000000000000000000000000", "mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000", "nonce":"0x0000000000000000", "number":"0x0", "parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000", "receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", "stateRoot":"0xfe168c5e9584a85927212e5bea5304bb7d0d8a893453b4b2c52176a72f585ae2", "timestamp":"0x0", "totalDifficulty":"0x1", "transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}`, |
|
|
|
|
}, |
|
|
|
|
// 2. #1 header
|
|
|
|
|
{ |
|
|
|
|
blockNumber: rpc.BlockNumber(1), |
|
|
|
|
reqHeader: true, |
|
|
|
|
want: `{"baseFeePerGas":"0x342770c0", "difficulty":"0x20000", "extraData":"0x", "gasLimit":"0x47e7c4", "gasUsed":"0x5208", "hash":"0x0da274b315de8e4d5bf8717218ec43540464ef36378cb896469bb731e1d3f3cb", "logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "miner":"0x0000000000000000000000000000000000000000", "mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000", "nonce":"0x0000000000000000", "number":"0x1", "parentHash":"0xbdc7d83b8f876938810462fe8d053263a482e44201e3883d4ae204ff4de7eff5", "receiptsRoot":"0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2", "sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", "stateRoot":"0x92c5c55a698963f5b06e3aee415630f5c48b0760e537af94917ce9c4f42a2e22", "timestamp":"0xa", "totalDifficulty":"0x1", "transactionsRoot":"0xca0ebcce920d2cdfbf9e1dbe90ed3441a1a576f344bd80e60508da814916f4e7"}`, |
|
|
|
|
}, |
|
|
|
|
// 3. latest-1 header
|
|
|
|
|
{ |
|
|
|
|
blockNumber: rpc.BlockNumber(9), |
|
|
|
|
reqHeader: true, |
|
|
|
|
want: `{"baseFeePerGas":"0x121a9cca", "difficulty":"0x20000", "extraData":"0x", "gasLimit":"0x47e7c4", "gasUsed":"0x5208", "hash":"0xda97ed946e0d502fb898b0ac881bd44da3c7fee5eaf184431e1ec3d361dad17e", "logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "miner":"0x0000000000000000000000000000000000000000", "mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000", "nonce":"0x0000000000000000", "number":"0x9", "parentHash":"0x5abd19c39d9f1c6e52998e135ea14e1fbc5db3fa2a108f4538e238ca5c2e68d7", "receiptsRoot":"0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2", "sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", "stateRoot":"0xbd4aa2c2873df709151075250a8c01c9a14d2b0e2f715dbdd16e0ef8030c2cf0", "timestamp":"0x5a", "totalDifficulty":"0x1", "transactionsRoot":"0x0767ed8359337dc6a8fdc77fe52db611bed1be87aac73c4556b1bf1dd3d190a5"}`, |
|
|
|
|
}, |
|
|
|
|
// 4. latest+1 header
|
|
|
|
|
{ |
|
|
|
|
blockNumber: rpc.BlockNumber(11), |
|
|
|
|
reqHeader: true, |
|
|
|
|
want: "null", |
|
|
|
|
}, |
|
|
|
|
// 5. pending header
|
|
|
|
|
{ |
|
|
|
|
blockNumber: rpc.PendingBlockNumber, |
|
|
|
|
reqHeader: true, |
|
|
|
|
want: `{"difficulty":"0x0","extraData":"0x","gasLimit":"0x0","gasUsed":"0x0","hash":null,"logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":null,"mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":null,"number":"0xb","parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","stateRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","timestamp":"0x2a","totalDifficulty":null,"transactionsRoot":"0x98d9f6dd0aa479c0fb448f2627e9f1964aca699fccab8f6e95861547a4699e37","withdrawalsRoot":"0x73d756269cdfc22e7e17a3548e36f42f750ca06d7e3cd98d1b6d0eb5add9dc84"}`, |
|
|
|
|
}, |
|
|
|
|
// 6. latest block
|
|
|
|
|
{ |
|
|
|
|
blockNumber: rpc.LatestBlockNumber, |
|
|
|
|
want: `{"baseFeePerGas":"0xfdc7303","difficulty":"0x20000","extraData":"0x","gasLimit":"0x47e7c4","gasUsed":"0x5208","hash":"0x97f540a3577c0f645c5dada5da86f38350e8f847e71f21124f917835003e2607","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0xa","parentHash":"0xda97ed946e0d502fb898b0ac881bd44da3c7fee5eaf184431e1ec3d361dad17e","receiptsRoot":"0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x26a","stateRoot":"0xbb62872e4023fa8a8b17b9cc37031f4817d9595779748d01cba408b495707a91","timestamp":"0x64","totalDifficulty":"0x1","transactions":["0x3ee4094ca1e0b07a66dd616a057e081e53144ca7e9685a126fd4dda9ca042644"],"transactionsRoot":"0xb0893d21a4a44dc26a962a6e91abae66df87fb61ac9c60e936aee89c76331445","uncles":[]}`, |
|
|
|
|
}, |
|
|
|
|
// 7. genesis block
|
|
|
|
|
{ |
|
|
|
|
blockNumber: rpc.BlockNumber(0), |
|
|
|
|
want: `{"baseFeePerGas":"0x3b9aca00","difficulty":"0x20000","extraData":"0x","gasLimit":"0x47e7c4","gasUsed":"0x0","hash":"0xbdc7d83b8f876938810462fe8d053263a482e44201e3883d4ae204ff4de7eff5","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x0","parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x200","stateRoot":"0xfe168c5e9584a85927212e5bea5304bb7d0d8a893453b4b2c52176a72f585ae2","timestamp":"0x0","totalDifficulty":"0x1","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[]}`, |
|
|
|
|
}, |
|
|
|
|
// 8. #1 block
|
|
|
|
|
{ |
|
|
|
|
blockNumber: rpc.BlockNumber(1), |
|
|
|
|
want: `{"baseFeePerGas":"0x342770c0","difficulty":"0x20000","extraData":"0x","gasLimit":"0x47e7c4","gasUsed":"0x5208","hash":"0x0da274b315de8e4d5bf8717218ec43540464ef36378cb896469bb731e1d3f3cb","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x1","parentHash":"0xbdc7d83b8f876938810462fe8d053263a482e44201e3883d4ae204ff4de7eff5","receiptsRoot":"0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x26a","stateRoot":"0x92c5c55a698963f5b06e3aee415630f5c48b0760e537af94917ce9c4f42a2e22","timestamp":"0xa","totalDifficulty":"0x1","transactions":["0x644a31c354391520d00e95b9affbbb010fc79ac268144ab8e28207f4cf51097e"],"transactionsRoot":"0xca0ebcce920d2cdfbf9e1dbe90ed3441a1a576f344bd80e60508da814916f4e7","uncles":[]}`, |
|
|
|
|
}, |
|
|
|
|
// 9. latest-1 block
|
|
|
|
|
{ |
|
|
|
|
blockNumber: rpc.BlockNumber(9), |
|
|
|
|
fullTx: true, |
|
|
|
|
want: `{"baseFeePerGas":"0x121a9cca","difficulty":"0x20000","extraData":"0x","gasLimit":"0x47e7c4","gasUsed":"0x5208","hash":"0xda97ed946e0d502fb898b0ac881bd44da3c7fee5eaf184431e1ec3d361dad17e","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x9","parentHash":"0x5abd19c39d9f1c6e52998e135ea14e1fbc5db3fa2a108f4538e238ca5c2e68d7","receiptsRoot":"0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x26a","stateRoot":"0xbd4aa2c2873df709151075250a8c01c9a14d2b0e2f715dbdd16e0ef8030c2cf0","timestamp":"0x5a","totalDifficulty":"0x1","transactions":[{"blockHash":"0xda97ed946e0d502fb898b0ac881bd44da3c7fee5eaf184431e1ec3d361dad17e","blockNumber":"0x9","from":"0x703c4b2bd70c169f5717101caee543299fc946c7","gas":"0x5208","gasPrice":"0x121a9cca","hash":"0xecd155a61a5734b3efab75924e3ae34026c7c4133d8c2a46122bd03d7d199725","input":"0x","nonce":"0x8","to":"0x0d3ab14bbad3d99f4203bd7a11acb94882050e7e","transactionIndex":"0x0","value":"0x3e8","type":"0x0","v":"0x1b","r":"0xc6028b8e983d62fa8542f8a7633fb23cc941be2c897134352d95a7d9b19feafd","s":"0xeb6adcaaae3bed489c6cce4435f9db05d23a52820c78bd350e31eec65ed809d"}],"transactionsRoot":"0x0767ed8359337dc6a8fdc77fe52db611bed1be87aac73c4556b1bf1dd3d190a5","uncles":[]}`, |
|
|
|
|
}, |
|
|
|
|
// 10. latest+1 block
|
|
|
|
|
{ |
|
|
|
|
blockNumber: rpc.BlockNumber(11), |
|
|
|
|
fullTx: true, |
|
|
|
|
want: "null", |
|
|
|
|
}, |
|
|
|
|
// 11. pending block
|
|
|
|
|
{ |
|
|
|
|
blockNumber: rpc.PendingBlockNumber, |
|
|
|
|
want: `{"difficulty":"0x0","extraData":"0x","gasLimit":"0x0","gasUsed":"0x0","hash":null,"logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":null,"mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":null,"number":"0xb","parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x256","stateRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","timestamp":"0x2a","totalDifficulty":null,"transactions":["0x4afee081df5dff7a025964032871f7d4ba4d21baf5f6376a2f4a9f79fc506298"],"transactionsRoot":"0x98d9f6dd0aa479c0fb448f2627e9f1964aca699fccab8f6e95861547a4699e37","withdrawals":[{"index":"0x0","validatorIndex":"0x1","address":"0x1234000000000000000000000000000000000000","amount":"0xa"}],"withdrawalsRoot":"0x73d756269cdfc22e7e17a3548e36f42f750ca06d7e3cd98d1b6d0eb5add9dc84","uncles":[]}`, |
|
|
|
|
}, |
|
|
|
|
// 12. pending block + fullTx
|
|
|
|
|
{ |
|
|
|
|
blockNumber: rpc.PendingBlockNumber, |
|
|
|
|
fullTx: true, |
|
|
|
|
want: `{"difficulty":"0x0","extraData":"0x","gasLimit":"0x0","gasUsed":"0x0","hash":null,"logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":null,"mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":null,"number":"0xb","parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x256","stateRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","timestamp":"0x2a","totalDifficulty":null,"transactions":[{"blockHash":"0x6cebd9f966ea686f44b981685e3f0eacea28591a7a86d7fbbe521a86e9f81165","blockNumber":"0xb","from":"0x0000000000000000000000000000000000000000","gas":"0x457","gasPrice":"0x2b67","hash":"0x4afee081df5dff7a025964032871f7d4ba4d21baf5f6376a2f4a9f79fc506298","input":"0x111111","nonce":"0xb","to":"0x0d3ab14bbad3d99f4203bd7a11acb94882050e7e","transactionIndex":"0x0","value":"0x6f","type":"0x0","chainId":"0x7fffffffffffffee","v":"0x0","r":"0x0","s":"0x0"}],"transactionsRoot":"0x98d9f6dd0aa479c0fb448f2627e9f1964aca699fccab8f6e95861547a4699e37","uncles":[],"withdrawals":[{"index":"0x0","validatorIndex":"0x1","address":"0x1234000000000000000000000000000000000000","amount":"0xa"}],"withdrawalsRoot":"0x73d756269cdfc22e7e17a3548e36f42f750ca06d7e3cd98d1b6d0eb5add9dc84"}`, |
|
|
|
|
}, |
|
|
|
|
// 13. latest header by hash
|
|
|
|
|
{ |
|
|
|
|
blockHash: &blockHashes[len(blockHashes)-1], |
|
|
|
|
reqHeader: true, |
|
|
|
|
want: `{"baseFeePerGas":"0xfdc7303", "difficulty":"0x20000", "extraData":"0x", "gasLimit":"0x47e7c4", "gasUsed":"0x5208", "hash":"0x97f540a3577c0f645c5dada5da86f38350e8f847e71f21124f917835003e2607", "logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "miner":"0x0000000000000000000000000000000000000000", "mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000", "nonce":"0x0000000000000000", "number":"0xa", "parentHash":"0xda97ed946e0d502fb898b0ac881bd44da3c7fee5eaf184431e1ec3d361dad17e", "receiptsRoot":"0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2", "sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", "stateRoot":"0xbb62872e4023fa8a8b17b9cc37031f4817d9595779748d01cba408b495707a91", "timestamp":"0x64", "totalDifficulty":"0x1", "transactionsRoot":"0xb0893d21a4a44dc26a962a6e91abae66df87fb61ac9c60e936aee89c76331445"}`, |
|
|
|
|
}, |
|
|
|
|
// 14. genesis header by hash
|
|
|
|
|
{ |
|
|
|
|
blockHash: &blockHashes[0], |
|
|
|
|
reqHeader: true, |
|
|
|
|
want: `{"baseFeePerGas":"0x3b9aca00", "difficulty":"0x20000", "extraData":"0x", "gasLimit":"0x47e7c4", "gasUsed":"0x0", "hash":"0xbdc7d83b8f876938810462fe8d053263a482e44201e3883d4ae204ff4de7eff5", "logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "miner":"0x0000000000000000000000000000000000000000", "mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000", "nonce":"0x0000000000000000", "number":"0x0", "parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000", "receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", "stateRoot":"0xfe168c5e9584a85927212e5bea5304bb7d0d8a893453b4b2c52176a72f585ae2", "timestamp":"0x0", "totalDifficulty":"0x1", "transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}`, |
|
|
|
|
}, |
|
|
|
|
// 15. #1 header
|
|
|
|
|
{ |
|
|
|
|
blockHash: &blockHashes[1], |
|
|
|
|
reqHeader: true, |
|
|
|
|
want: `{"baseFeePerGas":"0x342770c0", "difficulty":"0x20000", "extraData":"0x", "gasLimit":"0x47e7c4", "gasUsed":"0x5208", "hash":"0x0da274b315de8e4d5bf8717218ec43540464ef36378cb896469bb731e1d3f3cb", "logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "miner":"0x0000000000000000000000000000000000000000", "mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000", "nonce":"0x0000000000000000", "number":"0x1", "parentHash":"0xbdc7d83b8f876938810462fe8d053263a482e44201e3883d4ae204ff4de7eff5", "receiptsRoot":"0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2", "sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", "stateRoot":"0x92c5c55a698963f5b06e3aee415630f5c48b0760e537af94917ce9c4f42a2e22", "timestamp":"0xa", "totalDifficulty":"0x1", "transactionsRoot":"0xca0ebcce920d2cdfbf9e1dbe90ed3441a1a576f344bd80e60508da814916f4e7"}`, |
|
|
|
|
}, |
|
|
|
|
// 16. latest-1 header
|
|
|
|
|
{ |
|
|
|
|
blockHash: &blockHashes[len(blockHashes)-2], |
|
|
|
|
reqHeader: true, |
|
|
|
|
want: `{"baseFeePerGas":"0x121a9cca", "difficulty":"0x20000", "extraData":"0x", "gasLimit":"0x47e7c4", "gasUsed":"0x5208", "hash":"0xda97ed946e0d502fb898b0ac881bd44da3c7fee5eaf184431e1ec3d361dad17e", "logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "miner":"0x0000000000000000000000000000000000000000", "mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000", "nonce":"0x0000000000000000", "number":"0x9", "parentHash":"0x5abd19c39d9f1c6e52998e135ea14e1fbc5db3fa2a108f4538e238ca5c2e68d7", "receiptsRoot":"0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2", "sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", "stateRoot":"0xbd4aa2c2873df709151075250a8c01c9a14d2b0e2f715dbdd16e0ef8030c2cf0", "timestamp":"0x5a", "totalDifficulty":"0x1", "transactionsRoot":"0x0767ed8359337dc6a8fdc77fe52db611bed1be87aac73c4556b1bf1dd3d190a5"}`, |
|
|
|
|
}, |
|
|
|
|
// 17. empty hash
|
|
|
|
|
{ |
|
|
|
|
blockHash: &common.Hash{}, |
|
|
|
|
reqHeader: true, |
|
|
|
|
want: "null", |
|
|
|
|
}, |
|
|
|
|
// 18. pending hash
|
|
|
|
|
{ |
|
|
|
|
blockHash: &pendingHash, |
|
|
|
|
reqHeader: true, |
|
|
|
|
want: `null`, |
|
|
|
|
}, |
|
|
|
|
// 19. latest block
|
|
|
|
|
{ |
|
|
|
|
blockHash: &blockHashes[len(blockHashes)-1], |
|
|
|
|
want: `{"baseFeePerGas":"0xfdc7303","difficulty":"0x20000","extraData":"0x","gasLimit":"0x47e7c4","gasUsed":"0x5208","hash":"0x97f540a3577c0f645c5dada5da86f38350e8f847e71f21124f917835003e2607","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0xa","parentHash":"0xda97ed946e0d502fb898b0ac881bd44da3c7fee5eaf184431e1ec3d361dad17e","receiptsRoot":"0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x26a","stateRoot":"0xbb62872e4023fa8a8b17b9cc37031f4817d9595779748d01cba408b495707a91","timestamp":"0x64","totalDifficulty":"0x1","transactions":["0x3ee4094ca1e0b07a66dd616a057e081e53144ca7e9685a126fd4dda9ca042644"],"transactionsRoot":"0xb0893d21a4a44dc26a962a6e91abae66df87fb61ac9c60e936aee89c76331445","uncles":[]}`, |
|
|
|
|
}, |
|
|
|
|
// 20. genesis block
|
|
|
|
|
{ |
|
|
|
|
blockHash: &blockHashes[0], |
|
|
|
|
want: `{"baseFeePerGas":"0x3b9aca00","difficulty":"0x20000","extraData":"0x","gasLimit":"0x47e7c4","gasUsed":"0x0","hash":"0xbdc7d83b8f876938810462fe8d053263a482e44201e3883d4ae204ff4de7eff5","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x0","parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x200","stateRoot":"0xfe168c5e9584a85927212e5bea5304bb7d0d8a893453b4b2c52176a72f585ae2","timestamp":"0x0","totalDifficulty":"0x1","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[]}`, |
|
|
|
|
}, |
|
|
|
|
// 21. #1 block
|
|
|
|
|
{ |
|
|
|
|
blockHash: &blockHashes[1], |
|
|
|
|
want: `{"baseFeePerGas":"0x342770c0","difficulty":"0x20000","extraData":"0x","gasLimit":"0x47e7c4","gasUsed":"0x5208","hash":"0x0da274b315de8e4d5bf8717218ec43540464ef36378cb896469bb731e1d3f3cb","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x1","parentHash":"0xbdc7d83b8f876938810462fe8d053263a482e44201e3883d4ae204ff4de7eff5","receiptsRoot":"0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x26a","stateRoot":"0x92c5c55a698963f5b06e3aee415630f5c48b0760e537af94917ce9c4f42a2e22","timestamp":"0xa","totalDifficulty":"0x1","transactions":["0x644a31c354391520d00e95b9affbbb010fc79ac268144ab8e28207f4cf51097e"],"transactionsRoot":"0xca0ebcce920d2cdfbf9e1dbe90ed3441a1a576f344bd80e60508da814916f4e7","uncles":[]}`, |
|
|
|
|
}, |
|
|
|
|
// 22. latest-1 block
|
|
|
|
|
{ |
|
|
|
|
blockHash: &blockHashes[len(blockHashes)-2], |
|
|
|
|
fullTx: true, |
|
|
|
|
want: `{"baseFeePerGas":"0x121a9cca","difficulty":"0x20000","extraData":"0x","gasLimit":"0x47e7c4","gasUsed":"0x5208","hash":"0xda97ed946e0d502fb898b0ac881bd44da3c7fee5eaf184431e1ec3d361dad17e","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x9","parentHash":"0x5abd19c39d9f1c6e52998e135ea14e1fbc5db3fa2a108f4538e238ca5c2e68d7","receiptsRoot":"0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x26a","stateRoot":"0xbd4aa2c2873df709151075250a8c01c9a14d2b0e2f715dbdd16e0ef8030c2cf0","timestamp":"0x5a","totalDifficulty":"0x1","transactions":[{"blockHash":"0xda97ed946e0d502fb898b0ac881bd44da3c7fee5eaf184431e1ec3d361dad17e","blockNumber":"0x9","from":"0x703c4b2bd70c169f5717101caee543299fc946c7","gas":"0x5208","gasPrice":"0x121a9cca","hash":"0xecd155a61a5734b3efab75924e3ae34026c7c4133d8c2a46122bd03d7d199725","input":"0x","nonce":"0x8","to":"0x0d3ab14bbad3d99f4203bd7a11acb94882050e7e","transactionIndex":"0x0","value":"0x3e8","type":"0x0","v":"0x1b","r":"0xc6028b8e983d62fa8542f8a7633fb23cc941be2c897134352d95a7d9b19feafd","s":"0xeb6adcaaae3bed489c6cce4435f9db05d23a52820c78bd350e31eec65ed809d"}],"transactionsRoot":"0x0767ed8359337dc6a8fdc77fe52db611bed1be87aac73c4556b1bf1dd3d190a5","uncles":[]}`, |
|
|
|
|
}, |
|
|
|
|
// 23. empty hash + body
|
|
|
|
|
{ |
|
|
|
|
blockHash: &common.Hash{}, |
|
|
|
|
fullTx: true, |
|
|
|
|
want: "null", |
|
|
|
|
}, |
|
|
|
|
// 24. pending block
|
|
|
|
|
{ |
|
|
|
|
blockHash: &pendingHash, |
|
|
|
|
want: `null`, |
|
|
|
|
}, |
|
|
|
|
// 25. pending block + fullTx
|
|
|
|
|
{ |
|
|
|
|
blockHash: &pendingHash, |
|
|
|
|
fullTx: true, |
|
|
|
|
want: `null`, |
|
|
|
|
}, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for i, tt := range testSuite { |
|
|
|
|
var ( |
|
|
|
|
result map[string]interface{} |
|
|
|
|
err error |
|
|
|
|
) |
|
|
|
|
if tt.blockHash != nil { |
|
|
|
|
if tt.reqHeader { |
|
|
|
|
result = api.GetHeaderByHash(context.Background(), *tt.blockHash) |
|
|
|
|
} else { |
|
|
|
|
result, err = api.GetBlockByHash(context.Background(), *tt.blockHash, tt.fullTx) |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
if tt.reqHeader { |
|
|
|
|
result, err = api.GetHeaderByNumber(context.Background(), tt.blockNumber) |
|
|
|
|
} else { |
|
|
|
|
result, err = api.GetBlockByNumber(context.Background(), tt.blockNumber, tt.fullTx) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if tt.expectErr != nil { |
|
|
|
|
if err == nil { |
|
|
|
|
t.Errorf("test %d: want error %v, have nothing", i, tt.expectErr) |
|
|
|
|
continue |
|
|
|
|
} |
|
|
|
|
if !errors.Is(err, tt.expectErr) { |
|
|
|
|
t.Errorf("test %d: error mismatch, want %v, have %v", i, tt.expectErr, err) |
|
|
|
|
} |
|
|
|
|
continue |
|
|
|
|
} |
|
|
|
|
if err != nil { |
|
|
|
|
t.Errorf("test %d: want no error, have %v", i, err) |
|
|
|
|
continue |
|
|
|
|
} |
|
|
|
|
data, err := json.Marshal(result) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Errorf("test %d: json marshal error", i) |
|
|
|
|
continue |
|
|
|
|
} |
|
|
|
|
want, have := tt.want, string(data) |
|
|
|
|
require.JSONEqf(t, want, have, "test %d: json not match, want: %s, have: %s", i, want, have) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|