Kerangka kerja untuk analisis tingkat tinggi bytecode Ethereum. Ethir membangun CFG yang lengkap dan sehat dari bytecode Ethereum dan menghasilkan representasi berbasis aturan (RBR) dari program ini. Representasi tingkat tinggi ini memungkinkan penerapan analisis tingkat tinggi yang ada untuk menyimpulkan sifat kode EVM.
Unduh Sumber Folder yang berisi statis yang dapat dieksekusi dari Solidity Compiler.
Tambahkan ke jalur dan uji yang diinstal.
sudo cp source/solc* /usr/bin/
sudo chmod 755 /usr/bin/solc*
solc --version
solcv5 --version
solcv6 --version
Jika Anda ingin menginstal versi terbaru:
sudo add-apt-repository ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install solc
Eksekusi statis disediakan di sumber folder.
Tambahkan OT ke jalur dan uji yang diinstal.
sudo cp source/evm* /usr/bin/
sudo chmod 755 /usr/bin/evm*
evm --version
Jika Anda ingin menginstal versi terbaru:
sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install ethereum
Unduh folder kode sumber.
Mendekompres folder dan instal.
unzip z3-z3-4.5.0.zip
cd z3-z3-4.5.0
python scripts/mk_make.py --python
cd build
make
sudo make install
Gunakan perintah pip install untuk menginstal enam, meminta pustaka Python.
pip install six
pip install requests
Perintah di atas mungkin gagal tergantung pada versi PIP. Jika itu masalahnya, jalankan perintah berikut alih -alih yang sebelumnya.
python -m pip install six
python -m pip install requests
Untuk memeriksa versi, jalankan perintah pip -V .
Untuk mengeksekusi Ethir, jalankan salah satu perintah berikut di dalam folder Ethir :
./oyente-ethir -s file_name.sol
./oyente-ethir -s file_name.evm -b
./oyente-ethir -s file_name.disasm -disasm
Perintah ./oyente-ethir -h menampilkan daftar dengan semua opsi ethir yang tersedia. Beberapa yang paling relevan adalah:
./oyente-ethir -s filename -cfg
./oyente-ethir -s filename -saco
./oyente-ethir -s filename -d
Semua file yang dihasilkan oleh Ethir selama pelaksanaannya disimpan di Direcrtory/TMP/Costabs/.
Setelah Ethir diinstal, misalkan kita ingin menghasilkan RBR dari File Disassembly Blockking.evm.Disasm tersedia dalam contoh folder. Pertama, kita harus pergi ke Direktori Ethir dan mengeksekusi perintah ./oyente-ethir -s ../examples/blockking.evm.disasm -disasm di sana.
Selama eksekusi, Ethir telah membuat direktori /tmp/costabs/ di mana ia menyimpan RBR yang terkait dengan file blockking.evm.disasm . Jika kami memeriksa direktori ini, kami menemukan file bernama RBR.RBR yang berisi RBR. Jika kita membuka file dengan editor umum (Gedit, Emacs) kita dapat melihat RBR yang dihasilkan. Di bawah ini adalah skecth dari RBR yang dihasilkan untuk file blockking.evm.disasm :
block0(g(11), g(10), g(9), g(8), g(7), g(6), g(5), g(4), g(3), g(2), g(1), g(0), l(8), l(7), l(6), l(5), l(4), l(3), l(2), l(1), l(0), calldatasize, calldataload, gas, caller, callvalue, number, gasprice, balance)=>
s(0) = 96
s(1) = 64
l(0) = s(0)
s(0) = calldatasize
call(jump0(s(0),g(11), g(10), g(9), g(8), g(7), g(6), g(5), g(4), g(3), g(2), g(1), g(0), l(8), l(7), l(6), l(5), l(4), l(3), l(2), l(1), l(0), calldatasize, calldataload, gas, caller, callvalue, number, gasprice, balance))
jump0(s(0), g(11), g(10), g(9), g(8), g(7), g(6), g(5), g(4), g(3), g(2), g(1), g(0), l(7), l(6), l(5), l(4), l(3), l(2), l(1), l(0), balance, calldataload, calldatasize, caller, callvalue, gas, gasprice, number)=>
eq(s(0), 0)
call(block174(g(11), g(8), g(4), g(1), g(0), l(7), l(6), l(5), l(4), l(3), l(2), l(1), l(0), caller, callvalue, gas, gasprice, number))
jump0(s(0), g(11), g(10), g(9), g(8), g(7), g(6), g(5), g(4), g(3), g(2), g(1), g(0), l(7), l(6), l(5), l(4), l(3), l(2), l(1), l(0), balance, calldataload, calldatasize, caller, callvalue, gas, gasprice, number)=>
neq(s(0), 0)
call(block11(g(11), g(10), g(9), g(8), g(7), g(6), g(5), g(4), g(3), g(2), g(1), g(0), l(7), l(6), l(5), l(4), l(3), l(2), l(1), l(0), balance, calldataload, caller, callvalue, gas, gasprice, number))
block11(g(11), g(10), g(9), g(8), g(7), g(6), g(5), g(4), g(3), g(2), g(1), g(0), l(7), l(6), l(5), l(4), l(3), l(2), l(1), l(0), balance, calldataload, caller, callvalue, gas, gasprice, number)=>
s(0) = 224
s(1) = 2
s(0) = s(1)^s(0)
s(1) = 0
s(1) = calldataload
s(0) = s(1)/s(0)
s(1) = 607252836
s(2) = s(0)
call(jump11(s(2),s(1),s(0),g(11), g(10), g(9), g(8), g(7), g(6), g(5), g(4), g(3), g(2), g(1), g(0), l(7), l(6), l(5), l(4), l(3), l(2), l(1), l(0), balance, calldataload, caller, callvalue, gas, gasprice, number))
Jika kita menjalankan perintah ./oyente-ethir -s ../examples/blockking.evm.disasm -disasm -eop bukan yang di atas, RBR yang dihasilkan Ethir memiliki anotasi NOPS, dengan evm bytecode yang diselingi dalam teks. Di bawah ini adalah sketsa RBR dengan anotasi NOPS yang dihasilkan untuk blockking.evm.disasm :
block0(g(11), g(10), g(9), g(8), g(7), g(6), g(5), g(4), g(3), g(2), g(1), g(0), l(8), l(7), l(6), l(5), l(4), l(3), l(2), l(1), l(0), calldatasize, calldataload, gas, caller, callvalue, number, gasprice, balance)=>
s(0) = 96
nop(PUSH1)
s(1) = 64
nop(PUSH1)
l(0) = s(0)
nop(MSTORE)
s(0) = calldatasize
nop(CALLDATASIZE)
call(jump0(s(0),g(11), g(10), g(9), g(8), g(7), g(6), g(5), g(4), g(3), g(2), g(1), g(0), l(8), l(7), l(6), l(5), l(4), l(3), l(2), l(1), l(0), calldatasize, calldataload, gas, caller, callvalue, number, gasprice, balance))
nop(ISZERO)
nop(PUSH2)
nop(JUMPI)
jump0(s(0), g(11), g(10), g(9), g(8), g(7), g(6), g(5), g(4), g(3), g(2), g(1), g(0), l(7), l(6), l(5), l(4), l(3), l(2), l(1), l(0), balance, calldataload, calldatasize, caller, callvalue, gas, gasprice, number)=>
eq(s(0), 0)
call(block174(g(11), g(8), g(4), g(1), g(0), l(7), l(6), l(5), l(4), l(3), l(2), l(1), l(0), caller, callvalue, gas, gasprice, number))
jump0(s(0), g(11), g(10), g(9), g(8), g(7), g(6), g(5), g(4), g(3), g(2), g(1), g(0), l(7), l(6), l(5), l(4), l(3), l(2), l(1), l(0), balance, calldataload, calldatasize, caller, callvalue, gas, gasprice, number)=>
neq(s(0), 0)
call(block11(g(11), g(10), g(9), g(8), g(7), g(6), g(5), g(4), g(3), g(2), g(1), g(0), l(7), l(6), l(5), l(4), l(3), l(2), l(1), l(0), balance, calldataload, caller, callvalue, gas, gasprice, number))
block11(g(11), g(10), g(9), g(8), g(7), g(6), g(5), g(4), g(3), g(2), g(1), g(0), l(7), l(6), l(5), l(4), l(3), l(2), l(1), l(0), balance, calldataload, caller, callvalue, gas, gasprice, number)=>
s(0) = 224
nop(PUSH1)
s(1) = 2
nop(PUSH1)
s(0) = s(1)^s(0)
nop(EXP)
s(1) = 0
nop(PUSH1)
s(1) = calldataload
nop(CALLDATALOAD)
s(0) = s(1)/s(0)
nop(DIV)
s(1) = 607252836
nop(PUSH4)
s(2) = s(0)
nop(DUP2)
call(jump11(s(2),s(1),s(0),g(11), g(10), g(9), g(8), g(7), g(6), g(5), g(4), g(3), g(2), g(1), g(0), l(7), l(6), l(5), l(4), l(3), l(2), l(1), l(0), balance, calldataload, caller, callvalue, gas, gasprice, number))
nop(EQ)
nop(PUSH2)
nop(JUMPI)
Ethir juga memungkinkan kita untuk menyimpan CFG file yang dianalisis. Dalam hal ini, kita harus mengeksekusi perintah ./oyente-ethir -s ../examples/blockking.evm.disasm -disasm -cfg . Ethir menyimpan CFG dalam file dengan ekstensi .cfg di direktori /TMP/coscabs/ .
Perhatikan bahwa file mungkin berisi lebih dari satu kontrak pintar. Dalam hal ini, Ethir menghasilkan satu file per setiap kontrak rbr0.rbr, rbr1.rbr, ... rbrn.rbr.
Contoh folder berisi contoh berjalan untuk menguji alat. Ada soliditas, EVM dan file pembongkaran.
Sebagian besar contoh seperti bloccking.evm.disasm, iklan.sol, validtoken.sol atau cryptophoenix.sol adalah kontrak dunia nyata yang diperoleh dari blockchain sementara yang lain seperti loop1.sol dan sum.sol adalah contoh ad-hoc di mana lebih mudah untuk memahami proses dekompilasi.
Saco adalah penganalisa statis untuk objek bersamaan yang, mampu menyimpulkan, di antara sifat -sifat lain, batas atas pada jumlah iterasi loop. Perhatikan bahwa ini adalah langkah penting pertama untuk menyimpulkan konsumsi gas dari kontrak pintar.
Representasi internal SACO cocok dengan tata bahasa RBR yang dihasilkan oleh Ethir setelah terjemahan sintaksis minor. Berkat ini, ini dapat membuktikan penghentian loop yang mengandung beberapa contoh dan menghasilkan linear terikat untuk loop tersebut. Berikut adalah beberapa batas loop yang disimpulkan oleh Saco untuk beberapa kontrak pintar yang terkandung dalam contoh folder:
| Kontrak Cerdas | Melompat | Kontrak Cerdas | Melompat |
|---|---|---|---|
| Blockking | NAT (G8/10)*36+8934493 | Cryptophoenix | NAT (G3)*228409344+4113285485 |
| Loop1 | NAT (A)*25+234 | Eligma | nat (_numberofreturns)*2628+134 |
| Lotere | 159 | Blocksquareseriea | 286 |
| Enclaves | 268 | Auctusether | 264 |
| Iklan | Inf | validtoken | Inf |
Saco menyimpulkan terikat linier untuk empat kontrak pintar pertama yang ditunjukkan pada tabel di atas. Batas -batas kontrak pintar Blockking dan Cryptophoenix bergantung pada nilai salah satu bidang mereka (masing -masing kedelapan dan ketiga). Untuk kontrak pintar Loop1 dan Eligma, batas -batas yang diperoleh mengandalkan argumen beberapa fungsinya (a dan _numberofreturns). Dalam hal kontrak pintar tidak mengandung loop seperti lotre, blocksquareseriea, kantong atau auctusether, SACO menyimpulkan ikatan yang konstan.
Perhatikan bahwa karena keterbatasan presisi SACO (tidak memiliki operasi bit dan model untuk fungsi sha3), penganalisa lupa informasi tentang variabel bit. Karena faktor ini, Saco tidak dapat menyimpulkan terikat untuk beberapa kontrak pintar seperti validtoken atau iklan dan pengembalian INF .
Analisis tingkat tinggi lainnya yang bekerja pada bentuk-bentuk menengah seperti sistem transisi integer atau klausa tanduk (misalnya, APROVE, T2, Verymax, Cofloco) dapat dengan mudah diadaptasi juga untuk bekerja pada program yang diterjemahkan RBR yang diproduksi oleh Ethir.
Jika Anda menarik dalam menggunakan Ethir bersama dengan Saco Contact Saco Developers melalui tarik-permintaan atau masalah baru.
Anda dapat mencoba prototipe pertama di sini. Gastap menyimpulkan terikat atas gas yang terlibat dalam setiap transaksi.