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