Ethereum  PoC-8
The C++ Implementation of Ethereum
ClientBase.cpp
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  */
23 #include "ClientBase.h"
24 #include <algorithm>
25 #include "BlockChain.h"
26 #include "Executive.h"
27 #include "State.h"
28 
29 using namespace std;
30 using namespace dev;
31 using namespace dev::eth;
32 
33 static const int64_t c_maxGasEstimate = 50000000;
34 
35 std::pair<u256, ExecutionResult> ClientBase::estimateGas(Address const& _from, u256 _value, Address _dest, bytes const& _data, int64_t _maxGas, u256 _gasPrice, BlockNumber _blockNumber, GasEstimationCallback const& _callback)
36 {
37  try
38  {
39  int64_t upperBound = _maxGas;
40  if (upperBound == Invalid256 || upperBound > c_maxGasEstimate)
41  upperBound = c_maxGasEstimate;
42  int64_t lowerBound = Transaction::baseGasRequired(!_dest, &_data, EVMSchedule());
43  Block bk = blockByNumber(_blockNumber);
44  u256 gasPrice = _gasPrice == Invalid256 ? gasBidPrice() : _gasPrice;
45  ExecutionResult er;
46  ExecutionResult lastGood;
47  bool good = false;
48  while (upperBound != lowerBound)
49  {
50  int64_t mid = (lowerBound + upperBound) / 2;
51  u256 n = bk.transactionsFrom(_from);
52  Transaction t;
53  if (_dest)
54  t = Transaction(_value, gasPrice, mid, _dest, _data, n);
55  else
56  t = Transaction(_value, gasPrice, mid, _data, n);
57  t.forceSender(_from);
58  EnvInfo const env(bk.info(), bc().lastBlockHashes(), 0, mid);
59  State tempState(bk.state());
60  tempState.addBalance(_from, (u256)(t.gas() * t.gasPrice() + t.value()));
61  er = tempState.execute(env, *bc().sealEngine(), t, Permanence::Reverted).first;
62  if (er.excepted == TransactionException::OutOfGas ||
63  er.excepted == TransactionException::OutOfGasBase ||
64  er.excepted == TransactionException::OutOfGasIntrinsic ||
65  er.codeDeposit == CodeDeposit::Failed ||
66  er.excepted == TransactionException::BadJumpDestination)
67  lowerBound = lowerBound == mid ? upperBound : mid;
68  else
69  {
70  lastGood = er;
71  upperBound = upperBound == mid ? lowerBound : mid;
72  good = true;
73  }
74 
75  if (_callback)
76  _callback(GasEstimationProgress { lowerBound, upperBound });
77  }
78  if (_callback)
79  _callback(GasEstimationProgress { lowerBound, upperBound });
80  return make_pair(upperBound, good ? lastGood : er);
81  }
82  catch (...)
83  {
84  // TODO: Some sort of notification of failure.
85  return make_pair(u256(), ExecutionResult());
86  }
87 }
88 
89 ImportResult ClientBase::injectBlock(bytes const& _block)
90 {
91  return bc().attemptImport(_block, preSeal().db()).first;
92 }
93 
94 u256 ClientBase::balanceAt(Address _a, BlockNumber _block) const
95 {
96  return blockByNumber(_block).balance(_a);
97 }
98 
99 u256 ClientBase::countAt(Address _a, BlockNumber _block) const
100 {
101  return blockByNumber(_block).transactionsFrom(_a);
102 }
103 
104 u256 ClientBase::stateAt(Address _a, u256 _l, BlockNumber _block) const
105 {
106  return blockByNumber(_block).storage(_a, _l);
107 }
108 
109 h256 ClientBase::stateRootAt(Address _a, BlockNumber _block) const
110 {
111  return blockByNumber(_block).storageRoot(_a);
112 }
113 
114 bytes ClientBase::codeAt(Address _a, BlockNumber _block) const
115 {
116  return blockByNumber(_block).code(_a);
117 }
118 
119 h256 ClientBase::codeHashAt(Address _a, BlockNumber _block) const
120 {
121  return blockByNumber(_block).codeHash(_a);
122 }
123 
124 map<h256, pair<u256, u256>> ClientBase::storageAt(Address _a, BlockNumber _block) const
125 {
126  return blockByNumber(_block).storage(_a);
127 }
128 
129 // TODO: remove try/catch, allow exceptions
130 LocalisedLogEntries ClientBase::logs(unsigned _watchId) const
131 {
132  LogFilter f;
133  try
134  {
135  Guard l(x_filtersWatches);
136  f = m_filters.at(m_watches.at(_watchId).id).filter;
137  }
138  catch (...)
139  {
140  return LocalisedLogEntries();
141  }
142  return logs(f);
143 }
144 
145 LocalisedLogEntries ClientBase::logs(LogFilter const& _f) const
146 {
148  unsigned begin = min(bc().number() + 1, (unsigned)numberFromHash(_f.latest()));
149  unsigned end = min(bc().number(), min(begin, (unsigned)numberFromHash(_f.earliest())));
150 
151  // Handle pending transactions differently as they're not on the block chain.
152  if (begin > bc().number())
153  {
154  Block temp = postSeal();
155  for (unsigned i = 0; i < temp.pending().size(); ++i)
156  {
157  // Might have a transaction that contains a matching log.
158  TransactionReceipt const& tr = temp.receipt(i);
159  LogEntries le = _f.matches(tr);
160  for (unsigned j = 0; j < le.size(); ++j)
161  ret.insert(ret.begin(), LocalisedLogEntry(le[j]));
162  }
163  begin = bc().number();
164  }
165 
166  // Handle reverted blocks
167  // There are not so many, so let's iterate over them
168  h256s blocks;
169  h256 ancestor;
170  unsigned ancestorIndex;
171  tie(blocks, ancestor, ancestorIndex) = bc().treeRoute(_f.earliest(), _f.latest(), false);
172 
173  for (size_t i = 0; i < ancestorIndex; i++)
174  prependLogsFromBlock(_f, blocks[i], BlockPolarity::Dead, ret);
175 
176  // cause end is our earliest block, let's compare it with our ancestor
177  // if ancestor is smaller let's move our end to it
178  // example:
179  //
180  // 3b -> 2b -> 1b
181  // -> g
182  // 3a -> 2a -> 1a
183  //
184  // if earliest is at 2a and latest is a 3b, coverting them to numbers
185  // will give us pair (2, 3)
186  // and we want to get all logs from 1 (ancestor + 1) to 3
187  // so we have to move 2a to g + 1
188  end = min(end, (unsigned)numberFromHash(ancestor) + 1);
189 
190  // Handle blocks from main chain
191  set<unsigned> matchingBlocks;
192  if (!_f.isRangeFilter())
193  for (auto const& i: _f.bloomPossibilities())
194  for (auto u: bc().withBlockBloom(i, end, begin))
195  matchingBlocks.insert(u);
196  else
197  // if it is a range filter, we want to get all logs from all blocks in given range
198  for (unsigned i = end; i <= begin; i++)
199  matchingBlocks.insert(i);
200 
201  for (auto n: matchingBlocks)
202  prependLogsFromBlock(_f, bc().numberHash(n), BlockPolarity::Live, ret);
203 
204  reverse(ret.begin(), ret.end());
205  return ret;
206 }
207 
208 void ClientBase::prependLogsFromBlock(LogFilter const& _f, h256 const& _blockHash, BlockPolarity _polarity, LocalisedLogEntries& io_logs) const
209 {
210  auto receipts = bc().receipts(_blockHash).receipts;
211  for (size_t i = 0; i < receipts.size(); i++)
212  {
213  TransactionReceipt receipt = receipts[i];
214  auto th = transaction(_blockHash, i).sha3();
215  LogEntries le = _f.matches(receipt);
216  for (unsigned j = 0; j < le.size(); ++j)
217  io_logs.insert(io_logs.begin(), LocalisedLogEntry(le[j], _blockHash, (BlockNumber)bc().number(_blockHash), th, i, 0, _polarity));
218  }
219 }
220 
221 unsigned ClientBase::installWatch(LogFilter const& _f, Reaping _r)
222 {
223  h256 h = _f.sha3();
224  {
225  Guard l(x_filtersWatches);
226  if (!m_filters.count(h))
227  {
228  LOG(m_loggerWatch) << "FFF" << _f << h;
229  m_filters.insert(make_pair(h, _f));
230  }
231  }
232  return installWatch(h, _r);
233 }
234 
235 unsigned ClientBase::installWatch(h256 _h, Reaping _r)
236 {
237  unsigned ret;
238  {
239  Guard l(x_filtersWatches);
240  ret = m_watches.size() ? m_watches.rbegin()->first + 1 : 0;
241  m_watches[ret] = ClientWatch(_h, _r);
242  LOG(m_loggerWatch) << "+++" << ret << _h;
243  }
244 #if INITIAL_STATE_AS_CHANGES
245  auto ch = logs(ret);
246  if (ch.empty())
247  ch.push_back(InitialChange);
248  {
249  Guard l(x_filtersWatches);
250  swap(m_watches[ret].changes, ch);
251  }
252 #endif
253  return ret;
254 }
255 
256 bool ClientBase::uninstallWatch(unsigned _i)
257 {
258  LOG(m_loggerWatch) << "XXX" << _i;
259 
260  Guard l(x_filtersWatches);
261 
262  auto it = m_watches.find(_i);
263  if (it == m_watches.end())
264  return false;
265  auto id = it->second.id;
266  m_watches.erase(it);
267 
268  auto fit = m_filters.find(id);
269  if (fit != m_filters.end())
270  if (!--fit->second.refCount)
271  {
272  LOG(m_loggerWatch) << "*X*" << fit->first << ":" << fit->second.filter;
273  m_filters.erase(fit);
274  }
275  return true;
276 }
277 
278 LocalisedLogEntries ClientBase::peekWatch(unsigned _watchId) const
279 {
280  Guard l(x_filtersWatches);
281 
282  // LOG(m_loggerWatch) << "peekWatch" << _watchId;
283  auto& w = m_watches.at(_watchId);
284  // LOG(m_loggerWatch) << "lastPoll updated to " <<
285  //chrono::duration_cast<chrono::seconds>(chrono::system_clock::now().time_since_epoch()).count();
286  if (w.lastPoll != chrono::system_clock::time_point::max())
287  w.lastPoll = chrono::system_clock::now();
288  return w.changes;
289 }
290 
291 LocalisedLogEntries ClientBase::checkWatch(unsigned _watchId)
292 {
293  Guard l(x_filtersWatches);
295 
296  // LOG(m_loggerWatch) << "checkWatch" << _watchId;
297  auto& w = m_watches.at(_watchId);
298  // LOG(m_loggerWatch) << "lastPoll updated to " <<
299  //chrono::duration_cast<chrono::seconds>(chrono::system_clock::now().time_since_epoch()).count();
300  std::swap(ret, w.changes);
301  if (w.lastPoll != chrono::system_clock::time_point::max())
302  w.lastPoll = chrono::system_clock::now();
303 
304  return ret;
305 }
306 
307 BlockHeader ClientBase::blockInfo(h256 _hash) const
308 {
309  if (_hash == PendingBlockHash)
310  return preSeal().info();
311  return BlockHeader(bc().block(_hash));
312 }
313 
314 BlockDetails ClientBase::blockDetails(h256 _hash) const
315 {
316  return bc().details(_hash);
317 }
318 
319 Transaction ClientBase::transaction(h256 _transactionHash) const
320 {
321  return Transaction(bc().transaction(_transactionHash), CheckTransaction::Cheap);
322 }
323 
324 LocalisedTransaction ClientBase::localisedTransaction(h256 const& _transactionHash) const
325 {
326  std::pair<h256, unsigned> tl = bc().transactionLocation(_transactionHash);
327  return localisedTransaction(tl.first, tl.second);
328 }
329 
330 Transaction ClientBase::transaction(h256 _blockHash, unsigned _i) const
331 {
332  auto bl = bc().block(_blockHash);
333  RLP b(bl);
334  if (_i < b[1].itemCount())
335  return Transaction(b[1][_i].data(), CheckTransaction::Cheap);
336  else
337  return Transaction();
338 }
339 
340 LocalisedTransaction ClientBase::localisedTransaction(h256 const& _blockHash, unsigned _i) const
341 {
342  Transaction t = Transaction(bc().transaction(_blockHash, _i), CheckTransaction::Cheap);
343  return LocalisedTransaction(t, _blockHash, _i, numberFromHash(_blockHash));
344 }
345 
346 TransactionReceipt ClientBase::transactionReceipt(h256 const& _transactionHash) const
347 {
348  return bc().transactionReceipt(_transactionHash);
349 }
350 
351 LocalisedTransactionReceipt ClientBase::localisedTransactionReceipt(h256 const& _transactionHash) const
352 {
353  std::pair<h256, unsigned> tl = bc().transactionLocation(_transactionHash);
354  Transaction t = Transaction(bc().transaction(tl.first, tl.second), CheckTransaction::Cheap);
355  TransactionReceipt tr = bc().transactionReceipt(tl.first, tl.second);
356  u256 gasUsed = tr.cumulativeGasUsed();
357  if (tl.second > 0)
358  gasUsed -= bc().transactionReceipt(tl.first, tl.second - 1).cumulativeGasUsed();
360  tr,
361  t.sha3(),
362  tl.first,
363  numberFromHash(tl.first),
364  t.from(),
365  t.to(),
366  tl.second,
367  gasUsed,
368  toAddress(t.from(), t.nonce()));
369 }
370 
371 pair<h256, unsigned> ClientBase::transactionLocation(h256 const& _transactionHash) const
372 {
373  return bc().transactionLocation(_transactionHash);
374 }
375 
376 Transactions ClientBase::transactions(h256 _blockHash) const
377 {
378  auto bl = bc().block(_blockHash);
379  RLP b(bl);
380  Transactions res;
381  for (unsigned i = 0; i < b[1].itemCount(); i++)
382  res.emplace_back(b[1][i].data(), CheckTransaction::Cheap);
383  return res;
384 }
385 
386 TransactionHashes ClientBase::transactionHashes(h256 _blockHash) const
387 {
388  return bc().transactionHashes(_blockHash);
389 }
390 
391 BlockHeader ClientBase::uncle(h256 _blockHash, unsigned _i) const
392 {
393  auto bl = bc().block(_blockHash);
394  RLP b(bl);
395  if (_i < b[2].itemCount())
396  return BlockHeader(b[2][_i].data(), HeaderData);
397  else
398  return BlockHeader();
399 }
400 
401 UncleHashes ClientBase::uncleHashes(h256 _blockHash) const
402 {
403  return bc().uncleHashes(_blockHash);
404 }
405 
406 unsigned ClientBase::transactionCount(h256 _blockHash) const
407 {
408  auto bl = bc().block(_blockHash);
409  RLP b(bl);
410  return b[1].itemCount();
411 }
412 
413 unsigned ClientBase::uncleCount(h256 _blockHash) const
414 {
415  auto bl = bc().block(_blockHash);
416  RLP b(bl);
417  return b[2].itemCount();
418 }
419 
420 unsigned ClientBase::number() const
421 {
422  return bc().number();
423 }
424 
425 h256s ClientBase::pendingHashes() const
426 {
427  return h256s() + postSeal().pendingHashes();
428 }
429 
430 BlockHeader ClientBase::pendingInfo() const
431 {
432  return postSeal().info();
433 }
434 
435 BlockDetails ClientBase::pendingDetails() const
436 {
437  auto pm = postSeal().info();
438  auto li = Interface::blockDetails(LatestBlock);
439  return BlockDetails((unsigned)pm.number(), li.totalDifficulty + pm.difficulty(), pm.parentHash(), h256s{});
440 }
441 
442 Addresses ClientBase::addresses(BlockNumber _block) const
443 {
444  Addresses ret;
445  for (auto const& i : blockByNumber(_block).addresses())
446  ret.push_back(i.first);
447  return ret;
448 }
449 
450 u256 ClientBase::gasLimitRemaining() const
451 {
452  return postSeal().gasLimitRemaining();
453 }
454 
455 Address ClientBase::author() const
456 {
457  return preSeal().author();
458 }
459 
460 h256 ClientBase::hashFromNumber(BlockNumber _number) const
461 {
462  if (_number == PendingBlock)
463  return h256();
464  if (_number == LatestBlock)
465  return bc().currentHash();
466  return bc().numberHash(_number);
467 }
468 
469 BlockNumber ClientBase::numberFromHash(h256 _blockHash) const
470 {
471  if (_blockHash == PendingBlockHash)
472  return bc().number() + 1;
473  else if (_blockHash == LatestBlockHash)
474  return bc().number();
475  else if (_blockHash == EarliestBlockHash)
476  return 0;
477  return bc().number(_blockHash);
478 }
479 
480 int ClientBase::compareBlockHashes(h256 _h1, h256 _h2) const
481 {
482  BlockNumber n1 = numberFromHash(_h1);
483  BlockNumber n2 = numberFromHash(_h2);
484 
485  if (n1 > n2)
486  return 1;
487  else if (n1 == n2)
488  return 0;
489  return -1;
490 }
491 
492 bool ClientBase::isKnown(h256 const& _hash) const
493 {
494  return _hash == PendingBlockHash ||
495  _hash == LatestBlockHash ||
496  _hash == EarliestBlockHash ||
497  bc().isKnown(_hash);
498 }
499 
500 bool ClientBase::isKnown(BlockNumber _block) const
501 {
502  return _block == PendingBlock ||
503  _block == LatestBlock ||
504  bc().numberHash(_block) != h256();
505 }
506 
507 bool ClientBase::isKnownTransaction(h256 const& _transactionHash) const
508 {
509  return bc().isKnownTransaction(_transactionHash);
510 }
511 
512 bool ClientBase::isKnownTransaction(h256 const& _blockHash, unsigned _i) const
513 {
514  return isKnown(_blockHash) && block(_blockHash).pending().size() > _i;
515 }
516 
517 Block ClientBase::blockByNumber(BlockNumber _h) const
518 {
519  if (_h == PendingBlock)
520  return postSeal();
521  else if (_h == LatestBlock)
522  return block(bc().currentHash());
523  return block(bc().numberHash(_h));
524 }
525 
526 int ClientBase::chainId() const
527 {
528  return bc().chainParams().chainID;
529 }
dev::eth::TransactionBase::value
u256 value() const
Definition: TransactionBase.h:115
dev::eth::TransactionBase::gas
u256 gas() const
Definition: TransactionBase.h:121
dev::eth::ImportResult
ImportResult
Definition: Common.h:97
dev::eth::Transaction
Encodes a transaction, ready to be exported to or freshly imported from RLP.
Definition: Transaction.h:86
dev::eth::LogFilter
Definition: LogFilter.h:51
dev::eth::HeaderData
@ HeaderData
Definition: BlockHeader.h:69
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::GasEstimationProgress
Definition: Interface.h:57
dev::eth::Transactions
std::vector< Transaction > Transactions
Nice name for vector of Transaction.
Definition: Transaction.h:122
dev::eth::LocalisedTransaction
Definition: Transaction.h:125
dev::eth::ClientWatch
Definition: ClientBase.h:54
dev::Guard
std::lock_guard< std::mutex > Guard
Definition: Guards.h:41
dev::eth::Reaping
Reaping
Definition: Interface.h:45
std::swap
void swap(dev::eth::Watch &_a, dev::eth::Watch &_b)
Definition: Interface.h:282
dev::h256
FixedHash< 32 > h256
Definition: FixedHash.h:356
dev::eth::TransactionReceipt::cumulativeGasUsed
u256 const & cumulativeGasUsed() const
Definition: TransactionReceipt.h:54
dev::eth::Block::transactionsFrom
u256 transactionsFrom(Address const &_address) const
Definition: Block.h:127
dev::eth::TransactionBase::from
Address from() const
Synonym for safeSender().
Definition: TransactionBase.h:130
dev::eth
Definition: BasicAuthority.h:32
dev::eth::BlockDetails
Definition: BlockDetails.h:42
ClientBase.h
dev::Addresses
h160s Addresses
A vector of Ethereum addresses.
Definition: Address.h:33
dev::FixedHash< 20 >
dev::eth::State::addBalance
void addBalance(Address const &_id, u256 const &_amount)
Definition: State.cpp:346
LOG
#define LOG
Definition: Log.h:63
dev::eth::LogFilter::bloomPossibilities
std::vector< LogBloom > bloomPossibilities() const
Definition: LogFilter.cpp:88
dev::eth::BlockPolarity
BlockPolarity
Definition: Common.h:81
dev::h256s
std::vector< h256 > h256s
Definition: FixedHash.h:361
dev::eth::LogFilter::earliest
h256 earliest() const
hash of earliest block which should be filtered
Definition: LogFilter.h:59
dev::eth::LogEntries
std::vector< LogEntry > LogEntries
Definition: LogEntry.h:51
dev::bytes
std::vector< byte > bytes
Definition: Common.h:72
dev::eth::Block::pending
Transactions const & pending() const
Get the list of pending transactions.
Definition: Block.h:183
dev::eth::GasEstimationCallback
std::function< void(GasEstimationProgress const &)> GasEstimationCallback
Definition: Interface.h:62
dev::eth::LogFilter::matches
bool matches(LogBloom _bloom) const
Definition: LogFilter.cpp:61
dev::eth::TransactionBase::gasPrice
u256 gasPrice() const
Definition: TransactionBase.h:118
Executive.h
dev::eth::TransactionBase::sha3
h256 sha3(IncludeSignature _sig=WithSignature) const
Definition: TransactionBase.cpp:212
dev::eth::Block::state
State const & state() const
Get the backing state object.
Definition: Block.h:158
dev::toAddress
Address toAddress(Public const &_public)
Convert a public key to address.
Definition: Common.cpp:105
BlockChain.h
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::eth::LocalisedLogEntries
std::vector< LocalisedLogEntry > LocalisedLogEntries
Definition: LogEntry.h:94
dev::eth::UncleHashes
h256s UncleHashes
Definition: BlockChain.h:81
dev::eth::BlockNumber
unsigned BlockNumber
Definition: Common.h:64
dev::eth::TransactionBase::to
Address to() const
Synonym for receiveAddress().
Definition: TransactionBase.h:127
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::RLP::itemCount
size_t itemCount() const
Definition: RLP.h:101
std
Definition: FixedHash.h:393
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::TransactionReceipt
Definition: TransactionReceipt.h:40
dev
Definition: Address.cpp:21
dev::eth::TransactionBase::nonce
u256 nonce() const
Definition: TransactionBase.h:136
dev::eth::Block::info
BlockHeader const & info() const
Get the header information on the present block.
Definition: Block.h:273
dev::eth::ExecutionResult
Description of the result of executing a transaction.
Definition: Transaction.h:71
dev::eth::LocalisedTransactionReceipt
Definition: TransactionReceipt.h:74
dev::eth::LogFilter::latest
h256 latest() const
hash of latest block which should be filtered
Definition: LogFilter.h:62
dev::eth::ExecutionResult::excepted
TransactionException excepted
Definition: Transaction.h:73
dev::eth::LogFilter::isRangeFilter
bool isRangeFilter() const
Definition: LogFilter.cpp:49
dev::eth::State::execute
std::pair< ExecutionResult, TransactionReceipt > execute(EnvInfo const &_envInfo, SealEngineFace const &_sealEngine, Transaction const &_t, Permanence _p=Permanence::Committed, OnOpFunc const &_onOp=OnOpFunc())
Definition: State.cpp:598
dev::eth::LocalisedLogEntry
Definition: LogEntry.h:54
dev::eth::EVMSchedule
Definition: EVMSchedule.h:29
dev::eth::EnvInfo
Definition: ExtVMFace.h:143
dev::RLP
Definition: RLP.h:48
dev::eth::TransactionBase::forceSender
void forceSender(Address const &_a)
Force the sender to a particular value. This will result in an invalid transaction RLP.
Definition: TransactionBase.h:87
dev::eth::ExecutionResult::codeDeposit
CodeDeposit codeDeposit
Failed if an attempted deposit failed due to lack of gas.
Definition: Transaction.h:76
dev::eth::LogFilter::sha3
h256 sha3() const
Definition: LogFilter.cpp:42
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
State.h
dev::eth::TransactionHashes
h256s TransactionHashes
Definition: BlockChain.h:80