Add account accessor functions (#7966)

This commit is contained in:
Jack May 2020-01-24 14:34:59 -08:00 committed by GitHub
parent 917067741a
commit 1b391dd36b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 33 additions and 29 deletions

View File

@ -16,32 +16,32 @@ fn process_instruction(
match instruction_data[0] {
1 => {
info!("modify first account data");
accounts[2].m.borrow_mut().data[0] = 1;
accounts[2].borrow_mut().data[0] = 1;
}
2 => {
info!("modify first account data");
accounts[3].m.borrow_mut().data[0] = 2;
accounts[3].borrow_mut().data[0] = 2;
}
3 => {
info!("modify both account data");
accounts[2].m.borrow_mut().data[0] += 1;
accounts[3].m.borrow_mut().data[0] += 2;
accounts[2].borrow_mut().data[0] += 1;
accounts[3].borrow_mut().data[0] += 2;
}
4 => {
info!("modify first account lamports");
*accounts[1].m.borrow_mut().lamports -= 1;
*accounts[2].m.borrow_mut().lamports += 1;
*accounts[1].borrow_mut().lamports -= 1;
*accounts[2].borrow_mut().lamports += 1;
}
5 => {
info!("modify first account lamports");
*accounts[1].m.borrow_mut().lamports -= 2;
*accounts[3].m.borrow_mut().lamports += 2;
*accounts[1].borrow_mut().lamports -= 2;
*accounts[3].borrow_mut().lamports += 2;
}
6 => {
info!("modify both account lamports");
*accounts[1].m.borrow_mut().lamports -= 3;
*accounts[2].m.borrow_mut().lamports += 1;
*accounts[3].m.borrow_mut().lamports += 2;
*accounts[1].borrow_mut().lamports -= 3;
*accounts[2].borrow_mut().lamports += 1;
*accounts[3].borrow_mut().lamports += 2;
}
_ => {
info!("Unrecognized command");

View File

@ -12,7 +12,7 @@ fn process_instruction(
// account 0 is the mint and not owned by this program, any debit of its lamports
// should result in a failed program execution. Test to ensure that this debit
// is seen by the runtime and fails as expected
*accounts[0].m.borrow_mut().lamports -= 1;
*accounts[0].borrow_mut().lamports -= 1;
SUCCESS
}

View File

@ -27,11 +27,11 @@ pub struct AccountInfo<'a> {
impl<'a> fmt::Debug for AccountInfo<'a> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let data_len = cmp::min(64, self.m.borrow().data.len());
let data_len = cmp::min(64, self.data_len());
let data_str = if data_len > 0 {
format!(
" data: {}",
hex::encode(self.m.borrow().data[..data_len].to_vec())
hex::encode(self.borrow().data[..data_len].to_vec())
)
} else {
"".to_string()
@ -39,8 +39,8 @@ impl<'a> fmt::Debug for AccountInfo<'a> {
write!(
f,
"AccountInfo {{ lamports: {} data.len: {} owner: {} {} }}",
self.m.borrow().lamports,
self.m.borrow().data.len(),
self.lamports(),
self.data_len(),
self.owner,
data_str,
)
@ -60,20 +60,24 @@ impl<'a> AccountInfo<'a> {
self.key
}
pub fn try_account_ref(&'a self) -> Result<Ref<AccountInfoMut>, u32> {
self.try_borrow()
pub fn lamports(&self) -> u64 {
*self.borrow().lamports
}
pub fn try_account_ref_mut(&'a self) -> Result<RefMut<'a, AccountInfoMut>, u32> {
self.try_borrow_mut()
pub fn data_len(&self) -> usize {
self.borrow().data.len()
}
fn try_borrow(&self) -> Result<Ref<AccountInfoMut>, u32> {
self.m.try_borrow().map_err(|_| std::u32::MAX)
pub fn data_is_empty(&self) -> bool {
self.borrow().data.is_empty()
}
fn try_borrow_mut(&self) -> Result<RefMut<'a, AccountInfoMut>, u32> {
self.m.try_borrow_mut().map_err(|_| std::u32::MAX)
pub fn borrow(&self) -> Ref<AccountInfoMut> {
self.m.borrow()
}
pub fn borrow_mut(&self) -> RefMut<AccountInfoMut<'a>> {
self.m.borrow_mut()
}
pub fn new(
@ -92,14 +96,14 @@ impl<'a> AccountInfo<'a> {
}
pub fn deserialize_data<T: serde::de::DeserializeOwned>(&self) -> Result<T, bincode::Error> {
bincode::deserialize(&self.m.borrow().data)
bincode::deserialize(&self.borrow().data)
}
pub fn serialize_data<T: serde::Serialize>(&mut self, state: &T) -> Result<(), bincode::Error> {
if bincode::serialized_size(state)? > self.m.borrow().data.len() as u64 {
if bincode::serialized_size(state)? > self.data_len() as u64 {
return Err(Box::new(bincode::ErrorKind::SizeLimit));
}
bincode::serialize_into(&mut self.m.borrow_mut().data[..], state)
bincode::serialize_into(&mut self.borrow_mut().data[..], state)
}
}

View File

@ -89,9 +89,9 @@ pub fn sol_log_params(accounts: &[AccountInfo], data: &[u8]) {
info!("- Key");
account.key.log();
info!("- Lamports");
info!(0, 0, 0, 0, *account.m.borrow().lamports);
info!(0, 0, 0, 0, account.lamports());
info!("- Account data length");
info!(0, 0, 0, 0, account.m.borrow().data.len());
info!(0, 0, 0, 0, account.data_len());
info!("- Owner");
account.owner.log();
}