Struct solders_transaction::Transaction
source · pub struct Transaction(pub Transaction);
Expand description
An atomically-commited sequence of instructions.
While :class:~solders.instruction.Instruction
\s are the basic unit of computation in Solana,
they are submitted by clients in :class:~solders.transaction.Transaction
\s containing one or
more instructions, and signed by one or more signers.
See the Rust module documentation <https://docs.rs/solana-sdk/latest/solana_sdk/transaction/index.html>
_ for more details about transactions.
Some constructors accept an optional payer
, the account responsible for
paying the cost of executing a transaction. In most cases, callers should
specify the payer explicitly in these constructors. In some cases though,
the caller is not required to specify the payer, but is still allowed to:
in the :class:~solders.message.Message
object, the first account is always the fee-payer, so
if the caller has knowledge that the first account of the constructed
transaction’s Message
is both a signer and the expected fee-payer, then
redundantly specifying the fee-payer is not strictly required.
The main Transaction()
constructor creates a fully-signed transaction from a Message
.
Args: from_keypairs (Sequence[Keypair | Presigner]): The keypairs that are to sign the transaction. message (Message): The message to sign. recent_blockhash (Hash): The id of a recent ledger entry.
Example: >>> from solders.message import Message >>> from solders.keypair import Keypair >>> from solders.instruction import Instruction >>> from solders.hash import Hash >>> from solders.transaction import Transaction >>> from solders.pubkey import Pubkey >>> program_id = Pubkey.default() >>> arbitrary_instruction_data = bytes([1]) >>> accounts = [] >>> instruction = Instruction(program_id, arbitrary_instruction_data, accounts) >>> payer = Keypair() >>> message = Message([instruction], payer.pubkey()) >>> blockhash = Hash.default() # replace with a real blockhash >>> tx = Transaction([payer], message, blockhash)
Tuple Fields§
§0: Transaction
Implementations§
source§impl Transaction
impl Transaction
pub fn new( from_keypairs: Vec<Signer>, message: &Message, recent_blockhash: SolderHash ) -> Self
sourcepub fn signatures(&self) -> Vec<Signature>
pub fn signatures(&self) -> Vec<Signature>
listSignature: A set of signatures of a serialized :class:~solders.message.Message
,
signed by the first keys of the message’s :attr:~solders.message.Message.account_keys
,
where the number of signatures is equal to num_required_signatures
of the Message
’s
:class:~solders.message.MessageHeader
.
sourcepub fn new_unsigned(message: Message) -> Self
pub fn new_unsigned(message: Message) -> Self
Create an unsigned transaction from a :class:~solders.message.Message
.
Args: message (Message): The transaction’s message.
Returns: Transaction: The unsigned transaction.
Example: >>> from typing import List >>> from solders.message import Message >>> from solders.keypair import Keypair >>> from solders.pubkey import Pubkey >>> from solders.instruction import Instruction, AccountMeta >>> from solders.hash import Hash >>> from solders.transaction import Transaction >>> program_id = Pubkey.default() >>> blockhash = Hash.default() # replace with a real blockhash >>> arbitrary_instruction_data = bytes([1]) >>> accounts: List[AccountMeta] = [] >>> instruction = Instruction(program_id, arbitrary_instruction_data, accounts) >>> payer = Keypair() >>> message = Message.new_with_blockhash([instruction], payer.pubkey(), blockhash) >>> tx = Transaction.new_unsigned(message) >>> tx.sign([payer], tx.message.recent_blockhash)
sourcepub fn new_with_payer(
instructions: Vec<Instruction>,
payer: Option<&Pubkey>
) -> Self
pub fn new_with_payer( instructions: Vec<Instruction>, payer: Option<&Pubkey> ) -> Self
Create an unsigned transaction from a list of :class:~solders.instruction.Instruction
\s.
Args: instructions (SequenceInstruction): The instructions to include in the transaction message. payer (OptionalPubkey, optional): The transaction fee payer. Defaults to None.
Returns: Transaction: The unsigned transaction.
Example: >>> from solders.keypair import Keypair >>> from solders.instruction import Instruction >>> from solders.transaction import Transaction >>> from solders.pubkey import Pubkey >>> program_id = Pubkey.default() >>> arbitrary_instruction_data = bytes([1]) >>> accounts = [] >>> instruction = Instruction(program_id, arbitrary_instruction_data, accounts) >>> payer = Keypair() >>> tx = Transaction.new_with_payer([instruction], payer.pubkey())
sourcepub fn new_signed_with_payer(
instructions: Vec<Instruction>,
payer: Option<Pubkey>,
signing_keypairs: Vec<Signer>,
recent_blockhash: SolderHash
) -> Self
pub fn new_signed_with_payer( instructions: Vec<Instruction>, payer: Option<Pubkey>, signing_keypairs: Vec<Signer>, recent_blockhash: SolderHash ) -> Self
Create a fully-signed transaction from a list of :class:~solders.instruction.Instruction
\s.
Args: instructions (SequenceInstruction): The instructions to include in the transaction message. payer (OptionalPubkey, optional): The transaction fee payer. signing_keypairs (Sequence[Keypair | Presigner]): The keypairs that will sign the transaction. recent_blockhash (Hash): The id of a recent ledger entry.
Returns: Transaction: The signed transaction.
Example: >>> from solders.keypair import Keypair >>> from solders.instruction import Instruction >>> from solders.transaction import Transaction >>> from solders.pubkey import Pubkey >>> program_id = Pubkey.default() >>> arbitrary_instruction_data = bytes([1]) >>> accounts = [] >>> instruction = Instruction(program_id, arbitrary_instruction_data, accounts) >>> payer = Keypair() >>> blockhash = Hash.default() # replace with a real blockhash >>> tx = Transaction.new_signed_with_payer([instruction], payer.pubkey(), [payer], blockhash);
sourcepub fn new_with_compiled_instructions(
from_keypairs: Vec<Signer>,
keys: Vec<Pubkey>,
recent_blockhash: SolderHash,
program_ids: Vec<Pubkey>,
instructions: Vec<CompiledInstruction>
) -> Self
pub fn new_with_compiled_instructions( from_keypairs: Vec<Signer>, keys: Vec<Pubkey>, recent_blockhash: SolderHash, program_ids: Vec<Pubkey>, instructions: Vec<CompiledInstruction> ) -> Self
Create a fully-signed transaction from pre-compiled instructions.
Args:
from_keypairs (Sequence[Keypair | Presigner]): The keys used to sign the transaction.
keys (SequencePubkey): The keys for the transaction. These are the program state
instances or lamport recipient keys.
recent_blockhash (Hash): The PoH hash.
program_ids (SequencePubkey): The keys that identify programs used in the instruction
vector.
instructions (SequenceInstruction): Instructions that will be executed atomically.
Returns: Transaction: The signed transaction.
sourcepub fn populate(message: Message, signatures: Vec<Signature>) -> Self
pub fn populate(message: Message, signatures: Vec<Signature>) -> Self
Create a fully-signed transaction from a message and its signatures.
Args: message (Message): The transaction message. signatures (SequenceSignature): The message’s signatures.
Returns: Message: The signed transaction.
Example:
>>> from solders.keypair import Keypair
>>> from solders.instruction import Instruction
>>> from solders.transaction import Transaction
>>> from solders.pubkey import Pubkey
>>> program_id = Pubkey.default()
>>> arbitrary_instruction_data = bytes([1])
>>> accounts = []
>>> instruction = Instruction(program_id, arbitrary_instruction_data, accounts)
>>> payer = Keypair()
>>> blockhash = Hash.default() # replace with a real blockhash
>>> tx = Transaction.new_signed_with_payer([instruction], payer.pubkey(), [payer], blockhash);
>>> assert tx == Transaction.populate(tx.message, tx.signatures)
sourcepub fn data(&self, instruction_index: usize) -> &[u8] ⓘ
pub fn data(&self, instruction_index: usize) -> &[u8] ⓘ
Get the data for an instruction at the given index.
Args:
instruction_index (int): index into the instructions
vector of the transaction’s message
.
Returns: bytes: The instruction data.
sourcepub fn key(
&self,
instruction_index: usize,
accounts_index: usize
) -> Option<Pubkey>
pub fn key( &self, instruction_index: usize, accounts_index: usize ) -> Option<Pubkey>
Get the :class:~solders.pubkey.Pubkey
of an account required by one of the instructions in
the transaction.
Returns None
if instruction_index
is greater than or equal to the
number of instructions in the transaction; or if accounts_index
is
greater than or equal to the number of accounts in the instruction.
Args:
instruction_index (int): index into the instructions
vector of the transaction’s message
.
account_index (int): index into the acounts
list of the message’s compiled_instructions
.
Returns: OptionalPubkey: The account key.
sourcepub fn signer_key(
&self,
instruction_index: usize,
accounts_index: usize
) -> Option<Pubkey>
pub fn signer_key( &self, instruction_index: usize, accounts_index: usize ) -> Option<Pubkey>
Get the :class:~solders.pubkey.Pubkey
of a signing account required by one of the
instructions in the transaction.
The transaction does not need to be signed for this function to return a signing account’s pubkey.
Returns None
if the indexed account is not required to sign the
transaction. Returns None
if the [signatures
] field does not contain
enough elements to hold a signature for the indexed account (this should
only be possible if Transaction
has been manually constructed).
Returns None
if instruction_index
is greater than or equal to the
number of instructions in the transaction; or if accounts_index
is
greater than or equal to the number of accounts in the instruction.
Args:
instruction_index (int): index into the instructions
vector of the transaction’s message
.
account_index (int): index into the acounts
list of the message’s compiled_instructions
.
Returns: OptionalPubkey: The account key.
sourcepub fn message_data<'a>(&self, py: Python<'a>) -> &'a PyBytes
pub fn message_data<'a>(&self, py: Python<'a>) -> &'a PyBytes
Return the serialized message data to sign.
Returns: bytes: The serialized message data.
sourcepub fn sign(
&mut self,
keypairs: Vec<Signer>,
recent_blockhash: SolderHash
) -> PyResult<()>
pub fn sign( &mut self, keypairs: Vec<Signer>, recent_blockhash: SolderHash ) -> PyResult<()>
Sign the transaction, returning any errors.
This method fully signs a transaction with all required signers, which
must be present in the keypairs
list. To sign with only some of the
required signers, use :meth:Transaction.partial_sign
.
If recent_blockhash
is different than recorded in the transaction message’s
recent_blockhash
] field, then the message’s recent_blockhash
will be updated
to the provided recent_blockhash
, and any prior signatures will be cleared.
Errors:
Signing will fail if some required signers are not provided in
keypairs
; or, if the transaction has previously been partially signed,
some of the remaining required signers are not provided in keypairs
.
In other words, the transaction must be fully signed as a result of
calling this function.
Signing will fail for any of the reasons described in the documentation
for :meth:Transaction.partial_sign
.
Args: keypairs (Sequence[Keypair | Presigner]): The signers for the transaction. recent_blockhash (Hash): The id of a recent ledger entry.
sourcepub fn partial_sign(
&mut self,
keypairs: Vec<Signer>,
recent_blockhash: SolderHash
) -> PyResult<()>
pub fn partial_sign( &mut self, keypairs: Vec<Signer>, recent_blockhash: SolderHash ) -> PyResult<()>
Sign the transaction with a subset of required keys, returning any errors.
Unlike :meth:Transaction.sign
, this method does not require all
keypairs to be provided, allowing a transaction to be signed in multiple
steps.
It is permitted to sign a transaction with the same keypair multiple times.
If recent_blockhash
is different than recorded in the transaction message’s
recent_blockhash
field, then the message’s recent_blockhash
will be updated
to the provided recent_blockhash
, and any prior signatures will be cleared.
Errors:
Signing will fail if
- The transaction’s :class:
~solders.message.Message
is malformed such that the number of required signatures recorded in its header (num_required_signatures
) is greater than the length of its account keys (account_keys
). - Any of the provided signers in
keypairs
is not a required signer of the message. - Any of the signers is a :class:
~solders.presigner.Presigner
, and its provided signature is incorrect.
Args: keypairs (Sequence[Keypair | Presigner]): The signers for the transaction. recent_blockhash (Hash): The id of a recent ledger entry.
sourcepub fn verify(&self) -> PyResult<()>
pub fn verify(&self) -> PyResult<()>
Verifies that all signers have signed the message.
Raises: TransactionError: if the check fails.
sourcepub fn verify_and_hash_message(&self) -> PyResult<SolderHash>
pub fn verify_and_hash_message(&self) -> PyResult<SolderHash>
Verify the transaction and hash its message.
Returns: Hash: The blake3 hash of the message.
Raises: TransactionError: if the check fails.
sourcepub fn verify_with_results(&self) -> Vec<bool>
pub fn verify_with_results(&self) -> Vec<bool>
Verifies that all signers have signed the message.
Returns:
listbool: a list with the length of required signatures, where each element is either True
if that signer has signed, or False
if not.
sourcepub fn get_signing_keypair_positions(
&self,
pubkeys: Vec<Pubkey>
) -> PyResult<Vec<Option<usize>>>
pub fn get_signing_keypair_positions( &self, pubkeys: Vec<Pubkey> ) -> PyResult<Vec<Option<usize>>>
Get the positions of the pubkeys in account_keys associated with signing keypairs.
Args: pubkeys (SequencePubkey): The pubkeys to find.
Returns:
list[Optional[int]]: The pubkey positions.
sourcepub fn replace_signatures(
&mut self,
signers: Vec<(Pubkey, Signature)>
) -> PyResult<()>
pub fn replace_signatures( &mut self, signers: Vec<(Pubkey, Signature)> ) -> PyResult<()>
Replace all the signatures and pubkeys.
Args: signers (Sequence[Tuple[Pubkey, Signature]]): The replacement pubkeys and signatures.
sourcepub fn is_signed(&self) -> bool
pub fn is_signed(&self) -> bool
Check if the transaction has been signed.
Returns: bool: True if the transaction has been signed.
sourcepub fn uses_durable_nonce(&self) -> Option<CompiledInstruction>
pub fn uses_durable_nonce(&self) -> Option<CompiledInstruction>
See https://docs.rs/solana-sdk/latest/solana_sdk/transaction/fn.uses_durable_nonce.html
sourcepub fn new_default() -> Self
pub fn new_default() -> Self
Return a new default transaction.
Returns: Transaction: The default transaction.
sourcepub fn from_bytes(data: &[u8]) -> PyResult<Self>
pub fn from_bytes(data: &[u8]) -> PyResult<Self>
Deserialize a serialized Transaction
object.
Args:
data (bytes): the serialized Transaction
.
Returns:
Transaction: the deserialized Transaction
.
Example: >>> from solders.transaction import Transaction >>> tx = Transaction.default() >>> assert Transaction.from_bytes(bytes(tx)) == tx
sourcepub fn get_nonce_pubkey_from_instruction(
&self,
ix: &CompiledInstruction
) -> Option<Pubkey>
pub fn get_nonce_pubkey_from_instruction( &self, ix: &CompiledInstruction ) -> Option<Pubkey>
Deprecated in the Solana Rust SDK, expose here only for testing.
pub fn __richcmp__(&self, other: &Self, op: CompareOp) -> PyResult<bool>
pub fn __bytes__<'a>(&self, py: Python<'a>) -> &'a PyBytes
pub fn __str__(&self) -> String
pub fn __repr__(&self) -> String
pub fn __reduce__(&self) -> PyResult<(PyObject, PyObject)>
Trait Implementations§
source§impl AsRef<Transaction> for Transaction
impl AsRef<Transaction> for Transaction
source§fn as_ref(&self) -> &TransactionOriginal
fn as_ref(&self) -> &TransactionOriginal
source§impl Clone for Transaction
impl Clone for Transaction
source§fn clone(&self) -> Transaction
fn clone(&self) -> Transaction
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moresource§impl CommonMethods<'_> for Transaction
impl CommonMethods<'_> for Transaction
fn py_to_json(&self) -> String
fn py_from_json(raw: &'a str) -> Result<Self, PyErr>
source§impl CommonMethodsCore for Transaction
impl CommonMethodsCore for Transaction
source§impl Debug for Transaction
impl Debug for Transaction
source§impl Default for Transaction
impl Default for Transaction
source§fn default() -> Transaction
fn default() -> Transaction
source§impl<'de> Deserialize<'de> for Transaction
impl<'de> Deserialize<'de> for Transaction
source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
source§impl Display for Transaction
impl Display for Transaction
source§impl From<Transaction> for Transaction
impl From<Transaction> for Transaction
source§fn from(original: TransactionOriginal) -> Transaction
fn from(original: TransactionOriginal) -> Transaction
source§impl From<Transaction> for Transaction
impl From<Transaction> for Transaction
source§fn from(original: Transaction) -> Self
fn from(original: Transaction) -> Self
source§impl From<Transaction> for VersionedTransaction
impl From<Transaction> for VersionedTransaction
source§fn from(t: Transaction) -> Self
fn from(t: Transaction) -> Self
source§impl PartialEq for Transaction
impl PartialEq for Transaction
source§fn eq(&self, other: &Transaction) -> bool
fn eq(&self, other: &Transaction) -> bool
self
and other
values to be equal, and is used
by ==
.source§impl PyBytesBincode for Transaction
impl PyBytesBincode for Transaction
fn pybytes_bincode<'a>(&self, py: Python<'a>) -> &'a PyBytes
source§impl PyBytesGeneral for Transaction
impl PyBytesGeneral for Transaction
fn pybytes_general<'a>(&self, py: Python<'a>) -> &'a PyBytes
source§impl PyClassImpl for Transaction
impl PyClassImpl for Transaction
source§const IS_BASETYPE: bool = true
const IS_BASETYPE: bool = true
source§const IS_SUBCLASS: bool = false
const IS_SUBCLASS: bool = false
source§const IS_MAPPING: bool = false
const IS_MAPPING: bool = false
source§const IS_SEQUENCE: bool = false
const IS_SEQUENCE: bool = false
§type Layout = PyCell<Transaction>
type Layout = PyCell<Transaction>
§type ThreadChecker = ThreadCheckerStub<Transaction>
type ThreadChecker = ThreadCheckerStub<Transaction>
§type PyClassMutability = <<PyAny as PyClassBaseType>::PyClassMutability as PyClassMutability>::MutableChild
type PyClassMutability = <<PyAny as PyClassBaseType>::PyClassMutability as PyClassMutability>::MutableChild
§type BaseNativeType = PyAny
type BaseNativeType = PyAny
PyAny
by default, and when you declare
#[pyclass(extends=PyDict)]
, it’s PyDict
.fn items_iter() -> PyClassItemsIter
fn lazy_type_object() -> &'static LazyTypeObject<Self>
fn dict_offset() -> Option<isize>
fn weaklist_offset() -> Option<isize>
source§impl PyClassNewTextSignature<Transaction> for PyClassImplCollector<Transaction>
impl PyClassNewTextSignature<Transaction> for PyClassImplCollector<Transaction>
fn new_text_signature(self) -> Option<&'static str>
source§impl PyFromBytesBincode<'_> for Transaction
impl PyFromBytesBincode<'_> for Transaction
source§impl PyFromBytesGeneral for Transaction
impl PyFromBytesGeneral for Transaction
fn py_from_bytes_general(raw: &[u8]) -> PyResult<Self>
source§impl<'a, 'py> PyFunctionArgument<'a, 'py> for &'a Transaction
impl<'a, 'py> PyFunctionArgument<'a, 'py> for &'a Transaction
source§impl<'a, 'py> PyFunctionArgument<'a, 'py> for &'a mut Transaction
impl<'a, 'py> PyFunctionArgument<'a, 'py> for &'a mut Transaction
source§impl PyMethods<Transaction> for PyClassImplCollector<Transaction>
impl PyMethods<Transaction> for PyClassImplCollector<Transaction>
fn py_methods(self) -> &'static PyClassItems
source§impl PyTypeInfo for Transaction
impl PyTypeInfo for Transaction
§type AsRefTarget = PyCell<Transaction>
type AsRefTarget = PyCell<Transaction>
source§fn type_object_raw(py: Python<'_>) -> *mut PyTypeObject
fn type_object_raw(py: Python<'_>) -> *mut PyTypeObject
source§fn type_object(py: Python<'_>) -> &PyType
fn type_object(py: Python<'_>) -> &PyType
source§fn is_type_of(object: &PyAny) -> bool
fn is_type_of(object: &PyAny) -> bool
object
is an instance of this type or a subclass of this type.source§fn is_exact_type_of(object: &PyAny) -> bool
fn is_exact_type_of(object: &PyAny) -> bool
object
is an instance of this type.