pub struct Transaction {
pub signatures: Vec<SignatureBytes>,
pub message: Message,
}Expand description
A Solana transaction
Fields§
§signatures: Vec<SignatureBytes>The signatures
message: MessageThe message
Implementations§
Source§impl Transaction
impl Transaction
Sourcepub fn add_signature(&mut self, signature: SignatureBytes)
pub fn add_signature(&mut self, signature: SignatureBytes)
Add a signature to the transaction
Sourcepub fn num_required_signatures(&self) -> u8
pub fn num_required_signatures(&self) -> u8
Get the number of required signatures
Sourcepub fn num_readonly_signed_accounts(&self) -> u8
pub fn num_readonly_signed_accounts(&self) -> u8
Get the number of read-only signed accounts
Sourcepub fn num_readonly_unsigned_accounts(&self) -> u8
pub fn num_readonly_unsigned_accounts(&self) -> u8
Get the number of read-only unsigned accounts
Sourcepub fn account_keys(&self) -> &[Pubkey]
pub fn account_keys(&self) -> &[Pubkey]
Get the account keys
Sourcepub fn recent_blockhash(&self) -> &[u8; 32]
pub fn recent_blockhash(&self) -> &[u8; 32]
Get the recent blockhash
Sourcepub fn instructions(&self) -> &[CompiledInstruction]
pub fn instructions(&self) -> &[CompiledInstruction]
Get the instructions
Sourcepub fn deserialize_with_version(bytes: &[u8]) -> Result<Self>
pub fn deserialize_with_version(bytes: &[u8]) -> Result<Self>
Deserialize a transaction from bytes
Sourcepub fn serialize_legacy(&self) -> Result<Vec<u8>>
pub fn serialize_legacy(&self) -> Result<Vec<u8>>
Serializes the full transaction into the Solana legacy wire format.
Sourcepub fn sign(&mut self, private_keys: &[&[u8]]) -> Result<()>
pub fn sign(&mut self, private_keys: &[&[u8]]) -> Result<()>
Sign the transaction with one or more private keys The private keys must correspond to the signing accounts in the same order
Examples found in repository?
6fn main() -> Result<(), Box<dyn std::error::Error>> {
7 println!("🚀 Solana Primitives - Transaction Signing Example");
8 println!("═══════════════════════════════════════════════════");
9
10 // Generate a test private key from base58 string
11 // ⚠️ WARNING: This is for demonstration only!
12 // In production, use proper key generation and secure storage
13 let private_key_base58 = "3KSeAx7jkVrjJ2PXjhzVMnJfV3zsyT4ADWtpnHxks5eD";
14 let private_key = bs58::decode(private_key_base58).into_vec()?;
15
16 // Generate corresponding public key
17 let fee_payer_pubkey_bytes = get_public_key(&private_key)?;
18 let fee_payer = Pubkey::new(fee_payer_pubkey_bytes);
19
20 let recipient = Pubkey::from_base58("4fYNw3dojWmQ4dXtSGE9epjRGy9uFrCRgbvGgQBNZCQF")?;
21
22 // Use a dummy blockhash for this example (in production, get from RPC)
23 let recent_blockhash = [1u8; 32]; // Use non-zero for visual distinction
24
25 println!("\n📝 Building Transaction:");
26 println!(" - Fee payer: {}", fee_payer.to_base58());
27 println!(" - Recipient: {}", recipient.to_base58());
28
29 // Create a simple SOL transfer instruction
30 let transfer_instruction = transfer(&fee_payer, &recipient, 1_000_000); // 0.001 SOL
31
32 // Build transaction
33 let mut tx_builder = TransactionBuilder::new(fee_payer, recent_blockhash);
34 tx_builder.add_instruction(transfer_instruction);
35
36 let mut transaction = tx_builder.build()?;
37
38 println!("✅ Unsigned transaction created:");
39 println!(
40 " - Instructions: {}",
41 transaction.message.instructions.len()
42 );
43 println!(
44 " - Account keys: {}",
45 transaction.message.account_keys.len()
46 );
47 println!(
48 " - Required signatures: {}",
49 transaction.message.header.num_required_signatures
50 );
51 println!(" - Is signed: {}", transaction.is_signed());
52
53 // Validate transaction size
54 transaction.validate_size()?;
55 println!("✅ Transaction size validation passed");
56
57 println!("\n🔐 Signing Transaction:");
58
59 // Method 1: Sign the entire transaction at once
60 let private_keys = [private_key.as_ref()]; // References to private keys
61 transaction.sign(&private_keys)?;
62
63 println!("✅ Transaction signed successfully!");
64 println!(" - Is signed: {}", transaction.is_signed());
65 println!(" - Signature count: {}", transaction.signatures.len());
66
67 // Display the signature (first 16 bytes for brevity)
68 if let Some(first_signature) = transaction.signatures.first() {
69 let sig_bytes = first_signature.as_bytes();
70 println!(" - First signature: {}...", hex::encode(&sig_bytes[..16]));
71 }
72
73 println!("\n📦 Final Transaction:");
74 // Serialize the complete signed transaction
75 let transaction_bytes = borsh::to_vec(&transaction)?;
76 println!(" - Serialized size: {} bytes", transaction_bytes.len());
77 println!(
78 " - Base64 encoded: {}",
79 base64::prelude::BASE64_STANDARD.encode(&transaction_bytes)
80 );
81
82 // Demonstrate partial signing (useful for multi-sig scenarios)
83 println!("\n🔄 Demonstrating Partial Signing:");
84
85 // Create a new transaction builder for partial signing demo
86 let mut partial_tx_builder = TransactionBuilder::new(fee_payer, recent_blockhash);
87 partial_tx_builder.add_instruction(transfer(&fee_payer, &recipient, 1_000_000));
88 let mut partial_tx = partial_tx_builder.build()?;
89 println!(
90 " - Before partial sign - Is signed: {}",
91 partial_tx.is_signed()
92 );
93
94 // Partial sign with specific keys and their corresponding public keys
95 let private_keys_for_partial = [private_key.as_ref()];
96 let public_keys_for_partial = [fee_payer];
97 partial_tx.partial_sign(&private_keys_for_partial, &public_keys_for_partial)?;
98
99 println!("✅ Partial signing completed!");
100 println!(
101 " - After partial sign - Is signed: {}",
102 partial_tx.is_signed()
103 );
104
105 println!("\n🎯 Summary:");
106 println!(" ✓ Transaction built using InstructionBuilder");
107 println!(" ✓ Transaction validated for size limits");
108 println!(" ✓ Transaction signed with private key");
109 println!(" ✓ Partial signing demonstrated");
110 println!(" ✓ Transaction serialized for network submission");
111
112 println!("\n📡 Next Steps:");
113 println!(" - Submit transaction_bytes to Solana RPC endpoint");
114 println!(" - Monitor transaction status on-chain");
115 println!(" - Handle success/failure responses");
116
117 Ok(())
118}Sourcepub fn partial_sign(
&mut self,
private_keys: &[&[u8]],
public_keys: &[Pubkey],
) -> Result<()>
pub fn partial_sign( &mut self, private_keys: &[&[u8]], public_keys: &[Pubkey], ) -> Result<()>
Partially sign the transaction with specific private keys Updates only the signatures for the provided keys based on their public key positions
Examples found in repository?
6fn main() -> Result<(), Box<dyn std::error::Error>> {
7 println!("🚀 Solana Primitives - Transaction Signing Example");
8 println!("═══════════════════════════════════════════════════");
9
10 // Generate a test private key from base58 string
11 // ⚠️ WARNING: This is for demonstration only!
12 // In production, use proper key generation and secure storage
13 let private_key_base58 = "3KSeAx7jkVrjJ2PXjhzVMnJfV3zsyT4ADWtpnHxks5eD";
14 let private_key = bs58::decode(private_key_base58).into_vec()?;
15
16 // Generate corresponding public key
17 let fee_payer_pubkey_bytes = get_public_key(&private_key)?;
18 let fee_payer = Pubkey::new(fee_payer_pubkey_bytes);
19
20 let recipient = Pubkey::from_base58("4fYNw3dojWmQ4dXtSGE9epjRGy9uFrCRgbvGgQBNZCQF")?;
21
22 // Use a dummy blockhash for this example (in production, get from RPC)
23 let recent_blockhash = [1u8; 32]; // Use non-zero for visual distinction
24
25 println!("\n📝 Building Transaction:");
26 println!(" - Fee payer: {}", fee_payer.to_base58());
27 println!(" - Recipient: {}", recipient.to_base58());
28
29 // Create a simple SOL transfer instruction
30 let transfer_instruction = transfer(&fee_payer, &recipient, 1_000_000); // 0.001 SOL
31
32 // Build transaction
33 let mut tx_builder = TransactionBuilder::new(fee_payer, recent_blockhash);
34 tx_builder.add_instruction(transfer_instruction);
35
36 let mut transaction = tx_builder.build()?;
37
38 println!("✅ Unsigned transaction created:");
39 println!(
40 " - Instructions: {}",
41 transaction.message.instructions.len()
42 );
43 println!(
44 " - Account keys: {}",
45 transaction.message.account_keys.len()
46 );
47 println!(
48 " - Required signatures: {}",
49 transaction.message.header.num_required_signatures
50 );
51 println!(" - Is signed: {}", transaction.is_signed());
52
53 // Validate transaction size
54 transaction.validate_size()?;
55 println!("✅ Transaction size validation passed");
56
57 println!("\n🔐 Signing Transaction:");
58
59 // Method 1: Sign the entire transaction at once
60 let private_keys = [private_key.as_ref()]; // References to private keys
61 transaction.sign(&private_keys)?;
62
63 println!("✅ Transaction signed successfully!");
64 println!(" - Is signed: {}", transaction.is_signed());
65 println!(" - Signature count: {}", transaction.signatures.len());
66
67 // Display the signature (first 16 bytes for brevity)
68 if let Some(first_signature) = transaction.signatures.first() {
69 let sig_bytes = first_signature.as_bytes();
70 println!(" - First signature: {}...", hex::encode(&sig_bytes[..16]));
71 }
72
73 println!("\n📦 Final Transaction:");
74 // Serialize the complete signed transaction
75 let transaction_bytes = borsh::to_vec(&transaction)?;
76 println!(" - Serialized size: {} bytes", transaction_bytes.len());
77 println!(
78 " - Base64 encoded: {}",
79 base64::prelude::BASE64_STANDARD.encode(&transaction_bytes)
80 );
81
82 // Demonstrate partial signing (useful for multi-sig scenarios)
83 println!("\n🔄 Demonstrating Partial Signing:");
84
85 // Create a new transaction builder for partial signing demo
86 let mut partial_tx_builder = TransactionBuilder::new(fee_payer, recent_blockhash);
87 partial_tx_builder.add_instruction(transfer(&fee_payer, &recipient, 1_000_000));
88 let mut partial_tx = partial_tx_builder.build()?;
89 println!(
90 " - Before partial sign - Is signed: {}",
91 partial_tx.is_signed()
92 );
93
94 // Partial sign with specific keys and their corresponding public keys
95 let private_keys_for_partial = [private_key.as_ref()];
96 let public_keys_for_partial = [fee_payer];
97 partial_tx.partial_sign(&private_keys_for_partial, &public_keys_for_partial)?;
98
99 println!("✅ Partial signing completed!");
100 println!(
101 " - After partial sign - Is signed: {}",
102 partial_tx.is_signed()
103 );
104
105 println!("\n🎯 Summary:");
106 println!(" ✓ Transaction built using InstructionBuilder");
107 println!(" ✓ Transaction validated for size limits");
108 println!(" ✓ Transaction signed with private key");
109 println!(" ✓ Partial signing demonstrated");
110 println!(" ✓ Transaction serialized for network submission");
111
112 println!("\n📡 Next Steps:");
113 println!(" - Submit transaction_bytes to Solana RPC endpoint");
114 println!(" - Monitor transaction status on-chain");
115 println!(" - Handle success/failure responses");
116
117 Ok(())
118}Sourcepub fn is_signed(&self) -> bool
pub fn is_signed(&self) -> bool
Check if the transaction has been signed by all required signers
Examples found in repository?
6fn main() -> Result<(), Box<dyn std::error::Error>> {
7 println!("🚀 Solana Primitives - Transaction Signing Example");
8 println!("═══════════════════════════════════════════════════");
9
10 // Generate a test private key from base58 string
11 // ⚠️ WARNING: This is for demonstration only!
12 // In production, use proper key generation and secure storage
13 let private_key_base58 = "3KSeAx7jkVrjJ2PXjhzVMnJfV3zsyT4ADWtpnHxks5eD";
14 let private_key = bs58::decode(private_key_base58).into_vec()?;
15
16 // Generate corresponding public key
17 let fee_payer_pubkey_bytes = get_public_key(&private_key)?;
18 let fee_payer = Pubkey::new(fee_payer_pubkey_bytes);
19
20 let recipient = Pubkey::from_base58("4fYNw3dojWmQ4dXtSGE9epjRGy9uFrCRgbvGgQBNZCQF")?;
21
22 // Use a dummy blockhash for this example (in production, get from RPC)
23 let recent_blockhash = [1u8; 32]; // Use non-zero for visual distinction
24
25 println!("\n📝 Building Transaction:");
26 println!(" - Fee payer: {}", fee_payer.to_base58());
27 println!(" - Recipient: {}", recipient.to_base58());
28
29 // Create a simple SOL transfer instruction
30 let transfer_instruction = transfer(&fee_payer, &recipient, 1_000_000); // 0.001 SOL
31
32 // Build transaction
33 let mut tx_builder = TransactionBuilder::new(fee_payer, recent_blockhash);
34 tx_builder.add_instruction(transfer_instruction);
35
36 let mut transaction = tx_builder.build()?;
37
38 println!("✅ Unsigned transaction created:");
39 println!(
40 " - Instructions: {}",
41 transaction.message.instructions.len()
42 );
43 println!(
44 " - Account keys: {}",
45 transaction.message.account_keys.len()
46 );
47 println!(
48 " - Required signatures: {}",
49 transaction.message.header.num_required_signatures
50 );
51 println!(" - Is signed: {}", transaction.is_signed());
52
53 // Validate transaction size
54 transaction.validate_size()?;
55 println!("✅ Transaction size validation passed");
56
57 println!("\n🔐 Signing Transaction:");
58
59 // Method 1: Sign the entire transaction at once
60 let private_keys = [private_key.as_ref()]; // References to private keys
61 transaction.sign(&private_keys)?;
62
63 println!("✅ Transaction signed successfully!");
64 println!(" - Is signed: {}", transaction.is_signed());
65 println!(" - Signature count: {}", transaction.signatures.len());
66
67 // Display the signature (first 16 bytes for brevity)
68 if let Some(first_signature) = transaction.signatures.first() {
69 let sig_bytes = first_signature.as_bytes();
70 println!(" - First signature: {}...", hex::encode(&sig_bytes[..16]));
71 }
72
73 println!("\n📦 Final Transaction:");
74 // Serialize the complete signed transaction
75 let transaction_bytes = borsh::to_vec(&transaction)?;
76 println!(" - Serialized size: {} bytes", transaction_bytes.len());
77 println!(
78 " - Base64 encoded: {}",
79 base64::prelude::BASE64_STANDARD.encode(&transaction_bytes)
80 );
81
82 // Demonstrate partial signing (useful for multi-sig scenarios)
83 println!("\n🔄 Demonstrating Partial Signing:");
84
85 // Create a new transaction builder for partial signing demo
86 let mut partial_tx_builder = TransactionBuilder::new(fee_payer, recent_blockhash);
87 partial_tx_builder.add_instruction(transfer(&fee_payer, &recipient, 1_000_000));
88 let mut partial_tx = partial_tx_builder.build()?;
89 println!(
90 " - Before partial sign - Is signed: {}",
91 partial_tx.is_signed()
92 );
93
94 // Partial sign with specific keys and their corresponding public keys
95 let private_keys_for_partial = [private_key.as_ref()];
96 let public_keys_for_partial = [fee_payer];
97 partial_tx.partial_sign(&private_keys_for_partial, &public_keys_for_partial)?;
98
99 println!("✅ Partial signing completed!");
100 println!(
101 " - After partial sign - Is signed: {}",
102 partial_tx.is_signed()
103 );
104
105 println!("\n🎯 Summary:");
106 println!(" ✓ Transaction built using InstructionBuilder");
107 println!(" ✓ Transaction validated for size limits");
108 println!(" ✓ Transaction signed with private key");
109 println!(" ✓ Partial signing demonstrated");
110 println!(" ✓ Transaction serialized for network submission");
111
112 println!("\n📡 Next Steps:");
113 println!(" - Submit transaction_bytes to Solana RPC endpoint");
114 println!(" - Monitor transaction status on-chain");
115 println!(" - Handle success/failure responses");
116
117 Ok(())
118}Sourcepub fn validate_size(&self) -> Result<()>
pub fn validate_size(&self) -> Result<()>
Validate transaction size is within limits (1232 bytes)
Examples found in repository?
6fn main() -> Result<(), Box<dyn std::error::Error>> {
7 println!("🚀 Solana Primitives - Transaction Signing Example");
8 println!("═══════════════════════════════════════════════════");
9
10 // Generate a test private key from base58 string
11 // ⚠️ WARNING: This is for demonstration only!
12 // In production, use proper key generation and secure storage
13 let private_key_base58 = "3KSeAx7jkVrjJ2PXjhzVMnJfV3zsyT4ADWtpnHxks5eD";
14 let private_key = bs58::decode(private_key_base58).into_vec()?;
15
16 // Generate corresponding public key
17 let fee_payer_pubkey_bytes = get_public_key(&private_key)?;
18 let fee_payer = Pubkey::new(fee_payer_pubkey_bytes);
19
20 let recipient = Pubkey::from_base58("4fYNw3dojWmQ4dXtSGE9epjRGy9uFrCRgbvGgQBNZCQF")?;
21
22 // Use a dummy blockhash for this example (in production, get from RPC)
23 let recent_blockhash = [1u8; 32]; // Use non-zero for visual distinction
24
25 println!("\n📝 Building Transaction:");
26 println!(" - Fee payer: {}", fee_payer.to_base58());
27 println!(" - Recipient: {}", recipient.to_base58());
28
29 // Create a simple SOL transfer instruction
30 let transfer_instruction = transfer(&fee_payer, &recipient, 1_000_000); // 0.001 SOL
31
32 // Build transaction
33 let mut tx_builder = TransactionBuilder::new(fee_payer, recent_blockhash);
34 tx_builder.add_instruction(transfer_instruction);
35
36 let mut transaction = tx_builder.build()?;
37
38 println!("✅ Unsigned transaction created:");
39 println!(
40 " - Instructions: {}",
41 transaction.message.instructions.len()
42 );
43 println!(
44 " - Account keys: {}",
45 transaction.message.account_keys.len()
46 );
47 println!(
48 " - Required signatures: {}",
49 transaction.message.header.num_required_signatures
50 );
51 println!(" - Is signed: {}", transaction.is_signed());
52
53 // Validate transaction size
54 transaction.validate_size()?;
55 println!("✅ Transaction size validation passed");
56
57 println!("\n🔐 Signing Transaction:");
58
59 // Method 1: Sign the entire transaction at once
60 let private_keys = [private_key.as_ref()]; // References to private keys
61 transaction.sign(&private_keys)?;
62
63 println!("✅ Transaction signed successfully!");
64 println!(" - Is signed: {}", transaction.is_signed());
65 println!(" - Signature count: {}", transaction.signatures.len());
66
67 // Display the signature (first 16 bytes for brevity)
68 if let Some(first_signature) = transaction.signatures.first() {
69 let sig_bytes = first_signature.as_bytes();
70 println!(" - First signature: {}...", hex::encode(&sig_bytes[..16]));
71 }
72
73 println!("\n📦 Final Transaction:");
74 // Serialize the complete signed transaction
75 let transaction_bytes = borsh::to_vec(&transaction)?;
76 println!(" - Serialized size: {} bytes", transaction_bytes.len());
77 println!(
78 " - Base64 encoded: {}",
79 base64::prelude::BASE64_STANDARD.encode(&transaction_bytes)
80 );
81
82 // Demonstrate partial signing (useful for multi-sig scenarios)
83 println!("\n🔄 Demonstrating Partial Signing:");
84
85 // Create a new transaction builder for partial signing demo
86 let mut partial_tx_builder = TransactionBuilder::new(fee_payer, recent_blockhash);
87 partial_tx_builder.add_instruction(transfer(&fee_payer, &recipient, 1_000_000));
88 let mut partial_tx = partial_tx_builder.build()?;
89 println!(
90 " - Before partial sign - Is signed: {}",
91 partial_tx.is_signed()
92 );
93
94 // Partial sign with specific keys and their corresponding public keys
95 let private_keys_for_partial = [private_key.as_ref()];
96 let public_keys_for_partial = [fee_payer];
97 partial_tx.partial_sign(&private_keys_for_partial, &public_keys_for_partial)?;
98
99 println!("✅ Partial signing completed!");
100 println!(
101 " - After partial sign - Is signed: {}",
102 partial_tx.is_signed()
103 );
104
105 println!("\n🎯 Summary:");
106 println!(" ✓ Transaction built using InstructionBuilder");
107 println!(" ✓ Transaction validated for size limits");
108 println!(" ✓ Transaction signed with private key");
109 println!(" ✓ Partial signing demonstrated");
110 println!(" ✓ Transaction serialized for network submission");
111
112 println!("\n📡 Next Steps:");
113 println!(" - Submit transaction_bytes to Solana RPC endpoint");
114 println!(" - Monitor transaction status on-chain");
115 println!(" - Handle success/failure responses");
116
117 Ok(())
118}Trait Implementations§
Source§impl BorshDeserialize for Transaction
impl BorshDeserialize for Transaction
fn deserialize_reader<__R: Read>(reader: &mut __R) -> Result<Self, Error>
Source§fn deserialize(buf: &mut &[u8]) -> Result<Self, Error>
fn deserialize(buf: &mut &[u8]) -> Result<Self, Error>
Source§fn try_from_slice(v: &[u8]) -> Result<Self, Error>
fn try_from_slice(v: &[u8]) -> Result<Self, Error>
fn try_from_reader<R>(reader: &mut R) -> Result<Self, Error>where
R: Read,
Source§impl BorshSerialize for Transaction
impl BorshSerialize for Transaction
Source§impl Clone for Transaction
impl Clone for Transaction
Source§fn clone(&self) -> Transaction
fn clone(&self) -> Transaction
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more