diff options
author | Bryan Newbold <bnewbold@robocracy.org> | 2018-07-31 22:45:14 -0700 |
---|---|---|
committer | Bryan Newbold <bnewbold@robocracy.org> | 2018-07-31 22:46:27 -0700 |
commit | 7662f08f2ec0f0179d42a8f79bc5eeed70fd2dd8 (patch) | |
tree | eec47c826555a822d67afc90be9c8393d0162917 /src/sleep_register.rs | |
parent | 7164f10355fcdc45d3be58bfcee2939937e01623 (diff) | |
download | geniza-7662f08f2ec0f0179d42a8f79bc5eeed70fd2dd8.tar.gz geniza-7662f08f2ec0f0179d42a8f79bc5eeed70fd2dd8.zip |
commit old WIPold-wip
Diffstat (limited to 'src/sleep_register.rs')
-rw-r--r-- | src/sleep_register.rs | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/src/sleep_register.rs b/src/sleep_register.rs index e0ea5a4..dc3c2a8 100644 --- a/src/sleep_register.rs +++ b/src/sleep_register.rs @@ -14,6 +14,7 @@ use rand::{OsRng, Rng}; use errors::*; use sleep_file::*; use make_discovery_key; +use network_msgs::Data; /// Abstract access to Hypercore register pub trait HyperRegister { @@ -33,6 +34,9 @@ pub trait HyperRegister { /// index written to. fn append(&mut self, data: &[u8]) -> Result<u64>; + /// Inserts an entry (eg, as received from the network) + fn insert(&mut self, msg: &Data) -> Result<()>; + /// Count of data entries for this register. This is the total count (highest entry index plus /// one); this particular store might be sparse. fn len(&self) -> Result<u64>; @@ -463,6 +467,68 @@ impl HyperRegister for SleepDirRegister { Ok(index) } +/* + * For a given feed block at a rev, + */ + + fn get_data_msg(&self, rev: u64) -> Result<Data> { + if not self.has(rev) { + bail!("Don't have requested data block: {}", rev); + } + + let data = self.get_data_entry(rev)?; + let root_sig = self.sign_sleep.get(rev)?; + + let nodes = vec![]; + for node_index in tree_root_nodes(rev) { + let node = Node::new(); + node.set_index(node_index); + node.set_hash(); + node.set_size(); + nodes.push(node); + } + + let msg = Data::new(); + msg.set_index(rev); + msg.set_value(&data); + msg.set_nodes(nodes); + msg.set_signature(root_sig); + Ok(msg) + } + + fn insert(&mut self, msg: &Data) -> Result<()> { + // index, value, nodes, signature + // "uncles" are included + let index = msg.get_index()?; + let data = msg.get_value()?; + let root_sig = msg.get_signature()?; + assert!(index % 2 == 0); + + // 1. Get hash of the data chunk + let leaf_hash = HyperRegister::hash_leaf(data); + + // 2. Insert tree chunks + for node in msg.get_nodes() { + let node_index = node.get_index(); + let node_hash = node.get_hash(); + let node_size = node.get_size(); + } + + // 3. Verify signature + let root_hash = HyperRegister::hash_roots(self, index)?; + ed25519::verify(&root_hash, &self.secret_key.clone().unwrap(), &root_sig); + + // 4. Insert signature + self.sign_sleep.insert(index, &root_sig)?; + + // 5. Insert bytes into data file + if let Some(ref mut df) = self.data_file { + df.seek(SeekFrom::Start(offset))?; + df.write_all(data)?; + df.sync_data()?; + } + } + fn len(&self) -> Result<u64> { // Length in entry count. let tree_len = self.tree_sleep.len()?; |