Bunch of error type changes
This commit is contained in:
parent
719f616218
commit
6db25db975
|
@ -22,8 +22,8 @@
|
||||||
|
|
||||||
use std::num::{Zero, from_u64};
|
use std::num::{Zero, from_u64};
|
||||||
|
|
||||||
use util::error::{BitcoinResult};
|
use util::error;
|
||||||
use util::error::BitcoinError::{SpvBadTarget, SpvBadProofOfWork};
|
use util::error::Error::{SpvBadTarget, SpvBadProofOfWork};
|
||||||
use util::hash::Sha256dHash;
|
use util::hash::Sha256dHash;
|
||||||
use util::uint::Uint256;
|
use util::uint::Uint256;
|
||||||
use network::encodable::{ConsensusEncodable, VarInt};
|
use network::encodable::{ConsensusEncodable, VarInt};
|
||||||
|
@ -97,7 +97,7 @@ impl BlockHeader {
|
||||||
/// Performs an SPV validation of a block, which confirms that the proof-of-work
|
/// Performs an SPV validation of a block, which confirms that the proof-of-work
|
||||||
/// is correct, but does not verify that the transactions are valid or encoded
|
/// is correct, but does not verify that the transactions are valid or encoded
|
||||||
/// correctly.
|
/// correctly.
|
||||||
pub fn spv_validate(&self, required_target: &Uint256) -> BitcoinResult<()> {
|
pub fn spv_validate(&self, required_target: &Uint256) -> error::Result<()> {
|
||||||
let ref target = self.target();
|
let ref target = self.target();
|
||||||
if target != required_target {
|
if target != required_target {
|
||||||
return Err(SpvBadTarget);
|
return Err(SpvBadTarget);
|
||||||
|
|
|
@ -33,8 +33,8 @@ use network::constants::Network::{self, BitcoinTestnet};
|
||||||
use network::encodable::{ConsensusDecodable, ConsensusEncodable};
|
use network::encodable::{ConsensusDecodable, ConsensusEncodable};
|
||||||
use network::serialize::{BitcoinHash, SimpleDecoder, SimpleEncoder};
|
use network::serialize::{BitcoinHash, SimpleDecoder, SimpleEncoder};
|
||||||
use util::BitArray;
|
use util::BitArray;
|
||||||
use util::error::BitcoinResult;
|
use util::error;
|
||||||
use util::error::BitcoinError::{BlockNotFound, DuplicateHash, PrevHashNotFound};
|
use util::error::Error::{BlockNotFound, DuplicateHash, PrevHashNotFound};
|
||||||
use util::uint::Uint256;
|
use util::uint::Uint256;
|
||||||
use util::hash::Sha256dHash;
|
use util::hash::Sha256dHash;
|
||||||
use util::patricia_tree::PatriciaTree;
|
use util::patricia_tree::PatriciaTree;
|
||||||
|
@ -365,7 +365,7 @@ impl Blockchain {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn replace_txdata(&mut self, hash: &Uint256, txdata: Vec<Transaction>, has_txdata: bool) -> BitcoinResult<()> {
|
fn replace_txdata(&mut self, hash: &Uint256, txdata: Vec<Transaction>, has_txdata: bool) -> error::Result<()> {
|
||||||
match self.tree.lookup_mut(hash, 256) {
|
match self.tree.lookup_mut(hash, 256) {
|
||||||
Some(existing_block) => {
|
Some(existing_block) => {
|
||||||
unsafe {
|
unsafe {
|
||||||
|
@ -405,26 +405,26 @@ impl Blockchain {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Locates a block in the chain and overwrites its txdata
|
/// Locates a block in the chain and overwrites its txdata
|
||||||
pub fn add_txdata(&mut self, block: Block) -> BitcoinResult<()> {
|
pub fn add_txdata(&mut self, block: Block) -> error::Result<()> {
|
||||||
self.replace_txdata(&block.header.bitcoin_hash().into_le(), block.txdata, true)
|
self.replace_txdata(&block.header.bitcoin_hash().into_le(), block.txdata, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Locates a block in the chain and removes its txdata
|
/// Locates a block in the chain and removes its txdata
|
||||||
pub fn remove_txdata(&mut self, hash: Sha256dHash) -> BitcoinResult<()> {
|
pub fn remove_txdata(&mut self, hash: Sha256dHash) -> error::Result<()> {
|
||||||
self.replace_txdata(&hash.into_le(), vec![], false)
|
self.replace_txdata(&hash.into_le(), vec![], false)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Adds a block header to the chain
|
/// Adds a block header to the chain
|
||||||
pub fn add_header(&mut self, header: BlockHeader) -> BitcoinResult<()> {
|
pub fn add_header(&mut self, header: BlockHeader) -> error::Result<()> {
|
||||||
self.real_add_block(Block { header: header, txdata: vec![] }, false)
|
self.real_add_block(Block { header: header, txdata: vec![] }, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Adds a block to the chain
|
/// Adds a block to the chain
|
||||||
pub fn add_block(&mut self, block: Block) -> BitcoinResult<()> {
|
pub fn add_block(&mut self, block: Block) -> error::Result<()> {
|
||||||
self.real_add_block(block, true)
|
self.real_add_block(block, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn real_add_block(&mut self, block: Block, has_txdata: bool) -> BitcoinResult<()> {
|
fn real_add_block(&mut self, block: Block, has_txdata: bool) -> error::Result<()> {
|
||||||
// get_prev optimizes the common case where we are extending the best tip
|
// get_prev optimizes the common case where we are extending the best tip
|
||||||
#[inline]
|
#[inline]
|
||||||
fn get_prev<'a>(chain: &'a Blockchain, hash: Sha256dHash) -> Option<NodePtr> {
|
fn get_prev<'a>(chain: &'a Blockchain, hash: Sha256dHash) -> Option<NodePtr> {
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
//! to connect to a peer, send network messages, and receive Bitcoin data.
|
//! to connect to a peer, send network messages, and receive Bitcoin data.
|
||||||
//!
|
//!
|
||||||
|
|
||||||
use std::io::{IoResult, standard_error, ConnectionFailed};
|
use std::io::{Result, Error, ErrorKind};
|
||||||
|
|
||||||
use network::constants::Network;
|
use network::constants::Network;
|
||||||
use network::message;
|
use network::message;
|
||||||
|
@ -35,12 +35,13 @@ pub trait Listener {
|
||||||
/// Return the network this `Listener` is operating on
|
/// Return the network this `Listener` is operating on
|
||||||
fn network(&self) -> Network;
|
fn network(&self) -> Network;
|
||||||
/// Main listen loop
|
/// Main listen loop
|
||||||
fn start(&self) -> IoResult<(Receiver<SocketResponse>, Socket)> {
|
fn start(&self) -> Result<(Receiver<SocketResponse>, Socket)> {
|
||||||
// Open socket
|
// Open socket
|
||||||
let mut ret_sock = Socket::new(self.network());
|
let mut ret_sock = Socket::new(self.network());
|
||||||
match ret_sock.connect(self.peer(), self.port()) {
|
match ret_sock.connect(self.peer(), self.port()) {
|
||||||
Ok(_) => {},
|
Ok(_) => {},
|
||||||
Err(_) => return Err(standard_error(ConnectionFailed))
|
Err(_) => return Err(Error::new(ErrorKind::ConnectionFailed,
|
||||||
|
"Listener connection failed", None))
|
||||||
}
|
}
|
||||||
let mut sock = ret_sock.clone();
|
let mut sock = ret_sock.clone();
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
//!
|
//!
|
||||||
|
|
||||||
use collections::Vec;
|
use collections::Vec;
|
||||||
use std::io::{IoError, IoResult, OtherIoError};
|
use std::io;
|
||||||
use std::io::MemReader;
|
use std::io::MemReader;
|
||||||
|
|
||||||
use blockdata::block;
|
use blockdata::block;
|
||||||
|
@ -69,7 +69,7 @@ pub enum SocketResponse {
|
||||||
/// A message was received
|
/// A message was received
|
||||||
MessageReceived(NetworkMessage),
|
MessageReceived(NetworkMessage),
|
||||||
/// An error occured and the socket needs to close
|
/// An error occured and the socket needs to close
|
||||||
ConnectionFailed(IoError, Sender<()>)
|
ConnectionFailed(io::Error, Sender<()>)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, PartialEq, Eq, Debug)]
|
#[derive(Clone, PartialEq, Eq, Debug)]
|
||||||
|
@ -155,8 +155,8 @@ impl<S:SimpleEncoder<E>, E> ConsensusEncodable<S, E> for RawNetworkMessage {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<D:SimpleDecoder<IoError>> ConsensusDecodable<D, IoError> for RawNetworkMessage {
|
impl<D:SimpleDecoder<io::Error>> ConsensusDecodable<D, io::Error> for RawNetworkMessage {
|
||||||
fn consensus_decode(d: &mut D) -> IoResult<RawNetworkMessage> {
|
fn consensus_decode(d: &mut D) -> io::Result<RawNetworkMessage> {
|
||||||
let magic = try!(ConsensusDecodable::consensus_decode(d));
|
let magic = try!(ConsensusDecodable::consensus_decode(d));
|
||||||
let CommandString(cmd): CommandString= try!(ConsensusDecodable::consensus_decode(d));
|
let CommandString(cmd): CommandString= try!(ConsensusDecodable::consensus_decode(d));
|
||||||
let CheckedData(raw_payload): CheckedData = try!(ConsensusDecodable::consensus_decode(d));
|
let CheckedData(raw_payload): CheckedData = try!(ConsensusDecodable::consensus_decode(d));
|
||||||
|
@ -177,8 +177,8 @@ impl<D:SimpleDecoder<IoError>> ConsensusDecodable<D, IoError> for RawNetworkMess
|
||||||
"pong" => Ping(try!(prepend_err("pong", ConsensusDecodable::consensus_decode(&mut mem_d)))),
|
"pong" => Ping(try!(prepend_err("pong", ConsensusDecodable::consensus_decode(&mut mem_d)))),
|
||||||
"tx" => Tx(try!(prepend_err("tx", ConsensusDecodable::consensus_decode(&mut mem_d)))),
|
"tx" => Tx(try!(prepend_err("tx", ConsensusDecodable::consensus_decode(&mut mem_d)))),
|
||||||
cmd => {
|
cmd => {
|
||||||
return Err(IoError {
|
return Err(io::Error {
|
||||||
kind: OtherIoError,
|
kind: io::ErrorKind::OtherError,
|
||||||
desc: "unknown message type",
|
desc: "unknown message type",
|
||||||
detail: Some(format!("`{}` not recognized", cmd))
|
detail: Some(format!("`{}` not recognized", cmd))
|
||||||
});
|
});
|
||||||
|
@ -195,7 +195,7 @@ impl<D:SimpleDecoder<IoError>> ConsensusDecodable<D, IoError> for RawNetworkMess
|
||||||
mod test {
|
mod test {
|
||||||
use super::{RawNetworkMessage, CommandString, Verack, Ping};
|
use super::{RawNetworkMessage, CommandString, Verack, Ping};
|
||||||
|
|
||||||
use std::io::IoResult;
|
use std::io::io::Result;
|
||||||
|
|
||||||
use network::serialize::{deserialize, serialize};
|
use network::serialize::{deserialize, serialize};
|
||||||
|
|
||||||
|
@ -207,11 +207,11 @@ mod test {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn deserialize_commandstring_test() {
|
fn deserialize_commandstring_test() {
|
||||||
let cs: IoResult<CommandString> = deserialize(vec![0x41u8, 0x6e, 0x64, 0x72, 0x65, 0x77, 0, 0, 0, 0, 0, 0]);
|
let cs: io::Result<CommandString> = deserialize(vec![0x41u8, 0x6e, 0x64, 0x72, 0x65, 0x77, 0, 0, 0, 0, 0, 0]);
|
||||||
assert!(cs.is_ok());
|
assert!(cs.is_ok());
|
||||||
assert_eq!(cs.unwrap(), CommandString(String::from_str("Andrew")));
|
assert_eq!(cs.unwrap(), CommandString(String::from_str("Andrew")));
|
||||||
|
|
||||||
let short_cs: IoResult<CommandString> = deserialize(vec![0x41u8, 0x6e, 0x64, 0x72, 0x65, 0x77, 0, 0, 0, 0, 0]);
|
let short_cs: io::Result<CommandString> = deserialize(vec![0x41u8, 0x6e, 0x64, 0x72, 0x65, 0x77, 0, 0, 0, 0, 0]);
|
||||||
assert!(short_cs.is_err());
|
assert!(short_cs.is_err());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
//! capabilities
|
//! capabilities
|
||||||
//!
|
//!
|
||||||
|
|
||||||
use std::io::IoResult;
|
use std::io::Result;
|
||||||
|
|
||||||
use network::constants;
|
use network::constants;
|
||||||
use network::address::Address;
|
use network::address::Address;
|
||||||
|
@ -54,7 +54,7 @@ pub struct VersionMessage {
|
||||||
impl VersionMessage {
|
impl VersionMessage {
|
||||||
// TODO: we have fixed services and relay to 0
|
// TODO: we have fixed services and relay to 0
|
||||||
/// Constructs a new `version` message
|
/// Constructs a new `version` message
|
||||||
pub fn new(timestamp: i64, mut socket: Socket, nonce: u64, start_height: i32) -> IoResult<VersionMessage> {
|
pub fn new(timestamp: i64, mut socket: Socket, nonce: u64, start_height: i32) -> Result<VersionMessage> {
|
||||||
let recv_addr = socket.receiver_address();
|
let recv_addr = socket.receiver_address();
|
||||||
let send_addr = socket.sender_address();
|
let send_addr = socket.sender_address();
|
||||||
// If we are not connected, we might not be able to get these address.s
|
// If we are not connected, we might not be able to get these address.s
|
||||||
|
@ -88,7 +88,7 @@ impl_consensus_encoding!(VersionMessage, version, services, timestamp,
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::VersionMessage;
|
use super::VersionMessage;
|
||||||
|
|
||||||
use std::io::IoResult;
|
use std::io::Result;
|
||||||
use serialize::hex::FromHex;
|
use serialize::hex::FromHex;
|
||||||
|
|
||||||
use network::serialize::{deserialize, serialize};
|
use network::serialize::{deserialize, serialize};
|
||||||
|
@ -98,7 +98,7 @@ mod tests {
|
||||||
// This message is from my satoshi node, morning of May 27 2014
|
// This message is from my satoshi node, morning of May 27 2014
|
||||||
let from_sat = "721101000100000000000000e6e0845300000000010000000000000000000000000000000000ffff0000000000000100000000000000fd87d87eeb4364f22cf54dca59412db7208d47d920cffce83ee8102f5361746f7368693a302e392e39392f2c9f040001".from_hex().unwrap();
|
let from_sat = "721101000100000000000000e6e0845300000000010000000000000000000000000000000000ffff0000000000000100000000000000fd87d87eeb4364f22cf54dca59412db7208d47d920cffce83ee8102f5361746f7368693a302e392e39392f2c9f040001".from_hex().unwrap();
|
||||||
|
|
||||||
let decode: IoResult<VersionMessage> = deserialize(from_sat.clone());
|
let decode: Result<VersionMessage> = deserialize(from_sat.clone());
|
||||||
assert!(decode.is_ok());
|
assert!(decode.is_ok());
|
||||||
let real_decode = decode.unwrap();
|
let real_decode = decode.unwrap();
|
||||||
assert_eq!(real_decode.version, 70002);
|
assert_eq!(real_decode.version, 70002);
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
//!
|
//!
|
||||||
|
|
||||||
use collections::Vec;
|
use collections::Vec;
|
||||||
use std::io::{IoError, IoResult, OtherIoError, MemReader, MemWriter};
|
use std::io::{self, MemReader, MemWriter};
|
||||||
use serialize::hex::ToHex;
|
use serialize::hex::ToHex;
|
||||||
|
|
||||||
use network::encodable::{ConsensusDecodable, ConsensusEncodable};
|
use network::encodable::{ConsensusDecodable, ConsensusEncodable};
|
||||||
|
@ -39,20 +39,20 @@ impl BitcoinHash for Vec<u8> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Encode an object into a vector
|
/// Encode an object into a vector
|
||||||
pub fn serialize<T: ConsensusEncodable<RawEncoder<MemWriter>, IoError>>(obj: &T) -> IoResult<Vec<u8>> {
|
pub fn serialize<T: ConsensusEncodable<RawEncoder<MemWriter>, io::Error>>(obj: &T) -> io::Result<Vec<u8>> {
|
||||||
let mut encoder = RawEncoder::new(MemWriter::new());
|
let mut encoder = RawEncoder::new(MemWriter::new());
|
||||||
try!(obj.consensus_encode(&mut encoder));
|
try!(obj.consensus_encode(&mut encoder));
|
||||||
Ok(encoder.unwrap().unwrap())
|
Ok(encoder.unwrap().unwrap())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Encode an object into a hex-encoded string
|
/// Encode an object into a hex-encoded string
|
||||||
pub fn serialize_hex<T: ConsensusEncodable<RawEncoder<MemWriter>, IoError>>(obj: &T) -> IoResult<String> {
|
pub fn serialize_hex<T: ConsensusEncodable<RawEncoder<MemWriter>, io::Error>>(obj: &T) -> io::Result<String> {
|
||||||
let serial = try!(serialize(obj));
|
let serial = try!(serialize(obj));
|
||||||
Ok(serial.as_slice().to_hex())
|
Ok(serial.as_slice().to_hex())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Deserialize an object from a vector
|
/// Deserialize an object from a vector
|
||||||
pub fn deserialize<T: ConsensusDecodable<RawDecoder<MemReader>, IoError>>(data: Vec<u8>) -> IoResult<T> {
|
pub fn deserialize<T: ConsensusDecodable<RawDecoder<MemReader>, io::Error>>(data: Vec<u8>) -> io::Result<T> {
|
||||||
let mut decoder = RawDecoder::new(MemReader::new(data));
|
let mut decoder = RawDecoder::new(MemReader::new(data));
|
||||||
ConsensusDecodable::consensus_decode(&mut decoder)
|
ConsensusDecodable::consensus_decode(&mut decoder)
|
||||||
}
|
}
|
||||||
|
@ -144,55 +144,55 @@ pub trait SimpleDecoder<E> {
|
||||||
|
|
||||||
// TODO: trait reform: impl SimpleEncoder for every Encoder, ditto for Decoder
|
// TODO: trait reform: impl SimpleEncoder for every Encoder, ditto for Decoder
|
||||||
|
|
||||||
impl<W:Writer> SimpleEncoder<IoError> for RawEncoder<W> {
|
impl<W:Writer> SimpleEncoder<io::Error> for RawEncoder<W> {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn emit_u64(&mut self, v: u64) -> IoResult<()> { self.writer.write_le_u64(v) }
|
fn emit_u64(&mut self, v: u64) -> io::Result<()> { self.writer.write_le_u64(v) }
|
||||||
#[inline]
|
#[inline]
|
||||||
fn emit_u32(&mut self, v: u32) -> IoResult<()> { self.writer.write_le_u32(v) }
|
fn emit_u32(&mut self, v: u32) -> io::Result<()> { self.writer.write_le_u32(v) }
|
||||||
#[inline]
|
#[inline]
|
||||||
fn emit_u16(&mut self, v: u16) -> IoResult<()> { self.writer.write_le_u16(v) }
|
fn emit_u16(&mut self, v: u16) -> io::Result<()> { self.writer.write_le_u16(v) }
|
||||||
#[inline]
|
#[inline]
|
||||||
fn emit_u8(&mut self, v: u8) -> IoResult<()> { self.writer.write_u8(v) }
|
fn emit_u8(&mut self, v: u8) -> io::Result<()> { self.writer.write_u8(v) }
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn emit_i64(&mut self, v: i64) -> IoResult<()> { self.writer.write_le_i64(v) }
|
fn emit_i64(&mut self, v: i64) -> io::Result<()> { self.writer.write_le_i64(v) }
|
||||||
#[inline]
|
#[inline]
|
||||||
fn emit_i32(&mut self, v: i32) -> IoResult<()> { self.writer.write_le_i32(v) }
|
fn emit_i32(&mut self, v: i32) -> io::Result<()> { self.writer.write_le_i32(v) }
|
||||||
#[inline]
|
#[inline]
|
||||||
fn emit_i16(&mut self, v: i16) -> IoResult<()> { self.writer.write_le_i16(v) }
|
fn emit_i16(&mut self, v: i16) -> io::Result<()> { self.writer.write_le_i16(v) }
|
||||||
#[inline]
|
#[inline]
|
||||||
fn emit_i8(&mut self, v: i8) -> IoResult<()> { self.writer.write_i8(v) }
|
fn emit_i8(&mut self, v: i8) -> io::Result<()> { self.writer.write_i8(v) }
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn emit_bool(&mut self, v: bool) -> IoResult<()> { self.writer.write_i8(if v {1} else {0}) }
|
fn emit_bool(&mut self, v: bool) -> io::Result<()> { self.writer.write_i8(if v {1} else {0}) }
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<R:Reader> SimpleDecoder<IoError> for RawDecoder<R> {
|
impl<R:Reader> SimpleDecoder<io::Error> for RawDecoder<R> {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn read_u64(&mut self) -> IoResult<u64> { self.reader.read_le_u64() }
|
fn read_u64(&mut self) -> io::Result<u64> { self.reader.read_le_u64() }
|
||||||
#[inline]
|
#[inline]
|
||||||
fn read_u32(&mut self) -> IoResult<u32> { self.reader.read_le_u32() }
|
fn read_u32(&mut self) -> io::Result<u32> { self.reader.read_le_u32() }
|
||||||
#[inline]
|
#[inline]
|
||||||
fn read_u16(&mut self) -> IoResult<u16> { self.reader.read_le_u16() }
|
fn read_u16(&mut self) -> io::Result<u16> { self.reader.read_le_u16() }
|
||||||
#[inline]
|
#[inline]
|
||||||
fn read_u8(&mut self) -> IoResult<u8> { self.reader.read_u8() }
|
fn read_u8(&mut self) -> io::Result<u8> { self.reader.read_u8() }
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn read_i64(&mut self) -> IoResult<i64> { self.reader.read_le_i64() }
|
fn read_i64(&mut self) -> io::Result<i64> { self.reader.read_le_i64() }
|
||||||
#[inline]
|
#[inline]
|
||||||
fn read_i32(&mut self) -> IoResult<i32> { self.reader.read_le_i32() }
|
fn read_i32(&mut self) -> io::Result<i32> { self.reader.read_le_i32() }
|
||||||
#[inline]
|
#[inline]
|
||||||
fn read_i16(&mut self) -> IoResult<i16> { self.reader.read_le_i16() }
|
fn read_i16(&mut self) -> io::Result<i16> { self.reader.read_le_i16() }
|
||||||
#[inline]
|
#[inline]
|
||||||
fn read_i8(&mut self) -> IoResult<i8> { self.reader.read_i8() }
|
fn read_i8(&mut self) -> io::Result<i8> { self.reader.read_i8() }
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn read_bool(&mut self) -> IoResult<bool> { self.reader.read_u8().map(|res| res != 0) }
|
fn read_bool(&mut self) -> io::Result<bool> { self.reader.read_u8().map(|res| res != 0) }
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn error(&mut self, err: &str) -> IoError {
|
fn error(&mut self, err: &str) -> io::Error {
|
||||||
IoError {
|
io::Error {
|
||||||
kind: OtherIoError,
|
kind: io::ErrorKind::OtherError,
|
||||||
desc: "parse error",
|
desc: "parse error",
|
||||||
detail: Some(err.to_string())
|
detail: Some(err.to_string())
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,7 +21,7 @@ use time::now;
|
||||||
use std::rand::task_rng;
|
use std::rand::task_rng;
|
||||||
use rand::Rng;
|
use rand::Rng;
|
||||||
use std::io::{BufferedReader, BufferedWriter};
|
use std::io::{BufferedReader, BufferedWriter};
|
||||||
use std::io::{IoError, IoResult, NotConnected, OtherIoError, standard_error};
|
use std::io::{Error, Result, ErrorKind};
|
||||||
use std::io::net::{ip, tcp};
|
use std::io::net::{ip, tcp};
|
||||||
use std::sync::{Arc, Mutex};
|
use std::sync::{Arc, Mutex};
|
||||||
|
|
||||||
|
@ -86,7 +86,7 @@ impl Socket {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Connect to the peer
|
/// Connect to the peer
|
||||||
pub fn connect(&mut self, host: &str, port: u16) -> IoResult<()> {
|
pub fn connect(&mut self, host: &str, port: u16) -> Result<()> {
|
||||||
// Boot off any lingering readers or writers
|
// Boot off any lingering readers or writers
|
||||||
if self.socket.is_some() {
|
if self.socket.is_some() {
|
||||||
let _ = self.socket.as_mut().unwrap().close_read();
|
let _ = self.socket.as_mut().unwrap().close_read();
|
||||||
|
@ -107,7 +107,7 @@ impl Socket {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Peer address
|
/// Peer address
|
||||||
pub fn receiver_address(&mut self) -> IoResult<Address> {
|
pub fn receiver_address(&mut self) -> Result<Address> {
|
||||||
match self.socket {
|
match self.socket {
|
||||||
Some(ref mut s) => match s.peer_name() {
|
Some(ref mut s) => match s.peer_name() {
|
||||||
Ok(addr) => {
|
Ok(addr) => {
|
||||||
|
@ -119,12 +119,13 @@ impl Socket {
|
||||||
}
|
}
|
||||||
Err(e) => Err(e)
|
Err(e) => Err(e)
|
||||||
},
|
},
|
||||||
None => Err(standard_error(NotConnected))
|
None => Err(Error::new(ErrorKind::NotConnected,
|
||||||
|
"receiver_address: not connected to peer", None))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Our own address
|
/// Our own address
|
||||||
pub fn sender_address(&mut self) -> IoResult<Address> {
|
pub fn sender_address(&mut self) -> Result<Address> {
|
||||||
match self.socket {
|
match self.socket {
|
||||||
Some(ref mut s) => match s.socket_name() {
|
Some(ref mut s) => match s.socket_name() {
|
||||||
Ok(addr) => {
|
Ok(addr) => {
|
||||||
|
@ -136,12 +137,13 @@ impl Socket {
|
||||||
}
|
}
|
||||||
Err(e) => Err(e)
|
Err(e) => Err(e)
|
||||||
},
|
},
|
||||||
None => Err(standard_error(NotConnected))
|
None => Err(Error::new(ErrorKind::NotConnected,
|
||||||
|
"sender_address: not connected to peer", None))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Produce a version message appropriate for this socket
|
/// Produce a version message appropriate for this socket
|
||||||
pub fn version_message(&mut self, start_height: i32) -> IoResult<NetworkMessage> {
|
pub fn version_message(&mut self, start_height: i32) -> Result<NetworkMessage> {
|
||||||
let timestamp = now().to_timespec().sec;
|
let timestamp = now().to_timespec().sec;
|
||||||
let recv_addr = self.receiver_address();
|
let recv_addr = self.receiver_address();
|
||||||
let send_addr = self.sender_address();
|
let send_addr = self.sender_address();
|
||||||
|
@ -169,10 +171,11 @@ impl Socket {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Send a general message across the line
|
/// Send a general message across the line
|
||||||
pub fn send_message(&mut self, payload: NetworkMessage) -> IoResult<()> {
|
pub fn send_message(&mut self, payload: NetworkMessage) -> Result<()> {
|
||||||
let mut writer_lock = self.buffered_writer.lock();
|
let mut writer_lock = self.buffered_writer.lock();
|
||||||
match *writer_lock.deref_mut() {
|
match *writer_lock.deref_mut() {
|
||||||
None => Err(standard_error(NotConnected)),
|
None => Err(Error::new(ErrorKind::NotConnected,
|
||||||
|
"send_message: not connected to peer", None)),
|
||||||
Some(ref mut writer) => {
|
Some(ref mut writer) => {
|
||||||
let message = RawNetworkMessage { magic: self.magic, payload: payload };
|
let message = RawNetworkMessage { magic: self.magic, payload: payload };
|
||||||
try!(message.consensus_encode(&mut RawEncoder::new(writer.by_ref())));
|
try!(message.consensus_encode(&mut RawEncoder::new(writer.by_ref())));
|
||||||
|
@ -183,15 +186,16 @@ impl Socket {
|
||||||
|
|
||||||
/// Receive the next message from the peer, decoding the network header
|
/// Receive the next message from the peer, decoding the network header
|
||||||
/// and verifying its correctness. Returns the undecoded payload.
|
/// and verifying its correctness. Returns the undecoded payload.
|
||||||
pub fn receive_message(&mut self) -> IoResult<NetworkMessage> {
|
pub fn receive_message(&mut self) -> Result<NetworkMessage> {
|
||||||
let mut reader_lock = self.buffered_reader.lock();
|
let mut reader_lock = self.buffered_reader.lock();
|
||||||
match *reader_lock.deref_mut() {
|
match *reader_lock.deref_mut() {
|
||||||
None => Err(standard_error(NotConnected)),
|
None => Err(Error::new(ErrorKind::NotConnected,
|
||||||
|
"receive_message: not connected to peer", None)),
|
||||||
Some(ref mut buf) => {
|
Some(ref mut buf) => {
|
||||||
// We need a new scope since the closure in here borrows read_err,
|
// We need a new scope since the closure in here borrows read_err,
|
||||||
// and we try to read it afterward. Letting `iter` go out fixes it.
|
// and we try to read it afterward. Letting `iter` go out fixes it.
|
||||||
let mut decoder = RawDecoder::new(buf.by_ref());
|
let mut decoder = RawDecoder::new(buf.by_ref());
|
||||||
let decode: IoResult<RawNetworkMessage> = ConsensusDecodable::consensus_decode(&mut decoder);
|
let decode: Result<RawNetworkMessage> = ConsensusDecodable::consensus_decode(&mut decoder);
|
||||||
match decode {
|
match decode {
|
||||||
// Check for parse errors...
|
// Check for parse errors...
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
|
@ -201,8 +205,8 @@ impl Socket {
|
||||||
// Then for magic (this should come before parse error, but we can't
|
// Then for magic (this should come before parse error, but we can't
|
||||||
// get to it if the deserialization failed). TODO restructure this
|
// get to it if the deserialization failed). TODO restructure this
|
||||||
if ret.magic != self.magic {
|
if ret.magic != self.magic {
|
||||||
Err(IoError {
|
Err(Error {
|
||||||
kind: OtherIoError,
|
kind: ErrorKind::OtherError,
|
||||||
desc: "bad magic",
|
desc: "bad magic",
|
||||||
detail: Some(format!("got magic {:x}, expected {:x}", ret.magic, self.magic)),
|
detail: Some(format!("got magic {:x}, expected {:x}", ret.magic, self.magic)),
|
||||||
})
|
})
|
||||||
|
|
|
@ -16,16 +16,16 @@
|
||||||
//!
|
//!
|
||||||
//! Various utility functions
|
//! Various utility functions
|
||||||
|
|
||||||
use std::io::IoError;
|
use std::io;
|
||||||
|
|
||||||
/// A success/failure return value
|
/// A success/failure return value
|
||||||
pub type BitcoinResult<T> = Result<T, BitcoinError>;
|
pub type Result<T> = Result<T, Error>;
|
||||||
|
|
||||||
/// A general error code
|
/// A general error code
|
||||||
#[derive(PartialEq, Eq, Debug, Clone)]
|
#[derive(PartialEq, Eq, Debug, Clone)]
|
||||||
pub enum BitcoinError {
|
pub enum Error {
|
||||||
/// An I/O error
|
/// An I/O error
|
||||||
InputOutput(IoError),
|
InputOutput(io::Error),
|
||||||
/// An object was attempted to be added twice
|
/// An object was attempted to be added twice
|
||||||
DuplicateHash,
|
DuplicateHash,
|
||||||
/// Some operation was attempted on a block (or blockheader) that doesn't exist
|
/// Some operation was attempted on a block (or blockheader) that doesn't exist
|
||||||
|
|
|
@ -16,14 +16,14 @@
|
||||||
//!
|
//!
|
||||||
//! Various utility functions
|
//! Various utility functions
|
||||||
|
|
||||||
use std::io::{IoError, IoResult, InvalidInput};
|
use std::io::{Error, Result, ErrorKind};
|
||||||
|
|
||||||
use blockdata::opcodes;
|
use blockdata::opcodes;
|
||||||
use blockdata::opcodes::all::Opcode;
|
use blockdata::opcodes::all::Opcode;
|
||||||
use util::iter::Pairable;
|
use util::iter::Pairable;
|
||||||
|
|
||||||
/// Convert a hexadecimal-encoded string to its corresponding bytes
|
/// Convert a hexadecimal-encoded string to its corresponding bytes
|
||||||
pub fn hex_bytes(s: &str) -> IoResult<Vec<u8>> {
|
pub fn hex_bytes(s: &str) -> Result<Vec<u8>> {
|
||||||
let mut v = vec![];
|
let mut v = vec![];
|
||||||
let mut iter = s.chars().pair();
|
let mut iter = s.chars().pair();
|
||||||
// Do the parsing
|
// Do the parsing
|
||||||
|
@ -31,13 +31,13 @@ pub fn hex_bytes(s: &str) -> IoResult<Vec<u8>> {
|
||||||
if e.is_err() { return e; }
|
if e.is_err() { return e; }
|
||||||
else {
|
else {
|
||||||
match (f.to_digit(16), s.to_digit(16)) {
|
match (f.to_digit(16), s.to_digit(16)) {
|
||||||
(None, _) => return Err(IoError {
|
(None, _) => return Err(Error {
|
||||||
kind: InvalidInput,
|
kind: ErrorKind::InvalidInput,
|
||||||
desc: "invalid hex character",
|
desc: "invalid hex character",
|
||||||
detail: Some(format!("expected hex, got {:}", f))
|
detail: Some(format!("expected hex, got {:}", f))
|
||||||
}),
|
}),
|
||||||
(_, None) => return Err(IoError {
|
(_, None) => return Err(Error {
|
||||||
kind: InvalidInput,
|
kind: ErrorKind::InvalidInput,
|
||||||
desc: "invalid hex character",
|
desc: "invalid hex character",
|
||||||
detail: Some(format!("expected hex, got {:}", s))
|
detail: Some(format!("expected hex, got {:}", s))
|
||||||
}),
|
}),
|
||||||
|
@ -47,8 +47,8 @@ pub fn hex_bytes(s: &str) -> IoResult<Vec<u8>> {
|
||||||
));
|
));
|
||||||
// Check that there was no remainder
|
// Check that there was no remainder
|
||||||
match iter.remainder() {
|
match iter.remainder() {
|
||||||
Some(_) => Err(IoError {
|
Some(_) => Err(Error {
|
||||||
kind: InvalidInput,
|
kind: ErrorKind::InvalidInput,
|
||||||
desc: "hexstring of odd length",
|
desc: "hexstring of odd length",
|
||||||
detail: None
|
detail: None
|
||||||
}),
|
}),
|
||||||
|
@ -57,9 +57,9 @@ pub fn hex_bytes(s: &str) -> IoResult<Vec<u8>> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Prepend the detail of an IoResult's error with some text to get poor man's backtracing
|
/// Prepend the detail of an IoResult's error with some text to get poor man's backtracing
|
||||||
pub fn prepend_err<T>(s: &str, res: IoResult<T>) -> IoResult<T> {
|
pub fn prepend_err<T>(s: &str, res: Result<T>) -> Result<T> {
|
||||||
res.map_err(|err| {
|
res.map_err(|err| {
|
||||||
IoError {
|
Error {
|
||||||
kind: err.kind,
|
kind: err.kind,
|
||||||
desc: err.desc,
|
desc: err.desc,
|
||||||
detail: Some(format!("{}: {}", s, match err.detail { Some(s) => s, None => String::new() }))
|
detail: Some(format!("{}: {}", s, match err.detail { Some(s) => s, None => String::new() }))
|
||||||
|
@ -68,7 +68,7 @@ pub fn prepend_err<T>(s: &str, res: IoResult<T>) -> IoResult<T> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Dump an error message to the screen
|
/// Dump an error message to the screen
|
||||||
pub fn consume_err<T>(s: &str, res: IoResult<T>) {
|
pub fn consume_err<T>(s: &str, res: Result<T>) {
|
||||||
match res {
|
match res {
|
||||||
Ok(_) => {},
|
Ok(_) => {},
|
||||||
Err(e) => { println!("{}: {}", s, e); }
|
Err(e) => { println!("{}: {}", s, e); }
|
||||||
|
|
|
@ -310,10 +310,10 @@ macro_rules! construct_uint {
|
||||||
|
|
||||||
impl fmt::Debug for $name {
|
impl fmt::Debug for $name {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
use std::fmt::WriteError;
|
use std::fmt::Error;
|
||||||
use network::encodable::ConsensusEncodable;
|
use network::encodable::ConsensusEncodable;
|
||||||
let mut encoder = RawEncoder::new(f.by_ref());
|
let mut encoder = RawEncoder::new(f.by_ref());
|
||||||
self.consensus_encode(&mut encoder).map_err(|_| WriteError)
|
self.consensus_encode(&mut encoder).map_err(|_| Error)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue