Lanjut ke konten utama

Belajar Topik Dasar Ethereum dengan SQL

SQLMembuat kueriAnalitikMemulaiAnalitik DuneBlokTransaksiGas
Pemula
Paul Apivat
paulapivat.com(opens in a new tab)
11 Mei 2021
7 bacaan singkat minute read

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 (
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:

Etherscan

etherscan_view

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

Analitik Dune

dune_view

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:

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 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):

parent_hash

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

1SELECT
2 time,
3 number,
4 difficulty,
5 hash,
6 parent_hash,
7 nonce
8FROM ethereum."blocks"
9WHERE "number" = 12396854 OR "number" = 12396855 OR "number" = 12396856
10LIMIT 10
Tampilkan 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 = 12396854
3ORDER BY block_time DESC`

Berikut adalah output SQL di Dune:

list_of_txn

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 = 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:

successful_txn

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:

daily_blocks

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

avg_daily_blocks

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 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:

avg_gas_limit

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

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:

daily_gas_used

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 membandingkan kedua bagan ini bersama untuk melihat bagaimana permintaan dan pasokan disejajarkan:

gas_demand_supply

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.

ef_daily_gas

Kita dapat melihat harga gas yang dibayarkan dalam transaksi ke alamat Yayasan Ethereum dari tahun ke 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 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: @yeremiaryangunadi(opens in a new tab), 15 Agustus 2023

Apakah tutorial ini membantu?