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 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
//! Types needed for passing information with with peers.
//! hypercore-protocol-rs uses these types and wraps them
//! into wire messages.
use crate::Node;
#[derive(Debug, Clone, PartialEq)]
/// Request of a DataBlock or DataHash from peer
pub struct RequestBlock {
/// Hypercore index
pub index: u64,
/// TODO: document
pub nodes: u64,
}
#[derive(Debug, Clone, PartialEq)]
/// Request of a DataSeek from peer
pub struct RequestSeek {
/// TODO: document
pub bytes: u64,
}
#[derive(Debug, Clone, PartialEq)]
/// Request of a DataUpgrade from peer
pub struct RequestUpgrade {
/// Hypercore start index
pub start: u64,
/// Length of elements
pub length: u64,
}
#[derive(Debug, Clone, PartialEq)]
/// Proof generated from corresponding requests
pub struct Proof {
/// Fork
pub fork: u64,
/// Data block.
pub block: Option<DataBlock>,
/// Data hash
pub hash: Option<DataHash>,
/// Data seek
pub seek: Option<DataSeek>,
/// Data updrade
pub upgrade: Option<DataUpgrade>,
}
#[derive(Debug, Clone, PartialEq)]
/// Valueless proof generated from corresponding requests
pub(crate) struct ValuelessProof {
pub(crate) fork: u64,
/// Data block. NB: The ValuelessProof struct uses the Hash type because
/// the stored binary value is processed externally to the proof.
pub(crate) block: Option<DataHash>,
pub(crate) hash: Option<DataHash>,
pub(crate) seek: Option<DataSeek>,
pub(crate) upgrade: Option<DataUpgrade>,
}
impl ValuelessProof {
pub(crate) fn into_proof(mut self, block_value: Option<Vec<u8>>) -> Proof {
let block = self.block.take().map(|block| DataBlock {
index: block.index,
nodes: block.nodes,
value: block_value.expect("Data block needs to be given"),
});
Proof {
fork: self.fork,
block,
hash: self.hash.take(),
seek: self.seek.take(),
upgrade: self.upgrade.take(),
}
}
}
#[derive(Debug, Clone, PartialEq)]
/// Block of data to peer
pub struct DataBlock {
/// Hypercore index
pub index: u64,
/// Data block value in bytes
pub value: Vec<u8>,
/// TODO: document
pub nodes: Vec<Node>,
}
#[derive(Debug, Clone, PartialEq)]
/// Data hash to peer
pub struct DataHash {
/// Hypercore index
pub index: u64,
/// TODO: document
pub nodes: Vec<Node>,
}
#[derive(Debug, Clone, PartialEq)]
/// TODO: Document
pub struct DataSeek {
/// TODO: Document
pub bytes: u64,
/// TODO: Document
pub nodes: Vec<Node>,
}
#[derive(Debug, Clone, PartialEq)]
/// TODO: Document
pub struct DataUpgrade {
/// TODO: Document
pub start: u64,
/// TODO: Document
pub length: u64,
/// TODO: Document
pub nodes: Vec<Node>,
/// TODO: Document
pub additional_nodes: Vec<Node>,
/// TODO: Document
pub signature: Vec<u8>,
}