Ethereum  PoC-8
The C++ Implementation of Ethereum
ValidationSchemes.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 */
17 #include "ValidationSchemes.h"
18 #include <libdevcore/JsonUtils.h>
19 #include <string>
20 
21 using namespace std;
22 namespace js = json_spirit;
23 
24 namespace dev
25 {
26 namespace eth
27 {
28 namespace validation
29 {
30 string const c_sealEngine = "sealEngine";
31 string const c_params = "params";
32 string const c_genesis = "genesis";
33 string const c_accounts = "accounts";
34 string const c_balance = "balance";
35 string const c_wei = "wei";
36 string const c_finney = "finney";
37 string const c_author = "author";
38 string const c_coinbase = "coinbase";
39 string const c_nonce = "nonce";
40 string const c_gasLimit = "gasLimit";
41 string const c_timestamp = "timestamp";
42 string const c_difficulty = "difficulty";
43 string const c_extraData = "extraData";
44 string const c_mixHash = "mixHash";
45 string const c_parentHash = "parentHash";
46 string const c_precompiled = "precompiled";
47 string const c_code = "code";
48 string const c_storage = "storage";
49 string const c_gasUsed = "gasUsed";
50 string const c_codeFromFile = "codeFromFile";
51 string const c_shouldnotexist = "shouldnotexist";
52 
53 string const c_minGasLimit = "minGasLimit";
54 string const c_maxGasLimit = "maxGasLimit";
55 string const c_gasLimitBoundDivisor = "gasLimitBoundDivisor";
56 string const c_homesteadForkBlock = "homesteadForkBlock";
57 string const c_daoHardforkBlock = "daoHardforkBlock";
58 string const c_EIP150ForkBlock = "EIP150ForkBlock";
59 string const c_EIP158ForkBlock = "EIP158ForkBlock";
60 string const c_byzantiumForkBlock = "byzantiumForkBlock";
61 string const c_eWASMForkBlock = "eWASMForkBlock";
62 string const c_constantinopleForkBlock = "constantinopleForkBlock";
63 string const c_constantinopleFixForkBlock = "constantinopleFixForkBlock";
64 string const c_experimentalForkBlock = "experimentalForkBlock";
65 string const c_accountStartNonce = "accountStartNonce";
66 string const c_maximumExtraDataSize = "maximumExtraDataSize";
67 string const c_tieBreakingGas = "tieBreakingGas";
68 string const c_blockReward = "blockReward";
69 string const c_difficultyBoundDivisor = "difficultyBoundDivisor";
70 string const c_minimumDifficulty = "minimumDifficulty";
71 string const c_durationLimit = "durationLimit";
72 string const c_chainID = "chainID";
73 string const c_networkID = "networkID";
74 string const c_allowFutureBlocks = "allowFutureBlocks";
75 
76 void validateConfigJson(js::mObject const& _obj)
77 {
78  requireJsonFields(_obj, "ChainParams::loadConfig",
79  {{c_sealEngine, {{js::str_type}, JsonFieldPresence::Required}},
80  {c_params, {{js::obj_type}, JsonFieldPresence::Required}},
81  {c_genesis, {{js::obj_type}, JsonFieldPresence::Required}},
82  {c_accounts, {{js::obj_type}, JsonFieldPresence::Required}}});
83 
84  requireJsonFields(_obj.at(c_genesis).get_obj(), "ChainParams::loadConfig::genesis",
85  {{c_author, {{js::str_type}, JsonFieldPresence::Required}},
86  {c_nonce, {{js::str_type}, JsonFieldPresence::Required}},
87  {c_gasLimit, {{js::str_type}, JsonFieldPresence::Required}},
88  {c_timestamp, {{js::str_type}, JsonFieldPresence::Required}},
89  {c_difficulty, {{js::str_type}, JsonFieldPresence::Required}},
90  {c_extraData, {{js::str_type}, JsonFieldPresence::Required}},
91  {c_mixHash, {{js::str_type}, JsonFieldPresence::Required}},
92  {c_parentHash, {{js::str_type}, JsonFieldPresence::Optional}}});
93 
94  js::mObject const& accounts = _obj.at(c_accounts).get_obj();
95  for (auto const& acc : accounts)
96  validateAccountObj(acc.second.get_obj());
97 }
98 
99 void validateAccountMaskObj(js::mObject const& _obj)
100 {
101  // A map object with possibly defined fields
102  requireJsonFields(_obj, "validateAccountMaskObj",
103  {{c_storage, {{js::obj_type}, JsonFieldPresence::Optional}},
104  {c_balance, {{js::str_type}, JsonFieldPresence::Optional}},
105  {c_nonce, {{js::str_type}, JsonFieldPresence::Optional}},
106  {c_code, {{js::str_type}, JsonFieldPresence::Optional}},
107  {c_precompiled, {{js::obj_type}, JsonFieldPresence::Optional}},
108  {c_shouldnotexist, {{js::str_type}, JsonFieldPresence::Optional}},
109  {c_wei, {{js::str_type}, JsonFieldPresence::Optional}}});
110 }
111 
112 void validateAccountObj(js::mObject const& _obj)
113 {
114  if (_obj.count(c_precompiled))
115  {
116  // A precompiled contract
117  requireJsonFields(_obj, "validateAccountObj",
118  {{c_precompiled, {{js::obj_type}, JsonFieldPresence::Required}},
119  {c_wei, {{js::str_type}, JsonFieldPresence::Optional}},
120  {c_balance, {{js::str_type}, JsonFieldPresence::Optional}}});
121  }
122  else
123  {
124  // Extendable account description. Check typo errors and fields type.
125  requireJsonFields(_obj, "validateAccountObj",
126  {{c_code, {{js::str_type}, JsonFieldPresence::Optional}},
127  {c_nonce, {{js::str_type}, JsonFieldPresence::Optional}},
128  {c_storage, {{js::obj_type}, JsonFieldPresence::Optional}},
129  {c_balance, {{js::str_type}, JsonFieldPresence::Optional}},
130  {c_wei, {{js::str_type}, JsonFieldPresence::Optional}},
131  {c_codeFromFile, {{js::str_type}, JsonFieldPresence::Optional}}});
132 
133  // At least one field must be set
134  if (_obj.empty())
135  {
136  string comment =
137  "Error in validateAccountObj: At least one field must be set (code, nonce, "
138  "storage, balance, wei, codeFromFile)!";
139  BOOST_THROW_EXCEPTION(MissingField() << errinfo_comment(comment));
140  }
141 
142  // c_code, c_codeFromFile could not coexist
143  if (_obj.count(c_code) && _obj.count(c_codeFromFile))
144  {
145  string comment =
146  "Error in validateAccountObj: field 'code' contradicts field 'codeFromFile'!";
147  BOOST_THROW_EXCEPTION(UnknownField() << errinfo_comment(comment));
148  }
149  }
150 
151  // c_wei, c_balance could not coexist
152  if (_obj.count(c_wei) && _obj.count(c_balance))
153  {
154  string comment = "Error in validateAccountObj: field 'balance' contradicts field 'wei'!";
155  BOOST_THROW_EXCEPTION(UnknownField() << errinfo_comment(comment));
156  }
157 }
158 }
159 }
160 }
dev::eth::validation::c_networkID
string const c_networkID
Definition: ValidationSchemes.cpp:73
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::eth::validation::c_maximumExtraDataSize
string const c_maximumExtraDataSize
Definition: ValidationSchemes.cpp:66
dev::eth::validation::c_finney
string const c_finney
Definition: ValidationSchemes.cpp:36
dev::requireJsonFields
void requireJsonFields(json_spirit::mObject const &_o, std::string const &_configName, std::map< std::string, JsonFieldOptions > const &_validationMap)
Definition: JsonUtils.cpp:59
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::validation::c_parentHash
string const c_parentHash
Definition: ValidationSchemes.cpp:45
dev::eth::validation::c_codeFromFile
string const c_codeFromFile
A file containg a code as bytes.
Definition: ValidationSchemes.cpp:50
dev::eth::validation::c_genesis
string const c_genesis
Definition: ValidationSchemes.cpp:32
dev::eth::validation::c_wei
string const c_wei
Definition: ValidationSchemes.cpp:35
dev::eth::validation::c_accounts
string const c_accounts
Definition: ValidationSchemes.cpp:33
dev::eth::validation::c_storage
string const c_storage
Definition: ValidationSchemes.cpp:48
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::eth::validation::c_byzantiumForkBlock
string const c_byzantiumForkBlock
Definition: ValidationSchemes.cpp:60
dev::eth::validation::c_shouldnotexist
string const c_shouldnotexist
Definition: ValidationSchemes.cpp:51
dev::eth::validation::c_sealEngine
string const c_sealEngine
Definition: ValidationSchemes.cpp:30
dev::eth::validation::c_constantinopleForkBlock
string const c_constantinopleForkBlock
Definition: ValidationSchemes.cpp:62
dev::eth::validation::c_gasLimitBoundDivisor
string const c_gasLimitBoundDivisor
Definition: ValidationSchemes.cpp:55
dev::eth::validation::c_maxGasLimit
string const c_maxGasLimit
Definition: ValidationSchemes.cpp:54
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
dev::eth::validation::c_mixHash
string const c_mixHash
Definition: ValidationSchemes.cpp:44
dev::eth::validation::validateAccountMaskObj
void validateAccountMaskObj(js::mObject const &_obj)
Definition: ValidationSchemes.cpp:99
dev::eth::validation::c_nonce
string const c_nonce
Definition: ValidationSchemes.cpp:39
ValidationSchemes.h
dev::eth::validation::c_tieBreakingGas
string const c_tieBreakingGas
Definition: ValidationSchemes.cpp:67
dev::eth::validation::c_balance
string const c_balance
Definition: ValidationSchemes.cpp:34
JsonUtils.h
dev::eth::validation::c_EIP158ForkBlock
string const c_EIP158ForkBlock
Definition: ValidationSchemes.cpp:59
dev::eth::validation::c_precompiled
string const c_precompiled
Definition: ValidationSchemes.cpp:46
dev::eth::validation::c_EIP150ForkBlock
string const c_EIP150ForkBlock
Definition: ValidationSchemes.cpp:58
dev::eth::validation::validateAccountObj
void validateAccountObj(js::mObject const &_obj)
Definition: ValidationSchemes.cpp:112
dev::eth::validation::c_gasUsed
string const c_gasUsed
Definition: ValidationSchemes.cpp:49
std
Definition: FixedHash.h:393
dev::eth::validation::c_minimumDifficulty
string const c_minimumDifficulty
Definition: ValidationSchemes.cpp:70
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::validation::c_eWASMForkBlock
string const c_eWASMForkBlock
Definition: ValidationSchemes.cpp:61
dev::eth::validation::c_code
string const c_code
Definition: ValidationSchemes.cpp:47
dev::eth::validation::c_author
string const c_author
Definition: ValidationSchemes.cpp:37
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::eth::validation::c_difficulty
string const c_difficulty
Definition: ValidationSchemes.cpp:42
dev::eth::validation::c_homesteadForkBlock
string const c_homesteadForkBlock
Definition: ValidationSchemes.cpp:56
dev::eth::validation::c_difficultyBoundDivisor
string const c_difficultyBoundDivisor
Definition: ValidationSchemes.cpp:69
dev::errinfo_comment
boost::error_info< struct tag_comment, std::string > errinfo_comment
Definition: Assertions.h:69
dev::eth::validation::c_timestamp
string const c_timestamp
Definition: ValidationSchemes.cpp:41