mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #1369 from ethereum/callcosts
Report infinite gas for calls.
This commit is contained in:
commit
634b0998ba
@ -39,7 +39,7 @@ GasMeter::GasConsumption& GasMeter::GasConsumption::operator+=(GasConsumption co
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
GasMeter::GasConsumption GasMeter::estimateMax(AssemblyItem const& _item)
|
GasMeter::GasConsumption GasMeter::estimateMax(AssemblyItem const& _item, bool _includeExternalCosts)
|
||||||
{
|
{
|
||||||
GasConsumption gas;
|
GasConsumption gas;
|
||||||
switch (_item.type())
|
switch (_item.type())
|
||||||
@ -127,6 +127,11 @@ GasMeter::GasConsumption GasMeter::estimateMax(AssemblyItem const& _item)
|
|||||||
case Instruction::CALL:
|
case Instruction::CALL:
|
||||||
case Instruction::CALLCODE:
|
case Instruction::CALLCODE:
|
||||||
case Instruction::DELEGATECALL:
|
case Instruction::DELEGATECALL:
|
||||||
|
{
|
||||||
|
if (_includeExternalCosts)
|
||||||
|
// We assume that we do not know the target contract and thus, the consumption is infinite.
|
||||||
|
gas = GasConsumption::infinite();
|
||||||
|
else
|
||||||
{
|
{
|
||||||
gas = GasCosts::callGas;
|
gas = GasCosts::callGas;
|
||||||
if (u256 const* value = classes.knownConstant(m_state->relativeStackElement(0)))
|
if (u256 const* value = classes.knownConstant(m_state->relativeStackElement(0)))
|
||||||
@ -140,11 +145,18 @@ GasMeter::GasConsumption GasMeter::estimateMax(AssemblyItem const& _item)
|
|||||||
gas += GasCosts::callValueTransferGas;
|
gas += GasCosts::callValueTransferGas;
|
||||||
gas += memoryGas(-2 - valueSize, -3 - valueSize);
|
gas += memoryGas(-2 - valueSize, -3 - valueSize);
|
||||||
gas += memoryGas(-4 - valueSize, -5 - valueSize);
|
gas += memoryGas(-4 - valueSize, -5 - valueSize);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case Instruction::CREATE:
|
case Instruction::CREATE:
|
||||||
|
if (_includeExternalCosts)
|
||||||
|
// We assume that we do not know the target contract and thus, the consumption is infinite.
|
||||||
|
gas = GasConsumption::infinite();
|
||||||
|
else
|
||||||
|
{
|
||||||
gas = GasCosts::createGas;
|
gas = GasCosts::createGas;
|
||||||
gas += memoryGas(-1, -2);
|
gas += memoryGas(-1, -2);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case Instruction::EXP:
|
case Instruction::EXP:
|
||||||
gas = GasCosts::expGas;
|
gas = GasCosts::expGas;
|
||||||
|
@ -102,7 +102,8 @@ public:
|
|||||||
|
|
||||||
/// @returns an upper bound on the gas consumed by the given instruction and updates
|
/// @returns an upper bound on the gas consumed by the given instruction and updates
|
||||||
/// the state.
|
/// the state.
|
||||||
GasConsumption estimateMax(AssemblyItem const& _item);
|
/// @param _inculdeExternalCosts if true, include costs caused by other contracts in calls.
|
||||||
|
GasConsumption estimateMax(AssemblyItem const& _item, bool _includeExternalCosts = true);
|
||||||
|
|
||||||
u256 const& largestMemoryAccess() const { return m_largestMemoryAccess; }
|
u256 const& largestMemoryAccess() const { return m_largestMemoryAccess; }
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user