Leverage sync state to accept txhashset (#1251)

Fixes #1246
This commit is contained in:
Ignotus Peverell
2018-07-12 17:06:52 +01:00
committed by GitHub
parent bacadfb5ab
commit bdfd5405c0
6 changed files with 26 additions and 2 deletions
+4
View File
@@ -428,6 +428,10 @@ impl ChainAdapter for TrackingAdapter {
self.adapter.txhashset_read(h)
}
fn txhashset_receive_ready(&self) -> bool {
self.adapter.txhashset_receive_ready()
}
fn txhashset_write(
&self,
h: Hash,
+4
View File
@@ -611,6 +611,10 @@ impl ChainAdapter for Peers {
self.adapter.txhashset_read(h)
}
fn txhashset_receive_ready(&self) -> bool {
self.adapter.txhashset_receive_ready()
}
fn txhashset_write(
&self,
h: Hash,
+3
View File
@@ -233,6 +233,9 @@ impl MessageHandler for Protocol {
sm_arch.hash,
sm_arch.height,
);
if !self.adapter.txhashset_receive_ready() {
return Err(Error::BadMessage);
}
let mut tmp = env::temp_dir();
tmp.push("txhashset.zip");
+4
View File
@@ -250,6 +250,10 @@ impl ChainAdapter for DummyAdapter {
unimplemented!()
}
fn txhashset_receive_ready(&self) -> bool {
false
}
fn txhashset_write(
&self,
_h: Hash,
+6
View File
@@ -256,6 +256,12 @@ pub trait ChainAdapter: Sync + Send {
/// at the provided block hash.
fn txhashset_read(&self, h: Hash) -> Option<TxHashSetRead>;
/// Whether the node is ready to accept a new txhashset. If this isn't the
/// case, the archive is provided without being requested and likely an
/// attack attempt. This should be checked *before* downloading the whole
/// state data.
fn txhashset_receive_ready(&self) -> bool;
/// Writes a reading view on a txhashset state that's been provided to us.
/// If we're willing to accept that new state, the data stream will be
/// read as a zip file, unzipped and the resulting state files should be
+5 -2
View File
@@ -24,7 +24,7 @@ use std::thread;
use std::time::Instant;
use chain::{self, ChainAdapter, Options, Tip};
use common::types::{ChainValidationMode, ServerConfig, SyncState};
use common::types::{ChainValidationMode, ServerConfig, SyncState, SyncStatus};
use core::core;
use core::core::block::BlockHeader;
use core::core::hash::{Hash, Hashed};
@@ -320,6 +320,10 @@ impl p2p::ChainAdapter for NetToChainAdapter {
}
}
fn txhashset_receive_ready(&self) -> bool {
self.sync_state.status() == SyncStatus::TxHashsetDownload
}
/// Writes a reading view on a txhashset state that's been provided to us.
/// If we're willing to accept that new state, the data stream will be
/// read as a zip file, unzipped and the resulting state files should be
@@ -330,7 +334,6 @@ impl p2p::ChainAdapter for NetToChainAdapter {
txhashset_data: File,
_peer_addr: SocketAddr,
) -> bool {
// TODO check whether we should accept any txhashset now
if let Err(e) =
w(&self.chain).txhashset_write(h, txhashset_data, self.sync_state.as_ref())
{