mirror of
https://github.com/trezor/blockbook.git
synced 2026-02-19 16:31:19 +01:00
Merge pull request #1383 from trezor/get-block-parallel-internal-data-fetching
processEventsForBlock and getInternalDataForBlock should run concurrently in GetBlock
This commit is contained in:
@@ -808,15 +808,13 @@ func (b *EthereumRPC) processCallTrace(call *rpcCallTrace, d *bchain.EthereumInt
|
||||
return contracts
|
||||
}
|
||||
|
||||
// getInternalDataForBlock fetches debug trace using callTracer, extracts internal transfers and creations and destructions of contracts
|
||||
func (b *EthereumRPC) getInternalDataForBlock(blockHash string, blockHeight uint32, transactions []bchain.RpcTransaction) ([]bchain.EthereumInternalData, []bchain.ContractInfo, error) {
|
||||
// getInternalDataForBlock fetches debug trace using callTracer, extracts internal transfers/creations/destructions; ctx controls cancellation.
|
||||
func (b *EthereumRPC) getInternalDataForBlock(ctx context.Context, blockHash string, blockHeight uint32, transactions []bchain.RpcTransaction) ([]bchain.EthereumInternalData, []bchain.ContractInfo, error) {
|
||||
data := make([]bchain.EthereumInternalData, len(transactions))
|
||||
contracts := make([]bchain.ContractInfo, 0)
|
||||
if ProcessInternalTransactions {
|
||||
ctx, cancel := context.WithTimeout(context.Background(), b.Timeout)
|
||||
defer cancel()
|
||||
var trace []rpcTraceResult
|
||||
err := b.RPC.CallContext(ctx, &trace, "debug_traceBlockByHash", blockHash, map[string]interface{}{"tracer": "callTracer"})
|
||||
err := b.RPC.CallContext(ctx, &trace, "debug_traceBlockByHash", blockHash, map[string]interface{}{"tracer": "callTracer"}) // Use caller-provided ctx for timeout/cancel.
|
||||
if err != nil {
|
||||
glog.Error("debug_traceBlockByHash block ", blockHash, ", error ", err)
|
||||
return data, contracts, err
|
||||
@@ -902,21 +900,49 @@ func (b *EthereumRPC) GetBlock(hash string, height uint32) (*bchain.Block, error
|
||||
if err != nil {
|
||||
return nil, errors.Annotatef(err, "hash %v, height %v", hash, height)
|
||||
}
|
||||
// get block events
|
||||
// TODO - could be possibly done in parallel to getInternalDataForBlock
|
||||
logs, ens, err := b.processEventsForBlock(head.Number)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
// Run event/log processing and internal data extraction in parallel; allow early return on log failure.
|
||||
ctxInternal, cancelInternal := context.WithTimeout(context.Background(), b.Timeout) // Cancel trace RPC on log error or timeout.
|
||||
defer cancelInternal() // Ensure timer resources are released on any return path.
|
||||
type logsResult struct { // Bundles processEventsForBlock outputs for channel return.
|
||||
logs map[string][]*bchain.RpcLog
|
||||
ens []bchain.AddressAliasRecord
|
||||
err error
|
||||
}
|
||||
type internalResult struct { // Bundles getInternalDataForBlock outputs for channel return.
|
||||
data []bchain.EthereumInternalData
|
||||
contracts []bchain.ContractInfo
|
||||
err error
|
||||
}
|
||||
logsCh := make(chan logsResult, 1) // Buffered so send won't block if we return early.
|
||||
internalCh := make(chan internalResult, 1) // Buffered to avoid goroutine leak on early return.
|
||||
go func() {
|
||||
logs, ens, err := b.processEventsForBlock(head.Number)
|
||||
logsCh <- logsResult{logs: logs, ens: ens, err: err} // Send result without shared state.
|
||||
}()
|
||||
go func() {
|
||||
data, contracts, err := b.getInternalDataForBlock(ctxInternal, head.Hash, bbh.Height, body.Transactions) // ctxInternal allows cancellation on log errors.
|
||||
internalCh <- internalResult{data: data, contracts: contracts, err: err} // Send result without shared state.
|
||||
}()
|
||||
logsRes := <-logsCh
|
||||
if logsRes.err != nil {
|
||||
// Short-circuit on log failure to preserve existing error behavior.
|
||||
return nil, logsRes.err
|
||||
}
|
||||
internalRes := <-internalCh
|
||||
// Rebind results to keep downstream logic unchanged.
|
||||
logs := logsRes.logs
|
||||
ens := logsRes.ens
|
||||
internalData := internalRes.data
|
||||
contracts := internalRes.contracts
|
||||
internalErr := internalRes.err
|
||||
// error fetching internal data does not stop the block processing
|
||||
var blockSpecificData *bchain.EthereumBlockSpecificData
|
||||
internalData, contracts, err := b.getInternalDataForBlock(head.Hash, bbh.Height, body.Transactions)
|
||||
// pass internalData error and ENS records in blockSpecificData to be stored
|
||||
if err != nil || len(ens) > 0 || len(contracts) > 0 {
|
||||
if internalErr != nil || len(ens) > 0 || len(contracts) > 0 {
|
||||
blockSpecificData = &bchain.EthereumBlockSpecificData{}
|
||||
if err != nil {
|
||||
blockSpecificData.InternalDataError = err.Error()
|
||||
// glog.Info("InternalDataError ", bbh.Height, ": ", err.Error())
|
||||
if internalErr != nil {
|
||||
blockSpecificData.InternalDataError = internalErr.Error()
|
||||
// glog.Info("InternalDataError ", bbh.Height, ": ", internalErr.Error())
|
||||
}
|
||||
if len(ens) > 0 {
|
||||
blockSpecificData.AddressAliasRecords = ens
|
||||
|
||||
113
tests/rpc/testdata/ethereum.json
vendored
Normal file
113
tests/rpc/testdata/ethereum.json
vendored
Normal file
@@ -0,0 +1,113 @@
|
||||
{
|
||||
"blockHeight": 24282258,
|
||||
"blockHash": "0x41e5588baa7464c209173046f6f7572a03d358802d5f6c57e1a3204222ef6bad",
|
||||
"blockTime": 1768987619,
|
||||
"blockSize": 22361,
|
||||
"blockTxs": [
|
||||
"0x3860498da623c650b1840b5137b1c2b689dfb2ce3bfb4b5d55c629ed8a99e81f",
|
||||
"0xd83442f30c6373a7f31bc244cd51d0ebf3e0fe9903ffcea8cf277fef4eda55ba",
|
||||
"0x2ffea538845772bff485f6735df4ba393ff0bb6aee8300eafd3029c74ce30f2d",
|
||||
"0x371e6a8d63f3e766e1228330f436fefcd40c3d40be49c97d5740e1f7e4590b72",
|
||||
"0x9032dde1271dfb32d6c74abd1ceb97ec7f91a2f77be5db9bd1588e8758117965",
|
||||
"0x99f0e3e593e5fdc65c6efd64246397fb6579a3a7c29c24f75ac064a6f1d0d5c7",
|
||||
"0x190b70f4af3e5ce324ef0380e75495a580b9cc95b5f12eeb2f841574e1690c14",
|
||||
"0xfbf2431b343fd88ce1e4e659f147cfa4d9209947d7ebb706060198df06f02d45",
|
||||
"0x6d2a90f94ebe845019c288b2e39fffc33b1206d5526e80e814be16be81e68812",
|
||||
"0xc4a187669e52075c603899cc1d8ef5bc5c74bdf7684e01919e63b4646bb7213f",
|
||||
"0x12668f29a9f2905b76309abca0c3eab9bd806166597b380ca018789f14bc7686",
|
||||
"0x48d5f2116c487f90051050d3a6786723ad5db425fa1f5be28ebb6edfe14db623",
|
||||
"0x58c5b405d05fa228b19d4548a14bb84dc657ff42c9e7ad0491aa2cc5e6ad5422",
|
||||
"0x859266c4932e24a517afe091676aebb8e81dad6993656f844f3c2bbb728767e4",
|
||||
"0xacc10c9a7361f6cfd114070ab88f56068e33de61a6351c2f993710a73a0f2021",
|
||||
"0x078f045836ce2a5fd121c2498f7e24d356df39d7e081fe60b13eeff60fbdd3ed",
|
||||
"0xce84a36c7ba4fde26467fabaa7a1c30d122393f7897e8b9a4bbb342846cb56e0",
|
||||
"0x33829f919553689bf121ba67279b8251f357a335d19092e10c609d26cb0477f6",
|
||||
"0x6567dbdf658c84f6d137525cb02b87a8d9100ec1f41c23a6f56c52ac9af2a4f2",
|
||||
"0x959658a2a09f9a4dbcfd44f573eabca6ae2a772429c059fdc4c44d9f32075072",
|
||||
"0x37210571a89aabdb7f8029bdb5bfce3f3405cd25a85567c584e16e5d61a2522a",
|
||||
"0xb2cdff720c44a822617c2347d26f04dfc58a4c56c9a1b7b9c9da5225816d1e13",
|
||||
"0x441e38fbd5099a5a9384c5e46569c68ec25261236126f748be041416dc5f10fb",
|
||||
"0x1e17ab4fbf1fafa582fdf45dc7f0ab6b62493780cb7e896366ce1ed686fbff0e",
|
||||
"0x51ab00b1a8fcf0856e161aa9afe49d630cc405f846ecff1ac604a3f18e2adc59",
|
||||
"0x907ff3029db39b3274b13a7ade536ff307b411cd2d8574e1cbc2450f0d97948f",
|
||||
"0xfaf081e4a8657d6b9aaafe5e8449f93119753e3a2bee8ec914d5d45b0bc63fdc",
|
||||
"0x4e9196fc994c061cf6ca332318289832bec70870b3b2399f83315c6b1f0fc596",
|
||||
"0x3876c795d7121d23c44cb6b09d5b47d1e96e81195bc28aed5a65dfb7ac80b54e",
|
||||
"0xf9427872e1391266e2748709a1e1185d59b74fae03bb0add46a394b5c2e8d3ce",
|
||||
"0xcb05dcdba6645949cf6d5a1846a3b5e8b91c5902c1cd711240ca7ca3d55c0b41",
|
||||
"0x11673d01797471ed8da30bc5234e04070121514a78f04c67433881137464a6f7",
|
||||
"0x6f21d364ec7385a97241f5a3e532860a56f6c9ad88711496d3601d66fc41e5bb",
|
||||
"0x36b4bd5f587b9484b5ded4c192284ae09c4a05b525e1d5a4e6f188f6eb692ba4",
|
||||
"0x5fea9ad3b3bd2354df433283c93f9dfccd61d9f23d936e18f61f3013e2240cc5",
|
||||
"0xf323bdfab14ba35ead24db6cf6117e75d3eb17fff2ddca5ac92b11ebe141eab0",
|
||||
"0x73b6df5c2ccdc931ed02d9c95dd1a45d83c0109616438c01d93a939f06131807",
|
||||
"0xea51a68d1fa6343c33766c9722a25f0a52c28f1aa379b86abf35337ff8e05082",
|
||||
"0x5806bd72fc3b69309a89b173dc5a5c53d5d7131a6341b4749e9b27fea49daf77",
|
||||
"0x12a27e73c82d8b62efb535d499b511a7b1eba0cf9106ce627ac02a2df1b324e4",
|
||||
"0xe3baf5d23abd7c41a6b2217acc44b59d79c49c317de0c8bfce0fa765bbf2c7c8",
|
||||
"0x27f2e9356ff36960d7cc3c7972fee23db8719fcf8c5a3a49e367157ce7f0f7a5",
|
||||
"0x4d413622aefc81f7b12a42c54d62ccf9530e07807c481bfd49489f2fe155cc11",
|
||||
"0x6293be7c4a9638dae865150ffb0aeb7231261259b06f9179709375747eeeacb3",
|
||||
"0x5b87e664d0f5fe3d0bc9816cdf6f4c34656f3cd0ceb949056cc5d5888411630a",
|
||||
"0x691cc2b883926563d1eb43f8baa87b3147bffeb42c1f3051ac19f5d6aafd770b",
|
||||
"0x76d1524cf0d398ca188dd0fa52bfcac712fabe1eabc48b2032f4622c16914b62",
|
||||
"0xc794045fcecae96f2f26a876040940275081096a97be46d23adfd9a6c9bc8471",
|
||||
"0x47db54ce7c1e4cbc946e90bbf36790d281bead9e1f31efd2fae20800bc937676",
|
||||
"0x6015bb2f15fb79c7db93c3509356560108243756d8a0dac936bf5b422befa406",
|
||||
"0x248ad57193ad10e2359cf738c2470a088247c3cb08047e3591a5d0f1a00d4e1e",
|
||||
"0x31759224caded607fdfc5fff71f4f015a622a4297f8cb352b08ba192f13d2a0d",
|
||||
"0x6191b10b5003c376676fae4f3d0882bafca82ffa68f964b1224b939f293fabb8",
|
||||
"0x399d577202adb755b053a14a99fed75acb94d9d42bac05443935a1dec4b49b36",
|
||||
"0xa8b4c35f68eb16de41c2f9b2814b0c59e5ad2c1878a0ad765bb40c9ffd955d53",
|
||||
"0xb068bf6127b065a0322d8a4e68163b1618c8859255e9b02762c1956bf121ccd6",
|
||||
"0xc20f339a7e5b04e98bcc37f20caa40be1b086f241d6893da678b33f4c71abf6b",
|
||||
"0x32fb99af41ceee0f2d14a0126315cacb4e8c87020efc0396f8c1a95fc91eb002",
|
||||
"0x8d09185ef1f31ac28892c9b5f6524eaf49a95a01e437b87d0254c470756c7f6e",
|
||||
"0x94763c5a7c8526a4c10403a32cbaeb172b44bd28c47f21928732b8281e178164",
|
||||
"0x2bdcfb1e1063b3277731a81bc208069a6ba3e1338a476aa5dae3052448981015",
|
||||
"0x167e002252dc3ebf70effb6cd59d9056f06bc1a7d63ce6de2ee6be5dfd16abce",
|
||||
"0xf24523d81071a835b8021443daac0facc52443abbfb93cc229aa0ef694b1220a",
|
||||
"0xb2706e36fdb553b1b4798aa2de253c3d56716e2492ceea7870bebb6b9da78ec5",
|
||||
"0x2c31b0ab3eeb9a01fe41aa1c7f3d80106102195b8cccf46563fe599d50042206",
|
||||
"0x18ac1ad46a168ed8f9db24972d6528a7fd151ef623635b127cd28f0b176d4f53",
|
||||
"0xb6636e582b9c015adf6447696d98e51e6c4451001876574255388b4584f14dc8",
|
||||
"0x94a6ebeeef1f469b3345fcf1df0e1fdea1950c1ed3d77301a15f125f561ee475",
|
||||
"0x7a8628293059242cebb47f7a37f5eb8e148df6dc2914d4c221acaa7d09413958",
|
||||
"0x55480789e46ea619dc678679ce89ea0a2e6ef1b28cd8ba836512ef6b97683c5e",
|
||||
"0x474473af44f4fd88684caf3c469c08ee9ea2f856699ce1c4f2ba806eb1ed6b2b",
|
||||
"0xacaefdefc15bab527ebbd3c554eb3a175dd7394ef2a72a51f3d6b6eb6e0503af",
|
||||
"0xa292c102d89018fff055bd8c3b0b94ceb9629ec16632fda7dddd58b3fe9cecd1",
|
||||
"0x4d4b84eb5d9b09e5c6ed5c84ee7f1d72bb90c69398989ddab3183f922e7318f5",
|
||||
"0xf32d4b43d465e6aaf8e01428e14bc65880bffc53c608d44739cc2a975680ee4f",
|
||||
"0x73f2fc260c01ed945eef6d0732100a7f313cde42bc67a7d06bbd6e7847dd76c1",
|
||||
"0x5f019b5ce4381c5313affa4f51c7f5e6a10d759251d6936b1550ed293e45c876",
|
||||
"0x5ae38b9dd331e074dd55434b5451a012b21a49c51ba1f8786639c864ba056b23",
|
||||
"0x9681d253cf87ee2e9bfc4ce2116346e19a13f3c7a8cd24c3ce72fd0bf600c964",
|
||||
"0x78e650563f2d2171a5d0b7612550ce27eda81ec6f99fb359f26e825dcce5a1cf",
|
||||
"0xb3762c6d6dd5a0b82ab270a8474accb6b3b5b5abe3fd7ea42b60594a2394708b"
|
||||
],
|
||||
"txDetails": {
|
||||
"0x3860498da623c650b1840b5137b1c2b689dfb2ce3bfb4b5d55c629ed8a99e81f": {
|
||||
"txid": "0x3860498da623c650b1840b5137b1c2b689dfb2ce3bfb4b5d55c629ed8a99e81f",
|
||||
"blockTime": 1768987619,
|
||||
"time": 1768987619,
|
||||
"vin": [
|
||||
{
|
||||
"addresses": [
|
||||
"0xe09ad398e1deee1f18fec1255c58d3dff57068a3"
|
||||
]
|
||||
}
|
||||
],
|
||||
"vout": [
|
||||
{
|
||||
"value": "0.0007488",
|
||||
"scriptPubKey": {
|
||||
"addresses": [
|
||||
"0x43f5d0fcd3e6ccb26fa0d1fc6e73865147d8a5f7"
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -259,6 +259,7 @@
|
||||
"evm_connectivity": true
|
||||
},
|
||||
"ethereum": {
|
||||
"rpc": ["GetBlock", "GetBlockHash", "GetTransaction", "EstimateFee", "GetBlockHeader"],
|
||||
"evm_connectivity": true
|
||||
},
|
||||
"optimism": {
|
||||
|
||||
Reference in New Issue
Block a user