/* 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 . */ /** @file Ethereum.h * @author Gav Wood * @date 2014 */ #pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace dev { namespace eth { class Client; /** * @brief Main API hub for interfacing with Ethereum. * This class is automatically able to share a single machine-wide Client instance with other * instances, cross-process. * * Other than that, it provides much the same subset of functionality as Client. */ class Ethereum { friend class OldMiner; public: /// Constructor. After this, everything should be set up to go. Ethereum(); /// Destructor. ~Ethereum(); /// Submits the given message-call transaction. void submitTransaction(Secret _secret, u256 _value, Address _dest, bytes const& _data = bytes(), u256 _gas = 10000, u256 _gasPrice = 10 * szabo); /// Submits a new contract-creation transaction. /// @returns the new contract's address (assuming it all goes through). Address submitTransaction(Secret _secret, u256 _endowment, bytes const& _init, u256 _gas = 10000, u256 _gasPrice = 10 * szabo); /// Injects the RLP-encoded transaction given by the _rlp into the transaction queue directly. void inject(bytesConstRef _rlp); /// Blocks until all pending transactions have been processed. void flushTransactions(); /// Makes the given call. Nothing is recorded into the state. bytes call(Address const& _from, u256 _value, Address _dest, bytes const& _data = bytes(), u256 _gas = 10000, u256 _gasPrice = 10 * szabo); // Informational stuff // [NEW API] int getDefault() const { return m_default; } void setDefault(int _block) { m_default = _block; } u256 balanceAt(Address _a) const { return balanceAt(_a, m_default); } u256 countAt(Address _a) const { return countAt(_a, m_default); } u256 stateAt(Address _a, u256 _l) const { return stateAt(_a, _l, m_default); } bytes codeAt(Address _a) const { return codeAt(_a, m_default); } std::map storageAt(Address _a) const { return storageAt(_a, m_default); } u256 balanceAt(Address _a, int _block) const; u256 countAt(Address _a, int _block) const; u256 stateAt(Address _a, u256 _l, int _block) const; bytes codeAt(Address _a, int _block) const; std::map storageAt(Address _a, int _block) const; PastMessages messages(MessageFilter const& _filter) const; // [EXTRA API]: #if 0 /// Get a map containing each of the pending transactions. /// @TODO: Remove in favour of transactions(). Transactions pending() const { return m_postMine.pending(); } /// Differences between transactions. StateDiff diff(unsigned _txi) const { return diff(_txi, m_default); } StateDiff diff(unsigned _txi, h256 _block) const; StateDiff diff(unsigned _txi, int _block) const; /// Get a list of all active addresses. std::vector
addresses() const { return addresses(m_default); } std::vector
addresses(int _block) const; /// Get the fee associated for a transaction with the given data. static u256 txGas(uint _dataCount, u256 _gas = 0) { return c_txDataGas * _dataCount + c_txGas + _gas; } /// Get the remaining gas limit in this block. u256 gasLimitRemaining() const { return m_postMine.gasLimitRemaining(); } #endif // Network stuff: /// Get information on the current peer set. std::vector peers(); /// Same as peers().size(), but more efficient. size_t peerCount() const; /// Connect to a particular peer. void connect(std::string const& _seedHost, unsigned short _port = 30303); private: /// Ensure that through either the client or the void ensureReady(); /// Check to see if the client/server connection is open. bool connectionOpen() const; /// Start the API client. void connectToRPCServer(); /// Start the API server. void startRPCServer(); std::unique_ptr m_client; int m_default = -1; }; } }