Refactor: Use InvokeContext in all Syscalls (#21545)

* Adds ComputeMeter::mock_set_remaining().

* Adds InvokeContext::get_loader()

* Adds a LogCollector to InvokeContext::new_mock().

* Adds "invoke_context: Rc<RefCell<&'a mut dyn InvokeContext>>,"
to all SyscallObjects.

* Adds LogCollector::get_recorded_content().

* Removes loader_id parameter from bind_syscall_context_objects() and create_vm().
This commit is contained in:
Alexander Meißner
2021-12-02 08:58:02 +01:00
committed by GitHub
parent 9079de825b
commit 6330cbcf33
7 changed files with 863 additions and 557 deletions

View File

@ -12,7 +12,10 @@ use solana_bpf_loader_program::{
};
use solana_measure::measure::Measure;
use solana_program_runtime::invoke_context::{with_mock_invoke_context, InvokeContext};
use solana_rbpf::{elf::Executable, vm::{Config, InstructionMeter, SyscallRegistry}};
use solana_rbpf::{
elf::Executable,
vm::{Config, InstructionMeter, SyscallRegistry},
};
use solana_runtime::{
bank::Bank,
bank_client::BankClient,
@ -107,7 +110,6 @@ fn bench_program_alu(bencher: &mut Bencher) {
let compute_meter = invoke_context.get_compute_meter();
let mut instruction_meter = ThisInstructionMeter { compute_meter };
let mut vm = create_vm(
&loader_id,
&executable,
&mut inner_iter,
invoke_context,
@ -203,12 +205,7 @@ fn bench_create_vm(bencher: &mut Bencher) {
let loader_id = bpf_loader::id();
with_mock_invoke_context(loader_id, 10000001, |invoke_context| {
const BUDGET: u64 = 200_000;
let compute_meter = invoke_context.get_compute_meter();
{
let mut compute_meter = compute_meter.borrow_mut();
let to_consume = compute_meter.get_remaining() - BUDGET;
compute_meter.consume(to_consume).unwrap();
}
invoke_context.get_compute_meter().borrow_mut().mock_set_remaining(BUDGET);
// Serialize account data
let keyed_accounts = invoke_context.get_keyed_accounts().unwrap();
@ -230,7 +227,6 @@ fn bench_create_vm(bencher: &mut Bencher) {
bencher.iter(|| {
let _ = create_vm(
&loader_id,
&executable,
serialized.as_slice_mut(),
invoke_context,
@ -247,12 +243,7 @@ fn bench_instruction_count_tuner(_bencher: &mut Bencher) {
let loader_id = bpf_loader::id();
with_mock_invoke_context(loader_id, 10000001, |invoke_context| {
const BUDGET: u64 = 200_000;
let compute_meter = invoke_context.get_compute_meter();
{
let mut compute_meter = compute_meter.borrow_mut();
let to_consume = compute_meter.get_remaining() - BUDGET;
compute_meter.consume(to_consume).unwrap();
}
invoke_context.get_compute_meter().borrow_mut().mock_set_remaining(BUDGET);
// Serialize account data
let keyed_accounts = invoke_context.get_keyed_accounts().unwrap();
@ -271,9 +262,9 @@ fn bench_instruction_count_tuner(_bencher: &mut Bencher) {
register_syscalls(invoke_context).unwrap(),
)
.unwrap();
let compute_meter = invoke_context.get_compute_meter();
let mut instruction_meter = ThisInstructionMeter { compute_meter };
let mut vm = create_vm(
&loader_id,
&executable,
serialized.as_slice_mut(),
invoke_context,

View File

@ -227,7 +227,6 @@ fn run_program(name: &str) -> u64 {
let mut parameter_bytes = parameter_bytes.clone();
{
let mut vm = create_vm(
&loader_id,
&executable,
parameter_bytes.as_slice_mut(),
invoke_context,

View File

@ -151,7 +151,6 @@ fn check_loader_id(id: &Pubkey) -> bool {
/// Create the BPF virtual machine
pub fn create_vm<'a>(
loader_id: &'a Pubkey,
program: &'a Executable<BpfError, ThisInstructionMeter>,
parameter_bytes: &mut [u8],
invoke_context: &'a mut dyn InvokeContext,
@ -168,13 +167,7 @@ pub fn create_vm<'a>(
let mut heap =
AlignedMemory::new_with_size(compute_budget.heap_size.unwrap_or(HEAP_LENGTH), HOST_ALIGN);
let mut vm = EbpfVm::new(program, heap.as_slice_mut(), parameter_bytes)?;
syscalls::bind_syscall_context_objects(
loader_id,
&mut vm,
invoke_context,
heap,
orig_data_lens,
)?;
syscalls::bind_syscall_context_objects(&mut vm, invoke_context, heap, orig_data_lens)?;
Ok(vm)
}
@ -984,7 +977,6 @@ impl Executor for BpfExecutor {
let program_id = &invoke_context.get_caller()?.clone();
let compute_meter = invoke_context.get_compute_meter();
let mut vm = match create_vm(
loader_id,
&self.executable,
parameter_bytes.as_slice_mut(),
invoke_context,

File diff suppressed because it is too large Load Diff