Ethereum  PoC-8
The C++ Implementation of Ethereum
ChainParams.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 */
22 #include "ChainParams.h"
23 #include "Account.h"
24 #include "GenesisInfo.h"
25 #include "State.h"
26 #include "ValidationSchemes.h"
28 #include <libdevcore/JsonUtils.h>
29 #include <libdevcore/Log.h>
30 #include <libdevcore/TrieDB.h>
31 #include <libethcore/BlockHeader.h>
32 #include <libethcore/Precompiled.h>
33 #include <libethcore/SealEngine.h>
34 
35 using namespace std;
36 using namespace dev;
37 using namespace eth;
38 using namespace eth::validation;
39 namespace js = json_spirit;
40 
41 ChainParams::ChainParams()
42 {
43  for (unsigned i = 1; i <= 4; ++i)
44  genesisState[Address(i)] = Account(0, 1);
45  // Setup default precompiled contracts as equal to genesis of Frontier.
46  precompiled.insert(make_pair(Address(1), PrecompiledContract(3000, 0, PrecompiledRegistrar::executor("ecrecover"))));
47  precompiled.insert(make_pair(Address(2), PrecompiledContract(60, 12, PrecompiledRegistrar::executor("sha256"))));
48  precompiled.insert(make_pair(Address(3), PrecompiledContract(600, 120, PrecompiledRegistrar::executor("ripemd160"))));
49  precompiled.insert(make_pair(Address(4), PrecompiledContract(15, 3, PrecompiledRegistrar::executor("identity"))));
50 }
51 
52 ChainParams::ChainParams(string const& _json, h256 const& _stateRoot)
53 {
54  *this = loadConfig(_json, _stateRoot);
55 }
56 
57 ChainParams ChainParams::loadConfig(
58  string const& _json, h256 const& _stateRoot, const boost::filesystem::path& _configPath) const
59 {
60  ChainParams cp(*this);
61  js::mValue val;
62 
63  try
64  {
65  js::read_string_or_throw(_json, val);
66  }
67  catch (js::Error_position const& error)
68  {
69  std::string const comment = "json parsing error detected on line " +
70  std::to_string(error.line_) + " in column " +
71  std::to_string(error.column_) + ": " + error.reason_;
72  std::cerr << comment << "\n";
73  BOOST_THROW_EXCEPTION(SyntaxError() << errinfo_comment(comment));
74  }
75 
76  js::mObject obj = val.get_obj();
77 
78  validateConfigJson(obj);
79 
80  // params
81  cp.sealEngineName = obj[c_sealEngine].get_str();
82  js::mObject params = obj[c_params].get_obj();
83 
84  // Params that are not required and could be set to default value
85  if (params.count(c_accountStartNonce))
86  cp.accountStartNonce = fromBigEndian<u256>(fromHex(params[c_accountStartNonce].get_str()));
87  if (params.count(c_maximumExtraDataSize))
89  fromBigEndian<u256>(fromHex(params[c_maximumExtraDataSize].get_str()));
90 
91  cp.tieBreakingGas = params.count(c_tieBreakingGas) ? params[c_tieBreakingGas].get_bool() : true;
92  if (params.count(c_blockReward))
93  cp.setBlockReward(fromBigEndian<u256>(fromHex(params[c_blockReward].get_str())));
94 
95  auto setOptionalU256Parameter = [&params](u256 &_destination, string const& _name)
96  {
97  if (params.count(_name))
98  _destination = fromBigEndian<u256>(fromHex(params.at(_name).get_str()));
99  };
100  setOptionalU256Parameter(cp.minGasLimit, c_minGasLimit);
101  setOptionalU256Parameter(cp.maxGasLimit, c_maxGasLimit);
102  setOptionalU256Parameter(cp.gasLimitBoundDivisor, c_gasLimitBoundDivisor);
103  setOptionalU256Parameter(cp.homesteadForkBlock, c_homesteadForkBlock);
104  setOptionalU256Parameter(cp.EIP150ForkBlock, c_EIP150ForkBlock);
105  setOptionalU256Parameter(cp.EIP158ForkBlock, c_EIP158ForkBlock);
106  setOptionalU256Parameter(cp.byzantiumForkBlock, c_byzantiumForkBlock);
107  setOptionalU256Parameter(cp.eWASMForkBlock, c_eWASMForkBlock);
108  setOptionalU256Parameter(cp.constantinopleForkBlock, c_constantinopleForkBlock);
109  setOptionalU256Parameter(cp.constantinopleFixForkBlock, c_constantinopleFixForkBlock);
110  setOptionalU256Parameter(cp.daoHardforkBlock, c_daoHardforkBlock);
111  setOptionalU256Parameter(cp.experimentalForkBlock, c_experimentalForkBlock);
112  setOptionalU256Parameter(cp.minimumDifficulty, c_minimumDifficulty);
113  setOptionalU256Parameter(cp.difficultyBoundDivisor, c_difficultyBoundDivisor);
114  setOptionalU256Parameter(cp.durationLimit, c_durationLimit);
115 
116  if (params.count(c_chainID))
117  cp.chainID = int(fromBigEndian<u256>(fromHex(params.at(c_chainID).get_str())));
118  if (params.count(c_networkID))
119  cp.networkID = int(fromBigEndian<u256>(fromHex(params.at(c_networkID).get_str())));
120  cp.allowFutureBlocks = params.count(c_allowFutureBlocks);
121 
122  // genesis
123  string genesisStr = js::write_string(obj[c_genesis], false);
124  cp = cp.loadGenesis(genesisStr, _stateRoot);
125  // genesis state
126  string genesisStateStr = js::write_string(obj[c_accounts], false);
127 
129  genesisStateStr, cp.accountStartNonce, nullptr, &cp.precompiled, _configPath);
130 
131  cp.stateRoot = _stateRoot ? _stateRoot : cp.calculateStateRoot(true);
132  return cp;
133 }
134 
135 ChainParams ChainParams::loadGenesis(string const& _json, h256 const& _stateRoot) const
136 {
137  ChainParams cp(*this);
138 
139  js::mValue val;
140  js::read_string(_json, val);
141  js::mObject genesis = val.get_obj();
142 
143  cp.parentHash = h256(0); // required by the YP
144  cp.author = genesis.count(c_coinbase) ? h160(genesis[c_coinbase].get_str()) : h160(genesis[c_author].get_str());
145  cp.difficulty = genesis.count(c_difficulty) ?
146  u256(fromBigEndian<u256>(fromHex(genesis[c_difficulty].get_str()))) :
147  cp.minimumDifficulty;
148  cp.gasLimit = u256(fromBigEndian<u256>(fromHex(genesis[c_gasLimit].get_str())));
149  cp.gasUsed = genesis.count(c_gasUsed) ? u256(fromBigEndian<u256>(fromHex(genesis[c_gasUsed].get_str()))) : 0;
150  cp.timestamp = u256(fromBigEndian<u256>(fromHex(genesis[c_timestamp].get_str())));
151  cp.extraData = bytes(fromHex(genesis[c_extraData].get_str()));
152 
153  // magic code for handling ethash stuff:
154  if (genesis.count(c_mixHash) && genesis.count(c_nonce))
155  {
156  h256 mixHash(genesis[c_mixHash].get_str());
157  h64 nonce(genesis[c_nonce].get_str());
158  cp.sealFields = 2;
159  cp.sealRLP = rlp(mixHash) + rlp(nonce);
160  }
161  cp.stateRoot = _stateRoot ? _stateRoot : cp.calculateStateRoot();
162  return cp;
163 }
164 
165 SealEngineFace* ChainParams::createSealEngine()
166 {
167  SealEngineFace* ret = SealEngineRegistrar::create(sealEngineName);
168  assert(ret && "Seal engine not found");
169  if (!ret)
170  return nullptr;
171  ret->setChainParams(*this);
172  if (sealRLP.empty())
173  {
174  sealFields = ret->sealFields();
175  sealRLP = ret->sealRLP();
176  }
177  return ret;
178 }
179 
180 void ChainParams::populateFromGenesis(bytes const& _genesisRLP, AccountMap const& _state)
181 {
182  BlockHeader bi(_genesisRLP, RLP(&_genesisRLP)[0].isList() ? BlockData : HeaderData);
183  parentHash = bi.parentHash();
184  author = bi.author();
185  difficulty = bi.difficulty();
186  gasLimit = bi.gasLimit();
187  gasUsed = bi.gasUsed();
188  timestamp = bi.timestamp();
189  extraData = bi.extraData();
190  genesisState = _state;
191  RLP r(_genesisRLP);
192  sealFields = r[0].itemCount() - BlockHeader::BasicFields;
193  sealRLP.clear();
194  for (unsigned i = BlockHeader::BasicFields; i < r[0].itemCount(); ++i)
195  sealRLP += r[0][i].data();
196 
197  calculateStateRoot(true);
198 
199  auto b = genesisBlock();
200  if (b != _genesisRLP)
201  {
202  cdebug << "Block passed:" << bi.hash() << bi.hash(WithoutSeal);
203  cdebug << "Genesis now:" << BlockHeader::headerHashFromBlock(b);
204  cdebug << RLP(b);
205  cdebug << RLP(_genesisRLP);
206  throw 0;
207  }
208 }
209 
210 h256 ChainParams::calculateStateRoot(bool _force) const
211 {
212  StateCacheDB db;
214  state.init();
215  if (!stateRoot || _force)
216  {
217  // TODO: use hash256
218  //stateRoot = hash256(toBytesMap(gs));
220  stateRoot = state.root();
221  }
222  return stateRoot;
223 }
224 
225 bytes ChainParams::genesisBlock() const
226 {
227  RLPStream block(3);
228 
229  calculateStateRoot();
230 
231  block.appendList(BlockHeader::BasicFields + sealFields)
232  << parentHash
233  << EmptyListSHA3 // sha3(uncles)
234  << author
235  << stateRoot
236  << EmptyTrie // transactions
237  << EmptyTrie // receipts
238  << LogBloom()
239  << difficulty
240  << 0 // number
241  << gasLimit
242  << gasUsed // gasUsed
243  << timestamp
244  << extraData;
245  block.appendRaw(sealRLP, sealFields);
246  block.appendRaw(RLPEmptyList);
247  block.appendRaw(RLPEmptyList);
248  return block.out();
249 }
dev::eth::ChainOperationParams::durationLimit
u256 durationLimit
Definition: ChainOperationParams.h:104
dev::eth::validation::c_networkID
string const c_networkID
Definition: ValidationSchemes.cpp:73
dev::eth::ChainOperationParams::allowFutureBlocks
bool allowFutureBlocks
Definition: ChainOperationParams.h:105
dev::eth::validation::c_allowFutureBlocks
string const c_allowFutureBlocks
Definition: ValidationSchemes.cpp:74
dev::eth::validation::c_minGasLimit
string const c_minGasLimit
Definition: ValidationSchemes.cpp:53
dev::EmptyTrie
h256 const EmptyTrie
Definition: TrieCommon.cpp:28
dev::eth::validation::c_maximumExtraDataSize
string const c_maximumExtraDataSize
Definition: ValidationSchemes.cpp:66
dev::eth::ChainOperationParams::difficultyBoundDivisor
u256 difficultyBoundDivisor
Definition: ChainOperationParams.h:103
dev::eth::validation::c_experimentalForkBlock
string const c_experimentalForkBlock
Definition: ValidationSchemes.cpp:64
dev::eth::validation::c_extraData
string const c_extraData
Definition: ValidationSchemes.cpp:43
dev::eth::HeaderData
@ HeaderData
Definition: BlockHeader.h:69
dev::eth::SealEngineFace::sealRLP
virtual bytes sealRLP() const
Definition: SealEngine.h:58
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::PrecompiledContract
Definition: ChainOperationParams.h:36
dev::eth::validation::c_genesis
string const c_genesis
Definition: ValidationSchemes.cpp:32
JsonSpiritHeaders.h
dev::eth::ChainOperationParams::gasLimitBoundDivisor
u256 gasLimitBoundDivisor
Definition: ChainOperationParams.h:89
dev::eth::ChainParams
Definition: ChainParams.h:38
dev::eth::SealEngineFace::setChainParams
void setChainParams(ChainOperationParams const &_params)
Definition: SealEngine.h:81
dev::h160
FixedHash< 20 > h160
Definition: FixedHash.h:357
GenesisInfo.h
dev::eth::genesisState
std::unordered_map< Address, Account > const & genesisState()
dev::eth::validation::c_accounts
string const c_accounts
Definition: ValidationSchemes.cpp:33
dev::eth::ChainOperationParams::experimentalForkBlock
u256 experimentalForkBlock
Definition: ChainOperationParams.h:98
dev::h256
FixedHash< 32 > h256
Definition: FixedHash.h:356
dev::eth::validation::c_constantinopleFixForkBlock
string const c_constantinopleFixForkBlock
Definition: ValidationSchemes.cpp:63
dev::eth::validation::c_params
string const c_params
Definition: ValidationSchemes.cpp:31
dev::eth::validation::c_durationLimit
string const c_durationLimit
Definition: ValidationSchemes.cpp:71
dev::RLPStream::out
bytes const & out() const
Read the byte stream.
Definition: RLP.h:419
dev::eth::AccountMap
std::unordered_map< Address, Account > AccountMap
Definition: Account.h:267
dev::eth::commit
AddressHash commit(AccountMap const &_cache, SecureTrieDB< Address, DB > &_state)
Definition: State.cpp:759
dev::eth::ChainOperationParams::maxGasLimit
u256 maxGasLimit
Definition: ChainOperationParams.h:88
dev::eth::ChainOperationParams::homesteadForkBlock
u256 homesteadForkBlock
Definition: ChainOperationParams.h:90
dev::eth::BlockData
@ BlockData
Definition: BlockHeader.h:70
dev::eth::ChainParams::calculateStateRoot
h256 calculateStateRoot(bool _force=false) const
Definition: ChainParams.cpp:210
dev::eth::validation::c_byzantiumForkBlock
string const c_byzantiumForkBlock
Definition: ValidationSchemes.cpp:60
BlockHeader.h
dev::rlp
bytes rlp(_T _t)
Export a single item in RLP format, returning a byte array.
Definition: RLP.h:453
dev::eth::ChainOperationParams::daoHardforkBlock
u256 daoHardforkBlock
Definition: ChainOperationParams.h:97
dev::eth::ChainOperationParams::EIP158ForkBlock
u256 EIP158ForkBlock
Definition: ChainOperationParams.h:92
dev::eth::validation::c_sealEngine
string const c_sealEngine
Definition: ValidationSchemes.cpp:30
dev::FixedHash< 32 >
dev::eth::validation::c_constantinopleForkBlock
string const c_constantinopleForkBlock
Definition: ValidationSchemes.cpp:62
dev::eth::ChainOperationParams::sealEngineName
std::string sealEngineName
The chain sealer name: e.g. Ethash, NoProof, BasicAuthority.
Definition: ChainOperationParams.h:75
dev::eth::validation::c_gasLimitBoundDivisor
string const c_gasLimitBoundDivisor
Definition: ValidationSchemes.cpp:55
dev::eth::jsonToAccountMap
AccountMap jsonToAccountMap(std::string const &_json, u256 const &_defaultNonce=0, AccountMaskMap *o_mask=nullptr, PrecompiledContractMap *o_precompiled=nullptr, const boost::filesystem::path &_configPath={})
dev::eth::validation::c_maxGasLimit
string const c_maxGasLimit
Definition: ValidationSchemes.cpp:54
dev::eth::SealEngineFace::sealFields
virtual unsigned sealFields() const
Definition: SealEngine.h:57
dev::eth::ChainOperationParams::constantinopleFixForkBlock
u256 constantinopleFixForkBlock
Definition: ChainOperationParams.h:96
dev::eth::LogBloom
h2048 LogBloom
The log bloom's size (2048-bit).
Definition: Common.h:50
dev::eth::validation::c_gasLimit
string const c_gasLimit
Definition: ValidationSchemes.cpp:40
dev::eth::validation::validateConfigJson
void validateConfigJson(js::mObject const &_obj)
Definition: ValidationSchemes.cpp:76
TrieDB.h
dev::eth::ChainOperationParams::EIP150ForkBlock
u256 EIP150ForkBlock
Definition: ChainOperationParams.h:91
dev::eth::validation::c_mixHash
string const c_mixHash
Definition: ValidationSchemes.cpp:44
dev::eth::ChainOperationParams::networkID
int networkID
Definition: ChainOperationParams.h:100
dev::eth::validation::c_nonce
string const c_nonce
Definition: ValidationSchemes.cpp:39
ValidationSchemes.h
dev::bytes
std::vector< byte > bytes
Definition: Common.h:72
dev::eth::ChainOperationParams::chainID
int chainID
Definition: ChainOperationParams.h:99
SealEngine.h
dev::eth::validation::c_tieBreakingGas
string const c_tieBreakingGas
Definition: ValidationSchemes.cpp:67
JsonUtils.h
dev::eth::validation::c_EIP158ForkBlock
string const c_EIP158ForkBlock
Definition: ValidationSchemes.cpp:59
cdebug
#define cdebug
dev::eth::ChainOperationParams::maximumExtraDataSize
u256 maximumExtraDataSize
Definition: ChainOperationParams.h:84
dev::eth::validation::c_EIP150ForkBlock
string const c_EIP150ForkBlock
Definition: ValidationSchemes.cpp:58
dev::RLPStream
Class for writing to an RLP bytestream.
Definition: RLP.h:370
dev::eth::ChainOperationParams::minimumDifficulty
u256 minimumDifficulty
Definition: ChainOperationParams.h:102
Precompiled.h
dev::eth::validation::c_gasUsed
string const c_gasUsed
Definition: ValidationSchemes.cpp:49
dev::eth::ChainOperationParams::constantinopleForkBlock
u256 constantinopleForkBlock
Definition: ChainOperationParams.h:95
ChainParams.h
dev::eth::ChainOperationParams::precompiled
std::unordered_map< Address, PrecompiledContract > precompiled
Precompiled contracts as specified in the chain params.
Definition: ChainOperationParams.h:108
dev::eth::ChainOperationParams::byzantiumForkBlock
u256 byzantiumForkBlock
Definition: ChainOperationParams.h:93
std
Definition: FixedHash.h:393
dev::eth::ChainOperationParams::tieBreakingGas
bool tieBreakingGas
Definition: ChainOperationParams.h:86
dev::eth::ChainOperationParams::setBlockReward
void setBlockReward(u256 const &_newBlockReward)
Definition: ChainOperationParams.cpp:86
dev::eth::validation::c_minimumDifficulty
string const c_minimumDifficulty
Definition: ValidationSchemes.cpp:70
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::StateCacheDB
Definition: StateCacheDB.h:27
dev::eth::validation::c_daoHardforkBlock
string const c_daoHardforkBlock
Definition: ValidationSchemes.cpp:57
dev::eth::validation::c_blockReward
string const c_blockReward
Definition: ValidationSchemes.cpp:68
dev::eth::validation::c_accountStartNonce
string const c_accountStartNonce
Definition: ValidationSchemes.cpp:65
dev
Definition: Address.cpp:21
dev::eth::ChainOperationParams::eWASMForkBlock
u256 eWASMForkBlock
Definition: ChainOperationParams.h:94
dev::EmptyListSHA3
h256 const EmptyListSHA3
Definition: SHA3.cpp:26
dev::eth::ChainOperationParams::minGasLimit
u256 minGasLimit
Definition: ChainOperationParams.h:87
dev::eth::validation::c_eWASMForkBlock
string const c_eWASMForkBlock
Definition: ValidationSchemes.cpp:61
dev::RLPStream::appendRaw
RLPStream & appendRaw(bytesConstRef _rlp, size_t _itemCount=1)
Appends raw (pre-serialised) RLP data. Use with caution.
Definition: RLP.cpp:222
dev::eth::validation::c_author
string const c_author
Definition: ValidationSchemes.cpp:37
Account.h
dev::eth::ChainParams::stateRoot
h256 stateRoot
Only pre-populate if known equivalent to genesisState's root. If they're different Bad Things Will Ha...
Definition: ChainParams.h:55
dev::eth::validation::c_coinbase
string const c_coinbase
Definition: ValidationSchemes.cpp:38
dev::eth::validation::c_chainID
string const c_chainID
Definition: ValidationSchemes.cpp:72
dev::RLP
Definition: RLP.h:48
dev::RLPEmptyList
bytes RLPEmptyList
The empty list in RLP format.
Definition: RLP.cpp:23
dev::eth::validation::c_difficulty
string const c_difficulty
Definition: ValidationSchemes.cpp:42
dev::Address
h160 Address
Definition: Address.h:30
dev::eth::validation::c_homesteadForkBlock
string const c_homesteadForkBlock
Definition: ValidationSchemes.cpp:56
Log.h
dev::SpecificTrieDB
Definition: TrieDB.h:318
dev::fromHex
bytes fromHex(std::string const &_s, WhenError _throw=WhenError::DontThrow)
Definition: CommonData.cpp:81
dev::eth::validation::c_difficultyBoundDivisor
string const c_difficultyBoundDivisor
Definition: ValidationSchemes.cpp:69
dev::eth::Account
Definition: Account.h:57
dev::RLPStream::appendList
RLPStream & appendList(size_t _items)
Appends a list.
Definition: RLP.cpp:268
dev::errinfo_comment
boost::error_info< struct tag_comment, std::string > errinfo_comment
Definition: Assertions.h:69
dev::eth::ChainParams::genesisState
AccountMap genesisState
Definition: ChainParams.h:56
State.h
dev::eth::WithoutSeal
@ WithoutSeal
Definition: BlockHeader.h:41
dev::eth::ChainOperationParams::accountStartNonce
u256 accountStartNonce
Definition: ChainOperationParams.h:85
dev::eth::validation::c_timestamp
string const c_timestamp
Definition: ValidationSchemes.cpp:41