Skip to content

Commit

Permalink
Remove ChainOperationParams::u256Param that looks up parameters by st…
Browse files Browse the repository at this point in the history
…rings

Instead, introduced a number of u256 fields in ChainOperationParams.
  • Loading branch information
pirapira committed Aug 31, 2017
1 parent 5495140 commit 0959aca
Show file tree
Hide file tree
Showing 19 changed files with 110 additions and 113 deletions.
4 changes: 2 additions & 2 deletions eth/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -849,7 +849,7 @@ int main(int argc, char** argv)
if (!privateChain.empty())
{
chainParams.extraData = sha3(privateChain).asBytes();
chainParams.difficulty = chainParams.u256Param("minimumDifficulty");
chainParams.difficulty = chainParams.minimumDifficulty;
chainParams.gasLimit = u256(1) << 32;
}
// TODO: Open some other API path
Expand Down Expand Up @@ -917,7 +917,7 @@ int main(int argc, char** argv)
if (testingMode)
{
chainParams.sealEngineName = "NoProof";
chainParams.otherParams["allowFutureBlocks"] = true;
chainParams.allowFutureBlocks = true;
}

dev::WebThreeDirect web3(
Expand Down
2 changes: 1 addition & 1 deletion ethvm/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ namespace
{
int64_t maxBlockGasLimit()
{
static int64_t limit = ChainParams(genesisInfo(Network::MainNetwork)).u256Param("maxGasLimit").convert_to<int64_t>();
static int64_t limit = ChainParams(genesisInfo(Network::MainNetwork)).maxGasLimit.convert_to<int64_t>();
return limit;
}

Expand Down
44 changes: 22 additions & 22 deletions libethashseal/Ethash.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -87,19 +87,19 @@ void Ethash::verify(Strictness _s, BlockHeader const& _bi, BlockHeader const& _p

if (_s != CheckNothingNew)
{
if (_bi.difficulty() < chainParams().u256Param("minimumDifficulty"))
BOOST_THROW_EXCEPTION(InvalidDifficulty() << RequirementError(bigint(chainParams().u256Param("minimumDifficulty")), bigint(_bi.difficulty())) );
if (_bi.difficulty() < chainParams().minimumDifficulty)
BOOST_THROW_EXCEPTION(InvalidDifficulty() << RequirementError(bigint(chainParams().minimumDifficulty), bigint(_bi.difficulty())) );

if (_bi.gasLimit() < chainParams().u256Param("minGasLimit"))
BOOST_THROW_EXCEPTION(InvalidGasLimit() << RequirementError(bigint(chainParams().u256Param("minGasLimit")), bigint(_bi.gasLimit())) );
if (_bi.gasLimit() < chainParams().minGasLimit)
BOOST_THROW_EXCEPTION(InvalidGasLimit() << RequirementError(bigint(chainParams().minGasLimit), bigint(_bi.gasLimit())) );

if (_bi.gasLimit() > chainParams().u256Param("maxGasLimit"))
BOOST_THROW_EXCEPTION(InvalidGasLimit() << RequirementError(bigint(chainParams().u256Param("maxGasLimit")), bigint(_bi.gasLimit())) );
if (_bi.gasLimit() > chainParams().maxGasLimit)
BOOST_THROW_EXCEPTION(InvalidGasLimit() << RequirementError(bigint(chainParams().maxGasLimit), bigint(_bi.gasLimit())) );

if (_bi.number() && _bi.extraData().size() > chainParams().maximumExtraDataSize)
BOOST_THROW_EXCEPTION(ExtraDataTooBig() << RequirementError(bigint(chainParams().maximumExtraDataSize), bigint(_bi.extraData().size())) << errinfo_extraData(_bi.extraData()));

u256 daoHardfork = chainParams().u256Param("daoHardforkBlock");
u256 const& daoHardfork = chainParams().daoHardforkBlock;
if (daoHardfork != 0 && daoHardfork + 9 >= daoHardfork && _bi.number() >= daoHardfork && _bi.number() <= daoHardfork + 9)
if (_bi.extraData() != fromHex("0x64616f2d686172642d666f726b"))
BOOST_THROW_EXCEPTION(ExtraDataIncorrect() << errinfo_comment("Received block from the wrong fork (invalid extradata)."));
Expand All @@ -116,15 +116,15 @@ void Ethash::verify(Strictness _s, BlockHeader const& _bi, BlockHeader const& _p
auto gasLimit = _bi.gasLimit();
auto parentGasLimit = _parent.gasLimit();
if (
gasLimit < chainParams().u256Param("minGasLimit") ||
gasLimit > chainParams().u256Param("maxGasLimit") ||
gasLimit <= parentGasLimit - parentGasLimit / chainParams().u256Param("gasLimitBoundDivisor") ||
gasLimit >= parentGasLimit + parentGasLimit / chainParams().u256Param("gasLimitBoundDivisor"))
gasLimit < chainParams().minGasLimit ||
gasLimit > chainParams().maxGasLimit ||
gasLimit <= parentGasLimit - parentGasLimit / chainParams().gasLimitBoundDivisor ||
gasLimit >= parentGasLimit + parentGasLimit / chainParams().gasLimitBoundDivisor)
BOOST_THROW_EXCEPTION(
InvalidGasLimit()
<< errinfo_min((bigint)((bigint)parentGasLimit - (bigint)(parentGasLimit / chainParams().u256Param("gasLimitBoundDivisor"))))
<< errinfo_min((bigint)((bigint)parentGasLimit - (bigint)(parentGasLimit / chainParams().gasLimitBoundDivisor)))
<< errinfo_got((bigint)gasLimit)
<< errinfo_max((bigint)((bigint)parentGasLimit + parentGasLimit / chainParams().u256Param("gasLimitBoundDivisor")))
<< errinfo_max((bigint)((bigint)parentGasLimit + parentGasLimit / chainParams().gasLimitBoundDivisor))
);
}

Expand Down Expand Up @@ -158,9 +158,9 @@ void Ethash::verifyTransaction(ImportRequirements::value _ir, TransactionBase co

if (_ir & ImportRequirements::TransactionSignatures)
{
if (_header.number() >= chainParams().u256Param("EIP158ForkBlock"))
if (_header.number() >= chainParams().EIP158ForkBlock)
{
int chainID(chainParams().u256Param("chainID"));
int chainID = chainParams().chainID;
_t.checkChainId(chainID);
}
else
Expand All @@ -178,7 +178,7 @@ u256 Ethash::childGasLimit(BlockHeader const& _bi, u256 const& _gasFloorTarget)
{
u256 gasFloorTarget = _gasFloorTarget == Invalid256 ? 3141562 : _gasFloorTarget;
u256 gasLimit = _bi.gasLimit();
u256 boundDivisor = chainParams().u256Param("gasLimitBoundDivisor");
u256 boundDivisor = chainParams().gasLimitBoundDivisor;
if (gasLimit < gasFloorTarget)
return min<u256>(gasFloorTarget, gasLimit + gasLimit / boundDivisor - 1);
else
Expand All @@ -196,18 +196,18 @@ u256 Ethash::calculateDifficulty(BlockHeader const& _bi, BlockHeader const& _par

if (!_bi.number())
throw GenesisBlockCannotBeCalculated();
auto minimumDifficulty = chainParams().u256Param("minimumDifficulty");
auto difficultyBoundDivisor = chainParams().u256Param("difficultyBoundDivisor");
auto durationLimit = chainParams().u256Param("durationLimit");
auto const& minimumDifficulty = chainParams().minimumDifficulty;
auto const& difficultyBoundDivisor = chainParams().difficultyBoundDivisor;
auto const& durationLimit = chainParams().durationLimit;

bigint target; // stick to a bigint for the target. Don't want to risk going negative.
if (_bi.number() < chainParams().u256Param("homesteadForkBlock"))
if (_bi.number() < chainParams().homesteadForkBlock)
// Frontier-era difficulty adjustment
target = _bi.timestamp() >= _parent.timestamp() + durationLimit ? _parent.difficulty() - (_parent.difficulty() / difficultyBoundDivisor) : (_parent.difficulty() + (_parent.difficulty() / difficultyBoundDivisor));
else
{
bigint const timestampDiff = bigint(_bi.timestamp()) - _parent.timestamp();
bigint const adjFactor = _bi.number() < chainParams().u256Param("byzantiumForkBlock") ?
bigint const adjFactor = _bi.number() < chainParams().byzantiumForkBlock ?
max<bigint>(1 - timestampDiff / 10, -99) : // Homestead-era difficulty adjustment
max<bigint>((_parent.hasUncles() ? 2 : 1) - timestampDiff / 9, -99); // Byzantium-era difficulty adjustment

Expand All @@ -218,7 +218,7 @@ u256 Ethash::calculateDifficulty(BlockHeader const& _bi, BlockHeader const& _par
unsigned exponentialIceAgeBlockNumber = unsigned(_parent.number() + 1);

// EIP-649 modifies exponentialIceAgeBlockNumber
if (_bi.number() >= chainParams().u256Param("byzantiumForkBlock"))
if (_bi.number() >= chainParams().byzantiumForkBlock)
{
if (exponentialIceAgeBlockNumber >= 3000000)
exponentialIceAgeBlockNumber -= 3000000;
Expand Down
43 changes: 15 additions & 28 deletions libethcore/ChainOperationParams.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,48 +41,35 @@ PrecompiledContract::PrecompiledContract(
}, _exec, _startingBlock)
{}

ChainOperationParams::ChainOperationParams()
ChainOperationParams::ChainOperationParams():
m_blockReward("0x4563918244F40000"),
minGasLimit(0x1388),
maxGasLimit("0x7fffffffffffffff"),
gasLimitBoundDivisor(0x0400),
networkID(0x0),
minimumDifficulty(0x020000),
difficultyBoundDivisor(0x0800),
durationLimit(0x0d),
registrar("0x5e70c0bbcd5636e0f9f9316e9f8633feb64d4050")
{
otherParams = std::unordered_map<std::string, std::string>{
{"minGasLimit", "0x1388"},
{"maxGasLimit", "0x7fffffffffffffff"},
{"gasLimitBoundDivisor", "0x0400"},
{"minimumDifficulty", "0x020000"},
{"difficultyBoundDivisor", "0x0800"},
{"durationLimit", "0x0d"},
{"registrar", "5e70c0bbcd5636e0f9f9316e9f8633feb64d4050"},
{"networkID", "0x0"}
};
m_blockReward = u256("0x4563918244F40000");
}

EVMSchedule const& ChainOperationParams::scheduleForBlockNumber(u256 const& _blockNumber) const
{
if (_blockNumber >= u256Param("constantinopleForkBlock"))
if (_blockNumber >= constantinopleForkBlock)
return ConstantinopleSchedule;
else if (_blockNumber >= u256Param("byzantiumForkBlock"))
else if (_blockNumber >= byzantiumForkBlock)
return ByzantiumSchedule;
else if (_blockNumber >= u256Param("EIP158ForkBlock"))
else if (_blockNumber >= EIP158ForkBlock)
return EIP158Schedule;
else if (_blockNumber >= u256Param("EIP150ForkBlock"))
else if (_blockNumber >= EIP150ForkBlock)
return EIP150Schedule;
else if (_blockNumber >= u256Param("homesteadForkBlock"))
else if (_blockNumber >= homesteadForkBlock)
return HomesteadSchedule;
else
return FrontierSchedule;
}

u256 ChainOperationParams::u256Param(string const& _name) const
{
std::string at("");

auto it = otherParams.find(_name);
if (it != otherParams.end())
at = it->second;

return u256(fromBigEndian<u256>(fromHex(at)));
}

u256 ChainOperationParams::blockReward(EVMSchedule const& _schedule) const
{
if (_schedule.blockRewardOverwrite)
Expand Down
33 changes: 17 additions & 16 deletions libethcore/ChainOperationParams.h
Original file line number Diff line number Diff line change
Expand Up @@ -82,25 +82,26 @@ struct ChainOperationParams
u256 maximumExtraDataSize = 1024;
u256 accountStartNonce = 0;
bool tieBreakingGas = true;
u256 minGasLimit;
u256 maxGasLimit;
u256 gasLimitBoundDivisor;
u256 homesteadForkBlock;
u256 EIP150ForkBlock;
u256 EIP158ForkBlock;
u256 byzantiumForkBlock;
u256 constantinopleForkBlock;
u256 daoHardforkBlock;
int chainID = 0; // Distinguishes different chains (mainnet, Ropsten, etc).
int networkID = 0; // Distinguishes different sub protocols.

u256 minimumDifficulty;
u256 difficultyBoundDivisor;
u256 durationLimit;
bool allowFutureBlocks = false;
u256 registrar;

/// Precompiled contracts as specified in the chain params.
std::unordered_map<Address, PrecompiledContract> precompiled;

/**
* @brief Additional parameters.
*
* e.g. Ethash specific:
* - minGasLimit
* - maxGasLimit
* - gasLimitBoundDivisor
* - minimumDifficulty
* - difficultyBoundDivisor
* - durationLimit
*/
std::unordered_map<std::string, std::string> otherParams;

/// Convenience method to get an otherParam as a u256 int.
u256 u256Param(std::string const& _name) const;
};

}
Expand Down
8 changes: 4 additions & 4 deletions libethcore/SealEngine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,19 +45,19 @@ void SealEngineFace::populateFromParent(BlockHeader& _bi, BlockHeader const& _pa

void SealEngineFace::verifyTransaction(ImportRequirements::value _ir, TransactionBase const& _t, BlockHeader const& _header, u256 const&) const
{
if ((_ir & ImportRequirements::TransactionSignatures) && _header.number() < chainParams().u256Param("EIP158ForkBlock") && _t.isReplayProtected())
if ((_ir & ImportRequirements::TransactionSignatures) && _header.number() < chainParams().EIP158ForkBlock && _t.isReplayProtected())
BOOST_THROW_EXCEPTION(InvalidSignature());

if ((_ir & ImportRequirements::TransactionSignatures) && _header.number() < chainParams().u256Param("constantinopleForkBlock") && _t.hasZeroSignature())
if ((_ir & ImportRequirements::TransactionSignatures) && _header.number() < chainParams().constantinopleForkBlock && _t.hasZeroSignature())
BOOST_THROW_EXCEPTION(InvalidSignature());

if ((_ir & ImportRequirements::TransactionBasic) &&
_header.number() >= chainParams().u256Param("constantinopleForkBlock") &&
_header.number() >= chainParams().constantinopleForkBlock &&
_t.hasZeroSignature() &&
(_t.value() != 0 || _t.gasPrice() != 0 || _t.nonce() != 0))
BOOST_THROW_EXCEPTION(InvalidZeroSignatureTransaction() << errinfo_got((bigint)_t.gasPrice()) << errinfo_got((bigint)_t.value()) << errinfo_got((bigint)_t.nonce()));

if (_header.number() >= chainParams().u256Param("homesteadForkBlock") && (_ir & ImportRequirements::TransactionSignatures) && _t.hasSignature())
if (_header.number() >= chainParams().homesteadForkBlock && (_ir & ImportRequirements::TransactionSignatures) && _t.hasSignature())
_t.checkLowS();
}

Expand Down
10 changes: 5 additions & 5 deletions libethereum/Block.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -631,7 +631,7 @@ u256 Block::enact(VerifiedBlockRef const& _block, BlockChain const& _bc)
applyRewards(rewarded, _bc.sealEngine()->blockReward(m_currentBlock.number()));

// Commit all cached state changes to the state trie.
bool removeEmptyAccounts = m_currentBlock.number() >= _bc.chainParams().u256Param("EIP158ForkBlock"); // TODO: use EVMSchedule
bool removeEmptyAccounts = m_currentBlock.number() >= _bc.chainParams().EIP158ForkBlock; // TODO: use EVMSchedule
DEV_TIMED_ABOVE("commit", 500)
m_state.commit(removeEmptyAccounts ? State::CommitBehaviour::RemoveEmptyAccounts : State::CommitBehaviour::KeepEmptyAccounts);

Expand Down Expand Up @@ -688,7 +688,7 @@ void Block::applyRewards(vector<BlockHeader> const& _uncleBlockHeaders, u256 con

void Block::performIrregularModifications()
{
u256 daoHardfork = m_sealEngine->chainParams().u256Param("daoHardforkBlock");
u256 const& daoHardfork = m_sealEngine->chainParams().daoHardforkBlock;
if (daoHardfork != 0 && info().number() == daoHardfork)
{
Address recipient("0xbf4ed7b27f1d666546e30d74d50d173d20bca754");
Expand All @@ -701,9 +701,9 @@ void Block::performIrregularModifications()

void Block::updateBlockhashContract()
{
u256 const blockNumber = info().number();
u256 const& blockNumber = info().number();

u256 const constantinopleForkBlock = m_sealEngine->chainParams().u256Param("constantinopleForkBlock");
u256 const& constantinopleForkBlock = m_sealEngine->chainParams().constantinopleForkBlock;
if (blockNumber == constantinopleForkBlock)
{
m_state.createContract(c_blockhashContractAddress);
Expand Down Expand Up @@ -801,7 +801,7 @@ void Block::commitToSeal(BlockChain const& _bc, bytes const& _extraData)
applyRewards(uncleBlockHeaders, _bc.sealEngine()->blockReward(m_currentBlock.number()));

// Commit any and all changes to the trie that are in the cache, then update the state root accordingly.
bool removeEmptyAccounts = m_currentBlock.number() >= _bc.chainParams().u256Param("EIP158ForkBlock"); // TODO: use EVMSchedule
bool removeEmptyAccounts = m_currentBlock.number() >= _bc.chainParams().EIP158ForkBlock; // TODO: use EVMSchedule
DEV_TIMED_ABOVE("commit", 500)
m_state.commit(removeEmptyAccounts ? State::CommitBehaviour::RemoveEmptyAccounts : State::CommitBehaviour::KeepEmptyAccounts);

Expand Down
2 changes: 1 addition & 1 deletion libethereum/BlockChain.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -751,7 +751,7 @@ void BlockChain::checkBlockIsNew(VerifiedBlockRef const& _block) const
void BlockChain::checkBlockTimestamp(BlockHeader const& _header) const
{
// Check it's not crazy
if (_header.timestamp() > utcTime() && !m_params.otherParams.count("allowFutureBlocks"))
if (_header.timestamp() > utcTime() && !m_params.allowFutureBlocks)
{
clog(BlockChainChat) << _header.hash() << ": Future time " << _header.timestamp() << " (now at " << utcTime() << ")";
// Block has a timestamp in the future. This is no good.
Expand Down
37 changes: 23 additions & 14 deletions libethereum/ChainParams.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,21 +65,30 @@ ChainParams ChainParams::loadConfig(string const& _json, h256 const& _stateRoot)
cp.maximumExtraDataSize = u256(fromBigEndian<u256>(fromHex(params["maximumExtraDataSize"].get_str())));
cp.tieBreakingGas = params.count("tieBreakingGas") ? params["tieBreakingGas"].get_bool() : true;
cp.setBlockReward(u256(fromBigEndian<u256>(fromHex(params["blockReward"].get_str()))));
for (auto i: params)

auto setOptionalU256Parameter = [&params](u256 &_destination, string const& _name)
{
if (i.first != "accountStartNonce" && i.first != "maximumExtraDataSize" &&
i.first != "blockReward" && i.first != "tieBreakingGas" && i.first != "allowFutureBlocks")
cp.otherParams[i.first] = i.second.get_str();
else
{
if (i.first == "allowFutureBlocks")
{
// The value in otherParams is irrelevant, we only check for the presence of the key.
if (i.second.type() != json_spirit::bool_type || i.second.get_bool())
cp.otherParams[i.first] = "true";
}
}
}
if (params.count(_name))
_destination = u256(fromBigEndian<u256>(fromHex(params.at(_name).get_str())));
};
setOptionalU256Parameter(cp.minGasLimit, "minGasLimit");
setOptionalU256Parameter(cp.maxGasLimit, "maxGasLimit");
setOptionalU256Parameter(cp.gasLimitBoundDivisor, "gasLimitBoundDivisor");
setOptionalU256Parameter(cp.homesteadForkBlock, "homesteadForkBlock");
setOptionalU256Parameter(cp.EIP150ForkBlock, "EIP150ForkBlock");
setOptionalU256Parameter(cp.EIP158ForkBlock, "EIP158ForkBlock");
setOptionalU256Parameter(cp.byzantiumForkBlock, "byzantiumForkBlock");
setOptionalU256Parameter(cp.constantinopleForkBlock, "constantinopleForkBlock");
setOptionalU256Parameter(cp.daoHardforkBlock, "daoHardforkBlock");
setOptionalU256Parameter(cp.minimumDifficulty, "minimumDifficulty");
setOptionalU256Parameter(cp.difficultyBoundDivisor, "difficultyBoundDivisor");
setOptionalU256Parameter(cp.durationLimit, "durationLimit");

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

// genesis
string genesisStr = json_spirit::write_string(obj["genesis"], false);
Expand Down
4 changes: 2 additions & 2 deletions libethereum/Executive.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -271,7 +271,7 @@ bool Executive::call(CallParameters const& _p, u256 const& _gasPrice, Address co
// because the bug in both Geth and Parity led to deleting RIPEMD precompiled in this case
// see https://github.com/ethereum/go-ethereum/pull/3341/files#diff-2433aa143ee4772026454b8abd76b9dd
// We mark the account as touched here, so that is can be removed among other touched empty accounts (after tx finalization)
if (m_envInfo.number() >= m_sealEngine.chainParams().u256Param("EIP158ForkBlock"))
if (m_envInfo.number() >= m_sealEngine.chainParams().EIP158ForkBlock)
m_s.addBalance(_p.codeAddress, 0);

return true; // true actually means "all finished - nothing more to be done regarding go().
Expand Down Expand Up @@ -356,7 +356,7 @@ bool Executive::executeCreate(Address const& _sender, u256 const& _endowment, u2
m_s.transferBalance(_sender, m_newAddress, _endowment);

u256 newNonce = m_s.requireAccountStartNonce();
if (m_envInfo.number() >= m_sealEngine.chainParams().u256Param("EIP158ForkBlock"))
if (m_envInfo.number() >= m_sealEngine.chainParams().EIP158ForkBlock)
newNonce += 1;
m_s.setNonce(m_newAddress, newNonce);

Expand Down
2 changes: 1 addition & 1 deletion libethereum/ExtVM.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ h256 ExtVM::blockHash(u256 _number)
if (_number >= currentNumber || _number < (std::max<u256>(256, currentNumber) - 256))
return h256();

if (currentNumber < m_sealEngine.chainParams().u256Param("constantinopleForkBlock") + 256)
if (currentNumber < m_sealEngine.chainParams().constantinopleForkBlock + 256)
{
h256 const parentHash = envInfo().header().parentHash();
h256s const lastHashes = envInfo().lastHashes().precedingHashes(parentHash);
Expand Down
4 changes: 2 additions & 2 deletions libethereum/State.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -568,14 +568,14 @@ std::pair<ExecutionResult, TransactionReceipt> State::execute(EnvInfo const& _en
m_cache.clear();
break;
case Permanence::Committed:
removeEmptyAccounts = _envInfo.number() >= _sealEngine.chainParams().u256Param("EIP158ForkBlock");
removeEmptyAccounts = _envInfo.number() >= _sealEngine.chainParams().EIP158ForkBlock;
commit(removeEmptyAccounts ? State::CommitBehaviour::RemoveEmptyAccounts : State::CommitBehaviour::KeepEmptyAccounts);
break;
case Permanence::Uncommitted:
break;
}

TransactionReceipt const receipt = _envInfo.number() >= _sealEngine.chainParams().u256Param("byzantiumForkBlock") ?
TransactionReceipt const receipt = _envInfo.number() >= _sealEngine.chainParams().byzantiumForkBlock ?
TransactionReceipt(statusCode, startGasUsed + e.gasUsed(), e.logs()) :
TransactionReceipt(rootHash(), startGasUsed + e.gasUsed(), e.logs());
return make_pair(res, receipt);
Expand Down
Loading

0 comments on commit 0959aca

Please sign in to comment.