Merge pull request #320 from ethcore/gavdocs
Finish all my docs. Fix previous test compilation.
This commit is contained in:
commit
9262b18e64
@ -35,6 +35,7 @@ impl Account {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// General constructor.
|
/// General constructor.
|
||||||
|
#[allow(dead_code)] // Used only in test code for now.
|
||||||
pub fn from_pod(pod: PodAccount) -> Account {
|
pub fn from_pod(pod: PodAccount) -> Account {
|
||||||
Account {
|
Account {
|
||||||
balance: pod.balance,
|
balance: pod.balance,
|
||||||
@ -110,6 +111,7 @@ impl Account {
|
|||||||
pub fn nonce(&self) -> &U256 { &self.nonce }
|
pub fn nonce(&self) -> &U256 { &self.nonce }
|
||||||
|
|
||||||
/// return the code hash associated with this account.
|
/// return the code hash associated with this account.
|
||||||
|
#[allow(dead_code)] // Used only in test code for now.
|
||||||
pub fn code_hash(&self) -> H256 {
|
pub fn code_hash(&self) -> H256 {
|
||||||
self.code_hash.clone().unwrap_or(SHA3_EMPTY)
|
self.code_hash.clone().unwrap_or(SHA3_EMPTY)
|
||||||
}
|
}
|
||||||
@ -126,6 +128,7 @@ impl Account {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Provide a byte array which hashes to the `code_hash`. returns the hash as a result.
|
/// Provide a byte array which hashes to the `code_hash`. returns the hash as a result.
|
||||||
|
#[allow(dead_code)] // Used only in test code for now.
|
||||||
pub fn note_code(&mut self, code: Bytes) -> Result<(), H256> {
|
pub fn note_code(&mut self, code: Bytes) -> Result<(), H256> {
|
||||||
let h = code.sha3();
|
let h = code.sha3();
|
||||||
match self.code_hash {
|
match self.code_hash {
|
||||||
@ -159,18 +162,14 @@ impl Account {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// return the storage root associated with this account.
|
|
||||||
pub fn base_root(&self) -> &H256 { &self.storage_root }
|
|
||||||
|
|
||||||
/// Determine whether there are any un-`commit()`-ed storage-setting operations.
|
/// Determine whether there are any un-`commit()`-ed storage-setting operations.
|
||||||
|
#[allow(dead_code)]
|
||||||
pub fn storage_is_clean(&self) -> bool { self.storage_overlay.borrow().iter().find(|&(_, &(f, _))| f == Filth::Dirty).is_none() }
|
pub fn storage_is_clean(&self) -> bool { self.storage_overlay.borrow().iter().find(|&(_, &(f, _))| f == Filth::Dirty).is_none() }
|
||||||
|
|
||||||
/// return the storage root associated with this account or None if it has been altered via the overlay.
|
/// return the storage root associated with this account or None if it has been altered via the overlay.
|
||||||
|
#[allow(dead_code)]
|
||||||
pub fn storage_root(&self) -> Option<&H256> { if self.storage_is_clean() {Some(&self.storage_root)} else {None} }
|
pub fn storage_root(&self) -> Option<&H256> { if self.storage_is_clean() {Some(&self.storage_root)} else {None} }
|
||||||
|
|
||||||
/// return the storage root associated with this account or None if it has been altered via the overlay.
|
|
||||||
pub fn recent_storage_root(&self) -> &H256 { &self.storage_root }
|
|
||||||
|
|
||||||
/// return the storage overlay.
|
/// return the storage overlay.
|
||||||
pub fn storage_overlay(&self) -> Ref<HashMap<H256, (Filth, H256)>> { self.storage_overlay.borrow() }
|
pub fn storage_overlay(&self) -> Ref<HashMap<H256, (Filth, H256)>> { self.storage_overlay.borrow() }
|
||||||
|
|
||||||
|
@ -49,8 +49,9 @@ impl AccountDiff {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Determine difference between two optionally existance `Account`s. Returns None
|
/// Determine difference between two optionally existant `Account`s. Returns None
|
||||||
/// if they are the same.
|
/// if they are the same.
|
||||||
|
#[allow(dead_code)] // Used only in test code for now.
|
||||||
pub fn diff_pod(pre: Option<&PodAccount>, post: Option<&PodAccount>) -> Option<AccountDiff> {
|
pub fn diff_pod(pre: Option<&PodAccount>, post: Option<&PodAccount>) -> Option<AccountDiff> {
|
||||||
match (pre, post) {
|
match (pre, post) {
|
||||||
(None, Some(x)) => Some(AccountDiff {
|
(None, Some(x)) => Some(AccountDiff {
|
||||||
|
@ -2,6 +2,7 @@ use common::*;
|
|||||||
use engine::Engine;
|
use engine::Engine;
|
||||||
use executive::Executive;
|
use executive::Executive;
|
||||||
use pod_account::*;
|
use pod_account::*;
|
||||||
|
#[cfg(test)]
|
||||||
use pod_state::PodState;
|
use pod_state::PodState;
|
||||||
//use state_diff::*; // TODO: uncomment once to_pod() works correctly.
|
//use state_diff::*; // TODO: uncomment once to_pod() works correctly.
|
||||||
|
|
||||||
@ -194,6 +195,7 @@ impl State {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Populate a PodAccount map from this state.
|
/// Populate a PodAccount map from this state.
|
||||||
|
#[allow(dead_code)] // Used only in test code for now.
|
||||||
pub fn to_hashmap_pod(&self) -> HashMap<Address, PodAccount> {
|
pub fn to_hashmap_pod(&self) -> HashMap<Address, PodAccount> {
|
||||||
// TODO: handle database rather than just the cache.
|
// TODO: handle database rather than just the cache.
|
||||||
self.cache.borrow().iter().fold(HashMap::new(), |mut m, (add, opt)| {
|
self.cache.borrow().iter().fold(HashMap::new(), |mut m, (add, opt)| {
|
||||||
|
@ -9,6 +9,7 @@ pub struct StateDiff (BTreeMap<Address, AccountDiff>);
|
|||||||
|
|
||||||
impl StateDiff {
|
impl StateDiff {
|
||||||
/// Calculate and return diff between `pre` state and `post` state.
|
/// Calculate and return diff between `pre` state and `post` state.
|
||||||
|
#[allow(dead_code)] // Used only in test code for now.
|
||||||
pub fn diff_pod(pre: &PodState, post: &PodState) -> StateDiff {
|
pub fn diff_pod(pre: &PodState, post: &PodState) -> StateDiff {
|
||||||
StateDiff(pre.get().keys().merge(post.get().keys()).filter_map(|acc| AccountDiff::diff_pod(pre.get().get(acc), post.get().get(acc)).map(|d|(acc.clone(), d))).collect())
|
StateDiff(pre.get().keys().merge(post.get().keys()).filter_map(|acc| AccountDiff::diff_pod(pre.get().get(acc), post.get().get(acc)).map(|d|(acc.clone(), d))).collect())
|
||||||
}
|
}
|
||||||
|
@ -230,6 +230,7 @@ impl Transaction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Do basic validation, checking for valid signature and minimum gas,
|
/// Do basic validation, checking for valid signature and minimum gas,
|
||||||
|
#[allow(dead_code)] // Used only in tests. TODO: consider use in block validation.
|
||||||
pub fn validate(self, schedule: &Schedule, require_low: bool) -> Result<Transaction, Error> {
|
pub fn validate(self, schedule: &Schedule, require_low: bool) -> Result<Transaction, Error> {
|
||||||
if require_low && !ec::is_low_s(&self.s) {
|
if require_low && !ec::is_low_s(&self.s) {
|
||||||
return Err(Error::Util(UtilError::Crypto(CryptoError::InvalidSignature)));
|
return Err(Error::Util(UtilError::Crypto(CryptoError::InvalidSignature)));
|
||||||
|
@ -6,11 +6,12 @@ use uint::*;
|
|||||||
use secp256k1::{key, Secp256k1};
|
use secp256k1::{key, Secp256k1};
|
||||||
use rand::os::OsRng;
|
use rand::os::OsRng;
|
||||||
|
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Secret key for secp256k1 EC operations. 256 bit generic "hash" data.
|
||||||
pub type Secret = H256;
|
pub type Secret = H256;
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Public key for secp256k1 EC operations. 512 bit generic "hash" data.
|
||||||
pub type Public = H512;
|
pub type Public = H512;
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Signature for secp256k1 EC operations; encodes two 256-bit curve points
|
||||||
|
/// and a third sign bit. 520 bit generic "hash" data.
|
||||||
pub type Signature = H520;
|
pub type Signature = H520;
|
||||||
|
|
||||||
lazy_static! {
|
lazy_static! {
|
||||||
|
@ -6,36 +6,36 @@ use rlp::DecoderError;
|
|||||||
use io;
|
use io;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Error in database subsystem.
|
||||||
pub enum BaseDataError {
|
pub enum BaseDataError {
|
||||||
/// TODO [Gav Wood] Please document me
|
/// An entry was removed more times than inserted.
|
||||||
NegativelyReferencedHash,
|
NegativelyReferencedHash,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
/// General error type which should be capable of representing all errors in ethcore.
|
/// General error type which should be capable of representing all errors in ethcore.
|
||||||
pub enum UtilError {
|
pub enum UtilError {
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Error concerning the crypto utility subsystem.
|
||||||
Crypto(::crypto::CryptoError),
|
Crypto(::crypto::CryptoError),
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Error concerning the Rust standard library's IO subsystem.
|
||||||
StdIo(::std::io::Error),
|
StdIo(::std::io::Error),
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Error concerning our IO utility subsystem.
|
||||||
Io(io::IoError),
|
Io(io::IoError),
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Error concerning the network address parsing subsystem.
|
||||||
AddressParse(::std::net::AddrParseError),
|
AddressParse(::std::net::AddrParseError),
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Error concerning the network address resolution subsystem.
|
||||||
AddressResolve(Option<::std::io::Error>),
|
AddressResolve(Option<::std::io::Error>),
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Error concerning the hex conversion logic.
|
||||||
FromHex(FromHexError),
|
FromHex(FromHexError),
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Error concerning the database abstraction logic.
|
||||||
BaseData(BaseDataError),
|
BaseData(BaseDataError),
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Error concerning the network subsystem.
|
||||||
Network(NetworkError),
|
Network(NetworkError),
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Error concerning the RLP decoder.
|
||||||
Decoder(DecoderError),
|
Decoder(DecoderError),
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Miscellaneous error described by a string.
|
||||||
SimpleString(String),
|
SimpleString(String),
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Error from a bad input size being given for the needed output.
|
||||||
BadSize,
|
BadSize,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,8 +9,8 @@ macro_rules! xjson {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Trait allowing conversion from a JSON value.
|
||||||
pub trait FromJson {
|
pub trait FromJson {
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Convert a JSON value to an instance of this type.
|
||||||
fn from_json(json: &Json) -> Self;
|
fn from_json(json: &Json) -> Self;
|
||||||
}
|
}
|
||||||
|
@ -15,35 +15,35 @@ use serde;
|
|||||||
///
|
///
|
||||||
/// Note: types implementing `FixedHash` must be also `BytesConvertable`.
|
/// Note: types implementing `FixedHash` must be also `BytesConvertable`.
|
||||||
pub trait FixedHash: Sized + BytesConvertable + Populatable + FromStr + Default {
|
pub trait FixedHash: Sized + BytesConvertable + Populatable + FromStr + Default {
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Create a new, zero-initialised, instance.
|
||||||
fn new() -> Self;
|
fn new() -> Self;
|
||||||
/// Synonym for `new()`. Prefer to new as it's more readable.
|
/// Synonym for `new()`. Prefer to new as it's more readable.
|
||||||
fn zero() -> Self;
|
fn zero() -> Self;
|
||||||
/// TODO [debris] Please document me
|
/// Create a new, cryptographically random, instance.
|
||||||
fn random() -> Self;
|
fn random() -> Self;
|
||||||
/// TODO [debris] Please document me
|
/// Assign self have a cryptographically random value.
|
||||||
fn randomize(&mut self);
|
fn randomize(&mut self);
|
||||||
/// TODO [arkpar] Please document me
|
/// Get the size of this object in bytes.
|
||||||
fn size() -> usize;
|
fn len() -> usize;
|
||||||
/// TODO [arkpar] Please document me
|
/// Convert a slice of bytes of length `len()` to an instance of this type.
|
||||||
fn from_slice(src: &[u8]) -> Self;
|
fn from_slice(src: &[u8]) -> Self;
|
||||||
/// TODO [arkpar] Please document me
|
/// Assign self to be of the same value as a slice of bytes of length `len()`.
|
||||||
fn clone_from_slice(&mut self, src: &[u8]) -> usize;
|
fn clone_from_slice(&mut self, src: &[u8]) -> usize;
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Copy the data of this object into some mutable slice of length `len()`.
|
||||||
fn copy_to(&self, dest: &mut [u8]);
|
fn copy_to(&self, dest: &mut [u8]);
|
||||||
/// TODO [Gav Wood] Please document me
|
/// When interpreting self as a bloom output, augment (bit-wise OR) with the a bloomed version of `b`.
|
||||||
fn shift_bloomed<'a, T>(&'a mut self, b: &T) -> &'a mut Self where T: FixedHash;
|
fn shift_bloomed<'a, T>(&'a mut self, b: &T) -> &'a mut Self where T: FixedHash;
|
||||||
/// TODO [debris] Please document me
|
/// Same as `shift_bloomed` except that `self` is consumed and a new value returned.
|
||||||
fn with_bloomed<T>(mut self, b: &T) -> Self where T: FixedHash { self.shift_bloomed(b); self }
|
fn with_bloomed<T>(mut self, b: &T) -> Self where T: FixedHash { self.shift_bloomed(b); self }
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Bloom the current value using the bloom parameter `m`.
|
||||||
fn bloom_part<T>(&self, m: usize) -> T where T: FixedHash;
|
fn bloom_part<T>(&self, m: usize) -> T where T: FixedHash;
|
||||||
/// TODO [debris] Please document me
|
/// Check to see whether this hash, interpreted as a bloom, contains the value `b` when bloomed.
|
||||||
fn contains_bloomed<T>(&self, b: &T) -> bool where T: FixedHash;
|
fn contains_bloomed<T>(&self, b: &T) -> bool where T: FixedHash;
|
||||||
/// TODO [arkpar] Please document me
|
/// Returns `true` if all bits set in `b` are also set in `self`.
|
||||||
fn contains<'a>(&'a self, b: &'a Self) -> bool;
|
fn contains<'a>(&'a self, b: &'a Self) -> bool;
|
||||||
/// TODO [debris] Please document me
|
/// Returns `true` if no bits are set.
|
||||||
fn is_zero(&self) -> bool;
|
fn is_zero(&self) -> bool;
|
||||||
/// Return the lowest 8 bytes interpreted as a BigEndian integer.
|
/// Returns the lowest 8 bytes interpreted as a BigEndian integer.
|
||||||
fn low_u64(&self) -> u64;
|
fn low_u64(&self) -> u64;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -58,7 +58,7 @@ fn clean_0x(s: &str) -> &str {
|
|||||||
macro_rules! impl_hash {
|
macro_rules! impl_hash {
|
||||||
($from: ident, $size: expr) => {
|
($from: ident, $size: expr) => {
|
||||||
#[derive(Eq)]
|
#[derive(Eq)]
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Unformatted binary data of fixed length.
|
||||||
pub struct $from (pub [u8; $size]);
|
pub struct $from (pub [u8; $size]);
|
||||||
|
|
||||||
impl BytesConvertable for $from {
|
impl BytesConvertable for $from {
|
||||||
@ -103,7 +103,7 @@ macro_rules! impl_hash {
|
|||||||
rng.fill_bytes(&mut self.0);
|
rng.fill_bytes(&mut self.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn size() -> usize {
|
fn len() -> usize {
|
||||||
$size
|
$size
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -457,12 +457,12 @@ macro_rules! impl_hash {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl $from {
|
impl $from {
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Get a hex representation.
|
||||||
pub fn hex(&self) -> String {
|
pub fn hex(&self) -> String {
|
||||||
format!("{:?}", self)
|
format!("{:?}", self)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Construct new instance equal to the bloomed value of `b`.
|
||||||
pub fn from_bloomed<T>(b: &T) -> Self where T: FixedHash { b.bloom_part($size) }
|
pub fn from_bloomed<T>(b: &T) -> Self where T: FixedHash { b.bloom_part($size) }
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -578,25 +578,27 @@ impl<'_> From<&'_ Address> for H256 {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Convert string `s` to an `H256`. Will panic if `s` is not 64 characters long or if any of
|
||||||
|
/// those characters are not 0-9, a-z or A-Z.
|
||||||
pub fn h256_from_hex(s: &str) -> H256 {
|
pub fn h256_from_hex(s: &str) -> H256 {
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
H256::from_str(s).unwrap()
|
H256::from_str(s).unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Convert `n` to an `H256`, setting the rightmost 8 bytes.
|
||||||
pub fn h256_from_u64(n: u64) -> H256 {
|
pub fn h256_from_u64(n: u64) -> H256 {
|
||||||
use uint::U256;
|
use uint::U256;
|
||||||
H256::from(&U256::from(n))
|
H256::from(&U256::from(n))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Convert string `s` to an `Address`. Will panic if `s` is not 40 characters long or if any of
|
||||||
|
/// those characters are not 0-9, a-z or A-Z.
|
||||||
pub fn address_from_hex(s: &str) -> Address {
|
pub fn address_from_hex(s: &str) -> Address {
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
Address::from_str(s).unwrap()
|
Address::from_str(s).unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Convert `n` to an `Address`, setting the rightmost 8 bytes.
|
||||||
pub fn address_from_u64(n: u64) -> Address {
|
pub fn address_from_u64(n: u64) -> Address {
|
||||||
let h256 = h256_from_u64(n);
|
let h256 = h256_from_u64(n);
|
||||||
From::from(h256)
|
From::from(h256)
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
use common::*;
|
use common::*;
|
||||||
|
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Remove the `"0x"`, if present, from the left of `s`, returning the remaining slice.
|
||||||
pub fn clean(s: &str) -> &str {
|
pub fn clean(s: &str) -> &str {
|
||||||
if s.len() >= 2 && &s[0..2] == "0x" {
|
if s.len() >= 2 && &s[0..2] == "0x" {
|
||||||
&s[2..]
|
&s[2..]
|
||||||
|
@ -107,14 +107,17 @@ impl MemoryDB {
|
|||||||
self.data.get(key)
|
self.data.get(key)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Return the internal map of hashes to data, clearing the current state.
|
||||||
pub fn drain(&mut self) -> HashMap<H256, (Bytes, i32)> {
|
pub fn drain(&mut self) -> HashMap<H256, (Bytes, i32)> {
|
||||||
let mut data = HashMap::new();
|
let mut data = HashMap::new();
|
||||||
mem::swap(&mut self.data, &mut data);
|
mem::swap(&mut self.data, &mut data);
|
||||||
data
|
data
|
||||||
}
|
}
|
||||||
|
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Denote than an existing value has the given key. Used when a key gets removed without
|
||||||
|
/// a prior insert and thus has a negative reference with no value.
|
||||||
|
///
|
||||||
|
/// May safely be called even if the key's value is known, in which case it will be a no-op.
|
||||||
pub fn denote(&self, key: &H256, value: Bytes) -> &(Bytes, i32) {
|
pub fn denote(&self, key: &H256, value: Bytes) -> &(Bytes, i32) {
|
||||||
if self.raw(key) == None {
|
if self.raw(key) == None {
|
||||||
unsafe {
|
unsafe {
|
||||||
|
@ -5,13 +5,13 @@ use common::*;
|
|||||||
#[derive(Debug,Clone,PartialEq,Eq)]
|
#[derive(Debug,Clone,PartialEq,Eq)]
|
||||||
/// Diff type for specifying a change (or not).
|
/// Diff type for specifying a change (or not).
|
||||||
pub enum Diff<T> where T: Eq {
|
pub enum Diff<T> where T: Eq {
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Both sides are the same.
|
||||||
Same,
|
Same,
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Left (pre, source) side doesn't include value, right side (post, destination) does.
|
||||||
Born(T),
|
Born(T),
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Both sides include data; it chaged value between them.
|
||||||
Changed(T, T),
|
Changed(T, T),
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Left (pre, source) side does include value, right side (post, destination) does not.
|
||||||
Died(T),
|
Died(T),
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -32,8 +32,8 @@ impl<T> Diff<T> where T: Eq {
|
|||||||
#[derive(PartialEq,Eq,Clone,Copy)]
|
#[derive(PartialEq,Eq,Clone,Copy)]
|
||||||
/// Boolean type for clean/dirty status.
|
/// Boolean type for clean/dirty status.
|
||||||
pub enum Filth {
|
pub enum Filth {
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Data has not been changed.
|
||||||
Clean,
|
Clean,
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Data has been changed.
|
||||||
Dirty,
|
Dirty,
|
||||||
}
|
}
|
||||||
|
@ -34,7 +34,7 @@ pub struct NibbleSlice<'a> {
|
|||||||
offset_encode_suffix: usize,
|
offset_encode_suffix: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Iterator type for a nibble slice.
|
||||||
pub struct NibbleSliceIterator<'a> {
|
pub struct NibbleSliceIterator<'a> {
|
||||||
p: &'a NibbleSlice<'a>,
|
p: &'a NibbleSlice<'a>,
|
||||||
i: usize,
|
i: usize,
|
||||||
@ -77,7 +77,7 @@ impl<'a, 'view> NibbleSlice<'a> where 'a: 'view {
|
|||||||
(r, a.len() + b.len())
|
(r, a.len() + b.len())
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Get an iterator for the series of nibbles.
|
||||||
pub fn iter(&'a self) -> NibbleSliceIterator<'a> {
|
pub fn iter(&'a self) -> NibbleSliceIterator<'a> {
|
||||||
NibbleSliceIterator { p: self, i: 0 }
|
NibbleSliceIterator { p: self, i: 0 }
|
||||||
}
|
}
|
||||||
@ -132,7 +132,7 @@ impl<'a, 'view> NibbleSlice<'a> where 'a: 'view {
|
|||||||
i
|
i
|
||||||
}
|
}
|
||||||
|
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Encode while nibble slice in prefixed hex notation, noting whether it `is_leaf`.
|
||||||
pub fn encoded(&self, is_leaf: bool) -> Bytes {
|
pub fn encoded(&self, is_leaf: bool) -> Bytes {
|
||||||
let l = self.len();
|
let l = self.len();
|
||||||
let mut r = Bytes::with_capacity(l / 2 + 1);
|
let mut r = Bytes::with_capacity(l / 2 + 1);
|
||||||
@ -145,7 +145,8 @@ impl<'a, 'view> NibbleSlice<'a> where 'a: 'view {
|
|||||||
r
|
r
|
||||||
}
|
}
|
||||||
|
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Encode only the leftmost `n` bytes of the nibble slice in prefixed hex notation,
|
||||||
|
/// noting whether it `is_leaf`.
|
||||||
pub fn encoded_leftmost(&self, n: usize, is_leaf: bool) -> Bytes {
|
pub fn encoded_leftmost(&self, n: usize, is_leaf: bool) -> Bytes {
|
||||||
let l = min(self.len(), n);
|
let l = min(self.len(), n);
|
||||||
let mut r = Bytes::with_capacity(l / 2 + 1);
|
let mut r = Bytes::with_capacity(l / 2 + 1);
|
||||||
|
@ -236,7 +236,7 @@ impl_uint_from_bytes!(U128);
|
|||||||
|
|
||||||
impl <T>FromBytes for T where T: FixedHash {
|
impl <T>FromBytes for T where T: FixedHash {
|
||||||
fn from_bytes(bytes: &[u8]) -> FromBytesResult<T> {
|
fn from_bytes(bytes: &[u8]) -> FromBytesResult<T> {
|
||||||
match bytes.len().cmp(&T::size()) {
|
match bytes.len().cmp(&T::len()) {
|
||||||
Ordering::Less => return Err(FromBytesError::DataIsTooShort),
|
Ordering::Less => return Err(FromBytesError::DataIsTooShort),
|
||||||
Ordering::Greater => return Err(FromBytesError::DataIsTooLong),
|
Ordering::Greater => return Err(FromBytesError::DataIsTooLong),
|
||||||
Ordering::Equal => ()
|
Ordering::Equal => ()
|
||||||
@ -246,7 +246,7 @@ impl <T>FromBytes for T where T: FixedHash {
|
|||||||
use std::{mem, ptr};
|
use std::{mem, ptr};
|
||||||
|
|
||||||
let mut res: T = mem::uninitialized();
|
let mut res: T = mem::uninitialized();
|
||||||
ptr::copy(bytes.as_ptr(), res.as_slice_mut().as_mut_ptr(), T::size());
|
ptr::copy(bytes.as_ptr(), res.as_slice_mut().as_mut_ptr(), T::len());
|
||||||
|
|
||||||
Ok(res)
|
Ok(res)
|
||||||
}
|
}
|
||||||
|
@ -48,13 +48,13 @@ pub use self::rlpstream::{RlpStream};
|
|||||||
pub use elastic_array::ElasticArray1024;
|
pub use elastic_array::ElasticArray1024;
|
||||||
use super::hash::H256;
|
use super::hash::H256;
|
||||||
|
|
||||||
/// TODO [arkpar] Please document me
|
/// The RLP encoded empty data (used to mean "null value").
|
||||||
pub const NULL_RLP: [u8; 1] = [0x80; 1];
|
pub const NULL_RLP: [u8; 1] = [0x80; 1];
|
||||||
/// TODO [Gav Wood] Please document me
|
/// The RLP encoded empty list.
|
||||||
pub const EMPTY_LIST_RLP: [u8; 1] = [0xC0; 1];
|
pub const EMPTY_LIST_RLP: [u8; 1] = [0xC0; 1];
|
||||||
/// TODO [arkpar] Please document me
|
/// The SHA3 of the RLP encoding of empty data.
|
||||||
pub const SHA3_NULL_RLP: H256 = H256( [0x56, 0xe8, 0x1f, 0x17, 0x1b, 0xcc, 0x55, 0xa6, 0xff, 0x83, 0x45, 0xe6, 0x92, 0xc0, 0xf8, 0x6e, 0x5b, 0x48, 0xe0, 0x1b, 0x99, 0x6c, 0xad, 0xc0, 0x01, 0x62, 0x2f, 0xb5, 0xe3, 0x63, 0xb4, 0x21] );
|
pub const SHA3_NULL_RLP: H256 = H256( [0x56, 0xe8, 0x1f, 0x17, 0x1b, 0xcc, 0x55, 0xa6, 0xff, 0x83, 0x45, 0xe6, 0x92, 0xc0, 0xf8, 0x6e, 0x5b, 0x48, 0xe0, 0x1b, 0x99, 0x6c, 0xad, 0xc0, 0x01, 0x62, 0x2f, 0xb5, 0xe3, 0x63, 0xb4, 0x21] );
|
||||||
/// TODO [debris] Please document me
|
/// The SHA3 of the RLP encoding of empty list.
|
||||||
pub const SHA3_EMPTY_LIST_RLP: H256 = H256( [0x1d, 0xcc, 0x4d, 0xe8, 0xde, 0xc7, 0x5d, 0x7a, 0xab, 0x85, 0xb5, 0x67, 0xb6, 0xcc, 0xd4, 0x1a, 0xd3, 0x12, 0x45, 0x1b, 0x94, 0x8a, 0x74, 0x13, 0xf0, 0xa1, 0x42, 0xfd, 0x40, 0xd4, 0x93, 0x47] );
|
pub const SHA3_EMPTY_LIST_RLP: H256 = H256( [0x1d, 0xcc, 0x4d, 0xe8, 0xde, 0xc7, 0x5d, 0x7a, 0xab, 0x85, 0xb5, 0x67, 0xb6, 0xcc, 0xd4, 0x1a, 0xd3, 0x12, 0x45, 0x1b, 0x94, 0x8a, 0x74, 0x13, 0xf0, 0xa1, 0x42, 0xfd, 0x40, 0xd4, 0x93, 0x47] );
|
||||||
|
|
||||||
/// Shortcut function to decode trusted rlp
|
/// Shortcut function to decode trusted rlp
|
||||||
|
@ -3,27 +3,27 @@ use std::error::Error as StdError;
|
|||||||
use rlp::bytes::FromBytesError;
|
use rlp::bytes::FromBytesError;
|
||||||
|
|
||||||
#[derive(Debug, PartialEq, Eq)]
|
#[derive(Debug, PartialEq, Eq)]
|
||||||
/// TODO [debris] Please document me
|
/// Error concerning the RLP decoder.
|
||||||
pub enum DecoderError {
|
pub enum DecoderError {
|
||||||
/// TODO [debris] Please document me
|
/// Couldn't convert given bytes to an instance of required type.
|
||||||
FromBytesError(FromBytesError),
|
FromBytesError(FromBytesError),
|
||||||
/// Given data has additional bytes at the end of the valid RLP fragment.
|
/// Data has additional bytes at the end of the valid RLP fragment.
|
||||||
RlpIsTooBig,
|
RlpIsTooBig,
|
||||||
/// TODO [debris] Please document me
|
/// Data has too few bytes for valid RLP.
|
||||||
RlpIsTooShort,
|
RlpIsTooShort,
|
||||||
/// TODO [debris] Please document me
|
/// Expect an encoded list, RLP was something else.
|
||||||
RlpExpectedToBeList,
|
RlpExpectedToBeList,
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Expect encoded data, RLP was something else.
|
||||||
RlpExpectedToBeData,
|
RlpExpectedToBeData,
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Expected a different size list.
|
||||||
RlpIncorrectListLen,
|
RlpIncorrectListLen,
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Data length number has a prefixed zero byte, invalid for numbers.
|
||||||
RlpDataLenWithZeroPrefix,
|
RlpDataLenWithZeroPrefix,
|
||||||
/// TODO [Gav Wood] Please document me
|
/// List length number has a prefixed zero byte, invalid for numbers.
|
||||||
RlpListLenWithZeroPrefix,
|
RlpListLenWithZeroPrefix,
|
||||||
/// TODO [debris] Please document me
|
/// Non-canonical (longer than necessary) representation used for data or list.
|
||||||
RlpInvalidIndirection,
|
RlpInvalidIndirection,
|
||||||
/// Returned when declared length is inconsistent with data specified after
|
/// Declared length is inconsistent with data specified after.
|
||||||
RlpInconsistentLengthAndData
|
RlpInconsistentLengthAndData
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,15 +7,15 @@ use elastic_array::ElasticArray1024;
|
|||||||
use hash::H256;
|
use hash::H256;
|
||||||
use sha3::*;
|
use sha3::*;
|
||||||
|
|
||||||
/// TODO [debris] Please document me
|
/// Type is able to decode RLP.
|
||||||
pub trait Decoder: Sized {
|
pub trait Decoder: Sized {
|
||||||
/// TODO [debris] Please document me
|
/// Read a value from the RLP into a given type.
|
||||||
fn read_value<T, F>(&self, f: F) -> Result<T, DecoderError>
|
fn read_value<T, F>(&self, f: F) -> Result<T, DecoderError>
|
||||||
where F: FnOnce(&[u8]) -> Result<T, DecoderError>;
|
where F: FnOnce(&[u8]) -> Result<T, DecoderError>;
|
||||||
|
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Get underlying `UntrustedRLP` object.
|
||||||
fn as_rlp(&self) -> &UntrustedRlp;
|
fn as_rlp(&self) -> &UntrustedRlp;
|
||||||
/// TODO [debris] Please document me
|
/// Get underlying raw bytes slice.
|
||||||
fn as_raw(&self) -> &[u8];
|
fn as_raw(&self) -> &[u8];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@ use bytes::{BytesConvertable, Populatable};
|
|||||||
use hash::{H256, FixedHash};
|
use hash::{H256, FixedHash};
|
||||||
use self::sha3_ext::*;
|
use self::sha3_ext::*;
|
||||||
|
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Get the SHA3 (i.e. Keccak) hash of the empty bytes string.
|
||||||
pub const SHA3_EMPTY: H256 = H256( [0xc5, 0xd2, 0x46, 0x01, 0x86, 0xf7, 0x23, 0x3c, 0x92, 0x7e, 0x7d, 0xb2, 0xdc, 0xc7, 0x03, 0xc0, 0xe5, 0x00, 0xb6, 0x53, 0xca, 0x82, 0x27, 0x3b, 0x7b, 0xfa, 0xd8, 0x04, 0x5d, 0x85, 0xa4, 0x70] );
|
pub const SHA3_EMPTY: H256 = H256( [0xc5, 0xd2, 0x46, 0x01, 0x86, 0xf7, 0x23, 0x3c, 0x92, 0x7e, 0x7d, 0xb2, 0xdc, 0xc7, 0x03, 0xc0, 0xe5, 0x00, 0xb6, 0x53, 0xca, 0x82, 0x27, 0x3b, 0x7b, 0xfa, 0xd8, 0x04, 0x5d, 0x85, 0xa4, 0x70] );
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,19 +1,20 @@
|
|||||||
//! Trie interface and implementation.
|
//! Trie interface and implementation.
|
||||||
|
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Export the trietraits module.
|
||||||
pub mod trietraits;
|
pub mod trietraits;
|
||||||
|
/// Export the standardmap module.
|
||||||
pub mod standardmap;
|
pub mod standardmap;
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Export the journal module.
|
||||||
pub mod journal;
|
pub mod journal;
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Export the node module.
|
||||||
pub mod node;
|
pub mod node;
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Export the triedb module.
|
||||||
pub mod triedb;
|
pub mod triedb;
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Export the triedbmut module.
|
||||||
pub mod triedbmut;
|
pub mod triedbmut;
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Export the sectriedb module.
|
||||||
pub mod sectriedb;
|
pub mod sectriedb;
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Export the sectriedbmut module.
|
||||||
pub mod sectriedbmut;
|
pub mod sectriedbmut;
|
||||||
|
|
||||||
pub use self::trietraits::*;
|
pub use self::trietraits::*;
|
||||||
|
@ -7,13 +7,13 @@ use super::journal::*;
|
|||||||
/// Type of node in the trie and essential information thereof.
|
/// Type of node in the trie and essential information thereof.
|
||||||
#[derive(Clone, Eq, PartialEq, Debug)]
|
#[derive(Clone, Eq, PartialEq, Debug)]
|
||||||
pub enum Node<'a> {
|
pub enum Node<'a> {
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Null trie node; could be an empty root or an empty branch entry.
|
||||||
Empty,
|
Empty,
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Leaf node; has key slice and value. Value may not be empty.
|
||||||
Leaf(NibbleSlice<'a>, &'a[u8]),
|
Leaf(NibbleSlice<'a>, &'a[u8]),
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Extension node; has key slice and node data. Data may not be null.
|
||||||
Extension(NibbleSlice<'a>, &'a[u8]),
|
Extension(NibbleSlice<'a>, &'a[u8]),
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Branch node; has array of 16 child nodes (each possibly null) and an optional immediate node data.
|
||||||
Branch([&'a[u8]; 16], Option<&'a [u8]>)
|
Branch([&'a[u8]; 16], Option<&'a [u8]>)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,13 +7,13 @@ use hash::*;
|
|||||||
|
|
||||||
/// Alphabet to use when creating words for insertion into tries.
|
/// Alphabet to use when creating words for insertion into tries.
|
||||||
pub enum Alphabet {
|
pub enum Alphabet {
|
||||||
/// TODO [Gav Wood] Please document me
|
/// All values are allowed in each bytes of the key.
|
||||||
All,
|
All,
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Only a 6 values ('a' - 'f') are chosen to compose the key.
|
||||||
Low,
|
Low,
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Quite a few values (around 32) are chosen to compose the key.
|
||||||
Mid,
|
Mid,
|
||||||
/// TODO [Gav Wood] Please document me
|
/// A set of bytes given is used to compose the key.
|
||||||
Custom(Bytes),
|
Custom(Bytes),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -34,7 +34,7 @@ use super::node::*;
|
|||||||
pub struct TrieDB<'db> {
|
pub struct TrieDB<'db> {
|
||||||
db: &'db HashDB,
|
db: &'db HashDB,
|
||||||
root: &'db H256,
|
root: &'db H256,
|
||||||
/// TODO [Gav Wood] Please document me
|
/// The number of hashes performed so far in operations on this trie.
|
||||||
pub hash_count: usize,
|
pub hash_count: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -40,7 +40,7 @@ use super::trietraits::*;
|
|||||||
pub struct TrieDBMut<'db> {
|
pub struct TrieDBMut<'db> {
|
||||||
db: &'db mut HashDB,
|
db: &'db mut HashDB,
|
||||||
root: &'db mut H256,
|
root: &'db mut H256,
|
||||||
/// TODO [Gav Wood] Please document me
|
/// The number of hashes performed so far in operations on this trie.
|
||||||
pub hash_count: usize,
|
pub hash_count: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,20 +60,20 @@ macro_rules! panic_on_overflow {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Generic Uint of unspecified size
|
/// Large, fixed-length unsigned integer type.
|
||||||
pub trait Uint: Sized + Default + FromStr + From<u64> + FromJson + fmt::Debug + fmt::Display + PartialOrd + Ord + PartialEq + Eq + Hash {
|
pub trait Uint: Sized + Default + FromStr + From<u64> + FromJson + fmt::Debug + fmt::Display + PartialOrd + Ord + PartialEq + Eq + Hash {
|
||||||
|
|
||||||
/// Size of this type.
|
/// Size of this type.
|
||||||
const SIZE: usize;
|
const SIZE: usize;
|
||||||
|
|
||||||
/// Returns `Uint(0)`
|
/// Returns new instance equalling zero.
|
||||||
fn zero() -> Self;
|
fn zero() -> Self;
|
||||||
/// Returns `Uint(1)`
|
/// Returns new instance equalling one.
|
||||||
fn one() -> Self;
|
fn one() -> Self;
|
||||||
|
|
||||||
/// Error returned when `from_dec_str` method fails
|
/// Error type for converting from a decimal string.
|
||||||
type FromDecStrErr;
|
type FromDecStrErr;
|
||||||
/// Create `Uint` from specified decimal represented by string
|
/// Convert from a decimal string.
|
||||||
fn from_dec_str(value: &str) -> Result<Self, Self::FromDecStrErr>;
|
fn from_dec_str(value: &str) -> Result<Self, Self::FromDecStrErr>;
|
||||||
|
|
||||||
/// Conversion to u32
|
/// Conversion to u32
|
||||||
@ -104,7 +104,6 @@ pub trait Uint: Sized + Default + FromStr + From<u64> + FromJson + fmt::Debug +
|
|||||||
/// Return wrapped eponentation `self**other` and flag if there was an overflow
|
/// Return wrapped eponentation `self**other` and flag if there was an overflow
|
||||||
fn overflowing_pow(self, other: Self) -> (Self, bool);
|
fn overflowing_pow(self, other: Self) -> (Self, bool);
|
||||||
|
|
||||||
|
|
||||||
/// Add this `Uint` to other returning result and possible overflow
|
/// Add this `Uint` to other returning result and possible overflow
|
||||||
fn overflowing_add(self, other: Self) -> (Self, bool);
|
fn overflowing_add(self, other: Self) -> (Self, bool);
|
||||||
|
|
||||||
@ -939,12 +938,10 @@ impl From<U256> for u32 {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Constant value of `U256::zero()` that can be used for a reference saving an additional instance creation.
|
||||||
pub const ZERO_U256: U256 = U256([0x00u64; 4]);
|
pub const ZERO_U256: U256 = U256([0x00u64; 4]);
|
||||||
/// TODO [Gav Wood] Please document me
|
/// Constant value of `U256::one()` that can be used for a reference saving an additional instance creation.
|
||||||
pub const ONE_U256: U256 = U256([0x01u64, 0x00u64, 0x00u64, 0x00u64]);
|
pub const ONE_U256: U256 = U256([0x01u64, 0x00u64, 0x00u64, 0x00u64]);
|
||||||
/// TODO [Gav Wood] Please document me
|
|
||||||
pub const BAD_U256: U256 = U256([0xffffffffffffffffu64; 4]);
|
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
Loading…
Reference in New Issue
Block a user