SQL ile Temel Ethereum Konularını Öğrenin
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 (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_tableTümünü gösterBu, Etherscan'in işlem sayfasında sağlanan bilgilerin aynısını verecektir. Karşılaştırma için iki kaynak şunlardır:
Etherscan
EF'nin Blockscout'taki sözleşme sayfası. (opens in a new tab)
Dune Analytics
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 (
ethersütununa bakın). - Veri: Bu, hash'lenmiş rastgele veridir (
datasü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:
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 DESCTümünü gösterBloklar
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):
İşte Dune Analytics'teki sorgu (opens in a new tab):
1SELECT2 time,3 number,4 hash,5 parent_hash,6 nonce7FROM ethereum."blocks"8WHERE "number" = 12396854 OR "number" = 12396855 OR "number" = 123968569LIMIT 10Tümünü gösterBir 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 = 123968543ORDER BY block_time DESC`İşte Dune'daki SQL çıktı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 = true4 ORDER BY block_time DESC5)6SELECT7 COUNT(success) AS num_successful_txn8FROM temp_table12396854 numaralı blok için, toplam 222 işlemden 204'ü başarıyla doğrulandı:
İş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:
Bu zaman diliminde günlük üretilen ortalama blok sayısı ~5.874'tür:
Sorgular şunlardır:
1# 2016'dan bu yana günlük üretilen blok sayısını görselleştirmek için sorgu23SELECT4 DATE_TRUNC('day', time) AS dt,5 COUNT(*) AS block_count6FROM ethereum."blocks"7GROUP BY dt8OFFSET 1910# günlük üretilen ortalama blok sayısı1112WITH 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_tableTümünü göster2016'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:
1SELECT2 DATE_TRUNC('day', time) AS dt,3 AVG(gas_limit) AS avg_block_gas_limit4FROM ethereum."blocks"5GROUP BY dt6OFFSET 1Ardı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:
1SELECT2 DATE_TRUNC('day', time) AS dt,3 AVG(gas_used) AS avg_block_gas_used4FROM ethereum."blocks"5GROUP BY dt6OFFSET 1Talep ve arzın nasıl hizalandığını görmek için bu iki grafiği yan yana da koyabiliriz:
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.
Yıllar boyunca Ethereum Foundation adresine yapılan tüm işlemler için ödenen gaz fiyatlarını görebiliriz. Sorgu şu şekildedir:
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Ö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










