trying to integrate Discovery
This commit is contained in:
parent
e73aa9bc05
commit
12cb00496d
|
@ -2,6 +2,7 @@ use std::sync::Arc;
|
||||||
|
|
||||||
use config::networks::Network;
|
use config::networks::Network;
|
||||||
use consensus::errors::ConsensusError;
|
use consensus::errors::ConsensusError;
|
||||||
|
use consensus::rpc::ConsensusNetworkInterface;
|
||||||
use ethers::prelude::{Address, U256};
|
use ethers::prelude::{Address, U256};
|
||||||
use ethers::types::{Filter, Log, SyncingStatus, Transaction, TransactionReceipt, H256};
|
use ethers::types::{Filter, Log, SyncingStatus, Transaction, TransactionReceipt, H256};
|
||||||
use eyre::{eyre, Result};
|
use eyre::{eyre, Result};
|
||||||
|
@ -107,7 +108,7 @@ impl ClientBuilder {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn build<DB: Database>(self) -> Result<Client<DB>> {
|
pub fn build<DB: Database, N: ConsensusNetworkInterface>(self) -> Result<Client<DB, N>> {
|
||||||
let base_config = if let Some(network) = self.network {
|
let base_config = if let Some(network) = self.network {
|
||||||
network.to_base_config()
|
network.to_base_config()
|
||||||
} else {
|
} else {
|
||||||
|
@ -211,16 +212,16 @@ impl ClientBuilder {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Client<DB: Database> {
|
pub struct Client<DB: Database, N: ConsensusNetworkInterface> {
|
||||||
node: Arc<RwLock<Node>>,
|
node: Arc<RwLock<Node<N>>>,
|
||||||
#[cfg(not(target_arch = "wasm32"))]
|
#[cfg(not(target_arch = "wasm32"))]
|
||||||
rpc: Option<Rpc>,
|
rpc: Option<Rpc<N>>,
|
||||||
db: DB,
|
db: DB,
|
||||||
fallback: Option<String>,
|
fallback: Option<String>,
|
||||||
load_external_fallback: bool,
|
load_external_fallback: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<DB: Database> Client<DB> {
|
impl<DB: Database, N: ConsensusNetworkInterface> Client<DB, N> {
|
||||||
fn new(mut config: Config) -> Result<Self> {
|
fn new(mut config: Config) -> Result<Self> {
|
||||||
let db = DB::new(&config)?;
|
let db = DB::new(&config)?;
|
||||||
if config.checkpoint.is_none() {
|
if config.checkpoint.is_none() {
|
||||||
|
@ -229,7 +230,7 @@ impl<DB: Database> Client<DB> {
|
||||||
}
|
}
|
||||||
|
|
||||||
let config = Arc::new(config);
|
let config = Arc::new(config);
|
||||||
let node = Node::new(config.clone())?;
|
let node = Node::<N>::new(config.clone())?;
|
||||||
let node = Arc::new(RwLock::new(node));
|
let node = Arc::new(RwLock::new(node));
|
||||||
|
|
||||||
#[cfg(not(target_arch = "wasm32"))]
|
#[cfg(not(target_arch = "wasm32"))]
|
||||||
|
|
|
@ -12,7 +12,7 @@ use common::errors::BlockNotFoundError;
|
||||||
use common::types::BlockTag;
|
use common::types::BlockTag;
|
||||||
use config::Config;
|
use config::Config;
|
||||||
|
|
||||||
use consensus::rpc::nimbus_rpc::NimbusRpc;
|
use consensus::rpc::ConsensusNetworkInterface;
|
||||||
use consensus::types::{ExecutionPayload, Header};
|
use consensus::types::{ExecutionPayload, Header};
|
||||||
use consensus::ConsensusClient;
|
use consensus::ConsensusClient;
|
||||||
use execution::evm::Evm;
|
use execution::evm::Evm;
|
||||||
|
@ -22,8 +22,8 @@ use execution::ExecutionClient;
|
||||||
|
|
||||||
use crate::errors::NodeError;
|
use crate::errors::NodeError;
|
||||||
|
|
||||||
pub struct Node {
|
pub struct Node<N: ConsensusNetworkInterface> {
|
||||||
pub consensus: ConsensusClient<NimbusRpc>,
|
pub consensus: ConsensusClient<N>,
|
||||||
pub execution: Arc<ExecutionClient<HttpRpc>>,
|
pub execution: Arc<ExecutionClient<HttpRpc>>,
|
||||||
pub config: Arc<Config>,
|
pub config: Arc<Config>,
|
||||||
payloads: BTreeMap<u64, ExecutionPayload>,
|
payloads: BTreeMap<u64, ExecutionPayload>,
|
||||||
|
@ -32,7 +32,7 @@ pub struct Node {
|
||||||
pub history_size: usize,
|
pub history_size: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Node {
|
impl<N: ConsensusNetworkInterface> Node<N> {
|
||||||
pub fn new(config: Arc<Config>) -> Result<Self, NodeError> {
|
pub fn new(config: Arc<Config>) -> Result<Self, NodeError> {
|
||||||
let consensus_rpc = &config.consensus_rpc;
|
let consensus_rpc = &config.consensus_rpc;
|
||||||
let checkpoint_hash = &config.checkpoint.as_ref().unwrap();
|
let checkpoint_hash = &config.checkpoint.as_ref().unwrap();
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
use consensus::rpc::ConsensusNetworkInterface;
|
||||||
use ethers::{
|
use ethers::{
|
||||||
abi::AbiEncode,
|
abi::AbiEncode,
|
||||||
types::{Address, Filter, Log, SyncingStatus, Transaction, TransactionReceipt, H256, U256},
|
types::{Address, Filter, Log, SyncingStatus, Transaction, TransactionReceipt, H256, U256},
|
||||||
|
@ -21,14 +22,14 @@ use common::{
|
||||||
};
|
};
|
||||||
use execution::types::{CallOpts, ExecutionBlock};
|
use execution::types::{CallOpts, ExecutionBlock};
|
||||||
|
|
||||||
pub struct Rpc {
|
pub struct Rpc<N: ConsensusNetworkInterface> {
|
||||||
node: Arc<RwLock<Node>>,
|
node: Arc<RwLock<Node<N>>>,
|
||||||
handle: Option<HttpServerHandle>,
|
handle: Option<HttpServerHandle>,
|
||||||
port: u16,
|
port: u16,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Rpc {
|
impl<N: ConsensusNetworkInterface> Rpc<N> {
|
||||||
pub fn new(node: Arc<RwLock<Node>>, port: u16) -> Self {
|
pub fn new(node: Arc<RwLock<Node<N>>>, port: u16) -> Self {
|
||||||
Rpc {
|
Rpc {
|
||||||
node,
|
node,
|
||||||
handle: None,
|
handle: None,
|
||||||
|
@ -124,14 +125,22 @@ trait NetRpc {
|
||||||
async fn version(&self) -> Result<String, Error>;
|
async fn version(&self) -> Result<String, Error>;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone)]
|
struct RpcInner<N: ConsensusNetworkInterface> {
|
||||||
struct RpcInner {
|
node: Arc<RwLock<Node<N>>>,
|
||||||
node: Arc<RwLock<Node>>,
|
|
||||||
port: u16,
|
port: u16,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<N: ConsensusNetworkInterface> std::clone::Clone for RpcInner<N> {
|
||||||
|
fn clone(&self) -> Self {
|
||||||
|
RpcInner {
|
||||||
|
node: self.node.clone(),
|
||||||
|
port: self.port,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
impl EthRpcServer for RpcInner {
|
impl<N: ConsensusNetworkInterface> EthRpcServer for RpcInner<N> {
|
||||||
async fn get_balance(&self, address: &str, block: BlockTag) -> Result<String, Error> {
|
async fn get_balance(&self, address: &str, block: BlockTag) -> Result<String, Error> {
|
||||||
let address = convert_err(Address::from_str(address))?;
|
let address = convert_err(Address::from_str(address))?;
|
||||||
let node = self.node.read().await;
|
let node = self.node.read().await;
|
||||||
|
@ -305,14 +314,14 @@ impl EthRpcServer for RpcInner {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
impl NetRpcServer for RpcInner {
|
impl<N: ConsensusNetworkInterface> NetRpcServer for RpcInner<N> {
|
||||||
async fn version(&self) -> Result<String, Error> {
|
async fn version(&self) -> Result<String, Error> {
|
||||||
let node = self.node.read().await;
|
let node = self.node.read().await;
|
||||||
Ok(node.chain_id().to_string())
|
Ok(node.chain_id().to_string())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn start(rpc: RpcInner) -> Result<(HttpServerHandle, SocketAddr)> {
|
async fn start<N: ConsensusNetworkInterface>(rpc: RpcInner<N>) -> Result<(HttpServerHandle, SocketAddr)> {
|
||||||
let addr = format!("127.0.0.1:{}", rpc.port);
|
let addr = format!("127.0.0.1:{}", rpc.port);
|
||||||
let server = HttpServerBuilder::default().build(addr).await?;
|
let server = HttpServerBuilder::default().build(addr).await?;
|
||||||
|
|
||||||
|
|
|
@ -35,8 +35,8 @@ use wasm_timer::UNIX_EPOCH;
|
||||||
// does not implement force updates
|
// does not implement force updates
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct ConsensusClient<R: ConsensusNetworkInterface> {
|
pub struct ConsensusClient<N: ConsensusNetworkInterface> {
|
||||||
network_interface: R,
|
network_interface: N,
|
||||||
store: LightClientStore,
|
store: LightClientStore,
|
||||||
initial_checkpoint: Vec<u8>,
|
initial_checkpoint: Vec<u8>,
|
||||||
pub last_checkpoint: Option<Vec<u8>>,
|
pub last_checkpoint: Option<Vec<u8>>,
|
||||||
|
@ -53,13 +53,13 @@ struct LightClientStore {
|
||||||
current_max_active_participants: u64,
|
current_max_active_participants: u64,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<R: ConsensusNetworkInterface> ConsensusClient<R> {
|
impl<N: ConsensusNetworkInterface> ConsensusClient<N> {
|
||||||
pub fn new(
|
pub fn new(
|
||||||
rpc: &str,
|
rpc: &str,
|
||||||
checkpoint_block_root: &[u8],
|
checkpoint_block_root: &[u8],
|
||||||
config: Arc<Config>,
|
config: Arc<Config>,
|
||||||
) -> Result<ConsensusClient<R>> {
|
) -> Result<ConsensusClient<N>> {
|
||||||
let network_interface = R::new(rpc);
|
let network_interface = N::new(rpc);
|
||||||
|
|
||||||
Ok(ConsensusClient {
|
Ok(ConsensusClient {
|
||||||
network_interface,
|
network_interface,
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
mod discovery;
|
mod discovery;
|
||||||
mod config;
|
mod config;
|
||||||
|
mod p2p_network_interface;
|
||||||
|
|
||||||
pub use discovery::*;
|
pub use discovery::*;
|
||||||
pub use ::config::*;
|
pub use ::config::*;
|
||||||
|
pub use p2p_network_interface::*;
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
use eyre::Result;
|
||||||
|
use crate::types::{BeaconBlock, Bootstrap, FinalityUpdate, OptimisticUpdate, Update};
|
||||||
|
use async_trait::async_trait;
|
||||||
|
use libp2p::swarm::NetworkBehaviour;
|
||||||
|
|
||||||
|
use crate::p2p::discovery::Discovery;
|
||||||
|
use crate::rpc::ConsensusNetworkInterface;
|
||||||
|
|
||||||
|
pub struct P2pNetworkInterface {
|
||||||
|
discovery: Discovery,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg_attr(not(target_arch = "wasm32"), async_trait)]
|
||||||
|
#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
|
||||||
|
impl ConsensusNetworkInterface for P2pNetworkInterface {
|
||||||
|
fn new(_path: &str) -> Self {
|
||||||
|
P2pNetworkInterface {}
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn get_bootstrap(&self, _block_root: &'_ [u8]) -> Result<Bootstrap> {
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn get_updates(&self, _period: u64, _count: u8) -> Result<Vec<Update>> {
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn get_finality_update(&self) -> Result<FinalityUpdate> {
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn get_optimistic_update(&self) -> Result<OptimisticUpdate> {
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn get_block(&self, _slot: u64) -> Result<BeaconBlock> {
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn chain_id(&self) -> Result<u64> {
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(NetworkBehaviour)]
|
||||||
|
pub struct Behaviour {
|
||||||
|
discovery: Discovery,
|
||||||
|
}
|
|
@ -4,6 +4,7 @@ use super::ConsensusNetworkInterface;
|
||||||
use crate::types::{BeaconBlock, Bootstrap, FinalityUpdate, OptimisticUpdate, Update};
|
use crate::types::{BeaconBlock, Bootstrap, FinalityUpdate, OptimisticUpdate, Update};
|
||||||
use async_trait::async_trait;
|
use async_trait::async_trait;
|
||||||
use eyre::Result;
|
use eyre::Result;
|
||||||
|
|
||||||
pub struct MockRpc {
|
pub struct MockRpc {
|
||||||
testdata: PathBuf,
|
testdata: PathBuf,
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ pub mod nimbus_rpc;
|
||||||
|
|
||||||
use async_trait::async_trait;
|
use async_trait::async_trait;
|
||||||
use eyre::Result;
|
use eyre::Result;
|
||||||
|
use std::marker::{Sync, Send};
|
||||||
|
|
||||||
use crate::types::{BeaconBlock, Bootstrap, FinalityUpdate, OptimisticUpdate, Update};
|
use crate::types::{BeaconBlock, Bootstrap, FinalityUpdate, OptimisticUpdate, Update};
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ use helios::{config::networks::Network, prelude::*};
|
||||||
async fn main() -> Result<()> {
|
async fn main() -> Result<()> {
|
||||||
env_logger::Builder::from_env(Env::default().default_filter_or("info")).init();
|
env_logger::Builder::from_env(Env::default().default_filter_or("info")).init();
|
||||||
|
|
||||||
let untrusted_rpc_url = "https://eth-mainnet.g.alchemy.com/v2/<YOUR_API_KEY>";
|
let untrusted_rpc_url = "https://eth-mainnet.g.alchemy.com/v2/nObEU8Wh4FIT-X_UDFpK9oVGiTHzznML";
|
||||||
log::info!("Using untrusted RPC URL [REDACTED]");
|
log::info!("Using untrusted RPC URL [REDACTED]");
|
||||||
|
|
||||||
let consensus_rpc = "https://www.lightclientdata.org";
|
let consensus_rpc = "https://www.lightclientdata.org";
|
||||||
|
|
Loading…
Reference in New Issue