AccountReader -> to_fat_rlp implementation
This commit is contained in:
parent
e5ca5e0926
commit
d9743f166f
@ -132,7 +132,6 @@ pub struct StateChunker<'a> {
|
|||||||
hashes: Vec<H256>,
|
hashes: Vec<H256>,
|
||||||
rlps: Vec<Bytes>,
|
rlps: Vec<Bytes>,
|
||||||
cur_size: usize,
|
cur_size: usize,
|
||||||
hash_db: &'a HashDB,
|
|
||||||
snapshot_path: &'a Path,
|
snapshot_path: &'a Path,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -192,14 +191,16 @@ impl<'a> StateChunker<'a> {
|
|||||||
hashes: Vec::new(),
|
hashes: Vec::new(),
|
||||||
rlps: Vec::new(),
|
rlps: Vec::new(),
|
||||||
cur_size: 0,
|
cur_size: 0,
|
||||||
hash_db: db,
|
|
||||||
snapshot_path: path,
|
snapshot_path: path,
|
||||||
};
|
};
|
||||||
|
|
||||||
for (_account_key, account_data) in account_view.iter() {
|
// account_key here is the address' hash.
|
||||||
let account = AccountReader::from_full_rlp(account_data);
|
for (account_key, account_data) in account_view.iter() {
|
||||||
|
let account = AccountReader::from_thin_rlp(account_data);
|
||||||
|
|
||||||
try!(account.walk(&mut chunker));
|
let fat_rlp = try!(account.to_fat_rlp(db));
|
||||||
|
|
||||||
|
chunker.push(account_key, fat_rlp);
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(chunker.hashes)
|
Ok(chunker.hashes)
|
||||||
@ -217,7 +218,7 @@ struct AccountReader {
|
|||||||
|
|
||||||
impl AccountReader {
|
impl AccountReader {
|
||||||
// deserialize the account from rlp.
|
// deserialize the account from rlp.
|
||||||
fn from_full_rlp(rlp: &[u8]) -> Self {
|
fn from_thin_rlp(rlp: &[u8]) -> Self {
|
||||||
let r: Rlp = Rlp::new(rlp);
|
let r: Rlp = Rlp::new(rlp);
|
||||||
|
|
||||||
AccountReader {
|
AccountReader {
|
||||||
@ -228,15 +229,33 @@ impl AccountReader {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// walk the account's storage trie, pushing all key, value pairs.
|
// walk the account's storage trie, returning an RLP item containing the
|
||||||
fn walk(&self, chunker: &mut StateChunker) -> Result<(), Error> {
|
// account properties and the storage.
|
||||||
let db = try!(TrieDB::new(chunker.hash_db, &self.storage_root));
|
fn to_fat_rlp(&self, hash_db: &HashDB) -> Result<Bytes, Error> {
|
||||||
|
let db = try!(TrieDB::new(hash_db, &self.storage_root));
|
||||||
|
|
||||||
|
let mut pairs = Vec::new();
|
||||||
|
|
||||||
for (k, v) in db.iter() {
|
for (k, v) in db.iter() {
|
||||||
chunker.push(k, v.to_owned());
|
pairs.push((k, v));
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
let mut stream = RlpStream::new_list(pairs.len());
|
||||||
|
|
||||||
|
for (k, v) in pairs {
|
||||||
|
stream.begin_list(2).append(&k).append(&v);
|
||||||
|
}
|
||||||
|
|
||||||
|
let pairs_rlp = stream.out();
|
||||||
|
|
||||||
|
let mut account_stream = RlpStream::new_list(5);
|
||||||
|
account_stream.append(&self.nonce)
|
||||||
|
.append(&self.balance)
|
||||||
|
.append(&self.storage_root)
|
||||||
|
.append(&self.code_hash)
|
||||||
|
.append(&pairs_rlp);
|
||||||
|
|
||||||
|
Ok(account_stream.out())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user