Define BLOCK_PROCESSING_TIME, LATENCY_TIME in ms

Updates Tributary values to allow 999ms for block processing (from 2s) and
1667ms for latency (up from 1s).

The intent is to resolve #365. I don't know if this will, but it increases the
chances of success and these values should be fine in prod since Tributary is a
post-execution chain (making block procesisng time minimal).

Does embed the dagger of N::block_time() panicking if the block time in ms
doesn't cleanly divide by 1000.
This commit is contained in:
Luke Parker 2023-08-30 22:56:59 -04:00
parent 493a222421
commit 2f57a69cb6
No known key found for this signature in database
4 changed files with 19 additions and 11 deletions

View file

@ -281,11 +281,12 @@ impl<D: Db, T: TransactionTrait, P: P2p> Network for TendermintNetwork<D, T, P>
type Weights = Arc<Validators>;
type Block = TendermintBlock;
// These are in seconds and create a six-second block time.
// These are in milliseconds and create a six-second block time.
// The block time is the latency on message delivery (where a message is some piece of data
// embedded in a transaction), hence why it should be kept low.
const BLOCK_PROCESSING_TIME: u32 = 3;
const LATENCY_TIME: u32 = 1;
// embedded in a transaction) times three plus the block processing time, hence why it should be
// kept low.
const BLOCK_PROCESSING_TIME: u32 = 999;
const LATENCY_TIME: u32 = 1667;
fn signer(&self) -> Arc<Signer> {
self.signer.clone()

View file

@ -221,16 +221,23 @@ pub trait Network: Sized + Send + Sync {
/// Type used for ordered blocks of information.
type Block: Block;
/// Maximum block processing time in seconds.
/// Maximum block processing time in milliseconds.
///
/// This should include both the time to download the block and the actual processing time.
///
/// BLOCK_PROCESSING_TIME + (3 * LATENCY_TIME) must be divisible by 1000.
const BLOCK_PROCESSING_TIME: u32;
/// Network latency time in seconds.
/// Network latency time in milliseconds.
///
/// BLOCK_PROCESSING_TIME + (3 * LATENCY_TIME) must be divisible by 1000.
const LATENCY_TIME: u32;
/// The block time is defined as the processing time plus three times the latency.
/// The block time, in seconds. Defined as the processing time plus three times the latency.
fn block_time() -> u32 {
Self::BLOCK_PROCESSING_TIME + (3 * Self::LATENCY_TIME)
let raw = Self::BLOCK_PROCESSING_TIME + (3 * Self::LATENCY_TIME);
let res = raw / 1000;
assert_eq!(res * 1000, raw);
res
}
/// Return a handle on the signer in use, usable for the entire lifetime of the machine.

View file

@ -35,7 +35,7 @@ impl<N: Network> RoundData<N> {
fn timeout(&self, step: Step) -> CanonicalInstant {
let adjusted_block = N::BLOCK_PROCESSING_TIME * (self.number.0 + 1);
let adjusted_latency = N::LATENCY_TIME * (self.number.0 + 1);
let offset = Duration::from_secs(
let offset = Duration::from_millis(
(match step {
Step::Propose => adjusted_block + adjusted_latency,
Step::Prevote => adjusted_block + (2 * adjusted_latency),

View file

@ -116,8 +116,8 @@ impl Network for TestNetwork {
type Weights = TestWeights;
type Block = TestBlock;
const BLOCK_PROCESSING_TIME: u32 = 2;
const LATENCY_TIME: u32 = 1;
const BLOCK_PROCESSING_TIME: u32 = 2000;
const LATENCY_TIME: u32 = 1000;
fn signer(&self) -> TestSigner {
TestSigner(self.0)