mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #3013 from ethereum/evmasm-cleanup
Cleanup instruction / gasmeter
This commit is contained in:
commit
30908415bf
@ -17,8 +17,6 @@
|
|||||||
|
|
||||||
#include <libevmasm/AssemblyItem.h>
|
#include <libevmasm/AssemblyItem.h>
|
||||||
|
|
||||||
#include <libevmasm/SemanticInformation.h>
|
|
||||||
|
|
||||||
#include <libdevcore/CommonData.h>
|
#include <libdevcore/CommonData.h>
|
||||||
#include <libdevcore/FixedHash.h>
|
#include <libdevcore/FixedHash.h>
|
||||||
|
|
||||||
@ -112,7 +110,7 @@ bool AssemblyItem::canBeFunctional() const
|
|||||||
switch (m_type)
|
switch (m_type)
|
||||||
{
|
{
|
||||||
case Operation:
|
case Operation:
|
||||||
return !SemanticInformation::isDupInstruction(*this) && !SemanticInformation::isSwapInstruction(*this);
|
return !isDupInstruction(instruction()) && !isSwapInstruction(instruction());
|
||||||
case Push:
|
case Push:
|
||||||
case PushString:
|
case PushString:
|
||||||
case PushTag:
|
case PushTag:
|
||||||
|
@ -1,62 +0,0 @@
|
|||||||
/*
|
|
||||||
This file is part of solidity.
|
|
||||||
|
|
||||||
solidity is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
solidity is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with solidity. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
/** @file EVMSchedule.h
|
|
||||||
* @author Gav <i@gavwood.com>
|
|
||||||
* @author Christian <c@ethdev.com>
|
|
||||||
* @date 2015
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
namespace dev
|
|
||||||
{
|
|
||||||
namespace solidity
|
|
||||||
{
|
|
||||||
|
|
||||||
struct EVMSchedule
|
|
||||||
{
|
|
||||||
unsigned stackLimit = 1024;
|
|
||||||
unsigned expGas = 10;
|
|
||||||
unsigned expByteGas = 10;
|
|
||||||
unsigned keccak256Gas = 30;
|
|
||||||
unsigned keccak256WordGas = 6;
|
|
||||||
unsigned sloadGas = 200;
|
|
||||||
unsigned sstoreSetGas = 20000;
|
|
||||||
unsigned sstoreResetGas = 5000;
|
|
||||||
unsigned sstoreRefundGas = 15000;
|
|
||||||
unsigned jumpdestGas = 1;
|
|
||||||
unsigned logGas = 375;
|
|
||||||
unsigned logDataGas = 8;
|
|
||||||
unsigned logTopicGas = 375;
|
|
||||||
unsigned createGas = 32000;
|
|
||||||
unsigned callGas = 40;
|
|
||||||
unsigned callStipend = 2300;
|
|
||||||
unsigned callValueTransferGas = 9000;
|
|
||||||
unsigned callNewAccountGas = 25000;
|
|
||||||
unsigned selfdestructRefundGas = 24000;
|
|
||||||
unsigned memoryGas = 3;
|
|
||||||
unsigned quadCoeffDiv = 512;
|
|
||||||
unsigned createDataGas = 200;
|
|
||||||
unsigned txGas = 21000;
|
|
||||||
unsigned txCreateGas = 53000;
|
|
||||||
unsigned txDataZeroGas = 4;
|
|
||||||
unsigned txDataNonZeroGas = 68;
|
|
||||||
unsigned copyGas = 3;
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
@ -90,14 +90,14 @@ bool SemanticInformation::isDupInstruction(AssemblyItem const& _item)
|
|||||||
{
|
{
|
||||||
if (_item.type() != Operation)
|
if (_item.type() != Operation)
|
||||||
return false;
|
return false;
|
||||||
return Instruction::DUP1 <= _item.instruction() && _item.instruction() <= Instruction::DUP16;
|
return solidity::isDupInstruction(_item.instruction());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SemanticInformation::isSwapInstruction(AssemblyItem const& _item)
|
bool SemanticInformation::isSwapInstruction(AssemblyItem const& _item)
|
||||||
{
|
{
|
||||||
if (_item.type() != Operation)
|
if (_item.type() != Operation)
|
||||||
return false;
|
return false;
|
||||||
return Instruction::SWAP1 <= _item.instruction() && _item.instruction() <= Instruction::SWAP16;
|
return solidity::isSwapInstruction(_item.instruction());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SemanticInformation::isJumpInstruction(AssemblyItem const& _item)
|
bool SemanticInformation::isJumpInstruction(AssemblyItem const& _item)
|
||||||
|
@ -21,7 +21,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <test/libsolidity/SolidityExecutionFramework.h>
|
#include <test/libsolidity/SolidityExecutionFramework.h>
|
||||||
#include <libevmasm/EVMSchedule.h>
|
|
||||||
#include <libevmasm/GasMeter.h>
|
#include <libevmasm/GasMeter.h>
|
||||||
#include <libevmasm/KnownState.h>
|
#include <libevmasm/KnownState.h>
|
||||||
#include <libevmasm/PathGasMeter.h>
|
#include <libevmasm/PathGasMeter.h>
|
||||||
@ -63,15 +62,13 @@ public:
|
|||||||
|
|
||||||
void testCreationTimeGas(string const& _sourceCode)
|
void testCreationTimeGas(string const& _sourceCode)
|
||||||
{
|
{
|
||||||
EVMSchedule schedule;
|
|
||||||
|
|
||||||
compileAndRun(_sourceCode);
|
compileAndRun(_sourceCode);
|
||||||
auto state = make_shared<KnownState>();
|
auto state = make_shared<KnownState>();
|
||||||
PathGasMeter meter(*m_compiler.assemblyItems());
|
PathGasMeter meter(*m_compiler.assemblyItems());
|
||||||
GasMeter::GasConsumption gas = meter.estimateMax(0, state);
|
GasMeter::GasConsumption gas = meter.estimateMax(0, state);
|
||||||
u256 bytecodeSize(m_compiler.runtimeObject().bytecode.size());
|
u256 bytecodeSize(m_compiler.runtimeObject().bytecode.size());
|
||||||
// costs for deployment
|
// costs for deployment
|
||||||
gas += bytecodeSize * schedule.createDataGas;
|
gas += bytecodeSize * GasCosts::createDataGas;
|
||||||
// costs for transaction
|
// costs for transaction
|
||||||
gas += gasForTransaction(m_compiler.object().bytecode, true);
|
gas += gasForTransaction(m_compiler.object().bytecode, true);
|
||||||
|
|
||||||
@ -103,10 +100,9 @@ public:
|
|||||||
|
|
||||||
static GasMeter::GasConsumption gasForTransaction(bytes const& _data, bool _isCreation)
|
static GasMeter::GasConsumption gasForTransaction(bytes const& _data, bool _isCreation)
|
||||||
{
|
{
|
||||||
EVMSchedule schedule;
|
GasMeter::GasConsumption gas = _isCreation ? GasCosts::txCreateGas : GasCosts::txGas;
|
||||||
GasMeter::GasConsumption gas = _isCreation ? schedule.txCreateGas : schedule.txGas;
|
|
||||||
for (auto i: _data)
|
for (auto i: _data)
|
||||||
gas += i != 0 ? schedule.txDataNonZeroGas : schedule.txDataZeroGas;
|
gas += i != 0 ? GasCosts::txDataNonZeroGas : GasCosts::txDataZeroGas;
|
||||||
return gas;
|
return gas;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user