diff --git a/libethereum/Instruction.cpp b/libethereum/Instruction.cpp index 660747cfe..b37303738 100644 --- a/libethereum/Instruction.cpp +++ b/libethereum/Instruction.cpp @@ -26,6 +26,116 @@ using namespace std; using namespace eth; +const std::map eth::c_instructionInfo = +{ + { Instruction::STOP, { "STOP", 0, 0, 0 } }, + { Instruction::ADD, { "ADD", 0, 2, 1 } }, + { Instruction::SUB, { "SUB", 0, 2, 1 } }, + { Instruction::MUL, { "MUL", 0, 2, 1 } }, + { Instruction::DIV, { "DIV", 0, 2, 1 } }, + { Instruction::SDIV, { "SDIV", 0, 2, 1 } }, + { Instruction::MOD, { "MOD", 0, 2, 1 } }, + { Instruction::SMOD, { "SMOD", 0, 2, 1 } }, + { Instruction::EXP, { "EXP", 0, 2, 1 } }, + { Instruction::NEG, { "NEG", 0, 1, 1 } }, + { Instruction::LT, { "LT", 0, 2, 1 } }, + { Instruction::LE, { "LE", 0, 2, 1 } }, + { Instruction::GT, { "GT", 0, 2, 1 } }, + { Instruction::GE, { "GE", 0, 2, 1 } }, + { Instruction::EQ, { "EQ", 0, 2, 1 } }, + { Instruction::NOT, { "NOT", 0, 1, 1 } }, + { Instruction::MYADDRESS, { "MYADDRESS", 0, 0, 1 } }, + { Instruction::TXSENDER, { "TXSENDER", 0, 0, 1 } }, + { Instruction::TXVALUE, { "TXVALUE", 0, 0, 1 } }, + { Instruction::TXDATAN, { "TXDATAN", 0, 0, 1 } }, + { Instruction::TXDATA, { "TXDATA", 0, 1, 1 } }, + { Instruction::BLK_PREVHASH, { "BLK_PREVHASH", 0, 0, 1 } }, + { Instruction::BLK_COINBASE, { "BLK_COINBASE", 0, 0, 1 } }, + { Instruction::BLK_TIMESTAMP, { "BLK_TIMESTAMP", 0, 0, 1 } }, + { Instruction::BLK_NUMBER, { "BLK_NUMBER", 0, 0, 1 } }, + { Instruction::BLK_DIFFICULTY, { "BLK_DIFFICULTY", 0, 0, 1 } }, + { Instruction::BLK_NONCE, { "BLK_NONCE", 0, 0, 1 } }, + { Instruction::BASEFEE, { "BASEFEE", 0, 0, 1 } }, + { Instruction::SHA256, { "SHA256", 0, -1, 1 } }, + { Instruction::RIPEMD160, { "RIPEMD160", 0, -1, 1 } }, + { Instruction::ECMUL, { "ECMUL", 0, 3, 1 } }, + { Instruction::ECADD, { "ECADD", 0, 4, 1 } }, + { Instruction::ECSIGN, { "ECSIGN", 0, 2, 1 } }, + { Instruction::ECRECOVER, { "ECRECOVER", 0, 4, 1 } }, + { Instruction::ECVALID, { "ECVALID", 0, 2, 1 } }, + { Instruction::SHA3, { "SHA3", 0, -1, 1 } }, + { Instruction::PUSH, { "PUSH", 1, 0, 1 } }, + { Instruction::POP, { "POP", 0, 1, 0 } }, + { Instruction::DUP, { "DUP", 0, 1, 2 } }, + { Instruction::SWAP, { "SWAP", 0, 2, 2 } }, + { Instruction::MLOAD, { "MLOAD", 0, 1, 1 } }, + { Instruction::MSTORE, { "MSTORE", 0, 2, 0 } }, + { Instruction::SLOAD, { "SLOAD", 0, 1, 1 } }, + { Instruction::SSTORE, { "SSTORE", 0, 2, 0 } }, + { Instruction::JMP, { "JMP", 0, 1, 0 } }, + { Instruction::JMPI, { "JMPI", 0, 2, 0 } }, + { Instruction::IND, { "IND", 0, 0, 1 } }, + { Instruction::EXTRO, { "EXTRO", 0, 2, 1 } }, + { Instruction::BALANCE, { "BALANCE", 0, 1, 1 } }, + { Instruction::MKTX, { "MKTX", 0, -3, 0 } }, + { Instruction::SUICIDE, { "SUICIDE", 0, 1, 0} } +}; + +const std::map eth::c_instructions = +{ + { "STOP", Instruction::STOP }, + { "ADD", Instruction::ADD }, + { "SUB", Instruction::SUB }, + { "MUL", Instruction::MUL }, + { "DIV", Instruction::DIV }, + { "SDIV", Instruction::SDIV }, + { "MOD", Instruction::MOD }, + { "SMOD", Instruction::SMOD }, + { "EXP", Instruction::EXP }, + { "NEG", Instruction::NEG }, + { "LT", Instruction::LT }, + { "LE", Instruction::LE }, + { "GT", Instruction::GT }, + { "GE", Instruction::GE }, + { "EQ", Instruction::EQ }, + { "NOT", Instruction::NOT }, + { "MYADDRESS", Instruction::MYADDRESS }, + { "TXSENDER", Instruction::TXSENDER }, + { "TXVALUE", Instruction::TXVALUE }, + { "TXDATAN", Instruction::TXDATAN }, + { "TXDATA", Instruction::TXDATA }, + { "BLK_PREVHASH", Instruction::BLK_PREVHASH }, + { "BLK_COINBASE", Instruction::BLK_COINBASE }, + { "BLK_TIMESTAMP", Instruction::BLK_TIMESTAMP }, + { "BLK_NUMBER", Instruction::BLK_NUMBER }, + { "BLK_DIFFICULTY", Instruction::BLK_DIFFICULTY }, + { "BLK_NONCE", Instruction::BLK_NONCE }, + { "BASEFEE", Instruction::BASEFEE }, + { "SHA256", Instruction::SHA256 }, + { "RIPEMD160", Instruction::RIPEMD160 }, + { "ECMUL", Instruction::ECMUL }, + { "ECADD", Instruction::ECADD }, + { "ECSIGN", Instruction::ECSIGN }, + { "ECRECOVER", Instruction::ECRECOVER }, + { "ECVALID", Instruction::ECVALID }, + { "SHA3", Instruction::SHA3 }, + { "PUSH", Instruction::PUSH }, + { "POP", Instruction::POP }, + { "DUP", Instruction::DUP }, + { "SWAP", Instruction::SWAP }, + { "MLOAD", Instruction::MLOAD }, + { "MSTORE", Instruction::MSTORE }, + { "SLOAD", Instruction::SLOAD }, + { "SSTORE", Instruction::SSTORE }, + { "JMP", Instruction::JMP }, + { "JMPI", Instruction::JMPI }, + { "IND", Instruction::IND }, + { "EXTRO", Instruction::EXTRO }, + { "BALANCE", Instruction::BALANCE }, + { "MKTX", Instruction::MKTX }, + { "SUICIDE", Instruction::SUICIDE } +}; + static string readQuoted(char const*& o_d, char const* _e) { string ret; diff --git a/libethereum/Instruction.h b/libethereum/Instruction.h index 1c17e61a6..268795266 100644 --- a/libethereum/Instruction.h +++ b/libethereum/Instruction.h @@ -86,121 +86,14 @@ enum class Instruction: uint8_t struct InstructionInfo { - std::string name; + char const* name; int additional; int args; int ret; }; -static const std::map c_instructionInfo = -{ - { Instruction::STOP, { "STOP", 0, 0, 0 } }, - { Instruction::ADD, { "ADD", 0, 2, 1 } }, - { Instruction::SUB, { "SUB", 0, 2, 1 } }, - { Instruction::MUL, { "MUL", 0, 2, 1 } }, - { Instruction::DIV, { "DIV", 0, 2, 1 } }, - { Instruction::SDIV, { "SDIV", 0, 2, 1 } }, - { Instruction::MOD, { "MOD", 0, 2, 1 } }, - { Instruction::SMOD, { "SMOD", 0, 2, 1 } }, - { Instruction::EXP, { "EXP", 0, 2, 1 } }, - { Instruction::NEG, { "NEG", 0, 1, 1 } }, - { Instruction::LT, { "LT", 0, 2, 1 } }, - { Instruction::LE, { "LE", 0, 2, 1 } }, - { Instruction::GT, { "GT", 0, 2, 1 } }, - { Instruction::GE, { "GE", 0, 2, 1 } }, - { Instruction::EQ, { "EQ", 0, 2, 1 } }, - { Instruction::NOT, { "NOT", 0, 1, 1 } }, - { Instruction::MYADDRESS, { "MYADDRESS", 0, 0, 1 } }, - { Instruction::TXSENDER, { "TXSENDER", 0, 0, 1 } }, - { Instruction::TXVALUE, { "TXVALUE", 0, 0, 1 } }, - { Instruction::TXDATAN, { "TXDATAN", 0, 0, 1 } }, - { Instruction::TXDATA, { "TXDATA", 0, 1, 1 } }, - { Instruction::BLK_PREVHASH, { "BLK_PREVHASH", 0, 0, 1 } }, - { Instruction::BLK_COINBASE, { "BLK_COINBASE", 0, 0, 1 } }, - { Instruction::BLK_TIMESTAMP, { "BLK_TIMESTAMP", 0, 0, 1 } }, - { Instruction::BLK_NUMBER, { "BLK_NUMBER", 0, 0, 1 } }, - { Instruction::BLK_DIFFICULTY, { "BLK_DIFFICULTY", 0, 0, 1 } }, - { Instruction::BLK_NONCE, { "BLK_NONCE", 0, 0, 1 } }, - { Instruction::BASEFEE, { "BASEFEE", 0, 0, 1 } }, - { Instruction::SHA256, { "SHA256", 0, -1, 1 } }, - { Instruction::RIPEMD160, { "RIPEMD160", 0, -1, 1 } }, - { Instruction::ECMUL, { "ECMUL", 0, 3, 1 } }, - { Instruction::ECADD, { "ECADD", 0, 4, 1 } }, - { Instruction::ECSIGN, { "ECSIGN", 0, 2, 1 } }, - { Instruction::ECRECOVER, { "ECRECOVER", 0, 4, 1 } }, - { Instruction::ECVALID, { "ECVALID", 0, 2, 1 } }, - { Instruction::SHA3, { "SHA3", 0, -1, 1 } }, - { Instruction::PUSH, { "PUSH", 1, 0, 1 } }, - { Instruction::POP, { "POP", 0, 1, 0 } }, - { Instruction::DUP, { "DUP", 0, 1, 2 } }, - { Instruction::SWAP, { "SWAP", 0, 2, 2 } }, - { Instruction::MLOAD, { "MLOAD", 0, 1, 1 } }, - { Instruction::MSTORE, { "MSTORE", 0, 2, 0 } }, - { Instruction::SLOAD, { "SLOAD", 0, 1, 1 } }, - { Instruction::SSTORE, { "SSTORE", 0, 2, 0 } }, - { Instruction::JMP, { "JMP", 0, 1, 0 } }, - { Instruction::JMPI, { "JMPI", 0, 2, 0 } }, - { Instruction::IND, { "IND", 0, 0, 1 } }, - { Instruction::EXTRO, { "EXTRO", 0, 2, 1 } }, - { Instruction::BALANCE, { "BALANCE", 0, 1, 1 } }, - { Instruction::MKTX, { "MKTX", 0, -3, 0 } }, - { Instruction::SUICIDE, { "SUICIDE", 0, 1, 0} } -}; - -static const std::map c_instructions = -{ - { "STOP", Instruction::STOP }, - { "ADD", Instruction::ADD }, - { "SUB", Instruction::SUB }, - { "MUL", Instruction::MUL }, - { "DIV", Instruction::DIV }, - { "SDIV", Instruction::SDIV }, - { "MOD", Instruction::MOD }, - { "SMOD", Instruction::SMOD }, - { "EXP", Instruction::EXP }, - { "NEG", Instruction::NEG }, - { "LT", Instruction::LT }, - { "LE", Instruction::LE }, - { "GT", Instruction::GT }, - { "GE", Instruction::GE }, - { "EQ", Instruction::EQ }, - { "NOT", Instruction::NOT }, - { "MYADDRESS", Instruction::MYADDRESS }, - { "TXSENDER", Instruction::TXSENDER }, - { "TXVALUE", Instruction::TXVALUE }, - { "TXDATAN", Instruction::TXDATAN }, - { "TXDATA", Instruction::TXDATA }, - { "BLK_PREVHASH", Instruction::BLK_PREVHASH }, - { "BLK_COINBASE", Instruction::BLK_COINBASE }, - { "BLK_TIMESTAMP", Instruction::BLK_TIMESTAMP }, - { "BLK_NUMBER", Instruction::BLK_NUMBER }, - { "BLK_DIFFICULTY", Instruction::BLK_DIFFICULTY }, - { "BLK_NONCE", Instruction::BLK_NONCE }, - { "BASEFEE", Instruction::BASEFEE }, - { "SHA256", Instruction::SHA256 }, - { "RIPEMD160", Instruction::RIPEMD160 }, - { "ECMUL", Instruction::ECMUL }, - { "ECADD", Instruction::ECADD }, - { "ECSIGN", Instruction::ECSIGN }, - { "ECRECOVER", Instruction::ECRECOVER }, - { "ECVALID", Instruction::ECVALID }, - { "SHA3", Instruction::SHA3 }, - { "PUSH", Instruction::PUSH }, - { "POP", Instruction::POP }, - { "DUP", Instruction::DUP }, - { "SWAP", Instruction::SWAP }, - { "MLOAD", Instruction::MLOAD }, - { "MSTORE", Instruction::MSTORE }, - { "SLOAD", Instruction::SLOAD }, - { "SSTORE", Instruction::SSTORE }, - { "JMP", Instruction::JMP }, - { "JMPI", Instruction::JMPI }, - { "IND", Instruction::IND }, - { "EXTRO", Instruction::EXTRO }, - { "BALANCE", Instruction::BALANCE }, - { "MKTX", Instruction::MKTX }, - { "SUICIDE", Instruction::SUICIDE } -}; +extern const std::map c_instructionInfo; +extern const std::map c_instructions; u256s assemble(std::string const& _code, bool _quiet = false); std::string disassemble(u256s const& _mem);