Lompat ke konten utama

Pelajari Topik Dasar Ethereum dengan SQL

SQL
Kueri
Transaksi
data-dan-analitik
Pemula
Paul Apivat
11 Mei 2021
8 menit baca

Banyak tutorial Ethereum menargetkan pengembang, tetapi ada kekurangan sumber daya pendidikan untuk analis data atau untuk orang-orang yang ingin melihat data onchain tanpa menjalankan klien atau node.

Tutorial ini membantu pembaca memahami konsep dasar Ethereum termasuk transaksi, blok, dan gas dengan melakukan kueri data onchain menggunakan structured query language (SQL) melalui antarmuka yang disediakan oleh Dune Analytics (opens in a new tab).

Data onchain dapat membantu kita memahami Ethereum, jaringan, dan sebagai ekonomi untuk daya komputasi serta harus berfungsi sebagai dasar untuk memahami tantangan yang dihadapi Ethereum saat ini (misalnya, kenaikan harga gas) dan, yang lebih penting, diskusi seputar solusi peningkatan.

Transaksi

Perjalanan pengguna di Ethereum dimulai dengan menginisialisasi akun yang dikendalikan pengguna atau entitas dengan saldo ETH. Ada dua jenis akun - yang dikendalikan pengguna atau kontrak pintar (lihat ethereum.org).

Setiap akun dapat dilihat di penjelajah blok seperti Etherscan (opens in a new tab) atau Blockscout (opens in a new tab). Penjelajah blok adalah portal ke data Ethereum. Mereka menampilkan, secara real-time, data tentang blok, transaksi, penambang, akun, dan aktivitas onchain lainnya (lihat di sini).

Namun, pengguna mungkin ingin melakukan kueri data secara langsung untuk merekonsiliasi informasi yang disediakan oleh penjelajah blok eksternal. Dune Analytics (opens in a new tab) menyediakan kemampuan ini kepada siapa saja yang memiliki sedikit pengetahuan tentang SQL.

Sebagai referensi, akun kontrak pintar untuk Ethereum Foundation (EF) dapat dilihat di Blockscout (opens in a new tab).

Satu hal yang perlu 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 transaksi internal. Transaksi internal, terlepas dari namanya, bukanlah transaksi sebenarnya yang mengubah status rantai. Mereka adalah transfer nilai yang diinisiasi dengan mengeksekusi kontrak (sumber (opens in a new tab)). Karena transaksi internal tidak memiliki tanda tangan, mereka tidak disertakan di blockchain dan tidak dapat dikueri dengan Dune Analytics.

Oleh karena itu, tutorial ini akan berfokus pada transaksi reguler. Ini dapat dikueri seperti ini:

1WITH temp_table AS (
2SELECT
3 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_gwei
11FROM ethereum."transactions"
12WHERE "to" = '\xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'
13ORDER BY block_time DESC
14)
15SELECT
16 hash,
17 block_number,
18 block_time,
19 "from",
20 "to",
21 ether,
22 (gas_used * gas_price_gwei) / 1e9 AS txn_fee
23FROM temp_table
Tampilkan semua

Ini akan menghasilkan informasi yang sama seperti yang disediakan di halaman transaksi Etherscan. Sebagai perbandingan, berikut adalah kedua sumber tersebut:

Etherscan

Tangkapan layar dari tampilan penjelajah transaksi Etherscan

Halaman kontrak EF di Blockscout. (opens in a new tab)

Dune Analytics

Tangkapan layar dari dasbor kueri Dune Analytics

Anda dapat menemukan dasbor di sini (opens in a new tab). Klik pada tabel untuk melihat kueri (lihat juga di atas).

Menguraikan Transaksi

Transaksi yang dikirimkan mencakup beberapa informasi termasuk (sumber):

  • Penerima: Alamat penerima (dikueri sebagai "to")
  • Tanda Tangan: Meskipun kunci pribadi 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 arbitrer yang telah di-hash (lihat kolom data)
  • gasLimit – jumlah maksimum unit gas yang dapat dikonsumsi oleh transaksi. Unit gas mewakili langkah-langkah komputasi
  • maxPriorityFeePerGas - jumlah maksimum gas yang akan disertakan sebagai tip kepada penambang
  • maxFeePerGas - jumlah maksimum gas yang bersedia dibayarkan untuk transaksi (termasuk baseFeePerGas dan maxPriorityFeePerGas)

