pub struct Message(pub Message);
Expand description
A Solana transaction message.
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 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.
Args:
instructions (SequenceInstruction): The instructions to include in the message.
payer (OptionalPubkey): The fee payer. Defaults to None
.
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: Message
Implementations§
Source§impl Message
impl Message
pub fn new(instructions: Vec<Instruction>, payer: Option<&Pubkey>) -> Self
Sourcepub fn header(&self) -> MessageHeader
pub fn header(&self) -> MessageHeader
MessageHeader: The message header, identifying signed and read-only account_keys
.
Sourcepub fn account_keys(&self) -> Vec<Pubkey>
pub fn account_keys(&self) -> Vec<Pubkey>
listPubkey: All the account keys used by this transaction.
Sourcepub fn recent_blockhash(&self) -> SolderHash
pub fn recent_blockhash(&self) -> SolderHash
Hash: The id of a recent ledger entry.
Sourcepub fn instructions(&self) -> Vec<CompiledInstruction>
pub fn instructions(&self) -> Vec<CompiledInstruction>
listCompiledInstruction: Programs that will be executed in sequence and committed in one atomic transaction if all succeed.
Sourcepub fn new_with_blockhash(
instructions: Vec<Instruction>,
payer: Option<Pubkey>,
blockhash: &SolderHash,
) -> Self
pub fn new_with_blockhash( instructions: Vec<Instruction>, payer: Option<Pubkey>, blockhash: &SolderHash, ) -> Self
Create a new message while setting the blockhash.
Args:
instructions (SequenceInstruction): The instructions to include in the message.
payer (OptionalPubkey): The fee payer. Defaults to None
.
blockhash (Hash): a recent blockhash.
Returns: Message: The message object.
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_nonce(
instructions: Vec<Instruction>,
payer: Option<Pubkey>,
nonce_account_pubkey: &Pubkey,
nonce_authority_pubkey: &Pubkey,
) -> Self
pub fn new_with_nonce( instructions: Vec<Instruction>, payer: Option<Pubkey>, nonce_account_pubkey: &Pubkey, nonce_authority_pubkey: &Pubkey, ) -> Self
Create a new message for a nonced transaction <https://docs.solana.com/implemented-proposals/durable-tx-nonces>
_.
Args:
instructions (SequenceInstruction): The instructions to include in the message.
payer (OptionalPubkey): The fee payer. Defaults to None
.
nonce_account_pubkey (Pubkey): The nonce account pubkey.
nonce_authority_pubkey (Pubkey): The nonce account authority (for advance and close).
In this type of transaction, the blockhash is replaced with a durable transaction nonce, allowing for extended time to pass between the transaction’s signing and submission to the blockchain.
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() >>> nonce_account = Pubkey.default() # replace with a real nonce account >>> message = Message.new_with_nonce([instruction], payer.pubkey(), nonce_account, payer.pubkey()) >>> # This transaction will need to be signed later, using the blockhash stored in the nonce account. >>> tx = Transaction.new_unsigned(message)
Sourcepub fn new_with_compiled_instructions(
num_required_signatures: u8,
num_readonly_signed_accounts: u8,
num_readonly_unsigned_accounts: u8,
account_keys: Vec<Pubkey>,
recent_blockhash: SolderHash,
instructions: Vec<CompiledInstruction>,
) -> Self
pub fn new_with_compiled_instructions( num_required_signatures: u8, num_readonly_signed_accounts: u8, num_readonly_unsigned_accounts: u8, account_keys: Vec<Pubkey>, recent_blockhash: SolderHash, instructions: Vec<CompiledInstruction>, ) -> Self
Create a new message by specifying all the fields required for the message, including the :class:MessageHeader
fields.
Args:
num_required_signatures (int): The number of signatures required for this message
to be considered valid. The signers of those signatures must match the
first num_required_signatures
of :attr:Message.account_keys
.
num_readonly_signed_accounts (int): The last num_readonly_signed_accounts
of
the signed keys are read-only accounts.
num_readonly_unsigned_accounts (int): The last num_readonly_unsigned_accounts
of the unsigned keys are read-only accounts.
account_keys (listPubkey): All the account keys used by this transaction.
recent_blockhash (Hash): The id of a recent ledger entry.
instructions (listCompiledInstruction): Programs that will be executed in sequence
and committed in one atomic transaction if all succeed.
Returns: Message: The message object.
Sourcepub fn hash(&self) -> SolderHash
pub fn hash(&self) -> SolderHash
Compute the blake3 hash of this transaction’s message.
Returns: Hash: The blake3 hash.
Sourcepub fn hash_raw_message(message_bytes: &[u8]) -> SolderHash
pub fn hash_raw_message(message_bytes: &[u8]) -> SolderHash
Compute the blake3 hash of a raw transaction message.
Returns: Hash: The blake3 hash.
Sourcepub fn compile_instruction(&self, ix: &Instruction) -> CompiledInstruction
pub fn compile_instruction(&self, ix: &Instruction) -> CompiledInstruction
Convert an :class:~solders.Instruction
into a :class:~solders.instruction.CompiledInstruction
using self.account_keys
.
Returns: CompiledInstruction: The compiled instruction.
Sourcepub fn program_id(&self, instruction_index: usize) -> Option<Pubkey>
pub fn program_id(&self, instruction_index: usize) -> Option<Pubkey>
Return the program ID of an instruction at a particular index in the message.
Args: instruction_index (int): The position of the instruction in the message’s list of instructions.
Returns: Pubkey: The program ID.
Sourcepub fn program_index(&self, instruction_index: usize) -> Option<usize>
pub fn program_index(&self, instruction_index: usize) -> Option<usize>
Return the program_id_index
of the instruction at instruction_index
in the message.
Args: instruction_index (int): The position of the instruction in the message’s list of instructions.
Returns: int: The program ID index.
Sourcepub fn program_ids(&self) -> Vec<Pubkey>
pub fn program_ids(&self) -> Vec<Pubkey>
Return the program ID of each instruction in the message.
Returns: listPubkey: The program IDs.
Sourcepub fn is_key_passed_to_program(&self, key_index: usize) -> bool
pub fn is_key_passed_to_program(&self, key_index: usize) -> bool
Check if key_index
is contained in the accounts of
any of the message’s instructions.
Args: key_index (int): The index to check.
Returns: bool: True if the key is passed to the program.
Sourcepub fn is_key_called_as_program(&self, key_index: usize) -> bool
pub fn is_key_called_as_program(&self, key_index: usize) -> bool
Check if the program_id_index
of any of the message’s instructions matches key_index
.
Args: key_index (int): The index to check.
Returns: bool: The result of the check.
Sourcepub fn is_non_loader_key(&self, key_index: usize) -> bool
pub fn is_non_loader_key(&self, key_index: usize) -> bool
Check if the key is passed to the program OR if the key is not called as program.
Args: key_index (int): The index to check.
Returns: bool: The result of the check.
Sourcepub fn program_position(&self, index: usize) -> Option<usize>
pub fn program_position(&self, index: usize) -> Option<usize>
See https://docs.rs/solana-sdk/latest/solana_sdk/message/legacy/struct.Message.html#method.program_position
Sourcepub fn maybe_executable(&self, i: usize) -> bool
pub fn maybe_executable(&self, i: usize) -> bool
See https://docs.rs/solana-sdk/latest/solana_sdk/message/legacy/struct.Message.html#method.maybe_executable
Sourcepub fn is_writable(&self, i: usize) -> bool
pub fn is_writable(&self, i: usize) -> bool
See https://docs.rs/solana-sdk/latest/solana_sdk/message/legacy/struct.Message.html#method.is_writable
Sourcepub fn is_signer(&self, i: usize) -> bool
pub fn is_signer(&self, i: usize) -> bool
See https://docs.rs/solana-sdk/latest/solana_sdk/message/legacy/struct.Message.html#method.is_signer
Sourcepub fn signer_keys(&self) -> Vec<Pubkey>
pub fn signer_keys(&self) -> Vec<Pubkey>
See https://docs.rs/solana-sdk/latest/solana_sdk/message/legacy/struct.Message.html#method.signer_keys
Sourcepub fn has_duplicates(&self) -> bool
pub fn has_duplicates(&self) -> bool
Check if account_keys
has any duplicate keys.
Returns:
bool: True
if there are duplicates.
Sourcepub fn is_upgradeable_loader_present(&self) -> bool
pub fn is_upgradeable_loader_present(&self) -> bool
See https://docs.rs/solana-sdk/latest/solana_sdk/message/legacy/struct.Message.html#method.is_upgradeable_loader_present
Sourcepub fn new_default() -> Self
pub fn new_default() -> Self
Create a new default Message
.
Returns:
Message: default Message
.
Sourcepub fn from_bytes(data: &[u8]) -> PyResult<Self>
pub fn from_bytes(data: &[u8]) -> PyResult<Self>
Deserialize a serialized Message
object.
Args:
data (bytes): The serialized Message
.
Returns:
Message: The deserialized Message
.
Example: >>> from solders.pubkey import Pubkey >>> from solders.instruction import AccountMeta, Instruction >>> from solders.message import Message >>> from_pubkey = Pubkey.new_unique() >>> to_pubkey = Pubkey.new_unique() >>> program_id = Pubkey.new_unique() >>> instruction_data = bytes([1]) >>> accounts = [AccountMeta(from_pubkey, is_signer=True, is_writable=True), AccountMeta(to_pubkey, is_signer=True, is_writable=True)] >>> instruction = Instruction(program_id, instruction_data, accounts) >>> message = Message([instruction]) >>> serialized = bytes(message) >>> assert Message.from_bytes(serialized) == message
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 CommonMethods<'_> for Message
impl CommonMethods<'_> for Message
fn py_to_json(&self) -> String
fn py_from_json(raw: &'a str) -> Result<Self, PyErr>
Source§impl CommonMethodsCore for Message
impl CommonMethodsCore for Message
Source§impl<'de> Deserialize<'de> for Message
impl<'de> Deserialize<'de> for Message
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 From<Message> for Message
impl From<Message> for Message
Source§fn from(original: MessageOriginal) -> Message
fn from(original: MessageOriginal) -> Message
Source§impl PyBytesGeneral for Message
impl PyBytesGeneral for Message
fn pybytes_general<'a>(&self, py: Python<'a>) -> &'a PyBytes
Source§impl PyClassImpl for Message
impl PyClassImpl for Message
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
Source§type ThreadChecker = SendablePyClass<Message>
type ThreadChecker = SendablePyClass<Message>
Source§type PyClassMutability = <<PyAny as PyClassBaseType>::PyClassMutability as PyClassMutability>::MutableChild
type PyClassMutability = <<PyAny as PyClassBaseType>::PyClassMutability as PyClassMutability>::MutableChild
Source§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<Message> for PyClassImplCollector<Message>
impl PyClassNewTextSignature<Message> for PyClassImplCollector<Message>
fn new_text_signature(self) -> Option<&'static str>
Source§impl PyFromBytesBincode<'_> for Message
impl PyFromBytesBincode<'_> for Message
Source§impl PyFromBytesGeneral for Message
impl PyFromBytesGeneral for Message
fn py_from_bytes_general(raw: &[u8]) -> PyResult<Self>
Source§impl PyMethods<Message> for PyClassImplCollector<Message>
impl PyMethods<Message> for PyClassImplCollector<Message>
fn py_methods(self) -> &'static PyClassItems
Source§impl PyTypeInfo for Message
impl PyTypeInfo for Message
Source§type AsRefTarget = PyCell<Message>
type AsRefTarget = PyCell<Message>
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.Source§impl RichcmpEqualityOnly for Message
impl RichcmpEqualityOnly for Message
impl Eq for Message
impl StructuralPartialEq for Message
Auto Trait Implementations§
impl Freeze for Message
impl RefUnwindSafe for Message
impl Send for Message
impl Sync for Message
impl Unpin for Message
impl UnwindSafe for Message
Blanket Implementations§
Source§impl<T> AbiEnumVisitor for T
impl<T> AbiEnumVisitor for T
default fn visit_for_abi( &self, _digester: &mut AbiDigester, ) -> Result<AbiDigester, DigestError>
Source§impl<T> AbiEnumVisitor for T
impl<T> AbiEnumVisitor for T
default fn visit_for_abi( &self, digester: &mut AbiDigester, ) -> Result<AbiDigester, DigestError>
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<'a, T> FromPyObject<'a> for T
impl<'a, T> FromPyObject<'a> for T
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more