parent
b982595c73
commit
24b513c3c7
|
@ -10,7 +10,7 @@ elf = "0.0.10"
|
|||
env_logger = "0.5.12"
|
||||
libc = "0.2.43"
|
||||
log = "0.4.2"
|
||||
rbpf = { git = "https://github.com/qmonnet/rbpf", rev="bc41ec47d9b51751585f6ddcde1d1eb1afe2be69" }
|
||||
rbpf = "0.1.0"
|
||||
serde = "1.0.27"
|
||||
serde_derive = "1.0.27"
|
||||
solana_program_interface = { path = "../../../common" }
|
||||
|
|
|
@ -21,18 +21,18 @@ use std::sync::{Once, ONCE_INIT};
|
|||
fn create_vm(prog: &[u8]) -> Result<rbpf::EbpfVmRaw, Error> {
|
||||
let mut vm = rbpf::EbpfVmRaw::new(None)?;
|
||||
vm.set_verifier(bpf_verifier::check)?;
|
||||
vm.set_prog(&prog)?;
|
||||
vm.set_program(&prog)?;
|
||||
vm.register_helper(
|
||||
rbpf::helpers::BPF_TRACE_PRINTK_IDX,
|
||||
rbpf::helpers::bpf_trace_printf,
|
||||
);
|
||||
)?;
|
||||
Ok(vm)
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
fn dump_prog(name: &str, prog: &[u8]) {
|
||||
fn dump_program(key: &Pubkey, prog: &[u8]) {
|
||||
let mut eight_bytes: Vec<u8> = Vec::new();
|
||||
println!("BPF Program: {}", name);
|
||||
println!("BPF Program: {:?}", key);
|
||||
for i in prog.iter() {
|
||||
if eight_bytes.len() >= 7 {
|
||||
println!("{:02X?}", eight_bytes);
|
||||
|
@ -91,6 +91,7 @@ pub extern "C" fn process(keyed_accounts: &mut [KeyedAccount], tx_data: &[u8]) -
|
|||
if keyed_accounts[0].account.executable {
|
||||
let prog = keyed_accounts[0].account.userdata.clone();
|
||||
trace!("Call BPF, {} Instructions", prog.len() / 8);
|
||||
//dump_program(keyed_accounts[0].key, &prog);
|
||||
let vm = match create_vm(&prog) {
|
||||
Ok(vm) => vm,
|
||||
Err(e) => {
|
||||
|
@ -99,9 +100,14 @@ pub extern "C" fn process(keyed_accounts: &mut [KeyedAccount], tx_data: &[u8]) -
|
|||
}
|
||||
};
|
||||
let mut v = serialize_parameters(&mut keyed_accounts[1..], &tx_data);
|
||||
if 0 == vm.prog_exec(v.as_mut_slice()) {
|
||||
warn!("BPF program failed");
|
||||
return false;
|
||||
match vm.execute_program(v.as_mut_slice()) {
|
||||
Ok(status) => if 0 == status {
|
||||
return false;
|
||||
},
|
||||
Err(e) => {
|
||||
warn!("{}", e);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
deserialize_parameters(&mut keyed_accounts[1..], &v);
|
||||
} else if let Ok(instruction) = deserialize(tx_data) {
|
||||
|
|
Loading…
Reference in New Issue