From df782b93ae2c4196567340d9f6425b3cfc314fdc Mon Sep 17 00:00:00 2001 From: Jack May Date: Mon, 10 Feb 2020 21:33:29 -0800 Subject: [PATCH] Add is_writable to AccountInfo (#8196) --- programs/bpf_loader/src/lib.rs | 6 ++++-- programs/bpf_loader/test_elfs/noop.so | Bin 54488 -> 54840 bytes sdk/bpf/c/inc/solana_sdk.h | 17 +++++++++++++---- sdk/src/account_info.rs | 12 ++++++++++++ sdk/src/entrypoint.rs | 12 ++++++++++-- 5 files changed, 39 insertions(+), 8 deletions(-) diff --git a/programs/bpf_loader/src/lib.rs b/programs/bpf_loader/src/lib.rs index 5a533773f9..97cd6a9851 100644 --- a/programs/bpf_loader/src/lib.rs +++ b/programs/bpf_loader/src/lib.rs @@ -70,8 +70,9 @@ pub fn serialize_parameters( v.write_u8(position as u8).unwrap(); } else { v.write_u8(0).unwrap(); - v.write_u64::(keyed_account.signer_key().is_some() as u64) + v.write_u8(keyed_account.signer_key().is_some() as u8) .unwrap(); + v.write_u8(keyed_account.is_writable() as u8).unwrap(); v.write_all(keyed_account.unsigned_key().as_ref()).unwrap(); v.write_u64::(keyed_account.lamports()?) .unwrap(); @@ -98,7 +99,8 @@ pub fn deserialize_parameters( let (is_dup, _) = is_dup(&keyed_accounts[..i], keyed_account); start += 1; // is_dup if !is_dup { - start += mem::size_of::(); // is_signer + start += mem::size_of::(); // is_signer + start += mem::size_of::(); // is_writable start += mem::size_of::(); // pubkey keyed_account.try_account_ref_mut()?.lamports = LittleEndian::read_u64(&buffer[start..]); diff --git a/programs/bpf_loader/test_elfs/noop.so b/programs/bpf_loader/test_elfs/noop.so index 6790a77e77d3eecc68bd56985bff92d6b2a0a0cc..3e459f03197bac50a490c487337b0c256f3344af 100755 GIT binary patch delta 9343 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 delta 9055 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 diff --git a/sdk/bpf/c/inc/solana_sdk.h b/sdk/bpf/c/inc/solana_sdk.h index ceb3ca67c7..1010f078a7 100644 --- a/sdk/bpf/c/inc/solana_sdk.h +++ b/sdk/bpf/c/inc/solana_sdk.h @@ -146,8 +146,9 @@ SOL_FN_PREFIX bool SolPubkey_same(const SolPubkey *one, const SolPubkey *two) { */ typedef struct { SolPubkey *key; /** Public key of the account */ - bool is_signer; /** Transaction was signed by this account's key */ - uint64_t *lamports; /** Number of lamports owned by this account */ + bool is_signer; /** Transaction was signed by this account's key? */ + bool is_writable; /** Is the account writable? */ + uint64_t *lamports; /** Number of lamports owned by this account */ uint64_t userdata_len; /** Length of data in bytes */ uint8_t *userdata; /** On-chain data within this account */ SolPubkey *owner; /** Program that owns this account */ @@ -265,9 +266,15 @@ SOL_FN_PREFIX bool sol_deserialize( uint8_t dup_info = input[0]; input += sizeof(uint8_t); if (dup_info == 0) { + // is signer? + params->ka[i].is_signer = *(uint8_t *) input != 0; + input += sizeof(uint8_t); + + // is writable? + params->ka[i].is_writable = *(uint8_t *) input != 0; + input += sizeof(uint8_t); + // key - params->ka[i].is_signer = *(uint64_t *) input != 0; - input += sizeof(uint64_t); params->ka[i].key = (SolPubkey *) input; input += sizeof(SolPubkey); @@ -346,6 +353,8 @@ SOL_FN_PREFIX void sol_log_params(const SolParameters *params) { for (int i = 0; i < params->ka_num; i++) { sol_log(" - Is signer"); sol_log_64(0, 0, 0, 0, params->ka[i].is_signer); + sol_log(" - Is writable"); + sol_log_64(0, 0, 0, 0, params->ka[i].is_writable); sol_log(" - Key"); sol_log_key(params->ka[i].key); sol_log(" - Lamports"); diff --git a/sdk/src/account_info.rs b/sdk/src/account_info.rs index 62e8748199..90f036eede 100644 --- a/sdk/src/account_info.rs +++ b/sdk/src/account_info.rs @@ -12,6 +12,8 @@ pub struct AccountInfo<'a> { pub key: &'a Pubkey, // Was the transaction signed by this account's public key? pub is_signer: bool, + // Is the account writable? + pub is_writable: bool, /// Account members that are mutable by the program pub lamports: Rc>, /// Account members that are mutable by the program @@ -55,6 +57,10 @@ impl<'a> AccountInfo<'a> { self.key } + pub fn is_writable(&self) -> bool { + self.is_writable + } + pub fn lamports(&self) -> u64 { **self.lamports.borrow() } @@ -106,6 +112,7 @@ impl<'a> AccountInfo<'a> { pub fn new( key: &'a Pubkey, is_signer: bool, + is_writable: bool, lamports: &'a mut u64, data: &'a mut [u8], owner: &'a Pubkey, @@ -113,6 +120,7 @@ impl<'a> AccountInfo<'a> { Self { key, is_signer, + is_writable, lamports: Rc::new(RefCell::new(lamports)), data: Rc::new(RefCell::new(data)), owner, @@ -136,6 +144,7 @@ impl<'a> From<(&'a Pubkey, &'a mut Account)> for AccountInfo<'a> { Self::new( key, false, + false, &mut account.lamports, &mut account.data, &account.owner, @@ -148,6 +157,7 @@ impl<'a> From<(&'a Pubkey, bool, &'a mut Account)> for AccountInfo<'a> { Self::new( key, is_signer, + false, &mut account.lamports, &mut account.data, &account.owner, @@ -160,6 +170,7 @@ impl<'a> From<&'a mut (Pubkey, Account)> for AccountInfo<'a> { Self::new( key, false, + false, &mut account.lamports, &mut account.data, &account.owner, @@ -180,6 +191,7 @@ pub fn create_is_signer_account_infos<'a>( AccountInfo::new( key, *is_signer, + false, &mut account.lamports, &mut account.data, &account.owner, diff --git a/sdk/src/entrypoint.rs b/sdk/src/entrypoint.rs index 1035ea4f94..50174bc95c 100644 --- a/sdk/src/entrypoint.rs +++ b/sdk/src/entrypoint.rs @@ -69,10 +69,17 @@ pub unsafe fn deserialize<'a>(input: *mut u8) -> (&'a Pubkey, Vec(); + offset += size_of::(); + + let is_writable = { + #[allow(clippy::cast_ptr_alignment)] + let is_writable = *(input.add(offset) as *const u8); + (is_writable != 0) + }; + offset += size_of::(); let key: &Pubkey = &*(input.add(offset) as *const Pubkey); offset += size_of::(); @@ -95,6 +102,7 @@ pub unsafe fn deserialize<'a>(input: *mut u8) -> (&'a Pubkey, Vec