OpenCBDC Transaction Processor
Loading...
Searching...
No Matches
rlp_writer.cpp
Go to the documentation of this file.
1#include "rlp.hpp"
2
3namespace cbdc {
4
6 v.write_to(ser);
7 return ser;
8 }
9
11 if(this->m_type == rlp_value_type::buffer) {
12 this->write_buffer_to(ser);
13 } else {
14 this->write_array_to(ser);
15 }
16 }
17
18 void rlp_value::write_array_to(serializer& ser) const {
19 auto buf = cbdc::buffer();
20 auto inner_ser = cbdc::buffer_serializer(buf);
21 for(const auto& val : this->m_values) {
22 inner_ser << val;
23 }
24 static constexpr unsigned char array_size_offset = 0xc0;
25 serialize_rlp_length(ser, buf.size(), array_size_offset);
26 ser.write(buf.data(), buf.size());
27 }
28
29 void rlp_value::write_buffer_to(serializer& ser) const {
30 static constexpr unsigned char max_single_byte_value = 0x80;
31
32 if(this->m_buffer.size() == 1) {
33 std::byte b{};
34 std::memcpy(&b, this->m_buffer.data_at(0), 1);
35 if(b < std::byte(max_single_byte_value)) {
36 ser << b;
37 return;
38 }
39 }
41 this->m_buffer.size(),
42 max_single_byte_value);
43 ser.write(this->m_buffer.data(), this->m_buffer.size());
44 }
45
46 void
47 serialize_rlp_length(serializer& ser, size_t len, unsigned char offset) {
48 static constexpr size_t max_onebyte_length = 55;
49 if(len <= max_onebyte_length) {
50 ser << static_cast<unsigned char>(len + offset);
51 return;
52 }
53 assert(len < (std::numeric_limits<size_t>::max() - offset));
54 auto len_ser = serialize_size(len);
55 ser << std::byte(static_cast<unsigned char>(
56 len_ser.size() + max_onebyte_length + offset));
57
58 for(auto b : len_ser) {
59 ser << b;
60 }
61 }
62
63 auto serialize_size(size_t size) -> std::vector<std::byte> {
64 if(size == 0) {
65 return {};
66 }
67 auto buf = make_buffer(size);
68
69 // Trim zeroes
70 auto sz = buf.size();
71 std::byte b{};
72 size_t end_idx = sz;
73 auto vec = std::vector<std::byte>();
74 while(end_idx > 0) {
75 end_idx--;
76 std::memcpy(&b, buf.data_at(end_idx), 1);
77 if(b != std::byte(0) || !vec.empty()) {
78 vec.push_back(b);
79 }
80 }
81
82 return vec;
83 }
84
87 -> rlp_value {
88 auto rlp_access_list
89 = rlp_value(rlp_value_type::array); // empty by default
90 if(!access_list.empty()) {
91 for(const auto& access_tuple : access_list) {
92 auto storage_keys = rlp_value(rlp_value_type::array);
93 for(const auto& storage_key : access_tuple.m_storage_keys) {
94 storage_keys.push_back(make_rlp_value(storage_key));
95 }
96 rlp_access_list.push_back(
97 make_rlp_array(make_rlp_value(access_tuple.m_address),
98 storage_keys));
99 }
100 }
101 return rlp_access_list;
102 }
103}
Serializer implementation for buffer.
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
auto data_at(size_t offset) -> void *
Returns a raw pointer to the start of the buffer data.
Definition buffer.cpp:36
This class contains a value that can be serialized into, or was deserialized from,...
Definition rlp.hpp:32
void write_to(serializer &ser) const
Serializes the rlp_value in RLP representation into the passed serializer.
Interface for serializing objects into and out of raw bytes representations.
virtual auto write(const void *data, size_t len) -> bool=0
Attempts to write the given raw data into the buffer starting at the current cursor position.
std::vector< evm_access_tuple > evm_access_list
Type alias for a list of storage key accesses.
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
@ 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 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