pub trait Anchor:
Debug
+ Clone
+ Eq
+ PartialOrd
+ Ord
+ Hash {
// Required method
fn anchor_block(&self) -> BlockId;
// Provided method
fn confirmation_height_upper_bound(&self) -> u32 { ... }
}
Expand description
Trait that “anchors” blockchain data to a specific block of height and hash.
If transaction A is anchored in block B, and block B is in the best chain, we can assume that transaction A is also confirmed in the best chain. This does not necessarily mean that transaction A is confirmed in block B. It could also mean transaction A is confirmed in a parent block of B.
Every Anchor
implementation must contain a BlockId
parameter, and must implement
Ord
. When implementing Ord
, the anchors’ BlockId
s should take precedence
over other elements inside the Anchor
s for comparison purposes, i.e., you should first
compare the anchors’ BlockId
s and then care about the rest.
The example shows different types of anchors:
// Initialize the local chain with two blocks.
let chain = LocalChain::from_blocks(
[
(1, Hash::hash("first".as_bytes())),
(2, Hash::hash("second".as_bytes())),
]
.into_iter()
.collect(),
);
// Transaction to be inserted into `TxGraph`s with different anchor types.
let tx = tx_from_hex(RAW_TX_1);
// Insert `tx` into a `TxGraph` that uses `BlockId` as the anchor type.
// When a transaction is anchored with `BlockId`, the anchor block and the confirmation block of
// the transaction is the same block.
let mut graph_a = TxGraph::<BlockId>::default();
let _ = graph_a.insert_tx(tx.clone());
graph_a.insert_anchor(
tx.compute_txid(),
BlockId {
height: 1,
hash: Hash::hash("first".as_bytes()),
},
);
// Insert `tx` into a `TxGraph` that uses `ConfirmationBlockTime` as the anchor type.
// This anchor records the anchor block and the confirmation time of the transaction. When a
// transaction is anchored with `ConfirmationBlockTime`, the anchor block and confirmation block
// of the transaction is the same block.
let mut graph_c = TxGraph::<ConfirmationBlockTime>::default();
let _ = graph_c.insert_tx(tx.clone());
graph_c.insert_anchor(
tx.compute_txid(),
ConfirmationBlockTime {
block_id: BlockId {
height: 2,
hash: Hash::hash("third".as_bytes()),
},
confirmation_time: 123,
},
);
Required Methods§
Sourcefn anchor_block(&self) -> BlockId
fn anchor_block(&self) -> BlockId
Returns the BlockId
that the associated blockchain data is “anchored” in.
Provided Methods§
Sourcefn confirmation_height_upper_bound(&self) -> u32
fn confirmation_height_upper_bound(&self) -> u32
Get the upper bound of the chain data’s confirmation height.
The default definition gives a pessimistic answer. This can be overridden by the Anchor
implementation for a more accurate value.
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.