Merge branch 'master' of github.com:ethcore/parity-bitcoin into p2p_logging

This commit is contained in:
debris 2016-10-19 15:45:26 +02:00
commit b6584cd2ce
11 changed files with 771 additions and 146 deletions

12
Cargo.lock generated
View File

@ -72,6 +72,7 @@ name = "chain"
version = "0.1.0"
dependencies = [
"bitcrypto 0.1.0",
"heapsize 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
"primitives 0.1.0",
"rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
"serialization 0.1.0",
@ -179,6 +180,14 @@ dependencies = [
"rayon 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "heapsize"
version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "kernel32-sys"
version = "0.2.2"
@ -245,6 +254,7 @@ name = "miner"
version = "0.1.0"
dependencies = [
"chain 0.1.0",
"heapsize 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
"primitives 0.1.0",
"serialization 0.1.0",
]
@ -376,6 +386,7 @@ dependencies = [
name = "primitives"
version = "0.1.0"
dependencies = [
"heapsize 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
"rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
]
@ -617,6 +628,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
"checksum futures 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0bd34f72c0fffc9d2f6c570fd392bf99b9c5cd1481d79809e1cc2320befc0af0"
"checksum futures-cpupool 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bb982bb25cd8fa5da6a8eb3a460354c984ff1113da82bcb4f0b0862b5795db82"
"checksum gcc 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)" = "91ecd03771effb0c968fd6950b37e89476a578aaf1c70297d8e92b6516ec3312"
"checksum heapsize 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "8c80e194758495a9109566134dc06e42ea0423987d6ceca016edaa90381b3549"
"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
"checksum lazy_static 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "49247ec2a285bb3dcb23cbd9c35193c025e7251bfce77c1d5da97e6362dffe7f"
"checksum lazycell 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ce12306c4739d86ee97c23139f3a34ddf0387bbf181bc7929d287025a8c3ef6b"

View File

@ -5,6 +5,7 @@ authors = ["debris <marek.kotewicz@gmail.com>"]
[dependencies]
rustc-serialize = "0.3"
heapsize = "0.3"
bitcrypto = { path = "../crypto" }
primitives = { path = "../primitives" }
serialization = { path = "../serialization" }

View File

@ -1,4 +1,5 @@
extern crate rustc_serialize;
extern crate heapsize;
extern crate primitives;
extern crate bitcrypto as crypto;
extern crate serialization as ser;

View File

@ -2,6 +2,7 @@
//! Bitcoin trainsaction.
//! https://en.bitcoin.it/wiki/Protocol_documentation#tx
use heapsize::HeapSizeOf;
use hex::FromHex;
use bytes::Bytes;
use ser::{
@ -105,6 +106,12 @@ impl Deserializable for TransactionInput {
}
}
impl HeapSizeOf for TransactionInput {
fn heap_size_of_children(&self) -> usize {
self.script_sig.heap_size_of_children()
}
}
impl TransactionInput {
pub fn previous_output(&self) -> &OutPoint {
&self.previous_output
@ -159,6 +166,12 @@ impl Default for TransactionOutput {
}
}
impl HeapSizeOf for TransactionOutput {
fn heap_size_of_children(&self) -> usize {
self.script_pubkey.heap_size_of_children()
}
}
impl TransactionOutput {
pub fn value(&self) -> u64 {
self.value
@ -214,6 +227,12 @@ impl From<&'static str> for Transaction {
}
}
impl HeapSizeOf for Transaction {
fn heap_size_of_children(&self) -> usize {
self.inputs.heap_size_of_children() + self.outputs.heap_size_of_children()
}
}
impl Transaction {
pub fn hash(&self) -> H256 {
dhash256(&serialize(self))

View File

@ -4,6 +4,7 @@ version = "0.1.0"
authors = ["Ethcore <admin@ethcore.io>"]
[dependencies]
heapsize = "0.3"
chain = { path = "../chain" }
primitives = { path = "../primitives" }
serialization = { path = "../serialization" }

119
miner/benches/mod.rs Normal file
View File

@ -0,0 +1,119 @@
#![feature(test)]
extern crate test;
extern crate miner;
extern crate chain;
extern crate primitives;
extern crate serialization as ser;
#[cfg(test)]
mod benchmarks {
use std::collections::VecDeque;
use super::chain::{Transaction, TransactionInput, OutPoint};
use super::primitives::bytes::Bytes;
use super::test::Bencher;
use super::miner::{MemoryPool, MemoryPoolOrderingStrategy};
fn prepare_independent_transactions(n: usize) -> VecDeque<Transaction> {
(0..n).map(|nonce| Transaction {
version: nonce as i32,
inputs: vec![],
outputs: vec![],
lock_time: 0,
}).collect()
}
fn prepare_dependent_transactions(n: usize) -> VecDeque<Transaction> {
let previous_transaction: Transaction = "00000000000164000000000000000000000000".into();
let mut previous_transaction_hash = previous_transaction.hash();
let mut result = VecDeque::new();
result.push_back(previous_transaction);
result.extend((0..n).map(|_nonce| {
let transaction = Transaction {
version: 0,
inputs: vec![
TransactionInput {
previous_output: OutPoint {
hash: previous_transaction_hash.clone(),
index: 0,
},
script_sig: Bytes::new_with_len(0),
sequence: 0,
},
],
outputs: vec![],
lock_time: 0,
};
previous_transaction_hash = transaction.hash();
transaction
}));
result
}
#[bench]
// test benchmarks::memory_pool_insert_independent_transactions ... bench: 1,455 ns/iter (+/- 12)
fn memory_pool_insert_independent_transactions(b: &mut Bencher) {
let iterations = 100;
let mut pool = MemoryPool::new();
let mut transactions = prepare_independent_transactions(iterations);
b.bench_n(iterations as u64, |b| b.iter(|| {
pool.insert_verified(transactions.pop_front().unwrap())
}));
}
#[bench]
// test benchmarks::memory_pool_insert_descendant_transaction ... bench: 7,834 ns/iter (+/- 288)
fn memory_pool_insert_descendant_transaction(b: &mut Bencher) {
let iterations = 100usize;
let mut pool = MemoryPool::new();
let mut transactions = prepare_dependent_transactions(iterations);
pool.insert_verified(transactions.pop_front().unwrap());
b.bench_n(iterations as u64, |b| b.iter(|| {
pool.insert_verified(transactions.pop_front().unwrap())
}));
}
#[bench]
// test benchmarks::memory_pool_insert_ancestor_transaction ... bench: 376,067 ns/iter (+/- 11,249)
// very slow due to weird usage scenario:
// (1) transactions inserted to memorypool are verified
// (2) verified => ancestors already verified
// (3) ancestors verified => they are already in memorypool (not this case) or in database (why inserting to memorypool then)
fn memory_pool_insert_ancestor_transaction(b: &mut Bencher) {
let iterations = 100usize;
let mut pool = MemoryPool::new();
let mut transactions = prepare_dependent_transactions(iterations);
pool.insert_verified(transactions.pop_front().unwrap());
b.bench_n(iterations as u64, |b| b.iter(|| {
pool.insert_verified(transactions.pop_back().unwrap())
}));
}
#[bench]
// test benchmarks::memory_pool_remove_independent_in_order ... bench: 460 ns/iter (+/- 47)
fn memory_pool_remove_independent_in_order(b: &mut Bencher) {
let iterations = 100;
let mut pool = MemoryPool::new();
for transaction in prepare_independent_transactions(iterations) {
pool.insert_verified(transaction)
}
b.bench_n(iterations as u64, |b| b.iter(|| {
pool.remove_with_strategy(MemoryPoolOrderingStrategy::ByTimestamp)
}));
}
#[bench]
// test benchmarks::memory_pool_remove_dependent_in_order ... bench: 754 ns/iter (+/- 111)
fn memory_pool_remove_dependent_in_order(b: &mut Bencher) {
let iterations = 100;
let mut pool = MemoryPool::new();
for transaction in prepare_dependent_transactions(iterations) {
pool.insert_verified(transaction)
}
b.bench_n(iterations as u64, |b| b.iter(|| {
pool.remove_with_strategy(MemoryPoolOrderingStrategy::ByTimestamp)
}));
}
}

View File

@ -1,4 +1,5 @@
extern crate chain;
extern crate heapsize;
extern crate primitives;
extern crate serialization as ser;
@ -6,4 +7,4 @@ pub mod memory_pool;
pub use primitives::{hash};
pub use self::memory_pool::{MemoryPool, Information as MemoryPoolInformation};
pub use self::memory_pool::{MemoryPool, Information as MemoryPoolInformation, OrderingStrategy as MemoryPoolOrderingStrategy};

File diff suppressed because it is too large Load Diff

View File

@ -4,4 +4,5 @@ version = "0.1.0"
authors = ["debris <marek.kotewicz@gmail.com>"]
[dependencies]
heapsize = "0.3"
rustc-serialize = "0.3"

View File

@ -137,6 +137,8 @@ impl_hash!(H264, 33);
impl_hash!(H512, 64);
impl_hash!(H520, 65);
known_heap_size!(0, H32, H48, H96, H160, H256, H264, H512, H520);
impl H256 {
#[inline]
pub fn from_reversed_str(s: &'static str) -> Self {

View File

@ -1,4 +1,5 @@
extern crate rustc_serialize;
#[macro_use] extern crate heapsize;
pub mod bytes;
pub mod hash;