From 83edef4806773ef7225b7c0de863c44bd953169d Mon Sep 17 00:00:00 2001 From: nym21 Date: Wed, 1 Apr 2026 21:54:02 +0200 Subject: [PATCH] coinbase: lossy to latin --- crates/brk_query/src/impl/block/info.rs | 2 +- crates/brk_types/src/coinbase_tag.rs | 22 ++++++++++++++++++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/crates/brk_query/src/impl/block/info.rs b/crates/brk_query/src/impl/block/info.rs index 9b61ddf48..ddc5428f5 100644 --- a/crates/brk_query/src/impl/block/info.rs +++ b/crates/brk_query/src/impl/block/info.rs @@ -463,7 +463,7 @@ impl Query { let coinbase_signature_ascii = tx .input .first() - .map(|input| String::from_utf8_lossy(input.script_sig.as_bytes()).to_string()) + .map(|input| input.script_sig.as_bytes().iter().map(|&b| b as char).collect::()) .unwrap_or_default(); let coinbase_addresses: Vec = tx diff --git a/crates/brk_types/src/coinbase_tag.rs b/crates/brk_types/src/coinbase_tag.rs index 088c9ef77..0c768f9e7 100644 --- a/crates/brk_types/src/coinbase_tag.rs +++ b/crates/brk_types/src/coinbase_tag.rs @@ -33,11 +33,11 @@ impl Bytes for CoinbaseTag { } impl CoinbaseTag { - /// Returns the tag as a UTF-8 string (lossy). + /// Returns the tag as a string, decoding each byte as its latin-1/Unicode codepoint. #[inline] - pub fn as_str(&self) -> std::borrow::Cow<'_, str> { + pub fn as_str(&self) -> String { let len = (self.0[0] as usize).min(100); - String::from_utf8_lossy(&self.0[1..1 + len]) + self.0[1..1 + len].iter().map(|&b| b as char).collect() } } @@ -73,7 +73,21 @@ impl Formattable for CoinbaseTag { fn fmt_json(&self, buf: &mut Vec) { buf.push(b'"'); - buf.extend_from_slice(self.as_str().as_bytes()); + for &b in self.as_str().as_bytes() { + match b { + b'"' => buf.extend_from_slice(b"\\\""), + b'\\' => buf.extend_from_slice(b"\\\\"), + b'\n' => buf.extend_from_slice(b"\\n"), + b'\r' => buf.extend_from_slice(b"\\r"), + b'\t' => buf.extend_from_slice(b"\\t"), + 0x00..=0x1f => { + buf.extend_from_slice(b"\\u00"); + buf.push(b"0123456789abcdef"[(b >> 4) as usize]); + buf.push(b"0123456789abcdef"[(b & 0xf) as usize]); + } + _ => buf.push(b), + } + } buf.push(b'"'); } }