* Drop write lock on sysvars * adds env var for demoting sysvar write lock demotion * moves demote logic to is_writable * feature gates sysvar write lock demotion * adds builtins to write lock demotion * adds system program id to builtins * adds Feature111... * adds an abi-freeze test * mvines set of builtin program keys Co-authored-by: Michael Vines <mvines@gmail.com> * update tests * adds bpf loader keys * Add test sysvar * Plumb demote_sysvar to is_writable * more plumbing of demote_sysvar_write_locks to is_writable * patches test_program_bpf_instruction_introspection * hard codes demote_sysvar_write_locks to false for serialization/encoding methods * Revert "hard codes demote_sysvar_write_locks to false for serialization/encoding methods" This reverts commit ae3e2d2e777437bddd753933097a210dcbc1b1fc. * change the hardcoded ones to demote_sysvar_write_locks=true * Use data_as_mut_slice Co-authored-by: behzad nouri <behzadnouri@gmail.com> Co-authored-by: Michael Vines <mvines@gmail.com>
71 lines
2.1 KiB
Rust
71 lines
2.1 KiB
Rust
use solana_sdk::message::Message;
|
|
|
|
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
|
#[serde(rename_all = "camelCase")]
|
|
pub struct ParsedAccount {
|
|
pub pubkey: String,
|
|
pub writable: bool,
|
|
pub signer: bool,
|
|
}
|
|
|
|
pub fn parse_accounts(message: &Message) -> Vec<ParsedAccount> {
|
|
let mut accounts: Vec<ParsedAccount> = vec![];
|
|
for (i, account_key) in message.account_keys.iter().enumerate() {
|
|
accounts.push(ParsedAccount {
|
|
pubkey: account_key.to_string(),
|
|
writable: message.is_writable(i, /*demote_sysvar_write_locks=*/ true),
|
|
signer: message.is_signer(i),
|
|
});
|
|
}
|
|
accounts
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod test {
|
|
use super::*;
|
|
use solana_sdk::message::MessageHeader;
|
|
|
|
#[test]
|
|
fn test_parse_accounts() {
|
|
let pubkey0 = solana_sdk::pubkey::new_rand();
|
|
let pubkey1 = solana_sdk::pubkey::new_rand();
|
|
let pubkey2 = solana_sdk::pubkey::new_rand();
|
|
let pubkey3 = solana_sdk::pubkey::new_rand();
|
|
let message = Message {
|
|
header: MessageHeader {
|
|
num_required_signatures: 2,
|
|
num_readonly_signed_accounts: 1,
|
|
num_readonly_unsigned_accounts: 1,
|
|
},
|
|
account_keys: vec![pubkey0, pubkey1, pubkey2, pubkey3],
|
|
..Message::default()
|
|
};
|
|
|
|
assert_eq!(
|
|
parse_accounts(&message),
|
|
vec![
|
|
ParsedAccount {
|
|
pubkey: pubkey0.to_string(),
|
|
writable: true,
|
|
signer: true,
|
|
},
|
|
ParsedAccount {
|
|
pubkey: pubkey1.to_string(),
|
|
writable: false,
|
|
signer: true,
|
|
},
|
|
ParsedAccount {
|
|
pubkey: pubkey2.to_string(),
|
|
writable: true,
|
|
signer: false,
|
|
},
|
|
ParsedAccount {
|
|
pubkey: pubkey3.to_string(),
|
|
writable: false,
|
|
signer: false,
|
|
},
|
|
]
|
|
);
|
|
}
|
|
}
|