mirror of
https://github.com/sigp/lighthouse.git
synced 2026-03-15 10:52:43 +00:00
## Issue Addressed resolves #2129 resolves #2099 addresses some of #1712 unblocks #2076 unblocks #2153 ## Proposed Changes - Updates all the dependencies mentioned in #2129, except for web3. They haven't merged their tokio 1.0 update because they are waiting on some dependencies of their own. Since we only use web3 in tests, I think updating it in a separate issue is fine. If they are able to merge soon though, I can update in this PR. - Updates `tokio_util` to 0.6.2 and `bytes` to 1.0.1. - We haven't made a discv5 release since merging tokio 1.0 updates so I'm using a commit rather than release atm. **Edit:** I think we should merge an update of `tokio_util` to 0.6.2 into discv5 before this release because it has panic fixes in `DelayQueue` --> PR in discv5: https://github.com/sigp/discv5/pull/58 ## Additional Info tokio 1.0 changes that required some changes in lighthouse: - `interval.next().await.is_some()` -> `interval.tick().await` - `sleep` future is now `!Unpin` -> https://github.com/tokio-rs/tokio/issues/3028 - `try_recv` has been temporarily removed from `mpsc` -> https://github.com/tokio-rs/tokio/issues/3350 - stream features have moved to `tokio-stream` and `broadcast::Receiver::into_stream()` has been temporarily removed -> `https://github.com/tokio-rs/tokio/issues/2870 - I've copied over the `BroadcastStream` wrapper from this PR, but can update to use `tokio-stream` once it's merged https://github.com/tokio-rs/tokio/pull/3384 Co-authored-by: realbigsean <seananderson33@gmail.com>
78 lines
2.5 KiB
Rust
78 lines
2.5 KiB
Rust
use eth2_libp2p::Enr;
|
|
use std::sync::Arc;
|
|
use store::{DBColumn, Error as StoreError, HotColdDB, ItemStore, StoreItem};
|
|
use types::{EthSpec, Hash256};
|
|
|
|
/// 32-byte key for accessing the `DhtEnrs`. All zero because `DhtEnrs` has its own column.
|
|
pub const DHT_DB_KEY: Hash256 = Hash256::zero();
|
|
|
|
pub fn load_dht<E: EthSpec, Hot: ItemStore<E>, Cold: ItemStore<E>>(
|
|
store: Arc<HotColdDB<E, Hot, Cold>>,
|
|
) -> Vec<Enr> {
|
|
// Load DHT from store
|
|
match store.get_item(&DHT_DB_KEY) {
|
|
Ok(Some(p)) => {
|
|
let p: PersistedDht = p;
|
|
p.enrs
|
|
}
|
|
_ => Vec::new(),
|
|
}
|
|
}
|
|
|
|
/// Attempt to persist the ENR's in the DHT to `self.store`.
|
|
pub fn persist_dht<E: EthSpec, Hot: ItemStore<E>, Cold: ItemStore<E>>(
|
|
store: Arc<HotColdDB<E, Hot, Cold>>,
|
|
enrs: Vec<Enr>,
|
|
) -> Result<(), store::Error> {
|
|
store.put_item(&DHT_DB_KEY, &PersistedDht { enrs })
|
|
}
|
|
|
|
/// Wrapper around DHT for persistence to disk.
|
|
pub struct PersistedDht {
|
|
pub enrs: Vec<Enr>,
|
|
}
|
|
|
|
impl StoreItem for PersistedDht {
|
|
fn db_column() -> DBColumn {
|
|
DBColumn::DhtEnrs
|
|
}
|
|
|
|
fn as_store_bytes(&self) -> Vec<u8> {
|
|
rlp::encode_list(&self.enrs).to_vec()
|
|
}
|
|
|
|
fn from_store_bytes(bytes: &[u8]) -> Result<Self, StoreError> {
|
|
let rlp = rlp::Rlp::new(bytes);
|
|
let enrs: Vec<Enr> = rlp
|
|
.as_list()
|
|
.map_err(|e| StoreError::RlpError(format!("{}", e)))?;
|
|
Ok(PersistedDht { enrs })
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
use eth2_libp2p::Enr;
|
|
use sloggers::{null::NullLoggerBuilder, Build};
|
|
use std::str::FromStr;
|
|
use store::config::StoreConfig;
|
|
use store::{HotColdDB, MemoryStore};
|
|
use types::{ChainSpec, MinimalEthSpec};
|
|
#[test]
|
|
fn test_persisted_dht() {
|
|
let log = NullLoggerBuilder.build().unwrap();
|
|
let store: HotColdDB<
|
|
MinimalEthSpec,
|
|
MemoryStore<MinimalEthSpec>,
|
|
MemoryStore<MinimalEthSpec>,
|
|
> = HotColdDB::open_ephemeral(StoreConfig::default(), ChainSpec::minimal(), log).unwrap();
|
|
let enrs = vec![Enr::from_str("enr:-IS4QHCYrYZbAKWCBRlAy5zzaDZXJBGkcnh4MHcBFZntXNFrdvJjX04jRzjzCBOonrkTfj499SZuOh8R33Ls8RRcy5wBgmlkgnY0gmlwhH8AAAGJc2VjcDI1NmsxoQPKY0yuDUmstAHYpMa2_oxVtw0RW_QAdpzBQA8yWM0xOIN1ZHCCdl8").unwrap()];
|
|
store
|
|
.put_item(&DHT_DB_KEY, &PersistedDht { enrs: enrs.clone() })
|
|
.unwrap();
|
|
let dht: PersistedDht = store.get_item(&DHT_DB_KEY).unwrap().unwrap();
|
|
assert_eq!(dht.enrs, enrs);
|
|
}
|
|
}
|