Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: claim n of m faucet #6389

Merged
merged 12 commits into from
Jul 11, 2024
242 changes: 88 additions & 154 deletions applications/minotari_console_wallet/src/automation/commands.rs

Large diffs are not rendered by default.

43 changes: 24 additions & 19 deletions applications/minotari_console_wallet/src/cli.rs
Original file line number Diff line number Diff line change
Expand Up @@ -119,14 +119,11 @@ pub enum CliCommands {
GetBalance,
SendMinotari(SendMinotariArgs),
BurnMinotari(BurnMinotariArgs),
CreateKeyPair(CreateKeyPairArgs),
CreateAggregateSignatureUtxo(CreateAggregateSignatureUtxoArgs),
EncumberAggregateUtxo(EncumberAggregateUtxoArgs),
SpendAggregateUtxo(SpendAggregateUtxoArgs),
SignMessage(SignMessageArgs),
FaucetEncumberAggregateUtxo(FaucetEncumberAggregateUtxoArgs),
FaucetSpendAggregateUtxo(FaucetSpendAggregateUtxoArgs),
FaucetCreatePartyDetails(FaucetCreatePartyDetailsArgs),
CreateScriptSig(CreateScriptSigArgs),
CreateMetaSig(CreateMetaSigArgs),
FaucetCreateScriptSig(FaucetCreateScriptSigArgs),
FaucetCreateMetaSig(FaucetCreateMetaSigArgs),
SendOneSidedToStealthAddress(SendMinotariArgs),
MakeItRain(MakeItRainArgs),
CoinSplit(CoinSplitArgs),
Expand Down Expand Up @@ -169,13 +166,13 @@ pub struct BurnMinotariArgs {
}

#[derive(Debug, Args, Clone)]
pub struct CreateKeyPairArgs {
pub struct FaucetCreateKeyPairArgs {
#[clap(long)]
pub key_branch: String,
}

#[derive(Debug, Args, Clone)]
pub struct CreateAggregateSignatureUtxoArgs {
pub struct FaucetCreateAggregateSignatureUtxoArgs {
#[clap(long)]
pub amount: MicroMinotari,
#[clap(long)]
Expand All @@ -197,22 +194,24 @@ pub struct FaucetCreatePartyDetailsArgs {
#[clap(long)]
pub commitment: String,
#[clap(long)]
pub destination: TariAddress,
pub recipient_address: TariAddress,
}

#[derive(Debug, Args, Clone)]
pub struct SignMessageArgs {
pub struct FaucetSignMessageArgs {
#[clap(long)]
pub private_key_id: TariKeyId,
#[clap(long)]
pub challenge: String,
}

#[derive(Debug, Args, Clone)]
pub struct EncumberAggregateUtxoArgs {
pub struct FaucetEncumberAggregateUtxoArgs {
#[clap(long)]
pub fee_per_gram: MicroMinotari,
#[clap(long)]
pub commitment: String,
#[clap(long)]
pub output_hash: String,
#[clap(long)]
pub script_input_shares: Vec<UniSignature>,
Expand All @@ -231,7 +230,7 @@ pub struct EncumberAggregateUtxoArgs {
}

#[derive(Debug, Args, Clone)]
pub struct SpendAggregateUtxoArgs {
pub struct FaucetSpendAggregateUtxoArgs {
#[clap(long)]
pub tx_id: u64,
#[clap(long)]
Expand All @@ -243,11 +242,11 @@ pub struct SpendAggregateUtxoArgs {
}

#[derive(Debug, Args, Clone)]
pub struct CreateScriptSigArgs {
pub struct FaucetCreateScriptSigArgs {
#[clap(long)]
pub private_key_id: TariKeyId,
#[clap(long)]
pub secret_nonce: TariKeyId,
pub secret_nonce_key_id: TariKeyId,
#[clap(long)]
pub input_script: String,
#[clap(long)]
Expand All @@ -263,13 +262,13 @@ pub struct CreateScriptSigArgs {
}

#[derive(Debug, Args, Clone)]
pub struct CreateMetaSigArgs {
pub struct FaucetCreateMetaSigArgs {
#[clap(long)]
pub secret_script_key: TariKeyId,
pub secret_script_key_id: TariKeyId,
#[clap(long)]
pub secret_sender_offset_key: TariKeyId,
pub secret_sender_offset_key_id: TariKeyId,
#[clap(long)]
pub secret_nonce: TariKeyId,
pub secret_nonce_key_id: TariKeyId,
#[clap(long)]
pub ephemeral_commitment: String,
#[clap(long)]
Expand All @@ -278,6 +277,12 @@ pub struct CreateMetaSigArgs {
pub total_meta_key: UniPublicKey,
#[clap(long)]
pub commitment: String,
#[clap(long)]
pub encrypted_data: String,
#[clap(long)]
pub output_features: String,
#[clap(long)]
pub recipient_address: TariAddress,
}

#[derive(Debug, Args, Clone)]
Expand Down
79 changes: 32 additions & 47 deletions applications/minotari_console_wallet/src/wallet_modes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -496,25 +496,10 @@ mod test {

burn-minotari --message Ups_these_funds_will_be_burned! 100T

create-key-pair --key-branch pie

create-aggregate-signature-utxo \
--amount 125T \
--fee-per-gram 1 \
--n 3 \
--m 2 \
--message ff \
--maturity 0 \
--public-keys=5c4f2a4b3f3f84e047333218a84fd24f581a9d7e4f23b78e3714e9d174427d61 \
--public-keys=f6b2ca781342a3ebe30ee1643655c96f1d7c14f4d49f077695395de98ae73665

sign-message \
--private-key-id imported.96159b07298a453c9f514f5307f70659c7561dd6d9ed376854c5cb573cb2e311 \
--challenge f6b2ca781342a3ebe30ee1643655c96f1d7c14f4d49f077695395de98ae73665

encumber-aggregate-utxo \
faucet-encumber-aggregate-utxo \
--fee-per-gram 1 \
--output-hash f6b2ca781342a3ebe30ee1643655c96f1d7c14f4d49f077695395de98ae73665 \
--commitment f6b2ca781342a3ebe30ee1643655c96f1d7c14f4d49f077695395de98ae73665 \
--script-input-shares=3ddde10d0775c20fb25015546c6a8068812044e7ca4ee1057e84ec9ab6705d03,8a55d1cb503be36875d38f2dc6abac7b23445bbd7253684a1506f5ee1855cd58 \
--script-input-shares=3edf1ed103b0ac0bbad6a6de8369808d14dfdaaf294fe660646875d749a1f908,50a26c646db951720c919f59cd7a34600a7fc3ee978c64fbcce0ad184c46844c \
--script-public-key-shares=5c4f2a4b3f3f84e047333218a84fd24f581a9d7e4f23b78e3714e9d174427d61 \
Expand All @@ -529,7 +514,7 @@ mod test {
--dh-shared-secret-shares=f6b2ca781342a3ebe30ee1643655c96f1d7c14f4d49f077695395de98ae73665 \
--recipient-address f4LR9f6WwwcPiKJjK5ciTkU1ocNhANa3FPw1wkyVUwbuKpgiihawCXy6PFszunUWQ4Te8KVFnyWVHHwsk9x5Cg7ZQiA

spend-aggregate-utxo \
faucet-spend-aggregate-utxo \
--tx-id 12345678 \
--meta-signatures=3ddde10d0775c20fb25015546c6a8068812044e7ca4ee1057e84ec9ab6705d03,8a55d1cb503be36875d38f2dc6abac7b23445bbd7253684a1506f5ee1855cd58 \
--meta-signatures=3edf1ed103b0ac0bbad6a6de8369808d14dfdaaf294fe660646875d749a1f908,50a26c646db951720c919f59cd7a34600a7fc3ee978c64fbcce0ad184c46844c \
Expand All @@ -538,24 +523,31 @@ mod test {
--script-offset-keys=5c4f2a4b3f3f84e047333218a84fd24f581a9d7e4f23b78e3714e9d174427d61 \
--script-offset-keys=f6b2ca781342a3ebe30ee1643655c96f1d7c14f4d49f077695395de98ae73665

create-script-sig \
faucet-create-party-details \
--commitment f6b2ca781342a3ebe30ee1643655c96f1d7c14f4d49f077695395de98ae73665 \
--recipient-address f4LR9f6WwwcPiKJjK5ciTkU1ocNhANa3FPw1wkyVUwbuKpgiihawCXy6PFszunUWQ4Te8KVFnyWVHHwsk9x5Cg7ZQiA

faucet-create-script-sig \
--private-key-id imported.96159b07298a453c9f514f5307f70659c7561dd6d9ed376854c5cb573cb2e311 \
--secret-nonce imported.96159b07298a453c9f514f5307f70659c7561dd6d9ed376854c5cb573cb2e311 \
--secret-nonce-key-id imported.96159b07298a453c9f514f5307f70659c7561dd6d9ed376854c5cb573cb2e311 \
--input-script ae010268593ed2d36a2d95f0ffe0f41649b97cc36fc4ef0c8ecd6bd28f9d56c76b793b08691435a5c813578f8a7f4973166dc1c6c15f37aec2a7d65b1583c8b2129364c916d5986a0c1b3dac7d6efb94bed688ba52fa8b962cf27c0446e2fea6d66a04 \
--input-stack 050857c14f72cf885aac9f08c9484cb7cb06b6cc20eab68c9bee1e8d5a85649b0a6d31c5cc49afc1e03ebbcf55c82f47e8cbc796c33e96c17a31eab027ee821f00 \
--ephemeral-commitment f6b2ca781342a3ebe30ee1643655c96f1d7c14f4d49f077695395de98ae73665 \
--ephemeral-pubkey 8a55d1cb503be36875d38f2dc6abac7b23445bbd7253684a1506f5ee1855cd58 \
--total-script-key 5c4f2a4b3f3f84e047333218a84fd24f581a9d7e4f23b78e3714e9d174427d61 \
--commitment 94966b4f1b5dc050df1109cf07a516ae85912c82503b1a8c1625986a569fae67

create-meta-sig \
--secret-script-key imported.96159b07298a453c9f514f5307f70659c7561dd6d9ed376854c5cb573cb2e311 \
--secret-sender-offset-key imported.96159b07298a453c9f514f5307f70659c7561dd6d9ed376854c5cb573cb2e311 \
--secret-nonce imported.96159b07298a453c9f514f5307f70659c7561dd6d9ed376854c5cb573cb2e311 \
faucet-create-meta-sig \
--secret-script-key-id imported.96159b07298a453c9f514f5307f70659c7561dd6d9ed376854c5cb573cb2e311 \
--secret-sender-offset-key-id imported.96159b07298a453c9f514f5307f70659c7561dd6d9ed376854c5cb573cb2e311 \
--secret-nonce-key-id imported.96159b07298a453c9f514f5307f70659c7561dd6d9ed376854c5cb573cb2e311 \
--ephemeral-commitment f6b2ca781342a3ebe30ee1643655c96f1d7c14f4d49f077695395de98ae73665 \
--ephemeral-pubkey 8a55d1cb503be36875d38f2dc6abac7b23445bbd7253684a1506f5ee1855cd58 \
--total-meta-key 5c4f2a4b3f3f84e047333218a84fd24f581a9d7e4f23b78e3714e9d174427d61 \
--commitment 94966b4f1b5dc050df1109cf07a516ae85912c82503b1a8c1625986a569fae67
--commitment 94966b4f1b5dc050df1109cf07a516ae85912c82503b1a8c1625986a569fae67 \
--encrypted-data 6a7aa2053ae187f60f27df0e10184bf93d02a84cd9548320ec7da546185fc23c6daa720974007c6106cfb0361eb9828e1af979b69fff724d2bcd0d86d5b9675ef1f65b424b22bee06e52fcaf4fd2a2ed \
--output-features 'features' \
--recipient-address f4FB7HhYCmLw4PsivjG8bAgUuxyPS6GTjFkhMWx6d9Nv4aoBESyaH5TdS1dAkSCg4qXqehpjZU9QrSUP2Ec7v4Gj8wf

coin-split --message Make_many_dust_UTXOs! --fee-per-gram 2 0.001T 499

Expand All @@ -576,13 +568,11 @@ mod test {
let mut get_balance = false;
let mut send_tari = false;
let mut burn_tari = false;
let mut create_key_pair = false;
let mut create_aggregate_signature_utxo = false;
let mut encumber_aggregate_utxo = false;
let mut spend_aggregate_utxo = false;
let mut sign_message = false;
let mut create_script_sig = false;
let mut create_meta_sig = false;
let mut faucet_encumber_aggregate_utxo = false;
let mut faucet_spend_aggregate_utxo = false;
let mut faucet_create_party_details = false;
let mut faucet_create_script_sig = false;
let mut faucet_create_meta_sig = false;
let mut make_it_rain = false;
let mut coin_split = false;
let mut discover_peer = false;
Expand All @@ -594,13 +584,11 @@ mod test {
CliCommands::GetBalance => get_balance = true,
CliCommands::SendMinotari(_) => send_tari = true,
CliCommands::BurnMinotari(_) => burn_tari = true,
CliCommands::CreateKeyPair(_) => create_key_pair = true,
CliCommands::CreateAggregateSignatureUtxo(_) => create_aggregate_signature_utxo = true,
CliCommands::EncumberAggregateUtxo(_) => encumber_aggregate_utxo = true,
CliCommands::SpendAggregateUtxo(_) => spend_aggregate_utxo = true,
CliCommands::SignMessage(_) => sign_message = true,
CliCommands::CreateScriptSig(_) => create_script_sig = true,
CliCommands::CreateMetaSig(_) => create_meta_sig = true,
CliCommands::FaucetEncumberAggregateUtxo(_) => faucet_encumber_aggregate_utxo = true,
CliCommands::FaucetSpendAggregateUtxo(_) => faucet_spend_aggregate_utxo = true,
CliCommands::FaucetCreatePartyDetails(_) => faucet_create_party_details = true,
CliCommands::FaucetCreateScriptSig(_) => faucet_create_script_sig = true,
CliCommands::FaucetCreateMetaSig(_) => faucet_create_meta_sig = true,
CliCommands::SendOneSidedToStealthAddress(_) => {},
CliCommands::MakeItRain(_) => make_it_rain = true,
CliCommands::CoinSplit(_) => coin_split = true,
Expand Down Expand Up @@ -628,20 +616,17 @@ mod test {
CliCommands::RevalidateWalletDb => {},
CliCommands::RegisterValidatorNode(_) => {},
CliCommands::CreateTlsCerts => {},
CliCommands::FaucetCreatePartyDetails(_) => {},
}
}
assert!(
get_balance &&
send_tari &&
burn_tari &&
create_key_pair &&
create_aggregate_signature_utxo &&
encumber_aggregate_utxo &&
spend_aggregate_utxo &&
sign_message &&
create_script_sig &&
create_meta_sig &&
faucet_encumber_aggregate_utxo &&
faucet_spend_aggregate_utxo &&
faucet_create_party_details &&
faucet_create_script_sig &&
faucet_create_meta_sig &&
make_it_rain &&
coin_split &&
discover_peer &&
Expand Down
4 changes: 2 additions & 2 deletions base_layer/core/src/transactions/aggregated_body.rs
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ impl AggregateBody {
pub fn update_script_signature(
&mut self,
commitment: &Commitment,
script_signature: &ComAndPubSignature,
script_signature: ComAndPubSignature,
) -> Result<(), TransactionError> {
let input = self
.inputs
Expand All @@ -119,7 +119,7 @@ impl AggregateBody {
Err(_) => false,
})
.ok_or(TransactionError::OutputNotFound(commitment.to_hex()))?;
input.script_signature = script_signature.clone();
input.script_signature = script_signature;

Ok(())
}
Expand Down
39 changes: 31 additions & 8 deletions base_layer/core/src/transactions/key_manager/inner.rs
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ use tari_key_manager::{
KeyManagerServiceError,
},
};
use tari_script::CheckSigSchnorrSignature;
use tari_utilities::{hex::Hex, ByteArray};
use tokio::sync::RwLock;

Expand Down Expand Up @@ -181,6 +182,13 @@ where TBackend: KeyManagerBackend<PublicKey> + 'static
Ok((key_id, key))
}

pub async fn get_random_key(&self) -> Result<(TariKeyId, PublicKey), KeyManagerServiceError> {
let random_private_key = PrivateKey::random(&mut OsRng);
let key_id = self.import_key(random_private_key).await?;
let public_key = self.get_public_key_at_key_id(&key_id).await?;
Ok((key_id, public_key))
}

pub async fn create_key_pair(&mut self, branch: &str) -> Result<(TariKeyId, PublicKey), KeyManagerServiceError> {
self.add_key_manager_branch(branch)?;
let (key_id, public_key) = self.get_next_key(branch).await?;
Expand Down Expand Up @@ -1148,21 +1156,22 @@ where TBackend: KeyManagerBackend<PublicKey> + 'static
&commitment,
ephemeral_commitment,
txo_version,
None,
None,
metadata_signature_message,
)
.await?;
let metadata_signature = &receiver_partial_metadata_signature + &sender_partial_metadata_signature;
Ok(metadata_signature)
}

pub async fn sign_message(
pub async fn sign_script_message(
&self,
private_key_id: &TariKeyId,
challenge: &[u8],
) -> Result<Signature, TransactionError> {
) -> Result<CheckSigSchnorrSignature, TransactionError> {
let private_key = self.get_private_key(private_key_id).await?;
let nonce = PrivateKey::random(&mut OsRng);
let signature = Signature::sign_with_nonce_and_message(&private_key, nonce, challenge)?;
let signature = CheckSigSchnorrSignature::sign(&private_key, challenge, &mut OsRng)?;

Ok(signature)
}
Expand All @@ -1171,11 +1180,11 @@ where TBackend: KeyManagerBackend<PublicKey> + 'static
&self,
private_key_id: &TariKeyId,
nonce: &TariKeyId,
challenge: &[u8],
challenge: &[u8; 64],
) -> Result<Signature, TransactionError> {
let private_key = self.get_private_key(private_key_id).await?;
let private_nonce = self.get_private_key(nonce).await?;
let signature = Signature::sign_with_nonce_and_message(&private_key, private_nonce, challenge)?;
let signature = Signature::sign_raw_uniform(&private_key, private_nonce, challenge)?;

Ok(signature)
}
Expand Down Expand Up @@ -1214,6 +1223,8 @@ where TBackend: KeyManagerBackend<PublicKey> + 'static
&commitment,
ephemeral_commitment,
txo_version,
None,
None,
metadata_signature_message,
)
.await?;
Expand Down Expand Up @@ -1262,21 +1273,33 @@ where TBackend: KeyManagerBackend<PublicKey> + 'static
Ok(metadata_signature)
}

// In the case where the sender is an aggregated signer, we need to parse in the total public key shares, this is
// done in: aggregated_sender_offset_public_keys and aggregated_ephemeral_public_keys. If there is no aggregated
// signers, this can be left as none
pub async fn get_sender_partial_metadata_signature(
&self,
ephemeral_private_nonce_id: &TariKeyId,
sender_offset_key_id: &TariKeyId,
commitment: &Commitment,
ephemeral_commitment: &Commitment,
txo_version: &TransactionOutputVersion,
aggregated_sender_offset_public_keys: Option<&PublicKey>,
aggregated_ephemeral_public_keys: Option<&PublicKey>,
metadata_signature_message: &[u8; 32],
) -> Result<ComAndPubSignature, TransactionError> {
match &self.wallet_type {
WalletType::Software => {
let ephemeral_private_key = self.get_private_key(ephemeral_private_nonce_id).await?;
let ephemeral_pubkey = PublicKey::from_secret_key(&ephemeral_private_key);
let ephemeral_pubkey = match aggregated_ephemeral_public_keys {
Some(agg) => agg.clone(),
None => PublicKey::from_secret_key(&ephemeral_private_key),
};
PublicKey::from_secret_key(&ephemeral_private_key);
let sender_offset_private_key = self.get_private_key(sender_offset_key_id).await?; // Take the index and use it to find the key from ledger
let sender_offset_public_key = PublicKey::from_secret_key(&sender_offset_private_key);
let sender_offset_public_key = match aggregated_sender_offset_public_keys {
Some(agg) => agg.clone(),
None => PublicKey::from_secret_key(&sender_offset_private_key),
};

let challenge = TransactionOutput::finalize_metadata_signature_challenge(
txo_version,
Expand Down
Loading
Loading