Kita dapat mengkueri informasi spesifik ini untuk transaksi ke alamat publik Ethereum Foundation:

1SELECT
2 "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_pct
10FROM ethereum."transactions"
11WHERE "to" = '\xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'
12ORDER BY block_time DESC
Tampilkan semua

Blok

Setiap transaksi akan mengubah status Mesin Virtual Ethereum (EVM) (sumber). Transaksi disiarkan ke jaringan untuk diverifikasi dan disertakan dalam sebuah blok. Setiap transaksi dikaitkan dengan nomor blok. Untuk melihat datanya, kita dapat mengkueri nomor blok tertentu: 12396854 (blok terbaru di antara transaksi Ethereum Foundation pada saat penulisan ini, 11/5/21).

Selain itu, ketika kita mengkueri dua blok berikutnya, kita dapat melihat bahwa setiap blok berisi hash dari blok sebelumnya (yaitu, hash induk), yang mengilustrasikan bagaimana blockchain terbentuk.

Setiap blok berisi referensi ke blok induknya. Ini ditunjukkan di bawah ini antara kolom hash dan parent_hash (sumber):

parent_hash

Berikut adalah kueri (opens in a new tab) di Dune Analytics:

1SELECT
2 time,
3 number,
4 hash,
5 parent_hash,
6 nonce
7FROM ethereum."blocks"
8WHERE "number" = 12396854 OR "number" = 12396855 OR "number" = 12396856
9LIMIT 10
Tampilkan semua

Kita dapat memeriksa sebuah blok dengan mengkueri waktu, nomor blok, kesulitan, hash, hash induk, dan nonce.

Satu-satunya hal yang tidak dicakup oleh kueri ini adalah daftar transaksi yang memerlukan kueri terpisah di bawah ini dan akar status (state root). Node penuh atau arsip akan menyimpan semua transaksi dan transisi status, memungkinkan klien untuk mengkueri status rantai kapan saja. Karena ini membutuhkan ruang penyimpanan yang besar, kita dapat memisahkan data rantai dari data status:

  • Data rantai (daftar blok, transaksi)
  • Data status (hasil dari transisi status setiap transaksi)

Akar status termasuk dalam yang terakhir dan merupakan data implisit (tidak disimpan onchain), sedangkan data rantai bersifat eksplisit dan disimpan di rantai itu sendiri (sumber (opens in a new tab)).

Untuk tutorial ini, kita akan berfokus pada data onchain yang dapat dikueri dengan SQL melalui Dune Analytics.

Seperti yang dinyatakan di atas, setiap blok berisi daftar transaksi, kita dapat mengkuerinya dengan memfilter blok tertentu. Kita akan mencoba blok terbaru, 12396854:

