Add CPI support for upgradeable loader (#14193)

This commit is contained in:
Jack May
2020-12-17 15:39:49 -08:00
committed by GitHub
parent a5db6399ad
commit e8cc0bef6c
10 changed files with 204 additions and 19 deletions

View File

@ -0,0 +1,18 @@
[package]
name = "solana-bpf-rust-invoke-and-return"
version = "1.6.0"
description = "Solana BPF test program written in Rust"
authors = ["Solana Maintainers <maintainers@solana.foundation>"]
repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0"
homepage = "https://solana.com/"
edition = "2018"
[dependencies]
solana-program = { path = "../../../../sdk/program", version = "1.6.0" }
[lib]
crate-type = ["cdylib"]
[package.metadata.docs.rs]
targets = ["x86_64-unknown-linux-gnu"]

View File

@ -0,0 +1,2 @@
[target.bpfel-unknown-unknown.dependencies.std]
features = []

View File

@ -0,0 +1,36 @@
//! @brief Invokes an instruction and returns an error, the instruction invoked
//! uses the instruction data provided and all the accounts
use solana_program::{
account_info::AccountInfo, bpf_loader_upgradeable, entrypoint, entrypoint::ProgramResult,
instruction::AccountMeta, instruction::Instruction, program::invoke, pubkey::Pubkey,
};
entrypoint!(process_instruction);
#[allow(clippy::unnecessary_wraps)]
fn process_instruction(
_program_id: &Pubkey,
accounts: &[AccountInfo],
instruction_data: &[u8],
) -> ProgramResult {
let to_call = accounts[0].key;
let infos = accounts;
let last = if bpf_loader_upgradeable::check_id(accounts[0].owner) {
accounts.len() - 1
} else {
accounts.len()
};
let instruction = Instruction {
accounts: accounts[1..last]
.iter()
.map(|acc| AccountMeta {
pubkey: *acc.key,
is_signer: acc.is_signer,
is_writable: acc.is_writable,
})
.collect(),
data: instruction_data.to_owned(),
program_id: *to_call,
};
invoke(&instruction, &infos)
}