OpenCBDC Transaction Processor
Loading...
Searching...
No Matches
rlp.hpp
Go to the documentation of this file.
1// Copyright (c) 2022 MIT Digital Currency Initiative,
2// Federal Reserve Bank of Boston
3// Distributed under the MIT software license, see the accompanying
4// file COPYING or http://www.opensource.org/licenses/mit-license.php.
5
6#ifndef OPENCBDC_TX_SRC_PARSEC_AGENT_RUNNERS_EVM_RLP_H_
7#define OPENCBDC_TX_SRC_PARSEC_AGENT_RUNNERS_EVM_RLP_H_
8
9#include "format.hpp"
15
16#include <evmc/evmc.hpp>
17#include <optional>
18#include <vector>
19
20namespace cbdc {
22 enum class rlp_value_type {
24 array,
26 buffer,
27 };
28
32 class rlp_value {
33 public:
35 rlp_value();
36
40
44 explicit rlp_value(const buffer& data);
45
50 void assign(const buffer& data);
51
56 auto push_back(const rlp_value& val) -> bool;
57
61 void write_to(serializer& ser) const;
62
66 void read_from(serializer& ser);
67
72 [[nodiscard]] auto value_at(size_t idx) const -> rlp_value;
73
78 [[nodiscard]] auto size() const -> size_t;
79
82 [[nodiscard]] auto type() const -> rlp_value_type;
83
87 [[nodiscard]] auto data() const -> const void*;
88
92 template<typename T>
93 [[nodiscard]] auto value() const -> typename std::enable_if_t<
94 std::is_same<T, evmc::bytes32>::value
95 || std::is_same<T, evmc::address>::value,
96 T> {
97 auto res = T();
98 auto buf = cbdc::buffer();
99 buf.extend(sizeof(res.bytes));
100 std::memcpy(buf.data_at(sizeof(res.bytes) - m_buffer.size()),
101 m_buffer.data(),
102 m_buffer.size());
103 std::memcpy(&res.bytes, buf.data(), buf.size());
104 return res;
105 }
106
107 private:
108 void write_array_to(serializer& ser) const;
109 void write_buffer_to(serializer& ser) const;
110 void read_buffer_from(serializer& ser, size_t size);
111 void read_array_from(serializer& ser, size_t size);
112
113 buffer m_buffer{};
114 std::vector<rlp_value> m_values{};
115 rlp_value_type m_type{};
116 };
117
125 template<typename T>
126 auto make_rlp_value(const T& obj, bool trim_leading_zeroes = false)
127 -> rlp_value {
128 auto pkt = make_buffer(obj);
129 if(trim_leading_zeroes) {
130 size_t start_idx = 0;
131 std::byte b{};
132 auto sz = pkt.size();
133 while(start_idx < sz) {
134 std::memcpy(&b, pkt.data_at(start_idx), 1);
135 if(b != std::byte(0)) {
136 break;
137 }
138 start_idx++;
139 }
140
141 auto buf = cbdc::buffer();
142 buf.extend(sz - start_idx);
143 std::memcpy(buf.data(), pkt.data_at(start_idx), buf.size());
144 return rlp_value(buf);
145 }
146 return rlp_value(pkt);
147 }
148
152 template<typename... Args>
153 auto make_rlp_array(const Args&... values) -> rlp_value {
154 std::vector<rlp_value> vec = {values...};
156 for(const auto& v : vec) {
157 val.push_back(v);
158 }
159 return val;
160 }
161
168 void
169 serialize_rlp_length(serializer& ser, size_t len, unsigned char offset);
170
175 auto serialize_size(size_t size) -> std::vector<std::byte>;
176
182 -> rlp_value;
183
187 auto rlp_decode_access_list(const rlp_value& rlp)
188 -> std::optional<parsec::agent::runner::evm_access_list>;
189
194 auto deserialize_size(const cbdc::buffer& buf) -> size_t;
195
196 auto operator<<(serializer& ser, const rlp_value& v) -> serializer&;
197
198 auto operator>>(serializer& ser, cbdc::rlp_value& v) -> serializer&;
199}
200
201#endif // OPENCBDC_TX_SRC_PARSEC_AGENT_RUNNERS_EVM_RLP_H_
Buffer to store and retrieve byte data.
Definition buffer.hpp:15
auto data() -> void *
Returns a raw pointer to the start of the buffer data.
Definition buffer.cpp:28
auto size() const -> size_t
Returns the number of bytes contained in the buffer.
Definition buffer.cpp:24
This class contains a value that can be serialized into, or was deserialized from,...
Definition rlp.hpp:32
void assign(const buffer &data)
Assigns the given data to the internal buffer of this rlp_value can only be used for rlp_value instan...
Definition rlp.cpp:14
auto type() const -> rlp_value_type
Get the type of rlp_value.
Definition rlp.cpp:42
void write_to(serializer &ser) const
Serializes the rlp_value in RLP representation into the passed serializer.
auto value_at(size_t idx) const -> rlp_value
Returns the rlp_value at the given index for RLP values of type rlp_value_type::array.
Definition rlp.cpp:27
auto push_back(const rlp_value &val) -> bool
Pushes an rlp_value into an rlp_value of type rlp_value_type::array You can push both rlp_value_type:...
Definition rlp.cpp:19
auto value() const -> typename std::enable_if_t< std::is_same< T, evmc::bytes32 >::value||std::is_same< T, evmc::address >::value, T >
Return RLP value as address or byte array.
Definition rlp.hpp:93
auto data() const -> const void *
Returns a raw pointer to the start of the buffer data for rlp_value of type rlp_buffer.
Definition rlp.cpp:31
auto size() const -> size_t
Get the size of the rlp_value.
Definition rlp.cpp:35
rlp_value()
Default constructor. Sets m_type to rlp_value_type::buffer.
Definition rlp.cpp:9
void read_from(serializer &ser)
Deserializes the rlp_value in RLP representation from the passed serializer into the current rlp_valu...
Interface for serializing objects into and out of raw bytes representations.
std::vector< evm_access_tuple > evm_access_list
Type alias for a list of storage key accesses.
auto rlp_decode_access_list(const rlp_value &rlp) -> std::optional< parsec::agent::runner::evm_access_list >
Decodes an access list from and rlp_value of type rlp_value_type::array.
auto serialize_size(size_t size) -> std::vector< std::byte >
Creates a binary representation for sizes that exceed the single-byte presentation.
auto rlp_encode_access_list(const parsec::agent::runner::evm_access_list &access_list) -> rlp_value
RLP encodes an access list.
auto make_rlp_value(const T &obj, bool trim_leading_zeroes=false) -> rlp_value
Turns an existing value into an rlp_value by first serializing it as a cbdc::buffer,...
Definition rlp.hpp:126
auto operator>>(serializer &deser, parsec::agent::rpc::request &req) -> serializer &
rlp_value_type
Possible types for an RLP value.
Definition rlp.hpp:22
@ buffer
A singular RLP value (byte array)
@ array
A collection of RLP values.
void serialize_rlp_length(serializer &ser, size_t len, unsigned char offset)
Serializes the passed len from the given offset as RLP compatible size representation as documented i...
auto deserialize_size(const cbdc::buffer &buf) -> size_t
Decodes a binary representation for sizes that exceed the single-byte presentation into size_t.
auto make_buffer(const T &obj) -> std::enable_if_t< std::is_same_v< B, nuraft::ptr< nuraft::buffer > >, nuraft::ptr< nuraft::buffer > >
Serialize object into nuraft::buffer using a cbdc::nuraft_serializer.
auto operator<<(serializer &ser, const parsec::agent::rpc::request &req) -> serializer &
auto make_rlp_array(const Args &... values) -> rlp_value
Turns multiple rlp_value objects into an rlp_value of type array.
Definition rlp.hpp:153