Ethereum blockchain ile etkileşime girme ve Python ve SQL ile bir veritabanı oluşturma

Blockchain ile ilgili tanıtım atölyeleri, genellikle eşler arası ağ ve banka defterlerinin kolay anlaşılır öyküsü ile başlar ve daha sonra doğrudan akılda kalan akıllı sözleşmelerin kodlanmasına atlar. Bunun yerine kendinizi bir ormanda yürüdüğünüzü hayal edin ve Ethereum blockchain'i çalışacağınız garip bir yaratık olarak düşünün. Bugün yaratığı gözlemleyeceğiz, onunla etkileşime geçeceğiz ve onunla ilgili tüm verileri kendi kullanımınız için merkezi bir depoya toplayacağız.

İlk karşılaşma için ayarlama

İlk önce, web3py'yi kurmanız gerekir. Web3py, Ethereum blockchain ile bağlantı kurmak için bir Python kütüphanesidir. Önceden bilmeniz gereken şey, verilerin indirilebileceği merkezi bir yönetim sistemi olmadığıdır. Kaynakları birbirleriyle paylaşan birbirine bağlı düğümler (“eşler”) verilerin doğrulanmış bir kopyasını (veya bir kısmını) saklar. Ağ, düğümlerin birbirleriyle etkileşim kurallarını ve / veya bu ağ üzerinden akıllı sözleşmelerin kurallarını tanımlayan Ethereum protokolünü yürütür.

İşlemler, bakiyeler, bloklar veya henüz bilmediğiniz blok zincirine yazılanlar hakkında bilgiye erişmek istiyorsanız, protokol, düğümlere bağlanmanızı gerektirir. Düğümler sürekli olarak yeni verileri paylaşır ve verileri doğrular; bu şekilde, 1) tahrif edilmemiş verileri ve 2) en güncel olanı elde ettiğinizden emin olursunuz.

Yaratık için ilk yaklaşımınızda kullanabileceğiniz iki temel düğüm kategorisi vardır: yerel veya barındırılan. Yerel bir düğüm makinenizde çalışabilir, bu da öncelikle, zincirli zinciri cihazınızla senkronize edecek, depolama alanını dolduracak ve tamamlamaya zaman ayıracak geth gibi bir müşteri indirmeniz gerektiği anlamına gelir. İlk karşılaşma için, barındırılan bir düğüm daha iyi bir seçimdir - başka biri tarafından kontrol edilir, ancak kolayca bağlanabilir ve kendi başınıza blockchain ile oynayabilirsiniz.

Infura'ya gidin ve böyle bir barındırılan düğüme erişmek için kendi ücretsiz hesabınızı oluşturun. İşiniz bittiğinde, bağlanabileceğiniz ağların bir listesini göreceksiniz: ana ağ (ana Ethereum blockchain) ve akıllı sözleşmelerinizi temelde test etmek için orada bulunan bir grup testnet. Onlara ve pahalı kodunu ana ağa dağıtmadan önce bunları düzeltin.

İlk yaklaşma zamanı. Web3 nesnesini alın ve bir HTTP bağlantısı kurun.

web3'ten Web3'e aktarma
web3 = Web3 (Web3.HTTPProvider ("https://mainnet.infura.io/your-own-personal-number"))

Ve hepiniz hazırsınız! Artık veri yapısını web3 API'sı ile keşfedebilirsiniz.

Belirli bloklar hakkında bilgi alınıyor…

# akım bloğu numarası
>>> web3.eth.blockNumber
5658173
# en son mayınlı bloğun içeriği
>>> web3.eth.getBlock ('en son')

Bu komut, şuna benzeyen bir anahtar / değer çiftleri sözlüğü olan AttributeDict veri yapısını döndürür:

Bu değişkenlerin tümü sizin için hemen yararlı olmayacaktır, çünkü bazıları oldukça tekniktir ve anlamları ancak blok zincirinin gerçekte nasıl çalıştığını daha derinlemesine anladığınızda bir anlam ifade edecektir. Bunlar hakkında daha fazla bilgiyi “Sarı Kitap” olarak okuyabilir veya şimdilik atlayabilir ve kolayca anlaşılabilir olanlarla çalışabilirsiniz.

