From 6158215a5c4c12a716f25ab9ec4b9de86fabc406 Mon Sep 17 00:00:00 2001 From: Daniil Polyakov Date: Tue, 2 Jun 2026 00:42:41 +0300 Subject: [PATCH] feat(sequencer): implement bridge withdraw flow --- Cargo.lock | 2 + Cargo.toml | 1 + artifacts/program_methods/bridge.bin | Bin 419612 -> 428448 bytes common/src/transaction.rs | 54 +++++++++++++++-- integration_tests/tests/bridge.rs | 7 +-- program_methods/guest/src/bin/bridge.rs | 30 +++++++++- programs/bridge/core/src/lib.rs | 15 ++++- sequencer/core/Cargo.toml | 6 +- sequencer/core/src/block_publisher.rs | 48 ++++++++++++--- sequencer/core/src/lib.rs | 74 ++++++++++++++++++++++-- sequencer/core/src/mock.rs | 7 ++- 11 files changed, 215 insertions(+), 29 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0bad6271..37cbd0a5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8868,7 +8868,9 @@ dependencies = [ "mempool", "nssa", "nssa_core", + "num-bigint 0.4.6", "rand 0.8.5", + "risc0-zkvm", "serde", "serde_json", "storage", diff --git a/Cargo.toml b/Cargo.toml index ca9880ab..c9917c7a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -131,6 +131,7 @@ chrono = "0.4.41" borsh = "1.5.7" base58 = "0.2.0" itertools = "0.14.0" +num-bigint = "0.4.6" url = { version = "2.5.4", features = ["serde"] } tokio-retry = "0.3.0" schemars = "1.2" diff --git a/artifacts/program_methods/bridge.bin b/artifacts/program_methods/bridge.bin index 3eacbc9d5eed4ee7abb47df575d7f265125e285f..1514be557a9fa6071fe7e9ded825493742ea9453 100644 GIT binary patch delta 122977 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

XN+`i~W@m`!Px{ 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 Result<(), nssa::error::NssaError> { + let bridge_account_id = nssa::system_bridge_account_id(); + let pre = state.get_account_by_id(bridge_account_id); + let Some(post) = diff.public_diff().get(&bridge_account_id).cloned() else { + return Ok(()); + }; + + let Self::Public(_) = self else { + return Err(nssa::error::NssaError::InvalidInput(format!( + "Non-public transaction cannot modify system bridge account {bridge_account_id}" + ))); + }; + + let nssa::Account { + balance: pre_balance, + program_owner: pre_program_owner, + data: pre_data, + nonce: pre_nonce, + } = pre; + let nssa::Account { + balance: post_balance, + program_owner: post_program_owner, + data: post_data, + nonce: post_nonce, + } = post; + + let only_balance_increased = post_balance >= pre_balance + && post_program_owner == pre_program_owner + && post_data == pre_data + && post_nonce == pre_nonce; + + if only_balance_increased { + Ok(()) + } else { + Err(nssa::error::NssaError::InvalidInput(format!( + "Transaction modifies restricted system bridge account {bridge_account_id}" + ))) + } + } } impl From for NSSATransaction { diff --git a/integration_tests/tests/bridge.rs b/integration_tests/tests/bridge.rs index 7cb63b22..cfd361d3 100644 --- a/integration_tests/tests/bridge.rs +++ b/integration_tests/tests/bridge.rs @@ -11,7 +11,7 @@ use borsh::BorshSerialize; use common::transaction::NSSATransaction; use integration_tests::{TIME_TO_WAIT_FOR_BLOCK_SECONDS, TestContext}; use log::info; -use logos_blockchain_core::mantle::{Value, ledger::Inputs, ops::channel::deposit::DepositOp}; +use logos_blockchain_core::mantle::{ledger::Inputs, ops::channel::deposit::DepositOp}; use logos_blockchain_http_api_common::bodies::{ channel::ChannelDepositRequestBody, wallet::{ @@ -195,7 +195,7 @@ async fn private_bridge_deposit_invocation_is_dropped() -> anyhow::Result<()> { async fn submit_bedrock_deposit( bedrock_addr: std::net::SocketAddr, recipient_id: AccountId, - amount: u128, + amount: u64, ) -> anyhow::Result<()> { #[derive(BorshSerialize)] struct DepositMetadata { @@ -208,9 +208,6 @@ async fn submit_bedrock_deposit( let funding_key = "2e03b2eff5a45478e7e79668d2a146cf2c5c7925bce927f2b1c67f2ab4fc0d26"; - let amount: Value = amount - .try_into() - .context("Deposit amount does not fit Bedrock Value type")?; let channel_id = integration_tests::config::bedrock_channel_id(); let client = reqwest::Client::new(); diff --git a/program_methods/guest/src/bin/bridge.rs b/program_methods/guest/src/bin/bridge.rs index 0833d5aa..3f9caa32 100644 --- a/program_methods/guest/src/bin/bridge.rs +++ b/program_methods/guest/src/bin/bridge.rs @@ -62,12 +62,40 @@ fn main() { vec![bridge_for_vault, recipient_vault], &vault_core::Instruction::Transfer { recipient_id, - amount, + amount: u128::from(amount), }, ) .with_pda_seeds(vec![bridge_core::compute_bridge_seed()]), ] } + Instruction::Withdraw { + amount, + bedrock_account_pk: _, + } => { + let [sender, bridge] = pre_states + .try_into() + .expect("Withdraw requires exactly 2 accounts"); + + assert_eq!( + bridge.account_id, + bridge_core::compute_bridge_account_id(self_program_id), + "Second account must be bridge PDA" + ); + + let auth_transfer_program_id = bridge.account.program_owner; + assert_eq!( + sender.account.program_owner, auth_transfer_program_id, + "Sender account must be owned by the authenticated transfer program" + ); + + vec![ChainedCall::new( + auth_transfer_program_id, + vec![sender, bridge], + &authenticated_transfer_core::Instruction::Transfer { + amount: u128::from(amount), + }, + )] + } }; ProgramOutput::new( diff --git a/programs/bridge/core/src/lib.rs b/programs/bridge/core/src/lib.rs index 1da75f97..edca3b26 100644 --- a/programs/bridge/core/src/lib.rs +++ b/programs/bridge/core/src/lib.rs @@ -14,7 +14,20 @@ pub enum Instruction { Deposit { vault_program_id: ProgramId, recipient_id: AccountId, - amount: u128, + amount: u64, + }, + + /// Transfers native tokens from a user account to the bridge PDA account. + /// + /// Required accounts (2): + /// - Sender account + /// - Bridge PDA account + /// + /// `bedrock_account_pk` is consumed by the Sequencer and is not used by the Bridge program + /// logic. + Withdraw { + amount: u64, + bedrock_account_pk: [u8; 32], }, } diff --git a/sequencer/core/Cargo.toml b/sequencer/core/Cargo.toml index 985fc969..1c98040a 100644 --- a/sequencer/core/Cargo.toml +++ b/sequencer/core/Cargo.toml @@ -19,6 +19,8 @@ faucet_core.workspace = true bridge_core.workspace = true vault_core.workspace = true +logos-blockchain-key-management-system-service.workspace = true +logos-blockchain-core.workspace = true anyhow.workspace = true serde.workspace = true serde_json.workspace = true @@ -27,13 +29,13 @@ tempfile.workspace = true chrono.workspace = true log.workspace = true tokio = { workspace = true, features = ["rt-multi-thread", "macros"] } -logos-blockchain-key-management-system-service.workspace = true -logos-blockchain-core.workspace = true rand.workspace = true borsh.workspace = true bytesize.workspace = true hex.workspace = true url.workspace = true +num-bigint.workspace = true +risc0-zkvm.workspace = true [features] default = [] diff --git a/sequencer/core/src/block_publisher.rs b/sequencer/core/src/block_publisher.rs index 62cd7259..b0aa7b0e 100644 --- a/sequencer/core/src/block_publisher.rs +++ b/sequencer/core/src/block_publisher.rs @@ -3,8 +3,8 @@ use std::{pin::Pin, sync::Arc, time::Duration}; use anyhow::{Context as _, Result}; use common::block::Block; use log::warn; -pub use logos_blockchain_core::mantle::ops::channel::MsgId; -pub use logos_blockchain_key_management_system_service::keys::Ed25519Key; +use logos_blockchain_core::mantle::{Note, ledger::Outputs}; +pub use logos_blockchain_key_management_system_service::keys::{Ed25519Key, ZkKey}; pub use logos_blockchain_zone_sdk::sequencer::SequencerCheckpoint; use logos_blockchain_zone_sdk::{ CommonHttpClient, @@ -12,9 +12,10 @@ use logos_blockchain_zone_sdk::{ sequencer::{Event, SequencerConfig as ZoneSdkSequencerConfig, SequencerHandle, ZoneSequencer}, state::{DepositInfo, FinalizedOp, InscriptionInfo}, }; +use num_bigint::BigUint; use tokio::task::JoinHandle; -use crate::config::BedrockConfig; +use crate::{BridgeWithdrawData, config::BedrockConfig}; /// Sink for `Event::Published` checkpoints emitted by the drive task. /// Caller is responsible for persistence (e.g. writing to rocksdb). @@ -43,7 +44,11 @@ pub trait BlockPublisherTrait: Clone { /// Fire-and-forget publish. Zone-sdk drives the actual submission and /// retries internally; this just hands the payload off. - async fn publish_block(&self, block: &Block) -> Result<()>; + async fn publish_block( + &self, + block: &Block, + bridge_withdrawals: Vec, + ) -> Result<()>; } /// Real block publisher backed by zone-sdk's `ZoneSequencer`. @@ -124,17 +129,42 @@ impl BlockPublisherTrait for ZoneSdkPublisher { }) } - async fn publish_block(&self, block: &Block) -> Result<()> { + async fn publish_block( + &self, + block: &Block, + bridge_withdrawals: Vec, + ) -> Result<()> { let data = borsh::to_vec(block).context("Failed to serialize block")?; let data_bounded = data .try_into() .context("Block data exceeds maximum allowed size")?; - self.handle - .publish_message(data_bounded) - .await - .context("Failed to publish block")?; + if bridge_withdrawals.is_empty() { + self.handle + .publish_message(data_bounded) + .await + .context("Failed to publish block")?; + return Ok(()); + } + let withdraws = bridge_withdrawals + .into_iter() + .map(|withdrawal| { + let recipient_pk = + logos_blockchain_key_management_system_service::keys::ZkPublicKey::from( + BigUint::from_bytes_le(&withdrawal.bedrock_account_pk), + ); + + logos_blockchain_zone_sdk::sequencer::WithdrawArg { + outputs: Outputs::new(vec![Note::new(withdrawal.amount, recipient_pk)]), + } + }) + .collect(); + + self.handle + .publish_atomic_withdraw(data_bounded, withdraws) + .await + .context("Failed to publish block with withdrawals")?; Ok(()) } } diff --git a/sequencer/core/src/lib.rs b/sequencer/core/src/lib.rs index 13b455df..01306ae8 100644 --- a/sequencer/core/src/lib.rs +++ b/sequencer/core/src/lib.rs @@ -199,7 +199,9 @@ impl SequencerCore { // genesis block so the indexer can find the channel start. After the // first publish, zone-sdk's checkpoint persistence covers further // restarts. - if is_fresh_start && let Err(err) = block_publisher.publish_block(&genesis_block).await { + if is_fresh_start + && let Err(err) = block_publisher.publish_block(&genesis_block, vec![]).await + { error!("Failed to publish genesis block: {err:#}"); } @@ -217,7 +219,10 @@ impl SequencerCore { /// Produces a new block from mempool transactions and publishes it via zone-sdk. pub async fn produce_new_block(&mut self) -> Result { - let block = self + let BlockWithMeta { + block, + bridge_withdrawals, + } = self .build_block_from_mempool() .context("Failed to build block from mempool transactions")?; @@ -225,7 +230,11 @@ impl SequencerCore { // zone-sdk manages L1 settlement state via its own checkpoint. let placeholder_msg_id = [0_u8; 32]; - if let Err(err) = self.block_publisher.publish_block(&block).await { + if let Err(err) = self + .block_publisher + .publish_block(&block, bridge_withdrawals) + .await + { error!("Failed to publish block to Bedrock with error: {err:#}"); } self.store.update(&block, placeholder_msg_id, &self.state)?; @@ -235,12 +244,16 @@ impl SequencerCore { /// Builds a new block from transactions in the mempool. /// Does NOT publish or store the block — the caller is responsible for that. - pub fn build_block_from_mempool(&mut self) -> Result { + /// + /// Returns the built block together with bridge withdraw data extracted + /// from included bridge withdraw transactions. + fn build_block_from_mempool(&mut self) -> Result { let now = Instant::now(); let new_block_height = self.next_block_id(); let mut valid_transactions = vec![]; + let mut bridge_withdrawals = vec![]; let max_block_size = usize::try_from(self.sequencer_config.max_block_size.as_u64()) .expect("`max_block_size` should fit into usize"); @@ -305,6 +318,10 @@ impl SequencerCore { } }; + if let Some(withdraw_data) = extract_bridge_withdraw_data(&tx) { + bridge_withdrawals.push(withdraw_data); + } + self.state.apply_state_diff(validated_diff); } TransactionOrigin::Sequencer => { @@ -322,6 +339,7 @@ impl SequencerCore { } valid_transactions.push(tx); + info!("Validated transaction with hash {tx_hash}, including it in block"); if valid_transactions.len() >= self.sequencer_config.max_num_tx_in_block { break; @@ -355,7 +373,11 @@ impl SequencerCore { hashable_data.transactions.len(), now.elapsed().as_secs() ); - Ok(block) + + Ok(BlockWithMeta { + block, + bridge_withdrawals, + }) } pub const fn state(&self) -> &nssa::V03State { @@ -411,6 +433,17 @@ impl SequencerCore { } } +struct BlockWithMeta { + block: Block, + bridge_withdrawals: Vec, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct BridgeWithdrawData { + pub amount: u64, + pub bedrock_account_pk: [u8; 32], +} + /// Builds the initial genesis state from `testnet_initial_state` plus configured genesis /// transactions. Returns the final state and the list of [`NSSATransaction`]s that should be /// committed to the genesis block so external observers can replay them. @@ -503,7 +536,7 @@ fn build_bridge_deposit_tx( bridge_core::Instruction::Deposit { vault_program_id, recipient_id: metadata.recipient_id, - amount: u128::from(deposit.amount), + amount: deposit.amount, }, ) .context("Failed to build bridge deposit message")?; @@ -515,6 +548,35 @@ fn build_bridge_deposit_tx( ))) } +#[must_use] +pub fn extract_bridge_withdraw_data(tx: &NSSATransaction) -> Option { + let NSSATransaction::Public(tx) = tx else { + return None; + }; + + let message = tx.message(); + if message.program_id != nssa::program::Program::bridge().id() { + return None; + } + + let instruction = + risc0_zkvm::serde::from_slice::(&message.instruction_data) + .ok()?; + + match instruction { + bridge_core::Instruction::Withdraw { + amount, + bedrock_account_pk, + } => Some(BridgeWithdrawData { + amount, + bedrock_account_pk, + }), + bridge_core::Instruction::Deposit { .. } => unreachable!( + "Deposit instructions from users should never pass validation, and thus should never be seen here" + ), + } +} + /// Load signing key from file or generate a new one if it doesn't exist. fn load_or_create_signing_key(path: &Path) -> Result { if path.exists() { diff --git a/sequencer/core/src/mock.rs b/sequencer/core/src/mock.rs index e041269a..0b0024ac 100644 --- a/sequencer/core/src/mock.rs +++ b/sequencer/core/src/mock.rs @@ -5,6 +5,7 @@ use common::block::Block; use logos_blockchain_key_management_system_service::keys::Ed25519Key; use crate::{ + BridgeWithdrawData, block_publisher::{ BlockPublisherTrait, CheckpointSink, FinalizedBlockSink, OnDepositEventSink, SequencerCheckpoint, @@ -30,7 +31,11 @@ impl BlockPublisherTrait for MockBlockPublisher { Ok(Self) } - async fn publish_block(&self, _block: &Block) -> Result<()> { + async fn publish_block( + &self, + _block: &Block, + _bridge_withdrawals: Vec, + ) -> Result<()> { Ok(()) } }