Return decoded seal fields. (#6932)
This commit is contained in:
parent
303036cab0
commit
454b4518f2
@ -162,6 +162,12 @@ impl Header {
|
|||||||
pub fn difficulty(&self) -> &U256 { &self.difficulty }
|
pub fn difficulty(&self) -> &U256 { &self.difficulty }
|
||||||
/// Get the seal field of the header.
|
/// Get the seal field of the header.
|
||||||
pub fn seal(&self) -> &[Bytes] { &self.seal }
|
pub fn seal(&self) -> &[Bytes] { &self.seal }
|
||||||
|
/// Get the seal field with RLP-decoded values as bytes.
|
||||||
|
pub fn decode_seal<'a, T: ::std::iter::FromIterator<&'a [u8]>>(&'a self) -> Result<T, DecoderError> {
|
||||||
|
self.seal.iter().map(|rlp| {
|
||||||
|
UntrustedRlp::new(rlp).data()
|
||||||
|
}).collect()
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: seal_at, set_seal_at &c.
|
// TODO: seal_at, set_seal_at &c.
|
||||||
|
|
||||||
@ -340,13 +346,20 @@ mod tests {
|
|||||||
// that's rlp of block header created with ethash engine.
|
// that's rlp of block header created with ethash engine.
|
||||||
let header_rlp = "f901f9a0d405da4e66f1445d455195229624e133f5baafe72b5cf7b3c36c12c8146e98b7a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a05fb2b4bfdef7b314451cb138a534d225c922fc0e5fbe25e451142732c3e25c25a088d2ec6b9860aae1a2c3b299f72b6a5d70d7f7ba4722c78f2c49ba96273c2158a007c6fdfa8eea7e86b81f5b0fc0f78f90cc19f4aa60d323151e0cac660199e9a1b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302008003832fefba82524d84568e932a80a0a0349d8c3df71f1a48a9df7d03fd5f14aeee7d91332c009ecaff0a71ead405bd88ab4e252a7e8c2a23".from_hex().unwrap();
|
let header_rlp = "f901f9a0d405da4e66f1445d455195229624e133f5baafe72b5cf7b3c36c12c8146e98b7a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a05fb2b4bfdef7b314451cb138a534d225c922fc0e5fbe25e451142732c3e25c25a088d2ec6b9860aae1a2c3b299f72b6a5d70d7f7ba4722c78f2c49ba96273c2158a007c6fdfa8eea7e86b81f5b0fc0f78f90cc19f4aa60d323151e0cac660199e9a1b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302008003832fefba82524d84568e932a80a0a0349d8c3df71f1a48a9df7d03fd5f14aeee7d91332c009ecaff0a71ead405bd88ab4e252a7e8c2a23".from_hex().unwrap();
|
||||||
let mix_hash = "a0a0349d8c3df71f1a48a9df7d03fd5f14aeee7d91332c009ecaff0a71ead405bd".from_hex().unwrap();
|
let mix_hash = "a0a0349d8c3df71f1a48a9df7d03fd5f14aeee7d91332c009ecaff0a71ead405bd".from_hex().unwrap();
|
||||||
|
let mix_hash_decoded = "a0349d8c3df71f1a48a9df7d03fd5f14aeee7d91332c009ecaff0a71ead405bd".from_hex().unwrap();
|
||||||
let nonce = "88ab4e252a7e8c2a23".from_hex().unwrap();
|
let nonce = "88ab4e252a7e8c2a23".from_hex().unwrap();
|
||||||
|
let nonce_decoded = "ab4e252a7e8c2a23".from_hex().unwrap();
|
||||||
|
|
||||||
let header: Header = rlp::decode(&header_rlp);
|
let header: Header = rlp::decode(&header_rlp);
|
||||||
let seal_fields = header.seal;
|
let seal_fields = header.seal.clone();
|
||||||
assert_eq!(seal_fields.len(), 2);
|
assert_eq!(seal_fields.len(), 2);
|
||||||
assert_eq!(seal_fields[0], mix_hash);
|
assert_eq!(seal_fields[0], mix_hash);
|
||||||
assert_eq!(seal_fields[1], nonce);
|
assert_eq!(seal_fields[1], nonce);
|
||||||
|
|
||||||
|
let decoded_seal = header.decode_seal::<Vec<_>>().unwrap();
|
||||||
|
assert_eq!(decoded_seal.len(), 2);
|
||||||
|
assert_eq!(decoded_seal[0], &*mix_hash_decoded);
|
||||||
|
assert_eq!(decoded_seal[1], &*nonce_decoded);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -21,7 +21,7 @@ use bigint::prelude::U256;
|
|||||||
use bigint::hash::{H256, H2048};
|
use bigint::hash::{H256, H2048};
|
||||||
use util::Address;
|
use util::Address;
|
||||||
use bytes::Bytes;
|
use bytes::Bytes;
|
||||||
use rlp::Rlp;
|
use rlp::{self, Rlp};
|
||||||
use header::BlockNumber;
|
use header::BlockNumber;
|
||||||
|
|
||||||
/// View onto block header rlp.
|
/// View onto block header rlp.
|
||||||
@ -99,6 +99,14 @@ impl<'a> HeaderView<'a> {
|
|||||||
}
|
}
|
||||||
seal
|
seal
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns a vector of seal fields (RLP-decoded).
|
||||||
|
pub fn decode_seal(&self) -> Result<Vec<Bytes>, rlp::DecoderError> {
|
||||||
|
let seal = self.seal();
|
||||||
|
seal.into_iter()
|
||||||
|
.map(|s| rlp::UntrustedRlp::new(&s).data().map(|x| x.to_vec()))
|
||||||
|
.collect()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
@ -173,8 +173,10 @@ impl<'a> From<&'a EthHeader> for Header {
|
|||||||
logs_bloom: h.log_bloom().into(),
|
logs_bloom: h.log_bloom().into(),
|
||||||
timestamp: h.timestamp().into(),
|
timestamp: h.timestamp().into(),
|
||||||
difficulty: h.difficulty().into(),
|
difficulty: h.difficulty().into(),
|
||||||
seal_fields: h.seal().into_iter().map(Into::into).collect(),
|
|
||||||
extra_data: h.extra_data().into(),
|
extra_data: h.extra_data().into(),
|
||||||
|
seal_fields: h.view().decode_seal()
|
||||||
|
.expect("Client/Miner returns only valid headers. We only serialize headers from Client/Miner; qed")
|
||||||
|
.into_iter().map(Into::into).collect(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user