Skip to content
This repository has been archived by the owner on Oct 28, 2021. It is now read-only.

Commit

Permalink
Fic ChainParams::loadConfig not loading precompile configuration
Browse files Browse the repository at this point in the history
insert method of the precompile map was not changing anything when previous map already contained the same key. Now loading config always starts with default-initialized ChainParams (with empty precompile map)
  • Loading branch information
gumb0 committed Nov 13, 2019
1 parent f1a8496 commit 0b1ee68
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 63 deletions.
2 changes: 1 addition & 1 deletion aleth/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -677,7 +677,7 @@ int main(int argc, char** argv)
{
try
{
chainParams = chainParams.loadConfig(configJSON, {}, configPath);
chainParams = ChainParams{configJSON, {}, configPath};
chainConfigIsSet = true;
}
catch (...)
Expand Down
111 changes: 55 additions & 56 deletions libethereum/ChainParams.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,10 @@ ChainParams::ChainParams()
precompiled.insert(make_pair(Address(4), PrecompiledContract(15, 3, PrecompiledRegistrar::executor("identity"))));
}

ChainParams::ChainParams(string const& _json, h256 const& _stateRoot)
ChainParams::ChainParams(
string const& _json, h256 const& _stateRoot, boost::filesystem::path const& _configPath)
{
*this = loadConfig(_json, _stateRoot);
loadConfig(_json, _stateRoot, _configPath);
}

ChainParams::ChainParams(std::string const& _configJson, AdditionalEIPs const& _additionalEIPs)
Expand All @@ -69,10 +70,9 @@ ChainParams::ChainParams(std::string const& _configJson, AdditionalEIPs const& _
lastForkWithAdditionalEIPsSchedule = EVMSchedule{lastForkSchedule, _additionalEIPs};
}

