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 
51  virtual std::tuple<h256, h256, h256> getWork(BlockHeader const&)
52  {
53  return std::tuple<h256, h256, h256>{};
54  }
55  virtual bool isMining() const { return false; }
56  virtual unsigned revision() const { return 0; }
57  virtual unsigned sealFields() const { return 0; }
58  virtual bytes sealRLP() const { return bytes(); }
59  virtual StringHashMap jsInfo(BlockHeader const&) const { return StringHashMap(); }
60 
62  virtual void verify(Strictness _s, BlockHeader const& _bi, BlockHeader const& _parent = BlockHeader(), bytesConstRef _block = bytesConstRef()) const;
64  virtual void verifyTransaction(ImportRequirements::value _ir, TransactionBase const& _t, BlockHeader const& _header, u256 const& _startGasUsed) const;
66  virtual void populateFromParent(BlockHeader& _bi, BlockHeader const& _parent) const;
67 
68  bytes option(std::string const& _name) const { Guard l(x_options); return m_options.count(_name) ? m_options.at(_name) : bytes(); }
69  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; }
70 
71  virtual strings sealers() const { return { "default" }; }
72  virtual std::string sealer() const { return "default"; }
73  virtual void setSealer(std::string const&) {}
74 
75  virtual bool shouldSeal(Interface*) { return true; }
76  virtual void generateSeal(BlockHeader const& _bi) = 0;
77  virtual void onSealGenerated(std::function<void(bytes const& s)> const& _f) = 0;
78  virtual void cancelGeneration() {}
79 
80  ChainOperationParams const& chainParams() const { return m_params; }
81  void setChainParams(ChainOperationParams const& _params) { m_params = _params; }
82  SealEngineFace* withChainParams(ChainOperationParams const& _params) { setChainParams(_params); return this; }
83  virtual EVMSchedule const& evmSchedule(u256 const& _blockNumber) const = 0;
84  virtual u256 blockReward(u256 const& _blockNumber) const = 0;
85 
86  virtual bool isPrecompiled(Address const& _a, u256 const& _blockNumber) const
87  {
88  return m_params.precompiled.count(_a) != 0 && _blockNumber >= m_params.precompiled.at(_a).startingBlock();
89  }
90  virtual bigint costOfPrecompiled(Address const& _a, bytesConstRef _in, u256 const&) const { return m_params.precompiled.at(_a).cost(_in); }
91  virtual std::pair<bool, bytes> executePrecompiled(Address const& _a, bytesConstRef _in, u256 const&) const { return m_params.precompiled.at(_a).execute(_in); }
92 
93 protected:
94  virtual bool onOptionChanging(std::string const&, bytes const&) { return true; }
95 
96 private:
97  mutable Mutex x_options;
98  std::unordered_map<std::string, bytes> m_options;
99 
100  ChainOperationParams m_params;
101 };
102 
104 {
105 public:
106  enum
107  {
109  NonceField = 1
110  };
111  void onSealGenerated(std::function<void(bytes const&)> const& _f) override { m_onSealGenerated = _f; }
112  EVMSchedule const& evmSchedule(u256 const& _blockNumber) const override;
113  u256 blockReward(u256 const& _blockNumber) const override;
114 
115 protected:
116  std::function<void(bytes const& s)> m_onSealGenerated;
117 };
118 
119 using SealEngineFactory = std::function<SealEngineFace*()>;
120 
122 {
123 public:
126  static SealEngineFace* create(ChainOperationParams const& _params);
127  static SealEngineFace* create(std::string const& _name) { if (!get()->m_sealEngines.count(_name)) return nullptr; return get()->m_sealEngines[_name](); }
128 
129  template <class SealEngine> static SealEngineFactory registerSealEngine(std::string const& _name) { return (get()->m_sealEngines[_name] = [](){return new SealEngine;}); }
130  static void unregisterSealEngine(std::string const& _name) { get()->m_sealEngines.erase(_name); }
131 
132 private:
133  static SealEngineRegistrar* get() { if (!s_this) s_this = new SealEngineRegistrar; return s_this; }
134 
135  std::unordered_map<std::string, SealEngineFactory> m_sealEngines;
136  static SealEngineRegistrar* s_this;
137 };
138 
139 #define ETH_REGISTER_SEAL_ENGINE(Name) static SealEngineFactory __eth_registerSealEngineFactory ## Name = SealEngineRegistrar::registerSealEngine<Name>(#Name)
140 
142 {
143 public:
144  static std::string name() { return "NoProof"; }
145  static void init();
146  void generateSeal(BlockHeader const& _bi) override;
147  void populateFromParent(BlockHeader& _bi, BlockHeader const& _parent) const override;
148  void verify(Strictness _s, BlockHeader const& _bi, BlockHeader const& _parent, bytesConstRef _block) const override;
149  StringHashMap jsInfo(BlockHeader const& _bi) const override;
150 };
151 
153  ChainOperationParams const& _chainParams, BlockHeader const& _bi, BlockHeader const& _parent);
154 
155 u256 calculateGasLimit(ChainOperationParams const& _chainParams, BlockHeader const& _bi,
156  u256 const& _gasFloorTarget = Invalid256);
157 }
158 }
dev::eth::SealEngineFace::getWork
virtual std::tuple< h256, h256, h256 > getWork(BlockHeader const &)
Definition: SealEngine.h:51
dev::eth::SealEngineFace::sealer
virtual std::string sealer() const
Definition: SealEngine.h:72
dev::eth::SealEngineBase::m_onSealGenerated
std::function< void(bytes const &s)> m_onSealGenerated
Definition: SealEngine.h:116
dev::eth::SealEngineFace::sealRLP
virtual bytes sealRLP() const
Definition: SealEngine.h:58
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::SealEngineRegistrar::create
static SealEngineFace * create(std::string const &_name)
Definition: SealEngine.h:127
dev::eth::SealEngineFace::verify
virtual void verify(Strictness _s, BlockHeader const &_bi, BlockHeader const &_parent=BlockHeader(), bytesConstRef _block=bytesConstRef()) const
Don't forget to call Super::verify when subclassing & overriding.
Definition: SealEngine.cpp:71
dev::eth::SealEngineFactory
std::function< SealEngineFace *()> SealEngineFactory
Definition: SealEngine.h:119
dev::eth::SealEngineBase::MixHashField
@ MixHashField
Definition: SealEngine.h:108
dev::eth::SealEngineFace::isMining
virtual bool isMining() const
Definition: SealEngine.h:55
dev::eth::SealEngineFace::setChainParams
void setChainParams(ChainOperationParams const &_params)
Definition: SealEngine.h:81
dev::Guard
std::lock_guard< std::mutex > Guard
Definition: Guards.h:41
dev::eth::SealEngineBase
Definition: SealEngine.h:104
dev::eth::TransactionBase
Encodes a transaction, ready to be exported to or freshly imported from RLP.
Definition: TransactionBase.h:50
dev::eth::SealEngineRegistrar
Definition: SealEngine.h:122
dev::eth::NoProof::generateSeal
void generateSeal(BlockHeader const &_bi) override
Definition: SealEngine.cpp:41
dev::eth::ImportRequirements::value
unsigned value
Definition: Common.h:112
dev::eth::NoProof
Definition: SealEngine.h:142
dev::eth::SealEngineBase::NonceField
@ NonceField
Definition: SealEngine.h:109
dev::eth::SealEngineFace::setSealer
virtual void setSealer(std::string const &)
Definition: SealEngine.h:73
dev::eth::SealEngineFace::chainParams
ChainOperationParams const & chainParams() const
Definition: SealEngine.h:80
dev::eth::SealEngineBase::evmSchedule
EVMSchedule const & evmSchedule(u256 const &_blockNumber) const override
Definition: SealEngine.cpp:172
BlockHeader.h
dev::eth::SealEngineRegistrar::unregisterSealEngine
static void unregisterSealEngine(std::string const &_name)
Definition: SealEngine.h:130
dev::FixedHash< 20 >
dev::eth::SealEngineFace::option
bytes option(std::string const &_name) const
Definition: SealEngine.h:68
dev::eth::SealEngineFace::verifyTransaction
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:131
Common.h
dev::eth::SealEngineFace::sealFields
virtual unsigned sealFields() const
Definition: SealEngine.h:57
dev::eth::SealEngineFace::blockReward
virtual u256 blockReward(u256 const &_blockNumber) const =0
dev::eth::SealEngineRegistrar::create
static SealEngineFace * create(ChainOperationParams const &_params)
Definition: SealEngine.cpp:163
dev::eth::SealEngineRegistrar::registerSealEngine
static SealEngineFactory registerSealEngine(std::string const &_name)
Definition: SealEngine.h:129
dev::eth::NoProof::populateFromParent
void populateFromParent(BlockHeader &_bi, BlockHeader const &_parent) const override
Don't forget to call Super::populateFromParent when subclassing & overriding.
Definition: SealEngine.cpp:34
dev::eth::SealEngineFace::costOfPrecompiled
virtual bigint costOfPrecompiled(Address const &_a, bytesConstRef _in, u256 const &) const
Definition: SealEngine.h:90
dev::bytes
std::vector< byte > bytes
Definition: Common.h:72
dev::eth::SealEngineFace::jsInfo
virtual StringHashMap jsInfo(BlockHeader const &) const
Definition: SealEngine.h:59
dev::eth::NoProof::verify
void verify(Strictness _s, BlockHeader const &_bi, BlockHeader const &_parent, bytesConstRef _block) const override
Don't forget to call Super::verify when subclassing & overriding.
Definition: SealEngine.cpp:52
dev::bytesConstRef
vector_ref< byte const > bytesConstRef
Definition: Common.h:74
dev::eth::SealEngineFace::populateFromParent
virtual void populateFromParent(BlockHeader &_bi, BlockHeader const &_parent) const
Don't forget to call Super::populateFromParent when subclassing & overriding.
Definition: SealEngine.cpp:126
dev::eth::SealEngineFace::cancelGeneration
virtual void cancelGeneration()
Definition: SealEngine.h:78
dev::eth::calculateEthashDifficulty
u256 calculateEthashDifficulty(ChainOperationParams const &_chainParams, BlockHeader const &_bi, BlockHeader const &_parent)
Definition: SealEngine.cpp:183
dev::eth::SealEngineFace::generateSeal
virtual void generateSeal(BlockHeader const &_bi)=0
dev::eth::SealEngineFace::revision
virtual unsigned revision() const
Definition: SealEngine.h:56
dev::eth::SealEngineFace::isPrecompiled
virtual bool isPrecompiled(Address const &_a, u256 const &_blockNumber) const
Definition: SealEngine.h:86
dev::eth::Interface
Main API hub for interfacing with Ethereum.
Definition: Interface.h:68
dev::Invalid256
constexpr u256 Invalid256
Definition: Common.h:147
dev::eth::SealEngineFace::shouldSeal
virtual bool shouldSeal(Interface *)
Definition: SealEngine.h:75
dev::Mutex
std::mutex Mutex
Definition: Guards.h:37
dev::eth::NoProof::name
static std::string name()
Definition: SealEngine.h:144
dev::strings
std::vector< std::string > strings
Definition: Common.h:143
dev::eth::NoProof::init
static void init()
Definition: SealEngine.cpp:29
dev::bigint
boost::multiprecision::number< boost::multiprecision::cpp_int_backend<> > bigint
Definition: Common.h:118
dev::eth::SealEngineFace::executePrecompiled
virtual std::pair< bool, bytes > executePrecompiled(Address const &_a, bytesConstRef _in, u256 const &) const
Definition: SealEngine.h:91
dev::eth::NoProof::jsInfo
StringHashMap jsInfo(BlockHeader const &_bi) const override
Definition: SealEngine.cpp:66
dev::eth::SealEngineFace::sealers
virtual strings sealers() const
Definition: SealEngine.h:71
dev::eth::SealEngineFace::onOptionChanging
virtual bool onOptionChanging(std::string const &, bytes const &)
Definition: SealEngine.h:94
dev::eth::ChainOperationParams::precompiled
std::unordered_map< Address, PrecompiledContract > precompiled
Precompiled contracts as specified in the chain params.
Definition: ChainOperationParams.h:108
dev::eth::SealEngineFace::onSealGenerated
virtual void onSealGenerated(std::function< void(bytes const &s)> const &_f)=0
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::SealEngineFace::~SealEngineFace
virtual ~SealEngineFace()
Definition: SealEngine.h:48
dev::eth::SealEngineFace::withChainParams
SealEngineFace * withChainParams(ChainOperationParams const &_params)
Definition: SealEngine.h:82
dev
Definition: Address.cpp:21
Guards.h
dev::StringHashMap
std::unordered_map< std::string, std::string > StringHashMap
Definition: Common.h:139
dev::eth::SealEngineFace::setOption
bool setOption(std::string const &_name, bytes const &_value)
Definition: SealEngine.h:69
dev::eth::Strictness
Strictness
Definition: BlockHeader.h:47
dev::eth::SealEngineFace::evmSchedule
virtual EVMSchedule const & evmSchedule(u256 const &_blockNumber) const =0
dev::eth::SealEngineBase::onSealGenerated
void onSealGenerated(std::function< void(bytes const &)> const &_f) override
Definition: SealEngine.h:111
dev::eth::EVMSchedule
Definition: EVMSchedule.h:29
dev::eth::ChainOperationParams
Definition: ChainOperationParams.h:69
dev::eth::SealEngineBase::blockReward
u256 blockReward(u256 const &_blockNumber) const override
Definition: SealEngine.cpp:177
RLP.h
dev::eth::calculateGasLimit
u256 calculateGasLimit(ChainOperationParams const &_chainParams, BlockHeader const &_bi, u256 const &_gasFloorTarget)
Definition: SealEngine.cpp:241