Skip to content

Commit 4ad187b

Browse files
committed
chain, graph: Fix block ptr ext parsing bug
1 parent deaa413 commit 4ad187b

File tree

4 files changed

+69
-38
lines changed

4 files changed

+69
-38
lines changed

chain/ethereum/src/ethereum_adapter.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1707,7 +1707,7 @@ impl EthereumAdapterTrait for EthereumAdapter {
17071707
chain_store: Arc<dyn ChainStore>,
17081708
block_numbers: HashSet<BlockNumber>,
17091709
) -> Box<dyn Stream<Item = Arc<BlockPtrExt>, Error = Error> + Send> {
1710-
let blocks_map: BTreeMap<i32, Vec<json::Value>> = chain_store
1710+
let blocks_map = chain_store
17111711
.cheap_clone()
17121712
.block_ptrs_by_numbers(block_numbers.iter().map(|&b| b.into()).collect::<Vec<_>>())
17131713
.await
@@ -1721,7 +1721,7 @@ impl EthereumAdapterTrait for EthereumAdapter {
17211721
.into_iter()
17221722
.filter_map(|(_number, values)| {
17231723
if values.len() == 1 {
1724-
json::from_value(values[0].clone()).ok()
1724+
Arc::new(values[0].clone()).into()
17251725
} else {
17261726
None
17271727
}

graph/src/blockchain/types.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -482,6 +482,21 @@ impl TryFrom<(Option<H256>, Option<U64>, H256, U256)> for BlockPtrExt {
482482
})
483483
}
484484
}
485+
486+
impl TryFrom<(H256, i32, H256, U256)> for BlockPtrExt {
487+
type Error = anyhow::Error;
488+
489+
fn try_from(tuple: (H256, i32, H256, U256)) -> Result<Self, Self::Error> {
490+
let (hash, block_number, parent_hash, timestamp) = tuple;
491+
492+
Ok(BlockPtrExt {
493+
hash: hash.into(),
494+
number: block_number,
495+
parent_hash: parent_hash.into(),
496+
timestamp,
497+
})
498+
}
499+
}
485500
impl From<BlockPtrExt> for H256 {
486501
fn from(ptr: BlockPtrExt) -> Self {
487502
ptr.hash_as_h256()

graph/src/components/store/traits.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use web3::types::{Address, H256};
77

88
use super::*;
99
use crate::blockchain::block_stream::{EntityWithType, FirehoseCursor};
10-
use crate::blockchain::{BlockTime, ChainIdentifier};
10+
use crate::blockchain::{BlockPtrExt, BlockTime, ChainIdentifier};
1111
use crate::components::metrics::stopwatch::StopwatchMetrics;
1212
use crate::components::server::index_node::VersionInfo;
1313
use crate::components::subgraph::SubgraphVersionSwitchingMode;
@@ -500,7 +500,7 @@ pub trait ChainStore: Send + Sync + 'static {
500500
async fn block_ptrs_by_numbers(
501501
self: Arc<Self>,
502502
numbers: Vec<BlockNumber>,
503-
) -> Result<BTreeMap<BlockNumber, Vec<serde_json::Value>>, Error>;
503+
) -> Result<BTreeMap<BlockNumber, Vec<BlockPtrExt>>, Error>;
504504

505505
/// Get the `offset`th ancestor of `block_hash`, where offset=0 means the block matching
506506
/// `block_hash` and offset=1 means its parent. If `root` is passed, short-circuit upon finding

store/postgres/src/chain_store.rs

Lines changed: 50 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@ use std::{
2121
sync::Arc,
2222
};
2323

24-
use graph::blockchain::{Block, BlockHash, ChainIdentifier};
24+
use graph::blockchain::{Block, BlockHash, BlockPtrExt, ChainIdentifier};
2525
use graph::cheap_clone::CheapClone;
26-
use graph::prelude::web3::types::H256;
26+
use graph::prelude::web3::types::{H256, U256};
2727
use graph::prelude::{
2828
async_trait, serde_json as json, transaction_receipt::LightTransactionReceipt, BlockNumber,
2929
BlockPtr, CachedEthereumCall, CancelableError, ChainStore as ChainStoreTrait, Error,
@@ -53,6 +53,14 @@ impl JsonBlock {
5353
data,
5454
}
5555
}
56+
57+
fn timestamp(&self) -> Option<U256> {
58+
self.data
59+
.as_ref()
60+
.and_then(|data| data.get("timestamp"))
61+
.and_then(|ts| ts.as_str())
62+
.and_then(|ts| U256::from_dec_str(ts).ok())
63+
}
5664
}
5765

5866
/// Tables in the 'public' database schema that store chain-specific data
@@ -1949,6 +1957,16 @@ impl ChainStore {
19491957
}
19501958
}
19511959

