diff --git a/Cargo.lock b/Cargo.lock index 122586ee..e8cc8463 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13458,6 +13458,7 @@ dependencies = [ "futures", "hex", "jsonrpsee 0.20.3", + "parity-scale-codec", "sha2 0.10.8", "subxt", "subxt-signer", diff --git a/sugondat-shim/Cargo.toml b/sugondat-shim/Cargo.toml index f4ae6128..d96b73fc 100644 --- a/sugondat-shim/Cargo.toml +++ b/sugondat-shim/Cargo.toml @@ -23,6 +23,7 @@ subxt = { version = "0.32.1" } subxt-signer = {version = "0.32.1", features = ["subxt"] } sha2 = "0.10.8" hex = "0.4.3" +codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } [dev-dependencies] temp-dir = "0.1.11" diff --git a/sugondat-shim/src/dock/rollkit.rs b/sugondat-shim/src/dock/rollkit.rs index 3ce4d0f3..478ad23c 100644 --- a/sugondat-shim/src/dock/rollkit.rs +++ b/sugondat-shim/src/dock/rollkit.rs @@ -1,3 +1,4 @@ +use codec::{Decode, Encode}; use jsonrpsee::Methods; use sugondat_shim_common_rollkit::{Blob, JsonRPCError, RollkitRPCServer}; use tracing::{debug, info}; @@ -25,6 +26,15 @@ impl RollkitDock { } } +#[derive(codec::Encode, codec::Decode)] +pub struct Batch(Vec>); + +impl From> for Batch { + fn from(value: Vec) -> Self { + Self(value.into_iter().map(|blob| blob.data).collect()) + } +} + #[async_trait::async_trait] impl RollkitRPCServer for RollkitDock { async fn retrieve(&self, namespace: String, height: u64) -> Result, JsonRPCError> { @@ -36,9 +46,12 @@ impl RollkitRPCServer for RollkitDock { let block_hash = self.client.wait_finalized_height(height).await.unwrap(); let block = self.client.get_block_at(block_hash).await.unwrap(); let mut blobs = vec![]; - for blob in block.blobs { - if blob.namespace == namespace { - blobs.push(Blob { data: blob.data }); + // From the sugondat perspective in the block are contained blobs + // but each sugondat-blob is a rollkit-batch that could contain multiple rollkit-blobs + for batch in block.blobs { + if batch.namespace == namespace { + let batch_data: Batch = Decode::decode(&mut &batch.data[..]).unwrap(); + blobs.extend(batch_data.0.into_iter().map(|blob| Blob { data: blob })); } } Ok(blobs) @@ -52,14 +65,14 @@ impl RollkitRPCServer for RollkitDock { .as_ref() .cloned() .ok_or_else(err::no_signing_key)?; - for blob in blobs { - self.client - .submit_blob(blob.data, namespace, submit_key.clone()) - .await - .map_err(|_| err::submission_error())?; - } - // TODO: - Ok(0) + let batch: Batch = blobs.into(); + let block_hash = self + .client + .submit_blob(batch.encode(), namespace, submit_key.clone()) + .await + .map_err(|_| err::submission_error())?; + let block = self.client.get_block_at(block_hash).await.unwrap(); + Ok(block.number) } }