mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge remote-tracking branch 'origin/develop' into develop_060
This commit is contained in:
commit
42b8c98567
@ -127,6 +127,9 @@ Solidity Tools
|
|||||||
* `Universal Mutator <https://github.com/agroce/universalmutator>`_
|
* `Universal Mutator <https://github.com/agroce/universalmutator>`_
|
||||||
A tool for mutation generation, with configurable rules and support for Solidity and Vyper.
|
A tool for mutation generation, with configurable rules and support for Solidity and Vyper.
|
||||||
|
|
||||||
|
* `PIET <https://piet.slock.it/>`_
|
||||||
|
A tool to develop, audit and use solidity smart contracts through a simple graphical interface.
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
Information like variable names, comments, and source code formatting is lost in the compilation process and it is not possible to completely recover the original source code. Decompiling smart contracts to view the original source code might not be possible, or the end result that useful.
|
Information like variable names, comments, and source code formatting is lost in the compilation process and it is not possible to completely recover the original source code. Decompiling smart contracts to view the original source code might not be possible, or the end result that useful.
|
||||||
|
|
||||||
|
@ -356,13 +356,13 @@ string dev::eth::disassemble(bytes const& _mem)
|
|||||||
stringstream ret;
|
stringstream ret;
|
||||||
eachInstruction(_mem, [&](Instruction _instr, u256 const& _data) {
|
eachInstruction(_mem, [&](Instruction _instr, u256 const& _data) {
|
||||||
if (!isValidInstruction(_instr))
|
if (!isValidInstruction(_instr))
|
||||||
ret << "0x" << hex << int(_instr) << " ";
|
ret << "0x" << std::uppercase << std::hex << int(_instr) << " ";
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
InstructionInfo info = instructionInfo(_instr);
|
InstructionInfo info = instructionInfo(_instr);
|
||||||
ret << info.name << " ";
|
ret << info.name << " ";
|
||||||
if (info.additional)
|
if (info.additional)
|
||||||
ret << "0x" << hex << _data << " ";
|
ret << "0x" << std::uppercase << std::hex << _data << " ";
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return ret.str();
|
return ret.str();
|
||||||
|
@ -165,7 +165,7 @@ string EWasmToText::transform(wasm::FunctionDefinition const& _function)
|
|||||||
ret += " (result i64)\n";
|
ret += " (result i64)\n";
|
||||||
for (auto const& local: _function.locals)
|
for (auto const& local: _function.locals)
|
||||||
ret += " (local $" + local.variableName + " i64)\n";
|
ret += " (local $" + local.variableName + " i64)\n";
|
||||||
ret += indented(joinTransformed(_function.body));
|
ret += indented(joinTransformed(_function.body, '\n'));
|
||||||
if (ret.back() != '\n')
|
if (ret.back() != '\n')
|
||||||
ret += '\n';
|
ret += '\n';
|
||||||
ret += ")\n";
|
ret += ")\n";
|
||||||
|
@ -305,7 +305,7 @@ void CommandLineInterface::handleOpcode(string const& _contract)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
sout() << "Opcodes: " << endl;
|
sout() << "Opcodes: " << endl;
|
||||||
sout() << dev::eth::disassemble(m_compiler->object(_contract).bytecode);
|
sout() << std::uppercase << dev::eth::disassemble(m_compiler->object(_contract).bytecode);
|
||||||
sout() << endl;
|
sout() << endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,8 +15,12 @@
|
|||||||
(set_local $_2 (i64.const 65280))
|
(set_local $_2 (i64.const 65280))
|
||||||
(set_local $hi (i64.shl (i64.or (i64.shl (i64.or (i64.and (i64.shl (get_local $_1) (i64.const 8)) (get_local $_2)) (i64.and (i64.shr_u (get_local $_1) (i64.const 8)) (i64.const 255))) (i64.const 16)) (call $endian_swap_16 (i64.shr_u (get_local $_1) (i64.const 16)))) (i64.const 32)))
|
(set_local $hi (i64.shl (i64.or (i64.shl (i64.or (i64.and (i64.shl (get_local $_1) (i64.const 8)) (get_local $_2)) (i64.and (i64.shr_u (get_local $_1) (i64.const 8)) (i64.const 255))) (i64.const 16)) (call $endian_swap_16 (i64.shr_u (get_local $_1) (i64.const 16)))) (i64.const 32)))
|
||||||
(set_local $y (i64.or (get_local $hi) (call $endian_swap_32 (i64.shr_u (get_local $_1) (i64.const 32)))))
|
(set_local $y (i64.or (get_local $hi) (call $endian_swap_32 (i64.shr_u (get_local $_1) (i64.const 32)))))
|
||||||
(i64.store (get_local $pos) (get_local $y)) (i64.store (i64.add (get_local $pos) (i64.const 8)) (get_local $y)) (i64.store (i64.add (get_local $pos) (i64.const 16)) (get_local $y)) (set_local $hi_1 (i64.shl (i64.or (i64.shl (i64.or (i64.and (i64.shl (i64.const 64) (i64.const 8)) (get_local $_2)) (i64.and (i64.shr_u (i64.const 64) (i64.const 8)) (i64.const 255))) (i64.const 16)) (call $endian_swap_16 (i64.shr_u (i64.const 64) (i64.const 16)))) (i64.const 32)))
|
(i64.store (get_local $pos) (get_local $y))
|
||||||
(i64.store (i64.add (get_local $pos) (i64.const 24)) (i64.or (get_local $hi_1) (call $endian_swap_32 (i64.shr_u (i64.const 64) (i64.const 32))))) (call $eth.revert (call $u256_to_i32 (get_local $_1) (get_local $_1) (get_local $_1) (get_local $_1)) (call $u256_to_i32 (get_local $_1) (get_local $_1) (get_local $_1) (get_local $_1)))
|
(i64.store (i64.add (get_local $pos) (i64.const 8)) (get_local $y))
|
||||||
|
(i64.store (i64.add (get_local $pos) (i64.const 16)) (get_local $y))
|
||||||
|
(set_local $hi_1 (i64.shl (i64.or (i64.shl (i64.or (i64.and (i64.shl (i64.const 64) (i64.const 8)) (get_local $_2)) (i64.and (i64.shr_u (i64.const 64) (i64.const 8)) (i64.const 255))) (i64.const 16)) (call $endian_swap_16 (i64.shr_u (i64.const 64) (i64.const 16)))) (i64.const 32)))
|
||||||
|
(i64.store (i64.add (get_local $pos) (i64.const 24)) (i64.or (get_local $hi_1) (call $endian_swap_32 (i64.shr_u (i64.const 64) (i64.const 32)))))
|
||||||
|
(call $eth.revert (call $u256_to_i32 (get_local $_1) (get_local $_1) (get_local $_1) (get_local $_1)) (call $u256_to_i32 (get_local $_1) (get_local $_1) (get_local $_1) (get_local $_1)))
|
||||||
)
|
)
|
||||||
|
|
||||||
(func $u256_to_i32
|
(func $u256_to_i32
|
||||||
@ -81,9 +85,13 @@
|
|||||||
(set_local $pos (call $u256_to_i32 (get_local $_1) (get_local $_1) (get_local $_1) (i64.const 64)))
|
(set_local $pos (call $u256_to_i32 (get_local $_1) (get_local $_1) (get_local $_1) (i64.const 64)))
|
||||||
(set_local $hi (i64.shl (i64.or (i64.shl (i64.or (i64.and (i64.shl (get_local $_1) (i64.const 8)) (i64.const 65280)) (i64.and (i64.shr_u (get_local $_1) (i64.const 8)) (i64.const 255))) (i64.const 16)) (call $endian_swap_16 (i64.shr_u (get_local $_1) (i64.const 16)))) (i64.const 32)))
|
(set_local $hi (i64.shl (i64.or (i64.shl (i64.or (i64.and (i64.shl (get_local $_1) (i64.const 8)) (i64.const 65280)) (i64.and (i64.shr_u (get_local $_1) (i64.const 8)) (i64.const 255))) (i64.const 16)) (call $endian_swap_16 (i64.shr_u (get_local $_1) (i64.const 16)))) (i64.const 32)))
|
||||||
(set_local $y (i64.or (get_local $hi) (call $endian_swap_32 (i64.shr_u (get_local $_1) (i64.const 32)))))
|
(set_local $y (i64.or (get_local $hi) (call $endian_swap_32 (i64.shr_u (get_local $_1) (i64.const 32)))))
|
||||||
(i64.store (get_local $pos) (get_local $y)) (i64.store (i64.add (get_local $pos) (i64.const 8)) (get_local $y)) (i64.store (i64.add (get_local $pos) (i64.const 16)) (get_local $y)) (set_local $hi_1 (i64.shl (call $endian_swap_16 (i64.const 64)) (i64.const 16)))
|
(i64.store (get_local $pos) (get_local $y))
|
||||||
|
(i64.store (i64.add (get_local $pos) (i64.const 8)) (get_local $y))
|
||||||
|
(i64.store (i64.add (get_local $pos) (i64.const 16)) (get_local $y))
|
||||||
|
(set_local $hi_1 (i64.shl (call $endian_swap_16 (i64.const 64)) (i64.const 16)))
|
||||||
(set_local $hi_2 (i64.shl (i64.or (get_local $hi_1) (call $endian_swap_16 (i64.shr_u (i64.const 64) (i64.const 16)))) (i64.const 32)))
|
(set_local $hi_2 (i64.shl (i64.or (get_local $hi_1) (call $endian_swap_16 (i64.shr_u (i64.const 64) (i64.const 16)))) (i64.const 32)))
|
||||||
(i64.store (i64.add (get_local $pos) (i64.const 24)) (i64.or (get_local $hi_2) (call $endian_swap_32 (i64.shr_u (i64.const 64) (i64.const 32))))) (block
|
(i64.store (i64.add (get_local $pos) (i64.const 24)) (i64.or (get_local $hi_2) (call $endian_swap_32 (i64.shr_u (i64.const 64) (i64.const 32)))))
|
||||||
|
(block
|
||||||
(set_local $_2 (datasize \"C_2_deployed\"))
|
(set_local $_2 (datasize \"C_2_deployed\"))
|
||||||
(set_local $_3 (get_global $global_))
|
(set_local $_3 (get_global $global_))
|
||||||
(set_local $_4 (get_global $global__1))
|
(set_local $_4 (get_global $global__1))
|
||||||
@ -97,7 +105,8 @@
|
|||||||
(set_local $_9 (get_global $global__2))
|
(set_local $_9 (get_global $global__2))
|
||||||
|
|
||||||
)
|
)
|
||||||
(call $eth.codeCopy (call $u256_to_i32 (get_local $_1) (get_local $_1) (get_local $_1) (get_local $_1)) (call $u256_to_i32 (get_local $_6) (get_local $_7) (get_local $_8) (get_local $_9)) (call $u256_to_i32 (get_local $_2) (get_local $_3) (get_local $_4) (get_local $_5))) (call $eth.finish (call $u256_to_i32 (get_local $_1) (get_local $_1) (get_local $_1) (get_local $_1)) (call $u256_to_i32 (get_local $_2) (get_local $_3) (get_local $_4) (get_local $_5)))
|
(call $eth.codeCopy (call $u256_to_i32 (get_local $_1) (get_local $_1) (get_local $_1) (get_local $_1)) (call $u256_to_i32 (get_local $_6) (get_local $_7) (get_local $_8) (get_local $_9)) (call $u256_to_i32 (get_local $_2) (get_local $_3) (get_local $_4) (get_local $_5)))
|
||||||
|
(call $eth.finish (call $u256_to_i32 (get_local $_1) (get_local $_1) (get_local $_1) (get_local $_1)) (call $u256_to_i32 (get_local $_2) (get_local $_3) (get_local $_4) (get_local $_5)))
|
||||||
)
|
)
|
||||||
|
|
||||||
(func $u256_to_i32
|
(func $u256_to_i32
|
||||||
|
@ -52,7 +52,7 @@ void InterpreterState::dumpTraceAndState(ostream& _out) const
|
|||||||
words[(offset / 0x20) * 0x20] |= u256(uint32_t(value)) << (256 - 8 - 8 * size_t(offset % 0x20));
|
words[(offset / 0x20) * 0x20] |= u256(uint32_t(value)) << (256 - 8 - 8 * size_t(offset % 0x20));
|
||||||
for (auto const& [offset, value]: words)
|
for (auto const& [offset, value]: words)
|
||||||
if (value != 0)
|
if (value != 0)
|
||||||
_out << " " << std::hex << std::setw(4) << offset << ": " << h256(value).hex() << endl;
|
_out << " " << std::uppercase << std::hex << std::setw(4) << offset << ": " << h256(value).hex() << endl;
|
||||||
_out << "Storage dump:" << endl;
|
_out << "Storage dump:" << endl;
|
||||||
for (auto const& slot: storage)
|
for (auto const& slot: storage)
|
||||||
if (slot.second != h256(0))
|
if (slot.second != h256(0))
|
||||||
|
Loading…
Reference in New Issue
Block a user