From 42b6bd1ad3ac7932ab801fed729d2e45574c5be6 Mon Sep 17 00:00:00 2001 From: Santiago Carmuega Date: Sun, 6 Feb 2022 19:51:07 -0300 Subject: [PATCH] feat: Add option to include raw block cbor (#127) --- src/mapper/crawl.rs | 21 ++++++++++++++++++--- src/mapper/map.rs | 11 ++++++++++- src/mapper/prelude.rs | 3 +++ src/model.rs | 1 + src/sources/n2c/run.rs | 8 ++++---- src/sources/n2n/run.rs | 2 +- 6 files changed, 37 insertions(+), 9 deletions(-) diff --git a/src/mapper/crawl.rs b/src/mapper/crawl.rs index cd8f6fe1..805feb4c 100644 --- a/src/mapper/crawl.rs +++ b/src/mapper/crawl.rs @@ -191,8 +191,8 @@ impl EventWriter { Ok(()) } - fn crawl_block(&self, block: &Block, hash: &Hash<32>) -> Result<(), Error> { - let record = self.to_block_record(block, hash)?; + fn crawl_block(&self, block: &Block, hash: &Hash<32>, cbor: &[u8]) -> Result<(), Error> { + let record = self.to_block_record(block, hash, cbor)?; self.append(EventData::Block(record.clone()))?; @@ -221,6 +221,21 @@ impl EventWriter { Ok(()) } + pub fn crawl_with_cbor(&self, block: &Block, cbor: &[u8]) -> Result<(), Error> { + let hash = crypto::hash_block_header(&block.header); + + let child = self.child_writer(EventContext { + block_hash: Some(hex::encode(&hash)), + block_number: Some(block.header.header_body.block_number), + slot: Some(block.header.header_body.slot), + timestamp: self.compute_timestamp(block.header.header_body.slot), + ..EventContext::default() + }); + + child.crawl_block(block, &hash, cbor) + } + + #[deprecated(note = "use crawl_with_cbor instead")] pub fn crawl(&self, block: &Block) -> Result<(), Error> { let hash = crypto::hash_block_header(&block.header); @@ -232,6 +247,6 @@ impl EventWriter { ..EventContext::default() }); - child.crawl_block(block, &hash) + child.crawl_block(block, &hash, &[]) } } diff --git a/src/mapper/map.rs b/src/mapper/map.rs index 00477fb2..13b81195 100644 --- a/src/mapper/map.rs +++ b/src/mapper/map.rs @@ -348,7 +348,12 @@ impl EventWriter { Ok(record) } - pub fn to_block_record(&self, source: &Block, hash: &Hash<32>) -> Result { + pub fn to_block_record( + &self, + source: &Block, + hash: &Hash<32>, + cbor: &[u8], + ) -> Result { Ok(BlockRecord { body_size: source.header.header_body.block_body_size as usize, issuer_vkey: source.header.header_body.issuer_vkey.to_hex(), @@ -357,6 +362,10 @@ impl EventWriter { number: source.header.header_body.block_number, slot: source.header.header_body.slot, previous_hash: hex::encode(source.header.header_body.prev_hash), + cbor_hex: match self.config.include_block_cbor { + true => hex::encode(cbor).into(), + false => None, + }, }) } } diff --git a/src/mapper/prelude.rs b/src/mapper/prelude.rs index 949a4157..8f201466 100644 --- a/src/mapper/prelude.rs +++ b/src/mapper/prelude.rs @@ -23,6 +23,9 @@ pub struct Config { #[serde(default)] pub include_transaction_end_events: bool, + + #[serde(default)] + pub include_block_cbor: bool, } #[derive(Clone)] diff --git a/src/model.rs b/src/model.rs index 71cfca68..ee59e765 100644 --- a/src/model.rs +++ b/src/model.rs @@ -166,6 +166,7 @@ pub struct BlockRecord { pub hash: String, pub number: u64, pub previous_hash: String, + pub cbor_hex: Option, } #[derive(Serialize, Deserialize, Display, Debug, Clone)] diff --git a/src/sources/n2c/run.rs b/src/sources/n2c/run.rs index 8f0ca480..91b329ae 100644 --- a/src/sources/n2c/run.rs +++ b/src/sources/n2c/run.rs @@ -17,7 +17,7 @@ use pallas::{ use crate::{mapper::EventWriter, model::EventData, utils::SwallowResult, Error}; #[derive(Debug)] -struct Content(Block); +struct Content(Block, Vec); impl EncodePayload for Content { fn encode_payload(&self, _e: &mut PayloadEncoder) -> Result<(), Box> { @@ -30,7 +30,7 @@ impl DecodePayload for Content { d.tag()?; let bytes = d.bytes()?; let BlockWrapper(_, block) = BlockWrapper::decode_fragment(bytes)?; - Ok(Content(block)) + Ok(Content(block, Vec::from(bytes))) } } @@ -63,10 +63,10 @@ impl Observer for ChainObserver { content: &Content, ) -> Result<(), Box> { let Self(writer) = self; - let Content(block) = content; + let Content(block, cbor) = content; writer - .crawl(block) + .crawl_with_cbor(block, cbor) .ok_or_warn("error crawling block for events"); Ok(()) diff --git a/src/sources/n2n/run.rs b/src/sources/n2n/run.rs index dc9afb99..62319cd0 100644 --- a/src/sources/n2n/run.rs +++ b/src/sources/n2n/run.rs @@ -69,7 +69,7 @@ impl BlockObserver for Block2EventMapper { let Self(writer) = self; writer - .crawl(&block) + .crawl_with_cbor(&block, &body) .ok_or_warn("error crawling block for events"); } Err(err) => {