Merge bitcoindevkit/bdk#1334: Reorder fields in ConfirmationHeightAnchor fields so Ord DWIM
adc95137ac2e52f4d45c4ec778703001c95a362f fix(chain)! Re-order fields in anchors so Ord DWIM (LLFourn)
Pull request description:
  Something that is confirmed more recently should be greater than something that is confirmed earlier regardless of anchor.
ACKs for top commit:
  evanlinjin:
    ACK adc95137ac2e52f4d45c4ec778703001c95a362f
Tree-SHA512: 9a588b64afc7e20b35a9abb8c25b8b82858c0f89886320c0fc91f6c61592fccfa7fbaa3020a393b1d5fd79f71302a388255b69cb3726a38a0f2fdab8bb93769c
			
			
This commit is contained in:
		
						commit
						728e26f223
					
				| @ -9,7 +9,7 @@ use crate::{Anchor, AnchorFromBlockPosition, COINBASE_MATURITY}; | ||||
| pub enum ChainPosition<A> { | ||||
|     /// The chain data is seen as confirmed, and in anchored by `A`.
 | ||||
|     Confirmed(A), | ||||
|     /// The chain data is seen in mempool at this given timestamp.
 | ||||
|     /// The chain data is not confirmed and last seen in the mempool at this timestamp.
 | ||||
|     Unconfirmed(u64), | ||||
| } | ||||
| 
 | ||||
| @ -48,14 +48,14 @@ impl<A: Anchor> ChainPosition<A> { | ||||
|     serde(crate = "serde_crate") | ||||
| )] | ||||
| pub enum ConfirmationTime { | ||||
|     /// The confirmed variant.
 | ||||
|     /// The transaction is confirmed
 | ||||
|     Confirmed { | ||||
|         /// Confirmation height.
 | ||||
|         height: u32, | ||||
|         /// Confirmation time in unix seconds.
 | ||||
|         time: u64, | ||||
|     }, | ||||
|     /// The unconfirmed variant.
 | ||||
|     /// The transaction is unconfirmed
 | ||||
|     Unconfirmed { | ||||
|         /// The last-seen timestamp in unix seconds.
 | ||||
|         last_seen: u64, | ||||
| @ -157,13 +157,12 @@ impl From<(&u32, &BlockHash)> for BlockId { | ||||
|     serde(crate = "serde_crate") | ||||
| )] | ||||
| pub struct ConfirmationHeightAnchor { | ||||
|     /// The anchor block.
 | ||||
|     pub anchor_block: BlockId, | ||||
| 
 | ||||
|     /// The exact confirmation height of the transaction.
 | ||||
|     ///
 | ||||
|     /// It is assumed that this value is never larger than the height of the anchor block.
 | ||||
|     pub confirmation_height: u32, | ||||
|     /// The anchor block.
 | ||||
|     pub anchor_block: BlockId, | ||||
| } | ||||
| 
 | ||||
| impl Anchor for ConfirmationHeightAnchor { | ||||
| @ -198,12 +197,12 @@ impl AnchorFromBlockPosition for ConfirmationHeightAnchor { | ||||
|     serde(crate = "serde_crate") | ||||
| )] | ||||
| pub struct ConfirmationTimeHeightAnchor { | ||||
|     /// The confirmation height of the transaction being anchored.
 | ||||
|     pub confirmation_height: u32, | ||||
|     /// The confirmation time of the transaction being anchored.
 | ||||
|     pub confirmation_time: u64, | ||||
|     /// The anchor block.
 | ||||
|     pub anchor_block: BlockId, | ||||
|     /// The confirmation height of the chain data being anchored.
 | ||||
|     pub confirmation_height: u32, | ||||
|     /// The confirmation time of the chain data being anchored.
 | ||||
|     pub confirmation_time: u64, | ||||
| } | ||||
| 
 | ||||
| impl Anchor for ConfirmationTimeHeightAnchor { | ||||
| @ -229,12 +228,12 @@ impl AnchorFromBlockPosition for ConfirmationTimeHeightAnchor { | ||||
| /// A `TxOut` with as much data as we can retrieve about it
 | ||||
| #[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)] | ||||
| pub struct FullTxOut<A> { | ||||
|     /// The position of the transaction in `outpoint` in the overall chain.
 | ||||
|     pub chain_position: ChainPosition<A>, | ||||
|     /// The location of the `TxOut`.
 | ||||
|     pub outpoint: OutPoint, | ||||
|     /// The `TxOut`.
 | ||||
|     pub txout: TxOut, | ||||
|     /// The position of the transaction in `outpoint` in the overall chain.
 | ||||
|     pub chain_position: ChainPosition<A>, | ||||
|     /// The txid and chain position of the transaction (if any) that has spent this output.
 | ||||
|     pub spent_by: Option<(ChainPosition<A>, Txid)>, | ||||
|     /// Whether this output is on a coinbase transaction.
 | ||||
| @ -299,3 +298,35 @@ impl<A: Anchor> FullTxOut<A> { | ||||
|         true | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| #[cfg(test)] | ||||
| mod test { | ||||
|     use super::*; | ||||
| 
 | ||||
|     #[test] | ||||
|     fn chain_position_ord() { | ||||
|         let unconf1 = ChainPosition::<ConfirmationHeightAnchor>::Unconfirmed(10); | ||||
|         let unconf2 = ChainPosition::<ConfirmationHeightAnchor>::Unconfirmed(20); | ||||
|         let conf1 = ChainPosition::Confirmed(ConfirmationHeightAnchor { | ||||
|             confirmation_height: 9, | ||||
|             anchor_block: BlockId { | ||||
|                 height: 20, | ||||
|                 ..Default::default() | ||||
|             }, | ||||
|         }); | ||||
|         let conf2 = ChainPosition::Confirmed(ConfirmationHeightAnchor { | ||||
|             confirmation_height: 12, | ||||
|             anchor_block: BlockId { | ||||
|                 height: 15, | ||||
|                 ..Default::default() | ||||
|             }, | ||||
|         }); | ||||
| 
 | ||||
|         assert!(unconf2 > unconf1, "higher last_seen means higher ord"); | ||||
|         assert!(unconf1 > conf1, "unconfirmed is higher ord than confirmed"); | ||||
|         assert!( | ||||
|             conf2 > conf1, | ||||
|             "confirmation_height is higher then it should be higher ord" | ||||
|         ); | ||||
|     } | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user