Kısacası, bir blok, blok başlığını, kendisine yazılı doğrulanmış işlemlerin bir listesini ve bir amcaların listesini (blokları ana blok zincirini yapmak için blokları ile biraz yavaş olan ancak yine de Ether ile ödüllendirilen madencilerin blok tanımlayıcılarını) içerir. onların hesaplama çabası). Aşağıda alt kategorilere ayırdığım her değişkenin anlamının ne olduğunu okuyabilirsiniz.

Genel

Madencilik ile ilgili

Amcalar

Teknik

… İşlemler ve faturaları

Artık bir bloktaki tek işlemlere benzersiz tanımlayıcıları, yani işlem karmaları ile bakabiliriz.

Daha önce olduğu gibi, web3py bize bir nitelik sözlüğü döndürür. Aşağıdaki tablo, her bir anahtarın ne anlama geldiğini özetlemektedir.

Son olarak, işlem makbuzlarını da inceleyebiliriz:

Bir işlem makbuzu birkaç tekrarlanan ve yeni giriş içerir; yenileri aşağıda açıklanmıştır.

Başvuru için, bu tabloları derlemek için Sarı Kitap dışında başka ek kaynaklar da ekledim [2, 3, 4, 5].

Görebildiğiniz gibi, sadece birkaç basit komutla ağa bağlanabilir ve ham formattaki işlemler, bloklar veya durumlar hakkında temel bilgiler edinebilirsiniz. Bu, bu verilerle yapılabilecekler için yeni bir pencere açar!

Veritabanı Yönetim sistemi

Verilerinizi uygun bir veritabanına yazmayı planlıyorsanız, muhtemelen, sunucusuz SQLite veya sunucu tabanlı MySQL, PostgreSQL veya Hadoop gibi Python meraklıları için yönetim sistemleri için birçok çözüm bulunduğunu fark edersiniz. Ne yapmak istediğinize bağlı olarak, projeniz için hangi seçeneğin en iyi olduğunu belirlemeniz gerekecektir. Genel olarak, bu noktaları faydalı buldum:

  • Veritabanının amaçlanan büyüklüğü nedir (yani tek bir makinede işlenebilir)?
  • Girişler sık ​​sık düzenlenecek mi yoksa sabit mi kalacak?
  • Veritabanına aynı anda birden fazla taraf / uygulama tarafından erişilmesi ve düzenlenmesi mi gerekiyor?

Ethereum blok zinciri zamanla istikrarlı bir şekilde büyüyor ve Haziran 2018'den itibaren 1 TB'a yaklaşıyor; bu da küçüktür, Hadoop gibi dağıtılmış bir işleme sistemi için optimal değildir. Blockchain veritabanı bir kez yazılacak ve ardından eski girişleri değiştirmeden sadece yeni girişlerle genişletilecektir. Bu veritabanının kullanım amacı bir kanal tarafından yazılmalı ve diğer kanallar tarafından salt okunur erişilebiliyorsa, onu gerçekten bir sunucuda çalıştırmamız gerekmez. Veritabanını makinenizde yerel olarak tutmak, SQLite gibi bir sunucusuz yönetim sistemi ile istenen ve ulaşılabilir bir hızlı okuma ile sonuçlanacaktır. Python'un yerleşik bir kütüphanesi sqlite3 vardır, dolayısıyla yeni paketler kurmamız da gerekmez.

Veri tabanı tasarımı

Bir sonraki adım veritabanınızı tasarlamaktır. Analiziniz için hangi veri alanlarının en uygun olduğunu ve hem aramayı hem de depolamayı optimize etmeyi amaçladığınızı unutmayın. Örneğin, stateRoot'u kullanmayı düşünmüyorsanız, tamamen atlamak veya ayrı bir tabloda tutmak isteyebilirsiniz. Daha az sütun içeren bir tablo daha hızlı aranabilir ve daha sonra stateRoot için gerçekten bir kullanım durumunun olduğunun farkına varırsanız, buna hala erişebileceksiniz. Ayrıca blok bilgisini işlem bilgisinden ayırmak da isteyebilirsiniz; Bunu yapmazsanız, zaman damgası gibi blok özellikleri bloktaki tüm işlemler için N kez tekrarlanıp çok fazla alan israf edilir. Bir işlemi blok özellikleriyle eşleştirmek daha sonra JOIN işlemi ile kolay olacaktır.

