Ethereum  PoC-8
The C++ Implementation of Ethereum
SealEngine.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 */
24 #pragma once
25 
26 #include <functional>
27 #include <unordered_map>
28 #include <libdevcore/Guards.h>
29 #include <libdevcore/RLP.h>
30 #include "BlockHeader.h"
31 #include "Common.h"
32 
33 namespace dev
34 {
35 namespace eth
36 {
37 
38 class BlockHeader;
39 struct ChainOperationParams;
40 class Interface;
41 class PrecompiledFace;
42 class TransactionBase;
43 class EnvInfo;
44 
46 {
47 public:
48  virtual ~SealEngineFace() {}
49 
50  virtual unsigned revision() const { return 0; }
51  virtual unsigned sealFields() const { return 0; }
52  virtual bytes sealRLP() const { return bytes(); }
53  virtual StringHashMap jsInfo(BlockHeader const&) const { return StringHashMap(); }
54 
56  virtual void verify(Strictness _s, BlockHeader const& _bi, BlockHeader const& _parent = BlockHeader(), bytesConstRef _block = bytesConstRef()) const;
58  virtual void verifyTransaction(ImportRequirements::value _ir, TransactionBase const& _t, BlockHeader const& _header, u256 const& _startGasUsed) const;
60  virtual void populateFromParent(BlockHeader& _bi, BlockHeader const& _parent) const;
61 
62  bytes option(std::string const& _name) const { Guard l(x_options); return m_options.count(_name) ? m_options.at(_name) : bytes(); }
63  bool setOption(std::string const& _name, bytes const& _value) { Guard l(x_options); try { if (onOptionChanging(_name, _value)) { m_options[_name] = _value; return true; } } catch (...) {} return false; }
64 
65  virtual strings sealers() const { return { "default" }; }
66  virtual std::string sealer() const { return "default"; }
67  virtual void setSealer(std::string const&) {}
68 
69  virtual bool shouldSeal(Interface*) { return true; }
70  virtual void generateSeal(BlockHeader const& _bi) = 0;
71  virtual void onSealGenerated(std::function<void(bytes const& s)> const& _f) = 0;
72  virtual void cancelGeneration() {}
73 
74  ChainOperationParams const& chainParams() const { return m_params; }
75  void setChainParams(ChainOperationParams const& _params) { m_params = _params; }
76  SealEngineFace* withChainParams(ChainOperationParams const& _params) { setChainParams(_params); return this; }
77  virtual EVMSchedule const& evmSchedule(u256 const& _blockNumber) const = 0;
78  virtual u256 blockReward(u256 const& _blockNumber) const = 0;
79 
80  virtual bool isPrecompiled(Address const& _a, u256 const& _blockNumber) const
81  {
82  return m_params.precompiled.count(_a) != 0 && _blockNumber >= m_params.precompiled.at(_a).startingBlock();
83  }
84  virtual bigint costOfPrecompiled(Address const& _a, bytesConstRef _in, u256 const&) const { return m_params.precompiled.at(_a).cost(_in); }
85  virtual std::pair<bool, bytes> executePrecompiled(Address const& _a, bytesConstRef _in, u256 const&) const { return m_params.precompiled.at(_a).execute(_in); }
86 
87 protected:
88  virtual bool onOptionChanging(std::string const&, bytes const&) { return true; }
89 
90 private:
91  mutable Mutex x_options;
92  std::unordered_map<std::string, bytes> m_options;
93 
94  ChainOperationParams m_params;
95 };
96 
98 {
99 public:
100  enum
101  {
104  };
105  void onSealGenerated(std::function<void(bytes const&)> const& _f) override { m_onSealGenerated = _f; }
106  EVMSchedule const& evmSchedule(u256 const& _blockNumber) const override;
107  u256 blockReward(u256 const& _blockNumber) const override;
108 
109 protected:
110  std::function<void(bytes const& s)> m_onSealGenerated;
111 };
112 
113 using SealEngineFactory = std::function<SealEngineFace*()>;
114 
116 {
117 public:
120  static SealEngineFace* create(ChainOperationParams const& _params);
121  static SealEngineFace* create(std::string const& _name) { if (!get()->m_sealEngines.count(_name)) return nullptr; return get()->m_sealEngines[_name](); }
122 
123  template <class SealEngine> static SealEngineFactory registerSealEngine(std::string const& _name) { return (get()->m_sealEngines[_name] = [](){return new SealEngine;}); }
124  static void unregisterSealEngine(std::string const& _name) { get()->m_sealEngines.erase(_name); }
125 
126 private:
127  static SealEngineRegistrar* get() { if (!s_this) s_this = new SealEngineRegistrar; return s_this; }
128 
129  std::unordered_map<std::string, SealEngineFactory> m_sealEngines;
130  static SealEngineRegistrar* s_this;
131 };
132 
133 #define ETH_REGISTER_SEAL_ENGINE(Name) static SealEngineFactory __eth_registerSealEngineFactory ## Name = SealEngineRegistrar::registerSealEngine<Name>(#Name)
134 
136 {
137 public:
138  static std::string name() { return "NoProof"; }
139  static void init();
140  void generateSeal(BlockHeader const& _bi) override;
141  void populateFromParent(BlockHeader& _bi, BlockHeader const& _parent) const override;
142  void verify(Strictness _s, BlockHeader const& _bi, BlockHeader const& _parent, bytesConstRef _block) const override;
143 };
144 
146  ChainOperationParams const& _chainParams, BlockHeader const& _bi, BlockHeader const& _parent);
147 
148 u256 calculateGasLimit(ChainOperationParams const& _chainParams, BlockHeader const& _bi,
149  u256 const& _gasFloorTarget = Invalid256);
150 }
151 }
virtual unsigned sealFields() const
Definition: SealEngine.h:51
Definition: Address.cpp:20
u256 calculateEthashDifficulty(ChainOperationParams const &_chainParams, BlockHeader const &_bi, BlockHeader const &_parent)
Definition: SealEngine.cpp:177
virtual std::string sealer() const
Definition: SealEngine.h:66
u256 blockReward(u256 const &_blockNumber) const override
Definition: SealEngine.cpp:171
virtual EVMSchedule const & evmSchedule(u256 const &_blockNumber) const =0
virtual std::pair< bool, bytes > executePrecompiled(Address const &_a, bytesConstRef _in, u256 const &) const
Definition: SealEngine.h:85
std::function< SealEngineFace *()> SealEngineFactory
Definition: SealEngine.h:113
virtual StringHashMap jsInfo(BlockHeader const &) const
Definition: SealEngine.h:53
Encapsulation of a block header. Class to contain all of a block header&#39;s data. It is able to parse a...
Definition: BlockHeader.h:96
virtual void populateFromParent(BlockHeader &_bi, BlockHeader const &_parent) const
Don&#39;t forget to call Super::populateFromParent when subclassing & overriding.
Definition: SealEngine.cpp:120
virtual bool isPrecompiled(Address const &_a, u256 const &_blockNumber) const
Definition: SealEngine.h:80
virtual unsigned revision() const
Definition: SealEngine.h:50
virtual void generateSeal(BlockHeader const &_bi)=0
static SealEngineFace * create(std::string const &_name)
Definition: SealEngine.h:121
std::vector< std::string > strings
Definition: Common.h:143
void generateSeal(BlockHeader const &_bi) override
Definition: SealEngine.cpp:40
virtual bytes sealRLP() const
Definition: SealEngine.h:52
SealEngineFace * withChainParams(ChainOperationParams const &_params)
Definition: SealEngine.h:76
boost::multiprecision::number< boost::multiprecision::cpp_int_backend<> > bigint
Definition: Common.h:118
ChainOperationParams const & chainParams() const
Definition: SealEngine.h:74
EVMSchedule const & evmSchedule(u256 const &_blockNumber) const override
Definition: SealEngine.cpp:166
void populateFromParent(BlockHeader &_bi, BlockHeader const &_parent) const override
Don&#39;t forget to call Super::populateFromParent when subclassing & overriding.
Definition: SealEngine.cpp:33
std::lock_guard< std::mutex > Guard
Definition: Guards.h:41
bytes option(std::string const &_name) const
Definition: SealEngine.h:62
static void unregisterSealEngine(std::string const &_name)
Definition: SealEngine.h:124
void onSealGenerated(std::function< void(bytes const &)> const &_f) override
Definition: SealEngine.h:105
void verify(Strictness _s, BlockHeader const &_bi, BlockHeader const &_parent, bytesConstRef _block) const override
Don&#39;t forget to call Super::verify when subclassing & overriding.
Definition: SealEngine.cpp:51
u256 constexpr Invalid256
Definition: Common.h:147
virtual void onSealGenerated(std::function< void(bytes const &s)> const &_f)=0
std::unordered_map< Address, PrecompiledContract > precompiled
Precompiled contracts as specified in the chain params.
std::vector< byte > bytes
Definition: Common.h:72
vector_ref< byte const > bytesConstRef
Definition: Common.h:74
virtual void verifyTransaction(ImportRequirements::value _ir, TransactionBase const &_t, BlockHeader const &_header, u256 const &_startGasUsed) const
Additional verification for transactions in blocks.
Definition: SealEngine.cpp:125
u256 calculateGasLimit(ChainOperationParams const &_chainParams, BlockHeader const &_bi, u256 const &_gasFloorTarget)
Definition: SealEngine.cpp:235
std::unordered_map< std::string, std::string > StringHashMap
Definition: Common.h:139
Main API hub for interfacing with Ethereum.
Definition: Interface.h:67
static std::string name()
Definition: SealEngine.h:138
static SealEngineFace * create(ChainOperationParams const &_params)
Definition: SealEngine.cpp:157
virtual bigint costOfPrecompiled(Address const &_a, bytesConstRef _in, u256 const &) const
Definition: SealEngine.h:84
virtual void setSealer(std::string const &)
Definition: SealEngine.h:67
static SealEngineFactory registerSealEngine(std::string const &_name)
Definition: SealEngine.h:123
boost::multiprecision::number< boost::multiprecision::cpp_int_backend< 256, 256, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void > > u256
Definition: Common.h:121
bool setOption(std::string const &_name, bytes const &_value)
Definition: SealEngine.h:63
static void init()
Definition: SealEngine.cpp:28
std::function< void(bytes const &s)> m_onSealGenerated
Definition: SealEngine.h:110
void setChainParams(ChainOperationParams const &_params)
Definition: SealEngine.h:75
virtual bool shouldSeal(Interface *)
Definition: SealEngine.h:69
virtual strings sealers() const
Definition: SealEngine.h:65
virtual bool onOptionChanging(std::string const &, bytes const &)
Definition: SealEngine.h:88
virtual u256 blockReward(u256 const &_blockNumber) const =0
std::mutex Mutex
Definition: Guards.h:37
virtual void verify(Strictness _s, BlockHeader const &_bi, BlockHeader const &_parent=BlockHeader(), bytesConstRef _block=bytesConstRef()) const
Don&#39;t forget to call Super::verify when subclassing & overriding.
Definition: SealEngine.cpp:65
Encodes a transaction, ready to be exported to or freshly imported from RLP.
virtual void cancelGeneration()
Definition: SealEngine.h:72