Ethereum  PoC-8
The C++ Implementation of Ethereum
BlockDetails.h
Go to the documentation of this file.
1 /*
2  This file is part of cpp-ethereum.
3 
4  cpp-ethereum is free software: you can redistribute it and/or modify
5  it under the terms of the GNU General Public License as published by
6  the Free Software Foundation, either version 3 of the License, or
7  (at your option) any later version.
8 
9  cpp-ethereum is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  GNU General Public License for more details.
13 
14  You should have received a copy of the GNU General Public License
15  along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>.
16 */
22 #pragma once
23 
24 #include <unordered_map>
25 #include <libdevcore/Log.h>
26 #include <libdevcore/RLP.h>
27 #include "TransactionReceipt.h"
28 
29 namespace dev
30 {
31 namespace eth
32 {
33 
34 // TODO: OPTIMISE: constructors take bytes, RLP used only in necessary classes.
35 
36 static const unsigned c_bloomIndexSize = 16;
37 static const unsigned c_bloomIndexLevels = 2;
38 
39 static const unsigned c_invalidNumber = (unsigned)-1;
40 
42 {
43  BlockDetails(): number(c_invalidNumber), totalDifficulty(Invalid256) {}
44  BlockDetails(unsigned _n, u256 _tD, h256 _p, h256s _c): number(_n), totalDifficulty(_tD), parent(_p), children(_c) {}
45  BlockDetails(RLP const& _r);
46  bytes rlp() const;
47 
48  bool isNull() const { return number == c_invalidNumber; }
49  explicit operator bool() const { return !isNull(); }
50 
51  unsigned number = c_invalidNumber;
55 
56  mutable unsigned size;
57 };
58 
60 {
62  BlockLogBlooms(RLP const& _r) { blooms = _r.toVector<LogBloom>(); size = _r.data().size(); }
63  bytes rlp() const { bytes r = dev::rlp(blooms); size = r.size(); return r; }
64 
66  mutable unsigned size;
67 };
68 
70 {
72  BlocksBlooms(RLP const& _r) { blooms = _r.toArray<LogBloom, c_bloomIndexSize>(); size = _r.data().size(); }
73  bytes rlp() const { bytes r = dev::rlp(blooms); size = r.size(); return r; }
74 
75  std::array<LogBloom, c_bloomIndexSize> blooms;
76  mutable unsigned size;
77 };
78 
80 {
82  BlockReceipts(RLP const& _r) { for (auto const& i: _r) receipts.emplace_back(i.data()); size = _r.data().size(); }
83  bytes rlp() const { RLPStream s(receipts.size()); for (TransactionReceipt const& i: receipts) i.streamRLP(s); size = s.out().size(); return s.out(); }
84 
86  mutable unsigned size = 0;
87 };
88 
89 struct BlockHash
90 {
91  BlockHash() {}
92  BlockHash(h256 const& _h): value(_h) {}
93  BlockHash(RLP const& _r) { value = _r.toHash<h256>(); }
94  bytes rlp() const { return dev::rlp(value); }
95 
97  static const unsigned size = 65;
98 };
99 
101 {
103  TransactionAddress(RLP const& _rlp) { blockHash = _rlp[0].toHash<h256>(); index = _rlp[1].toInt<unsigned>(); }
104  bytes rlp() const { RLPStream s(2); s << blockHash << index; return s.out(); }
105 
106  explicit operator bool() const { return !!blockHash; }
107 
109  unsigned index = 0;
110 
111  static const unsigned size = 67;
112 };
113 
114 using BlockDetailsHash = std::unordered_map<h256, BlockDetails>;
115 using BlockLogBloomsHash = std::unordered_map<h256, BlockLogBlooms>;
116 using BlockReceiptsHash = std::unordered_map<h256, BlockReceipts>;
117 using TransactionAddressHash = std::unordered_map<h256, TransactionAddress>;
118 using BlockHashHash = std::unordered_map<uint64_t, BlockHash>;
119 using BlocksBloomsHash = std::unordered_map<h256, BlocksBlooms>;
120 
121 static const BlockDetails NullBlockDetails;
122 static const BlockLogBlooms NullBlockLogBlooms;
123 static const BlockReceipts NullBlockReceipts;
124 static const TransactionAddress NullTransactionAddress;
125 static const BlockHash NullBlockHash;
126 static const BlocksBlooms NullBlocksBlooms;
127 
128 }
129 }
dev::eth::BlocksBlooms::size
unsigned size
Definition: BlockDetails.h:76
dev::eth::TransactionAddress::TransactionAddress
TransactionAddress(RLP const &_rlp)
Definition: BlockDetails.h:103
dev::eth::BlocksBlooms::BlocksBlooms
BlocksBlooms(RLP const &_r)
Definition: BlockDetails.h:72
dev::eth::TransactionAddress::rlp
bytes rlp() const
Definition: BlockDetails.h:104
dev::eth::BlockHash
Definition: BlockDetails.h:90
dev::eth::BlockReceipts::size
unsigned size
Definition: BlockDetails.h:86
dev::eth::BlocksBlooms::rlp
bytes rlp() const
Definition: BlockDetails.h:73
dev::eth::BlocksBlooms::blooms
std::array< LogBloom, c_bloomIndexSize > blooms
Definition: BlockDetails.h:75
dev::eth::TransactionAddress
Definition: BlockDetails.h:101
dev::eth::BlockDetails::rlp
bytes rlp() const
Definition: BlockDetails.cpp:38
dev::eth::BlockDetails::children
h256s children
Definition: BlockDetails.h:54
dev::eth::TransactionAddress::TransactionAddress
TransactionAddress()
Definition: BlockDetails.h:102
dev::eth::BlockDetails::size
unsigned size
Definition: BlockDetails.h:56
dev::RLPStream::out
bytes const & out() const
Read the byte stream.
Definition: RLP.h:419
dev::eth::BlockDetails::BlockDetails
BlockDetails()
Definition: BlockDetails.h:43
dev::eth::BlockHashHash
std::unordered_map< uint64_t, BlockHash > BlockHashHash
Definition: BlockDetails.h:118
dev::rlp
bytes rlp(_T _t)
Export a single item in RLP format, returning a byte array.
Definition: RLP.h:453
dev::eth::BlockDetails::BlockDetails
BlockDetails(unsigned _n, u256 _tD, h256 _p, h256s _c)
Definition: BlockDetails.h:44
dev::eth::BlockDetails
Definition: BlockDetails.h:42
dev::eth::BlockDetails::isNull
bool isNull() const
Definition: BlockDetails.h:48
dev::FixedHash< 32 >
dev::eth::TransactionAddress::blockHash
h256 blockHash
Definition: BlockDetails.h:108
dev::eth::BlockHash::BlockHash
BlockHash(h256 const &_h)
Definition: BlockDetails.h:92
dev::eth::BlockDetails::number
unsigned number
Definition: BlockDetails.h:51
dev::eth::BlockHash::BlockHash
BlockHash(RLP const &_r)
Definition: BlockDetails.h:93
dev::eth::BlockHash::BlockHash
BlockHash()
Definition: BlockDetails.h:91
dev::RLP::toVector
std::vector< T > toVector(int _flags=LaissezFaire) const
Definition: RLP.h:186
dev::eth::TransactionAddress::size
static const unsigned size
Definition: BlockDetails.h:111
dev::eth::LogBloom
h2048 LogBloom
The log bloom's size (2048-bit).
Definition: Common.h:50
dev::eth::BlockLogBloomsHash
std::unordered_map< h256, BlockLogBlooms > BlockLogBloomsHash
Definition: BlockDetails.h:115
dev::h256s
std::vector< h256 > h256s
Definition: FixedHash.h:361
dev::eth::BlockReceipts::BlockReceipts
BlockReceipts(RLP const &_r)
Definition: BlockDetails.h:82
dev::eth::BlockHash::size
static const unsigned size
Definition: BlockDetails.h:97
dev::eth::BlockDetails::totalDifficulty
u256 totalDifficulty
Definition: BlockDetails.h:52
dev::eth::BlockLogBlooms::size
unsigned size
Definition: BlockDetails.h:66
TransactionReceipt.h
dev::eth::BlocksBloomsHash
std::unordered_map< h256, BlocksBlooms > BlocksBloomsHash
Definition: BlockDetails.h:119
dev::eth::BlockLogBlooms
Definition: BlockDetails.h:60
dev::eth::BlocksBlooms
Definition: BlockDetails.h:70
dev::bytes
std::vector< byte > bytes
Definition: Common.h:72
dev::eth::TransactionReceipts
std::vector< TransactionReceipt > TransactionReceipts
Definition: TransactionReceipt.h:69
dev::eth::BlockLogBlooms::rlp
bytes rlp() const
Definition: BlockDetails.h:63
dev::eth::LogBlooms
std::vector< LogBloom > LogBlooms
Many log blooms.
Definition: Common.h:53
dev::eth::BlockReceipts::receipts
TransactionReceipts receipts
Definition: BlockDetails.h:85
dev::vector_ref::size
size_t size() const
Definition: vector_ref.h:53
dev::eth::BlockDetailsHash
std::unordered_map< h256, BlockDetails > BlockDetailsHash
Definition: BlockDetails.h:114
dev::RLP::toArray
std::array< T, N > toArray(int _flags=LaissezFaire) const
Definition: RLP.h:241
dev::Invalid256
constexpr u256 Invalid256
Definition: Common.h:147
dev::RLP::data
bytesConstRef data() const
The bare data of the RLP.
Definition: RLP.h:80
dev::RLPStream
Class for writing to an RLP bytestream.
Definition: RLP.h:370
dev::eth::TransactionAddress::index
unsigned index
Definition: BlockDetails.h:109
dev::eth::BlockReceipts::rlp
bytes rlp() const
Definition: BlockDetails.h:83
dev::eth::BlockDetails::parent
h256 parent
Definition: BlockDetails.h:53
dev::eth::BlocksBlooms::BlocksBlooms
BlocksBlooms()
Definition: BlockDetails.h:71
dev::eth::BlockLogBlooms::BlockLogBlooms
BlockLogBlooms()
Definition: BlockDetails.h:61
dev::eth::BlockHash::value
h256 value
Definition: BlockDetails.h:96
dev::eth::BlockReceiptsHash
std::unordered_map< h256, BlockReceipts > BlockReceiptsHash
Definition: BlockDetails.h:116
dev::eth::TransactionAddressHash
std::unordered_map< h256, TransactionAddress > TransactionAddressHash
Definition: BlockDetails.h:117
dev::u256
boost::multiprecision::number< boost::multiprecision::cpp_int_backend< 256, 256, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void > > u256
Definition: Common.h:121
dev::RLP::toInt
_T toInt(int _flags=Strict) const
Converts to int of type given; if isData(), decodes as big-endian bytestream.
Definition: RLP.h:257
dev::RLP::toHash
_N toHash(int _flags=Strict) const
Definition: RLP.h:288
dev::eth::BlockReceipts::BlockReceipts
BlockReceipts()
Definition: BlockDetails.h:81
dev::eth::TransactionReceipt
Definition: TransactionReceipt.h:40
dev::eth::BlockReceipts
Definition: BlockDetails.h:80
dev
Definition: Address.cpp:21
dev::eth::BlockLogBlooms::BlockLogBlooms
BlockLogBlooms(RLP const &_r)
Definition: BlockDetails.h:62
dev::RLP
Definition: RLP.h:48
Log.h
dev::eth::BlockHash::rlp
bytes rlp() const
Definition: BlockDetails.h:94
RLP.h
dev::eth::BlockLogBlooms::blooms
LogBlooms blooms
Definition: BlockDetails.h:65