/* 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 Transaction.cpp * @author Gav Wood * @date 2014 */ #include #include #include #include #include #include #include "Interface.h" #include "Transaction.h" using namespace std; using namespace dev; using namespace dev::eth; #define ETH_ADDRESS_DEBUG 0 std::ostream& dev::eth::operator<<(std::ostream& _out, ExecutionResult const& _er) { _out << "{" << _er.gasUsed << ", " << _er.newAddress << ", " << toHex(_er.output) << "}"; return _out; } TransactionException dev::eth::toTransactionException(Exception const& _e) { // Basic Transaction exceptions if (!!dynamic_cast(&_e)) return TransactionException::BadRLP; if (!!dynamic_cast(&_e)) return TransactionException::OutOfGasIntrinsic; if (!!dynamic_cast(&_e)) return TransactionException::InvalidSignature; // Executive exceptions if (!!dynamic_cast(&_e)) return TransactionException::OutOfGasBase; if (!!dynamic_cast(&_e)) return TransactionException::InvalidNonce; if (!!dynamic_cast(&_e)) return TransactionException::NotEnoughCash; if (!!dynamic_cast(&_e)) return TransactionException::BlockGasLimitReached; // VM execution exceptions if (!!dynamic_cast(&_e)) return TransactionException::BadInstruction; if (!!dynamic_cast(&_e)) return TransactionException::BadJumpDestination; if (!!dynamic_cast(&_e)) return TransactionException::OutOfGas; if (!!dynamic_cast(&_e)) return TransactionException::OutOfStack; if (!!dynamic_cast(&_e)) return TransactionException::StackUnderflow; return TransactionException::Unknown; } std::ostream& dev::eth::operator<<(std::ostream& _out, TransactionException const& _er) { switch (_er) { case TransactionException::None: _out << "None"; break; case TransactionException::BadRLP: _out << "BadRLP"; break; case TransactionException::InvalidFormat: _out << "InvalidFormat"; break; case TransactionException::OutOfGasIntrinsic: _out << "OutOfGasIntrinsic"; break; case TransactionException::InvalidSignature: _out << "InvalidSignature"; break; case TransactionException::InvalidNonce: _out << "InvalidNonce"; break; case TransactionException::NotEnoughCash: _out << "NotEnoughCash"; break; case TransactionException::OutOfGasBase: _out << "OutOfGasBase"; break; case TransactionException::BlockGasLimitReached: _out << "BlockGasLimitReached"; break; case TransactionException::BadInstruction: _out << "BadInstruction"; break; case TransactionException::BadJumpDestination: _out << "BadJumpDestination"; break; case TransactionException::OutOfGas: _out << "OutOfGas"; break; case TransactionException::OutOfStack: _out << "OutOfStack"; break; case TransactionException::StackUnderflow: _out << "StackUnderflow"; break; default: _out << "Unknown"; break; } return _out; } Transaction::Transaction(bytesConstRef _rlpData, CheckTransaction _checkSig): TransactionBase(_rlpData, _checkSig) { if (_checkSig >= CheckTransaction::Cheap && !checkPayment()) BOOST_THROW_EXCEPTION(OutOfGasIntrinsic() << RequirementError(gasRequired(), (bigint)gas())); } bigint Transaction::gasRequired() const { if (!m_gasRequired) m_gasRequired = Transaction::gasRequired(m_data); return m_gasRequired; }