1960+
fn json_block_to_block_ptr_ext(json_block: &JsonBlock) -> Result<BlockPtrExt, Error> {
1961+
let hash = json_block.ptr.hash.clone();
1962+
let number = json_block.ptr.number;
1963+
let parent_hash = json_block.parent_hash.clone();
1964+
let timestamp = json_block.timestamp().unwrap();
1965+
let ptr = BlockPtrExt::try_from((hash.as_h256(), number, parent_hash.as_h256(), timestamp))?;
1966+
1967+
Ok(ptr)
1968+
}
1969+
19521970
#[async_trait]
19531971
impl ChainStoreTrait for ChainStore {
19541972
fn genesis_block_ptr(&self) -> Result<BlockPtr, Error> {
@@ -2145,23 +2163,11 @@ impl ChainStoreTrait for ChainStore {
21452163
async fn block_ptrs_by_numbers(
21462164
self: Arc<Self>,
21472165
numbers: Vec<BlockNumber>,
2148-
) -> Result<BTreeMap<BlockNumber, Vec<json::Value>>, Error> {
2149-
if ENV_VARS.store.disable_block_cache_for_lookup {
2150-
let values = self
2151-
.blocks_from_store_by_numbers(numbers)
2152-
.await?
2153-
.into_iter()
2154-
.map(|(num, blocks)| {
2155-
(
2156-
num,
2157-
blocks
2158-
.into_iter()
2159-
.filter_map(|block| block.data)
2160-
.collect::<Vec<_>>(),
2161-
)
2162-
})
2163-
.collect();
2164-
Ok(values)
2166+
) -> Result<BTreeMap<BlockNumber, Vec<BlockPtrExt>>, Error> {
2167+
let result = if ENV_VARS.store.disable_block_cache_for_lookup {
2168+
let values = self.blocks_from_store_by_numbers(numbers).await?;
2169+
2170+
values
21652171
} else {
21662172
let cached = self.recent_blocks_cache.get_block_ptrs_by_numbers(&numbers);
21672173

@@ -2209,16 +2215,28 @@ impl ChainStoreTrait for ChainStore {
22092215
.map(|(ptr, data)| (ptr.block_number(), vec![data]))
22102216
.collect::<BTreeMap<_, _>>();
22112217

2212-
let mut result: BTreeMap<BlockNumber, Vec<json::Value>> = cached_map;
2218+
let mut result = cached_map;
22132219
for (num, blocks) in stored {
2214-
result
2215-
.entry(num)
2216-
.or_default()
2217-
.extend(blocks.into_iter().filter_map(|block| block.data));
2220+
if !result.contains_key(&num) {
2221+
result.insert(num, blocks);
2222+
}
22182223
}
22192224

2220-
Ok(result)
2221-
}
2225+
result
2226+
};
2227+
2228+
let ptrs = result
2229+
.into_iter()
2230+
.map(|(num, blocks)| {
2231+
let ptrs = blocks
2232+
.into_iter()
2233+
.filter_map(|block| json_block_to_block_ptr_ext(&block).ok())
2234+
.collect();
2235+
(num, ptrs)
2236+
})
2237+
.collect();
2238+
2239+
Ok(ptrs)
22222240
}
22232241

22242242
async fn blocks(self: Arc<Self>, hashes: Vec<BlockHash>) -> Result<Vec<json::Value>, Error> {
@@ -2520,10 +2538,8 @@ mod recent_blocks_cache {
25202538
.and_then(|block| block.data.as_ref().map(|data| (&block.ptr, data)))
25212539
}
25222540

2523-
fn get_block_by_number(&self, number: BlockNumber) -> Option<(&BlockPtr, &json::Value)> {
2524-
self.blocks
2525-
.get(&number)
2526-
.and_then(|block| block.data.as_ref().map(|data| (&block.ptr, data)))
2541+
fn get_block_by_number(&self, number: BlockNumber) -> Option<&JsonBlock> {
2542+
self.blocks.get(&number)
25272543
}
25282544

25292545
fn get_ancestor(
@@ -2651,13 +2667,13 @@ mod recent_blocks_cache {
26512667
pub fn get_block_ptrs_by_numbers(
26522668
&self,
26532669
numbers: &[BlockNumber],
2654-
) -> Vec<(BlockPtr, json::Value)> {
2670+
) -> Vec<(BlockPtr, JsonBlock)> {
26552671
let inner = self.inner.read();
2656-
let mut blocks: Vec<(BlockPtr, json::Value)> = Vec::new();
2672+
let mut blocks: Vec<(BlockPtr, JsonBlock)> = Vec::new();
26572673

26582674
for &number in numbers {
2659-
if let Some((ptr, block)) = inner.get_block_by_number(number) {
2660-
blocks.push((ptr.clone(), block.clone()));
2675+
if let Some(block) = inner.get_block_by_number(number) {
2676+
blocks.push((block.ptr.clone(), block.clone()));
26612677
}
26622678
}
26632679

0 commit comments

Comments
 (0)