Refactor: Remove Message and CompiledInstruction from InvokeContext interfaces (#22102)
				
					
				
			* Introduces InstructionAccount which is like AccountMeta but uses an index instead of a Pubkey * Renames InvokeContext::create_message() to InvokeContext::prepare_instruction() * Removes Message and CompiledInstruction from InvokeContext interfaces. * Resolves TODOs of sol_invoke_signed() in program-test. * Moves CompiledInstruction::visit_each_account() into invoke_context.rs
This commit is contained in:
		
				
					committed by
					
						 GitHub
						GitHub
					
				
			
			
				
	
			
			
			
						parent
						
							214b561a28
						
					
				
				
					commit
					2ab4f34c02
				
			| @@ -231,30 +231,19 @@ impl solana_sdk::program_stubs::SyscallStubs for SyscallStubs { | ||||
|         account_infos: &[AccountInfo], | ||||
|         signers_seeds: &[&[&[u8]]], | ||||
|     ) -> ProgramResult { | ||||
|         // | ||||
|         // TODO: Merge the business logic below with the BPF invoke path in | ||||
|         //       programs/bpf_loader/src/syscalls.rs | ||||
|         // | ||||
|  | ||||
|         let invoke_context = get_invoke_context(); | ||||
|         let log_collector = invoke_context.get_log_collector(); | ||||
|  | ||||
|         let caller = *invoke_context.get_caller().expect("get_caller"); | ||||
|         let message = Message::new(&[instruction.clone()], None); | ||||
|         let program_id_index = message.instructions[0].program_id_index as usize; | ||||
|         let program_id = message.account_keys[program_id_index]; | ||||
|         // TODO don't have the caller's keyed_accounts so can't validate writer or signer escalation or deescalation yet | ||||
|         let caller_privileges = message | ||||
|             .account_keys | ||||
|             .iter() | ||||
|             .enumerate() | ||||
|             .map(|(i, _)| message.is_writable(i)) | ||||
|             .collect::<Vec<bool>>(); | ||||
|  | ||||
|         stable_log::program_invoke(&log_collector, &program_id, invoke_context.invoke_depth()); | ||||
|         stable_log::program_invoke( | ||||
|             &log_collector, | ||||
|             &instruction.program_id, | ||||
|             invoke_context.invoke_depth(), | ||||
|         ); | ||||
|  | ||||
|         // Convert AccountInfos into Accounts | ||||
|         let mut account_indices = Vec::with_capacity(message.account_keys.len()); | ||||
|         let mut accounts = Vec::with_capacity(message.account_keys.len()); | ||||
|         for (i, account_key) in message.account_keys.iter().enumerate() { | ||||
|             let (account_index, account_info) = invoke_context | ||||
| @@ -281,47 +270,26 @@ impl solana_sdk::program_stubs::SyscallStubs for SyscallStubs { | ||||
|             } else { | ||||
|                 None | ||||
|             }; | ||||
|             account_indices.push(account_index); | ||||
|             accounts.push((account_index, account_info)); | ||||
|         } | ||||
|         let program_account_index = invoke_context.find_index_of_account(&program_id).unwrap(); | ||||
|         let program_indices = vec![program_account_index]; | ||||
|  | ||||
|         // Check Signers | ||||
|         for account_info in account_infos { | ||||
|             for instruction_account in &instruction.accounts { | ||||
|                 if *account_info.unsigned_key() == instruction_account.pubkey | ||||
|                     && instruction_account.is_signer | ||||
|                     && !account_info.is_signer | ||||
|                 { | ||||
|                     let mut program_signer = false; | ||||
|                     for seeds in signers_seeds.iter() { | ||||
|                         let signer = Pubkey::create_program_address(seeds, &caller).unwrap(); | ||||
|                         if instruction_account.pubkey == signer { | ||||
|                             program_signer = true; | ||||
|                             break; | ||||
|                         } | ||||
|                     } | ||||
|                     assert!( | ||||
|                         program_signer, | ||||
|                         "Missing signer for {}", | ||||
|                         instruction_account.pubkey | ||||
|                     ); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         let signers = signers_seeds | ||||
|             .iter() | ||||
|             .map(|seeds| Pubkey::create_program_address(seeds, &caller).unwrap()) | ||||
|             .collect::<Vec<_>>(); | ||||
|         let (instruction_accounts, caller_write_privileges, program_indices) = invoke_context | ||||
|             .prepare_instruction(instruction, &signers) | ||||
|             .unwrap(); | ||||
|  | ||||
|         if let Some(instruction_recorder) = &invoke_context.instruction_recorder { | ||||
|             instruction_recorder.record_instruction(instruction.clone()); | ||||
|         } | ||||
|  | ||||
|         invoke_context | ||||
|             .process_instruction( | ||||
|                 &message, | ||||
|                 &message.instructions[0], | ||||
|                 &instruction.data, | ||||
|                 &instruction_accounts, | ||||
|                 Some(&caller_write_privileges), | ||||
|                 &program_indices, | ||||
|                 &account_indices, | ||||
|                 &caller_privileges, | ||||
|             ) | ||||
|             .map_err(|err| ProgramError::try_from(err).unwrap_or_else(|err| panic!("{}", err)))?; | ||||
|  | ||||
| @@ -353,7 +321,7 @@ impl solana_sdk::program_stubs::SyscallStubs for SyscallStubs { | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         stable_log::program_success(&log_collector, &program_id); | ||||
|         stable_log::program_success(&log_collector, &instruction.program_id); | ||||
|         Ok(()) | ||||
|     } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user