Ana içeriğe geç

SQL ile Temel Ethereum Konularını Öğrenin

SQL
Sorgulama
İşlemler
Acemi
Paul Apivat
11 Mayıs 2021
7 dakikalık okuma

Birçok Ethereum öğreticisi geliştiricileri hedeflese de veri analistleri ya da bir istemci veya düğüm çalıştırmadan zincir üstü verileri görmek isteyen kişiler için yeterli eğitim kaynağı bulunmamaktadır.

Bu öğretici, okuyucuların Dune Analytics (opens in a new tab) tarafından sağlanan bir arayüz aracılığıyla yapılandırılmış sorgu dili (SQL) ile zincir üstü verileri sorgulayarak işlemler, bloklar ve gaz dahil olmak üzere temel Ethereum kavramlarını anlamalarına yardımcı olur.

Zincir üstü veriler, Ethereum'u, ağı ve bir bilgi işlem gücü ekonomisi olarak anlamamıza yardımcı olabilir ve günümüzde Ethereum'un karşılaştığı zorlukları (yani artan gaz fiyatları) ve daha da önemlisi, ölçeklendirme çözümleri etrafındaki tartışmaları anlamak için bir temel oluşturmalıdır.

İşlemler

Bir kullanıcının Ethereum'daki yolculuğu, kullanıcı kontrollü bir hesabı veya bir ETH bakiyesine sahip bir varlığı başlatmakla başlar. İki hesap türü vardır: kullanıcı kontrollü veya akıllı sözleşme (bkz. ethereum.org).

Etherscan (opens in a new tab) veya Blockscout (opens in a new tab) gibi bir blok arayıcısında herhangi bir hesap görüntülenebilir. Blok arayıcıları, Ethereum'un verilerine açılan bir portaldır. Bloklar, işlemler, madenciler, hesaplar ve diğer zincir üstü etkinliklerle ilgili verileri gerçek zamanlı olarak görüntülerler (bkz. burası).

Ancak, bir kullanıcı harici blok arayıcıları tarafından sağlanan bilgileri karşılaştırmak için verileri doğrudan sorgulamak isteyebilir. Dune Analytics (opens in a new tab), SQL hakkında biraz bilgisi olan herkese bu olanağı sağlar.

Referans olarak, Ethereum Foundation'ın (EF) akıllı sözleşme hesabı Blockscout (opens in a new tab) üzerinde görüntülenebilir.

Unutulmaması gereken bir nokta, EF'ninki de dahil olmak üzere tüm hesapların, işlem göndermek ve almak için kullanılabilecek bir genel adrese sahip olmasıdır.

Etherscan'deki hesap bakiyesi, normal işlemlerden ve dahili işlemlerden oluşur. Dahili işlemler, adlarına rağmen, zincirin durumunu değiştiren gerçek işlemler değildir. Bunlar, bir sözleşmenin yürütülmesiyle başlatılan değer transferleridir (kaynak (opens in a new tab)). Dahili işlemlerin imzası olmadığından, blokzincirine dahil edilmezler ve Dune Analytics ile sorgulanamazlar.

Bu nedenle, bu öğretici normal işlemlere odaklanacaktır. Bu, şu şekilde sorgulanabilir:

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
Tümünü göster

Bu, Etherscan'in işlem sayfasında sağlanan bilgilerin aynısını verecektir. Karşılaştırma için iki kaynak şunlardır:

Etherscan

Etherscan işlem gezgini görünümünün ekran görüntüsü

EF'nin Blockscout'taki sözleşme sayfası. (opens in a new tab)

Dune Analytics

Dune Analytics sorgu panosunun ekran görüntüsü

Panoyu burada (opens in a new tab) bulabilirsiniz. Sorguyu görmek için tabloya tıklayın (ayrıca yukarıya bakın).

İşlemleri Ayrıntılandırma

