Skip to content

Commit

Permalink
Merge pull request #9 from multiversx/actual-bls-signature
Browse files Browse the repository at this point in the history
Verify BLS signature
  • Loading branch information
dorin-iancu authored Oct 16, 2023
2 parents ff85614 + e703618 commit 2ffad02
Show file tree
Hide file tree
Showing 6 changed files with 94 additions and 17 deletions.
4 changes: 0 additions & 4 deletions esdt-safe/src/bls_signature.rs

This file was deleted.

4 changes: 1 addition & 3 deletions esdt-safe/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,14 @@ use tx_batch_module::FIRST_BATCH_ID;
const DEFAULT_MAX_TX_BATCH_SIZE: usize = 10;
const DEFAULT_MAX_TX_BATCH_BLOCK_DURATION: u64 = 100; // ~10 minutes

pub mod bls_signature;
pub mod create_tx;
pub mod events;
pub mod refund;
pub mod set_tx_status;

#[multiversx_sc::contract]
pub trait EsdtSafe:
bls_signature::BlsSignatureModule
+ create_tx::CreateTxModule
create_tx::CreateTxModule
+ events::EventsModule
+ refund::RefundModule
+ set_tx_status::SetTxStatusModule
Expand Down
73 changes: 73 additions & 0 deletions multi-transfer-esdt/src/bls_signature.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
use transaction::Transaction;

multiversx_sc::imports!();

pub const BLS_SIGNATURE_LEN: usize = 48;
pub type BlsSignature<M> = ManagedByteArray<M, BLS_SIGNATURE_LEN>;

#[multiversx_sc::module]
pub trait BlsSignatureModule {
#[only_owner]
#[endpoint(setMinValidSigners)]
fn set_min_valid_signers(&self, new_value: u32) {
self.min_valid_signers().set(new_value);
}

#[only_owner]
#[endpoint(addSigners)]
fn add_signers(&self, signers: MultiValueEncoded<ManagedAddress>) {
for signer in signers {
let _ = self.all_signers().insert(signer);
}
}

#[only_owner]
#[endpoint(removeSigners)]
fn remove_signers(&self, signers: MultiValueEncoded<ManagedAddress>) {
for signer in signers {
let _ = self.all_signers().swap_remove(&signer);
}
}

fn verify_bls_signature(
&self,
transactions: MultiValueEncoded<Transaction<Self::Api>>,
signature: &BlsSignature<Self::Api>,
) -> ManagedVec<Transaction<Self::Api>> {
let mut deserialized_transactions = ManagedVec::new();
let mut serialized_signature_data = ManagedBuffer::new();
for transaction in transactions {
let _ = transaction.dep_encode(&mut serialized_signature_data);

deserialized_transactions.push(transaction);
}

let all_signers = self.all_signers();

let mut total_valid_signatures = 0;
for signer in all_signers.iter() {
let is_valid = self.crypto().verify_bls(
signer.as_managed_buffer(),
&serialized_signature_data,
signature.as_managed_buffer(),
);
if is_valid {
total_valid_signatures += 1;
}
}

let min_valid_signers = self.min_valid_signers().get();
require!(
total_valid_signatures >= min_valid_signers,
"Invalid signature"
);

deserialized_transactions
}

#[storage_mapper("allSigners")]
fn all_signers(&self) -> UnorderedSetMapper<ManagedAddress>;

#[storage_mapper("minValidSigners")]
fn min_valid_signers(&self) -> SingleValueMapper<u32>;
}
13 changes: 7 additions & 6 deletions multi-transfer-esdt/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,33 +7,34 @@ use tx_batch_module::FIRST_BATCH_ID;
const DEFAULT_MAX_TX_BATCH_SIZE: usize = 10;
const DEFAULT_MAX_TX_BATCH_BLOCK_DURATION: u64 = u64::MAX;

pub mod bls_signature;
pub mod events;
pub mod refund;
pub mod transfer_tokens;

#[multiversx_sc::contract]
pub trait MultiTransferEsdt:
events::EventsModule
bls_signature::BlsSignatureModule
+ events::EventsModule
+ refund::RefundModule
+ transfer_tokens::TransferTokensModule
+ tx_batch_module::TxBatchModule
+ max_bridged_amount_module::MaxBridgedAmountModule
{
#[init]
fn init(&self) {
fn init(&self, min_valid_signers: u32, signers: MultiValueEncoded<ManagedAddress>) {
self.max_tx_batch_size().set(DEFAULT_MAX_TX_BATCH_SIZE);
self.max_tx_batch_block_duration()
.set(DEFAULT_MAX_TX_BATCH_BLOCK_DURATION);

// batch ID 0 is considered invalid
self.first_batch_id().set(FIRST_BATCH_ID);
self.last_batch_id().set(FIRST_BATCH_ID);

self.set_min_valid_signers(min_valid_signers);
self.add_signers(signers);
}

#[endpoint]
fn upgrade(&self) {}

// private

// events
}
10 changes: 8 additions & 2 deletions multi-transfer-esdt/src/transfer_tokens.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,16 @@ use transaction::{
BatchId, GasLimit, PaymentsVec, StolenFromFrameworkEsdtTokenData, Transaction, TxNonce,
};

use crate::bls_signature::BlsSignature;

multiversx_sc::imports!();

const CALLBACK_GAS: GasLimit = 1_000_000; // Increase if not enough

#[multiversx_sc::module]
pub trait TransferTokensModule:
crate::events::EventsModule
crate::bls_signature::BlsSignatureModule
+ crate::events::EventsModule
+ crate::refund::RefundModule
+ tx_batch_module::TxBatchModule
+ max_bridged_amount_module::MaxBridgedAmountModule
Expand All @@ -20,16 +23,19 @@ pub trait TransferTokensModule:
fn batch_transfer_esdt_token(
&self,
batch_id: BatchId,
signature: BlsSignature<Self::Api>,
transfers: MultiValueEncoded<Transaction<Self::Api>>,
) {
let mut successful_tx_list = ManagedVec::new();
let mut all_tokens_to_send = ManagedVec::new();
let mut refund_tx_list = ManagedVec::new();

let signed_transactions = self.verify_bls_signature(transfers, &signature);

let own_sc_address = self.blockchain().get_sc_address();
let sc_shard = self.blockchain().get_shard_of_address(&own_sc_address);

for sov_tx in transfers {
for sov_tx in &signed_transactions {
let mut refund_tokens_for_user = ManagedVec::new();
let mut tokens_to_send = ManagedVec::new();
let mut sent_token_data = ManagedVec::new();
Expand Down
7 changes: 5 additions & 2 deletions multi-transfer-esdt/wasm/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@
////////////////////////////////////////////////////

// Init: 1
// Endpoints: 13
// Endpoints: 16
// Async Callback (empty): 1
// Promise callbacks: 1
// Total number of exported functions: 16
// Total number of exported functions: 19

#![no_std]

Expand All @@ -24,6 +24,9 @@ multiversx_sc_wasm_adapter::endpoints! {
(
init => init
upgrade => upgrade
setMinValidSigners => set_min_valid_signers
addSigners => add_signers
removeSigners => remove_signers
getAndClearFirstRefundBatch => get_and_clear_first_refund_batch
batchTransferEsdtToken => batch_transfer_esdt_token
setMaxTxBatchSize => set_max_tx_batch_size
Expand Down

0 comments on commit 2ffad02

Please sign in to comment.