Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: Use median-time-past for input sequence checks rather than block… #239

Open
wants to merge 11 commits into
base: main
Choose a base branch
from
40 changes: 20 additions & 20 deletions packages/consensus/src/codec.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,7 @@ mod tests {
data: Default::default(),
block_hash: Default::default(),
block_height: Default::default(),
block_time: Default::default(),
median_time_past: Default::default(),
is_coinbase: false,
};
let bytes = outpoint.encode();
Expand All @@ -232,7 +232,7 @@ mod tests {
data: Default::default(),
block_hash: Default::default(),
block_height: Default::default(),
block_time: Default::default(),
median_time_past: Default::default(),
is_coinbase: false,
};
let bytes = outpoint.encode();
Expand All @@ -257,7 +257,7 @@ mod tests {
data: Default::default(),
block_hash: Default::default(),
block_height: Default::default(),
block_time: Default::default(),
median_time_past: Default::default(),
is_coinbase: false,
},
witness: array![].span()
Expand Down Expand Up @@ -287,7 +287,7 @@ mod tests {
data: Default::default(),
block_hash: Default::default(),
block_height: Default::default(),
block_time: Default::default(),
median_time_past: Default::default(),
is_coinbase: false,
},
witness: array![].span()
Expand Down Expand Up @@ -320,7 +320,7 @@ mod tests {
data: Default::default(),
block_hash: Default::default(),
block_height: Default::default(),
block_time: Default::default(),
median_time_past: Default::default(),
is_coinbase: false,
},
witness: array![].span()
Expand All @@ -338,7 +338,7 @@ mod tests {
data: Default::default(),
block_hash: Default::default(),
block_height: Default::default(),
block_time: Default::default(),
median_time_past: Default::default(),
is_coinbase: false,
},
witness: array![].span()
Expand All @@ -356,7 +356,7 @@ mod tests {
data: Default::default(),
block_hash: Default::default(),
block_height: Default::default(),
block_time: Default::default(),
median_time_past: Default::default(),
is_coinbase: false,
},
witness: array![].span()
Expand Down Expand Up @@ -418,7 +418,7 @@ mod tests {
"000000000000000931112ca80c5badf6047373b1bb53587fc23344871734bbff"
),
block_height: 149994_u32,
block_time: 1319114701_u32,
median_time_past: 1319114701_u32,
is_coinbase: true,
},
},
Expand All @@ -444,7 +444,7 @@ mod tests {
"0000000000000779e6cfb6bdd06458b8e8adffea65c719edb3450d8b05f9cc57"
),
block_height: 150006_u32,
block_time: 1319124571_u32,
median_time_past: 1319124571_u32,
is_coinbase: true,
},
},
Expand All @@ -470,7 +470,7 @@ mod tests {
"0000000000000a43df068d144a5854b92d5a866d1c25f324f80077b86acb74e1"
),
block_height: 150005_u32,
block_time: 1319122014_u32,
median_time_past: 1319122014_u32,
is_coinbase: true,
},
},
Expand All @@ -496,7 +496,7 @@ mod tests {
"000000000000010d9f3d69f259027feaa1fe8637a01300db0536b33fc552351d"
),
block_height: 149935_u32,
block_time: 1319066844_u32,
median_time_past: 1319066844_u32,
is_coinbase: true,
},
},
Expand All @@ -522,7 +522,7 @@ mod tests {
"00000000000001283f1ade495834dab6b796ba8d94f8db0e5625b2eaf3bd1490"
),
block_height: 149940_u32,
block_time: 1319069371_u32,
median_time_past: 1319069371_u32,
is_coinbase: true,
},
},
Expand All @@ -548,7 +548,7 @@ mod tests {
"00000000000009b7da59908141bc7e4716497200cb2d7bdaa5c93d0c9c642eb1"
),
block_height: 149895_u32,
block_time: 1319035283_u32,
median_time_past: 1319035283_u32,
is_coinbase: true,
},
},
Expand All @@ -574,7 +574,7 @@ mod tests {
"00000000000006c23e77cedfd97ea2d6434371236e0a373d22e77e2a4a8a52b5"
),
block_height: 149814_u32,
block_time: 1318990721_u32,
median_time_past: 1318990721_u32,
is_coinbase: true,
},
},
Expand All @@ -600,7 +600,7 @@ mod tests {
"0000000000000b4ece814065c9a591382cc90447efdd302ec5d618ffaa04e023"
),
block_height: 149984_u32,
block_time: 1319104909_u32,
median_time_past: 1319104909_u32,
is_coinbase: true,
},
},
Expand Down Expand Up @@ -662,7 +662,7 @@ mod tests {
"00000000000002db188274c80ae6a97f67a7d5f355815cca6d30a48e0bb01153"
),
block_height: 206120_u32,
block_time: 1351856022_u32,
median_time_past: 1351856022_u32,
is_coinbase: true,
},
},
Expand Down Expand Up @@ -761,7 +761,7 @@ mod tests {
data: Default::default(),
block_hash: Default::default(),
block_height: Default::default(),
block_time: Default::default(),
median_time_past: Default::default(),
is_coinbase: false,
},
witness: array![
Expand Down Expand Up @@ -827,7 +827,7 @@ mod tests {
data: Default::default(),
block_hash: Default::default(),
block_height: Default::default(),
block_time: Default::default(),
median_time_past: Default::default(),
is_coinbase: false,
},
witness: array![
Expand All @@ -851,7 +851,7 @@ mod tests {
data: Default::default(),
block_hash: Default::default(),
block_height: Default::default(),
block_time: Default::default(),
median_time_past: Default::default(),
is_coinbase: false,
},
witness: array![
Expand Down Expand Up @@ -915,7 +915,7 @@ mod tests {
data: Default::default(),
block_hash: Default::default(),
block_height: Default::default(),
block_time: Default::default(),
median_time_past: Default::default(),
is_coinbase: false,
},
witness: array![
Expand Down
7 changes: 5 additions & 2 deletions packages/consensus/src/types/chain_state.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
use core::fmt::{Display, Formatter, Error};
use crate::validation::{
difficulty::{validate_bits, adjust_difficulty}, coinbase::validate_coinbase,
timestamp::{validate_timestamp, next_prev_timestamps},
timestamp::{validate_timestamp, next_prev_timestamps, compute_median_time_past},
work::{validate_proof_of_work, compute_total_work},
block::{compute_and_validate_tx_data, validate_bip30_block_hash},
};
Expand All @@ -34,6 +34,7 @@ pub struct ChainState {
/// it's possible that one block could have an earlier timestamp
/// than a block that came before it in the chain.
pub prev_timestamps: Span<u32>,
/// Median Time Past (MTP) of the current block
}

/// Represents the initial state after genesis block.
Expand Down Expand Up @@ -62,9 +63,11 @@ pub impl BlockValidatorImpl of BlockValidator {
) -> Result<ChainState, ByteArray> {
let block_height = self.block_height + 1;

validate_timestamp(self.prev_timestamps, block.header.time)?;
let prev_block_time = *self.prev_timestamps[self.prev_timestamps.len() - 1];
let prev_timestamps = next_prev_timestamps(self.prev_timestamps, block.header.time);
let median_time_past = compute_median_time_past(prev_timestamps);

validate_timestamp(median_time_past, block.header.time)?;

let txid_root = match block.data {
TransactionData::MerkleRoot(root) => root,
Expand Down
8 changes: 4 additions & 4 deletions packages/consensus/src/types/transaction.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ pub struct OutPoint {
/// The time of the block that contains this output (meta field).
m-kus marked this conversation as resolved.
Show resolved Hide resolved
/// Used to validate relative timelocks (it has been more than X seconds since the transaction
/// containing this output was mined).
pub block_time: u32,
pub median_time_past: u32,
// Determine if the outpoint is a coinbase transaction
// Has 100 or more block confirmation,
// is added when block are queried
Expand Down Expand Up @@ -180,15 +180,15 @@ impl OutPointDisplay of Display<OutPoint> {
data: {},
block_hash: {},
block_height: {},
block_time: {},
median_time_past: {},
is_coinbase: {},
}}",
*self.txid,
*self.vout,
*self.data,
*self.block_hash,
*self.block_height,
*self.block_time,
*self.median_time_past,
*self.is_coinbase
);
f.buffer.append(@str);
Expand Down Expand Up @@ -228,7 +228,7 @@ mod tests {
block_hash: 0x00000000d1145790a8694403d4063f323d499e655c83426834d4ce2f8dd4a2ee_u256
.into(),
block_height: 9,
block_time: 1650000000,
median_time_past: 1650000000,
is_coinbase: false,
};
assert_eq!(
Expand Down
2 changes: 1 addition & 1 deletion packages/consensus/src/types/utreexo.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -340,7 +340,7 @@ mod tests {
cached: false
},
block_height: 9,
block_time: 1231473279,
median_time_past: 1231473279,
block_hash: hex_to_hash_rev(
"000000008d9dc510f23c2657fc4f67bea30078cc05a90eb89e84cc475c080805"
),
Expand Down
2 changes: 1 addition & 1 deletion packages/consensus/src/types/utxo_set.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ mod tests {
},
block_hash: Default::default(),
block_height: Default::default(),
block_time: Default::default(),
median_time_past: Default::default(),
is_coinbase: false,
}
}
Expand Down
6 changes: 3 additions & 3 deletions packages/consensus/src/validation/block.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ pub fn compute_and_validate_tx_data(
txs: Span<Transaction>,
block_hash: Digest,
block_height: u32,
block_time: u32,
median_time_past: u32,
ref utxo_set: UtxoSet
) -> Result<(u64, Digest, Digest), ByteArray> {
let mut txids: Array<Digest> = array![];
Expand Down Expand Up @@ -82,7 +82,7 @@ pub fn compute_and_validate_tx_data(
data: *output,
block_hash,
block_height,
block_time,
median_time_past,
is_coinbase: true,
};
inner_result = utxo_set.add(outpoint);
Expand All @@ -95,7 +95,7 @@ pub fn compute_and_validate_tx_data(
} else {
let fee =
match validate_transaction(
tx, block_hash, block_height, block_time, txid, ref utxo_set
tx, block_hash, block_height, median_time_past, txid, ref utxo_set
) {
Result::Ok(fee) => fee,
Result::Err(err) => {
Expand Down
17 changes: 8 additions & 9 deletions packages/consensus/src/validation/coinbase.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,7 @@ mod tests {
data: TxOut { value: 0_64, ..Default::default(), },
block_hash: Default::default(),
block_height: Default::default(),
block_time: Default::default(),
median_time_past: Default::default(),
is_coinbase: false,
},
witness: array![].span(),
Expand All @@ -266,7 +266,7 @@ mod tests {
data: TxOut { value: 0_64, ..Default::default(), },
block_hash: Default::default(),
block_height: Default::default(),
block_time: Default::default(),
median_time_past: Default::default(),
is_coinbase: false,
},
witness: array![].span(),
Expand Down Expand Up @@ -296,7 +296,7 @@ mod tests {
data: TxOut { value: 0_64, ..Default::default(), },
block_hash: Default::default(),
block_height: Default::default(),
block_time: Default::default(),
median_time_past: Default::default(),
is_coinbase: false,
},
witness: array![].span(),
Expand All @@ -315,7 +315,7 @@ mod tests {
data: TxOut { value: 0_64, ..Default::default(), },
block_hash: Default::default(),
block_height: Default::default(),
block_time: Default::default(),
median_time_past: Default::default(),
is_coinbase: false,
},
witness: array![].span(),
Expand All @@ -338,7 +338,7 @@ mod tests {
data: TxOut { value: 0_64, ..Default::default(), },
block_hash: Default::default(),
block_height: Default::default(),
block_time: Default::default(),
median_time_past: Default::default(),
is_coinbase: false,
},
witness: array![].span(),
Expand Down Expand Up @@ -375,7 +375,7 @@ mod tests {
data: TxOut { value: 0_64, ..Default::default(), },
block_hash: Default::default(),
block_height: Default::default(),
block_time: Default::default(),
median_time_past: Default::default(),
is_coinbase: false,
},
witness: array![
Expand Down Expand Up @@ -413,7 +413,7 @@ mod tests {
data: Default::default(),
block_hash: Default::default(),
block_height: Default::default(),
block_time: Default::default(),
median_time_past: Default::default(),
is_coinbase: false,
},
witness: array![].span(),
Expand Down Expand Up @@ -619,7 +619,7 @@ mod tests {
data: Default::default(),
block_hash: Default::default(),
block_height: Default::default(),
block_time: Default::default(),
median_time_past: Default::default(),
is_coinbase: false,
},
witness: array![
Expand Down Expand Up @@ -691,4 +691,3 @@ mod tests {
assert_eq!(result, false);
}
}

Loading
Loading