Gönderilen bir işlem, aşağıdakiler de dahil olmak üzere çeşitli bilgiler içerir (kaynak):

  • Alıcı: Alıcı adres ("to" olarak sorgulanır)
  • İmza: Bir göndericinin özel anahtarı bir işlemi imzalasa da, SQL ile sorgulayabileceğimiz şey göndericinin genel adresidir ("from").
  • Değer: Bu, transfer edilen ETH miktarıdır (ether sütununa bakın).
  • Veri: Bu, hash'lenmiş rastgele veridir (data sütununa bakın)
  • gasLimit – işlem tarafından tüketilebilecek maksimum gaz birimi miktarı. Gaz birimleri, hesaplama adımlarını temsil eder
  • maxPriorityFeePerGas - madenciye bahşiş olarak dahil edilecek maksimum gaz miktarı
  • maxFeePerGas - işlem için ödenmeye razı olunan maksimum gaz miktarı (baseFeePerGas ve maxPriorityFeePerGas dahil)

Ethereum Foundation genel adresine yapılan işlemler için bu özel bilgileri sorgulayabiliriz:

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
Tümünü göster

Bloklar

Her işlem, Ethereum Sanal Makinesi'nin (EVM) durumunu değiştirir (kaynak). İşlemler doğrulanmak üzere ağa yayınlanır ve bir bloğa dahil edilir. Her işlem bir blok numarası ile ilişkilidir. Verileri görmek için belirli bir blok numarasını sorgulayabiliriz: 12396854 (bu yazının yazıldığı 11/5/21 tarihi itibarıyla Ethereum Foundation işlemleri arasındaki en son blok).

Ayrıca, sonraki iki bloğu sorguladığımızda, her bloğun önceki bloğun hash'ini (yani üst hash) içerdiğini görebiliriz, bu da blok zincirinin nasıl oluştuğunu gösterir.

Her blok, üst bloğuna bir referans içerir. Bu, aşağıda hash ve parent_hash sütunları arasında gösterilmektedir (kaynak):

parent_hash

İşte Dune Analytics'teki sorgu (opens in a new tab):

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
Tümünü göster

Bir bloğu; zaman, blok numarası, zorluk, hash değeri, üst hash değeri ve nonce değeri sorgulayarak inceleyebiliriz.

Bu sorgunun kapsamadığı tek şey, aşağıda ayrı bir sorgu gerektiren işlem listesi ve durum köküdür. Tam veya arşiv düğümü, tüm işlemleri ve durum geçişlerini depolayarak istemcilerin herhangi bir zamanda zincirin durumunu sorgulamasına olanak tanır. Bu, büyük depolama alanı gerektirdiğinden, zincir verilerini durum verilerinden ayırabiliriz:

  • Zincir verisi (blokların, işlemlerin listesi)
  • Durum verileri (her işlemin durum geçişinin sonucu)

Durum kökü ikinci kategoriye girer ve örtük veridir (zincir üstünde saklanmaz), zincir verileri ise açıktır ve zincirin kendisinde saklanır (kaynak (opens in a new tab)).

Bu öğreticide, Dune Analytics aracılığıyla SQL ile sorgulan_abilen_ zincir üstü verilere odaklanacağız.

Yukarıda belirtildiği gibi, her blok bir işlem listesi içerir; bunu belirli bir bloğa göre filtreleyerek sorgulayabiliriz. En son bloğu deneyeceğiz: 12396854

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

İşte Dune'daki SQL çıktısı:

Ethereum işlemleri listesinin ekran görüntüsü

Zincire eklenen bu tek blok, Ethereum Sanal Makinesi'nin (EVM) durumunu değiştirir. Bazen onlarca, bazen de yüzlerce işlem aynı anda doğrulanır. Bu özel durumda 222 işlem dahil edildi.

Gerçekte kaç tanesinin başarılı olduğunu görmek için, başarılı işlemleri saymak üzere başka bir filtre ekleriz:

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

12396854 numaralı blok için, toplam 222 işlemden 204'ü başarıyla doğrulandı:

Başarılı bir Ethereum işleminin ekran görüntüsü