1SELECT * FROM ethereum."transactions"
2WHERE block_number = 12396854
3ORDER BY block_time DESC`

Berikut adalah keluaran SQL di Dune:

Tangkapan layar dari daftar transaksi Ethereum

Satu blok ini yang ditambahkan ke rantai mengubah status Mesin Virtual Ethereum (EVM). Puluhan, terkadang ratusan transaksi diverifikasi sekaligus. Dalam kasus khusus ini, 222 transaksi disertakan.

Untuk melihat berapa banyak yang benar-benar berhasil, kita akan menambahkan filter lain untuk menghitung transaksi yang berhasil:

1WITH temp_table AS (
2 SELECT * FROM ethereum."transactions"
3 WHERE block_number = 12396854 AND success = true
4 ORDER BY block_time DESC
5)
6SELECT
7 COUNT(success) AS num_successful_txn
8FROM temp_table

Untuk blok 12396854, dari total 222 transaksi, 204 berhasil diverifikasi:

Tangkapan layar dari transaksi Ethereum yang berhasil

Permintaan transaksi terjadi puluhan kali per detik, tetapi blok dikomit kira-kira setiap 15 detik sekali (sumber).

Untuk melihat bahwa ada satu blok yang diproduksi kira-kira setiap 15 detik, kita dapat mengambil jumlah detik dalam sehari (86400) dibagi 15 untuk mendapatkan perkiraan jumlah rata-rata blok per hari (~ 5760).

Grafik untuk blok Ethereum yang diproduksi per hari (2016 - sekarang) adalah:

Grafik yang menunjukkan produksi blok Ethereum harian

Jumlah rata-rata blok yang diproduksi setiap hari selama periode waktu ini adalah ~5.874:

Grafik yang menunjukkan produksi blok Ethereum harian

Kuerinya adalah:

1# query to visualize number of blocks produced daily since 2016
2
3SELECT
4 DATE_TRUNC('day', time) AS dt,
5 COUNT(*) AS block_count
6FROM ethereum."blocks"
7GROUP BY dt
8OFFSET 1
9
10# average number of blocks produced per day
11
12WITH temp_table AS (
13SELECT
14 DATE_TRUNC('day', time) AS dt,
15 COUNT(*) AS block_count
16FROM ethereum."blocks"
17GROUP BY dt
18OFFSET 1
19)
20SELECT
21 AVG(block_count) AS avg_block_count
22FROM temp_table
Tampilkan semua

Jumlah rata-rata blok yang diproduksi per hari sejak 2016 sedikit di atas angka tersebut yaitu 5.874. Sebagai alternatif, membagi 86400 detik dengan rata-rata 5874 blok menghasilkan 14,7 detik atau kira-kira satu blok setiap 15 detik.

Gas

Blok dibatasi ukurannya. Ukuran blok maksimum bersifat dinamis dan bervariasi sesuai dengan permintaan jaringan antara 12.500.000 dan 25.000.000 unit. Batasan diperlukan untuk mencegah ukuran blok yang terlalu besar membebani node penuh dalam hal ruang disk dan persyaratan kecepatan (sumber).

Salah satu cara untuk mengonseptualisasikan batas gas blok adalah dengan menganggapnya sebagai pasokan ruang blok yang tersedia untuk mengelompokkan transaksi. Batas gas blok dapat dikueri dan divisualisasikan dari tahun 2016 hingga saat ini:

Grafik yang menunjukkan rata-rata batas gas Ethereum dari waktu ke waktu

1SELECT
2 DATE_TRUNC('day', time) AS dt,
3 AVG(gas_limit) AS avg_block_gas_limit
4FROM ethereum."blocks"
5GROUP BY dt
6OFFSET 1

Kemudian ada gas aktual yang digunakan setiap hari untuk membayar komputasi yang dilakukan di rantai Ethereum (misalnya, mengirim transaksi, memanggil kontrak pintar, melakukan mint NFT). Ini adalah permintaan untuk ruang blok Ethereum yang tersedia:

Grafik yang menunjukkan gas Ethereum harian yang digunakan

1SELECT
2 DATE_TRUNC('day', time) AS dt,
3 AVG(gas_used) AS avg_block_gas_used
4FROM ethereum."blocks"
5GROUP BY dt
6OFFSET 1

Kita juga dapat menyandingkan kedua grafik ini bersama-sama untuk melihat bagaimana permintaan dan pasokan sejajar:

gas_demand_supply

Oleh karena itu kita dapat memahami harga gas sebagai fungsi dari permintaan untuk ruang blok Ethereum, mengingat pasokan yang tersedia.

Terakhir, kita mungkin ingin mengkueri rata-rata harga gas harian untuk rantai Ethereum, namun, melakukan hal itu akan menghasilkan waktu kueri yang sangat lama, jadi kita akan memfilter kueri kita ke jumlah rata-rata gas yang dibayarkan per transaksi oleh Ethereum Foundation.

Grafik yang menunjukkan penggunaan gas harian Ethereum Foundation

Kita dapat melihat harga gas yang dibayarkan untuk semua transaksi yang dilakukan ke alamat Ethereum Foundation selama bertahun-tahun. Berikut adalah kuerinya:

1SELECT
2 block_time,
3 gas_price / 1e9 AS gas_price_gwei,
4 value / 1e18 AS eth_sent
5FROM ethereum."transactions"
6WHERE "to" = '\xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'
7ORDER BY block_time DESC

Ringkasan

Dengan tutorial ini, kita memahami konsep dasar Ethereum dan bagaimana blockchain Ethereum bekerja dengan mengkueri dan merasakan data onchain.

Dasbor yang menyimpan semua kode yang digunakan dalam tutorial ini dapat ditemukan di sini (opens in a new tab).

Untuk penggunaan data lebih lanjut dalam menjelajahi web3 temukan saya di Twitter (opens in a new tab).

Pembaruan terakhir halaman: 26 Februari 2026

Apakah tutorial ini membantu?