Armani Ferrante 3 年 前
コミット
1741b6e5d3

+ 1 - 0
CHANGELOG.md

@@ -19,6 +19,7 @@ incremented for features.
 
 * lang: Enforce that the payer for an init-ed account be marked `mut` ([#1271](https://github.com/project-serum/anchor/pull/1271)).
 * lang, client, ts: 8 byte account discriminator has been replaced with a versioned account header. This is a state breaking change. If you have existing Anchor programs, previously deployed, one can continue to use the old 8 byte account discriminator by using the `deprecated-layout` feature flag ([#1415](https://github.com/project-serum/anchor/pull/1415)).
+* lang: The `AccountLoader` and `Loader`'s `load_init` method has been removed. Instead, use `load_mut` ([#1415](https://github.com/project-serum/anchor/pull/1415)).
 * lang: All error-related code is now in the error module ([#1426](https://github.com/project-serum/anchor/pull/1426)).
 * ts: `BorshAccountsCoder.accountDiscriminator` method has been replaced with `BorshAccountHeader.discriminator` ([#1415](https://github.com/project-serum/anchor/pull/1415)).
 

+ 4 - 2
lang/attribute/account/src/lib.rs

@@ -179,10 +179,12 @@ pub fn account(
 
                 #[automatically_derived]
                 impl #impl_gen anchor_lang::AccountSerialize for #account_name #type_gen #where_clause {
-                    fn try_serialize<W: std::io::Write>(&self, writer: &mut W) -> std::result::Result<(), ProgramError> {
+                    fn try_serialize(&self, buf: &mut [u8]) -> std::result::Result<(), ProgramError> {
+                        let dst = anchor_lang::accounts::header::read_data_mut(buf);
+                        let mut writer = std::io::Cursor::new(dst);
                         AnchorSerialize::serialize(
                             self,
-                            writer
+                            &mut writer
                         )
                             .map_err(|_| anchor_lang::error::ErrorCode::AccountDidNotSerialize)?;
                         Ok(())

+ 1 - 3
lang/src/accounts/account.rs

@@ -335,9 +335,7 @@ impl<'info, T: AccountSerialize + AccountDeserialize + Owner + Clone> AccountsEx
         if &T::owner() == program_id {
             let info = self.to_account_info();
             let mut data = info.try_borrow_mut_data()?;
-            let dst = header::read_data_mut(&mut data);
-            let mut cursor = std::io::Cursor::new(dst);
-            self.account.try_serialize(&mut cursor)?;
+            self.account.try_serialize(&mut data)?;
         }
         Ok(())
     }

+ 1 - 3
lang/src/accounts/program_account.rs

@@ -100,9 +100,7 @@ impl<'info, T: AccountSerialize + AccountDeserialize + Clone> AccountsExit<'info
     fn exit(&self, _program_id: &Pubkey) -> ProgramResult {
         let info = self.to_account_info();
         let mut data = info.try_borrow_mut_data()?;
-        let dst = header::read_data_mut(&mut data);
-        let mut cursor = std::io::Cursor::new(dst);
-        self.inner.account.try_serialize(&mut cursor)?;
+        self.inner.account.try_serialize(&mut data)?;
         Ok(())
     }
 }

+ 1 - 3
lang/src/accounts/state.rs

@@ -152,9 +152,7 @@ impl<'info, T: AccountSerialize + AccountDeserialize + Clone> AccountsExit<'info
     fn exit(&self, _program_id: &Pubkey) -> ProgramResult {
         let info = self.to_account_info();
         let mut data = info.try_borrow_mut_data()?;
-        let dst: &mut [u8] = &mut data;
-        let mut cursor = std::io::Cursor::new(dst);
-        self.inner.account.try_serialize(&mut cursor)?;
+        self.inner.account.try_serialize(&mut data)?;
         Ok(())
     }
 }

+ 2 - 15
lang/src/bpf_upgradeable_state.rs

@@ -42,15 +42,7 @@ impl AccountDeserialize for ProgramData {
     }
 }
 
-impl AccountSerialize for ProgramData {
-    fn try_serialize<W: std::io::Write>(
-        &self,
-        _writer: &mut W,
-    ) -> Result<(), solana_program::program_error::ProgramError> {
-        // no-op
-        Ok(())
-    }
-}
+impl AccountSerialize for ProgramData {}
 
 impl Owner for ProgramData {
     fn owner() -> solana_program::pubkey::Pubkey {
@@ -64,12 +56,7 @@ impl Owner for UpgradeableLoaderState {
     }
 }
 
-impl AccountSerialize for UpgradeableLoaderState {
-    fn try_serialize<W: std::io::Write>(&self, _writer: &mut W) -> Result<(), ProgramError> {
-        // no-op
-        Ok(())
-    }
-}
+impl AccountSerialize for UpgradeableLoaderState {}
 
 impl AccountDeserialize for UpgradeableLoaderState {
     fn try_deserialize(buf: &mut &[u8]) -> Result<Self, ProgramError> {

+ 1 - 1
lang/src/lib.rs

@@ -147,7 +147,7 @@ where
 /// [`#[account]`](./attr.account.html) attribute.
 pub trait AccountSerialize {
     /// Serializes the account data into `writer`.
-    fn try_serialize<W: Write>(&self, _writer: &mut W) -> Result<(), ProgramError> {
+    fn try_serialize(&self, _data: &mut [u8]) -> Result<(), ProgramError> {
         Ok(())
     }
 }

+ 4 - 16
lang/syn/src/codegen/program/handlers.rs

@@ -128,10 +128,7 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream {
 
                 // Store the new account data.
                 let mut data = accounts.to.try_borrow_mut_data()?;
-                let dst: &mut [u8] = &mut data;
-                let mut cursor = std::io::Cursor::new(dst);
-                std::io::Seek::seek(&mut cursor, std::io::SeekFrom::Start(8)).unwrap();
-                idl_account.try_serialize(&mut cursor)?;
+                idl_account.try_serialize(&mut data)?;
 
                 Ok(())
             }
@@ -364,10 +361,7 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream {
                             // Serialize the state and save it to storage.
                             ctor_user_def_accounts.exit(program_id)?;
                             let mut data = ctor_accounts.to.try_borrow_mut_data()?;
-                            let dst: &mut [u8] = &mut data;
-                            let mut cursor = std::io::Cursor::new(dst);
-                            std::io::Seek::seek(&mut cursor, std::io::SeekFrom::Start(8)).unwrap();
-                            instance.try_serialize(&mut cursor)?;
+                            instance.try_serialize(&mut data)?;
 
                             Ok(())
                         }
@@ -516,10 +510,7 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream {
                                     accounts.exit(program_id)?;
                                     let acc_info = state.to_account_info();
                                     let mut data = acc_info.try_borrow_mut_data()?;
-                                    let dst: &mut [u8] = &mut data;
-                                    let mut cursor = std::io::Cursor::new(dst);
-																		std::io::Seek::seek(&mut cursor, std::io::SeekFrom::Start(8)).unwrap();
-                                    state.try_serialize(&mut cursor)?;
+                                    state.try_serialize(&mut data)?;
 
                                     Ok(())
                                 }
@@ -645,10 +636,7 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream {
                                             accounts.exit(program_id)?;
                                             let acc_info = state.to_account_info();
                                             let mut data = acc_info.try_borrow_mut_data()?;
-                                            let dst: &mut [u8] = &mut data;
-                                            let mut cursor = std::io::Cursor::new(dst);
-																						std::io::Seek::seek(&mut cursor, std::io::SeekFrom::Start(8)).unwrap();
-                                            state.try_serialize(&mut cursor)?;
+                                            state.try_serialize(&mut data)?;
 
                                             Ok(())
                                         }