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
16 changes: 9 additions & 7 deletions packages/consensus/src/types/transaction.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -96,10 +96,12 @@ pub struct OutPoint {
/// Used to validate coinbase tx spending (not sooner than 100 blocks) and relative timelocks
/// (it has been more than X block since the transaction containing this output was mined).
pub block_height: u32,
/// The time of the block that contains this output (meta field).
/// Used to validate relative timelocks (it has been more than X seconds since the transaction
/// containing this output was mined).
pub block_time: u32,
/// The median time past of the block that contains this output (meta field).
/// This is the median timestamp of the previous 11 blocks.
/// Used to validate relative timelocks based on time (BIP 68 and BIP 112).
/// It ensures that the transaction containing this output has been mined for more than X
/// seconds.
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 +182,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 +230,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