Belajar Topik Dasar Ethereum dengan SQL
Banyak tutorial Ethereum ditujukan untuk para pengembang, tetapi ada kekurangan sumber edukasi untuk analis data atau untuk orang-orang yang ingin melihat data on-chain tanpa menjalankan klien atau node.
Tutorial ini menolong pembaca memahami konsep dasar Ethereum termasuk transaksi, blok, dan gas dengan membuat kueri data on-chain dengan Structured Query Language (SQL) melalui antarmuka yang disediakan oleh Analitik Dune(opens in a new tab).
Data on-chain dapat menolong kita memahami Ethereum, jaringannya, dan sebagai ekonomi untuk daya komputasi dan seharusnya berfungsi sebagai dasar untuk memahami tantangan yang dihadapi Ethereum hari ini (yaitu, harga gas yang terus naik) dan, lebih penting lagi, diskusi tentang solusi penskalaan.
Transaksi
Perjalanan pengguna di Ethereum dimulai dengan menginisialisasi akun yang dikontrol penggunga atau entitas dengan saldo ETH. Ada dua jenis akun - yang dikontrol pengguna atau kontrak pintar (lihat ethereum.org).
Akun mana pun dapat dilihat di penjelajah blok seperti Etherscan(opens in a new tab). Penjelajah blok adalah portal ke data Ethereum. Mereka menampilkan, dalam waktu nyata, data di blok, transaksi, penambang, akun, dan akivitas on-chain lainnya (lihat di sini).
Namun, seorang pengguna mungkin ingin membuat kueri data secara langsung untuk mencocokkan informasi yang disediakan oleh penjelajah blok eksternal. Analitik Dune(opens in a new tab) menyediakan kemampuan ini untuk siapa pun dengan beberapa pengetahuan SQL.
Sebagai referensi, akun kontrak pintar untuk Yayasan Ethereum (EF) dapat dilihat di Etherscan(opens in a new tab).
Satu hal untuk diperhatikan adalah bahwa semua akun, termasuk milik EF, memiliki alamat publik yang dapat digunakan untuk mengirim dan menerima transaksi.
Saldo akun di Etherscan terdiri dari transaksi reguler dan internal. Transaksi internal, terlepas dari namanya, bukanlah transaksi sebenarnya yang mengubah state dari rantai. Mereka adalah nilai transfer yang diinisiasi dengan mengeksekusi kontrak (sumber(opens in a new tab)). Karena transaksi internal tidak bertandatangan, mereka tidak termasuk dalam blockchain dan tidak dapat dikueri dengan Analitik Dune.
Oleh karena itu, tutorial ini akan berfokus pada transaksi reguler. Ini dapat dibuat kueri sebagai:
1WITH temp_table AS (2SELECT3 hash,4 block_number,5 block_time,6 "from",7 "to",8 value / 1e18 AS ether,9 gas_used,10 gas_price / 1e9 AS gas_price_gwei11FROM ethereum."transactions"12WHERE "to" = '\xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'13ORDER BY block_time DESC14)15SELECT16 hash,17 block_number,18 block_time,19 "from",20 "to",21 ether,22 (gas_used * gas_price_gwei) / 1e9 AS txn_fee23FROM temp_tableTampilkan semua
Ini akan menghasilkan informasi yang sama seperti yang disediakan di halaman transaksi Etherscan. Sebagai perbandingan, berikut adalah kedua sumber:
Etherscan
Halaman kontrak EF di Etherscan.(opens in a new tab)
Analitik Dune
Anda dapat menemukan dasbor di sini(opens in a new tab). Klik pada tabel untuk melihat kuerinya (juga lihat di atas).
Merinci Transaksi
Transaksi yang dikirimkan mencakup beberapa bagian informasi termasuk (sumber):
- Penerima: Alamat penerima (dikueri sebagai "to")
- Tanda tangan: Ketika kunci privat pengirim menandatangani transaksi, apa yang dapat kita kueri dengan SQL adalah alamat publik pengirim ("from").
- Nilai: Ini adalah jumlah ETH yang ditransfer (lihat kolom
ether
). - Data: Ini adalah data arbitrari yang telah dihash (lihat kolom
data
) - Batas gas: Jumlah maksimum gas, atau biaya komputasi, yang dapat dipakai oleh transaksi (lihat
gas_limit
). - Harga gas: Biaya yang dibayarkan pengirim untuk menandatangani transaksi di blockchain. Gas berdenominasi dalam Gwei yaitu 0,000000001 ETH (sembelian angka di belakang koma).
Kita dapat membuat kueri bagian informasi khusus ini untuk transaksi ke alamat publik Yayasan Ethereum:
1SELECT2 "to",3 "from",4 value / 1e18 AS ether,5 data,6 gas_limit,7 gas_price / 1e9 AS gas_price_gwei,8 gas_used,9 ROUND(((gas_used / gas_limit) * 100),2) AS gas_used_pct10FROM ethereum."transactions"11WHERE "to" = '\xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'12ORDER BY block_time DESCTampilkan semua
Blok
Setiap transaksi akan mengubah state dari mesin virtual Ethereum (EVM) (sumber). Transaksi disiarkan ke jaringan untuk diverifikasi dan dimasukkan ke dalam blok. Setiap transaksi terkait dengan nomor blok. Untuk melihat data, kita dapat membuat kueri nomor blok khusus: 12396854 (blok terbaru di antara transaksi Yayasan Ethereum pada waktu penulisan ini, 11/5/21).
Lagipula, ketika kita membuat kueri kepada kedua blok berikutnya, kita dapat melihat setiap blok berisi hash dari blok sebelumnya (yaitu hash induk), yang menggambarkan bagaimana blockchain terbentuk.
Setiap blok berisi referensi ke blok induknya. Ini ditunjukkan di bawah di antara kolom hash
dan parent_hash
(sumber):
Berikut adalah kueri(opens in a new tab) di Dune Analytics:
1SELECT2 time,3 number,4 difficulty,5 hash,6 parent_hash,7 nonce8FROM ethereum."blocks"9WHERE "number" = 12396854 OR "number" = 12396855 OR "number" = 1239685610LIMIT 10Tampilkan semua
Kita dapat memeriksa blok dengan membuat kueri waktu, nomor blok, tingkat kesulitan, hash, hash induk, dan nonce.
Satu hal yang tidak dicakup oleh kueri ini adalah daftar transaksi yang membutuhkan kueri di bawah dan akar state terpisah. Node arsip penuh akan menyimpan semua transaksi dan transisi state, yang memungkinkan klien untuk membuat kueri state rantai pada saat mana pun. Karena ini membutuhkan ruangan penyimpanan yang besar, kita dapat memisahkan data rantai dari data state:
- Data rantai (daftar blok, transaksi)
- Data state (hasil setiap transisi state transaksi)
Akar state termasuk dalam kategori kedua dan merupakan data implisit (tidak tersimpan secara on-chain), sedangkan data rantai bersifat eksplisit dan tersimpan di rantai itu sendiri (sumber(opens in a new tab)).
Untuk tutorial ini, kita akan berfokus pada data on-chain yang dapat dikueri dengan SQL melalui Dune Analytics.
Seperti yang disebutkan di atas, bahwa setiap blok berisi daftar transaksi, kita dapat membuat kueri ini dengan memfilter blok khusus. Kita akan mencoba blok paling baru, 12396854:
1SELECT * FROM ethereum."transactions"2WHERE block_number = 123968543ORDER BY block_time DESC`
Berikut adalah output SQL di Dune:
Blok tunggal ini yang ditambahkan ke rantai mengubah state mesin virtual Ethereum (EVM). Kadang-kadang belasan, ratusan transaksi diverifikasi dalam sekali waktu. Dalam kasus khusus ini, 222 transaksi dimasukkan.
Untuk melihat berapa banyak yang berhasil, kita akan menambahkan filter lainnya untuk menghitung transaksi yang berhasil:
1WITH temp_table AS (2 SELECT * FROM ethereum."transactions"3 WHERE block_number = 12396854 AND success = true4 ORDER BY block_time DESC5)6SELECT7 COUNT(success) AS num_successful_txn8FROM temp_table
Untuk blok 12396854, dari total 222 transaksi, 204 berhasil diverifikasi:
Permintaan transaksi muncul belasan kali setiap detik, tetapi blok dikomit kira-kira sekali setiap 15 detik (sumber).
Untuk melihat bahwa ada satu blok yang dibuat kira-kira setiap 15 detik, kita dapat mengambil jumlah detik dalam satu hari (86400) dibagi dengan 15 untuk mendapatkan estimasi jumlah blok rata-rata per hari (~ 5760).
Bagan untuk blok Ethereum dibuat per hari (2016 - hari ini) adalah:
Jumlah rata-rata blok yang dibuat setiap hari selama periode waktu ini adalah ~ 5.874:
Kuerinya adalah:
1# query to visualize number of blocks produced daily since 201623SELECT4 DATE_TRUNC('day', time) AS dt,5 COUNT(*) AS block_count6FROM ethereum."blocks"7GROUP BY dt8OFFSET 1910# average number of blocks produced per day1112WITH temp_table AS (13SELECT14 DATE_TRUNC('day', time) AS dt,15 COUNT(*) AS block_count16FROM ethereum."blocks"17GROUP BY dt18OFFSET 119)20SELECT21 AVG(block_count) AS avg_block_count22FROM temp_tableTampilkan semua
Jumlah rata-rata blok yang dibuat per hari sejak 2016 sedikit di atas jumlah tersebut pada 5.874. Secara alternatif, membagi 86400 detik dengan 5874 blok rata-rata menghasilkan 14,7 detik atau kira-kira satu blok setiap 15 detik.
Gas
Blok dibatasi oleh ukuran. Setiap blok memiliki batas gas yang secara kolektif ditetapkan oleh para penambang dan jaringan untuk mencegah ukuran blok yang besar secara aribitrari agar mengurangi tekanan pada node penuh dalam persyaratan ruang diska dan kecepatan (sumber).
Satu cara untuk mengonsep batas gas blok adalah memikirkannya sebagai pasokan ruangan blok yang tersedia sebagai tempat untuk mengelompokkan transaksi. Batas gas blok dapat dikueri dan divisualisasi dari 2016 sampai hari ini:
1SELECT2 DATE_TRUNC('day', time) AS dt,3 AVG(gas_limit) AS avg_block_gas_limit4FROM ethereum."blocks"5GROUP BY dt6OFFSET 1
Lalu ada gas sebenarnya yang dipakai secara harian untuk membayar komputasi yang dilakukan di rantai Ethereum (yaitu mengirim transaksi, memanggil kontrak pintar, mencetak NFT). Ini adalah permintaan untuk ruang blok Ethereum yang tersedia:
1SELECT2 DATE_TRUNC('day', time) AS dt,3 AVG(gas_used) AS avg_block_gas_used4FROM ethereum."blocks"5GROUP BY dt6OFFSET 1
Kita juga dapat membandingkan kedua bagan ini bersama untuk melihat bagaimana permintaan dan pasokan disejajarkan:
Oleh karena itu kita dapat memahami harga gas sebagai fungsi permintaan untuk ruangan blok Ethereum, yang ditentukan oleh pasokan yang tersedia.
Akhirnya, kita mungkin ingin membuat kueri harga gas harian rata-rata untuk rantai Ethereum, namun melakukan ini akan menghasilkan waktu kueri yang lama, sehingga kita akan memfilter kueri kita ke jumlah rata-rata gas yang dibayar per transaksi oleh Yayasan Ethereum.
Kita dapat melihat harga gas yang dibayarkan dalam transaksi ke alamat Yayasan Ethereum dari tahun ke tahun. Berikut adalah kuerinya:
1SELECT2 block_time,3 gas_price / 1e9 AS gas_price_gwei,4 value / 1e18 AS eth_sent5FROM ethereum."transactions"6WHERE "to" = '\xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'7ORDER BY block_time DESC
Ringkasan
Dengan tutorial ini, kita memahami konsep dasar Ethereum dan cara blockchain Ethereum bekerja dengan membuat kueri dan memahami data on-chain.
Dasbor yang menyimpan semua kode yang digunakan dalam tutorial ini dapat ditemukan di sini(opens in a new tab).
Untuk penggunaan data selengkapnya untuk menjelajah web3 hubungi saya di Twitter(opens in a new tab).
Terakhir diedit: @pettinarip(opens in a new tab), 4 Desember 2023