Ana içeriğe geç

SQL ile Temel Ethereum Konularını Öğrenin

SQLSorgulamaİşlemler
Acemi
Paul Apivat
paulapivat.com(opens in a new tab)
11 Mayıs 2021
6 dakikalık okuma minute read

Birçok Ethereum öğreticisi geliştiricileri hedefler, ancak veri analisti veya bir istemci veya düğüm çalıştırmadan zincir üstü verileri görmek isteyen kişiler için eğitim kaynağı eksikliği vardır.

Bu öğretici, 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 okuyucuların zincir verilerini sorgulayarak işlemler, bloklar ve gaz dahil olmak üzere temel Ethereum kavramlarını anlamalarına yardımcı olur.

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

İşlemler

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

Herhangi bir hesap, Etherscan(opens in a new tab) gibi bir blok arayıcısında görüntülenebilir. Blok arayıcıları Ethereum'un verisine açılan bir geçittir. Bloklar, işlemler, madenciler, hesaplar ve diğer zincir içi faaliyetlerle ilgili verileri gerçek zamanlı olarak görüntülerler (buraya göz atın).

Bununla birlikte, 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 bilgisi olan herhangi birine bu kabiliyeti sağlar.

Referans olarak, Ethereum Vakfı (EF) için akıllı sözleşme hesabı Etherscan(opens in a new tab) adresinde görüntülenebilir.

Unutulmaması gereken bir nokta, Ethereum Vakfı'nınki 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'daki hesap bakiyesi, düzenli işlemler ve dahili işlemlerden oluşur. Adına rağmen dahili işlemler, zincirin durumunu değiştiren gerçek işlemler değildir. Onlar bir sözleşmenin yürütümünden oluşturulan değer transferleridir (kaynak(opens in a new tab)). Dahili işlemlerin imzası olmadığı için blok zincirine dahil edilmezler ve Dune Analytics ile sorgulanamazlar.

Bu nedenle, bu öğreticide düzenli işlemlere odaklanılacaktı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 olarak, burada iki kaynak vardır:

Etherscan

Etherscan üzerinde Ethereum Vakfı'nın sözleşme sayfası.(opens in a new tab)

Dune Analytics

Gösterge panelini burada(opens in a new tab) bulabilirsiniz. Sorguyu görmek için tabloya tıklayın (yukarıya da bakın).

İşlemleri Parçalara Ayırma

Gönderilen bir işlem, şunlar da dahil olmak üzere çeşitli bilgiler içerir (kaynak):

  • Recipient: Alıcı adres ("to" olarak sorgulanır)
  • Signature: Göndericinin özel anahtarları bir işlemi imzalarken, SQL ile sorgulayabileceğimiz şey gönderenin açık adresidir ("from").
  • Value: Aktarılan ETH miktarı (ether sütununa bakınız).
  • Data: Bu hash edilmiş olan rastgele veridir (data sütununa bakınız)
  • gasLimit – işlem tarafından tüketilebilecek maksimum gaz birimi miktarı. Gaz birimleri, bilgi işlem adımlarını temsil eder
  • maxPriorityFeePerGas - madenciye bahşiş olarak dahil edilecek maksimum gaz miktarı
  • maxFeePerGas - işlem için ödemeye razı olunan maksimum gaz miktarı (baseFeePerGas ve maxPriorityFeePerGas dahil)

Ethereum Vakfı genel adresine yapılan işlemler için bu belirli 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 makinesinin (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şkilendirilir. Verileri görmek için belirli bir blok numarasını sorgulayabiliriz: 12396854 (bu yazı itibariyle Ethereum Vakfı işlemleri arasında en son blok, 11/5/21).

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

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

parent_hash

Dune Analytics üzerinde 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 kök durumdur. Tam veya arşivsel bir 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 kategoridedir ve örtülü verilerdir (zincirde depolanmaz), zincir verileri ise açık ve zincirin kendisinde depolanır (kaynak(opens in a new tab)).

Bu eğitimde, Dune Analytics aracılığıyla SQL ile sorgulanabilecek zincir üstü verilere odaklanacağız.

Yukarıda belirtildiği gibi, her blok bir işlem listesi içerir, bunu belirli bir blok için filtreleyerek sorgulayabiliriz. En güncel olan 12396854 bloğunu deneyeceğiz:

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

Dune üzerindeki SQL çıktısı:

Zincire eklenen bu tek blok, Ethereum sanal makinesinin durumunu değiştirir (EVM). Bazen düzinelerce ve hatta yüzlerce işlem aynı anda doğrulanır. Bu özel durumda, 222 işlem dahil edilmiştir.

Kaç tanesinin gerçekten başarılı olduğunu görmek amacıyla başarılı işlemleri saymak için 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 bloğu 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 olarak 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ı (yaklaşık 5760) elde edebiliriz.

Günde üretilen Ethereum blokları tablosu (2016 - günümüz):

Bu süre zarfında günlük olarak üretilen ortalama blok sayısı yaklaşık olarak 5.874'tür:

Sorgular:

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

2016'dan bu yana günlük üretilen ortalama blok sayısı, 5.874 olarak bu sayının biraz üzerindedir. Alternatif olarak, 86.400 saniyenin 5874 ortalama bloğa bölünmesi 14,7 saniyeye veya her 15 saniyede bir yaklaşık bir bloğa denk gelir.

Gaz

Bloklar boyut olarak 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. Limitler, keyfi olarak çok büyük blok boyutlarınının disk alanı ve hız gereksinimleri (kaynak) açısından tam düğümlere baskı uygulamasını engellemek için gereklidir.

Blok gaz sınırını kavramsallaştırmanın bir yolu, bunu toplu işlemlerin gerçekleştirileceği kullanılabilir blok alanının arz olarak düşünmektir. Blok gaz limiti 2016'dan günümüze sorgulanabilir ve görselleştirilebilir:

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, akıllı sözleşme çağırma, NFT basma). Bu, kullanılabilir Ethereum blok alanı için taleptir:

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

Ayrıca, talep ve arzın nasıl sıralandığını görmek için bu iki grafiği yan yana koyabiliriz:

gas_demand_supply

Böylece, 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 bunu yapmak özellikle uzun bir sorgulama süresine neden olur. Bu nedenle sorgumuzu Ethereum Vakfı tarafından işlem başına ödenen ortalama gaz miktarına göre filtreleyeceğiz.

Yıllar içinde tüm işlemler için Ethereum Foundation adresine ödenmiş gaz ücretlerini görebiliriz. Sorgu burada:

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 üzerindeki verileri sorgulayarak ve bunlarla uğraşarak Ethereum blok zincirinin nasıl çalıştığını anlıyoruz.

Bu öğreticide kullanılan tüm kodları tutan gösterge paneli burada(opens in a new tab) bulunabilir.

Verinin web3 keşfi amaçlı daha fazla kullanımı için bana Twitter'dan ulaşın(opens in a new tab).

Son düzenleme: @pettinarip(opens in a new tab), 4 Aralık 2023

Bu rehber yararlı oldu mu?