1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
crate::ix!();
/**
| Used to marshal pointers into hashes
| for db storage.
|
*/
pub struct DiskBlockIndex {
pub index: BlockIndex,
pub hash_prev: u256,
}
impl Default for DiskBlockIndex {
fn default() -> Self {
Self {
index: Default::default(),
hash_prev: u256::default(),
}
}
}
impl DiskBlockIndex {
lazy_static!{
/*
SERIALIZE_METHODS(CDiskBlockIndex, obj)
{
int _nVersion = s.GetVersion();
if (!(s.GetType() & SER_GETHASH)) READWRITE(VARINT_MODE(_nVersion, VarIntMode::NONNEGATIVE_SIGNED));
READWRITE(VARINT_MODE(obj.nHeight, VarIntMode::NONNEGATIVE_SIGNED));
READWRITE(VARINT(obj.nStatus));
READWRITE(VARINT(obj.nTx));
if (obj.nStatus & (BLOCK_HAVE_DATA | BLOCK_HAVE_UNDO)) READWRITE(VARINT_MODE(obj.nFile, VarIntMode::NONNEGATIVE_SIGNED));
if (obj.nStatus & BLOCK_HAVE_DATA) READWRITE(VARINT(obj.nDataPos));
if (obj.nStatus & BLOCK_HAVE_UNDO) READWRITE(VARINT(obj.nUndoPos));
// block header
READWRITE(obj.nVersion);
READWRITE(obj.hashPrev);
READWRITE(obj.hashMerkleRoot);
READWRITE(obj.nTime);
READWRITE(obj.nBits);
READWRITE(obj.nNonce);
}
*/
}
pub fn new(pindex: *const BlockIndex) -> Self {
unsafe {
let mut x: Self = std::mem::zeroed();
x.index = (*pindex).clone();
x.hash_prev = match x.index.pprev.is_some() {
true => x.index.pprev.as_ref().unwrap().get_block_hash(),
false => u256::default()
};
x
}
}
pub fn get_block_hash(&self) -> u256 {
let mut block = BlockHeader::default();
block.n_version = self.index.n_version;
block.hash_prev_block = self.hash_prev.clone();
block.hash_merkle_root = self.index.hash_merkle_root.clone();
block.n_time = self.index.n_time;
block.n_bits = self.index.n_bits;
block.n_nonce = self.index.n_nonce;
block.get_hash()
}
pub fn to_string(&self) -> String {
let mut str_: String = "CDiskBlockIndex(".to_string();
str_.push_str(&self.index.to_string());
str_.push_str(
&format!{
"\n hashBlock={}, hashPrev={})",
self.get_block_hash().to_string(),
self.hash_prev.to_string()
}
);
str_
}
}