diff --git a/examples/n2c-miniprotocols/src/main.rs b/examples/n2c-miniprotocols/src/main.rs index 3a656c8..c0afb3a 100644 --- a/examples/n2c-miniprotocols/src/main.rs +++ b/examples/n2c-miniprotocols/src/main.rs @@ -68,6 +68,13 @@ async fn do_localstate_query(client: &mut NodeClient) { let result = queries_v16::get_genesis_config(client, era).await.unwrap(); println!("result: {:?}", result); + // Ensure decoding across version disparities by always receiving a valid + // response using the wrap function for the query result with CBOR-in-CBOR + // concept. + let query = queries_v16::BlockQuery::GetCurrentPParams; + let result = queries_v16::get_cbor(client, era, query).await.unwrap(); + println!("result: {:?}", result); + client.send_release().await.unwrap(); } diff --git a/pallas-network/src/miniprotocols/localstate/queries_v16/codec.rs b/pallas-network/src/miniprotocols/localstate/queries_v16/codec.rs index 611a10f..a005606 100644 --- a/pallas-network/src/miniprotocols/localstate/queries_v16/codec.rs +++ b/pallas-network/src/miniprotocols/localstate/queries_v16/codec.rs @@ -138,7 +138,7 @@ impl<'b> Decode<'b, ()> for BlockQuery { 6 => Ok(Self::GetUTxOByAddress(d.decode()?)), // 7 => Ok(Self::GetUTxOWhole), // 8 => Ok(Self::DebugEpochState), - // 9 => Ok(Self::GetCBOR(())), + 9 => Ok(Self::GetCBOR(d.decode()?)), // 10 => Ok(Self::GetFilteredDelegationsAndRewardAccounts(())), 11 => Ok(Self::GetGenesisConfig), // 12 => Ok(Self::DebugNewEpochState), diff --git a/pallas-network/src/miniprotocols/localstate/queries_v16/mod.rs b/pallas-network/src/miniprotocols/localstate/queries_v16/mod.rs index f4ccdd0..159177e 100644 --- a/pallas-network/src/miniprotocols/localstate/queries_v16/mod.rs +++ b/pallas-network/src/miniprotocols/localstate/queries_v16/mod.rs @@ -31,7 +31,7 @@ pub enum BlockQuery { GetUTxOByAddress(Addrs), GetUTxOWhole, DebugEpochState, - GetCBOR(AnyCbor), + GetCBOR(Box), GetFilteredDelegationsAndRewardAccounts(AnyCbor), GetGenesisConfig, DebugNewEpochState, @@ -435,6 +435,19 @@ pub async fn get_stake_snapshots( Ok(result) } +pub async fn get_cbor( + client: &mut Client, + era: u16, + query: BlockQuery, +) -> Result>, ClientError> { + let query = BlockQuery::GetCBOR(Box::new(query)); + let query = LedgerQuery::BlockQuery(era, query); + let query = Request::LedgerQuery(query); + let result = client.query(query).await?; + + Ok(result) +} + /// Get the genesis configuration for the given era. pub async fn get_genesis_config( client: &mut Client,