diff --git a/zebra-network/src/protocol/codec.rs b/zebra-network/src/protocol/codec.rs index 8fcfcfb31..5feb693ab 100644 --- a/zebra-network/src/protocol/codec.rs +++ b/zebra-network/src/protocol/codec.rs @@ -286,26 +286,26 @@ impl Decoder for Codec { let body_reader = Cursor::new(&body); let v = self.builder.version; match &command { - b"version\0\0\0\0\0" => try_read_version(body_reader, v), - b"verack\0\0\0\0\0\0" => try_read_verack(body_reader, v), - b"ping\0\0\0\0\0\0\0\0" => try_read_ping(body_reader, v), - b"pong\0\0\0\0\0\0\0\0" => try_read_pong(body_reader, v), - b"reject\0\0\0\0\0\0" => try_read_reject(body_reader, v), - b"addr\0\0\0\0\0\0\0\0" => try_read_addr(body_reader, v), - b"getaddr\0\0\0\0\0" => try_read_getaddr(body_reader, v), - b"block\0\0\0\0\0\0\0" => try_read_block(body_reader, v), - b"getblocks\0\0\0" => try_read_getblocks(body_reader, v), - b"headers\0\0\0\0\0" => try_read_headers(body_reader, v), - b"getheaders\0\0" => try_read_getheaders(body_reader, v), - b"inv\0\0\0\0\0\0\0\0\0" => try_read_inv(body_reader, v), - b"getdata\0\0\0\0\0" => try_read_getdata(body_reader, v), - b"notfound\0\0\0\0" => try_read_notfound(body_reader, v), - b"tx\0\0\0\0\0\0\0\0\0\0" => try_read_tx(body_reader, v), - b"mempool\0\0\0\0\0" => try_read_mempool(body_reader, v), - b"filterload\0\0" => try_read_filterload(body_reader, v), - b"filteradd\0\0\0" => try_read_filteradd(body_reader, v), - b"filterclear\0" => try_read_filterclear(body_reader, v), - b"merkleblock\0" => try_read_merkleblock(body_reader, v), + b"version\0\0\0\0\0" => self.read_version(body_reader), + b"verack\0\0\0\0\0\0" => self.read_verack(body_reader), + b"ping\0\0\0\0\0\0\0\0" => self.read_ping(body_reader), + b"pong\0\0\0\0\0\0\0\0" => self.read_pong(body_reader), + b"reject\0\0\0\0\0\0" => self.read_reject(body_reader), + b"addr\0\0\0\0\0\0\0\0" => self.read_addr(body_reader), + b"getaddr\0\0\0\0\0" => self.read_getaddr(body_reader), + b"block\0\0\0\0\0\0\0" => self.read_block(body_reader), + b"getblocks\0\0\0" => self.read_getblocks(body_reader), + b"headers\0\0\0\0\0" => self.read_headers(body_reader), + b"getheaders\0\0" => self.read_getheaders(body_reader), + b"inv\0\0\0\0\0\0\0\0\0" => self.read_inv(body_reader), + b"getdata\0\0\0\0\0" => self.read_getdata(body_reader), + b"notfound\0\0\0\0" => self.read_notfound(body_reader), + b"tx\0\0\0\0\0\0\0\0\0\0" => self.read_tx(body_reader), + b"mempool\0\0\0\0\0" => self.read_mempool(body_reader), + b"filterload\0\0" => self.read_filterload(body_reader), + b"filteradd\0\0\0" => self.read_filteradd(body_reader), + b"filterclear\0" => self.read_filterclear(body_reader), + b"merkleblock\0" => self.read_merkleblock(body_reader), _ => bail!("unknown command"), } // We need Ok(Some(msg)) to signal that we're done decoding @@ -315,136 +315,122 @@ impl Decoder for Codec { } } -fn try_read_version(mut reader: R, _parsing_version: Version) -> Result { - Ok(Message::Version { - version: Version(reader.read_u32::()?), - services: Services(reader.read_u64::()?), - timestamp: Utc.timestamp(reader.read_i64::()?, 0), - address_recv: ( - Services(reader.read_u64::()?), - reader.read_socket_addr()?, - ), - address_from: ( - Services(reader.read_u64::()?), - reader.read_socket_addr()?, - ), - nonce: Nonce(reader.read_u64::()?), - user_agent: reader.read_string()?, - start_height: BlockHeight(reader.read_u32::()?), - relay: match reader.read_u8()? { - 0 => false, - 1 => true, - _ => bail!("non-bool value supplied in relay field"), - }, - }) -} +impl Codec { + fn read_version(&self, mut reader: R) -> Result { + Ok(Message::Version { + version: Version(reader.read_u32::()?), + services: Services(reader.read_u64::()?), + timestamp: Utc.timestamp(reader.read_i64::()?, 0), + address_recv: ( + Services(reader.read_u64::()?), + reader.read_socket_addr()?, + ), + address_from: ( + Services(reader.read_u64::()?), + reader.read_socket_addr()?, + ), + nonce: Nonce(reader.read_u64::()?), + user_agent: reader.read_string()?, + start_height: BlockHeight(reader.read_u32::()?), + relay: match reader.read_u8()? { + 0 => false, + 1 => true, + _ => bail!("non-bool value supplied in relay field"), + }, + }) + } -fn try_read_verack(mut _reader: R, _version: Version) -> Result { - Ok(Message::Verack) -} + fn read_verack(&self, mut _reader: R) -> Result { + Ok(Message::Verack) + } -fn try_read_ping(mut reader: R, _version: Version) -> Result { - Ok(Message::Ping(Nonce(reader.read_u64::()?))) -} + fn read_ping(&self, mut reader: R) -> Result { + Ok(Message::Ping(Nonce(reader.read_u64::()?))) + } -fn try_read_pong(mut reader: R, _version: Version) -> Result { - Ok(Message::Pong(Nonce(reader.read_u64::()?))) -} + fn read_pong(&self, mut reader: R) -> Result { + Ok(Message::Pong(Nonce(reader.read_u64::()?))) + } -#[instrument(level = "trace", skip(_reader, _version))] -fn try_read_reject(mut _reader: R, _version: Version) -> Result { - trace!("reject"); - bail!("unimplemented message type") -} + fn read_reject(&self, mut _reader: R) -> Result { + trace!("reject"); + bail!("unimplemented message type") + } -#[instrument(level = "trace", skip(_reader, _version))] -fn try_read_addr(mut _reader: R, _version: Version) -> Result { - trace!("addr"); - bail!("unimplemented message type") -} + fn read_addr(&self, mut _reader: R) -> Result { + trace!("addr"); + bail!("unimplemented message type") + } -#[instrument(level = "trace", skip(_reader, _version))] -fn try_read_getaddr(mut _reader: R, _version: Version) -> Result { - trace!("getaddr"); - bail!("unimplemented message type") -} + fn read_getaddr(&self, mut _reader: R) -> Result { + trace!("getaddr"); + bail!("unimplemented message type") + } -#[instrument(level = "trace", skip(_reader, _version))] -fn try_read_block(mut _reader: R, _version: Version) -> Result { - trace!("block"); - bail!("unimplemented message type") -} + fn read_block(&self, mut _reader: R) -> Result { + trace!("block"); + bail!("unimplemented message type") + } -#[instrument(level = "trace", skip(_reader, _version))] -fn try_read_getblocks(mut _reader: R, _version: Version) -> Result { - trace!("getblocks"); - bail!("unimplemented message type") -} + fn read_getblocks(&self, mut _reader: R) -> Result { + trace!("getblocks"); + bail!("unimplemented message type") + } -#[instrument(level = "trace", skip(_reader, _version))] -fn try_read_headers(mut _reader: R, _version: Version) -> Result { - trace!("headers"); - bail!("unimplemented message type") -} + fn read_headers(&self, mut _reader: R) -> Result { + trace!("headers"); + bail!("unimplemented message type") + } -#[instrument(level = "trace", skip(_reader, _version))] -fn try_read_getheaders(mut _reader: R, _version: Version) -> Result { - trace!("getheaders"); - bail!("unimplemented message type") -} + fn read_getheaders(&self, mut _reader: R) -> Result { + trace!("getheaders"); + bail!("unimplemented message type") + } -#[instrument(level = "trace", skip(_reader, _version))] -fn try_read_inv(mut _reader: R, _version: Version) -> Result { - trace!("inv"); - bail!("unimplemented message type") -} + fn read_inv(&self, mut _reader: R) -> Result { + trace!("inv"); + bail!("unimplemented message type") + } -#[instrument(level = "trace", skip(_reader, _version))] -fn try_read_getdata(mut _reader: R, _version: Version) -> Result { - trace!("getdata"); - bail!("unimplemented message type") -} + fn read_getdata(&self, mut _reader: R) -> Result { + trace!("getdata"); + bail!("unimplemented message type") + } -#[instrument(level = "trace", skip(_reader, _version))] -fn try_read_notfound(mut _reader: R, _version: Version) -> Result { - trace!("notfound"); - bail!("unimplemented message type") -} + fn read_notfound(&self, mut _reader: R) -> Result { + trace!("notfound"); + bail!("unimplemented message type") + } -#[instrument(level = "trace", skip(_reader, _version))] -fn try_read_tx(mut _reader: R, _version: Version) -> Result { - trace!("tx"); - bail!("unimplemented message type") -} + fn read_tx(&self, mut _reader: R) -> Result { + trace!("tx"); + bail!("unimplemented message type") + } -#[instrument(level = "trace", skip(_reader, _version))] -fn try_read_mempool(mut _reader: R, _version: Version) -> Result { - trace!("mempool"); - bail!("unimplemented message type") -} + fn read_mempool(&self, mut _reader: R) -> Result { + trace!("mempool"); + bail!("unimplemented message type") + } -#[instrument(level = "trace", skip(_reader, _version))] -fn try_read_filterload(mut _reader: R, _version: Version) -> Result { - trace!("filterload"); - bail!("unimplemented message type") -} + fn read_filterload(&self, mut _reader: R) -> Result { + trace!("filterload"); + bail!("unimplemented message type") + } -#[instrument(level = "trace", skip(_reader, _version))] -fn try_read_filteradd(mut _reader: R, _version: Version) -> Result { - trace!("filteradd"); - bail!("unimplemented message type") -} + fn read_filteradd(&self, mut _reader: R) -> Result { + trace!("filteradd"); + bail!("unimplemented message type") + } -#[instrument(level = "trace", skip(_reader, _version))] -fn try_read_filterclear(mut _reader: R, _version: Version) -> Result { - trace!("filterclear"); - bail!("unimplemented message type") -} + fn read_filterclear(&self, mut _reader: R) -> Result { + trace!("filterclear"); + bail!("unimplemented message type") + } -#[instrument(level = "trace", skip(_reader, _version))] -fn try_read_merkleblock(mut _reader: R, _version: Version) -> Result { - trace!("merkleblock"); - bail!("unimplemented message type") + fn read_merkleblock(&self, mut _reader: R) -> Result { + trace!("merkleblock"); + bail!("unimplemented message type") + } } // XXX replace these interior unit tests with exterior integration tests + proptest