Tasarladığım veritabanı 3 tablodan oluşuyor:

  • Hızlı: hızlı erişim ve analiz için en alakalı işlem bilgisi,
  • Tx: tüm kalan işlem bilgisi,
  • Blok: bloğa özgü bilgi.

Değişkenlerin adlandırma kuralları, hem blok hash'ı hem de işlem karma'sını “hash” olarak adlandırmak veya “/” ila ”dan sütun adı olarak kullanmak gibi belirsizliklerden kurtulmak için orijinal web3py ile ilgili olarak biraz değiştirilmiştir. SQL'in farklı bir anlamı var ve program çöküyor.

İşlem değerleri, bakiyeler ve diğer büyük sayılar veritabanında string olarak saklanmalıdır. Bunun nedeni, SQLite'nin en fazla 2⁶³-1 = 9223372036854775807 değerinde, en fazla 8 baytta depolanmış işaretli tamsayıları işleyebilmesidir.

Mini veritabanınızı oluşturma

Kodun tamamı GitHub'da bulunabilir. Blockchain bilgisini üst şemaya göre düzenler ve önceden belirlenmiş sayıda blok verilerini içeren bir blockchain.db dosyası çıkarır. Sınamak için database.py dosyasına gidin ve yazılacak blok sayısı için makul bir sayı seçin.

Nblocks = 10000

Varsayılan olarak, web3 nesnesini Infura uç noktanıza yönlendirmelisiniz. Ayrıca (yerel düğümünüz gibi) bir tanesine sahipseniz IPC Sağlayıcısına geçebilirsiniz, yalnızca

# veya VM'deki düğüm üzerinden bağlantı
# web3 = Web3 (Web3.IPCProvider ('/ yoldan-geth.ipc /'))

ve yolu düzeltin. Sonra sadece komut satırında python database.py çalıştırın. Kod, son yazılan bloğun numarasını, bıraktığınız yerden yeniden başlatmanız gerekebilir diye lastblock.txt dosyasına dökecektir.

Veri tabanı nasıl kullanılır?

Veritabanına ilk girişleri yazdıktan sonra, onunla ipython kabuğu aracılığıyla iletişim kurmaya başlayabilirsiniz. Örneğin, “Hızlı” tablonun ilk 5 satırını yazdırmak için aşağıdaki kodu çalıştırabilirsiniz.

Yerel düğüm vs. Infura

Büyük bir veritabanı oluşturmak istiyorsanız, geth'i indirmeli ve bir düğümü senkronize etmelisiniz. Senkronizasyon 3 temel modda yapılabilir:

Geçmiş hesap durumlarına ihtiyacınız yoksa, düğümünüzü hızlı modda senkronize edebilirsiniz [6].

Aşağıda, bu kodun bir veritabanına yazma hızını gösteren, yerel olarak tamamen senkronize edilmiş düğümle (IPC) vs Infura (Infura) bir adresle iletişim kuran bir çizim verilmiştir. Gördüğünüz gibi, bu kodu yerel bir düğümde çalıştırmak yaklaşık 2 büyüklük sırasını (aka 100x) artırırken karşılığını verir!

2000000 ve 2000400 arasındaki bloklar arasında 10 işlem bloğu yazma süresi. Logaritmik ölçekte zaman (10⁰ = 1, 10¹ = 10 vb.).

özet

Şimdi olanları ve blok zincirinde neler olduğuna dair kendi yerel veritabanına sahip olduğunuza göre, onu keşfetmeye başlayabilirsiniz. Örneğin, işleminden bu yana işlem sayısını sayabilirsiniz, zamanın bir fonksiyonu olarak kaç adres üretildiğine bakın - gökyüzü, yaratıcınız hakkında öğrenebileceklerinizin limitidir. Veri bilimi oyun alanınız için sahneyi hazırladık. Öyleyse devam edin ve araştırın ya da potansiyel uygulamalar için sonraki gönderileri kontrol edin.

Validity Labs'ın blokchain analitik hizmetleri ile ilgileniyorsanız analytics@validitylabs.org ile irtibata geçiniz.