* Native/builtin programs now receive an InvokeContext (cherry picked from commitdf8dab9d2b) * Remove MessageProcessor::loaders (cherry picked from commit2664a1f7ef) * Remove Entrypoint type (cherry picked from commit225bed11c7) * Remove programs clone() (cherry picked from commit33884d847a) * Add sol_log_compute_units syscall (cherry picked from commit66e51a7363) * Add Bank::set_bpf_compute_budget() (cherry picked from commit7d686b72a0) * Rebase Co-authored-by: Michael Vines <mvines@gmail.com>
		
			
				
	
	
		
			77 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| //! @brief Example Rust-based BPF sanity program that prints out the parameters passed to it
 | |
| 
 | |
| #![allow(unreachable_code)]
 | |
| 
 | |
| extern crate solana_program;
 | |
| use solana_program::{
 | |
|     account_info::AccountInfo, bpf_loader, entrypoint, entrypoint::ProgramResult, info, log::*,
 | |
|     pubkey::Pubkey,
 | |
| };
 | |
| 
 | |
| #[derive(Debug, PartialEq)]
 | |
| struct SStruct {
 | |
|     x: u64,
 | |
|     y: u64,
 | |
|     z: u64,
 | |
| }
 | |
| 
 | |
| #[inline(never)]
 | |
| fn return_sstruct() -> SStruct {
 | |
|     SStruct { x: 1, y: 2, z: 3 }
 | |
| }
 | |
| 
 | |
| entrypoint!(process_instruction);
 | |
| fn process_instruction(
 | |
|     program_id: &Pubkey,
 | |
|     accounts: &[AccountInfo],
 | |
|     instruction_data: &[u8],
 | |
| ) -> ProgramResult {
 | |
|     info!("Program identifier:");
 | |
|     program_id.log();
 | |
| 
 | |
|     assert!(!bpf_loader::check_id(program_id));
 | |
| 
 | |
|     // Log the provided account keys and instruction input data.  In the case of
 | |
|     // the no-op program, no account keys or input data are expected but real
 | |
|     // programs will have specific requirements so they can do their work.
 | |
|     info!("Account keys and instruction input data:");
 | |
|     sol_log_params(accounts, instruction_data);
 | |
| 
 | |
|     {
 | |
|         // Test - use std methods, unwrap
 | |
| 
 | |
|         // valid bytes, in a stack-allocated array
 | |
|         let sparkle_heart = [240, 159, 146, 150];
 | |
|         let result_str = std::str::from_utf8(&sparkle_heart).unwrap();
 | |
|         assert_eq!(4, result_str.len());
 | |
|         assert_eq!("💖", result_str);
 | |
|         info!(result_str);
 | |
|     }
 | |
| 
 | |
|     {
 | |
|         // Test - struct return
 | |
| 
 | |
|         let s = return_sstruct();
 | |
|         assert_eq!(s.x + s.y + s.z, 6);
 | |
|     }
 | |
| 
 | |
|     {
 | |
|         // Test - arch config
 | |
|         #[cfg(not(target_arch = "bpf"))]
 | |
|         panic!();
 | |
|     }
 | |
| 
 | |
|     sol_log_compute_units();
 | |
|     Ok(())
 | |
| }
 | |
| 
 | |
| #[cfg(test)]
 | |
| mod test {
 | |
|     use super::*;
 | |
| 
 | |
|     #[test]
 | |
|     fn test_return_sstruct() {
 | |
|         assert_eq!(SStruct { x: 1, y: 2, z: 3 }, return_sstruct());
 | |
|     }
 | |
| }
 |