ChainParams ChainParams::loadConfig(
string const& _json, h256 const& _stateRoot, const boost::filesystem::path& _configPath) const
void ChainParams::loadConfig(
string const& _json, h256 const& _stateRoot, boost::filesystem::path const& _configPath)
{
ChainParams cp(*this);
js::mValue val;

try
Expand All @@ -93,95 +93,94 @@ ChainParams ChainParams::loadConfig(
validateConfigJson(obj);

// params
cp.sealEngineName = obj[c_sealEngine].get_str();
sealEngineName = obj[c_sealEngine].get_str();
js::mObject params = obj[c_params].get_obj();

// Params that are not required and could be set to default value
if (params.count(c_accountStartNonce))
cp.accountStartNonce = fromBigEndian<u256>(fromHex(params[c_accountStartNonce].get_str()));
accountStartNonce = fromBigEndian<u256>(fromHex(params[c_accountStartNonce].get_str()));
if (params.count(c_maximumExtraDataSize))
cp.maximumExtraDataSize =
maximumExtraDataSize =
fromBigEndian<u256>(fromHex(params[c_maximumExtraDataSize].get_str()));

cp.tieBreakingGas = params.count(c_tieBreakingGas) ? params[c_tieBreakingGas].get_bool() : true;
tieBreakingGas = params.count(c_tieBreakingGas) ? params[c_tieBreakingGas].get_bool() : true;
if (params.count(c_blockReward))
cp.setBlockReward(fromBigEndian<u256>(fromHex(params[c_blockReward].get_str())));
setBlockReward(fromBigEndian<u256>(fromHex(params[c_blockReward].get_str())));

auto setOptionalU256Parameter = [&params](u256 &_destination, string const& _name)
{
if (params.count(_name))
_destination = fromBigEndian<u256>(fromHex(params.at(_name).get_str()));
};
setOptionalU256Parameter(cp.minGasLimit, c_minGasLimit);
setOptionalU256Parameter(cp.maxGasLimit, c_maxGasLimit);
setOptionalU256Parameter(cp.gasLimitBoundDivisor, c_gasLimitBoundDivisor);

setOptionalU256Parameter(cp.homesteadForkBlock, c_homesteadForkBlock);
setOptionalU256Parameter(cp.daoHardforkBlock, c_daoHardforkBlock);
setOptionalU256Parameter(cp.EIP150ForkBlock, c_EIP150ForkBlock);
setOptionalU256Parameter(cp.EIP158ForkBlock, c_EIP158ForkBlock);
setOptionalU256Parameter(cp.byzantiumForkBlock, c_byzantiumForkBlock);
setOptionalU256Parameter(cp.eWASMForkBlock, c_eWASMForkBlock);
setOptionalU256Parameter(cp.constantinopleForkBlock, c_constantinopleForkBlock);
setOptionalU256Parameter(cp.constantinopleFixForkBlock, c_constantinopleFixForkBlock);
setOptionalU256Parameter(cp.istanbulForkBlock, c_istanbulForkBlock);
setOptionalU256Parameter(cp.berlinForkBlock, c_berlinForkBlock);
setOptionalU256Parameter(cp.experimentalForkBlock, c_experimentalForkBlock);

cp.lastForkBlock = findMaxForkBlockNumber(params);
cp.lastForkWithAdditionalEIPsSchedule = cp.forkScheduleForBlockNumber(cp.lastForkBlock);

setOptionalU256Parameter(cp.minimumDifficulty, c_minimumDifficulty);
setOptionalU256Parameter(cp.difficultyBoundDivisor, c_difficultyBoundDivisor);
setOptionalU256Parameter(cp.durationLimit, c_durationLimit);
setOptionalU256Parameter(minGasLimit, c_minGasLimit);
setOptionalU256Parameter(maxGasLimit, c_maxGasLimit);
setOptionalU256Parameter(gasLimitBoundDivisor, c_gasLimitBoundDivisor);

setOptionalU256Parameter(homesteadForkBlock, c_homesteadForkBlock);
setOptionalU256Parameter(daoHardforkBlock, c_daoHardforkBlock);
setOptionalU256Parameter(EIP150ForkBlock, c_EIP150ForkBlock);
setOptionalU256Parameter(EIP158ForkBlock, c_EIP158ForkBlock);
setOptionalU256Parameter(byzantiumForkBlock, c_byzantiumForkBlock);
setOptionalU256Parameter(eWASMForkBlock, c_eWASMForkBlock);
setOptionalU256Parameter(constantinopleForkBlock, c_constantinopleForkBlock);
setOptionalU256Parameter(constantinopleFixForkBlock, c_constantinopleFixForkBlock);
setOptionalU256Parameter(istanbulForkBlock, c_istanbulForkBlock);
setOptionalU256Parameter(berlinForkBlock, c_berlinForkBlock);
setOptionalU256Parameter(experimentalForkBlock, c_experimentalForkBlock);

lastForkBlock = findMaxForkBlockNumber(params);
lastForkWithAdditionalEIPsSchedule = forkScheduleForBlockNumber(lastForkBlock);

setOptionalU256Parameter(minimumDifficulty, c_minimumDifficulty);
setOptionalU256Parameter(difficultyBoundDivisor, c_difficultyBoundDivisor);
setOptionalU256Parameter(durationLimit, c_durationLimit);

if (params.count(c_chainID))
cp.chainID = int(fromBigEndian<u256>(fromHex(params.at(c_chainID).get_str())));
chainID = int(fromBigEndian<u256>(fromHex(params.at(c_chainID).get_str())));
if (params.count(c_networkID))
cp.networkID = int(fromBigEndian<u256>(fromHex(params.at(c_networkID).get_str())));
cp.allowFutureBlocks = params.count(c_allowFutureBlocks);
networkID = int(fromBigEndian<u256>(fromHex(params.at(c_networkID).get_str())));
allowFutureBlocks = params.count(c_allowFutureBlocks);

// genesis
string genesisStr = js::write_string(obj[c_genesis], false);
cp = cp.loadGenesis(genesisStr, _stateRoot);
loadGenesis(genesisStr, _stateRoot);
// genesis state
string genesisStateStr = js::write_string(obj[c_accounts], false);

cp.genesisState = jsonToAccountMap(
genesisStateStr, cp.accountStartNonce, nullptr, &cp.precompiled, _configPath);
genesisState =
jsonToAccountMap(genesisStateStr, accountStartNonce, nullptr, &precompiled, _configPath);

cp.stateRoot = _stateRoot ? _stateRoot : cp.calculateStateRoot(true);
return cp;
stateRoot = _stateRoot ? _stateRoot : calculateStateRoot(true);
}

ChainParams ChainParams::loadGenesis(string const& _json, h256 const& _stateRoot) const
void ChainParams::loadGenesis(string const& _json, h256 const& _stateRoot)
{
ChainParams cp(*this);

js::mValue val;
js::read_string(_json, val);
js::mObject genesis = val.get_obj();

cp.parentHash = h256(0); // required by the YP
cp.author = genesis.count(c_coinbase) ? h160(genesis[c_coinbase].get_str()) : h160(genesis[c_author].get_str());
cp.difficulty = genesis.count(c_difficulty) ?
u256(fromBigEndian<u256>(fromHex(genesis[c_difficulty].get_str()))) :
cp.minimumDifficulty;
cp.gasLimit = u256(fromBigEndian<u256>(fromHex(genesis[c_gasLimit].get_str())));
cp.gasUsed = genesis.count(c_gasUsed) ? u256(fromBigEndian<u256>(fromHex(genesis[c_gasUsed].get_str()))) : 0;
cp.timestamp = u256(fromBigEndian<u256>(fromHex(genesis[c_timestamp].get_str())));
cp.extraData = bytes(fromHex(genesis[c_extraData].get_str()));
parentHash = h256(0); // required by the YP
author = genesis.count(c_coinbase) ? h160(genesis[c_coinbase].get_str()) :
h160(genesis[c_author].get_str());
difficulty = genesis.count(c_difficulty) ?
u256(fromBigEndian<u256>(fromHex(genesis[c_difficulty].get_str()))) :
minimumDifficulty;
gasLimit = u256(fromBigEndian<u256>(fromHex(genesis[c_gasLimit].get_str())));
gasUsed = genesis.count(c_gasUsed) ?
u256(fromBigEndian<u256>(fromHex(genesis[c_gasUsed].get_str()))) :
0;
timestamp = u256(fromBigEndian<u256>(fromHex(genesis[c_timestamp].get_str())));
extraData = bytes(fromHex(genesis[c_extraData].get_str()));

// magic code for handling ethash stuff:
if (genesis.count(c_mixHash) && genesis.count(c_nonce))
{
h256 mixHash(genesis[c_mixHash].get_str());
h64 nonce(genesis[c_nonce].get_str());
cp.sealFields = 2;
cp.sealRLP = rlp(mixHash) + rlp(nonce);
sealFields = 2;
sealRLP = rlp(mixHash) + rlp(nonce);
}
cp.stateRoot = _stateRoot ? _stateRoot : cp.calculateStateRoot();
return cp;
stateRoot = _stateRoot ? _stateRoot : calculateStateRoot();
}

SealEngineFace* ChainParams::createSealEngine()
Expand Down
11 changes: 6 additions & 5 deletions libethereum/ChainParams.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ struct ChainParams: public ChainOperationParams
{
ChainParams();
ChainParams(ChainParams const& /*_org*/) = default;
ChainParams(std::string const& _configJson, h256 const& _stateRoot = h256());
ChainParams(std::string const& _configJson, h256 const& _stateRoot = {},
boost::filesystem::path const& _configPath = {});
/// params with additional EIPs activated on top of the last fork block
ChainParams(std::string const& _configJson, AdditionalEIPs const& _additionalEIPs);
ChainParams(bytes const& _genesisRLP, AccountMap const& _state)
Expand Down Expand Up @@ -56,15 +57,15 @@ struct ChainParams: public ChainOperationParams
/// Genesis block info.
bytes genesisBlock() const;

private:
/// load config
ChainParams loadConfig(std::string const& _json, h256 const& _stateRoot = {},
const boost::filesystem::path& _configPath = {}) const;
void loadConfig(std::string const& _json, h256 const& _stateRoot,
boost::filesystem::path const& _configPath);

private:
void populateFromGenesis(bytes const& _genesisRLP, AccountMap const& _state);

/// load genesis
ChainParams loadGenesis(std::string const& _json, h256 const& _stateRoot = {}) const;
void loadGenesis(std::string const& _json, h256 const& _stateRoot);
};

}
Expand Down
2 changes: 1 addition & 1 deletion libethereum/ClientTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ void ClientTest::setChainParams(string const& _genesis)
ChainParams params;
try
{
params = params.loadConfig(_genesis);
params = ChainParams{_genesis};
if (params.sealEngineName != NoProof::name() && params.sealEngineName != Ethash::name() &&
params.sealEngineName != NoReward::name())
BOOST_THROW_EXCEPTION(
Expand Down

0 comments on commit 0b1ee68

Please sign in to comment.