Decentralised Art Server
High-performance C++ backend that exposes HTML interface and a secure REST API for managing Performative Transactions entities
 
Loading...
Searching...
No Matches
evm.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <array>
4#include <string>
5#include <cstring>
6#include <filesystem>
7#include <vector>
8#include <expected>
9#include <fstream>
10#include <istream>
11
12// Undefine the conflicting macro
13#ifdef interface
14 #undef interface
15#endif
16
17#include <evmc/evmc.h>
18#include <evmc/evmc.hpp>
19#include <evmc/mocked_host.hpp>
20
21#include <evmc/hex.hpp>
22
23#include <evmone/evmone.h>
24
25#ifndef interface
26 #define interface __STRUCT__
27#endif
28
29#include "native.h"
30#include <asio.hpp>
31#include <spdlog/spdlog.h>
32#include <absl/container/flat_hash_map.h>
33
34#include "utils.hpp"
35#include "file.hpp"
36#include "keccak256.hpp"
37#include "pt.hpp"
38
39#include "evm_storage.hpp"
40#include "evm_formatter.hpp"
41
42namespace dcn
43{
44 class EVM
45 {
46 public:
47 EVM(asio::io_context & io_context, evmc_revision rev, std::filesystem::path solc_path);
48 ~EVM() = default;
49
50 EVM(const EVM&) = delete;
51 EVM& operator=(const EVM&) = delete;
52
53 EVM(EVM&&) = delete;
54 EVM& operator=(EVM&&) = delete;
55
56 asio::awaitable<bool> addAccount(evmc::address address, std::uint64_t initial_gas) noexcept;
57 asio::awaitable<bool> setGas(evmc::address address, std::uint64_t gas) noexcept;
58
59 asio::awaitable<bool> compile(std::filesystem::path code_path,
60 std::filesystem::path out_dir,
61 std::filesystem::path base_path = {},
62 std::filesystem::path includes = {}) const noexcept;
63
64 asio::awaitable<std::expected<evmc::address, evmc_status_code>> deploy(
65 std::istream & code_stream,
66 evmc::address sender,
67 std::vector<std::uint8_t> constructor_args,
68 std::uint64_t gas_limit,
69 std::uint64_t value) noexcept;
70
71 asio::awaitable<std::expected<evmc::address, evmc_status_code>> deploy(
72 std::filesystem::path code_path,
73 evmc::address sender,
74 std::vector<uint8_t> constructor_args,
75 std::uint64_t gas_limit,
76 std::uint64_t value) noexcept;
77
78 asio::awaitable<std::expected<std::vector<std::uint8_t>, evmc_status_code>> execute(
79 evmc::address sender,
80 evmc::address recipient,
81 std::vector<std::uint8_t> input_bytes,
82 std::uint64_t gas_limit,
83 std::uint64_t value) noexcept;
84
85 evmc::address getRegistryAddress() const;
86 evmc::address getRunnerAddress() const;
87
88 protected:
89 asio::awaitable<bool> loadPT();
90
91 private:
92 asio::strand<asio::io_context::executor_type> _strand;
93
94 evmc::VM _vm;
95 evmc_revision _rev;
96
97 std::filesystem::path _solc_path;
98
99 EVMStorage _storage;
100
101 evmc::address _genesis_address;
102 evmc::address _console_log_address;
103
104 evmc::address _registry_address;
105 evmc::address _runner_address;
106 };
107 asio::awaitable<std::expected<std::vector<std::uint8_t>, evmc_status_code>> fetchOwner(EVM & evm, const evmc::address & address);
108
109 std::vector<std::uint8_t> constructFunctionSelector(std::string signature);
110
111 template<class T>
112 std::vector<std::uint8_t> encodeAsArg(const T & val);
113
114 template<>
115 std::vector<std::uint8_t> encodeAsArg<evmc::address>(const evmc::address & address);
116
117 template<>
118 std::vector<std::uint8_t> encodeAsArg<std::uint32_t>(const std::uint32_t & value);
119
120 template<>
121 std::vector<std::uint8_t> encodeAsArg<std::vector<std::uint32_t>>(const std::vector<std::uint32_t> & vec);
122
123 template<>
124 std::vector<std::uint8_t> encodeAsArg<std::vector<std::tuple<std::uint32_t, std::uint32_t>>>(const std::vector<std::tuple<std::uint32_t, std::uint32_t>>& vec);
125
126 template<>
127 std::vector<std::uint8_t> encodeAsArg<std::string>(const std::string& str);
128
129
130 template<class T>
131 T decodeReturnedValue(const std::vector<std::uint8_t> & bytes);
132
133
134 template<>
135 std::vector<std::vector<std::uint32_t>> decodeReturnedValue(const std::vector<std::uint8_t> & bytes);
136
137 template<>
138 evmc::address decodeReturnedValue(const std::vector<std::uint8_t> & bytes);
139
140 template<>
141 std::vector<Samples> decodeReturnedValue(const std::vector<uint8_t> & bytes);
142}
Definition evm.hpp:45
asio::awaitable< bool > setGas(evmc::address address, std::uint64_t gas) noexcept
Definition evm.cpp:330
asio::awaitable< std::expected< std::vector< std::uint8_t >, evmc_status_code > > execute(evmc::address sender, evmc::address recipient, std::vector< std::uint8_t > input_bytes, std::uint64_t gas_limit, std::uint64_t value) noexcept
Definition evm.cpp:481
EVM(EVM &&)=delete
EVM(const EVM &)=delete
asio::awaitable< std::expected< evmc::address, evmc_status_code > > deploy(std::istream &code_stream, evmc::address sender, std::vector< std::uint8_t > constructor_args, std::uint64_t gas_limit, std::uint64_t value) noexcept
Definition evm.cpp:392
asio::awaitable< bool > addAccount(evmc::address address, std::uint64_t initial_gas) noexcept
Definition evm.cpp:308
evmc::address getRegistryAddress() const
Definition evm.cpp:298
evmc::address getRunnerAddress() const
Definition evm.cpp:303
EVM & operator=(EVM &&)=delete
asio::awaitable< bool > loadPT()
Definition evm.cpp:535
asio::awaitable< bool > compile(std::filesystem::path code_path, std::filesystem::path out_dir, std::filesystem::path base_path={}, std::filesystem::path includes={}) const noexcept
Definition evm.cpp:344
~EVM()=default
EVM & operator=(const EVM &)=delete
Definition decentralised_art.hpp:30
asio::awaitable< std::expected< std::vector< std::uint8_t >, evmc_status_code > > fetchOwner(EVM &evm, const evmc::address &address)
Definition evm.cpp:264
std::vector< std::uint8_t > encodeAsArg(const T &val)
T decodeReturnedValue(const std::vector< std::uint8_t > &bytes)
std::vector< std::uint8_t > encodeAsArg< std::string >(const std::string &str)
Definition evm.cpp:104
std::vector< std::uint8_t > constructFunctionSelector(std::string signature)
Definition evm.cpp:5
std::vector< std::uint8_t > encodeAsArg< evmc::address >(const evmc::address &address)
Definition evm.cpp:13
std::vector< std::uint8_t > encodeAsArg< std::uint32_t >(const std::uint32_t &value)
Definition evm.cpp:21