solana/runtime/src/loader_utils.rs

66 lines
2.0 KiB
Rust
Raw Normal View History

2019-03-21 07:14:14 -07:00
use serde::Serialize;
2020-01-28 17:03:20 -08:00
use solana_sdk::{
client::Client,
instruction::{AccountMeta, Instruction},
loader_instruction,
message::Message,
pubkey::Pubkey,
signature::{Keypair, Signer},
2020-01-28 17:03:20 -08:00
system_instruction,
};
2019-03-02 20:03:36 -08:00
pub fn load_program<T: Client>(
bank_client: &T,
from_keypair: &Keypair,
loader_pubkey: &Pubkey,
2019-03-21 07:14:14 -07:00
program: Vec<u8>,
) -> Pubkey {
let program_keypair = Keypair::new();
let program_pubkey = program_keypair.pubkey();
2019-03-02 20:03:36 -08:00
let instruction = system_instruction::create_account(
&from_keypair.pubkey(),
2019-03-21 07:14:14 -07:00
&program_pubkey,
2019-03-02 20:03:36 -08:00
1,
program.len() as u64,
loader_pubkey,
2019-03-02 20:03:36 -08:00
);
bank_client
.send_and_confirm_message(
&[from_keypair, &program_keypair],
Message::new(&[instruction], Some(&from_keypair.pubkey())),
)
.unwrap();
2019-03-02 20:03:36 -08:00
let chunk_size = 256; // Size of chunk just needs to fit into tx
2019-03-02 20:03:36 -08:00
let mut offset = 0;
for chunk in program.chunks(chunk_size) {
2019-03-21 07:14:14 -07:00
let instruction =
loader_instruction::write(&program_pubkey, loader_pubkey, offset, chunk.to_vec());
let message = Message::new(&[instruction], Some(&from_keypair.pubkey()));
bank_client
.send_and_confirm_message(&[from_keypair, &program_keypair], message)
.unwrap();
2019-03-02 20:03:36 -08:00
offset += chunk_size as u32;
}
let instruction = loader_instruction::finalize(&program_pubkey, loader_pubkey);
let message = Message::new(&[instruction], Some(&from_keypair.pubkey()));
bank_client
.send_and_confirm_message(&[from_keypair, &program_keypair], message)
.unwrap();
2019-03-21 07:14:14 -07:00
program_pubkey
}
2019-03-02 20:03:36 -08:00
// Return an Instruction that invokes `program_id` with `data` and required
// a signature from `from_pubkey`.
pub fn create_invoke_instruction<T: Serialize>(
from_pubkey: Pubkey,
program_id: Pubkey,
data: &T,
) -> Instruction {
let account_metas = vec![AccountMeta::new(from_pubkey, true)];
Instruction::new(program_id, data, account_metas)
2019-03-02 20:03:36 -08:00
}