all messages types implemented
This commit is contained in:
parent
4d71c801f3
commit
876c589f5c
|
@ -6,7 +6,6 @@ extern crate serialization as ser;
|
||||||
mod block;
|
mod block;
|
||||||
mod block_header;
|
mod block_header;
|
||||||
mod merkle_root;
|
mod merkle_root;
|
||||||
mod merkle_block;
|
|
||||||
mod transaction;
|
mod transaction;
|
||||||
|
|
||||||
pub use rustc_serialize::hex;
|
pub use rustc_serialize::hex;
|
||||||
|
@ -15,9 +14,10 @@ pub use primitives::{hash, bytes};
|
||||||
pub use self::block::Block;
|
pub use self::block::Block;
|
||||||
pub use self::block_header::BlockHeader;
|
pub use self::block_header::BlockHeader;
|
||||||
pub use self::merkle_root::merkle_root;
|
pub use self::merkle_root::merkle_root;
|
||||||
pub use self::merkle_block::MerkleBlock;
|
|
||||||
pub use self::transaction::{
|
pub use self::transaction::{
|
||||||
Transaction, TransactionInput, TransactionOutput, OutPoint,
|
Transaction, TransactionInput, TransactionOutput, OutPoint,
|
||||||
SEQUENCE_LOCKTIME_DISABLE_FLAG, SEQUENCE_FINAL,
|
SEQUENCE_LOCKTIME_DISABLE_FLAG, SEQUENCE_FINAL,
|
||||||
SEQUENCE_LOCKTIME_TYPE_FLAG, SEQUENCE_LOCKTIME_MASK
|
SEQUENCE_LOCKTIME_TYPE_FLAG, SEQUENCE_LOCKTIME_MASK
|
||||||
};
|
};
|
||||||
|
|
||||||
|
pub type ShortTransactionID = hash::H48;
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
use ser::{Serializable, Stream, Deserializable, Reader, Error as ReaderError};
|
||||||
|
use chain::{BlockHeader, ShortTransactionID};
|
||||||
|
use common::PrefilledTransaction;
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq)]
|
||||||
|
pub struct BlockHeaderAndIDs {
|
||||||
|
header: BlockHeader,
|
||||||
|
nonce: u64,
|
||||||
|
short_ids: Vec<ShortTransactionID>,
|
||||||
|
prefilled_transactions: Vec<PrefilledTransaction>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Serializable for BlockHeaderAndIDs {
|
||||||
|
fn serialize(&self, stream: &mut Stream) {
|
||||||
|
stream
|
||||||
|
.append(&self.header)
|
||||||
|
.append(&self.nonce)
|
||||||
|
.append_list(&self.short_ids)
|
||||||
|
.append_list(&self.prefilled_transactions);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Deserializable for BlockHeaderAndIDs {
|
||||||
|
fn deserialize(reader: &mut Reader) -> Result<Self, ReaderError> where Self: Sized {
|
||||||
|
let header= BlockHeaderAndIDs {
|
||||||
|
header: try!(reader.read()),
|
||||||
|
nonce: try!(reader.read()),
|
||||||
|
short_ids: try!(reader.read_list()),
|
||||||
|
prefilled_transactions: try!(reader.read_list()),
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(header)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
use hash::H256;
|
||||||
|
use ser::{Serializable, Stream, Deserializable, Reader, Error as ReaderError};
|
||||||
|
use chain::Transaction;
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq)]
|
||||||
|
pub struct BlockTransactions {
|
||||||
|
blockhash: H256,
|
||||||
|
transactions: Vec<Transaction>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Serializable for BlockTransactions {
|
||||||
|
fn serialize(&self, stream: &mut Stream) {
|
||||||
|
stream
|
||||||
|
.append(&self.blockhash)
|
||||||
|
.append_list(&self.transactions);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Deserializable for BlockTransactions {
|
||||||
|
fn deserialize(reader: &mut Reader) -> Result<Self, ReaderError> where Self: Sized {
|
||||||
|
let block_transactions = BlockTransactions {
|
||||||
|
blockhash: try!(reader.read()),
|
||||||
|
transactions: try!(reader.read_list()),
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(block_transactions)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
use hash::H256;
|
||||||
|
use ser::{
|
||||||
|
Serializable, Stream, CompactInteger,
|
||||||
|
Deserializable, Reader, Error as ReaderError,
|
||||||
|
};
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq)]
|
||||||
|
pub struct BlockTransactionsRequest {
|
||||||
|
blockhash: H256,
|
||||||
|
indexes: Vec<usize>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Serializable for BlockTransactionsRequest {
|
||||||
|
fn serialize(&self, stream: &mut Stream) {
|
||||||
|
let indexes: Vec<CompactInteger> = self.indexes
|
||||||
|
.iter()
|
||||||
|
.map(|x| (*x).into())
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
stream
|
||||||
|
.append(&self.blockhash)
|
||||||
|
.append_list(&indexes);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Deserializable for BlockTransactionsRequest {
|
||||||
|
fn deserialize(reader: &mut Reader) -> Result<Self, ReaderError> where Self: Sized {
|
||||||
|
let blockhash = try!(reader.read());
|
||||||
|
let indexes: Vec<CompactInteger> = try!(reader.read_list());
|
||||||
|
|
||||||
|
let request = BlockTransactionsRequest {
|
||||||
|
blockhash: blockhash,
|
||||||
|
indexes: indexes.into_iter().map(Into::into).collect(),
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(request)
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,17 +1,25 @@
|
||||||
mod address;
|
mod address;
|
||||||
|
mod block_header_and_ids;
|
||||||
|
mod block_transactions;
|
||||||
|
mod block_transactions_request;
|
||||||
mod command;
|
mod command;
|
||||||
mod error;
|
mod error;
|
||||||
mod inventory;
|
mod inventory;
|
||||||
mod ip;
|
mod ip;
|
||||||
mod magic;
|
mod magic;
|
||||||
mod port;
|
mod port;
|
||||||
|
mod prefilled_transaction;
|
||||||
mod service;
|
mod service;
|
||||||
|
|
||||||
pub use self::address::NetAddress;
|
pub use self::address::NetAddress;
|
||||||
|
pub use self::block_header_and_ids::BlockHeaderAndIDs;
|
||||||
|
pub use self::block_transactions::BlockTransactions;
|
||||||
|
pub use self::block_transactions_request::BlockTransactionsRequest;
|
||||||
pub use self::command::Command;
|
pub use self::command::Command;
|
||||||
pub use self::error::Error;
|
pub use self::error::Error;
|
||||||
pub use self::inventory::{InventoryVector, InventoryType};
|
pub use self::inventory::{InventoryVector, InventoryType};
|
||||||
pub use self::ip::IpAddress;
|
pub use self::ip::IpAddress;
|
||||||
pub use self::magic::Magic;
|
pub use self::magic::Magic;
|
||||||
pub use self::port::Port;
|
pub use self::port::Port;
|
||||||
|
pub use self::prefilled_transaction::PrefilledTransaction;
|
||||||
pub use self::service::ServiceFlags;
|
pub use self::service::ServiceFlags;
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
use ser::{
|
||||||
|
Serializable, Stream, CompactInteger,
|
||||||
|
Deserializable, Reader, Error as ReaderError
|
||||||
|
};
|
||||||
|
use chain::Transaction;
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq)]
|
||||||
|
pub struct PrefilledTransaction {
|
||||||
|
index: usize,
|
||||||
|
transaction: Transaction,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Serializable for PrefilledTransaction {
|
||||||
|
fn serialize(&self, stream: &mut Stream) {
|
||||||
|
stream
|
||||||
|
.append(&CompactInteger::from(self.index))
|
||||||
|
.append(&self.transaction);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Deserializable for PrefilledTransaction {
|
||||||
|
fn deserialize(reader: &mut Reader) -> Result<Self, ReaderError> where Self: Sized {
|
||||||
|
let compact: CompactInteger = try!(reader.read());
|
||||||
|
let tx = PrefilledTransaction {
|
||||||
|
index: compact.into(),
|
||||||
|
transaction: try!(reader.read()),
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(tx)
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,12 +2,13 @@ use ser::{
|
||||||
Serializable, Stream,
|
Serializable, Stream,
|
||||||
Error as ReaderError, deserialize
|
Error as ReaderError, deserialize
|
||||||
};
|
};
|
||||||
use chain::{Transaction, Block, MerkleBlock};
|
use chain::{Transaction, Block};
|
||||||
use common::Command;
|
use common::Command;
|
||||||
use types::{
|
use types::{
|
||||||
Version, Addr, AddrBelow31402, Inv,
|
Version, Addr, AddrBelow31402, Inv,
|
||||||
GetData, NotFound, GetBlocks, GetHeaders, Headers,
|
GetData, NotFound, GetBlocks, GetHeaders, Headers,
|
||||||
Ping, Pong, Reject, FilterLoad, FilterAdd, FeeFilter,
|
Ping, Pong, Reject, FilterLoad, FilterAdd, FeeFilter,
|
||||||
|
MerkleBlock, SendCompact, CompactBlock, GetBlockTxn, BlockTxn,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub fn deserialize_payload(data: &[u8], version: u32, command: &Command) -> Result<Payload, ReaderError> {
|
pub fn deserialize_payload(data: &[u8], version: u32, command: &Command) -> Result<Payload, ReaderError> {
|
||||||
|
@ -37,6 +38,10 @@ pub fn deserialize_payload(data: &[u8], version: u32, command: &Command) -> Resu
|
||||||
"merkleblock" => deserialize(data).map(Payload::MerkleBlock),
|
"merkleblock" => deserialize(data).map(Payload::MerkleBlock),
|
||||||
"sendheaders" if data.is_empty() => Ok(Payload::SendHeaders),
|
"sendheaders" if data.is_empty() => Ok(Payload::SendHeaders),
|
||||||
"feefilter" => deserialize(data).map(Payload::FeeFilter),
|
"feefilter" => deserialize(data).map(Payload::FeeFilter),
|
||||||
|
"sendcmpct" => deserialize(data).map(Payload::SendCompact),
|
||||||
|
"cmpctblock" => deserialize(data).map(Payload::CompactBlock),
|
||||||
|
"getblocktxn" => deserialize(data).map(Payload::GetBlockTxn),
|
||||||
|
"blocktxn" => deserialize(data).map(Payload::BlockTxn),
|
||||||
_ => Err(ReaderError::MalformedData),
|
_ => Err(ReaderError::MalformedData),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -66,6 +71,10 @@ pub enum Payload {
|
||||||
MerkleBlock(MerkleBlock),
|
MerkleBlock(MerkleBlock),
|
||||||
SendHeaders,
|
SendHeaders,
|
||||||
FeeFilter(FeeFilter),
|
FeeFilter(FeeFilter),
|
||||||
|
SendCompact(SendCompact),
|
||||||
|
CompactBlock(CompactBlock),
|
||||||
|
GetBlockTxn(GetBlockTxn),
|
||||||
|
BlockTxn(BlockTxn),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Payload {
|
impl Payload {
|
||||||
|
@ -93,6 +102,10 @@ impl Payload {
|
||||||
Payload::MerkleBlock(_) => "merkleblock",
|
Payload::MerkleBlock(_) => "merkleblock",
|
||||||
Payload::SendHeaders => "sendheaders",
|
Payload::SendHeaders => "sendheaders",
|
||||||
Payload::FeeFilter(_) => "feefilter",
|
Payload::FeeFilter(_) => "feefilter",
|
||||||
|
Payload::SendCompact(_) => "sendcmpct",
|
||||||
|
Payload::CompactBlock(_) => "compactblock",
|
||||||
|
Payload::GetBlockTxn(_) => "getblocktxn",
|
||||||
|
Payload::BlockTxn(_) => "blocktxn",
|
||||||
};
|
};
|
||||||
|
|
||||||
cmd.into()
|
cmd.into()
|
||||||
|
@ -126,6 +139,10 @@ impl Serializable for Payload {
|
||||||
Payload::MerkleBlock(ref p) => { stream.append(p); },
|
Payload::MerkleBlock(ref p) => { stream.append(p); },
|
||||||
Payload::SendHeaders => {},
|
Payload::SendHeaders => {},
|
||||||
Payload::FeeFilter(ref p) => { stream.append(p); },
|
Payload::FeeFilter(ref p) => { stream.append(p); },
|
||||||
|
Payload::SendCompact(ref p) => { stream.append(p); },
|
||||||
|
Payload::CompactBlock(ref p) => { stream.append(p); },
|
||||||
|
Payload::GetBlockTxn(ref p) => { stream.append(p); },
|
||||||
|
Payload::BlockTxn(ref p) => { stream.append(p); },
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
use ser::{Serializable, Stream, Deserializable, Reader, Error as ReaderError};
|
||||||
|
use common::BlockTransactions;
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq)]
|
||||||
|
pub struct BlockTxn {
|
||||||
|
request: BlockTransactions,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Serializable for BlockTxn {
|
||||||
|
fn serialize(&self, stream: &mut Stream) {
|
||||||
|
stream.append(&self.request);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Deserializable for BlockTxn {
|
||||||
|
fn deserialize(reader: &mut Reader) -> Result<Self, ReaderError> where Self: Sized {
|
||||||
|
let block = BlockTxn {
|
||||||
|
request: try!(reader.read()),
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(block)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
use ser::{Serializable, Stream, Deserializable, Reader, Error as ReaderError};
|
||||||
|
use common::BlockHeaderAndIDs;
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq)]
|
||||||
|
pub struct CompactBlock {
|
||||||
|
header: BlockHeaderAndIDs,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Serializable for CompactBlock {
|
||||||
|
fn serialize(&self, stream: &mut Stream) {
|
||||||
|
stream.append(&self.header);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Deserializable for CompactBlock {
|
||||||
|
fn deserialize(reader: &mut Reader) -> Result<Self, ReaderError> where Self: Sized {
|
||||||
|
let block = CompactBlock {
|
||||||
|
header: try!(reader.read()),
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(block)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
use ser::{Serializable, Stream, Deserializable, Reader, Error as ReaderError};
|
||||||
|
use common::BlockTransactionsRequest;
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq)]
|
||||||
|
pub struct GetBlockTxn {
|
||||||
|
request: BlockTransactionsRequest,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Serializable for GetBlockTxn {
|
||||||
|
fn serialize(&self, stream: &mut Stream) {
|
||||||
|
stream.append(&self.request);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Deserializable for GetBlockTxn {
|
||||||
|
fn deserialize(reader: &mut Reader) -> Result<Self, ReaderError> where Self: Sized {
|
||||||
|
let get_block = GetBlockTxn {
|
||||||
|
request: try!(reader.read()),
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(get_block)
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
use common::InventoryVector;
|
|
||||||
use ser::{Serializable, Stream, Deserializable, Reader, Error as ReaderError};
|
use ser::{Serializable, Stream, Deserializable, Reader, Error as ReaderError};
|
||||||
|
use common::InventoryVector;
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub struct Inv {
|
pub struct Inv {
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
use hash::H256;
|
use hash::H256;
|
||||||
use bytes::Bytes;
|
use bytes::Bytes;
|
||||||
use ser::{Serializable, Stream, Deserializable, Reader, Error as ReaderError};
|
use ser::{Serializable, Stream, Deserializable, Reader, Error as ReaderError};
|
||||||
use BlockHeader;
|
use chain::BlockHeader;
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub struct MerkleBlock {
|
pub struct MerkleBlock {
|
|
@ -1,23 +1,33 @@
|
||||||
mod addr;
|
mod addr;
|
||||||
|
mod blocktxn;
|
||||||
|
mod compactblock;
|
||||||
mod feefilter;
|
mod feefilter;
|
||||||
mod filterload;
|
mod filterload;
|
||||||
mod filteradd;
|
mod filteradd;
|
||||||
mod getblocks;
|
mod getblocks;
|
||||||
|
mod getblocktxn;
|
||||||
mod headers;
|
mod headers;
|
||||||
mod inv;
|
mod inv;
|
||||||
|
mod merkle_block;
|
||||||
mod ping;
|
mod ping;
|
||||||
pub mod reject;
|
pub mod reject;
|
||||||
|
mod sendcompact;
|
||||||
pub mod version;
|
pub mod version;
|
||||||
|
|
||||||
pub use self::addr::{Addr, AddrBelow31402};
|
pub use self::addr::{Addr, AddrBelow31402};
|
||||||
|
pub use self::blocktxn::BlockTxn;
|
||||||
|
pub use self::compactblock::CompactBlock;
|
||||||
pub use self::feefilter::FeeFilter;
|
pub use self::feefilter::FeeFilter;
|
||||||
pub use self::filterload::FilterLoad;
|
pub use self::filterload::FilterLoad;
|
||||||
pub use self::filteradd::FilterAdd;
|
pub use self::filteradd::FilterAdd;
|
||||||
pub use self::getblocks::GetBlocks;
|
pub use self::getblocks::GetBlocks;
|
||||||
|
pub use self::getblocktxn::GetBlockTxn;
|
||||||
pub use self::headers::Headers;
|
pub use self::headers::Headers;
|
||||||
pub use self::inv::Inv;
|
pub use self::inv::Inv;
|
||||||
|
pub use self::merkle_block::MerkleBlock;
|
||||||
pub use self::ping::Ping;
|
pub use self::ping::Ping;
|
||||||
pub use self::reject::Reject;
|
pub use self::reject::Reject;
|
||||||
|
pub use self::sendcompact::SendCompact;
|
||||||
pub use self::version::Version;
|
pub use self::version::Version;
|
||||||
|
|
||||||
pub type GetData = Inv;
|
pub type GetData = Inv;
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
use ser::{Serializable, Stream, Deserializable, Reader, Error as ReaderError};
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq)]
|
||||||
|
pub struct SendCompact {
|
||||||
|
first: bool,
|
||||||
|
second: u64,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Serializable for SendCompact {
|
||||||
|
fn serialize(&self, stream: &mut Stream) {
|
||||||
|
stream
|
||||||
|
.append(&self.first)
|
||||||
|
.append(&self.second);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Deserializable for SendCompact {
|
||||||
|
fn deserialize(reader: &mut Reader) -> Result<Self, ReaderError> where Self: Sized {
|
||||||
|
let send_compact = SendCompact {
|
||||||
|
first: try!(reader.read()),
|
||||||
|
second: try!(reader.read()),
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(send_compact)
|
||||||
|
}
|
||||||
|
}
|
|
@ -106,6 +106,7 @@ macro_rules! impl_hash {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl_hash!(H48, 6);
|
||||||
impl_hash!(H96, 12);
|
impl_hash!(H96, 12);
|
||||||
impl_hash!(H160, 20);
|
impl_hash!(H160, 20);
|
||||||
impl_hash!(H256, 32);
|
impl_hash!(H256, 32);
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use bytes::Bytes;
|
use bytes::Bytes;
|
||||||
use byteorder::{ReadBytesExt, WriteBytesExt, LittleEndian};
|
use byteorder::{ReadBytesExt, WriteBytesExt, LittleEndian};
|
||||||
use hash::{H96, H160, H256, H264, H512, H520};
|
use hash::{H48, H96, H160, H256, H264, H512, H520};
|
||||||
use compact_integer::CompactInteger;
|
use compact_integer::CompactInteger;
|
||||||
use {Serializable, Stream, Deserializable, Reader, Error};
|
use {Serializable, Stream, Deserializable, Reader, Error};
|
||||||
|
|
||||||
|
@ -142,6 +142,7 @@ macro_rules! impl_ser_for_hash {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl_ser_for_hash!(H48, 6);
|
||||||
impl_ser_for_hash!(H96, 12);
|
impl_ser_for_hash!(H96, 12);
|
||||||
impl_ser_for_hash!(H160, 20);
|
impl_ser_for_hash!(H160, 20);
|
||||||
impl_ser_for_hash!(H256, 32);
|
impl_ser_for_hash!(H256, 32);
|
||||||
|
|
Loading…
Reference in New Issue