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_storage.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <string>
4#include <cstring>
5#include <vector>
6#include <format>
7#include <stack>
8
9// Undefine the conflicting macro
10#ifdef interface
11 #undef interface
12#endif
13
14#include <evmc/evmc.h>
15#include <evmc/evmc.hpp>
16#include <evmc/hex.hpp>
17
18#ifndef interface
19 #define interface __STRUCT__
20#endif
21
22#include "native.h"
23#include <asio.hpp>
24#include <spdlog/spdlog.h>
25#include <absl/container/flat_hash_map.h>
26
27#include "utils.hpp"
28#include "keccak256.hpp"
29
30#include "evm_formatter.hpp"
31
32namespace dcn
33{
34 class EVMStorage : public evmc::Host
35 {
36 public:
37 struct Account
38 {
40 std::vector<std::uint8_t> code;
41 absl::flat_hash_map<evmc::bytes32, evmc::bytes32> storage;
42
43 // Deployment metadata
44 evmc::address creator{};
47 };
48
49 EVMStorage(evmc::VM & vm, evmc_revision rev);
50
51 bool add_account(const evmc::address& addr)
52 {
53 if(account_exists(addr) == true)
54 {
55 spdlog::error(std::format("add_account: Account {} already exists", addr));
56 return false;
57 }
58 _accounts.emplace(to_key(addr), Account{});
59 return true;
60 }
61
62 void set_balance(const evmc::address& addr, std::uint64_t x) noexcept
63 {
64 if(account_exists(addr) == false)
65 {
66 spdlog::error(std::format("set_balance : Account {} does not exist", addr));
67 return;
68 }
69 Account & acc = _accounts.at(to_key(addr));
70
71 acc.balance = evmc::uint256be{};
72 for (std::size_t i = 0; i < sizeof(x); ++i)
73 acc.balance.bytes[sizeof(acc.balance) - 1 - i] = static_cast<uint8_t>(x >> (8 * i));
74 }
75
76 bool account_exists(const evmc::address& addr) const noexcept override;
77
78 evmc::bytes32 get_storage(const evmc::address& addr, const evmc::bytes32& key) const noexcept override;
79
80 evmc_storage_status set_storage(const evmc::address& address, const evmc::bytes32& key, const evmc::bytes32& value) noexcept override;
81
82 evmc::uint256be get_balance(const evmc::address& addr) const noexcept override;
83
84 std::size_t get_code_size(const evmc::address& addr) const noexcept override;
85
86 evmc::bytes32 get_code_hash(const evmc::address& addr) const noexcept override;
87
88 std::size_t copy_code(const evmc::address& addr,
89 std::size_t code_offset,
90 std::uint8_t* buffer_data,
91 std::size_t buffer_size) const noexcept override;
92
93 bool selfdestruct(const evmc::address& addr, const evmc::address& beneficiary) noexcept override;
94
95 evmc::Result call(const evmc_message& msg) noexcept override;
96
98
100 void emit_log(const evmc::address& addr,
101 const std::uint8_t* data,
102 size_t data_size,
103 const evmc::bytes32 topics[],
105
107
109
112
114 const evmc::bytes32& key,
115 const evmc::bytes32& value) noexcept override;
116
117 protected:
118 std::string to_key(const evmc::address& addr) const;
119
121
123
124 void deploy_contract(evmc::address addr, std::vector<std::uint8_t>&& code, evmc_uint256be value, evmc::address creator, std::uint64_t nonce);
125
126 private:
127 evmc::VM & _vm;
128 evmc_revision _revision;
129
130 absl::flat_hash_map<std::string, Account> _accounts;
131 absl::flat_hash_map<evmc::address, std::uint64_t> _create_nonce;
132
133 std::stack<evmc::address> _sender_stack;
134 };
135
138 {
139 return H::combine(std::move(h), addr.bytes);
140 }
141}
142
Definition evm_storage.hpp:35
evmc_address derive_create2_address(const evmc::address &sender, const evmc::bytes32 &salt, const std::vector< std::uint8_t > &code)
Definition evm_storage.cpp:328
std::size_t get_code_size(const evmc::address &addr) const noexcept override
Definition evm_storage.cpp:48
std::string to_key(const evmc::address &addr) const
Definition evm_storage.cpp:309
bool add_account(const evmc::address &addr)
Definition evm_storage.hpp:51
void set_transient_storage(const evmc::address &addr, const evmc::bytes32 &key, const evmc::bytes32 &value) noexcept override
Definition evm_storage.cpp:300
bool account_exists(const evmc::address &addr) const noexcept override
Definition evm_storage.cpp:11
evmc::bytes32 get_code_hash(const evmc::address &addr) const noexcept override
Definition evm_storage.cpp:54
std::size_t copy_code(const evmc::address &addr, std::size_t code_offset, std::uint8_t *buffer_data, std::size_t buffer_size) const noexcept override
Definition evm_storage.cpp:68
evmc_storage_status set_storage(const evmc::address &address, const evmc::bytes32 &key, const evmc::bytes32 &value) noexcept override
Definition evm_storage.cpp:30
evmc_tx_context get_tx_context() const noexcept override
Definition evm_storage.cpp:189
evmc::bytes32 get_storage(const evmc::address &addr, const evmc::bytes32 &key) const noexcept override
Definition evm_storage.cpp:18
evmc::Result call(const evmc_message &msg) noexcept override
Definition evm_storage.cpp:98
evmc_access_status access_account(const evmc::address &addr) noexcept override
Definition evm_storage.cpp:277
void emit_log(const evmc::address &addr, const std::uint8_t *data, size_t data_size, const evmc::bytes32 topics[], size_t num_topics) noexcept override
Definition evm_storage.cpp:248
void set_balance(const evmc::address &addr, std::uint64_t x) noexcept
Definition evm_storage.hpp:62
evmc_address derive_create_address(const evmc::address &sender, std::uint64_t nonce)
Definition evm_storage.cpp:314
evmc::bytes32 get_transient_storage(const evmc::address &addr, const evmc::bytes32 &key) const noexcept override
Definition evm_storage.cpp:291
bool selfdestruct(const evmc::address &addr, const evmc::address &beneficiary) noexcept override
Definition evm_storage.cpp:85
evmc::bytes32 get_block_hash(int64_t block_number) const noexcept override
Definition evm_storage.cpp:227
evmc::uint256be get_balance(const evmc::address &addr) const noexcept override
Definition evm_storage.cpp:37
void deploy_contract(evmc::address addr, std::vector< std::uint8_t > &&code, evmc_uint256be value, evmc::address creator, std::uint64_t nonce)
Definition evm_storage.cpp:349
evmc_access_status access_storage(const evmc::address &addr, const evmc::bytes32 &key) noexcept override
Definition evm_storage.cpp:284
Definition decentralised_art.hpp:30
H AbslHashValue(H h, const evmc::address &addr)
Definition evm_storage.hpp:137
Definition evm_storage.hpp:38
uint64_t timestamp
Definition evm_storage.hpp:46
absl::flat_hash_map< evmc::bytes32, evmc::bytes32 > storage
Definition evm_storage.hpp:41
uint64_t nonce
Definition evm_storage.hpp:45
std::vector< std::uint8_t > code
Definition evm_storage.hpp:40
evmc::address creator
Definition evm_storage.hpp:44
evmc_uint256be balance
Definition evm_storage.hpp:39