1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
| use solana_client::rpc_client::RpcClient; use solana_sdk::{ compute_budget::ComputeBudgetInstruction, instruction::{AccountMeta, Instruction}, pubkey::Pubkey, signature::{Keypair, Signer}, transaction::Transaction, system_instruction, }; use solana_sdk::signer::keypair::read_keypair_file; use std::{str::FromStr, sync::Arc, thread}; use std::path::PathBuf;
fn main() { let rpc_url = String::from("https://api.testnet.solana.com"); //let rpc_url = String::from("http://127.0.0.1:8899"); let client = RpcClient::new(&rpc_url); let client = Arc::new(client);
// Load keypairs for two payer accounts let keypair_path1 = PathBuf::from("/root/.config/solana/id1.json"); let keypair_path2 = PathBuf::from("/root/.config/solana/id2.json"); let payer1 = read_keypair_file(&keypair_path1).expect("Failed to read keypair from file 1"); let payer2 = read_keypair_file(&keypair_path2).expect("Failed to read keypair from file 2");
let key_bytes1 = payer1.to_bytes(); let key_bytes2 = payer2.to_bytes();
// Use two different sets of threads for each payer let handles1: Vec<_> = (0..10).map(|_| { let client = Arc::clone(&client); let key_bytes = key_bytes1.clone();
thread::spawn(move || { let payer = Keypair::from_bytes(&key_bytes).expect("Failed to deserialize keypair"); send_transaction(&client, &payer); }) }).collect();
let handles2: Vec<_> = (0..10).map(|_| { let client = Arc::clone(&client); let key_bytes = key_bytes2.clone();
thread::spawn(move || { let payer = Keypair::from_bytes(&key_bytes).expect("Failed to deserialize keypair"); send_transaction(&client, &payer); }) }).collect();
// Wait for all threads to complete handles1.into_iter().chain(handles2).for_each(|handle| { handle.join().unwrap(); }); }
fn send_transaction(client: &RpcClient, payer: &Keypair) { // let program_id = Pubkey::from_str("E3cXtz25rC1SeBVCkudZyWtzDfyDRcHvVUVuiReW2hiG").unwrap(); let program_id = Pubkey::from_str("7R2KMCUW1GimTEiS8tp8jJrde2N66yQiJ1MEUTbaPgfq").unwrap(); //let program_id = Pubkey::from_str("7R2KMCUW1GimTEiS8tp8jJrde2N66yQiJ1MEUTbaPgfq").unwrap(); let result_account = Keypair::new(); let space = 5; let rent_exemption = client.get_minimum_balance_for_rent_exemption(space).unwrap();
let create_account_instruction = system_instruction::create_account( &payer.pubkey(), &result_account.pubkey(), rent_exemption, space as u64, &program_id, );
let process_instruction_accounts = vec![ AccountMeta::new(result_account.pubkey(), false), ];
let process_instruction = Instruction::new_with_bincode( program_id, &[0], process_instruction_accounts, );
let max_units = 1_200_000; let compute_budget_instruction = ComputeBudgetInstruction::set_compute_unit_limit(max_units);
let mut transaction = Transaction::new_with_payer( &[compute_budget_instruction, create_account_instruction, process_instruction], Some(&payer.pubkey()), );
let recent_blockhash = client.get_latest_blockhash().unwrap(); transaction.sign(&[payer, &result_account], recent_blockhash);
match client.send_and_confirm_transaction(&transaction) { Ok(_) => println!("Transaction sent successfully."), Err(e) => eprintln!("Failed to send transaction: {}", e), } }
|