Ethereum  PoC-8
The C++ Implementation of Ethereum
Block.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 <array>
25 #include <unordered_map>
26 #include <libdevcore/Common.h>
27 #include <libdevcore/RLP.h>
28 #include <libdevcore/TrieDB.h>
29 #include <libdevcore/OverlayDB.h>
30 #include <libethcore/Exceptions.h>
31 #include <libethcore/BlockHeader.h>
33 #include "Account.h"
34 #include "Transaction.h"
35 #include "TransactionReceipt.h"
36 #include "GasPricer.h"
37 #include "State.h"
38 
39 namespace dev
40 {
41 
42 namespace test { class ImportTest; class StateLoader; }
43 
44 namespace eth
45 {
46 
47 class SealEngineFace;
48 class BlockChain;
49 class State;
50 class TransactionQueue;
51 struct VerifiedBlockRef;
52 class LastBlockHashesFace;
53 
55 {
56  double verify;
57  double enact;
58 };
59 
60 DEV_SIMPLE_EXCEPTION(ChainOperationWithUnknownBlockChain);
61 DEV_SIMPLE_EXCEPTION(InvalidOperationOnSealedBlock);
62 
68 class Block
69 {
70  friend class ExtVM;
71  friend class dev::test::ImportTest;
72  friend class dev::test::StateLoader;
73  friend class Executive;
74  friend class BlockChain;
75 
76 public:
77  // TODO: pass in ChainOperationParams rather than u256
78 
80  Block(u256 const& _accountStartNonce): m_state(_accountStartNonce, OverlayDB(), BaseState::Empty), m_precommit(_accountStartNonce) {}
81 
87  Block(BlockChain const& _bc, OverlayDB const& _db, BaseState _bs = BaseState::PreExisting, Address const& _author = Address());
88 
94  Block(BlockChain const& _bc, OverlayDB const& _db, h256 const& _root, Address const& _author = Address());
95 
96  enum NullType { Null };
97  Block(NullType): m_state(0, OverlayDB(), BaseState::Empty), m_precommit(0) {}
98 
100  explicit Block(BlockChain const& _bc): Block(Null) { noteChain(_bc); }
101 
103  Block(Block const& _s);
104 
106  Block& operator=(Block const& _s);
107 
109  Address author() const { return m_author; }
110 
113  void setAuthor(Address const& _id) { m_author = _id; resetCurrent(); }
114 
117  void noteChain(BlockChain const& _bc);
118 
119  // Account-getters. All operate on the final state.
120 
123  u256 balance(Address const& _address) const { return m_state.balance(_address); }
124 
127  u256 transactionsFrom(Address const& _address) const { return m_state.getNonce(_address); }
128 
130  bool addressInUse(Address const& _address) const { return m_state.addressInUse(_address); }
131 
133  bool addressHasCode(Address const& _address) const { return m_state.addressHasCode(_address); }
134 
136  h256 storageRoot(Address const& _contract) const { return m_state.storageRoot(_contract); }
137 
140  u256 storage(Address const& _contract, u256 const& _memory) const { return m_state.storage(_contract, _memory); }
141 
145  std::map<h256, std::pair<u256, u256>> storage(Address const& _contract) const { return m_state.storage(_contract); }
146 
149  bytes const& code(Address const& _contract) const { return m_state.code(_contract); }
150 
153  h256 codeHash(Address const& _contract) const { return m_state.codeHash(_contract); }
154 
155  // General information from state
156 
158  State const& state() const { return m_state; }
159 
161  OverlayDB const& db() const { return m_state.db(); }
162 
164  h256 rootHash() const { return m_state.rootHash(); }
165 
168  std::unordered_map<Address, u256> addresses() const { return m_state.addresses(); }
169 
170  // For altering accounts behind-the-scenes
171 
175  State& mutableState() { return m_state; }
176 
177  // Information concerning ongoing transactions
178 
180  u256 gasLimitRemaining() const { return m_currentBlock.gasLimit() - gasUsed(); }
181 
183  Transactions const& pending() const { return m_transactions; }
184 
186  h256Hash const& pendingHashes() const { return m_transactionSet; }
187 
189  TransactionReceipt const& receipt(unsigned _i) const { return m_receipts.at(_i); }
190 
192  LogEntries const& log(unsigned _i) const { return receipt(_i).log(); }
193 
195  LogBloom logBloom() const;
196 
198  LogBloom const& logBloom(unsigned _i) const { return receipt(_i).bloom(); }
199 
204  h256 stateRootBeforeTx(unsigned _i) const;
205 
206  // State-change operations
207 
210 
214 
217  std::pair<TransactionReceipts, bool> sync(BlockChain const& _bc, TransactionQueue& _tq, GasPricer const& _gp, unsigned _msTimeout = 100);
218 
221  bool sync(BlockChain const& _bc);
222 
224  bool sync(BlockChain const& _bc, h256 const& _blockHash, BlockHeader const& _bi = BlockHeader());
225 
228  u256 enactOn(VerifiedBlockRef const& _block, BlockChain const& _bc);
229 
231  void cleanup();
232 
235  void resetCurrent(int64_t _timestamp = utcTime());
236 
237  // Sealing
238 
245  void commitToSeal(BlockChain const& _bc, bytes const& _extraData = {});
246 
251 
262  bool sealBlock(bytes const& _header) { return sealBlock(&_header); }
263  bool sealBlock(bytesConstRef _header);
264 
266  bool isSealed() const { return !m_currentBytes.empty(); }
267 
270  bytes const& blockData() const { return m_currentBytes; }
271 
273  BlockHeader const& info() const { return m_currentBlock; }
274 
275 private:
276  SealEngineFace* sealEngine() const;
277 
279  void uncommitToSeal();
280 
283  u256 enact(VerifiedBlockRef const& _block, BlockChain const& _bc);
284 
286  void applyRewards(std::vector<BlockHeader> const& _uncleBlockHeaders, u256 const& _blockReward);
287 
289  u256 gasUsed() const { return m_receipts.size() ? m_receipts.back().cumulativeGasUsed() : 0; }
290 
292  void performIrregularModifications();
293 
295  void updateBlockhashContract();
296 
297  State m_state;
298  Transactions m_transactions;
299  TransactionReceipts m_receipts;
300  h256Hash m_transactionSet;
301  State m_precommit;
302 
303  BlockHeader m_previousBlock;
304  BlockHeader m_currentBlock;
305  bytes m_currentBytes;
306  bool m_committedToSeal = false;
307 
308  bytes m_currentTxs;
309  bytes m_currentUncles;
310 
311  Address m_author;
312 
313  SealEngineFace* m_sealEngine = nullptr;
314 
315  Logger m_logger{createLogger(VerbosityDebug, "block")};
316  Logger m_loggerDetailed{createLogger(VerbosityTrace, "block")};
317 };
318 
319 
320 }
321 
322 }
dev::eth::Block::addressInUse
bool addressInUse(Address const &_address) const
Check if the address is in use.
Definition: Block.h:130
dev::eth::OnOpFunc
std::function< void(uint64_t, uint64_t, Instruction, bigint, bigint, bigint, VMFace const *, ExtVMFace const *)> OnOpFunc
Definition: ExtVMFace.h:115
dev::eth::Block::commitToSeal
void commitToSeal(BlockChain const &_bc, bytes const &_extraData={})
Definition: Block.cpp:728
dev::eth::Block::mutableState
State & mutableState()
Definition: Block.h:175
dev::eth::Block::blockData
bytes const & blockData() const
Definition: Block.h:270
dev::eth::State::addressInUse
bool addressInUse(Address const &_address) const
Check if the address is in use.
Definition: State.cpp:291
dev::eth::State::rootHash
h256 rootHash() const
The hash of the root of our state tree.
Definition: State.h:310
dev::eth::Transaction
Encodes a transaction, ready to be exported to or freshly imported from RLP.
Definition: Transaction.h:86
dev::eth::PopulationStatistics::verify
double verify
Definition: Block.h:56
dev::vector_ref< byte const >
dev::eth::BlockHeader
Encapsulation of a block header. Class to contain all of a block header's data. It is able to parse a...
Definition: BlockHeader.h:97
dev::eth::SealEngineFace
Definition: SealEngine.h:46
dev::eth::Block::code
bytes const & code(Address const &_contract) const
Definition: Block.h:149
dev::eth::Transactions
std::vector< Transaction > Transactions
Nice name for vector of Transaction.
Definition: Transaction.h:122
dev::eth::Block::populateFromChain
PopulationStatistics populateFromChain(BlockChain const &_bc, h256 const &_hash, ImportRequirements::value _ir=ImportRequirements::None)
Construct state object from arbitrary point in blockchain.
Definition: Block.cpp:156
dev::eth::Block::rootHash
h256 rootHash() const
The hash of the root of our state tree.
Definition: Block.h:164
dev::eth::Block::storage
std::map< h256, std::pair< u256, u256 > > storage(Address const &_contract) const
Definition: Block.h:145
dev::eth::Block::enactOn
u256 enactOn(VerifiedBlockRef const &_block, BlockChain const &_bc)
Definition: Block.cpp:414
dev::eth::State::code
bytes const & code(Address const &_addr) const
Definition: State.cpp:503
dev::eth::Permanence
Permanence
Definition: State.h:73
dev::eth::Block::stateRootBeforeTx
h256 stateRootBeforeTx(unsigned _i) const
Definition: Block.cpp:858
dev::eth::Block::author
Address author() const
Get the author address for any transactions we do and rewards we get.
Definition: Block.h:109
dev::eth::Block::storageRoot
h256 storageRoot(Address const &_contract) const
Get the root of the storage of an account.
Definition: Block.h:136
dev::eth::ImportRequirements::value
unsigned value
Definition: Common.h:112
Exceptions.h
dev::eth::PopulationStatistics
Definition: Block.h:55
dev::eth::Block::transactionsFrom
u256 transactionsFrom(Address const &_address) const
Definition: Block.h:127
dev::eth::State::getNonce
u256 getNonce(Address const &_addr) const
Definition: State.cpp:414
BlockHeader.h
dev::utcTime
int64_t utcTime()
Get the current time in seconds since the epoch in UTC.
Definition: Common.cpp:53
ChainOperationParams.h
dev::eth::Block::logBloom
LogBloom logBloom() const
Get the bloom filter of all logs that happened in the block.
Definition: Block.cpp:871
dev::FixedHash< 20 >
dev::eth::Block::noteChain
void noteChain(BlockChain const &_bc)
Definition: Block.cpp:146
dev::eth::Block::logBloom
LogBloom const & logBloom(unsigned _i) const
Get the bloom filter of a particular transaction that happened in the block.
Definition: Block.h:198
dev::h256Hash
std::unordered_set< h256 > h256Hash
Definition: FixedHash.h:365
dev::Logger
boost::log::sources::severity_channel_logger<> Logger
Definition: Log.h:124
TrieDB.h
Common.h
dev::eth::LogEntries
std::vector< LogEntry > LogEntries
Definition: LogEntry.h:51
dev::eth::Block::Block
Block(u256 const &_accountStartNonce)
Default constructor; creates with a blank database prepopulated with the genesis block.
Definition: Block.h:80
TransactionReceipt.h
dev::OnFailed::Empty
@ Empty
dev::eth::Block::execute
ExecutionResult execute(LastBlockHashesFace const &_lh, Transaction const &_t, Permanence _p=Permanence::Committed, OnOpFunc const &_onOp=OnOpFunc())
Definition: Block.cpp:657
dev::eth::Block::cleanup
void cleanup()
Returns back to a pristine state after having done a playback.
Definition: Block.cpp:879
dev::bytes
std::vector< byte > bytes
Definition: Common.h:72
dev::createLogger
Logger createLogger(int _severity, std::string const &_channel)
Definition: Log.h:125
dev::eth::Block::pending
Transactions const & pending() const
Get the list of pending transactions.
Definition: Block.h:183
dev::eth::TransactionReceipts
std::vector< TransactionReceipt > TransactionReceipts
Definition: TransactionReceipt.h:69
Transaction.h
dev::eth::Block::log
LogEntries const & log(unsigned _i) const
Get the list of pending transactions.
Definition: Block.h:192
GasPricer.h
dev::eth::Executive
Message-call/contract-creation executor; useful for executing transactions.
Definition: Executive.h:104
dev::eth::BlockChain
Implements the blockchain database. All data this gives is disk-backed. @threadsafe.
Definition: BlockChain.h:105
dev::eth::ExtVM
Externality interface for the Virtual Machine providing access to world state.
Definition: ExtVM.h:39
dev::eth::Block::state
State const & state() const
Get the backing state object.
Definition: Block.h:158
dev::eth::Block::codeHash
h256 codeHash(Address const &_contract) const
Definition: Block.h:153
dev::eth::Block::isSealed
bool isSealed() const
Definition: Block.h:266
dev::OverlayDB
Definition: OverlayDB.h:34
dev::eth::State::addressHasCode
bool addressHasCode(Address const &_address) const
Check if the address contains executable code.
Definition: State.cpp:304
dev::eth::TransactionQueue
A queue of Transactions, each stored as RLP. Maintains a transaction queue sorted by nonce diff and g...
Definition: TransactionQueue.h:45
dev::VerbosityDebug
@ VerbosityDebug
Definition: Log.h:71
dev::eth::BaseState
BaseState
Definition: State.h:67
dev::eth::State::db
OverlayDB const & db() const
Definition: State.h:195
dev::eth::Block::pendingHashes
h256Hash const & pendingHashes() const
Get the list of hashes of pending transactions.
Definition: Block.h:186
dev::eth::PopulationStatistics::enact
double enact
Definition: Block.h:57
dev::eth::Block::resetCurrent
void resetCurrent(int64_t _timestamp=utcTime())
Definition: Block.cpp:118
dev::eth::Block::addresses
std::unordered_map< Address, u256 > addresses() const
Definition: Block.h:168
dev::eth::Block::db
OverlayDB const & db() const
Open a DB - useful for passing into the constructor & keeping for other states that are necessary.
Definition: Block.h:161
dev::eth::Block::ImportTest
friend class dev::test::ImportTest
Definition: Block.h:71
dev::eth::Block::Block
Block(BlockChain const &_bc)
Construct from a given blockchain. Empty, but associated with _bc 's chain params.
Definition: Block.h:100
OverlayDB.h
dev::eth::Permanence::Committed
@ Committed
dev::eth::Block::addressHasCode
bool addressHasCode(Address const &_address) const
Check if the address contains executable code.
Definition: Block.h:133
dev::eth::Block::receipt
TransactionReceipt const & receipt(unsigned _i) const
Get the transaction receipt for the transaction of the given index.
Definition: Block.h:189
dev::eth::State
Definition: State.h:160
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::eth::State::storageRoot
h256 storageRoot(Address const &_contract) const
Get the root of the storage of an account.
Definition: State.cpp:492
dev::eth::Block::Null
@ Null
Definition: Block.h:96
dev::eth::VerifiedBlockRef
Verified block info, does not hold block data, but a reference instead.
Definition: VerifiedBlock.h:37
dev::eth::TransactionReceipt::log
LogEntries const & log() const
Definition: TransactionReceipt.h:56
dev::eth::Block::sealBlock
bool sealBlock(bytes const &_header)
Definition: Block.h:262
dev::eth::TransactionReceipt
Definition: TransactionReceipt.h:40
dev::eth::DEV_SIMPLE_EXCEPTION
DEV_SIMPLE_EXCEPTION(NoHashRecorded)
dev::eth::State::addresses
std::unordered_map< Address, u256 > addresses() const
Definition: State.cpp:210
dev
Definition: Address.cpp:21
dev::eth::ImportRequirements::None
@ None
Definition: Common.h:128
dev::eth::Block::balance
u256 balance(Address const &_address) const
Definition: Block.h:123
dev::eth::State::balance
u256 balance(Address const &_id) const
Definition: State.cpp:312
dev::eth::Block::info
BlockHeader const & info() const
Get the header information on the present block.
Definition: Block.h:273
dev::eth::State::codeHash
h256 codeHash(Address const &_contract) const
Definition: State.cpp:526
dev::eth::ExecutionResult
Description of the result of executing a transaction.
Definition: Transaction.h:71
dev::eth::Block::NullType
NullType
Definition: Block.h:96
dev::eth::BaseState::PreExisting
@ PreExisting
dev::eth::BlockHeader::gasLimit
u256 const & gasLimit() const
Definition: BlockHeader.h:167
Account.h
dev::eth::GasPricer
Definition: GasPricer.h:46
dev::eth::Block::gasLimitRemaining
u256 gasLimitRemaining() const
Get the remaining gas limit in this block.
Definition: Block.h:180
dev::eth::State::storage
u256 storage(Address const &_contract, u256 const &_memory) const
Definition: State.cpp:422
dev::eth::Block::setAuthor
void setAuthor(Address const &_id)
Definition: Block.h:113
dev::eth::LastBlockHashesFace
Interface for getting a list of recent block hashes @threadsafe.
Definition: LastBlockHashesFace.h:37
dev::eth::TransactionReceipt::bloom
LogBloom const & bloom() const
Definition: TransactionReceipt.h:55
dev::VerbosityTrace
@ VerbosityTrace
Definition: Log.h:72
dev::eth::Block::storage
u256 storage(Address const &_contract, u256 const &_memory) const
Definition: Block.h:140
dev::eth::Block::StateLoader
friend class dev::test::StateLoader
Definition: Block.h:72
dev::Address
h160 Address
Definition: Address.h:30
RLP.h
dev::eth::Block
Active model of a block within the block chain. Keeps track of all transactions, receipts and state f...
Definition: Block.h:69
dev::eth::Block::Block
Block(NullType)
Definition: Block.h:97
State.h
dev::eth::Block::sync
std::pair< TransactionReceipts, bool > sync(BlockChain const &_bc, TransactionQueue &_tq, GasPricer const &_gp, unsigned _msTimeout=100)
Definition: Block.cpp:307
dev::eth::Block::operator=
Block & operator=(Block const &_s)
Copy state object.
Definition: Block.cpp:98