From 19c0b3c66744538633c8804cadf065210665313a Mon Sep 17 00:00:00 2001 From: Xuejie Xiao Date: Wed, 12 Feb 2025 12:38:02 +0800 Subject: [PATCH] Remove VmData structure per review comments --- script/src/scheduler.rs | 17 +- script/src/syscalls/close.rs | 6 +- script/src/syscalls/debugger.rs | 10 +- script/src/syscalls/exec.rs | 28 ++-- script/src/syscalls/exec_v2.rs | 9 +- script/src/syscalls/generator.rs | 45 +++--- script/src/syscalls/inherited_fd.rs | 6 +- script/src/syscalls/load_block_extension.rs | 20 +-- script/src/syscalls/load_cell.rs | 18 +-- script/src/syscalls/load_cell_data.rs | 4 +- script/src/syscalls/load_header.rs | 25 ++- script/src/syscalls/load_input.rs | 12 +- script/src/syscalls/load_script.rs | 10 +- script/src/syscalls/load_script_hash.rs | 10 +- script/src/syscalls/load_tx.rs | 6 +- script/src/syscalls/load_witness.rs | 14 +- script/src/syscalls/pipe.rs | 6 +- script/src/syscalls/process_id.rs | 7 +- script/src/syscalls/read.rs | 6 +- script/src/syscalls/spawn.rs | 8 +- script/src/syscalls/tests/utils.rs | 21 ++- .../syscalls/tests/vm_latest/syscalls_1.rs | 152 +++++++++--------- .../syscalls/tests/vm_latest/syscalls_2.rs | 8 +- script/src/syscalls/wait.rs | 6 +- script/src/syscalls/write.rs | 6 +- script/src/types.rs | 75 ++++----- 26 files changed, 248 insertions(+), 287 deletions(-) diff --git a/script/src/scheduler.rs b/script/src/scheduler.rs index 3e3f386728..4ace66ab37 100644 --- a/script/src/scheduler.rs +++ b/script/src/scheduler.rs @@ -6,7 +6,7 @@ use crate::syscalls::{ use crate::types::{ CoreMachineType, DataLocation, DataPieceId, DebugContext, Fd, FdArgs, FullSuspendedState, - Machine, Message, ReadState, RunMode, SgData, VmContext, VmData, VmId, VmState, WriteState, + Machine, Message, ReadState, RunMode, SgData, VmContext, VmId, VmState, WriteState, FIRST_FD_SLOT, FIRST_VM_ID, }; use ckb_traits::{CellDataProvider, ExtensionProvider, HeaderProvider}; @@ -884,21 +884,20 @@ where // We will update max_cycles for each machine when it gets a chance to run u64::MAX, ); - let vm_data = Arc::new(VmData { - sg_data: Arc::clone(&self.sg_data), - vm_id: *id, - }); let vm_context = VmContext { base_cycles: Arc::clone(&self.total_cycles), message_box: Arc::clone(&self.message_box), - snapshot2_context: Arc::new(Mutex::new(Snapshot2Context::new(Arc::clone(&vm_data)))), + snapshot2_context: Arc::new(Mutex::new(Snapshot2Context::new(Arc::clone( + &self.sg_data, + )))), }; let machine_builder = DefaultMachineBuilder::new(core_machine) .instruction_cycle_func(Box::new(estimate_cycles)); - let machine_builder = generate_ckb_syscalls(&vm_data, &vm_context, &self.debug_context) - .into_iter() - .fold(machine_builder, |builder, syscall| builder.syscall(syscall)); + let machine_builder = + generate_ckb_syscalls(id, &self.sg_data, &vm_context, &self.debug_context) + .into_iter() + .fold(machine_builder, |builder, syscall| builder.syscall(syscall)); let default_machine = machine_builder.build(); Ok((vm_context, Machine::new(default_machine))) } diff --git a/script/src/syscalls/close.rs b/script/src/syscalls/close.rs index 88c0124326..536465b9da 100644 --- a/script/src/syscalls/close.rs +++ b/script/src/syscalls/close.rs @@ -1,5 +1,5 @@ use crate::syscalls::{CLOSE, SPAWN_YIELD_CYCLES_BASE}; -use crate::types::{Fd, Message, VmContext, VmData, VmId}; +use crate::types::{Fd, Message, VmContext, VmId}; use ckb_traits::{CellDataProvider, ExtensionProvider, HeaderProvider}; use ckb_vm::{ registers::{A0, A7}, @@ -14,12 +14,12 @@ pub struct Close { } impl Close { - pub fn new
(vm_data: &Arc>, vm_context: &VmContext
) -> Self + pub fn new
(vm_id: &VmId, vm_context: &VmContext
) -> Self where DL: CellDataProvider + HeaderProvider + ExtensionProvider + Send + Sync + Clone + 'static, { Self { - id: vm_data.vm_id, + id: *vm_id, message_box: Arc::clone(&vm_context.message_box), } } diff --git a/script/src/syscalls/debugger.rs b/script/src/syscalls/debugger.rs index 1e57502f34..d71732303e 100644 --- a/script/src/syscalls/debugger.rs +++ b/script/src/syscalls/debugger.rs @@ -1,4 +1,4 @@ -use crate::types::{DebugContext, DebugPrinter, VmData}; +use crate::types::{DebugContext, DebugPrinter, SgData}; use crate::{cost_model::transferred_byte_cycles, syscalls::DEBUG_PRINT_SYSCALL_NUMBER}; use ckb_vm::{ registers::{A0, A7}, @@ -7,14 +7,14 @@ use ckb_vm::{ use std::sync::Arc; pub struct Debugger
{ - vm_data: Arc>, + sg_data: Arc>, printer: DebugPrinter, } impl
Debugger
{ - pub fn new(vm_data: &Arc>, debug_context: &DebugContext) -> Debugger
{ + pub fn new(sg_data: &Arc>, debug_context: &DebugContext) -> Debugger
{ Debugger { - vm_data: Arc::clone(vm_data), + sg_data: Arc::clone(sg_data), printer: Arc::clone(&debug_context.debug_printer), } } @@ -49,7 +49,7 @@ impl Syscalls for Debugger
{ machine.add_cycles_no_checking(transferred_byte_cycles(buffer.len() as u64))?; let s = String::from_utf8(buffer) .map_err(|e| VMError::External(format!("String from buffer {e:?}")))?; - (self.printer)(self.vm_data.current_script_hash(), s.as_str()); + (self.printer)(self.sg_data.current_script_hash(), s.as_str()); Ok(true) } diff --git a/script/src/syscalls/exec.rs b/script/src/syscalls/exec.rs index 56b7fabc36..97140104fd 100644 --- a/script/src/syscalls/exec.rs +++ b/script/src/syscalls/exec.rs @@ -3,7 +3,7 @@ use crate::syscalls::{ Place, Source, SourceEntry, EXEC, INDEX_OUT_OF_BOUND, MAX_ARGV_LENGTH, SLICE_OUT_OF_BOUND, WRONG_FORMAT, }; -use crate::types::VmData; +use crate::types::SgData; use ckb_traits::CellDataProvider; use ckb_types::core::cell::CellMeta; use ckb_types::core::error::ARGV_TOO_LONG_TEXT; @@ -19,46 +19,46 @@ use std::sync::Arc; #[derive(Debug)] pub struct Exec
{ - vm_data: Arc>, + sg_data: Arc>, } impl Exec
{ - pub fn new(vm_data: &Arc>) -> Exec
{ + pub fn new(sg_data: &Arc>) -> Exec
{ Exec { - vm_data: Arc::clone(vm_data), + sg_data: Arc::clone(sg_data), } } #[inline] fn resolved_inputs(&self) -> &Vec { - &self.vm_data.rtx().resolved_inputs + &self.sg_data.rtx().resolved_inputs } #[inline] fn resolved_cell_deps(&self) -> &Vec { - &self.vm_data.rtx().resolved_cell_deps + &self.sg_data.rtx().resolved_cell_deps } #[inline] fn witnesses(&self) -> BytesVec { - self.vm_data.rtx().transaction.witnesses() + self.sg_data.rtx().transaction.witnesses() } fn fetch_cell(&self, source: Source, index: usize) -> Result<&CellMeta, u8> { let cell_opt = match source { Source::Transaction(SourceEntry::Input) => self.resolved_inputs().get(index), - Source::Transaction(SourceEntry::Output) => self.vm_data.outputs().get(index), + Source::Transaction(SourceEntry::Output) => self.sg_data.outputs().get(index), Source::Transaction(SourceEntry::CellDep) => self.resolved_cell_deps().get(index), Source::Group(SourceEntry::Input) => self - .vm_data + .sg_data .group_inputs() .get(index) .and_then(|actual_index| self.resolved_inputs().get(*actual_index)), Source::Group(SourceEntry::Output) => self - .vm_data + .sg_data .group_outputs() .get(index) - .and_then(|actual_index| self.vm_data.outputs().get(*actual_index)), + .and_then(|actual_index| self.sg_data.outputs().get(*actual_index)), Source::Transaction(SourceEntry::HeaderDep) | Source::Group(SourceEntry::CellDep) | Source::Group(SourceEntry::HeaderDep) => { @@ -72,12 +72,12 @@ impl Exec
{ fn fetch_witness(&self, source: Source, index: usize) -> Result { let witness_opt = match source { Source::Group(SourceEntry::Input) => self - .vm_data + .sg_data .group_inputs() .get(index) .and_then(|actual_index| self.witnesses().get(*actual_index)), Source::Group(SourceEntry::Output) => self - .vm_data + .sg_data .group_outputs() .get(index) .and_then(|actual_index| self.witnesses().get(*actual_index)), @@ -116,7 +116,7 @@ impl Syscalls for return Ok(true); } let cell = cell.unwrap(); - self.vm_data + self.sg_data .data_loader() .load_cell_data(cell) .ok_or_else(|| { diff --git a/script/src/syscalls/exec_v2.rs b/script/src/syscalls/exec_v2.rs index 570c39a441..5f08ab39a9 100644 --- a/script/src/syscalls/exec_v2.rs +++ b/script/src/syscalls/exec_v2.rs @@ -1,5 +1,5 @@ use crate::syscalls::{EXEC, INDEX_OUT_OF_BOUND}; -use crate::types::{DataLocation, DataPieceId, ExecV2Args, Message, VmContext, VmData, VmId}; +use crate::types::{DataLocation, DataPieceId, ExecV2Args, Message, VmContext, VmId}; use ckb_traits::CellDataProvider; use ckb_vm::{ registers::{A0, A1, A2, A3, A4, A5, A7}, @@ -13,12 +13,9 @@ pub struct ExecV2 { } impl ExecV2 { - pub fn new( - vm_data: &Arc>, - vm_context: &VmContext
, - ) -> ExecV2 { + pub fn new(vm_id: &VmId, vm_context: &VmContext
) -> ExecV2 { ExecV2 { - id: vm_data.vm_id, + id: *vm_id, message_box: Arc::clone(&vm_context.message_box), } } diff --git a/script/src/syscalls/generator.rs b/script/src/syscalls/generator.rs index 38a3c17cbf..c57adb8629 100644 --- a/script/src/syscalls/generator.rs +++ b/script/src/syscalls/generator.rs @@ -4,7 +4,7 @@ use crate::{ LoadCellData, LoadHeader, LoadInput, LoadScript, LoadScriptHash, LoadTx, LoadWitness, Pipe, ProcessID, Read, Spawn, VMVersion, Wait, Write, }, - types::{CoreMachine, DebugContext, ScriptVersion, VmContext, VmData}, + types::{CoreMachine, DebugContext, ScriptVersion, SgData, VmContext, VmId}, }; use ckb_traits::{CellDataProvider, ExtensionProvider, HeaderProvider}; use ckb_vm::Syscalls; @@ -12,7 +12,8 @@ use std::sync::Arc; /// Generate RISC-V syscalls in CKB environment pub fn generate_ckb_syscalls
( - vm_data: &Arc>, + vm_id: &VmId, + sg_data: &Arc>, vm_context: &VmContext
, debug_context: &DebugContext, ) -> Vec)>> @@ -20,17 +21,17 @@ where DL: CellDataProvider + HeaderProvider + ExtensionProvider + Send + Sync + Clone + 'static, { let mut syscalls: Vec)>> = vec![ - Box::new(LoadScriptHash::new(vm_data)), - Box::new(LoadTx::new(vm_data)), - Box::new(LoadCell::new(vm_data)), - Box::new(LoadInput::new(vm_data)), - Box::new(LoadHeader::new(vm_data)), - Box::new(LoadWitness::new(vm_data)), - Box::new(LoadScript::new(vm_data)), + Box::new(LoadScriptHash::new(sg_data)), + Box::new(LoadTx::new(sg_data)), + Box::new(LoadCell::new(sg_data)), + Box::new(LoadInput::new(sg_data)), + Box::new(LoadHeader::new(sg_data)), + Box::new(LoadWitness::new(sg_data)), + Box::new(LoadScript::new(sg_data)), Box::new(LoadCellData::new(vm_context)), - Box::new(Debugger::new(vm_data, debug_context)), + Box::new(Debugger::new(sg_data, debug_context)), ]; - let script_version = &vm_data.sg_data.script_version; + let script_version = &sg_data.script_version; if script_version >= &ScriptVersion::V1 { syscalls.append(&mut vec![ Box::new(VMVersion::new()), @@ -38,20 +39,20 @@ where ]); } if script_version == &ScriptVersion::V1 { - syscalls.push(Box::new(Exec::new(vm_data))); + syscalls.push(Box::new(Exec::new(sg_data))); } if script_version >= &ScriptVersion::V2 { syscalls.append(&mut vec![ - Box::new(ExecV2::new(vm_data, vm_context)), - Box::new(LoadBlockExtension::new(vm_data)), - Box::new(Spawn::new(vm_data, vm_context)), - Box::new(ProcessID::new(vm_data)), - Box::new(Pipe::new(vm_data, vm_context)), - Box::new(Wait::new(vm_data, vm_context)), - Box::new(Write::new(vm_data, vm_context)), - Box::new(Read::new(vm_data, vm_context)), - Box::new(InheritedFd::new(vm_data, vm_context)), - Box::new(Close::new(vm_data, vm_context)), + Box::new(ExecV2::new(vm_id, vm_context)), + Box::new(LoadBlockExtension::new(sg_data)), + Box::new(Spawn::new(vm_id, vm_context)), + Box::new(ProcessID::new(vm_id)), + Box::new(Pipe::new(vm_id, vm_context)), + Box::new(Wait::new(vm_id, vm_context)), + Box::new(Write::new(vm_id, vm_context)), + Box::new(Read::new(vm_id, vm_context)), + Box::new(InheritedFd::new(vm_id, vm_context)), + Box::new(Close::new(vm_id, vm_context)), ]); } #[cfg(test)] diff --git a/script/src/syscalls/inherited_fd.rs b/script/src/syscalls/inherited_fd.rs index 489a1b5101..510b82969c 100644 --- a/script/src/syscalls/inherited_fd.rs +++ b/script/src/syscalls/inherited_fd.rs @@ -1,5 +1,5 @@ use crate::syscalls::{INHERITED_FD, SPAWN_YIELD_CYCLES_BASE}; -use crate::types::{Fd, FdArgs, Message, VmContext, VmData, VmId}; +use crate::types::{Fd, FdArgs, Message, VmContext, VmId}; use ckb_traits::{CellDataProvider, ExtensionProvider, HeaderProvider}; use ckb_vm::{ registers::{A0, A1, A7}, @@ -14,12 +14,12 @@ pub struct InheritedFd { } impl InheritedFd { - pub fn new
(vm_data: &Arc>, vm_context: &VmContext
) -> Self + pub fn new
(vm_id: &VmId, vm_context: &VmContext
) -> Self where DL: CellDataProvider + HeaderProvider + ExtensionProvider + Send + Sync + Clone + 'static, { Self { - id: vm_data.vm_id, + id: *vm_id, message_box: Arc::clone(&vm_context.message_box), } } diff --git a/script/src/syscalls/load_block_extension.rs b/script/src/syscalls/load_block_extension.rs index 81d7de6286..0594a890e3 100644 --- a/script/src/syscalls/load_block_extension.rs +++ b/script/src/syscalls/load_block_extension.rs @@ -4,7 +4,7 @@ use crate::{ utils::store_data, Source, SourceEntry, INDEX_OUT_OF_BOUND, ITEM_MISSING, LOAD_BLOCK_EXTENSION, SUCCESS, }, - types::VmData, + types::SgData, }; use ckb_traits::ExtensionProvider; use ckb_types::{ @@ -19,29 +19,29 @@ use std::sync::Arc; #[derive(Debug)] pub struct LoadBlockExtension
{ - vm_data: Arc>, + sg_data: Arc>, } impl LoadBlockExtension
{ - pub fn new(vm_data: &Arc>) -> LoadBlockExtension
{ + pub fn new(sg_data: &Arc>) -> LoadBlockExtension
{ LoadBlockExtension { - vm_data: Arc::clone(vm_data), + sg_data: Arc::clone(sg_data), } } #[inline] fn header_deps(&self) -> Byte32Vec { - self.vm_data.rtx().transaction.header_deps() + self.sg_data.rtx().transaction.header_deps() } #[inline] fn resolved_inputs(&self) -> &Vec { - &self.vm_data.rtx().resolved_inputs + &self.sg_data.rtx().resolved_inputs } #[inline] fn resolved_cell_deps(&self) -> &Vec { - &self.vm_data.rtx().resolved_cell_deps + &self.sg_data.rtx().resolved_cell_deps } fn load_block_extension(&self, cell_meta: &CellMeta) -> Option { @@ -55,7 +55,7 @@ impl LoadBlockExtension
{ .into_iter() .any(|hash| &hash == block_hash) { - self.vm_data.data_loader().get_block_extension(block_hash) + self.sg_data.data_loader().get_block_extension(block_hash) } else { None } @@ -79,13 +79,13 @@ impl LoadBlockExtension
{ .get(index) .ok_or(INDEX_OUT_OF_BOUND) .and_then(|block_hash| { - self.vm_data + self.sg_data .data_loader() .get_block_extension(&block_hash) .ok_or(ITEM_MISSING) }), Source::Group(SourceEntry::Input) => self - .vm_data + .sg_data .group_inputs() .get(index) .ok_or(INDEX_OUT_OF_BOUND) diff --git a/script/src/syscalls/load_cell.rs b/script/src/syscalls/load_cell.rs index 4c71111bb1..78260c378b 100644 --- a/script/src/syscalls/load_cell.rs +++ b/script/src/syscalls/load_cell.rs @@ -4,7 +4,7 @@ use crate::{ utils::store_data, CellField, Source, SourceEntry, INDEX_OUT_OF_BOUND, ITEM_MISSING, LOAD_CELL_BY_FIELD_SYSCALL_NUMBER, LOAD_CELL_SYSCALL_NUMBER, SUCCESS, }, - types::{TxData, VmData}, + types::{SgData, TxData}, }; use byteorder::{LittleEndian, WriteBytesExt}; use ckb_traits::CellDataProvider; @@ -20,29 +20,29 @@ use ckb_vm::{ use std::sync::Arc; pub struct LoadCell
{ - vm_data: Arc>, + sg_data: Arc>, } impl LoadCell
{ - pub fn new(vm_data: &Arc>) -> LoadCell
{ + pub fn new(sg_data: &Arc>) -> LoadCell
{ LoadCell { - vm_data: Arc::clone(vm_data), + sg_data: Arc::clone(sg_data), } } #[inline] fn tx_data(&self) -> &TxData
{ - &self.vm_data.sg_data.tx_data + &self.sg_data.tx_data } #[inline] fn resolved_inputs(&self) -> &Vec { - &self.vm_data.rtx().resolved_inputs + &self.sg_data.rtx().resolved_inputs } #[inline] fn resolved_cell_deps(&self) -> &Vec { - &self.vm_data.rtx().resolved_cell_deps + &self.sg_data.rtx().resolved_cell_deps } fn fetch_cell(&self, source: Source, index: usize) -> Result<&CellMeta, u8> { @@ -59,7 +59,7 @@ impl LoadCell
{ .ok_or(INDEX_OUT_OF_BOUND), Source::Transaction(SourceEntry::HeaderDep) => Err(INDEX_OUT_OF_BOUND), Source::Group(SourceEntry::Input) => self - .vm_data + .sg_data .group_inputs() .get(index) .ok_or(INDEX_OUT_OF_BOUND) @@ -69,7 +69,7 @@ impl LoadCell
{ .ok_or(INDEX_OUT_OF_BOUND) }), Source::Group(SourceEntry::Output) => self - .vm_data + .sg_data .group_outputs() .get(index) .ok_or(INDEX_OUT_OF_BOUND) diff --git a/script/src/syscalls/load_cell_data.rs b/script/src/syscalls/load_cell_data.rs index c78f3dcec9..53b14b0d1c 100644 --- a/script/src/syscalls/load_cell_data.rs +++ b/script/src/syscalls/load_cell_data.rs @@ -1,4 +1,4 @@ -use crate::types::{DataPieceId, VmContext, VmData}; +use crate::types::{DataPieceId, SgData, VmContext}; use crate::{ cost_model::transferred_byte_cycles, syscalls::{ @@ -20,7 +20,7 @@ pub struct LoadCellData
where DL: CellDataProvider + HeaderProvider + ExtensionProvider + Send + Sync + Clone + 'static, { - snapshot2_context: Arc>>>>, + snapshot2_context: Arc>>>>, } impl
LoadCellData
diff --git a/script/src/syscalls/load_header.rs b/script/src/syscalls/load_header.rs index 29df08cb04..5e503e3c1d 100644 --- a/script/src/syscalls/load_header.rs +++ b/script/src/syscalls/load_header.rs @@ -5,7 +5,7 @@ use crate::{ HeaderField, Source, SourceEntry, INDEX_OUT_OF_BOUND, ITEM_MISSING, LOAD_HEADER_BY_FIELD_SYSCALL_NUMBER, LOAD_HEADER_SYSCALL_NUMBER, SUCCESS, }, - types::VmData, + types::SgData, }; use ckb_traits::HeaderProvider; use ckb_types::{ @@ -21,13 +21,13 @@ use std::sync::Arc; #[derive(Debug)] pub struct LoadHeader
{ - vm_data: Arc>, + sg_data: Arc>, } impl LoadHeader
{ - pub fn new(vm_data: &Arc>) -> LoadHeader
{ + pub fn new(sg_data: &Arc>) -> LoadHeader
{ LoadHeader { - vm_data: Arc::clone(vm_data), + sg_data: Arc::clone(sg_data), } } @@ -37,22 +37,22 @@ impl LoadHeader
{ // resolved_cell_deps: &'a [CellMeta], #[inline] fn group_inputs(&self) -> &[usize] { - self.vm_data.group_inputs() + self.sg_data.group_inputs() } #[inline] fn header_deps(&self) -> Byte32Vec { - self.vm_data.rtx().transaction.header_deps() + self.sg_data.rtx().transaction.header_deps() } #[inline] fn resolved_inputs(&self) -> &Vec { - &self.vm_data.rtx().resolved_inputs + &self.sg_data.rtx().resolved_inputs } #[inline] fn resolved_cell_deps(&self) -> &Vec { - &self.vm_data.rtx().resolved_cell_deps + &self.sg_data.rtx().resolved_cell_deps } fn load_header(&self, cell_meta: &CellMeta) -> Option { @@ -66,11 +66,7 @@ impl LoadHeader
{ .into_iter() .any(|hash| &hash == block_hash) { - self.vm_data - .sg_data - .tx_data - .data_loader - .get_header(block_hash) + self.sg_data.tx_data.data_loader.get_header(block_hash) } else { None } @@ -94,8 +90,7 @@ impl LoadHeader
{ .get(index) .ok_or(INDEX_OUT_OF_BOUND) .and_then(|block_hash| { - self.vm_data - .sg_data + self.sg_data .tx_data .data_loader .get_header(&block_hash) diff --git a/script/src/syscalls/load_input.rs b/script/src/syscalls/load_input.rs index a7331e8756..5d0513a45e 100644 --- a/script/src/syscalls/load_input.rs +++ b/script/src/syscalls/load_input.rs @@ -4,7 +4,7 @@ use crate::{ utils::store_data, InputField, Source, SourceEntry, INDEX_OUT_OF_BOUND, LOAD_INPUT_BY_FIELD_SYSCALL_NUMBER, LOAD_INPUT_SYSCALL_NUMBER, SUCCESS, }, - types::VmData, + types::SgData, }; use byteorder::{LittleEndian, WriteBytesExt}; use ckb_types::{ @@ -19,19 +19,19 @@ use std::sync::Arc; #[derive(Debug)] pub struct LoadInput
{ - vm_data: Arc>, + sg_data: Arc>, } impl
LoadInput
{ - pub fn new(vm_data: &Arc>) -> Self { + pub fn new(sg_data: &Arc>) -> Self { LoadInput { - vm_data: Arc::clone(vm_data), + sg_data: Arc::clone(sg_data), } } #[inline] fn inputs(&self) -> CellInputVec { - self.vm_data.rtx().transaction.inputs() + self.sg_data.rtx().transaction.inputs() } fn fetch_input(&self, source: Source, index: usize) -> Result { @@ -43,7 +43,7 @@ impl
LoadInput
{ Source::Transaction(SourceEntry::CellDep) => Err(INDEX_OUT_OF_BOUND), Source::Transaction(SourceEntry::HeaderDep) => Err(INDEX_OUT_OF_BOUND), Source::Group(SourceEntry::Input) => self - .vm_data + .sg_data .group_inputs() .get(index) .ok_or(INDEX_OUT_OF_BOUND) diff --git a/script/src/syscalls/load_script.rs b/script/src/syscalls/load_script.rs index 7050e67647..6ea2ec8d32 100644 --- a/script/src/syscalls/load_script.rs +++ b/script/src/syscalls/load_script.rs @@ -1,7 +1,7 @@ use crate::{ cost_model::transferred_byte_cycles, syscalls::{utils::store_data, LOAD_SCRIPT_SYSCALL_NUMBER, SUCCESS}, - types::VmData, + types::SgData, }; use ckb_types::prelude::*; use ckb_vm::{ @@ -12,13 +12,13 @@ use std::sync::Arc; #[derive(Debug)] pub struct LoadScript
{ - vm_data: Arc>, + sg_data: Arc>, } impl
LoadScript
{ - pub fn new(vm_data: &Arc>) -> Self { + pub fn new(sg_data: &Arc>) -> Self { Self { - vm_data: Arc::clone(vm_data), + sg_data: Arc::clone(sg_data), } } } @@ -33,7 +33,7 @@ impl Syscalls for LoadScript
{ return Ok(false); } - let data = self.vm_data.sg_data.script_group.script.as_slice(); + let data = self.sg_data.script_group.script.as_slice(); let wrote_size = store_data(machine, data)?; machine.add_cycles_no_checking(transferred_byte_cycles(wrote_size))?; diff --git a/script/src/syscalls/load_script_hash.rs b/script/src/syscalls/load_script_hash.rs index a8dbe14aca..73ecefa88e 100644 --- a/script/src/syscalls/load_script_hash.rs +++ b/script/src/syscalls/load_script_hash.rs @@ -1,7 +1,7 @@ use crate::{ cost_model::transferred_byte_cycles, syscalls::{utils::store_data, LOAD_SCRIPT_HASH_SYSCALL_NUMBER, SUCCESS}, - types::VmData, + types::SgData, }; use ckb_vm::{ registers::{A0, A7}, @@ -11,13 +11,13 @@ use std::sync::Arc; #[derive(Debug)] pub struct LoadScriptHash
{ - vm_data: Arc>, + sg_data: Arc>, } impl
LoadScriptHash
{ - pub fn new(vm_data: &Arc>) -> LoadScriptHash
{ + pub fn new(sg_data: &Arc>) -> LoadScriptHash
{ LoadScriptHash { - vm_data: Arc::clone(vm_data), + sg_data: Arc::clone(sg_data), } } } @@ -32,7 +32,7 @@ impl Syscalls for LoadScriptHash
return Ok(false); } - let data = self.vm_data.current_script_hash().as_reader().raw_data(); + let data = self.sg_data.current_script_hash().as_reader().raw_data(); let wrote_size = store_data(machine, data)?; machine.add_cycles_no_checking(transferred_byte_cycles(wrote_size))?; diff --git a/script/src/syscalls/load_tx.rs b/script/src/syscalls/load_tx.rs index 06b22a2715..fb4576682d 100644 --- a/script/src/syscalls/load_tx.rs +++ b/script/src/syscalls/load_tx.rs @@ -3,7 +3,7 @@ use crate::{ syscalls::{ utils::store_data, LOAD_TRANSACTION_SYSCALL_NUMBER, LOAD_TX_HASH_SYSCALL_NUMBER, SUCCESS, }, - types::VmData, + types::SgData, }; use ckb_types::{core::cell::ResolvedTransaction, prelude::*}; use ckb_vm::{ @@ -18,9 +18,9 @@ pub struct LoadTx { } impl LoadTx { - pub fn new
(vm_data: &Arc>) -> LoadTx { + pub fn new
(sg_data: &Arc>) -> LoadTx { LoadTx { - rtx: Arc::clone(&vm_data.sg_data.tx_data.rtx), + rtx: Arc::clone(&sg_data.tx_data.rtx), } } } diff --git a/script/src/syscalls/load_witness.rs b/script/src/syscalls/load_witness.rs index 7a6acdb296..09e1698db3 100644 --- a/script/src/syscalls/load_witness.rs +++ b/script/src/syscalls/load_witness.rs @@ -4,7 +4,7 @@ use crate::{ utils::store_data, Source, SourceEntry, INDEX_OUT_OF_BOUND, LOAD_WITNESS_SYSCALL_NUMBER, SUCCESS, }, - types::VmData, + types::SgData, }; use ckb_types::packed::{Bytes, BytesVec}; use ckb_vm::{ @@ -15,30 +15,30 @@ use std::sync::Arc; #[derive(Debug)] pub struct LoadWitness
{ - vm_data: Arc>, + sg_data: Arc>, } impl
LoadWitness
{ - pub fn new(vm_data: &Arc>) -> Self { + pub fn new(sg_data: &Arc>) -> Self { LoadWitness { - vm_data: Arc::clone(vm_data), + sg_data: Arc::clone(sg_data), } } #[inline] fn witnesses(&self) -> BytesVec { - self.vm_data.rtx().transaction.witnesses() + self.sg_data.rtx().transaction.witnesses() } fn fetch_witness(&self, source: Source, index: usize) -> Option { match source { Source::Group(SourceEntry::Input) => self - .vm_data + .sg_data .group_inputs() .get(index) .and_then(|actual_index| self.witnesses().get(*actual_index)), Source::Group(SourceEntry::Output) => self - .vm_data + .sg_data .group_outputs() .get(index) .and_then(|actual_index| self.witnesses().get(*actual_index)), diff --git a/script/src/syscalls/pipe.rs b/script/src/syscalls/pipe.rs index a20b2c0693..db7004b548 100644 --- a/script/src/syscalls/pipe.rs +++ b/script/src/syscalls/pipe.rs @@ -1,5 +1,5 @@ use crate::syscalls::{PIPE, SPAWN_YIELD_CYCLES_BASE}; -use crate::types::{Message, PipeArgs, VmContext, VmData, VmId}; +use crate::types::{Message, PipeArgs, VmContext, VmId}; use ckb_traits::{CellDataProvider, ExtensionProvider, HeaderProvider}; use ckb_vm::{ registers::{A0, A7}, @@ -14,12 +14,12 @@ pub struct Pipe { } impl Pipe { - pub fn new
(vm_data: &Arc>, vm_context: &VmContext
) -> Self + pub fn new
(vm_id: &VmId, vm_context: &VmContext
) -> Self where DL: CellDataProvider + HeaderProvider + ExtensionProvider + Send + Sync + Clone + 'static, { Self { - id: vm_data.vm_id, + id: *vm_id, message_box: Arc::clone(&vm_context.message_box), } } diff --git a/script/src/syscalls/process_id.rs b/script/src/syscalls/process_id.rs index 0971ae1cbe..37b4df21e3 100644 --- a/script/src/syscalls/process_id.rs +++ b/script/src/syscalls/process_id.rs @@ -1,10 +1,9 @@ use crate::syscalls::PROCESS_ID; -use crate::types::VmData; +use crate::types::VmId; use ckb_vm::{ registers::{A0, A7}, Error as VMError, Register, SupportMachine, Syscalls, }; -use std::sync::Arc; #[derive(Debug, Default)] pub struct ProcessID { @@ -12,8 +11,8 @@ pub struct ProcessID { } impl ProcessID { - pub fn new
(vm_data: &Arc>) -> Self { - Self { id: vm_data.vm_id } + pub fn new(vm_id: &VmId) -> Self { + Self { id: *vm_id } } } diff --git a/script/src/syscalls/read.rs b/script/src/syscalls/read.rs index 0f48095735..7c96c7125b 100644 --- a/script/src/syscalls/read.rs +++ b/script/src/syscalls/read.rs @@ -1,5 +1,5 @@ use crate::syscalls::{INVALID_FD, READ, SPAWN_YIELD_CYCLES_BASE}; -use crate::types::{Fd, FdArgs, Message, VmContext, VmData, VmId}; +use crate::types::{Fd, FdArgs, Message, VmContext, VmId}; use ckb_traits::{CellDataProvider, ExtensionProvider, HeaderProvider}; use ckb_vm::{ registers::{A0, A1, A2, A7}, @@ -14,12 +14,12 @@ pub struct Read { } impl Read { - pub fn new
(vm_data: &Arc>, vm_context: &VmContext
) -> Self + pub fn new
(vm_id: &VmId, vm_context: &VmContext
) -> Self where DL: CellDataProvider + HeaderProvider + ExtensionProvider + Send + Sync + Clone + 'static, { Self { - id: vm_data.vm_id, + id: *vm_id, message_box: Arc::clone(&vm_context.message_box), } } diff --git a/script/src/syscalls/spawn.rs b/script/src/syscalls/spawn.rs index a9fca4332a..6fb7d536eb 100644 --- a/script/src/syscalls/spawn.rs +++ b/script/src/syscalls/spawn.rs @@ -2,7 +2,7 @@ use crate::syscalls::{ Source, INDEX_OUT_OF_BOUND, SLICE_OUT_OF_BOUND, SOURCE_ENTRY_MASK, SOURCE_GROUP_FLAG, SPAWN, SPAWN_EXTRA_CYCLES_BASE, SPAWN_YIELD_CYCLES_BASE, }; -use crate::types::{DataLocation, DataPieceId, Fd, Message, SpawnArgs, VmContext, VmData, VmId}; +use crate::types::{DataLocation, DataPieceId, Fd, Message, SgData, SpawnArgs, VmContext, VmId}; use ckb_traits::{CellDataProvider, ExtensionProvider, HeaderProvider}; use ckb_vm::{ machine::SupportMachine, @@ -20,16 +20,16 @@ where { id: VmId, message_box: Arc>>, - snapshot2_context: Arc>>>>, + snapshot2_context: Arc>>>>, } impl
Spawn
where DL: CellDataProvider + HeaderProvider + ExtensionProvider + Send + Sync + Clone + 'static, { - pub fn new(vm_data: &Arc>, vm_context: &VmContext
) -> Self { + pub fn new(vm_id: &VmId, vm_context: &VmContext
) -> Self { Self { - id: vm_data.vm_id, + id: *vm_id, message_box: Arc::clone(&vm_context.message_box), snapshot2_context: Arc::clone(&vm_context.snapshot2_context), } diff --git a/script/src/syscalls/tests/utils.rs b/script/src/syscalls/tests/utils.rs index 506f35bddb..6d5d95330b 100644 --- a/script/src/syscalls/tests/utils.rs +++ b/script/src/syscalls/tests/utils.rs @@ -1,5 +1,5 @@ use crate::{ - types::{DataPieceId, ScriptGroup, ScriptGroupType, ScriptVersion, SgData, TxData, VmData}, + types::{DataPieceId, ScriptGroup, ScriptGroupType, ScriptVersion, SgData, TxData}, verify_env::TxVerifyEnv, }; use ckb_chain_spec::consensus::ConsensusBuilder; @@ -86,11 +86,11 @@ pub(crate) fn build_tx_data_with_loader( } } -pub(crate) fn build_vm_data( +pub(crate) fn build_sg_data( tx_data: Arc>, input_indices: Vec, output_indices: Vec, -) -> Arc> { +) -> Arc> { let script_group = ScriptGroup { script: Script::default(), group_type: ScriptGroupType::Lock, @@ -98,14 +98,11 @@ pub(crate) fn build_vm_data( output_indices, }; let script_hash = script_group.script.calc_script_hash(); - Arc::new(VmData { - sg_data: Arc::new(SgData { - tx_data, - script_version: ScriptVersion::latest(), - script_group, - script_hash, - program_data_piece_id: DataPieceId::CellDep(0), - }), - vm_id: 0, + Arc::new(SgData { + tx_data, + script_version: ScriptVersion::latest(), + script_group, + script_hash, + program_data_piece_id: DataPieceId::CellDep(0), }) } diff --git a/script/src/syscalls/tests/vm_latest/syscalls_1.rs b/script/src/syscalls/tests/vm_latest/syscalls_1.rs index 3d0a8e8b83..444a67a124 100644 --- a/script/src/syscalls/tests/vm_latest/syscalls_1.rs +++ b/script/src/syscalls/tests/vm_latest/syscalls_1.rs @@ -1,4 +1,4 @@ -use crate::types::{VmContext, VmData}; +use crate::types::VmContext; use byteorder::{ByteOrder, LittleEndian, WriteBytesExt}; use ckb_hash::blake2b_256; use ckb_types::{ @@ -59,9 +59,9 @@ fn _test_load_cell_not_exist(data: &[u8]) -> Result<(), TestCaseError> { tx_data.outputs = vec![output]; Arc::new(tx_data) }; - let vm_data = build_vm_data(tx_data, vec![], vec![]); + let sg_data = build_sg_data(tx_data, vec![], vec![]); - let mut load_cell = LoadCell::new(&vm_data); + let mut load_cell = LoadCell::new(&sg_data); prop_assert!(load_cell.ecall(&mut machine).is_ok()); prop_assert_eq!(machine.registers()[A0], u64::from(INDEX_OUT_OF_BOUND)); @@ -105,9 +105,9 @@ fn _test_load_cell_all(data: &[u8]) -> Result<(), TestCaseError> { tx_data.outputs = vec![output.clone()]; Arc::new(tx_data) }; - let vm_data = build_vm_data(tx_data, vec![], vec![]); + let sg_data = build_sg_data(tx_data, vec![], vec![]); - let mut load_cell = LoadCell::new(&vm_data); + let mut load_cell = LoadCell::new(&sg_data); let input_correct_data = input_cell.cell_output.as_slice(); let output_correct_data = output.cell_output.as_slice(); @@ -199,9 +199,9 @@ fn _test_load_cell_from_group(data: &[u8], source: SourceEntry) -> Result<(), Te tx_data.outputs = vec![output.clone()]; Arc::new(tx_data) }; - let vm_data = build_vm_data(tx_data, vec![0], vec![0]); + let sg_data = build_sg_data(tx_data, vec![0], vec![0]); - let mut load_cell = LoadCell::new(&vm_data); + let mut load_cell = LoadCell::new(&sg_data); let input_correct_data = input_cell.cell_output.as_slice(); let output_correct_data = output.cell_output.as_slice(); @@ -290,9 +290,9 @@ fn _test_load_cell_out_of_bound(index: u64, source: u64) -> Result<(), TestCaseE tx_data.outputs = vec![output]; Arc::new(tx_data) }; - let vm_data = build_vm_data(tx_data, vec![0], vec![0]); + let sg_data = build_sg_data(tx_data, vec![0], vec![0]); - let mut load_cell = LoadCell::new(&vm_data); + let mut load_cell = LoadCell::new(&sg_data); prop_assert!(load_cell.ecall(&mut machine).is_ok()); prop_assert_eq!(machine.registers()[A0], u64::from(INDEX_OUT_OF_BOUND)); @@ -352,9 +352,9 @@ fn _test_load_cell_length(data: &[u8]) -> Result<(), TestCaseError> { tx_data.outputs = vec![output]; Arc::new(tx_data) }; - let vm_data = build_vm_data(tx_data, vec![], vec![]); + let sg_data = build_sg_data(tx_data, vec![], vec![]); - let mut load_cell = LoadCell::new(&vm_data); + let mut load_cell = LoadCell::new(&sg_data); let input_correct_data = input_cell.cell_output.as_slice(); @@ -408,9 +408,9 @@ fn _test_load_cell_partial(data: &[u8], offset: u64) -> Result<(), TestCaseError tx_data.outputs = vec![output]; Arc::new(tx_data) }; - let vm_data = build_vm_data(tx_data, vec![], vec![]); + let sg_data = build_sg_data(tx_data, vec![], vec![]); - let mut load_cell = LoadCell::new(&vm_data); + let mut load_cell = LoadCell::new(&sg_data); let input_correct_data = input_cell.cell_output.as_slice(); @@ -472,9 +472,9 @@ fn _test_load_cell_capacity(capacity: Capacity) -> Result<(), TestCaseError> { }); let tx_data = Arc::new(build_tx_data(rtx)); - let vm_data = build_vm_data(tx_data, vec![], vec![]); + let sg_data = build_sg_data(tx_data, vec![], vec![]); - let mut load_cell = LoadCell::new(&vm_data); + let mut load_cell = LoadCell::new(&sg_data); prop_assert!(machine.memory_mut().store64(&size_addr, &16).is_ok()); @@ -531,9 +531,9 @@ fn _test_load_cell_occupied_capacity(data: &[u8]) -> Result<(), TestCaseError> { }); let tx_data = Arc::new(build_tx_data(rtx)); - let vm_data = build_vm_data(tx_data, vec![], vec![]); + let sg_data = build_sg_data(tx_data, vec![], vec![]); - let mut load_cell = LoadCell::new(&vm_data); + let mut load_cell = LoadCell::new(&sg_data); prop_assert!(machine.memory_mut().store64(&size_addr, &16).is_ok()); @@ -591,9 +591,9 @@ fn test_load_missing_data_hash() { }); let tx_data = Arc::new(build_tx_data(rtx)); - let vm_data = build_vm_data(tx_data, vec![], vec![]); + let sg_data = build_sg_data(tx_data, vec![], vec![]); - let mut load_cell = LoadCell::new(&vm_data); + let mut load_cell = LoadCell::new(&sg_data); assert!(machine.memory_mut().store64(&size_addr, &100).is_ok()); @@ -641,9 +641,9 @@ fn _test_load_missing_contract(field: CellField) { tx_data.outputs = vec![output_cell]; Arc::new(tx_data) }; - let vm_data = build_vm_data(tx_data, vec![], vec![]); + let sg_data = build_sg_data(tx_data, vec![], vec![]); - let mut load_cell = LoadCell::new(&vm_data); + let mut load_cell = LoadCell::new(&sg_data); assert!(machine.memory_mut().store64(&size_addr, &100).is_ok()); @@ -713,9 +713,9 @@ fn _test_load_header( }); let tx_data = Arc::new(build_tx_data_with_loader(rtx, data_loader)); - let vm_data = build_vm_data(tx_data, vec![0], vec![]); + let sg_data = build_sg_data(tx_data, vec![0], vec![]); - let mut load_header = LoadHeader::new(&vm_data); + let mut load_header = LoadHeader::new(&sg_data); prop_assert!(machine .memory_mut() @@ -831,9 +831,9 @@ fn _test_load_header_by_field(data: &[u8], field: HeaderField) -> Result<(), Tes }); let tx_data = Arc::new(build_tx_data_with_loader(rtx, data_loader)); - let vm_data = build_vm_data(tx_data, vec![], vec![]); + let sg_data = build_sg_data(tx_data, vec![], vec![]); - let mut load_header = LoadHeader::new(&vm_data); + let mut load_header = LoadHeader::new(&sg_data); prop_assert!(machine .memory_mut() @@ -884,9 +884,9 @@ fn _test_load_tx_hash(data: &[u8]) -> Result<(), TestCaseError> { }); let tx_data = Arc::new(build_tx_data(rtx)); - let vm_data = build_vm_data(tx_data, vec![], vec![]); + let sg_data = build_sg_data(tx_data, vec![], vec![]); - let mut load_tx = LoadTx::new(&vm_data); + let mut load_tx = LoadTx::new(&sg_data); prop_assert!(machine .memory_mut() @@ -938,9 +938,9 @@ fn _test_load_tx(data: &[u8]) -> Result<(), TestCaseError> { }); let tx_data = Arc::new(build_tx_data(rtx)); - let vm_data = build_vm_data(tx_data, vec![], vec![]); + let sg_data = build_sg_data(tx_data, vec![], vec![]); - let mut load_tx = LoadTx::new(&vm_data); + let mut load_tx = LoadTx::new(&sg_data); prop_assert!(machine .memory_mut() @@ -993,19 +993,16 @@ fn _test_load_current_script_hash(data: &[u8]) -> Result<(), TestCaseError> { }); let tx_data = Arc::new(build_tx_data(rtx)); - let vm_data = build_vm_data(tx_data, vec![], vec![]); + let sg_data = build_sg_data(tx_data, vec![], vec![]); // Swap the internal script in VmData - let vm_data = { - let mut sg_data = vm_data.sg_data.as_ref().clone(); + let sg_data = { + let mut sg_data = sg_data.as_ref().clone(); sg_data.script_hash = script.calc_script_hash(); sg_data.script_group.script = script; - Arc::new(VmData { - sg_data: Arc::new(sg_data), - vm_id: vm_data.vm_id, - }) + Arc::new(sg_data) }; - let mut load_script_hash = LoadScriptHash::new(&vm_data); + let mut load_script_hash = LoadScriptHash::new(&sg_data); prop_assert!(machine.memory_mut().store64(&size_addr, &64).is_ok()); @@ -1078,9 +1075,9 @@ fn _test_load_input_lock_script_hash(data: &[u8]) -> Result<(), TestCaseError> { }); let tx_data = Arc::new(build_tx_data(rtx)); - let vm_data = build_vm_data(tx_data, vec![], vec![]); + let sg_data = build_sg_data(tx_data, vec![], vec![]); - let mut load_cell = LoadCell::new(&vm_data); + let mut load_cell = LoadCell::new(&sg_data); prop_assert!(machine.memory_mut().store64(&size_addr, &64).is_ok()); @@ -1141,9 +1138,9 @@ fn _test_load_input_lock_script(data: &[u8]) -> Result<(), TestCaseError> { }); let tx_data = Arc::new(build_tx_data(rtx)); - let vm_data = build_vm_data(tx_data, vec![], vec![]); + let sg_data = build_sg_data(tx_data, vec![], vec![]); - let mut load_cell = LoadCell::new(&vm_data); + let mut load_cell = LoadCell::new(&sg_data); prop_assert!(machine .memory_mut() @@ -1207,9 +1204,9 @@ fn _test_load_input_type_script(data: &[u8]) -> Result<(), TestCaseError> { }); let tx_data = Arc::new(build_tx_data(rtx)); - let vm_data = build_vm_data(tx_data, vec![], vec![]); + let sg_data = build_sg_data(tx_data, vec![], vec![]); - let mut load_cell = LoadCell::new(&vm_data); + let mut load_cell = LoadCell::new(&sg_data); prop_assert!(machine .memory_mut() @@ -1275,9 +1272,9 @@ fn _test_load_input_type_script_hash(data: &[u8]) -> Result<(), TestCaseError> { }); let tx_data = Arc::new(build_tx_data(rtx)); - let vm_data = build_vm_data(tx_data, vec![], vec![]); + let sg_data = build_sg_data(tx_data, vec![], vec![]); - let mut load_cell = LoadCell::new(&vm_data); + let mut load_cell = LoadCell::new(&sg_data); prop_assert!(machine .memory_mut() @@ -1332,9 +1329,9 @@ fn _test_load_witness(data: &[u8], source: SourceEntry) -> Result<(), TestCaseEr }); let tx_data = Arc::new(build_tx_data(rtx)); - let vm_data = build_vm_data(tx_data, vec![], vec![]); + let sg_data = build_sg_data(tx_data, vec![], vec![]); - let mut load_witness = LoadWitness::new(&vm_data); + let mut load_witness = LoadWitness::new(&sg_data); prop_assert!(machine .memory_mut() @@ -1398,9 +1395,9 @@ fn _test_load_group_witness(data: &[u8], source: SourceEntry) -> Result<(), Test }); let tx_data = Arc::new(build_tx_data(rtx)); - let vm_data = build_vm_data(tx_data, vec![1], vec![1]); + let sg_data = build_sg_data(tx_data, vec![1], vec![1]); - let mut load_witness = LoadWitness::new(&vm_data); + let mut load_witness = LoadWitness::new(&sg_data); prop_assert!(machine .memory_mut() @@ -1455,19 +1452,16 @@ fn _test_load_script(data: &[u8]) -> Result<(), TestCaseError> { }); let tx_data = Arc::new(build_tx_data(rtx)); - let vm_data = build_vm_data(tx_data, vec![], vec![]); + let sg_data = build_sg_data(tx_data, vec![], vec![]); // Swap the internal script in VmData - let vm_data = { - let mut sg_data = vm_data.sg_data.as_ref().clone(); + let sg_data = { + let mut sg_data = sg_data.as_ref().clone(); sg_data.script_hash = script.calc_script_hash(); sg_data.script_group.script = script.clone(); - Arc::new(VmData { - sg_data: Arc::new(sg_data), - vm_id: vm_data.vm_id, - }) + Arc::new(sg_data) }; - let mut load_script = LoadScript::new(&vm_data); + let mut load_script = LoadScript::new(&sg_data); prop_assert!(machine .memory_mut() @@ -1531,9 +1525,9 @@ fn _test_load_cell_data_as_code( }); let tx_data = Arc::new(build_tx_data(rtx)); - let vm_data = build_vm_data(tx_data, vec![0], vec![0]); + let sg_data = build_sg_data(tx_data, vec![0], vec![0]); - let vm_context = VmContext::new(&vm_data, &Arc::new(Mutex::new(Vec::new()))); + let vm_context = VmContext::new(&sg_data, &Arc::new(Mutex::new(Vec::new()))); let mut load_code = LoadCellData::new(&vm_context); @@ -1599,9 +1593,9 @@ fn _test_load_cell_data( }); let tx_data = Arc::new(build_tx_data(rtx)); - let vm_data = build_vm_data(tx_data, vec![0], vec![0]); + let sg_data = build_sg_data(tx_data, vec![0], vec![0]); - let vm_context = VmContext::new(&vm_data, &Arc::new(Mutex::new(Vec::new()))); + let vm_context = VmContext::new(&sg_data, &Arc::new(Mutex::new(Vec::new()))); let mut load_code = LoadCellData::new(&vm_context); @@ -1702,9 +1696,9 @@ fn test_load_overflowed_cell_data_as_code() { }); let tx_data = Arc::new(build_tx_data(rtx)); - let vm_data = build_vm_data(tx_data, vec![], vec![]); + let sg_data = build_sg_data(tx_data, vec![], vec![]); - let vm_context = VmContext::new(&vm_data, &Arc::new(Mutex::new(Vec::new()))); + let vm_context = VmContext::new(&sg_data, &Arc::new(Mutex::new(Vec::new()))); let mut load_code = LoadCellData::new(&vm_context); @@ -1747,9 +1741,9 @@ fn _test_load_cell_data_on_freezed_memory(data: &[u8]) -> Result<(), TestCaseErr }); let tx_data = Arc::new(build_tx_data(rtx)); - let vm_data = build_vm_data(tx_data, vec![], vec![]); + let sg_data = build_sg_data(tx_data, vec![], vec![]); - let vm_context = VmContext::new(&vm_data, &Arc::new(Mutex::new(Vec::new()))); + let vm_context = VmContext::new(&sg_data, &Arc::new(Mutex::new(Vec::new()))); let mut load_code = LoadCellData::new(&vm_context); @@ -1790,9 +1784,9 @@ fn _test_load_cell_data_as_code_on_freezed_memory(data: &[u8]) -> Result<(), Tes }); let tx_data = Arc::new(build_tx_data(rtx)); - let vm_data = build_vm_data(tx_data, vec![], vec![]); + let sg_data = build_sg_data(tx_data, vec![], vec![]); - let vm_context = VmContext::new(&vm_data, &Arc::new(Mutex::new(Vec::new()))); + let vm_context = VmContext::new(&sg_data, &Arc::new(Mutex::new(Vec::new()))); let mut load_code = LoadCellData::new(&vm_context); @@ -1844,9 +1838,9 @@ fn test_load_code_unaligned_error() { }); let tx_data = Arc::new(build_tx_data(rtx)); - let vm_data = build_vm_data(tx_data, vec![], vec![]); + let sg_data = build_sg_data(tx_data, vec![], vec![]); - let vm_context = VmContext::new(&vm_data, &Arc::new(Mutex::new(Vec::new()))); + let vm_context = VmContext::new(&sg_data, &Arc::new(Mutex::new(Vec::new()))); let mut load_code = LoadCellData::new(&vm_context); @@ -1885,9 +1879,9 @@ fn test_load_code_slice_out_of_bound_error() { }); let tx_data = Arc::new(build_tx_data(rtx)); - let vm_data = build_vm_data(tx_data, vec![], vec![]); + let sg_data = build_sg_data(tx_data, vec![], vec![]); - let vm_context = VmContext::new(&vm_data, &Arc::new(Mutex::new(Vec::new()))); + let vm_context = VmContext::new(&sg_data, &Arc::new(Mutex::new(Vec::new()))); let mut load_code = LoadCellData::new(&vm_context); @@ -1929,9 +1923,9 @@ fn test_load_code_not_enough_space_error() { }); let tx_data = Arc::new(build_tx_data(rtx)); - let vm_data = build_vm_data(tx_data, vec![], vec![]); + let sg_data = build_sg_data(tx_data, vec![], vec![]); - let vm_context = VmContext::new(&vm_data, &Arc::new(Mutex::new(Vec::new()))); + let vm_context = VmContext::new(&sg_data, &Arc::new(Mutex::new(Vec::new()))); let mut load_code = LoadCellData::new(&vm_context); @@ -1996,9 +1990,9 @@ fn _test_load_input( }); let tx_data = Arc::new(build_tx_data(rtx)); - let vm_data = build_vm_data(tx_data, vec![0], vec![]); + let sg_data = build_sg_data(tx_data, vec![0], vec![]); - let mut load_input = LoadInput::new(&vm_data); + let mut load_input = LoadInput::new(&sg_data); let mut buffer = vec![]; let expect = if let Some(field) = field { @@ -2136,9 +2130,9 @@ fn test_load_cell_data_size_zero() { }); let tx_data = Arc::new(build_tx_data(rtx)); - let vm_data = build_vm_data(tx_data, vec![0], vec![0]); + let sg_data = build_sg_data(tx_data, vec![0], vec![0]); - let vm_context = VmContext::new(&vm_data, &Arc::new(Mutex::new(Vec::new()))); + let vm_context = VmContext::new(&sg_data, &Arc::new(Mutex::new(Vec::new()))); let mut load_code = LoadCellData::new(&vm_context); @@ -2176,9 +2170,9 @@ fn test_load_cell_data_size_zero_index_out_of_bound() { }); let tx_data = Arc::new(build_tx_data(rtx)); - let vm_data = build_vm_data(tx_data, vec![0], vec![0]); + let sg_data = build_sg_data(tx_data, vec![0], vec![0]); - let vm_context = VmContext::new(&vm_data, &Arc::new(Mutex::new(Vec::new()))); + let vm_context = VmContext::new(&sg_data, &Arc::new(Mutex::new(Vec::new()))); let mut load_code = LoadCellData::new(&vm_context); diff --git a/script/src/syscalls/tests/vm_latest/syscalls_2.rs b/script/src/syscalls/tests/vm_latest/syscalls_2.rs index f9991f3687..38b3f7c9ef 100644 --- a/script/src/syscalls/tests/vm_latest/syscalls_2.rs +++ b/script/src/syscalls/tests/vm_latest/syscalls_2.rs @@ -61,9 +61,9 @@ fn test_current_cycles() { }); let tx_data = Arc::new(build_tx_data(rtx)); - let vm_data = build_vm_data(tx_data, vec![], vec![]); + let sg_data = build_sg_data(tx_data, vec![], vec![]); - let vm_context = VmContext::new(&vm_data, &Arc::new(Mutex::new(Vec::new()))); + let vm_context = VmContext::new(&sg_data, &Arc::new(Mutex::new(Vec::new()))); let result = CurrentCycles::new(&vm_context).ecall(&mut machine); @@ -122,9 +122,9 @@ fn _test_load_extension( }); let tx_data = Arc::new(build_tx_data_with_loader(rtx, data_loader)); - let vm_data = build_vm_data(tx_data, vec![0], vec![]); + let sg_data = build_sg_data(tx_data, vec![0], vec![]); - let mut load_block_extension = LoadBlockExtension::new(&vm_data); + let mut load_block_extension = LoadBlockExtension::new(&sg_data); prop_assert!(machine .memory_mut() diff --git a/script/src/syscalls/wait.rs b/script/src/syscalls/wait.rs index 17592368f6..11ae3693e3 100644 --- a/script/src/syscalls/wait.rs +++ b/script/src/syscalls/wait.rs @@ -1,5 +1,5 @@ use crate::syscalls::{SPAWN_YIELD_CYCLES_BASE, WAIT}; -use crate::types::{Message, VmContext, VmData, VmId, WaitArgs}; +use crate::types::{Message, VmContext, VmId, WaitArgs}; use ckb_traits::{CellDataProvider, ExtensionProvider, HeaderProvider}; use ckb_vm::{ registers::{A0, A1, A7}, @@ -14,12 +14,12 @@ pub struct Wait { } impl Wait { - pub fn new
(vm_data: &Arc>, vm_context: &VmContext
) -> Self + pub fn new
(vm_id: &VmId, vm_context: &VmContext
) -> Self where DL: CellDataProvider + HeaderProvider + ExtensionProvider + Send + Sync + Clone + 'static, { Self { - id: vm_data.vm_id, + id: *vm_id, message_box: Arc::clone(&vm_context.message_box), } } diff --git a/script/src/syscalls/write.rs b/script/src/syscalls/write.rs index 6d75d2d63b..2784abbeb4 100644 --- a/script/src/syscalls/write.rs +++ b/script/src/syscalls/write.rs @@ -1,5 +1,5 @@ use crate::syscalls::{INVALID_FD, SPAWN_YIELD_CYCLES_BASE, WRITE}; -use crate::types::{Fd, FdArgs, Message, VmContext, VmData, VmId}; +use crate::types::{Fd, FdArgs, Message, VmContext, VmId}; use ckb_traits::{CellDataProvider, ExtensionProvider, HeaderProvider}; use ckb_vm::{ registers::{A0, A1, A2, A7}, @@ -14,12 +14,12 @@ pub struct Write { } impl Write { - pub fn new
(vm_data: &Arc>, vm_context: &VmContext
) -> Self + pub fn new
(vm_id: &VmId, vm_context: &VmContext
) -> Self where DL: CellDataProvider + HeaderProvider + ExtensionProvider + Send + Sync + Clone + 'static, { Self { - id: vm_data.vm_id, + id: *vm_id, message_box: Arc::clone(&vm_context.message_box), } } diff --git a/script/src/types.rs b/script/src/types.rs index a0ed256fb6..eee70ab348 100644 --- a/script/src/types.rs +++ b/script/src/types.rs @@ -847,6 +847,30 @@ impl
SgData
{ program_data_piece_id: DataPieceId::CellDep(dep_index), }) } + + pub fn rtx(&self) -> &ResolvedTransaction { + &self.tx_data.rtx + } + + pub fn data_loader(&self) -> &DL { + &self.tx_data.data_loader + } + + pub fn group_inputs(&self) -> &[usize] { + &self.script_group.input_indices + } + + pub fn group_outputs(&self) -> &[usize] { + &self.script_group.output_indices + } + + pub fn outputs(&self) -> &[CellMeta] { + &self.tx_data.outputs + } + + pub fn current_script_hash(&self) -> &Byte32 { + &self.script_hash + } } impl
DataSource for Arc> @@ -919,51 +943,6 @@ where } } -/// Immutable context data at virtual machine level -#[derive(Clone, Debug)] -pub struct VmData
{ - /// Script group level data - pub sg_data: Arc>, - - /// Currently executed virtual machine ID - pub vm_id: VmId, -} - -impl
VmData
{ - pub fn rtx(&self) -> &ResolvedTransaction { - &self.sg_data.tx_data.rtx - } - - pub fn data_loader(&self) -> &DL { - &self.sg_data.tx_data.data_loader - } - - pub fn group_inputs(&self) -> &[usize] { - &self.sg_data.script_group.input_indices - } - - pub fn group_outputs(&self) -> &[usize] { - &self.sg_data.script_group.output_indices - } - - pub fn outputs(&self) -> &[CellMeta] { - &self.sg_data.tx_data.outputs - } - - pub fn current_script_hash(&self) -> &Byte32 { - &self.sg_data.script_hash - } -} - -impl
DataSource for Arc> -where - DL: CellDataProvider, -{ - fn load_data(&self, id: &DataPieceId, offset: u64, length: u64) -> Option<(Bytes, u64)> { - self.sg_data.load_data(id, offset, length) - } -} - /// Mutable data at virtual machine level #[derive(Clone)] pub struct VmContext
@@ -973,7 +952,7 @@ where pub(crate) base_cycles: Arc, /// A mutable reference to scheduler's message box pub(crate) message_box: Arc>>, - pub(crate) snapshot2_context: Arc>>>>, + pub(crate) snapshot2_context: Arc>>>>, } impl
VmContext
@@ -983,11 +962,11 @@ where /// Creates a new VM context. It is by design that parameters to this function /// are references. It is a reminder that the inputs are designed to be shared /// among different entities. - pub fn new(vm_data: &Arc>, message_box: &Arc>>) -> Self { + pub fn new(sg_data: &Arc>, message_box: &Arc>>) -> Self { Self { base_cycles: Arc::new(AtomicU64::new(0)), message_box: Arc::clone(message_box), - snapshot2_context: Arc::new(Mutex::new(Snapshot2Context::new(Arc::clone(vm_data)))), + snapshot2_context: Arc::new(Mutex::new(Snapshot2Context::new(Arc::clone(sg_data)))), } }