Skip to content

Instantly share code, notes, and snippets.

@hitripod
Created March 14, 2017 07:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hitripod/b90af787defc6300dea09f48adbc6f26 to your computer and use it in GitHub Desktop.
Save hitripod/b90af787defc6300dea09f48adbc6f26 to your computer and use it in GitHub Desktop.
src/evm/libqtumevm/QuantumExtVM.h
/*
This file is part of cpp-ethereum.
cpp-ethereum 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.
cpp-ethereum 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 cpp-ethereum. If not, see <http://www.gnu.org/licenses/>.
*/
/** @file ExtVM.h
* @author Gav Wood <i@gavwood.com>
* @date 2014
*/
#ifndef QUANTUMEXTVM_H
#define QUANTUMEXTVM_H
#include <map>
#include <functional>
#include <libevm/ExtVMFace.h>
#include <libethereum/State.h>
namespace dev
{
namespace eth
{
/**
* @brief Externality interface for the Virtual Machine providing access to world state.
*/
class QuantumExtVM: public ExtVMFace
{
public:
QuantumExtVM(State& _s, EnvInfo const& _envInfo, SealEngineFace* _sealEngine, Address _myAddress, Address _caller, Address _origin, u256 _value, u256 _gasPrice, bytesConstRef _data, bytesConstRef _code, h256 const& _codeHash, unsigned _depth = 0):
ExtVMFace(_envInfo, _myAddress, _caller, _origin, _value, _gasPrice, _data, _code.toBytes(), _codeHash, _depth), m_s(_s), m_origCache(_s.m_cache), m_sealEngine(_sealEngine)
{
m_s.ensureCached(_myAddress, true, true);
}
/// Read storage location.
// virtual u256 store(u256 _n) override final { return 0; }
virtual u256 store(u256 _n) override final { return m_s.storage(myAddress, _n); }
/// Write a value in storage.
// virtual void setStore(u256 _n, u256 _v) override final { return; }
virtual void setStore(u256 _n, u256 _v) override final { m_s.setStorage(myAddress, _n, _v); }
/// Read address's code.
// virtual bytes const& codeAt(Address _a) override final { return code; }
virtual bytes const& codeAt(Address _a) override final { return m_s.code(_a); }
/// Create a new contract.
// virtual h160 create(u256 _endowment, u256& io_gas, bytesConstRef _code, OnOpFunc const& _onOp = {}) override final { return h160(); }
virtual h160 create(u256 _endowment, u256& io_gas, bytesConstRef _code, OnOpFunc const& _onOp = {}) override final;
/// Create a new message call. Leave _myAddressOverride as the default to use the present address as caller.
// virtual bool call(CallParameters& _params) override final { return false; }
virtual bool call(CallParameters& _params) override final;
/// Read address's balance.
// virtual u256 balance(Address _a) override final { return 0; }
virtual u256 balance(Address _a) override final { return m_s.balance(_a); }
/// Subtract amount from account's balance.
// virtual void subBalance(u256 _a) override final { }
virtual void subBalance(u256 _a) override final { m_s.subBalance(myAddress, _a); }
/// Determine account's TX count.
// virtual u256 txCount(Address _a) override final { return 0; }
virtual u256 txCount(Address _a) override final { return m_s.transactionsFrom(_a); }
/// Does the account exist?
// virtual bool exists(Address _a) override final { return false; }
virtual bool exists(Address _a) override final { return m_s.addressInUse(_a); }
/// Suicide the associated contract to the given address.
// virtual void suicide(Address _a) override final
// {
// }
virtual void suicide(Address _a) override final
{
m_sealEngine->txData.push_back({myAddress, _a, m_s.balance(myAddress), 0}); // TODO temp dataToTx
if(!m_s.addressInUse(_a)){
m_sealEngine->delAddresses.push_back(_a);
}
m_s.addBalance(_a, m_s.balance(myAddress));
m_s.subBalance(myAddress, m_s.balance(myAddress));
ExtVMFace::suicide(_a);
}
/// Revert any changes made (by any of the other calls).
/// @TODO check call site for the parent manifest being discarded.
virtual void revert() override final
{
m_s.m_cache = m_origCache;
m_sealEngine->txData.pop_back();
sub.clear();
}
/// Return the EVM gas-price schedule for this execution context.
// virtual EVMSchedule const& evmSchedule() const override final { return m_schedule; }
virtual EVMSchedule const& evmSchedule() const override final { return m_sealEngine->evmSchedule(envInfo()); }
State& state() const { return m_s; }
private:
SealEngineFace* m_sealEngine;
State& m_s; ///< A reference to the base state.
std::unordered_map<Address, Account> m_origCache; ///< The cache of the address states (i.e. the externalities) as-was prior to the execution.
};
}
}
#endif
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment