Ana içeriğe atla

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:

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:

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

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

SELECT * FROM ethereum."transactions"
WHERE block_number = 12396854
ORDER 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:

WITH temp_table AS (
    SELECT * FROM ethereum."transactions"
    WHERE block_number = 12396854 AND success = true
    ORDER BY block_time DESC
)
SELECT
    COUNT(success) AS num_successful_txn
FROM 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:

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

SELECT
    DATE_TRUNC('day', time) AS dt,
    AVG(gas_limit) AS avg_block_gas_limit
FROM ethereum."blocks"
GROUP BY dt
OFFSET 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

SELECT
    DATE_TRUNC('day', time) AS dt,
    AVG(gas_used) AS avg_block_gas_used
FROM ethereum."blocks"
GROUP BY dt
OFFSET 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:

SELECT
    block_time,
    gas_price / 1e9 AS gas_price_gwei,
    value / 1e18 AS eth_sent
FROM ethereum."transactions"
WHERE "to" = '\xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'
ORDER 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üncellenme tarihi: 3 Nisan 2026

Bu eğitim faydalı oldu mu?