Evm

為什麼 RETURN 使用的記憶體與分配方式相比未對齊?

  • November 6, 2022

我正在嘗試使用 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

引用自:https://ethereum.stackexchange.com/questions/138881