From dee9ad27b7b0164259502c5dae7b15b22f1f3199 Mon Sep 17 00:00:00 2001 From: lemonpartee Date: Wed, 28 Aug 2024 15:30:35 +0200 Subject: [PATCH] perf: Batch update kickoff UTXOs with signatures --- core/src/database/common.rs | 37 ++++++++++++++++++++++++------------- core/src/verifier.rs | 19 +++++++++---------- 2 files changed, 33 insertions(+), 23 deletions(-) diff --git a/core/src/database/common.rs b/core/src/database/common.rs index d6febf9d..2ff69363 100644 --- a/core/src/database/common.rs +++ b/core/src/database/common.rs @@ -10,7 +10,7 @@ use crate::{EVMAddress, UTXO}; use bitcoin::address::NetworkUnchecked; use bitcoin::{Address, OutPoint, Txid}; use secp256k1::schnorr; -use sqlx::{Pool, Postgres}; +use sqlx::{Pool, Postgres, QueryBuilder}; use std::fs; use super::wrapper::{AddressDB, EVMAddressDB, OutPointDB, SignatureDB, TxOutDB, TxidDB, UTXODB}; @@ -399,23 +399,34 @@ impl Database { Ok(()) } - pub async fn save_slash_or_take_sig( + pub async fn save_slash_or_take_sigs( &self, deposit_outpoint: OutPoint, - kickoff_utxo: UTXO, - slash_or_take_sig: schnorr::Signature, + kickoff_utxos_and_sigs: impl IntoIterator, ) -> Result<(), BridgeError> { - sqlx::query( + QueryBuilder::new( "UPDATE deposit_kickoff_utxos - SET slash_or_take_sig = $3 - WHERE deposit_outpoint = $1 AND kickoff_utxo = $2;", + SET slash_or_take_sig = batch.sig + FROM (", ) - .bind(OutPointDB(deposit_outpoint)) - .bind(sqlx::types::Json(UTXODB { - outpoint_db: OutPointDB(kickoff_utxo.outpoint), - txout_db: TxOutDB(kickoff_utxo.txout), - })) - .bind(SignatureDB(slash_or_take_sig)) + .push_values( + kickoff_utxos_and_sigs, + |mut builder, (kickoff_utxo, slash_or_take_sig)| { + builder + .push_bind(sqlx::types::Json(UTXODB { + outpoint_db: OutPointDB(kickoff_utxo.outpoint), + txout_db: TxOutDB(kickoff_utxo.txout), + })) + .push_bind(SignatureDB(slash_or_take_sig)); + }, + ) + .push( + ") AS batch (kickoff_utxo, sig) + WHERE deposit_kickoff_utxos.deposit_outpoint = ", + ) + .push_bind(OutPointDB(deposit_outpoint)) + .push(" AND deposit_kickoff_utxos.kickoff_utxo = batch.kickoff_utxo;") + .build() .execute(&self.connection) .await?; diff --git a/core/src/verifier.rs b/core/src/verifier.rs index 497cdfe0..9acc8e09 100644 --- a/core/src/verifier.rs +++ b/core/src/verifier.rs @@ -364,16 +364,15 @@ where }) .collect::>(); - for (index, kickoff_utxo) in kickoff_utxos.iter().enumerate() { - self.db - .save_slash_or_take_sig( - deposit_outpoint, - kickoff_utxo.clone(), - slash_or_take_sigs[index], - ) - .await - .unwrap(); - } + let kickoff_utxos_with_sigs = kickoff_utxos + .iter() + .enumerate() + .map(|(index, kickoff_utxo)| (kickoff_utxo.clone(), slash_or_take_sigs[index])); + + self.db + .save_slash_or_take_sigs(deposit_outpoint, kickoff_utxos_with_sigs) + .await + .unwrap(); // println!("Operator takes sighashes: {:?}", operator_takes_sighashes); let nonces = self