From 34f535f45adadd99767d8d96bb10137da2a25cef Mon Sep 17 00:00:00 2001 From: Lane Rettig Date: Tue, 1 Oct 2024 14:33:37 -0700 Subject: [PATCH 01/13] Add method name to execution message --- core/src/syscall/host.rs | 1 + .../bindings/rust/athcon-client/src/lib.rs | 3 ++ ffi/athcon/bindings/rust/athcon-vm/src/lib.rs | 40 +++++++++++++++++++ ffi/athcon/include/athcon/athcon.h | 15 +++++++ ffi/vmlib/src/lib.rs | 10 +++++ interface/src/lib.rs | 7 ++++ runner/src/vm.rs | 2 + 7 files changed, 78 insertions(+) diff --git a/core/src/syscall/host.rs b/core/src/syscall/host.rs index 3741ffe4..9eacf8ec 100644 --- a/core/src/syscall/host.rs +++ b/core/src/syscall/host.rs @@ -124,6 +124,7 @@ impl Syscall for SyscallHostCall { address.into(), *athena_ctx.address(), input, + None, amount, Vec::new(), ); diff --git a/ffi/athcon/bindings/rust/athcon-client/src/lib.rs b/ffi/athcon/bindings/rust/athcon-client/src/lib.rs index 6966d88f..377e16d9 100644 --- a/ffi/athcon/bindings/rust/athcon-client/src/lib.rs +++ b/ffi/athcon/bindings/rust/athcon-client/src/lib.rs @@ -53,6 +53,7 @@ impl AthconVm { destination: &Address, sender: &Address, input: &[u8], + method: &[u8], value: &[u8; 32], code: &[u8], ) -> (Vec, i64, StatusCode) { @@ -67,6 +68,8 @@ impl AthconVm { sender: ffi::athcon_address { bytes: *sender }, input_data: input.as_ptr(), input_size: input.len(), + method_name: method.as_ptr(), + method_name_size: method.len(), value: ffi::athcon_uint256be { bytes: *value }, code: code.as_ptr(), code_size: code.len(), diff --git a/ffi/athcon/bindings/rust/athcon-vm/src/lib.rs b/ffi/athcon/bindings/rust/athcon-vm/src/lib.rs index 0f9b2f12..db462eeb 100644 --- a/ffi/athcon/bindings/rust/athcon-vm/src/lib.rs +++ b/ffi/athcon/bindings/rust/athcon-vm/src/lib.rs @@ -53,6 +53,7 @@ pub struct ExecutionMessage { recipient: Address, sender: Address, input: Option>, + method: Option>, value: Uint256, code: Option>, } @@ -124,6 +125,7 @@ impl ExecutionMessage { recipient: Address, sender: Address, input: Option<&[u8]>, + method: Option<&[u8]>, value: Uint256, code: Option<&[u8]>, ) -> Self { @@ -134,6 +136,7 @@ impl ExecutionMessage { recipient, sender, input: input.map(|s| s.to_vec()), + method: method.map(|s| s.to_vec()), value, code: code.map(|s| s.to_vec()), } @@ -169,6 +172,11 @@ impl ExecutionMessage { self.input.as_ref() } + /// Read the optional method. + pub fn method(&self) -> Option<&Vec> { + self.method.as_ref() + } + /// Read the value of the message. pub fn value(&self) -> &Uint256 { &self.value @@ -253,6 +261,17 @@ impl<'a> ExecutionContext<'a> { } else { std::ptr::null() }; + let method = message.method(); + let method_name_size = if let Some(method) = method { + method.len() + } else { + 0 + }; + let method_name = if let Some(method) = method { + method.as_ptr() + } else { + std::ptr::null() + }; let code = message.code(); let code_size = if let Some(code) = code { code.len() } else { 0 }; let code_data = if let Some(code) = code { @@ -270,6 +289,8 @@ impl<'a> ExecutionContext<'a> { sender: *message.sender(), input_data, input_size, + method_name, + method_name_size, value: *message.value(), code: code_data, code_size, @@ -414,6 +435,19 @@ impl TryFrom<&ffi::athcon_message> for ExecutionMessage { } else { Some(from_buf_raw::(message.input_data, message.input_size)) }, + method: if message.method_name.is_null() { + if message.method_name_size != 0 { + return Err("msg.method_data is null but msg.method_size is not 0".to_string()); + } + None + } else if message.method_name_size == 0 { + None + } else { + Some(from_buf_raw::( + message.method_name, + message.method_name_size, + )) + }, value: message.value, code: if message.code.is_null() { if message.code_size != 0 { @@ -589,6 +623,7 @@ mod tests { recipient, sender, Some(&input), + None, value, None, ); @@ -617,6 +652,7 @@ mod tests { recipient, sender, None, + None, value, Some(&code), ); @@ -644,6 +680,8 @@ mod tests { sender, input_data: std::ptr::null(), input_size: 0, + method_name: std::ptr::null(), + method_name_size: 0, value, code: std::ptr::null(), code_size: 0, @@ -815,6 +853,7 @@ mod tests { test_addr, test_addr, None, + None, Uint256::default(), None, ); @@ -845,6 +884,7 @@ mod tests { test_addr, test_addr, Some(&data), + None, Uint256::default(), None, ); diff --git a/ffi/athcon/include/athcon/athcon.h b/ffi/athcon/include/athcon/athcon.h index 94a9c277..c8b4bd6a 100644 --- a/ffi/athcon/include/athcon/athcon.h +++ b/ffi/athcon/include/athcon/athcon.h @@ -112,6 +112,21 @@ extern "C" */ size_t input_size; + /** + * The destination program method to call. + * + * The arbitrary length byte array of the method name of the call. + * This MAY be NULL. + */ + const uint8_t *method_name; + + /** + * The size of the method name data. + * + * If input_data is NULL this MUST be 0. + */ + size_t method_name_size; + /** * The number of coins transferred with the message. * diff --git a/ffi/vmlib/src/lib.rs b/ffi/vmlib/src/lib.rs index e839262d..1a4c224d 100644 --- a/ffi/vmlib/src/lib.rs +++ b/ffi/vmlib/src/lib.rs @@ -140,6 +140,13 @@ impl From for AthenaMessageWrapper { None }; + // Convert method pointer and size to Vec + let method = if !item.method_name.is_null() && item.method_name_size > 0 { + Some(unsafe { std::slice::from_raw_parts(item.method_name, item.method_name_size) }.to_vec()) + } else { + None + }; + // Convert code pointer and size to Vec let code = if !item.code.is_null() && item.code_size > 0 { unsafe { std::slice::from_raw_parts(item.code, item.code_size) }.to_vec() @@ -156,6 +163,7 @@ impl From for AthenaMessageWrapper { recipient: AddressWrapper::from(item.recipient).into(), sender: AddressWrapper::from(item.sender).into(), input_data, + method, value: Bytes32AsU64::new(byteswrapper.0).into(), code, }) @@ -215,6 +223,7 @@ impl From for AthconExecutionMessage { AddressWrapper(item.0.recipient).into(), AddressWrapper(item.0.sender).into(), item.0.input_data.as_deref(), + item.0.method.as_deref(), Bytes32Wrapper(value.into()).into(), code, ) @@ -232,6 +241,7 @@ impl From<&AthconExecutionMessage> for AthenaMessageWrapper { recipient: AddressWrapper::from(*item.recipient()).into(), sender: AddressWrapper::from(*item.sender()).into(), input_data: item.input().cloned(), + method: item.method().cloned(), value: Bytes32AsU64::new(byteswrapper.0).into(), code: item.code().map_or(Vec::new(), |c| c.to_vec()), }) diff --git a/interface/src/lib.rs b/interface/src/lib.rs index c6cdc591..3bfae742 100644 --- a/interface/src/lib.rs +++ b/interface/src/lib.rs @@ -163,6 +163,7 @@ pub struct AthenaMessage { pub recipient: Address, pub sender: Address, pub input_data: Option>, + pub method: Option>, pub value: Balance, // code is currently unused, and it seems redundant. // it's not in the yellow paper. @@ -179,6 +180,7 @@ impl AthenaMessage { recipient: Address, sender: Address, input_data: Option>, + method: Option>, value: Balance, code: Vec, ) -> Self { @@ -189,6 +191,7 @@ impl AthenaMessage { recipient, sender, input_data, + method, value, code, } @@ -759,6 +762,7 @@ mod tests { ADDRESS_CHARLIE, ADDRESS_ALICE, None, + None, 0, vec![], ); @@ -775,6 +779,7 @@ mod tests { ADDRESS_CHARLIE, ADDRESS_ALICE, None, + None, 100, vec![], ); @@ -791,6 +796,7 @@ mod tests { ADDRESS_CHARLIE, ADDRESS_ALICE, None, + None, SOME_COINS, vec![], ); @@ -807,6 +813,7 @@ mod tests { ADDRESS_BOB, ADDRESS_ALICE, None, + None, 100, vec![], ); diff --git a/runner/src/vm.rs b/runner/src/vm.rs index 55843da8..b9fb2cf0 100644 --- a/runner/src/vm.rs +++ b/runner/src/vm.rs @@ -104,6 +104,7 @@ mod tests { Address::default(), Address::default(), None, + None, Balance::default(), vec![], ), @@ -191,6 +192,7 @@ mod tests { ADDRESS_ALICE, ADDRESS_ALICE, Some(vec![8u8, 0, 0, 0]), + None, 0, vec![], ); From 0299858af2a5fa298136a058699a11f252f045ca Mon Sep 17 00:00:00 2001 From: Lane Rettig Date: Tue, 1 Oct 2024 16:38:10 -0700 Subject: [PATCH 02/13] Add method name to call syscall --- core/src/syscall/host.rs | 31 +++++++++++++++-- .../bindings/rust/athcon-client/src/host.rs | 2 ++ .../bindings/rust/athcon-client/src/lib.rs | 8 +++-- .../athcon-client/tests/integration_tests.rs | 4 +++ .../bindings/rust/athcon-vm/src/container.rs | 2 ++ ffi/vmlib/tests/integration_tests.rs | 2 ++ tests/recursive_call/Cargo.toml | 1 + tests/recursive_call/elf/recursive-call-test | Bin 110876 -> 113272 bytes tests/recursive_call/src/main.rs | 13 +++---- vm/entrypoint/src/syscalls/host.rs | 15 ++++++-- vm/sdk/src/lib.rs | 32 ++++++++++++++++-- 11 files changed, 91 insertions(+), 19 deletions(-) diff --git a/core/src/syscall/host.rs b/core/src/syscall/host.rs index 9eacf8ec..f2686f53 100644 --- a/core/src/syscall/host.rs +++ b/core/src/syscall/host.rs @@ -61,9 +61,11 @@ impl Syscall for SyscallHostWrite { /// SyscallHostCall performs a host call, calling other programs. /// Inputs: /// - a0: address to call -/// - a1: address of input (bytes) to pass to the called program +/// - a1: pointer to input (bytes) to pass to the called program /// - a2: length of input (bytes) -/// - a3: address to read the amount from (2 words, 8 bytes) +/// - a3: pointer to method name (bytes) to call +/// - a4: length of method name (bytes) +/// - a5: address to read the amount from (2 words, 8 bytes) pub(crate) struct SyscallHostCall; impl Syscall for SyscallHostCall { @@ -111,6 +113,29 @@ impl Syscall for SyscallHostCall { None }; + // read the method name from the next register + let len = ctx.rt.register(Register::X14) as usize; + if len % 4 != 0 { + log::debug!("host system call input (a4/x14) not aligned to 4 bytes"); + return Err(StatusCode::InvalidSyscallArgument); + } + + let method_name_ptr = ctx.rt.register(Register::X13); + + // `len` is denominated in number of bytes; we read words in chunks of four bytes + // then convert into a byte array. + let method = if len > 0 { + let words = ctx.slice(method_name_ptr, len / 4); + Some( + words + .into_iter() + .flat_map(|word| word.to_le_bytes()) + .collect(), + ) + } else { + None + }; + let amount_ptr = ctx.rt.register(Register::X13); let amount = ctx.dword(amount_ptr); @@ -124,7 +149,7 @@ impl Syscall for SyscallHostCall { address.into(), *athena_ctx.address(), input, - None, + method, amount, Vec::new(), ); diff --git a/ffi/athcon/bindings/rust/athcon-client/src/host.rs b/ffi/athcon/bindings/rust/athcon-client/src/host.rs index 67b4bca4..5ee22a18 100644 --- a/ffi/athcon/bindings/rust/athcon-client/src/host.rs +++ b/ffi/athcon/bindings/rust/athcon-client/src/host.rs @@ -23,6 +23,7 @@ pub trait HostContext { sender: &Address, value: &Bytes32, input: &Bytes, + method: &Bytes, gas: i64, depth: i32, ) -> (Vec, i64, Address, StatusCode); @@ -148,6 +149,7 @@ pub unsafe extern "C" fn call( &msg.sender.bytes, &msg.value.bytes, std::slice::from_raw_parts(msg.input_data, msg.input_size), + std::slice::from_raw_parts(msg.method_name, msg.method_name_size), msg.gas, msg.depth, ); diff --git a/ffi/athcon/bindings/rust/athcon-client/src/lib.rs b/ffi/athcon/bindings/rust/athcon-client/src/lib.rs index 377e16d9..80ad1276 100644 --- a/ffi/athcon/bindings/rust/athcon-client/src/lib.rs +++ b/ffi/athcon/bindings/rust/athcon-client/src/lib.rs @@ -87,8 +87,12 @@ impl AthconVm { code.as_ptr(), code.len(), ); - let data = std::slice::from_raw_parts(result.output_data, result.output_size); - let output = data.to_vec(); + let output = if !result.output_data.is_null() && result.output_size > 0 { + let data = std::slice::from_raw_parts(result.output_data, result.output_size); + data.to_vec() + } else { + Vec::new() + }; if let Some(release) = result.release { release(&result); } diff --git a/ffi/athcon/bindings/rust/athcon-client/tests/integration_tests.rs b/ffi/athcon/bindings/rust/athcon-client/tests/integration_tests.rs index c2264092..267973cb 100644 --- a/ffi/athcon/bindings/rust/athcon-client/tests/integration_tests.rs +++ b/ffi/athcon/bindings/rust/athcon-client/tests/integration_tests.rs @@ -81,6 +81,7 @@ impl HostInterface for HostContext { sender: &Address, value: &Bytes32, input: &Bytes, + method: &Bytes, gas: i64, depth: i32, ) -> (Vec, i64, Address, StatusCode) { @@ -114,6 +115,7 @@ impl HostInterface for HostContext { destination, sender, input, + method, value, CONTRACT_CODE, ); @@ -153,6 +155,8 @@ fn test_rust_host() { &[128u8; ADDRESS_LENGTH], // the value 3 as little-endian u32 3u32.to_le_bytes().as_slice(), + // empty method name + &[], &[0u8; BYTES32_LENGTH], CONTRACT_CODE, ); diff --git a/ffi/athcon/bindings/rust/athcon-vm/src/container.rs b/ffi/athcon/bindings/rust/athcon-vm/src/container.rs index 8fefdab8..4a83acb4 100644 --- a/ffi/athcon/bindings/rust/athcon-vm/src/container.rs +++ b/ffi/athcon/bindings/rust/athcon-vm/src/container.rs @@ -121,6 +121,8 @@ mod tests { sender: ::athcon_sys::athcon_address::default(), input_data: std::ptr::null(), input_size: 0, + method_name: std::ptr::null(), + method_name_size: 0, value: ::athcon_sys::athcon_uint256be::default(), code: std::ptr::null(), code_size: 0, diff --git a/ffi/vmlib/tests/integration_tests.rs b/ffi/vmlib/tests/integration_tests.rs index d8f1c490..945eede5 100644 --- a/ffi/vmlib/tests/integration_tests.rs +++ b/ffi/vmlib/tests/integration_tests.rs @@ -77,6 +77,8 @@ fn test_athcon_create() { sender: ::athcon_sys::athcon_address::default(), input_data: std::ptr::null(), input_size: 0, + method_name: std::ptr::null(), + method_name_size: 0, value: ::athcon_sys::athcon_uint256be::default(), code: code.as_ptr(), code_size: code.len(), diff --git a/tests/recursive_call/Cargo.toml b/tests/recursive_call/Cargo.toml index fadac757..26b20460 100644 --- a/tests/recursive_call/Cargo.toml +++ b/tests/recursive_call/Cargo.toml @@ -6,3 +6,4 @@ edition = "2021" [dependencies] athena-vm = { path = "../../vm/entrypoint", features = ["rv32e"] } +athena-vm-sdk = { path = "../../vm/sdk" } diff --git a/tests/recursive_call/elf/recursive-call-test b/tests/recursive_call/elf/recursive-call-test index 823c204e9d98a00f703ff479248ed97237315a7c..13cd20e42a05eca0048d8613765283b9f31f055a 100755 GIT binary patch literal 113272 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 RR{7dmbnToi6-LST{{XH)0!aV> literal 110876 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 diff --git a/tests/recursive_call/src/main.rs b/tests/recursive_call/src/main.rs index 7cf1dc83..bbc2be54 100644 --- a/tests/recursive_call/src/main.rs +++ b/tests/recursive_call/src/main.rs @@ -1,10 +1,11 @@ #![no_main] athena_vm::entrypoint!(main); -use athena_vm::helpers::{address_to_32bit_words, bytes32_to_32bit_words}; +use athena_vm::helpers::bytes32_to_32bit_words; use athena_vm::types::{ StorageStatus::StorageAdded, StorageStatus::StorageModified, ADDRESS_ALICE, STORAGE_KEY, }; +use athena_vm_sdk::call; // Note: the test harness installs this contract code at ADDRESS_ALICE @@ -27,14 +28,8 @@ fn return_value(value: u32) { } fn recursive_call(value: u32) -> u32 { - // we need a pointer to the value as an array - let val: [u32; 4] = [value, 0, 0, 0]; - - // same for amount to send - let amount: [u32; 2] = [0, 0]; - - let address = address_to_32bit_words(ADDRESS_ALICE); - unsafe { athena_vm::host::call(address.as_ptr(), val.as_ptr(), 4, amount.as_ptr()) }; + let value_bytes = value.to_le_bytes().to_vec(); + call(ADDRESS_ALICE, Some(value_bytes), None, 0); // read the return value let mut key = bytes32_to_32bit_words(STORAGE_KEY); diff --git a/vm/entrypoint/src/syscalls/host.rs b/vm/entrypoint/src/syscalls/host.rs index 09d39a91..e7347a3b 100644 --- a/vm/entrypoint/src/syscalls/host.rs +++ b/vm/entrypoint/src/syscalls/host.rs @@ -5,6 +5,8 @@ use core::arch::asm; /// /// `address` is the callee address, `input` is a bytearray to be passed to the /// callee function, and `len` is the number of bytes to read from the input bytearray. +/// `method` is the name of the function to call, and `method_len` is the length of +/// the method name in bytes. /// `amount` is the number of coins to transfer to the callee. /// For now there is no return value and no return status code. The caller can assume /// that, if this function returns, the call was successful. @@ -12,7 +14,14 @@ use core::arch::asm; /// See https://github.com/athenavm/athena/issues/5 for more information. #[allow(unused_variables)] #[no_mangle] -pub extern "C" fn call(address: *const u32, input: *const u32, len: usize, amount: *const u32) { +pub extern "C" fn call( + address: *const u32, + input: *const u32, + len: usize, + method: *const u32, + method_len: usize, + amount: *const u32, +) { #[cfg(target_os = "zkvm")] unsafe { asm!( @@ -21,7 +30,9 @@ pub extern "C" fn call(address: *const u32, input: *const u32, len: usize, amoun in("a0") address, in("a1") input, in("a2") len, - in("a3") amount, + in("a3") method, + in("a4") method_len, + in("a5") amount, ) } diff --git a/vm/sdk/src/lib.rs b/vm/sdk/src/lib.rs index b57a1ebc..687150cc 100644 --- a/vm/sdk/src/lib.rs +++ b/vm/sdk/src/lib.rs @@ -13,7 +13,7 @@ pub use spawn::spawn; pub struct Pubkey(pub Bytes32); pub const PUBKEY_LENGTH: usize = BYTES32_LENGTH; -pub fn call(address: Address, input: Option>, amount: Balance) { +pub fn call(address: Address, input: Option>, method: Option>, amount: Balance) { let address = address_to_32bit_words(address); let amount = balance_to_32bit_words(amount); @@ -34,10 +34,36 @@ pub fn call(address: Address, input: Option>, amount: Balance) { } else { None }; - let (input, input_len) = input32.map_or((std::ptr::null(), 0), |v| (v.as_ptr(), v.len())); - athena_vm::syscalls::call(address.as_ptr(), input, input_len, amount.as_ptr()); + let method32 = if let Some(method) = method { + let mut v = method + .chunks(4) + .map(|chunk| { + let mut bytes = [0u8; 4]; + bytes.copy_from_slice(chunk); + u32::from_le_bytes(bytes) + }) + .collect::>(); + let len = v.len(); + // pad method name to 4-byte alignment + if len % 4 != 0 { + v.extend(std::iter::repeat(0).take(4 - len % 4)); + } + Some(v) + } else { + None + }; + let (method, method_len) = method32.map_or((std::ptr::null(), 0), |v| (v.as_ptr(), v.len())); + + athena_vm::syscalls::call( + address.as_ptr(), + input, + input_len, + method, + method_len, + amount.as_ptr(), + ); } // These traits define the reference wallet interface. From 96b9afa3f8e08e24506b5466218842354eb40afb Mon Sep 17 00:00:00 2001 From: Lane Rettig Date: Tue, 1 Oct 2024 16:40:45 -0700 Subject: [PATCH 03/13] Fix typo --- ffi/athcon/include/athcon/athcon.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ffi/athcon/include/athcon/athcon.h b/ffi/athcon/include/athcon/athcon.h index c8b4bd6a..7540c937 100644 --- a/ffi/athcon/include/athcon/athcon.h +++ b/ffi/athcon/include/athcon/athcon.h @@ -123,7 +123,7 @@ extern "C" /** * The size of the method name data. * - * If input_data is NULL this MUST be 0. + * If method_name is NULL this MUST be 0. */ size_t method_name_size; From 25d434a3fa052223316b14c654e0ef763c296adf Mon Sep 17 00:00:00 2001 From: Lane Rettig Date: Wed, 2 Oct 2024 15:08:20 -0700 Subject: [PATCH 04/13] Misc cleanup Factor in review comments Integration test passing --- core/src/syscall/host.rs | 12 ++--- .../bindings/rust/athcon-client/src/host.rs | 12 ++++- ffi/athcon/bindings/rust/athcon-vm/src/lib.rs | 50 +++++------------- tests/recursive_call/elf/recursive-call-test | Bin 113272 -> 112464 bytes vm/entrypoint/src/syscalls/host.rs | 18 +++---- vm/sdk/src/lib.rs | 13 ++--- 6 files changed, 44 insertions(+), 61 deletions(-) diff --git a/core/src/syscall/host.rs b/core/src/syscall/host.rs index f2686f53..8d0a8aa3 100644 --- a/core/src/syscall/host.rs +++ b/core/src/syscall/host.rs @@ -60,12 +60,12 @@ impl Syscall for SyscallHostWrite { /// SyscallHostCall performs a host call, calling other programs. /// Inputs: -/// - a0: address to call -/// - a1: pointer to input (bytes) to pass to the called program -/// - a2: length of input (bytes) -/// - a3: pointer to method name (bytes) to call -/// - a4: length of method name (bytes) -/// - a5: address to read the amount from (2 words, 8 bytes) +/// - a0 (arg1): address to call +/// - a1 (arg2): pointer to input (bytes) to pass to the called program +/// - a2 (x12): length of input (bytes) +/// - a3 (x13): pointer to method name (bytes) to call +/// - a4 (x14): length of method name (bytes) +/// - a5 (x15): address to read the amount from (2 words, 8 bytes) pub(crate) struct SyscallHostCall; impl Syscall for SyscallHostCall { diff --git a/ffi/athcon/bindings/rust/athcon-client/src/host.rs b/ffi/athcon/bindings/rust/athcon-client/src/host.rs index 5ee22a18..5d7d46b7 100644 --- a/ffi/athcon/bindings/rust/athcon-client/src/host.rs +++ b/ffi/athcon/bindings/rust/athcon-client/src/host.rs @@ -148,8 +148,16 @@ pub unsafe extern "C" fn call( &msg.recipient.bytes, &msg.sender.bytes, &msg.value.bytes, - std::slice::from_raw_parts(msg.input_data, msg.input_size), - std::slice::from_raw_parts(msg.method_name, msg.method_name_size), + if !msg.input_data.is_null() && msg.input_size > 0 { + std::slice::from_raw_parts(msg.input_data, msg.input_size) + } else { + &[] + }, + if !msg.method_name.is_null() && msg.method_name_size > 0 { + std::slice::from_raw_parts(msg.input_data, msg.input_size) + } else { + &[] + }, msg.gas, msg.depth, ); diff --git a/ffi/athcon/bindings/rust/athcon-vm/src/lib.rs b/ffi/athcon/bindings/rust/athcon-vm/src/lib.rs index db462eeb..ee33443c 100644 --- a/ffi/athcon/bindings/rust/athcon-vm/src/lib.rs +++ b/ffi/athcon/bindings/rust/athcon-vm/src/lib.rs @@ -3,6 +3,8 @@ mod container; mod types; +use core::slice; + pub use athcon_sys as ffi; pub use container::AthconContainer; pub use types::*; @@ -251,26 +253,15 @@ impl<'a> ExecutionContext<'a> { // There is no need to make any kind of copies here, because the caller // won't go out of scope and ensures these pointers remain valid. let input = message.input(); - let input_size = if let Some(input) = input { - input.len() - } else { - 0 - }; - let input_data = if let Some(input) = input { - input.as_ptr() + let (input_data, input_size) = if let Some(input) = input { + (input.as_ptr(), input.len()) } else { - std::ptr::null() + (std::ptr::null(), 0) }; - let method = message.method(); - let method_name_size = if let Some(method) = method { - method.len() + let (method_name, method_name_size) = if let Some(method) = message.method() { + (method.as_ptr(), method.len()) } else { - 0 - }; - let method_name = if let Some(method) = method { - method.as_ptr() - } else { - std::ptr::null() + (std::ptr::null(), 0) }; let code = message.code(); let code_size = if let Some(code) = code { code.len() } else { 0 }; @@ -326,7 +317,7 @@ impl From for ExecutionResult { } else if result.output_size == 0 { None } else { - Some(from_buf_raw::(result.output_data, result.output_size)) + Some(unsafe { slice::from_raw_parts(result.output_data, result.output_size).to_vec() }) }, // Consider it is always valid. create_address: Some(result.create_address), @@ -433,7 +424,7 @@ impl TryFrom<&ffi::athcon_message> for ExecutionMessage { } else if message.input_size == 0 { None } else { - Some(from_buf_raw::(message.input_data, message.input_size)) + Some(unsafe { slice::from_raw_parts(message.input_data, message.input_size).to_vec() }) }, method: if message.method_name.is_null() { if message.method_name_size != 0 { @@ -443,10 +434,9 @@ impl TryFrom<&ffi::athcon_message> for ExecutionMessage { } else if message.method_name_size == 0 { None } else { - Some(from_buf_raw::( - message.method_name, - message.method_name_size, - )) + Some(unsafe { + slice::from_raw_parts(message.method_name, message.method_name_size).to_vec() + }) }, value: message.value, code: if message.code.is_null() { @@ -457,24 +447,12 @@ impl TryFrom<&ffi::athcon_message> for ExecutionMessage { } else if message.code_size == 0 { None } else { - Some(from_buf_raw::(message.code, message.code_size)) + Some(unsafe { slice::from_raw_parts(message.code, message.code_size).to_vec() }) }, }) } } -fn from_buf_raw(ptr: *const T, size: usize) -> Vec { - // Pre-allocate a vector. - let mut buf = Vec::with_capacity(size); - unsafe { - // Copy from the C buffer to the vec's buffer. - std::ptr::copy(ptr, buf.as_mut_ptr(), size); - // Set the len of the vec manually. - buf.set_len(size); - } - buf -} - #[cfg(test)] mod tests { use super::*; diff --git a/tests/recursive_call/elf/recursive-call-test b/tests/recursive_call/elf/recursive-call-test index 13cd20e42a05eca0048d8613765283b9f31f055a..858367158591b369752ce6ec6da4e17612e5660d 100755 GIT binary patch delta 31772 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 L&}UtcZKwP{4OLJv delta 32554 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 F{{zmbA#VTx diff --git a/vm/entrypoint/src/syscalls/host.rs b/vm/entrypoint/src/syscalls/host.rs index e7347a3b..7141c152 100644 --- a/vm/entrypoint/src/syscalls/host.rs +++ b/vm/entrypoint/src/syscalls/host.rs @@ -3,9 +3,9 @@ use core::arch::asm; /// Call a function in a foreign program. /// -/// `address` is the callee address, `input` is a bytearray to be passed to the -/// callee function, and `len` is the number of bytes to read from the input bytearray. -/// `method` is the name of the function to call, and `method_len` is the length of +/// `address` is the callee address, `input_ptr` is a bytearray to be passed to the +/// callee function, and `input_len` is the number of bytes to read from the input bytearray. +/// `method_ptr` is the name of the function to call, and `method_len` is the length of /// the method name in bytes. /// `amount` is the number of coins to transfer to the callee. /// For now there is no return value and no return status code. The caller can assume @@ -16,9 +16,9 @@ use core::arch::asm; #[no_mangle] pub extern "C" fn call( address: *const u32, - input: *const u32, - len: usize, - method: *const u32, + input_ptr: *const u32, + input_len: usize, + method_ptr: *const u32, method_len: usize, amount: *const u32, ) { @@ -28,9 +28,9 @@ pub extern "C" fn call( "ecall", in("t0") crate::syscalls::HOST_CALL, in("a0") address, - in("a1") input, - in("a2") len, - in("a3") method, + in("a1") input_ptr, + in("a2") input_len, + in("a3") method_ptr, in("a4") method_len, in("a5") amount, ) diff --git a/vm/sdk/src/lib.rs b/vm/sdk/src/lib.rs index 687150cc..050592d7 100644 --- a/vm/sdk/src/lib.rs +++ b/vm/sdk/src/lib.rs @@ -34,10 +34,11 @@ pub fn call(address: Address, input: Option>, method: Option>, a } else { None }; - let (input, input_len) = input32.map_or((std::ptr::null(), 0), |v| (v.as_ptr(), v.len())); + // multiply len * 4 since len is in bytes not words + let (input, input_len) = input32.map_or((std::ptr::null(), 0), |v| (v.as_ptr(), v.len() * 4)); let method32 = if let Some(method) = method { - let mut v = method + let v = method .chunks(4) .map(|chunk| { let mut bytes = [0u8; 4]; @@ -45,16 +46,12 @@ pub fn call(address: Address, input: Option>, method: Option>, a u32::from_le_bytes(bytes) }) .collect::>(); - let len = v.len(); - // pad method name to 4-byte alignment - if len % 4 != 0 { - v.extend(std::iter::repeat(0).take(4 - len % 4)); - } Some(v) } else { None }; - let (method, method_len) = method32.map_or((std::ptr::null(), 0), |v| (v.as_ptr(), v.len())); + // multiply len * 4 since len is in bytes not words + let (method, method_len) = method32.map_or((std::ptr::null(), 0), |v| (v.as_ptr(), v.len() * 4)); athena_vm::syscalls::call( address.as_ptr(), From 23c406a074d0898e86482a2b6ea75d181cabb930 Mon Sep 17 00:00:00 2001 From: Lane Rettig Date: Wed, 2 Oct 2024 15:15:59 -0700 Subject: [PATCH 05/13] Merge in main branch Move call syscall implementation to new location --- vm/sdk/src/call.rs | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/vm/sdk/src/call.rs b/vm/sdk/src/call.rs index 776b4e50..5818167f 100644 --- a/vm/sdk/src/call.rs +++ b/vm/sdk/src/call.rs @@ -1,7 +1,7 @@ use athena_interface::{Address, Balance}; use athena_vm::helpers::{address_to_32bit_words, balance_to_32bit_words}; -pub fn call(address: Address, input: Option>, amount: Balance) { +pub fn call(address: Address, input: Option>, method: Option>, amount: Balance) { let address = address_to_32bit_words(address); let amount = balance_to_32bit_words(amount); @@ -16,5 +16,22 @@ pub fn call(address: Address, input: Option>, amount: Balance) { let (input, input_len) = input32.map_or((std::ptr::null(), 0), |(v, l)| (v.as_ptr(), l)); - athena_vm::syscalls::call(address.as_ptr(), input, input_len, amount.as_ptr()); + // we don't require method name to be word-aligned + let method32 = if let Some(method) = method { + Some((crate::bytes_to_u32_vec(&method), method.len())) + } else { + None + }; + + let (method_name, method_name_len) = + method32.map_or((std::ptr::null(), 0), |(v, l)| (v.as_ptr(), l)); + + athena_vm::syscalls::call( + address.as_ptr(), + input, + input_len, + method, + method_len, + amount.as_ptr(), + ); } From 56e4c5339ba7c47b460eb86dec48203c3f306fe3 Mon Sep 17 00:00:00 2001 From: Lane Rettig Date: Wed, 2 Oct 2024 15:27:22 -0700 Subject: [PATCH 06/13] Update go bindings --- ffi/athcon/bindings/go/athcon.go | 14 ++++++++++++++ ffi/athcon/bindings/go/athcon_test.go | 2 +- ffi/athcon/bindings/go/host_test.go | 6 +++--- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/ffi/athcon/bindings/go/athcon.go b/ffi/athcon/bindings/go/athcon.go index 20a86cff..34a29de0 100644 --- a/ffi/athcon/bindings/go/athcon.go +++ b/ffi/athcon/bindings/go/athcon.go @@ -170,6 +170,7 @@ func (vm *VM) Execute( gas int64, recipient, sender Address, input []byte, + method []byte, value Bytes32, code []byte, ) (res Result, err error) { @@ -200,6 +201,19 @@ func (vm *VM) Execute( msg.input_data = (*C.uchar)(unsafe.Pointer(&cSlice[0])) msg.input_size = C.size_t(len(input)) } + if len(method) > 0 { + // Allocate memory for method name in C. + cMethodName := C.malloc(C.size_t(len(input))) + if cMethodName == nil { + return res, fmt.Errorf("failed to allocate memory for method name") + } + defer C.free(cMethodName) + + cSlice := unsafe.Slice((*byte)(cMethodName), len(method)) + copy(cSlice, method) + msg.method_name = (*C.uchar)(unsafe.Pointer(&cSlice[0])) + msg.method_name_size = C.size_t(len(method)) + } ctxHandle := cgo.NewHandle(ctx) diff --git a/ffi/athcon/bindings/go/athcon_test.go b/ffi/athcon/bindings/go/athcon_test.go index 0e773302..30d06347 100644 --- a/ffi/athcon/bindings/go/athcon_test.go +++ b/ffi/athcon/bindings/go/athcon_test.go @@ -58,7 +58,7 @@ func TestExecuteEmptyCode(t *testing.T) { addr := Address{} h := Bytes32{} - result, err := vm.Execute(nil, Frontier, Call, 1, 999, addr, addr, nil, h, nil) + result, err := vm.Execute(nil, Frontier, Call, 1, 999, addr, addr, nil, nil, h, nil) require.Error(t, err) require.Empty(t, result.Output) diff --git a/ffi/athcon/bindings/go/host_test.go b/ffi/athcon/bindings/go/host_test.go index 9f56a9cf..16e098f8 100644 --- a/ffi/athcon/bindings/go/host_test.go +++ b/ffi/athcon/bindings/go/host_test.go @@ -68,7 +68,7 @@ func TestGetBalance(t *testing.T) { host := &testHostContext{} addr := Address{} h := Bytes32{} - result, err := vm.Execute(host, Frontier, Call, 1, 100, addr, addr, nil, h, MINIMAL_TEST_CODE) + result, err := vm.Execute(host, Frontier, Call, 1, 100, addr, addr, nil, nil, h, MINIMAL_TEST_CODE) output := result.Output gasLeft := result.GasLeft @@ -98,14 +98,14 @@ func TestCall(t *testing.T) { host := &testHostContext{} addr := Address{} h := Bytes32{} - result, err := vm.Execute(host, Frontier, Call, 1, 10000, addr, addr, []byte{2, 0, 0, 0}, h, RECURSIVE_CALL_TEST) + result, err := vm.Execute(host, Frontier, Call, 1, 10000, addr, addr, []byte{2, 0, 0, 0}, nil, h, RECURSIVE_CALL_TEST) output := result.Output gasLeft := result.GasLeft if len(output) != 4 { t.Errorf("execution unexpected output length: %d", len(output)) } - if gasLeft != 6604 { + if gasLeft != 5204 { t.Errorf("execution gas left is incorrect: %d", gasLeft) } if err != nil { From b6e02fb5bb6abb57e57516fa36d40fbda316fd20 Mon Sep 17 00:00:00 2001 From: Lane Rettig Date: Wed, 2 Oct 2024 15:48:35 -0700 Subject: [PATCH 07/13] Select method based on execution message --- runner/src/vm.rs | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/runner/src/vm.rs b/runner/src/vm.rs index b9fb2cf0..fa2365bc 100644 --- a/runner/src/vm.rs +++ b/runner/src/vm.rs @@ -55,11 +55,34 @@ where stdin.write_vec(input_data); } - log::info!("Executing code with input data"); - match self - .client - .execute(code, stdin, Some(host), Some(msg.gas), Some(context)) - { + // method name is also optional + let execution_result = if let Some(method_name) = msg.method { + // TODO: use a fixed-length method selector here rather than a string + // https://github.com/athenavm/athena/issues/113 + let method_name_str = match std::str::from_utf8(&method_name) { + Ok(name) => name, + Err(err) => { + log::info!("malformed utf-8 method name: {:?}", err); + return ExecutionResult::new(StatusCode::Failure, 0, None, None); + } + }; + log::info!("Executing method {} with input data", method_name_str); + self.client.execute_function( + code, + method_name_str, + stdin, + Some(host), + Some(msg.gas), + Some(context), + ) + } else { + log::info!("Executing default method with input data"); + self + .client + .execute(code, stdin, Some(host), Some(msg.gas), Some(context)) + }; + + match execution_result { Ok((public_values, gas_left)) => ExecutionResult::new( StatusCode::Success, gas_left.unwrap(), From c0f2ea1aa430dd4badf38189e85930735580eb1d Mon Sep 17 00:00:00 2001 From: Lane Rettig Date: Wed, 2 Oct 2024 19:00:38 -0700 Subject: [PATCH 08/13] Cleanup, adding tests WIP Finish updating host fn signatures Adding entrypoint test --- runner/src/vm.rs | 43 ++++++++++++++++++++++++++++++++++++ tests/entrypoint/Cargo.toml | 8 +++++++ tests/entrypoint/src/main.rs | 36 ++++++++++++++++++++++++++++++ vm/hostfunctions/src/lib.rs | 9 +++++++- vm/sdk/Cargo.toml | 1 + vm/sdk/src/io.rs | 15 +++++++++++++ vm/sdk/src/lib.rs | 28 +++++++++++------------ 7 files changed, 125 insertions(+), 15 deletions(-) create mode 100644 tests/entrypoint/Cargo.toml create mode 100644 tests/entrypoint/src/main.rs create mode 100644 vm/sdk/src/io.rs diff --git a/runner/src/vm.rs b/runner/src/vm.rs index fa2365bc..416aca1f 100644 --- a/runner/src/vm.rs +++ b/runner/src/vm.rs @@ -135,6 +135,49 @@ mod tests { ); } + #[test] + fn test_method_selector() { + let elf = include_bytes!("../../examples/wallet/program/elf/wallet-template"); + + // this will execute from the default entry point + let result = AthenaVm::new().execute( + &mut MockHost::new(), + AthenaRevision::AthenaFrontier, + AthenaMessage::new( + MessageKind::Call, + 0, + 1000000, + Address::default(), + Address::default(), + None, + None, + Balance::default(), + vec![], + ), + elf, + ); + assert_eq!(result.status_code, StatusCode::Success); + + // this will execute a specific method + let result = AthenaVm::new().execute( + &mut MockHost::new(), + AthenaRevision::AthenaFrontier, + AthenaMessage::new( + MessageKind::Call, + 0, + 1000000, + Address::default(), + Address::default(), + None, + Some("athcon_send".as_bytes().to_vec()), + Balance::default(), + vec![], + ), + elf, + ); + assert_eq!(result.status_code, StatusCode::Success); + } + // Note: we run this test here, as opposed to at a lower level (inside the SDK), since recursive host calls // require access to an actual VM instance. #[test] diff --git a/tests/entrypoint/Cargo.toml b/tests/entrypoint/Cargo.toml new file mode 100644 index 00000000..8aa1065f --- /dev/null +++ b/tests/entrypoint/Cargo.toml @@ -0,0 +1,8 @@ +[workspace] +[package] +name = "stack-depth-test" +version = "0.1.0" +edition = "2021" + +[dependencies] +athena-vm = { path = "../../vm/entrypoint", features = ["rv32e"] } diff --git a/tests/entrypoint/src/main.rs b/tests/entrypoint/src/main.rs new file mode 100644 index 00000000..6ece5911 --- /dev/null +++ b/tests/entrypoint/src/main.rs @@ -0,0 +1,36 @@ +#![no_main] +athena_vm::entrypoint!(main); + +use athena_vm::helpers::address_to_32bit_words; +use athena_vm::types::ADDRESS_ALICE; +use athena_vm_declare::{callable, template}; +use athena_vm_sdk::call; + +// Note: the test harness installs this contract code at ADDRESS_ALICE + +pub fn main() { + // recurse forever + let address = address_to_32bit_words(ADDRESS_ALICE); + let value: [u32; 2] = [0, 0]; + unsafe { athena_vm::host::call(address.as_ptr(), std::ptr::null(), 0, value.as_ptr()) }; +} + +pub struct EntrypointTest {}; + +#[cfg(all( + any(target_arch = "riscv32", target_arch = "riscv64"), + target_feature = "e" +))] +#[template] +impl EntrypointTest { + #[callable] + fn test1() { + } + + #[callable] + fn test2() { + } + + fn test3() { + } +} diff --git a/vm/hostfunctions/src/lib.rs b/vm/hostfunctions/src/lib.rs index 8a6348c3..bcb57b8e 100644 --- a/vm/hostfunctions/src/lib.rs +++ b/vm/hostfunctions/src/lib.rs @@ -1,5 +1,12 @@ extern "C" { - pub fn call(address: *const u32, input: *const u32, len: usize, amount: *const u32); + pub fn call( + address: *const u32, + input_ptr: *const u32, + input_len: usize, + method_ptr: *const u32, + method_len: usize, + amount: *const u32, + ); pub fn read_storage(key: *mut u32); pub fn write_storage(key: *mut u32, value: *const u32); pub fn get_balance(value: *mut u32); diff --git a/vm/sdk/Cargo.toml b/vm/sdk/Cargo.toml index 3c5b1a88..8b5509d1 100644 --- a/vm/sdk/Cargo.toml +++ b/vm/sdk/Cargo.toml @@ -13,4 +13,5 @@ athena-hostfunctions = { path = "../hostfunctions" } athena-interface = { path = "../../interface" } borsh = "1.5.1" borsh-derive = "1.5.1" +cfg-if = "1.0.0" serde = { version = "1.0", features = ["derive"] } diff --git a/vm/sdk/src/io.rs b/vm/sdk/src/io.rs new file mode 100644 index 00000000..cc13d591 --- /dev/null +++ b/vm/sdk/src/io.rs @@ -0,0 +1,15 @@ +use athena_interface::Address; +use athena_vm::helpers::{address_to_32bit_words, bytes32_to_32bit_words}; +use athena_vm::host; + +pub fn read_storage(key: [u8; 32]) -> [u8; 32] { + let mut key = bytes32_to_32bit_words(key); + unsafe { athena_vm::host::read_storage(key.as_mut_ptr()) }; + return key; +} + +pub fn write_storage(key: [u8; 32], value: [u8; 32]) { + let mut key = bytes32_to_32bit_words(key); + let value = bytes32_to_32bit_words(value); + unsafe { athena_vm::host::write_storage(key.as_mut_ptr(), value.as_mut_ptr()) }; +} diff --git a/vm/sdk/src/lib.rs b/vm/sdk/src/lib.rs index 95aa861b..41bb903c 100644 --- a/vm/sdk/src/lib.rs +++ b/vm/sdk/src/lib.rs @@ -1,21 +1,21 @@ use athena_interface::{Address, Bytes32, BYTES32_LENGTH}; use borsh_derive::{BorshDeserialize, BorshSerialize}; +use cfg_if::cfg_if; use serde::{Deserialize, Serialize}; -#[cfg(target_os = "zkvm")] -mod spawn; -#[cfg(target_os = "zkvm")] -pub use spawn::spawn; - -#[cfg(target_os = "zkvm")] -mod call; -#[cfg(target_os = "zkvm")] -pub use call::call; - -#[cfg(target_os = "zkvm")] -mod deploy; -#[cfg(target_os = "zkvm")] -pub use deploy::deploy; +cfg_if! { + if #[cfg(target_os = "zkvm")] { + mod spawn; + pub use spawn::spawn; + mod call; + pub use call::call; + mod deploy; + pub use deploy::deploy; + mod io; + pub use io::read; + pub use io::write; + } +} #[derive(Clone, Copy, Debug, Default, BorshDeserialize, BorshSerialize, Serialize, Deserialize)] pub struct Pubkey(pub Bytes32); From 113708378fdc576f7891d6b659ed7e70be3cd85d Mon Sep 17 00:00:00 2001 From: Lane Rettig Date: Thu, 3 Oct 2024 15:39:54 -0700 Subject: [PATCH 09/13] Finish the entrypoint test Fixed some bugs and did some cleanup --- core/src/syscall/host.rs | 2 +- runner/Cargo.toml | 1 + runner/src/vm.rs | 56 +++++++++++++++++++++++++-- tests/entrypoint/Cargo.toml | 10 ++++- tests/entrypoint/elf/entrypoint-test | Bin 0 -> 119804 bytes tests/entrypoint/src/main.rs | 25 ++++++------ vm/entrypoint/src/helpers/mod.rs | 4 ++ vm/lib/src/program.rs | 16 ++++++++ vm/sdk/src/call.rs | 6 +-- vm/sdk/src/io.rs | 9 ++--- vm/sdk/src/lib.rs | 4 +- 11 files changed, 102 insertions(+), 31 deletions(-) create mode 100755 tests/entrypoint/elf/entrypoint-test diff --git a/core/src/syscall/host.rs b/core/src/syscall/host.rs index f726869b..58b60519 100644 --- a/core/src/syscall/host.rs +++ b/core/src/syscall/host.rs @@ -136,7 +136,7 @@ impl Syscall for SyscallHostCall { None }; - let amount_ptr = ctx.rt.register(Register::X13); + let amount_ptr = ctx.rt.register(Register::X15); let amount = ctx.dword(amount_ptr); // note: host is responsible for checking balance and stack depth diff --git a/runner/Cargo.toml b/runner/Cargo.toml index ee8f7bad..b124a699 100644 --- a/runner/Cargo.toml +++ b/runner/Cargo.toml @@ -8,6 +8,7 @@ license.workspace = true edition.workspace = true [dependencies] +bincode = "1.3.3" athcon-sys = { path = "../ffi/athcon/bindings/rust/athcon-sys" } athcon-vm = { path = "../ffi/athcon/bindings/rust/athcon-vm" } athena-core = { path = "../core" } diff --git a/runner/src/vm.rs b/runner/src/vm.rs index 416aca1f..e2c1e796 100644 --- a/runner/src/vm.rs +++ b/runner/src/vm.rs @@ -137,11 +137,17 @@ mod tests { #[test] fn test_method_selector() { - let elf = include_bytes!("../../examples/wallet/program/elf/wallet-template"); + let elf = include_bytes!("../../tests/entrypoint/elf/entrypoint-test"); + + // deploy the contract to ADDRESS_ALICE and pass in the address so it can call itself recursively + let vm = AthenaVm::new(); + let mut host = MockHost::new_with_vm(&vm); + host.deploy_code(ADDRESS_ALICE, elf.to_vec()); + let input = bincode::serialize(&ADDRESS_ALICE).unwrap(); // this will execute from the default entry point let result = AthenaVm::new().execute( - &mut MockHost::new(), + &mut host, AthenaRevision::AthenaFrontier, AthenaMessage::new( MessageKind::Call, @@ -156,11 +162,32 @@ mod tests { ), elf, ); + // this should fail: in noentrypoint mode, this panics. + assert_eq!(result.status_code, StatusCode::Failure); + + // this will execute a specific method + let result = AthenaVm::new().execute( + &mut host, + AthenaRevision::AthenaFrontier, + AthenaMessage::new( + MessageKind::Call, + 0, + 1000000, + Address::default(), + Address::default(), + Some(input), + Some("athexp_test1".as_bytes().to_vec()), + Balance::default(), + vec![], + ), + elf, + ); + // this should succeed assert_eq!(result.status_code, StatusCode::Success); // this will execute a specific method let result = AthenaVm::new().execute( - &mut MockHost::new(), + &mut host, AthenaRevision::AthenaFrontier, AthenaMessage::new( MessageKind::Call, @@ -169,13 +196,34 @@ mod tests { Address::default(), Address::default(), None, - Some("athcon_send".as_bytes().to_vec()), + Some("athexp_test2".as_bytes().to_vec()), Balance::default(), vec![], ), elf, ); + // this should also succeed assert_eq!(result.status_code, StatusCode::Success); + + // this will execute a specific method + let result = AthenaVm::new().execute( + &mut host, + AthenaRevision::AthenaFrontier, + AthenaMessage::new( + MessageKind::Call, + 0, + 1000000, + Address::default(), + Address::default(), + None, + Some("athexp_test3".as_bytes().to_vec()), + Balance::default(), + vec![], + ), + elf, + ); + // this should fail, as this method is not `callable` + assert_eq!(result.status_code, StatusCode::Failure); } // Note: we run this test here, as opposed to at a lower level (inside the SDK), since recursive host calls diff --git a/tests/entrypoint/Cargo.toml b/tests/entrypoint/Cargo.toml index 8aa1065f..0e08d354 100644 --- a/tests/entrypoint/Cargo.toml +++ b/tests/entrypoint/Cargo.toml @@ -1,8 +1,14 @@ [workspace] [package] -name = "stack-depth-test" +name = "entrypoint-test" version = "0.1.0" edition = "2021" [dependencies] -athena-vm = { path = "../../vm/entrypoint", features = ["rv32e"] } +athena-vm = { path = "../../vm/entrypoint", features = [ + "noentrypoint", + "rv32e", +] } +athena-vm-declare = { path = "../../vm/declare" } +athena-vm-sdk = { path = "../../vm/sdk" } +bincode = "1.3.3" diff --git a/tests/entrypoint/elf/entrypoint-test b/tests/entrypoint/elf/entrypoint-test new file mode 100755 index 0000000000000000000000000000000000000000..45554e17f052e1433671e95045d54f5634f6d4ad GIT binary patch literal 119804 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 b&j%g%TF>QR{Bq9E(mi?DaUW0r5E|WYqkV4g literal 0 HcmV?d00001 diff --git a/tests/entrypoint/src/main.rs b/tests/entrypoint/src/main.rs index 6ece5911..1c911297 100644 --- a/tests/entrypoint/src/main.rs +++ b/tests/entrypoint/src/main.rs @@ -1,21 +1,8 @@ #![no_main] -athena_vm::entrypoint!(main); - -use athena_vm::helpers::address_to_32bit_words; -use athena_vm::types::ADDRESS_ALICE; use athena_vm_declare::{callable, template}; use athena_vm_sdk::call; -// Note: the test harness installs this contract code at ADDRESS_ALICE - -pub fn main() { - // recurse forever - let address = address_to_32bit_words(ADDRESS_ALICE); - let value: [u32; 2] = [0, 0]; - unsafe { athena_vm::host::call(address.as_ptr(), std::ptr::null(), 0, value.as_ptr()) }; -} - -pub struct EntrypointTest {}; +pub struct EntrypointTest {} #[cfg(all( any(target_arch = "riscv32", target_arch = "riscv64"), @@ -25,12 +12,22 @@ pub struct EntrypointTest {}; impl EntrypointTest { #[callable] fn test1() { + let input = athena_vm::io::read_vec(); + let address = + bincode::deserialize(&input).expect("input address malformed, failed to deserialize"); + let method = "athexp_test2".as_bytes().to_vec(); + + // recursive call to self + call(address, None, Some(method), 0); } #[callable] fn test2() { + // no-op } + #[allow(dead_code)] fn test3() { + // no-op } } diff --git a/vm/entrypoint/src/helpers/mod.rs b/vm/entrypoint/src/helpers/mod.rs index 364722db..6da895e0 100644 --- a/vm/entrypoint/src/helpers/mod.rs +++ b/vm/entrypoint/src/helpers/mod.rs @@ -18,3 +18,7 @@ pub fn balance_to_32bit_words(balance: Balance) -> [u32; 2] { pub fn bytes32_to_32bit_words(bytes32: Bytes32) -> [u32; 8] { cast::<[u8; 32], [u32; 8]>(bytes32) } + +pub fn words_to_bytes32(words: [u32; 8]) -> Bytes32 { + cast::<[u32; 8], [u8; 32]>(words) +} diff --git a/vm/lib/src/program.rs b/vm/lib/src/program.rs index 12eb5e96..3b795e5f 100644 --- a/vm/lib/src/program.rs +++ b/vm/lib/src/program.rs @@ -54,6 +54,22 @@ where } } +/// Implement Function for functions taking no arguments: +/// # Example: +/// ```ignore +///fn foo() -> impl IntoResult +/// ``` +impl Function<(), R, IO> for F +where + IO: Read + Write, + F: Fn() -> R, + R: IntoResult, +{ + fn call_func(self, io: &mut IO) { + self().into_result(io); + } +} + /// Implement Function for functions taking 1 argument: /// # Example: /// ```ignore diff --git a/vm/sdk/src/call.rs b/vm/sdk/src/call.rs index 5818167f..a1f20239 100644 --- a/vm/sdk/src/call.rs +++ b/vm/sdk/src/call.rs @@ -24,14 +24,14 @@ pub fn call(address: Address, input: Option>, method: Option>, a }; let (method_name, method_name_len) = - method32.map_or((std::ptr::null(), 0), |(v, l)| (v.as_ptr(), l)); + method32.map_or((std::ptr::null(), 0), |(v, _)| (v.as_ptr(), v.len() * 4)); athena_vm::syscalls::call( address.as_ptr(), input, input_len, - method, - method_len, + method_name, + method_name_len, amount.as_ptr(), ); } diff --git a/vm/sdk/src/io.rs b/vm/sdk/src/io.rs index cc13d591..f0a5c54d 100644 --- a/vm/sdk/src/io.rs +++ b/vm/sdk/src/io.rs @@ -1,15 +1,14 @@ -use athena_interface::Address; -use athena_vm::helpers::{address_to_32bit_words, bytes32_to_32bit_words}; +use athena_vm::helpers::{bytes32_to_32bit_words, words_to_bytes32}; use athena_vm::host; pub fn read_storage(key: [u8; 32]) -> [u8; 32] { let mut key = bytes32_to_32bit_words(key); - unsafe { athena_vm::host::read_storage(key.as_mut_ptr()) }; - return key; + unsafe { host::read_storage(key.as_mut_ptr()) }; + return words_to_bytes32(key); } pub fn write_storage(key: [u8; 32], value: [u8; 32]) { let mut key = bytes32_to_32bit_words(key); let value = bytes32_to_32bit_words(value); - unsafe { athena_vm::host::write_storage(key.as_mut_ptr(), value.as_mut_ptr()) }; + unsafe { host::write_storage(key.as_mut_ptr(), value.as_ptr()) }; } diff --git a/vm/sdk/src/lib.rs b/vm/sdk/src/lib.rs index 41bb903c..bf4966b9 100644 --- a/vm/sdk/src/lib.rs +++ b/vm/sdk/src/lib.rs @@ -12,8 +12,8 @@ cfg_if! { mod deploy; pub use deploy::deploy; mod io; - pub use io::read; - pub use io::write; + pub use io::read_storage; + pub use io::write_storage; } } From 773485e1c7cc7e3fe65c59818dff6878f5e47e6f Mon Sep 17 00:00:00 2001 From: Lane Rettig Date: Thu, 3 Oct 2024 15:50:10 -0700 Subject: [PATCH 10/13] Update wallet usage of call host call --- examples/wallet/program/elf/wallet-template | Bin 122280 -> 122456 bytes examples/wallet/program/src/main.rs | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/wallet/program/elf/wallet-template b/examples/wallet/program/elf/wallet-template index 7a60afbb60e787eb7470af96ef981eb6b4c68abf..b48a76af36e8b216ffbc9cf23bc76de4091dbbaf 100755 GIT binary patch delta 37444 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 delta 37275 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 Ybo+~zm2z~5#`dknWxSbi2f;}H2ULQ^?EnA( diff --git a/examples/wallet/program/src/main.rs b/examples/wallet/program/src/main.rs index 54731211..f95cedf3 100644 --- a/examples/wallet/program/src/main.rs +++ b/examples/wallet/program/src/main.rs @@ -44,7 +44,7 @@ impl WalletProgram for Wallet { fn send(&self, send_arguments: SendArguments) { // Send coins // Note: error checking happens inside the host - call(send_arguments.recipient, None, send_arguments.amount); + call(send_arguments.recipient, None, None, send_arguments.amount); } fn proxy(&self, _destination: Address, _args: &[u8]) { From 74b036a67ad5e4823f082b25fbafff102a7f4cbb Mon Sep 17 00:00:00 2001 From: Lane Rettig Date: Thu, 3 Oct 2024 15:57:18 -0700 Subject: [PATCH 11/13] Update tests --- core/src/runtime/mod.rs | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/core/src/runtime/mod.rs b/core/src/runtime/mod.rs index fb742e4b..adb9d8db 100644 --- a/core/src/runtime/mod.rs +++ b/core/src/runtime/mod.rs @@ -889,7 +889,7 @@ pub mod tests { .symbol_table .get("athexp_spawn") .unwrap(), - &2103440 + &2103464 ); assert_eq!( runtime @@ -898,7 +898,7 @@ pub mod tests { .symbol_table .get("athexp_send") .unwrap(), - &2103492 + &2103516 ); // now attempt to execute each function in turn @@ -1115,8 +1115,18 @@ pub mod tests { Instruction::new(Opcode::ADD, Register::X12 as u32, 0, 0, false, true), ); instructions.push( - // X13 is arg4 (value ptr) - Instruction::new(Opcode::ADD, Register::X13 as u32, 0, memloc2, false, true), + // X13 is arg4 (ptr to method name) + // zero pointer + Instruction::new(Opcode::ADD, Register::X13 as u32, 0, 0, false, true), + ); + instructions.push( + // X14 is arg5 (method name len) + // no input + Instruction::new(Opcode::ADD, Register::X14 as u32, 0, 0, false, true), + ); + instructions.push( + // X15 is arg6 (value ptr) + Instruction::new(Opcode::ADD, Register::X15 as u32, 0, memloc2, false, true), ); instructions.push( // X5 is syscall ID From e18b3725e1ccef88877bd8bd4db7afa128c27002 Mon Sep 17 00:00:00 2001 From: Lane Rettig Date: Fri, 4 Oct 2024 09:43:28 -0700 Subject: [PATCH 12/13] Update ffi/athcon/bindings/rust/athcon-client/src/host.rs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Bartosz Różański --- ffi/athcon/bindings/rust/athcon-client/src/host.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ffi/athcon/bindings/rust/athcon-client/src/host.rs b/ffi/athcon/bindings/rust/athcon-client/src/host.rs index 1754c6f7..80799c82 100644 --- a/ffi/athcon/bindings/rust/athcon-client/src/host.rs +++ b/ffi/athcon/bindings/rust/athcon-client/src/host.rs @@ -168,7 +168,7 @@ pub unsafe extern "C" fn call( &[] }, if !msg.method_name.is_null() && msg.method_name_size > 0 { - std::slice::from_raw_parts(msg.input_data, msg.input_size) + std::slice::from_raw_parts(msg.method_name, msg.method_name_size) } else { &[] }, From d19e7ceb2714b9ea40c891e441f47e94881e3db9 Mon Sep 17 00:00:00 2001 From: Lane Rettig Date: Fri, 4 Oct 2024 09:49:43 -0700 Subject: [PATCH 13/13] Update go bindings --- ffi/athcon/bindings/go/athcon.go | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/ffi/athcon/bindings/go/athcon.go b/ffi/athcon/bindings/go/athcon.go index 4303ad51..e76b7043 100644 --- a/ffi/athcon/bindings/go/athcon.go +++ b/ffi/athcon/bindings/go/athcon.go @@ -197,15 +197,9 @@ func (vm *VM) Execute( } if len(method) > 0 { // Allocate memory for method name in C. - cMethodName := C.malloc(C.size_t(len(input))) - if cMethodName == nil { - return res, fmt.Errorf("failed to allocate memory for method name") - } + cMethodName := C.CBytes(method) defer C.free(cMethodName) - - cSlice := unsafe.Slice((*byte)(cMethodName), len(method)) - copy(cSlice, method) - msg.method_name = (*C.uchar)(unsafe.Pointer(&cSlice[0])) + msg.method_name = (*C.uchar)(cMethodName) msg.method_name_size = C.size_t(len(method)) }