Jika Anda pernah melakukan transaksi di Ethereum (atau blockchain yang memungkinkan kontrak pintar lainnya), maka Anda mungkin telah mencarinya di penjelajah blok seperti etherscan.io dan melihat tumpukan informasi ini:
Tab Gambaran Transaksi
Dan jika Anda mencoba melihat log atau jejak (tx internal), Anda mungkin telah melihat halaman-halaman membingungkan ini:
Tab Log (Anda beruntung jika mereka di-decode dengan baik seperti ini)
Tab Jejak (yeah terlihat seperti sekumpulan omong kosong)
Belajar membaca detail transaksi di penjelajah blok akan menjadi dasar untuk semua analisis data Ethereum dan pengetahuan Anda, jadi mari kita bahas semua bagian dan cara kerjanya dengan SQL.
Saya hanya akan membahas bagaimana memahami konsep-konsep ini secara umum; jika Anda ingin belajar untuk mendekripsi ini secara manual, maka Anda perlu menjadi akrab dengan bagaimana data dienkripsi(sama halnya dengan transaksi/jejak/log) dan bagaimana cara menggunakanFungsi bytearray/hex Duneuntuk beralih antara berbagai jenis.
Pada akhir panduan ini, Anda akan dapat memahami dan menavigasi tabel data untuk kontrak apa pun menggunakan kueri pencari tabel transaksi ini:
Tautan Kueri(Masukkan hash tx, rantai, dan nomor blok apa pun)
Setelah Anda mempelajari konsep-konsep dalam panduan ini, Anda juga sebaiknya belajar untuk menggunakan sayaDasbor memulai cepat EVMuntuk memulai analisis kontrak apa pun.
·
30 Desember 2022
Transaksi hanya ujung gunung es data, semua jejak dan log dipanggil SETELAH data masukan awal memulai fungsi tingkat atas. Mari kita pertama-tama menandai semua bidang yang akan Anda lihat di halaman transaksi block explorer:
Ini adalah bidang-bidang yang sama yang akan Anda lihat ketika Anda menanyakan “ethereum.transactions” di Dune. Item kunci yang perlu dipelajari untuk diidentifikasi di sini adalah apakah “to” adalah kontrak atau tidak. Biasanya, kontrak akan jelas dilabeli. Jika itu adalah kontrak, seharusnya ada “input data” yang berisi panggilan fungsi.
Dari semua konsep ini, yang pertama untuk dipelajari dengan baik adalah EOA versus alamat kontrak. Kontrak diterapkan oleh EOA, dan dapat dipanggil dalam kolom "to" dari transaksi. Jika Anda mengklik suatu alamat, penjelajah akan menunjukkan di bagian kiri atas apakah itu kontrak atau akun. Di dune, Anda dapat bergabung pada tabel ethereum.creation_traces untuk memeriksa apakah itu kontrak. Perhatikan bahwa hanya EOA yang dapat menjadi penandatangan "from" tx.
Penting untuk mempelajari data apa yang berasal langsung dari onchain versus data apa yang ditambahkan oleh explorer/frontends di atasnya. Semua di blockchain diwakili sebagai heksadesimal (kadang-kadang disebut biner atau byte), jadi panggilan pertukaran 1inch akan memiliki string data input ini:
4 byte pertama (8 karakter) adalah “tanda tangan fungsi”, yang merupakan hash keccakdari nama fungsi dan jenis input. Etherscan memiliki tombol “decode” yang bagus untuk beberapa kontrak, memberikan Anda bentuk yang dapat dibaca ini:
Seperti yang dapat Anda lihat, ada banyak variabel yang dikemas bersama ke dalam string heksadesimal panjang dari sebelumnya. Cara mereka di-encode mengikuti spesifikasi antarmuka biner aplikasi (ABI) dari kontrak pintar.
ABI's mirip dengan dokumentasi API untuk kontrak pintar (seperti spesifikasi OpenAPI), Anda dapat membaca lebih lanjut di sinidetail teknis di siniKebanyakan pengembang akan memverifikasi ABI mereka sesuai dengan kontrak dan mengunggah ABI untuk orang lain merujuk dalam mendekode. Banyak kontrak mungkin terkait dengan MEV/perdagangan, di mana pengembang ingin menjaga hal-hal tertutup dan pribadi - jadi kita tidak mendapatkan dekode apa pun dari mereka.
Di Dune, kami telah mendekode tabelberdasarkan kontrak ABIs yang diajukanke dalam tabel kontrak (yaitu ethereum.contracts), fungsi dan acara dikonversi menjadi tanda tangan byte (ethereum.signatures) yang kemudian dicocokkan dengan jejak dan log untuk memberikan Anda tabel yang didekodekan seperti uniswap_v2_ethereum.Pair_evt_Swap yang menyimpan semua pertukaran untuk semua kontrak pasangan yang dibuat oleh pabrik pasangan Uniswap v2. Anda dapat menyaring pertukaran pada pasangan tertentu dengan melihat tabel alamat kontrak untuk acara.
Di Dune, Anda akan ingin mengambil tabel ini untuk panggilan fungsi oneinch_ethereum.AggregationRouterV6_call_swap. Anda akan melihat bahwa nama tabel ini berada di bagian atas hasil kueri pada penemuan tabel di awal panduan.
Untuk bagian-bagian berikut tentang jejak dan log, kami akan menggunakan transaksi swap agregator 1inch yang samaIni adalah contoh yang bagus karena router akan menukar token di berbagai kontrak DEX, jadi kita akan mendapatkan beragam jejak dan log untuk diselidiki.
Selanjutnya, mari kita bicarakan tentang log acara. Log dapat dipancarkan pada titik manapun dalam panggilan fungsi. Pengembang biasanya akan memancarkan log pada akhir fungsi, setelah semua transfer/logika selesai tanpa kesalahan. Mari kita lihat acara swap uniswap v3 yang dipancarkan dari transaksi sebelumnya:
Anda akan melihat ada bidang topic0, topic1, topic2, dan data. topic0 mirip dengan tanda tangan fungsi, kecuali 32 byte, bukan hanya 4 byte (masih di-hash dengan cara yang sama). Peristiwa dapat memiliki kolom "diindeks" untuk pemfilteran data yang lebih cepat, yang dapat muncul di topik1, topik2, atau topik3. Semua bidang lainnya dikodekan bersama dalam objek "data". Sekali lagi, mereka mengikuti aturan pengkodean yang sama dengan transaksi dan jejak. "28" adalah indeks acara di seluruh blok. Terkadang berguna untuk bergabung ketika Anda menginginkan swap atau transfer pertama dalam tx.
Untuk menemukan logika di balik di mana dan bagaimana peristiwa ini dipancarkan, saya harus menyelami kode soliditas. Saya akan mengklik alamat acara yang ditautkan, pergi ke tab kontrak, dan mencari "emit swap" karena saya tahu bahwa semua acara telah "memancarkan" tepat sebelum mereka dipanggil dalam kode.
Ini adalah kontrak uniswapv3poolyang dibuat pabrik untuk setiap pasangan.
Saya bisa melihat bahwa ini dipancarkan di baris 786 dari kontrak, sebagai bagian dari fungsi “swap”.
Mampu menavigasi fungsi dan garis keturunan acara di sepanjang kontrak akan menjadi keterampilan kunci yang perlu Anda pelajari untuk memahami dengan akurat garis keturunan data yang sedang Anda minta. Anda tidak perlu belajar soliditas secara mendalam untuk menavigasi file-file ini, hanya tahu bagaimana memahami antarmuka kontrakdan ketika fungsi/acara dipanggil (fungsi dan emit adalah kata kunci Anda).
Untuk contoh yang mendalam dari penyelidikan kode untuk fungsi dan peristiwa,periksa pemecahan kontrak Sudoswap dan data ini.
Menggunakan kueri penemuan tabel dari sebelumnya, saya dapat melihat bahwa tabel yang harus saya kueri untuk swap ini adalah uniswap_v3_ethereum.Pair_evt_Swap dan bahwa itu dipancarkan setelah fungsi swap() dipanggil.
Jejak dapat dengan cepat menjadi sangat sulit untuk dinavigasi, karena panggilan bersarang antara kontrak yang berbeda. Mari kita pertama-tama memahami jenis jejak:
Anda juga perlu memahami kolom/indeks trace_address. Ini adalah pola [0,1,1,1,1] yang sering Anda lihat. Bayangkan itu seperti poin-poin penting, di mana jumlah angka dalam array menunjukkan kedalaman dan urutan panggilan fungsi.
Sebuah (null) —input transaksi pertama memiliki trace_address dari []
CALLs B (0)
CALLs C (0,0)
Panggilan D (1)
CALLs E (1,0) CALLs F (1,0,0)CALLs G (1,1)
PANGGILAN H (2)
Seperti yang dapat Anda lihat dari tangkapan layar transaksi internal (jejak) sebelumnya kami, etherscan bukanlah tempat yang ramah untuk melihat jejak. Saya lebih suka menggunakan phalcon blocksec, yang membuka transaksi seperti ini:
Ini mungkin terlihat membingungkan, tetapi sebenarnya cara yang sangat mudah untuk menjelajahi semua fungsi, peristiwa, dan argumen dalam aliran transaksi. Setelah Anda dapat memahami ini, maka Anda dapat dengan aman mengatakan Anda memahami semua data dalam sebuah transaksi. Perhatikan bahwa saya tabel pencari queryadalah salinan hampir persis dari tata letak ini, saya sangat terinspirasi oleh mereka!
Perlu diingat bahwa di Dune, kami secara otomatis mendekode panggilan transaksi dan jejak dari nama fungsi yang sama ke tabel yang sama. Anda mungkin bertanya-tanya apakah Anda dapat dengan mudah bergabung dengan acara dan jejak/transaksi dalam urutan yang bagus seperti yang ditunjukkan di phalcon. Di Dune, Anda dapat bergabung dengan hash transaksi untuk umumnya mengikat data bersama, tetapi Anda tidak dapat bergabung pada indeks apa pun untuk membuat kembali urutan interaksi yang tepat. Ini adalah keterbatasan yang tidak menguntungkan saat ini yang memerlukan indexer khusus.
Jika Anda memahami konsep-konsep yang saya jelaskan dalam panduan ini, maka Anda siap untuk menggali lebih dalam dan menulis kueri yang lebih kompleks. Menavigasi data melintasi transaksi menggunakan beberapa alat yang berbeda akan menjadi salah satu keterampilan kunci yang paling Anda perlukan untuk berhasil di ruang ini.
Mungkin ada 10 penjelajah berbeda yang saya gunakan setiap minggu, dan jumlah alatnya 10 kali lipat dari jumlah itu. Saya menulis panduan tahunan yang mencakup bagaimana tumpukan alat data terus berkembang, dan untuk apa Anda harus menggunakan setiap alat:
Пригласить больше голосов
Jika Anda pernah melakukan transaksi di Ethereum (atau blockchain yang memungkinkan kontrak pintar lainnya), maka Anda mungkin telah mencarinya di penjelajah blok seperti etherscan.io dan melihat tumpukan informasi ini:
Tab Gambaran Transaksi
Dan jika Anda mencoba melihat log atau jejak (tx internal), Anda mungkin telah melihat halaman-halaman membingungkan ini:
Tab Log (Anda beruntung jika mereka di-decode dengan baik seperti ini)
Tab Jejak (yeah terlihat seperti sekumpulan omong kosong)
Belajar membaca detail transaksi di penjelajah blok akan menjadi dasar untuk semua analisis data Ethereum dan pengetahuan Anda, jadi mari kita bahas semua bagian dan cara kerjanya dengan SQL.
Saya hanya akan membahas bagaimana memahami konsep-konsep ini secara umum; jika Anda ingin belajar untuk mendekripsi ini secara manual, maka Anda perlu menjadi akrab dengan bagaimana data dienkripsi(sama halnya dengan transaksi/jejak/log) dan bagaimana cara menggunakanFungsi bytearray/hex Duneuntuk beralih antara berbagai jenis.
Pada akhir panduan ini, Anda akan dapat memahami dan menavigasi tabel data untuk kontrak apa pun menggunakan kueri pencari tabel transaksi ini:
Tautan Kueri(Masukkan hash tx, rantai, dan nomor blok apa pun)
Setelah Anda mempelajari konsep-konsep dalam panduan ini, Anda juga sebaiknya belajar untuk menggunakan sayaDasbor memulai cepat EVMuntuk memulai analisis kontrak apa pun.
·
30 Desember 2022
Transaksi hanya ujung gunung es data, semua jejak dan log dipanggil SETELAH data masukan awal memulai fungsi tingkat atas. Mari kita pertama-tama menandai semua bidang yang akan Anda lihat di halaman transaksi block explorer:
Ini adalah bidang-bidang yang sama yang akan Anda lihat ketika Anda menanyakan “ethereum.transactions” di Dune. Item kunci yang perlu dipelajari untuk diidentifikasi di sini adalah apakah “to” adalah kontrak atau tidak. Biasanya, kontrak akan jelas dilabeli. Jika itu adalah kontrak, seharusnya ada “input data” yang berisi panggilan fungsi.
Dari semua konsep ini, yang pertama untuk dipelajari dengan baik adalah EOA versus alamat kontrak. Kontrak diterapkan oleh EOA, dan dapat dipanggil dalam kolom "to" dari transaksi. Jika Anda mengklik suatu alamat, penjelajah akan menunjukkan di bagian kiri atas apakah itu kontrak atau akun. Di dune, Anda dapat bergabung pada tabel ethereum.creation_traces untuk memeriksa apakah itu kontrak. Perhatikan bahwa hanya EOA yang dapat menjadi penandatangan "from" tx.
Penting untuk mempelajari data apa yang berasal langsung dari onchain versus data apa yang ditambahkan oleh explorer/frontends di atasnya. Semua di blockchain diwakili sebagai heksadesimal (kadang-kadang disebut biner atau byte), jadi panggilan pertukaran 1inch akan memiliki string data input ini:
4 byte pertama (8 karakter) adalah “tanda tangan fungsi”, yang merupakan hash keccakdari nama fungsi dan jenis input. Etherscan memiliki tombol “decode” yang bagus untuk beberapa kontrak, memberikan Anda bentuk yang dapat dibaca ini:
Seperti yang dapat Anda lihat, ada banyak variabel yang dikemas bersama ke dalam string heksadesimal panjang dari sebelumnya. Cara mereka di-encode mengikuti spesifikasi antarmuka biner aplikasi (ABI) dari kontrak pintar.
ABI's mirip dengan dokumentasi API untuk kontrak pintar (seperti spesifikasi OpenAPI), Anda dapat membaca lebih lanjut di sinidetail teknis di siniKebanyakan pengembang akan memverifikasi ABI mereka sesuai dengan kontrak dan mengunggah ABI untuk orang lain merujuk dalam mendekode. Banyak kontrak mungkin terkait dengan MEV/perdagangan, di mana pengembang ingin menjaga hal-hal tertutup dan pribadi - jadi kita tidak mendapatkan dekode apa pun dari mereka.
Di Dune, kami telah mendekode tabelberdasarkan kontrak ABIs yang diajukanke dalam tabel kontrak (yaitu ethereum.contracts), fungsi dan acara dikonversi menjadi tanda tangan byte (ethereum.signatures) yang kemudian dicocokkan dengan jejak dan log untuk memberikan Anda tabel yang didekodekan seperti uniswap_v2_ethereum.Pair_evt_Swap yang menyimpan semua pertukaran untuk semua kontrak pasangan yang dibuat oleh pabrik pasangan Uniswap v2. Anda dapat menyaring pertukaran pada pasangan tertentu dengan melihat tabel alamat kontrak untuk acara.
Di Dune, Anda akan ingin mengambil tabel ini untuk panggilan fungsi oneinch_ethereum.AggregationRouterV6_call_swap. Anda akan melihat bahwa nama tabel ini berada di bagian atas hasil kueri pada penemuan tabel di awal panduan.
Untuk bagian-bagian berikut tentang jejak dan log, kami akan menggunakan transaksi swap agregator 1inch yang samaIni adalah contoh yang bagus karena router akan menukar token di berbagai kontrak DEX, jadi kita akan mendapatkan beragam jejak dan log untuk diselidiki.
Selanjutnya, mari kita bicarakan tentang log acara. Log dapat dipancarkan pada titik manapun dalam panggilan fungsi. Pengembang biasanya akan memancarkan log pada akhir fungsi, setelah semua transfer/logika selesai tanpa kesalahan. Mari kita lihat acara swap uniswap v3 yang dipancarkan dari transaksi sebelumnya:
Anda akan melihat ada bidang topic0, topic1, topic2, dan data. topic0 mirip dengan tanda tangan fungsi, kecuali 32 byte, bukan hanya 4 byte (masih di-hash dengan cara yang sama). Peristiwa dapat memiliki kolom "diindeks" untuk pemfilteran data yang lebih cepat, yang dapat muncul di topik1, topik2, atau topik3. Semua bidang lainnya dikodekan bersama dalam objek "data". Sekali lagi, mereka mengikuti aturan pengkodean yang sama dengan transaksi dan jejak. "28" adalah indeks acara di seluruh blok. Terkadang berguna untuk bergabung ketika Anda menginginkan swap atau transfer pertama dalam tx.
Untuk menemukan logika di balik di mana dan bagaimana peristiwa ini dipancarkan, saya harus menyelami kode soliditas. Saya akan mengklik alamat acara yang ditautkan, pergi ke tab kontrak, dan mencari "emit swap" karena saya tahu bahwa semua acara telah "memancarkan" tepat sebelum mereka dipanggil dalam kode.
Ini adalah kontrak uniswapv3poolyang dibuat pabrik untuk setiap pasangan.
Saya bisa melihat bahwa ini dipancarkan di baris 786 dari kontrak, sebagai bagian dari fungsi “swap”.
Mampu menavigasi fungsi dan garis keturunan acara di sepanjang kontrak akan menjadi keterampilan kunci yang perlu Anda pelajari untuk memahami dengan akurat garis keturunan data yang sedang Anda minta. Anda tidak perlu belajar soliditas secara mendalam untuk menavigasi file-file ini, hanya tahu bagaimana memahami antarmuka kontrakdan ketika fungsi/acara dipanggil (fungsi dan emit adalah kata kunci Anda).
Untuk contoh yang mendalam dari penyelidikan kode untuk fungsi dan peristiwa,periksa pemecahan kontrak Sudoswap dan data ini.
Menggunakan kueri penemuan tabel dari sebelumnya, saya dapat melihat bahwa tabel yang harus saya kueri untuk swap ini adalah uniswap_v3_ethereum.Pair_evt_Swap dan bahwa itu dipancarkan setelah fungsi swap() dipanggil.
Jejak dapat dengan cepat menjadi sangat sulit untuk dinavigasi, karena panggilan bersarang antara kontrak yang berbeda. Mari kita pertama-tama memahami jenis jejak:
Anda juga perlu memahami kolom/indeks trace_address. Ini adalah pola [0,1,1,1,1] yang sering Anda lihat. Bayangkan itu seperti poin-poin penting, di mana jumlah angka dalam array menunjukkan kedalaman dan urutan panggilan fungsi.
Sebuah (null) —input transaksi pertama memiliki trace_address dari []
CALLs B (0)
CALLs C (0,0)
Panggilan D (1)
CALLs E (1,0) CALLs F (1,0,0)CALLs G (1,1)
PANGGILAN H (2)
Seperti yang dapat Anda lihat dari tangkapan layar transaksi internal (jejak) sebelumnya kami, etherscan bukanlah tempat yang ramah untuk melihat jejak. Saya lebih suka menggunakan phalcon blocksec, yang membuka transaksi seperti ini:
Ini mungkin terlihat membingungkan, tetapi sebenarnya cara yang sangat mudah untuk menjelajahi semua fungsi, peristiwa, dan argumen dalam aliran transaksi. Setelah Anda dapat memahami ini, maka Anda dapat dengan aman mengatakan Anda memahami semua data dalam sebuah transaksi. Perhatikan bahwa saya tabel pencari queryadalah salinan hampir persis dari tata letak ini, saya sangat terinspirasi oleh mereka!
Perlu diingat bahwa di Dune, kami secara otomatis mendekode panggilan transaksi dan jejak dari nama fungsi yang sama ke tabel yang sama. Anda mungkin bertanya-tanya apakah Anda dapat dengan mudah bergabung dengan acara dan jejak/transaksi dalam urutan yang bagus seperti yang ditunjukkan di phalcon. Di Dune, Anda dapat bergabung dengan hash transaksi untuk umumnya mengikat data bersama, tetapi Anda tidak dapat bergabung pada indeks apa pun untuk membuat kembali urutan interaksi yang tepat. Ini adalah keterbatasan yang tidak menguntungkan saat ini yang memerlukan indexer khusus.
Jika Anda memahami konsep-konsep yang saya jelaskan dalam panduan ini, maka Anda siap untuk menggali lebih dalam dan menulis kueri yang lebih kompleks. Menavigasi data melintasi transaksi menggunakan beberapa alat yang berbeda akan menjadi salah satu keterampilan kunci yang paling Anda perlukan untuk berhasil di ruang ini.
Mungkin ada 10 penjelajah berbeda yang saya gunakan setiap minggu, dan jumlah alatnya 10 kali lipat dari jumlah itu. Saya menulis panduan tahunan yang mencakup bagaimana tumpukan alat data terus berkembang, dan untuk apa Anda harus menggunakan setiap alat: