Evm
為什麼 RETURN 使用的記憶體與分配方式相比未對齊?
我正在嘗試使用 evmone 和 evmc 在 EVM 上執行一些簡單的彙編程式碼片段。
0x42
我寫了一個應該作為輸出數據返回的測試。程式碼如下:PUSH 0x42 PUSH 0x70 MSTORE PUSH 0x01 PUSH 0x70 RETURN
但是,此程式碼返回
0
,我不明白。我對周圍的記憶體進行了更多掃描,發現如果我將查找位置固定為0x8f
然後它0x42
按預期返回:PUSH 0x42 PUSH 0x70 MSTORE PUSH 0x01 PUSH 0x8f RETURN
這裡發生了什麼?
我的測試程式碼:
#include <evmc/evmc.hpp> #include <evmc/loader.h> #include <evmone/evmone.h> #include <iostream> #include <vector> const evmc_revision REVISION = EVMC_SHANGHAI; uint8_t parse_byte(char c) { if(c >= 'a' && c <= 'f') { return c - 'a' + 10; } if(c >= 'A' && c <= 'F') { return c - 'A' + 10; } return c - '0'; } std::vector<uint8_t> parse_bytes(std::string in) { std::vector<uint8_t> out; for(int i = 0; i + 1 < in.size(); i += 2) { uint8_t x = parse_byte(in[i]) * 0x10 + parse_byte(in[i + 1]); out.push_back(x); } return out; } int main(int argc, char** argv) { std::vector<uint8_t> code = parse_bytes("60426070526001608ff3"); // EVM code in hex auto vm = evmc::VM{evmc_create_evmone()}; auto msg = evmc_message{}; auto dst = evmc_address{}; dst.bytes[19] = 0xaa; auto val = evmc_uint256be{}; msg.kind = EVMC_CALL; msg.flags = int32_t{EVMC_STATIC}; msg.recipient = dst; msg.code_address = dst; msg.sender = dst; msg.value = val; msg.gas = 10000; auto res = vm.execute(REVISION, msg, code.data(), code.size()); std::cout << "OUTPUT: "; for(int i = 0; i < res.output_size; ++i) { std::cout << std::hex << int(res.output_data[i]); } std::cout << std::endl; }
因為
0x42
被解釋為整數,所以它在記憶體中儲存為0x0000.....0042
.如果你想退貨
0x42
,你必須儲存PUSH 0x4200...0000 // so the first byte is 0x42 an the rest are zeros PUSH 0x70 MSTORE