add field timestamp to eth_getLogs response (#4950)

* add_abigen_error_handle

* add abigen error type test code

* add field timestamp in `eth_getLogs` api

add field timestamp in `eth_getLogs` api
This commit is contained in:
fenghaojiang 2022-08-08 10:17:32 +08:00 committed by GitHub
parent cce64f6a33
commit bc7921a8ab
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 18 additions and 4 deletions

View File

@ -191,6 +191,7 @@ func (api *APIImpl) GetLogs(ctx context.Context, crit filters.FilterCriteria) ([
if err != nil { if err != nil {
return nil, err return nil, err
} }
timestamp := uint64(txn.Time().Unix())
txHash := txn.Hash() txHash := txn.Hash()
msg, err := txn.AsMessage(*lastSigner, lastHeader.BaseFee, lastRules) msg, err := txn.AsMessage(*lastSigner, lastHeader.BaseFee, lastRules)
if err != nil { if err != nil {
@ -213,6 +214,7 @@ func (api *APIImpl) GetLogs(ctx context.Context, crit filters.FilterCriteria) ([
filtered := filterLogs(ibs.GetLogs(txHash), crit.Addresses, crit.Topics) filtered := filterLogs(ibs.GetLogs(txHash), crit.Addresses, crit.Topics)
for _, log := range filtered { for _, log := range filtered {
log.BlockNumber = blockNum log.BlockNumber = blockNum
log.Timestamp = timestamp
log.BlockHash = lastBlockHash log.BlockHash = lastBlockHash
log.TxHash = txHash log.TxHash = txHash
log.Index = 0 log.Index = 0

View File

@ -19,6 +19,7 @@ func (l Log) MarshalJSON() ([]byte, error) {
Topics []common.Hash `json:"topics" gencodec:"required"` Topics []common.Hash `json:"topics" gencodec:"required"`
Data hexutil.Bytes `json:"data" gencodec:"required"` Data hexutil.Bytes `json:"data" gencodec:"required"`
BlockNumber hexutil.Uint64 `json:"blockNumber"` BlockNumber hexutil.Uint64 `json:"blockNumber"`
Timestamp hexutil.Uint64 `json:"timestamp"`
TxHash common.Hash `json:"transactionHash" gencodec:"required"` TxHash common.Hash `json:"transactionHash" gencodec:"required"`
TxIndex hexutil.Uint `json:"transactionIndex"` TxIndex hexutil.Uint `json:"transactionIndex"`
BlockHash common.Hash `json:"blockHash"` BlockHash common.Hash `json:"blockHash"`
@ -30,6 +31,7 @@ func (l Log) MarshalJSON() ([]byte, error) {
enc.Topics = l.Topics enc.Topics = l.Topics
enc.Data = l.Data enc.Data = l.Data
enc.BlockNumber = hexutil.Uint64(l.BlockNumber) enc.BlockNumber = hexutil.Uint64(l.BlockNumber)
enc.Timestamp = hexutil.Uint64(l.Timestamp)
enc.TxHash = l.TxHash enc.TxHash = l.TxHash
enc.TxIndex = hexutil.Uint(l.TxIndex) enc.TxIndex = hexutil.Uint(l.TxIndex)
enc.BlockHash = l.BlockHash enc.BlockHash = l.BlockHash
@ -45,6 +47,7 @@ func (l *Log) UnmarshalJSON(input []byte) error {
Topics []common.Hash `json:"topics" gencodec:"required"` Topics []common.Hash `json:"topics" gencodec:"required"`
Data *hexutil.Bytes `json:"data" gencodec:"required"` Data *hexutil.Bytes `json:"data" gencodec:"required"`
BlockNumber *hexutil.Uint64 `json:"blockNumber"` BlockNumber *hexutil.Uint64 `json:"blockNumber"`
Timestamp *hexutil.Uint64 `json:"timestamp"`
TxHash *common.Hash `json:"transactionHash" gencodec:"required"` TxHash *common.Hash `json:"transactionHash" gencodec:"required"`
TxIndex *hexutil.Uint `json:"transactionIndex"` TxIndex *hexutil.Uint `json:"transactionIndex"`
BlockHash *common.Hash `json:"blockHash"` BlockHash *common.Hash `json:"blockHash"`
@ -70,6 +73,9 @@ func (l *Log) UnmarshalJSON(input []byte) error {
if dec.BlockNumber != nil { if dec.BlockNumber != nil {
l.BlockNumber = uint64(*dec.BlockNumber) l.BlockNumber = uint64(*dec.BlockNumber)
} }
if dec.Timestamp != nil {
l.Timestamp = uint64(*dec.Timestamp)
}
if dec.TxHash == nil { if dec.TxHash == nil {
return errors.New("missing required field 'transactionHash' for Log") return errors.New("missing required field 'transactionHash' for Log")
} }

View File

@ -41,6 +41,8 @@ type Log struct {
// but not secured by consensus. // but not secured by consensus.
// block in which the transaction was included // block in which the transaction was included
BlockNumber uint64 `json:"blockNumber" codec:"-"` BlockNumber uint64 `json:"blockNumber" codec:"-"`
Timestamp uint64 `json:"timestamp" codec:"-"`
// hash of the transaction // hash of the transaction
TxHash common.Hash `json:"transactionHash" gencodec:"required" codec:"-"` TxHash common.Hash `json:"transactionHash" gencodec:"required" codec:"-"`
// index of the transaction in the block // index of the transaction in the block

View File

@ -33,11 +33,12 @@ var unmarshalLogTests = map[string]struct {
wantError error wantError error
}{ }{
"ok": { "ok": {
input: `{"address":"0xecf8f87f810ecf450940c9f60066b4a7a501d6a7","blockHash":"0x656c34545f90a730a19008c0e7a7cd4fb3895064b48d6d69761bd5abad681056","blockNumber":"0x1ecfa4","data":"0x000000000000000000000000000000000000000000000001a055690d9db80000","logIndex":"0x2","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x00000000000000000000000080b2c9d7cbbf30a1b0fc8983c647d754c6525615"],"transactionHash":"0x3b198bfd5d2907285af009e9ae84a0ecd63677110d89d7e030251acb87f6487e","transactionIndex":"0x3"}`, input: `{"address":"0xecf8f87f810ecf450940c9f60066b4a7a501d6a7","blockHash":"0x656c34545f90a730a19008c0e7a7cd4fb3895064b48d6d69761bd5abad681056","blockNumber":"0x1ecfa4","timestamp":"0x57a53d3a","data":"0x000000000000000000000000000000000000000000000001a055690d9db80000","logIndex":"0x2","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x00000000000000000000000080b2c9d7cbbf30a1b0fc8983c647d754c6525615"],"transactionHash":"0x3b198bfd5d2907285af009e9ae84a0ecd63677110d89d7e030251acb87f6487e","transactionIndex":"0x3"}`,
want: &Log{ want: &Log{
Address: common.HexToAddress("0xecf8f87f810ecf450940c9f60066b4a7a501d6a7"), Address: common.HexToAddress("0xecf8f87f810ecf450940c9f60066b4a7a501d6a7"),
BlockHash: common.HexToHash("0x656c34545f90a730a19008c0e7a7cd4fb3895064b48d6d69761bd5abad681056"), BlockHash: common.HexToHash("0x656c34545f90a730a19008c0e7a7cd4fb3895064b48d6d69761bd5abad681056"),
BlockNumber: 2019236, BlockNumber: 2019236,
Timestamp: 1470446906,
Data: hexutil.MustDecode("0x000000000000000000000000000000000000000000000001a055690d9db80000"), Data: hexutil.MustDecode("0x000000000000000000000000000000000000000000000001a055690d9db80000"),
Index: 2, Index: 2,
TxIndex: 3, TxIndex: 3,
@ -49,11 +50,12 @@ var unmarshalLogTests = map[string]struct {
}, },
}, },
"empty data": { "empty data": {
input: `{"address":"0xecf8f87f810ecf450940c9f60066b4a7a501d6a7","blockHash":"0x656c34545f90a730a19008c0e7a7cd4fb3895064b48d6d69761bd5abad681056","blockNumber":"0x1ecfa4","data":"0x","logIndex":"0x2","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x00000000000000000000000080b2c9d7cbbf30a1b0fc8983c647d754c6525615"],"transactionHash":"0x3b198bfd5d2907285af009e9ae84a0ecd63677110d89d7e030251acb87f6487e","transactionIndex":"0x3"}`, input: `{"address":"0xecf8f87f810ecf450940c9f60066b4a7a501d6a7","blockHash":"0x656c34545f90a730a19008c0e7a7cd4fb3895064b48d6d69761bd5abad681056","blockNumber":"0x1ecfa4","timestamp":"0x57a53d3a","data":"0x","logIndex":"0x2","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x00000000000000000000000080b2c9d7cbbf30a1b0fc8983c647d754c6525615"],"transactionHash":"0x3b198bfd5d2907285af009e9ae84a0ecd63677110d89d7e030251acb87f6487e","transactionIndex":"0x3"}`,
want: &Log{ want: &Log{
Address: common.HexToAddress("0xecf8f87f810ecf450940c9f60066b4a7a501d6a7"), Address: common.HexToAddress("0xecf8f87f810ecf450940c9f60066b4a7a501d6a7"),
BlockHash: common.HexToHash("0x656c34545f90a730a19008c0e7a7cd4fb3895064b48d6d69761bd5abad681056"), BlockHash: common.HexToHash("0x656c34545f90a730a19008c0e7a7cd4fb3895064b48d6d69761bd5abad681056"),
BlockNumber: 2019236, BlockNumber: 2019236,
Timestamp: 1470446906,
Data: []byte{}, Data: []byte{},
Index: 2, Index: 2,
TxIndex: 3, TxIndex: 3,
@ -70,6 +72,7 @@ var unmarshalLogTests = map[string]struct {
Address: common.HexToAddress("0xecf8f87f810ecf450940c9f60066b4a7a501d6a7"), Address: common.HexToAddress("0xecf8f87f810ecf450940c9f60066b4a7a501d6a7"),
BlockHash: common.Hash{}, BlockHash: common.Hash{},
BlockNumber: 0, BlockNumber: 0,
Timestamp: 0,
Data: []byte{}, Data: []byte{},
Index: 0, Index: 0,
TxIndex: 3, TxIndex: 3,
@ -80,11 +83,12 @@ var unmarshalLogTests = map[string]struct {
}, },
}, },
"Removed: true": { "Removed: true": {
input: `{"address":"0xecf8f87f810ecf450940c9f60066b4a7a501d6a7","blockHash":"0x656c34545f90a730a19008c0e7a7cd4fb3895064b48d6d69761bd5abad681056","blockNumber":"0x1ecfa4","data":"0x","logIndex":"0x2","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"],"transactionHash":"0x3b198bfd5d2907285af009e9ae84a0ecd63677110d89d7e030251acb87f6487e","transactionIndex":"0x3","removed":true}`, input: `{"address":"0xecf8f87f810ecf450940c9f60066b4a7a501d6a7","blockHash":"0x656c34545f90a730a19008c0e7a7cd4fb3895064b48d6d69761bd5abad681056","blockNumber":"0x1ecfa4","timestamp":"0x57a53d3a","data":"0x","logIndex":"0x2","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"],"transactionHash":"0x3b198bfd5d2907285af009e9ae84a0ecd63677110d89d7e030251acb87f6487e","transactionIndex":"0x3","removed":true}`,
want: &Log{ want: &Log{
Address: common.HexToAddress("0xecf8f87f810ecf450940c9f60066b4a7a501d6a7"), Address: common.HexToAddress("0xecf8f87f810ecf450940c9f60066b4a7a501d6a7"),
BlockHash: common.HexToHash("0x656c34545f90a730a19008c0e7a7cd4fb3895064b48d6d69761bd5abad681056"), BlockHash: common.HexToHash("0x656c34545f90a730a19008c0e7a7cd4fb3895064b48d6d69761bd5abad681056"),
BlockNumber: 2019236, BlockNumber: 2019236,
Timestamp: 1470446906,
Data: []byte{}, Data: []byte{},
Index: 2, Index: 2,
TxIndex: 3, TxIndex: 3,
@ -96,7 +100,7 @@ var unmarshalLogTests = map[string]struct {
}, },
}, },
"missing data": { "missing data": {
input: `{"address":"0xecf8f87f810ecf450940c9f60066b4a7a501d6a7","blockHash":"0x656c34545f90a730a19008c0e7a7cd4fb3895064b48d6d69761bd5abad681056","blockNumber":"0x1ecfa4","logIndex":"0x2","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x00000000000000000000000080b2c9d7cbbf30a1b0fc8983c647d754c6525615","0x000000000000000000000000f9dff387dcb5cc4cca5b91adb07a95f54e9f1bb6"],"transactionHash":"0x3b198bfd5d2907285af009e9ae84a0ecd63677110d89d7e030251acb87f6487e","transactionIndex":"0x3"}`, input: `{"address":"0xecf8f87f810ecf450940c9f60066b4a7a501d6a7","blockHash":"0x656c34545f90a730a19008c0e7a7cd4fb3895064b48d6d69761bd5abad681056","blockNumber":"0x1ecfa4","timestamp":"0x57a53d3a","logIndex":"0x2","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x00000000000000000000000080b2c9d7cbbf30a1b0fc8983c647d754c6525615","0x000000000000000000000000f9dff387dcb5cc4cca5b91adb07a95f54e9f1bb6"],"transactionHash":"0x3b198bfd5d2907285af009e9ae84a0ecd63677110d89d7e030251acb87f6487e","transactionIndex":"0x3"}`,
wantError: fmt.Errorf("missing required field 'data' for Log"), wantError: fmt.Errorf("missing required field 'data' for Log"),
}, },
} }