Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
6f322db
graph: Add support for subgraph datasource in manifest
incrypto32 Jul 11, 2024
3ad6eb2
graph: wrap TriggerFilter with TriggerFilterWrapper
incrypto32 Jul 12, 2024
e91f966
graph,chain: add build_subgraph_block_stream method
incrypto32 Jul 12, 2024
42fc00e
graph,core,chain: use TriggerFilterWrapper in PollingBlockStream
incrypto32 Jul 15, 2024
75d0f01
graph: created TriggersAdapterWrapper
incrypto32 Jul 15, 2024
4e6ad78
graph,core,chain: Add a wrapper enum for Triggers to handle subgraph …
incrypto32 Jul 16, 2024
94a4a40
graph, chain: Build subgraph trigger filters in build_filter
incrypto32 Jul 16, 2024
fad68d7
graph,core: Add subgraph_hosts to RuntimeHostBuilder
incrypto32 Jul 17, 2024
c76872c
chain, core, graph: Add source_subgraph_stores to indexing inputs
incrypto32 Jul 18, 2024
78e2f6e
graph, chain: minor refactoring and formatting
incrypto32 Jul 18, 2024
69b5287
graph, chain: fix typo in TriggersAdapterWrapper
incrypto32 Jul 18, 2024
96713a0
chain, graph: use TriggerFilterWrapper in scan_triggers
incrypto32 Jul 18, 2024
63aaa69
tests: Add integration test for subgraph datasources
incrypto32 Jul 19, 2024
5718a4f
chain/ethereum: implement load_blocks_by_numbers for EthereumAdapter
incrypto32 Jul 24, 2024
1bcf19e
graph: refactor BlockWithTriggers impl
incrypto32 Jul 24, 2024
8c73e50
graph, core: Add a new SubgraphFilter struct
incrypto32 Jul 24, 2024
22e9ea8
chain/ethereum: Mock implementation of subgraph_triggers for ethereum
incrypto32 Jul 24, 2024
2391b79
chain,graph : use `chain_head_ptr` method from adapter
incrypto32 Jul 24, 2024
eeb96dc
tests: change entity name for integration test
incrypto32 Jul 24, 2024
0ee08d6
chain, core, graph : use TriggersAdapterWrapper at top level
incrypto32 Jul 25, 2024
90b327c
chain, graph : move subgraph trigger scanning back to TriggersAdapter…
incrypto32 Jul 25, 2024
30179bf
first attempt at reading entities for mutable ones
Jul 17, 2024
27c39ca
remove the key as a parameter
Jul 18, 2024
d52e526
fix regex
Jul 24, 2024
7ace7a0
read entities from database
Jul 25, 2024
8e2ee75
clean up
Jul 29, 2024
943e182
chain/ethereum: use RPC for load_blocks_by_numbers
incrypto32 Jul 29, 2024
ea2c456
simplify
Jul 29, 2024
2c565bf
remove mocks
Jul 30, 2024
c243951
graph: subgraph_triggers to take block_number hashset
incrypto32 Jul 31, 2024
f4cc90a
store: fix block range query bug when getting entity triggers
incrypto32 Jul 31, 2024
243fe36
graph: refactor TriggersAdapterWrapper.scan_triggers
incrypto32 Jul 31, 2024
480a4f7
store/test-store: update entities_read_range
incrypto32 Jul 31, 2024
c17e546
graph: fix manifest parsing of source subgraphs
incrypto32 Aug 1, 2024
5f88e45
graph: TriggersAdapterWrapper.chain_head_ptr to consider head of sou…
incrypto32 Aug 1, 2024
26f64de
tests: fix runner tests
incrypto32 Aug 1, 2024
19e4ef1
chain, core, graph : Refactor subgraph trigger creation
incrypto32 Aug 12, 2024
18607f3
graph: refactor TriggersAdapterWrapper.triggers_in_block to not rely …
incrypto32 Aug 12, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 23 additions & 5 deletions chain/arweave/src/chain.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,15 @@ use graph::blockchain::client::ChainClient;
use graph::blockchain::firehose_block_ingestor::FirehoseBlockIngestor;
use graph::blockchain::{
BasicBlockchainBuilder, Block, BlockIngestor, BlockchainBuilder, BlockchainKind,
EmptyNodeCapabilities, NoopDecoderHook, NoopRuntimeAdapter,
EmptyNodeCapabilities, NoopDecoderHook, NoopRuntimeAdapter, TriggerFilterWrapper,
};
use graph::cheap_clone::CheapClone;
use graph::components::adapter::ChainId;
use graph::components::store::DeploymentCursorTracker;
use graph::components::store::{DeploymentCursorTracker, WritableStore};
use graph::data::subgraph::UnifiedMappingApiVersion;
use graph::env::EnvVars;
use graph::firehose::FirehoseEndpoint;
use graph::prelude::MetricsRegistry;
use graph::prelude::{DeploymentHash, MetricsRegistry};
use graph::substreams::Clock;
use graph::{
blockchain::{
Expand All @@ -27,11 +27,13 @@ use graph::{
prelude::{async_trait, o, BlockNumber, ChainStore, Error, Logger, LoggerFactory},
};
use prost::Message;
use std::collections::{HashMap, HashSet};
use std::sync::Arc;

use crate::adapter::TriggerFilter;
use crate::data_source::{DataSourceTemplate, UnresolvedDataSourceTemplate};
use crate::trigger::{self, ArweaveTrigger};
use crate::Block as ArweaveBlock;
use crate::{
codec,
data_source::{DataSource, UnresolvedDataSource},
Expand Down Expand Up @@ -119,7 +121,8 @@ impl Blockchain for Chain {
deployment: DeploymentLocator,
store: impl DeploymentCursorTracker,
start_blocks: Vec<BlockNumber>,
filter: Arc<Self::TriggerFilter>,
_source_subgraph_stores: HashMap<DeploymentHash, Arc<dyn WritableStore>>,
filter: Arc<TriggerFilterWrapper<Self>>,
unified_api_version: UnifiedMappingApiVersion,
) -> Result<Box<dyn BlockStream<Self>>, Error> {
let adapter = self
Expand All @@ -135,7 +138,10 @@ impl Blockchain for Chain {
.subgraph_logger(&deployment)
.new(o!("component" => "FirehoseBlockStream"));

let firehose_mapper = Arc::new(FirehoseMapper { adapter, filter });
let firehose_mapper = Arc::new(FirehoseMapper {
adapter,
filter: filter.chain_filter.clone(),
});

Ok(Box::new(FirehoseBlockStream::new(
deployment.hash,
Expand Down Expand Up @@ -199,6 +205,10 @@ impl TriggersAdapterTrait<Chain> for TriggersAdapter {
panic!("Should never be called since not used by FirehoseBlockStream")
}

async fn chain_head_ptr(&self) -> Result<Option<BlockPtr>, Error> {
unimplemented!()
}

async fn triggers_in_block(
&self,
logger: &Logger,
Expand Down Expand Up @@ -258,6 +268,14 @@ impl TriggersAdapterTrait<Chain> for TriggersAdapter {
number: block.number.saturating_sub(1),
}))
}

async fn load_blocks_by_numbers(
&self,
_logger: Logger,
_block_numbers: HashSet<BlockNumber>,
) -> Result<Vec<ArweaveBlock>, Error> {
todo!()
}
}

pub struct FirehoseMapper {
Expand Down
43 changes: 33 additions & 10 deletions chain/cosmos/src/chain.rs
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
use graph::blockchain::firehose_block_ingestor::FirehoseBlockIngestor;
use graph::blockchain::{BlockIngestor, NoopDecoderHook};
use graph::blockchain::{BlockIngestor, NoopDecoderHook, TriggerFilterWrapper};
use graph::components::adapter::ChainId;
use graph::env::EnvVars;
use graph::prelude::MetricsRegistry;
use graph::prelude::{DeploymentHash, MetricsRegistry};
use graph::substreams::Clock;
use std::collections::{HashMap, HashSet};
use std::convert::TryFrom;
use std::sync::Arc;

use graph::blockchain::block_stream::{BlockStreamError, BlockStreamMapper, FirehoseCursor};
use graph::blockchain::client::ChainClient;
use graph::blockchain::{BasicBlockchainBuilder, BlockchainBuilder, NoopRuntimeAdapter};
use graph::cheap_clone::CheapClone;
use graph::components::store::DeploymentCursorTracker;
use graph::components::store::{DeploymentCursorTracker, WritableStore};
use graph::data::subgraph::UnifiedMappingApiVersion;
use graph::{
blockchain::{
Expand All @@ -33,7 +34,7 @@ use crate::data_source::{
DataSource, DataSourceTemplate, EventOrigin, UnresolvedDataSource, UnresolvedDataSourceTemplate,
};
use crate::trigger::CosmosTrigger;
use crate::{codec, TriggerFilter};
use crate::{codec, Block, TriggerFilter};

pub struct Chain {
logger_factory: LoggerFactory,
Expand Down Expand Up @@ -113,7 +114,8 @@ impl Blockchain for Chain {
deployment: DeploymentLocator,
store: impl DeploymentCursorTracker,
start_blocks: Vec<BlockNumber>,
filter: Arc<Self::TriggerFilter>,
_source_subgraph_stores: HashMap<DeploymentHash, Arc<dyn WritableStore>>,
filter: Arc<TriggerFilterWrapper<Self>>,
unified_api_version: UnifiedMappingApiVersion,
) -> Result<Box<dyn BlockStream<Self>>, Error> {
let adapter = self
Expand All @@ -129,7 +131,10 @@ impl Blockchain for Chain {
.subgraph_logger(&deployment)
.new(o!("component" => "FirehoseBlockStream"));

let firehose_mapper = Arc::new(FirehoseMapper { adapter, filter });
let firehose_mapper = Arc::new(FirehoseMapper {
adapter,
filter: filter.chain_filter.clone(),
});

Ok(Box::new(FirehoseBlockStream::new(
deployment.hash,
Expand Down Expand Up @@ -193,6 +198,18 @@ impl TriggersAdapterTrait<Chain> for TriggersAdapter {
panic!("Should never be called since not used by FirehoseBlockStream")
}

async fn load_blocks_by_numbers(
&self,
_logger: Logger,
_block_numbers: HashSet<BlockNumber>,
) -> Result<Vec<Block>, Error> {
unimplemented!()
}

async fn chain_head_ptr(&self) -> Result<Option<BlockPtr>, Error> {
unimplemented!()
}

async fn scan_triggers(
&self,
_from: BlockNumber,
Expand Down Expand Up @@ -467,9 +484,12 @@ impl FirehoseMapperTrait<Chain> for FirehoseMapper {

#[cfg(test)]
mod test {
use graph::prelude::{
slog::{o, Discard, Logger},
tokio,
use graph::{
blockchain::Trigger,
prelude::{
slog::{o, Discard, Logger},
tokio,
},
};

use super::*;
Expand Down Expand Up @@ -600,7 +620,10 @@ mod test {
// they may not be in the same order
for trigger in expected_triggers {
assert!(
triggers.trigger_data.contains(&trigger),
triggers.trigger_data.iter().any(|t| match t {
Trigger::Chain(t) => t == &trigger,
_ => false,
}),
"Expected trigger list to contain {:?}, but it only contains: {:?}",
trigger,
triggers.trigger_data
Expand Down
7 changes: 7 additions & 0 deletions chain/ethereum/src/adapter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1109,6 +1109,13 @@ pub trait EthereumAdapter: Send + Sync + 'static {
block_hash: H256,
) -> Box<dyn Future<Item = LightEthereumBlock, Error = Error> + Send>;

async fn load_blocks_by_numbers(
&self,
_logger: Logger,
_chain_store: Arc<dyn ChainStore>,
_block_numbers: HashSet<BlockNumber>,
) -> Box<dyn Stream<Item = Arc<LightEthereumBlock>, Error = Error> + Send>;

/// Load Ethereum blocks in bulk, returning results as they come back as a Stream.
/// May use the `chain_store` as a cache.
async fn load_blocks(
Expand Down
109 changes: 92 additions & 17 deletions chain/ethereum/src/chain.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,16 @@ use anyhow::{Context, Error};
use graph::blockchain::client::ChainClient;
use graph::blockchain::firehose_block_ingestor::{FirehoseBlockIngestor, Transforms};
use graph::blockchain::{
BlockIngestor, BlockTime, BlockchainKind, ChainIdentifier, TriggersAdapterSelector,
BlockIngestor, BlockTime, BlockchainKind, ChainIdentifier, TriggerFilterWrapper,
TriggersAdapterSelector,
};
use graph::components::adapter::ChainId;
use graph::components::store::DeploymentCursorTracker;
use graph::components::store::{DeploymentCursorTracker, WritableStore};
use graph::data::subgraph::UnifiedMappingApiVersion;
use graph::firehose::{FirehoseEndpoint, ForkStep};
use graph::futures03::compat::Future01CompatExt;
use graph::prelude::{
BlockHash, ComponentLoggerConfig, ElasticComponentLoggerConfig, EthereumBlock,
BlockHash, ComponentLoggerConfig, DeploymentHash, ElasticComponentLoggerConfig, EthereumBlock,
EthereumCallCache, LightEthereumBlock, LightEthereumBlockExt, MetricsRegistry,
};
use graph::schema::InputSchema;
Expand All @@ -36,7 +37,7 @@ use graph::{
},
};
use prost::Message;
use std::collections::HashSet;
use std::collections::{HashMap, HashSet};
use std::iter::FromIterator;
use std::sync::Arc;
use std::time::Duration;
Expand All @@ -61,6 +62,7 @@ use crate::{BufferedCallCache, NodeCapabilities};
use crate::{EthereumAdapter, RuntimeAdapter};
use graph::blockchain::block_stream::{
BlockStream, BlockStreamBuilder, BlockStreamError, BlockStreamMapper, FirehoseCursor,
TriggersAdapterWrapper,
};

/// Celo Mainnet: 42220, Testnet Alfajores: 44787, Testnet Baklava: 62320
Expand Down Expand Up @@ -121,24 +123,50 @@ impl BlockStreamBuilder<Chain> for EthereumStreamBuilder {
unimplemented!()
}

async fn build_subgraph_block_stream(
&self,
chain: &Chain,
deployment: DeploymentLocator,
start_blocks: Vec<BlockNumber>,
source_subgraph_stores: HashMap<DeploymentHash, Arc<dyn WritableStore>>,
subgraph_current_block: Option<BlockPtr>,
filter: Arc<TriggerFilterWrapper<Chain>>,
unified_api_version: UnifiedMappingApiVersion,
) -> Result<Box<dyn BlockStream<Chain>>> {
self.build_polling(
chain,
deployment,
start_blocks,
source_subgraph_stores,
subgraph_current_block,
filter,
unified_api_version,
)
.await
}

async fn build_polling(
&self,
chain: &Chain,
deployment: DeploymentLocator,
start_blocks: Vec<BlockNumber>,
source_subgraph_stores: HashMap<DeploymentHash, Arc<dyn WritableStore>>,
subgraph_current_block: Option<BlockPtr>,
filter: Arc<<Chain as Blockchain>::TriggerFilter>,
filter: Arc<TriggerFilterWrapper<Chain>>,
unified_api_version: UnifiedMappingApiVersion,
) -> Result<Box<dyn BlockStream<Chain>>> {
let requirements = filter.node_capabilities();
let adapter = chain
.triggers_adapter(&deployment, &requirements, unified_api_version.clone())
.unwrap_or_else(|_| {
panic!(
"no adapter for network {} with capabilities {}",
chain.name, requirements
)
});
let requirements = filter.chain_filter.node_capabilities();
let adapter = TriggersAdapterWrapper::new(
chain
.triggers_adapter(&deployment, &requirements, unified_api_version.clone())
.unwrap_or_else(|_| {
panic!(
"no adapter for network {} with capabilities {}",
chain.name, requirements
)
}),
source_subgraph_stores,
);

let logger = chain
.logger_factory
Expand Down Expand Up @@ -172,7 +200,7 @@ impl BlockStreamBuilder<Chain> for EthereumStreamBuilder {
Ok(Box::new(PollingBlockStream::new(
chain_store,
chain_head_update_stream,
adapter,
Arc::new(adapter),
chain.node_id.clone(),
deployment.hash,
filter,
Expand Down Expand Up @@ -409,17 +437,35 @@ impl Blockchain for Chain {
deployment: DeploymentLocator,
store: impl DeploymentCursorTracker,
start_blocks: Vec<BlockNumber>,
filter: Arc<Self::TriggerFilter>,
source_subgraph_stores: HashMap<DeploymentHash, Arc<dyn WritableStore>>,
filter: Arc<TriggerFilterWrapper<Self>>,
unified_api_version: UnifiedMappingApiVersion,
) -> Result<Box<dyn BlockStream<Self>>, Error> {
let current_ptr = store.block_ptr();

if !filter.subgraph_filter.is_empty() {
return self
.block_stream_builder
.build_subgraph_block_stream(
self,
deployment,
start_blocks,
source_subgraph_stores,
current_ptr,
filter,
unified_api_version,
)
.await;
}

match self.chain_client().as_ref() {
ChainClient::Rpc(_) => {
self.block_stream_builder
.build_polling(
self,
deployment,
start_blocks,
source_subgraph_stores,
current_ptr,
filter,
unified_api_version,
Expand All @@ -434,7 +480,7 @@ impl Blockchain for Chain {
store.firehose_cursor(),
start_blocks,
current_ptr,
filter,
filter.chain_filter.clone(),
unified_api_version,
)
.await
Expand Down Expand Up @@ -689,6 +735,35 @@ impl TriggersAdapterTrait<Chain> for TriggersAdapter {
.await
}

async fn load_blocks_by_numbers(
&self,
logger: Logger,
block_numbers: HashSet<BlockNumber>,
) -> Result<Vec<BlockFinality>> {
use graph::futures01::stream::Stream;

let adapter = self
.chain_client
.rpc()?
.cheapest_with(&self.capabilities)
.await?;

let blocks = adapter
.load_blocks_by_numbers(logger, self.chain_store.clone(), block_numbers)
.await
.map(|block| BlockFinality::Final(block))
.collect()
.compat()
.await?;

Ok(blocks)
}

async fn chain_head_ptr(&self) -> Result<Option<BlockPtr>, Error> {
let chain_store = self.chain_store.clone();
chain_store.chain_head_ptr().await
}

async fn triggers_in_block(
&self,
logger: &Logger,
Expand Down
Loading