Make String Zcash serialization consistent with deserialization

After recent changes, serialization was `write_string`, but
deserialization was `zcash_deserialize`.
This commit is contained in:
teor 2021-04-22 08:56:09 +10:00 committed by Deirdre Connolly
parent 5b2f1cdfd5
commit 7b13d5573a
3 changed files with 19 additions and 10 deletions

View File

@ -71,13 +71,6 @@ pub trait WriteZcashExt: io::Write {
self.write_u16::<BigEndian>(addr.port())
}
/// Write a string in Bitcoin format.
#[inline]
fn write_string(&mut self, string: &str) -> io::Result<()> {
self.write_compactsize(string.len() as u64)?;
self.write_all(string.as_bytes())
}
/// Convenience method to write exactly 32 u8's.
#[inline]
fn write_32_bytes(&mut self, bytes: &[u8; 32]) -> io::Result<()> {

View File

@ -99,6 +99,22 @@ pub fn zcash_serialize_bytes_external_count<W: io::Write>(
writer.write_all(&vec)
}
/// Write a Bitcoin-encoded UTF-8 `&str`.
impl ZcashSerialize for &str {
fn zcash_serialize<W: io::Write>(&self, mut writer: W) -> Result<(), io::Error> {
let str_bytes = self.as_bytes();
writer.write_compactsize(str_bytes.len() as u64)?;
writer.write_all(str_bytes)
}
}
/// Write a Bitcoin-encoded UTF-8 `String`.
impl ZcashSerialize for String {
fn zcash_serialize<W: io::Write>(&self, mut writer: W) -> Result<(), io::Error> {
self.as_str().zcash_serialize(&mut writer)
}
}
/// The maximum length of a Zcash message, in bytes.
///
/// This value is used to calculate safe preallocation limits for some types

View File

@ -228,7 +228,7 @@ impl Codec {
writer.write_socket_addr(*from_addr)?;
writer.write_u64::<LittleEndian>(nonce.0)?;
writer.write_string(&user_agent)?;
user_agent.zcash_serialize(&mut writer)?;
writer.write_u32::<LittleEndian>(start_height.0)?;
writer.write_u8(*relay as u8)?;
}
@ -245,9 +245,9 @@ impl Codec {
reason,
data,
} => {
writer.write_string(&message)?;
message.zcash_serialize(&mut writer)?;
writer.write_u8(*ccode as u8)?;
writer.write_string(&reason)?;
reason.zcash_serialize(&mut writer)?;
if let Some(data) = data {
writer.write_all(data)?;
}