İşlem istekleri saniyede onlarca kez gerçekleşir, ancak bloklar yaklaşık olarak her 15 saniyede bir işlenir (kaynak).

Yaklaşık her 15 saniyede bir blok üretildiğini görmek için, bir gündeki saniye sayısını (86400) 15'e bölerek tahmini günlük ortalama blok sayısını (~ 5760) elde edebiliriz.

Günlük üretilen Ethereum blokları için grafik (2016 - günümüz) şöyledir:

Günlük Ethereum blok üretimini gösteren grafik

Bu zaman diliminde günlük üretilen ortalama blok sayısı ~5.874'tür:

Günlük Ethereum blok üretimini gösteren grafik

Sorgular şunlardır:

1# 2016'dan bu yana günlük üretilen blok sayısını görselleştirmek için sorgu
2
3SELECT
4 DATE_TRUNC('day', time) AS dt,
5 COUNT(*) AS block_count
6FROM ethereum."blocks"
7GROUP BY dt
8OFFSET 1
9
10# günlük üretilen ortalama blok sayısı
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
Tümünü göster

2016'dan bu yana günde üretilen ortalama blok sayısı, 5.874 ile bu sayının biraz üzerindedir. Alternatif olarak, 86400 saniyeyi 5874 ortalama bloğa bölmek 14,7 saniye veya yaklaşık olarak her 15 saniyede bir blok anlamına gelir.

Gaz

Blokların boyutu sınırlıdır. Maksimum blok boyutu dinamiktir ve ağ talebine göre 12.500.000 ila 25.000.000 birim arasında değişir. Keyfi olarak büyük blok boyutlarının disk alanı ve hız gereksinimleri açısından tam düğümlere yük bindirmesini önlemek için sınırlar gereklidir (kaynak).

Blok gaz limitini kavramsallaştırmanın bir yolu, onu işlemleri gruplamak için mevcut blok alanının arzı olarak düşünmektir. Blok gaz limiti 2016'dan günümüze sorgulanabilir ve görselleştirilebilir:

Zaman içindeki ortalama Ethereum gaz limitini gösteren grafik

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

Ardından, Ethereum zincirinde yapılan hesaplama için günlük olarak kullanılan gerçek gaz vardır (yani, işlem gönderme, bir akıllı sözleşme çağırma, bir NFT basma). Bu, mevcut Ethereum blok alanı için olan taleptir:

Kullanılan günlük Ethereum gazını gösteren grafik

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

Talep ve arzın nasıl hizalandığını görmek için bu iki grafiği yan yana da koyabiliriz:

gas_demand_supply

Bu nedenle, mevcut arz göz önüne alındığında, gaz fiyatlarını Ethereum blok alanı talebinin bir fonksiyonu olarak anlayabiliriz.

Son olarak, Ethereum zinciri için ortalama günlük gaz fiyatlarını sorgulamak isteyebiliriz ancak bu, özellikle uzun bir sorgu süresine neden olacaktır, bu yüzden sorgumuzu Ethereum Foundation tarafından işlem başına ödenen ortalama gaz miktarına göre filtreleyeceğiz.

Ethereum Vakfı'nın günlük gaz kullanımını gösteren grafik

Yıllar boyunca Ethereum Foundation adresine yapılan tüm işlemler için ödenen gaz fiyatlarını görebiliriz. Sorgu şu şekildedir:

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

Özet

Bu öğretici ile, temel Ethereum kavramlarını ve zincir üstü verileri sorgulayarak ve kavrayarak Ethereum blokzincirinin nasıl çalıştığını anlıyoruz.

Bu öğreticide kullanılan tüm kodları içeren pano burada (opens in a new tab) bulunabilir.

Web3'ü keşfetmek için verilerin daha fazla kullanımı hakkında bilgi için beni Twitter'da bulun (opens in a new tab).

Sayfanın son güncellenmesi: 26 Şubat 2026

Bu rehber yararlı oldu mu?