pragma solidity ^0.4.0;
contract Test {
function double(uint a) returns (uint) {
return multiply(a, 2);
}
function triple(uint a) returns (uint) {
return multiply(a, 3);
}
function multiply(uint a, uint b) internal returns (uint) {
return a * b;
}
}
$ solc --optimize --asm Test1.sol | head -n 50
Warning: This is a pre-release compiler version, please do not use it in production.
======= Test1.sol:Test =======
EVM assembly:
/* "Test1.sol":25:300 contract Test {... */
mstore(0x40, 0x60)
jumpi(tag_1, iszero(callvalue))
invalid
tag_1:
tag_2:
dataSize(sub_0)
dup1
dataOffset(sub_0)
0x0
codecopy
0x0
return
stop
sub_0: assembly {
/* "Test1.sol":25:300 contract Test {... */
mstore(0x40, 0x60)
and(div(calldataload(0x0), exp(0x2, 0xe0)), 0xffffffff)
0xeee97206
dup2
eq
tag_2
jumpi
dup1
0xf40a049d
eq
tag_3
jumpi
tag_1:
invalid
/* "Test1.sol":45:122 function double(uint a) returns (uint) {... */
tag_2:
特に読みやすいというわけではありません。
スマートコントラクトのソースコードを持っていて、ブロックチェーン上にあるコンパイル済みのスマートコントラクトと同じか類似しているかどうかを確認したいとします。ソースコードをバイトコードにコンパイルして、バイト単位で比較することができます。なぜなら、コンパイラは最適化が導入されるとバージョン間で非決定的になる傾向があるからだ。同じシステム上で2つの異なる実行を行った場合でも、コンパイルされたバイトコードは異なるものになる可能性があります。Solidity は決定論的であることを目標としていますが、常にそうではありませんでした。The DAO の場合、配置された DAO バイトコードがコンパイラの非決定性によって困難になったソースコードと一致しているかどうかを検証するための大規模な努力が行われました。
$ cat Test2.sol
pragma solidity ^0.4.0;
contract Test {
function double(uint a) returns (uint) {
return multiply(a, 2);
}
function triple(uint a) returns (uint) {
return multiply(a, 4);
}
function multiply(uint a, uint b) internal returns (uint) {
return a * b;
}
}
# because solc strips trailing numbers off of source code file names when it outputs them
$ mv Test.bin-runtime Test1.bin-runtime
$ solc --bin-runtime --optimize -o . Test2.sol
$ mv Test.bin-runtime Test2.bin-runtime
$ diff Test1.bin-runtime Test2.bin-runtime
1c1
< 606060405263ffffffff60e060020a600035041663eee972068114602a578063f40a049d14604c575bfe5b3415603157fe5b603a600435606e565b60408051918252519081900360200190f35b3415605357fe5b603a6004356081565b60408051918252519081900360200190f35b600060798260026094565b90505b919050565b600060798260036094565b90505b919050565b8181025b929150505600a165627a7a72305820d37021dfa166ba3f7f8d592355b8a9313292e2e008f24cbd45bf273c269f059f0029
\ No newline at end of file
---
> 606060405263ffffffff60e060020a600035041663eee972068114602a578063f40a049d14604c575bfe5b3415603157fe5b603a600435606e565b60408051918252519081900360200190f35b3415605357fe5b603a6004356081565b60408051918252519081900360200190f35b600060798260026094565b90505b919050565b600060798260046094565b90505b919050565b8181025b929150505600a165627a7a723058209a386daa605597ff9e13819e908aab2cafdc814ff67c34d318c4e7048eb5b9360029
\ No newline at end of file