Ethereum ana akım istemcisi: Geth genel mimarisi

Bu makale, Geth kaynak kodu serisinin ilk makalesidir. Bu seri aracılığıyla, Geth uygulamalarını araştırmak için bir çerçeve oluşturacağız; geliştiriciler bu çerçeveyi kullanarak ilgi duydukları alanlarda derinlemesine araştırma yapabilirler. Bu seride toplam altı makale bulunmaktadır. İlk makalede, yürütme katmanı istemcisi Geth'in tasarım mimarisi ve Geth düğümünün başlatma süreci araştırılacaktır. Geth kod güncellemeleri çok hızlıdır; ileride göreceğiniz kodlar farklılık gösterebilir, ancak genel tasarım büyük ölçüde tutarlıdır. Yeni kodlar da aynı düşünceyle okunabilir.

01\Ethereum istemcisi

Ethereum'un The Merge yükseltmesinden önce, Ethereum'un işlemlerin yürütülmesinden ve blok zincirinin fikir birliğinden sorumlu olan ve blok zincirinin belirli bir sırayla yeni bloklar üretmesini sağlayan tek bir istemcisi vardı. The Merge'ün yükseltilmesinden sonra, Ethereum istemcisi bir yürütme katmanına ve bir konsensüs katmanına bölünür, yürütme katmanı işlemlerin yürütülmesinden, durum ve verilerin korunmasından, konsensüs katmanı konsensüs işlevlerinin uygulanmasından sorumludur ve yürütme katmanı ve konsensüs katmanı API'ler aracılığıyla iletişim kurar. Yürütme katmanı ve konsensüs katmanının kendi özellikleri vardır ve istemci bunları farklı dillerde uygulayabilir, ancak ilgili özelliklere uymaları gerekir ve Geth, yürütme katmanı istemcisinin bir uygulamasıdır. Şu anda, ana yürütme katmanı ve konsensüs katmanı istemcileri aşağıdaki uygulamalara sahiptir:

İcra Katmanı

  • Geth: Ethereum Vakfı tarafından doğrudan finanse edilen bir ekip tarafından korunmakta olup, Go dili ile geliştirilmiştir. En güvenilir, test edilmiş istemci olarak kabul edilmektedir.
  • Nethermind: Nethermind ekibi tarafından geliştirilen ve bakımı yapılan, C# dilinde yazılmıştır, erken dönemde Ethereum Vakfı ve Gitcoin topluluğu tarafından finanse edilmiştir.
  • Besu: İlk olarak ConsenSys'in PegaSys ekibi tarafından geliştirilen, şimdi Hyperledger topluluk projesi olan, Java dilinde geliştirilmiştir.
  • Erigon: Erigon ekibi tarafından geliştirilen ve sürdürülen, Ethereum Vakfı ve BNB Chain tarafından finanse edilmektedir. 2017 yılında Geth'ten çatallanarak, senkronizasyon hızını ve disk verimliliğini artırmayı hedefler.
  • Reth: Paradigm tarafından geliştirilen, geliştirme dili Rust olan, modülerlik ve yüksek performansa vurgu yapan, şu anda olgunlaşma aşamasına gelmiş ve üretim ortamında kullanılabilir.

Konsens Katmanı

  • Prysm: Prysmatic Labs tarafından bakım yapılan, Ethereum'un en eski konsensüs katmanı istemcilerinden biridir, Go dili ile geliştirilmiş olup, kullanılabilirlik ve güvenliğe odaklanmıştır, erken döneminde Ethereum Vakfı tarafından desteklenmiştir.
  • Lighthouse: Sigma Prime ekibi tarafından sürdürülen, Rust dilinde geliştirilmiş, yüksek performans ve kurumsal düzeyde güvenlik sunan, yüksek yük senaryoları için uygundur.
  • Teku: ConsenSys'in PegaSys ekibi tarafından erken dönemde geliştirilen ve daha sonra Hyperledger Besu topluluğunun bir parçası haline gelen, Java dilinde geliştirilmiştir.
  • Nimbus: Status Network ekibi tarafından geliştirilen ve bakım yapılan, Nim dili ile geliştirilmiş, kaynak kısıtlı cihazlar (örneğin telefonlar, IoT cihazları) için optimize edilmiştir, amacı gömülü sistemlerde hafif bir çalışma sağlamaktır.

02\İcra Katmanı Tanıtımı

Ethereum yürütme katmanını, işlemlerle yönlendirilen bir durum makinesi olarak düşünebilirsiniz; yürütme katmanının temel işlevi, EVM aracılığıyla işlemleri yürütmek ve durum verilerini güncellemektir. İşlem yürütmenin yanı sıra, blokları ve durum verilerini saklama ve doğrulama, p2p ağı çalıştırma ve işlem havuzunu sürdürme gibi işlevler de vardır.

İşlem, kullanıcı (veya program) tarafından Ethereum yürütme katmanı standartlarında tanımlanan formatta oluşturulur, kullanıcı işlemi imzalamalıdır. Eğer işlem geçerliyse (Nonce sürekli, imza doğru, gas ücreti yeterli, iş mantığı doğru), o zaman işlem nihayet EVM tarafından yürütülecek ve Ethereum ağının durumu güncellenecektir. Buradaki durum, dış hesap adresleri, sözleşme adresleri, adres bakiyeleri ve kod ile verilerin dahil olduğu veri yapıları, veri ve veritabanları kümesini ifade eder.

İşlem katmanı, işlemleri yürütmek ve işlem yürütüldükten sonraki durumu korumakla sorumludur, uzlaşı katmanı ise hangi işlemlerin yürütüleceğini seçmekle sorumludur. EVM, bu durum makinesindeki durum dönüşüm fonksiyonudur, fonksiyonun girişi birçok yerden gelebilir, uzlaşı katmanının sağladığı en son blok bilgileri veya p2p ağından indirilen bloklardan gelebilir.

Konsensüs katmanı ve yürütme katmanı, yürütme katmanı ile konsensüs katmanı arasında iletişim kurmanın tek yolu olan Engine API aracılığıyla iletişim kurar. Konsensüs katmanı bloğu doğru alırsa, yürütme katmanının Engine API aracılığıyla yeni bir blok üretmesine izin verir ve bloğu doğru alamazsa, tüm Ethereum ağıyla fikir birliğini sürdürmek için yürütme katmanının doğrulaması ve yürütmesi için en son bloğu senkronize eder.

İcra katmanı mantıksal olarak 6 parçaya ayrılabilir:

  • EVM: İşlemleri gerçekleştirmekten sorumlu, işlem gerçekleştirme aynı zamanda durum sayısını değiştiren tek yoldur.
  • Depolama: state ve blok gibi verilerin depolanmasından sorumludur.
  • İşlem Havuzu: Kullanıcılar tarafından gönderilen işlemler için geçici depolama alanı, ayrıca p2p ağı üzerinden farklı düğümler arasında yayımlanır.
  • p2p ağı: Düğüm keşfi, işlem senkronizasyonu, blok indirme gibi işlevler için kullanılır.
  • RPC Servisi: Düğüm erişim yeteneği sağlar, örneğin kullanıcıların düğüme işlem göndermesi, konsensüs katmanı ve yürütme katmanı arasındaki etkileşim.
  • BlockChain: Ethereum blok zinciri verilerini yönetmekten sorumludur.

Aşağıdaki resim, yürütme katmanının ana süreçlerini ve her bir kısmın işlevlerini göstermektedir:

Ethereum ana istemcisi: Geth genel mimarisi

Yürütme katmanı için (burada yalnızca Full Node'u tartışıyoruz), üç ana süreç bulunmaktadır:

  • Eğer Ethereum'a yeni katılan bir düğümse, diğer düğümlerden blok ve durum verilerini p2p ağı üzerinden senkronize etmesi gerekir. Eğer Full Sync ise, genesis bloktan başlayarak blokları teker teker indirir, blokları doğrular ve EVM aracılığıyla durum veritabanını yeniden oluşturur. Eğer Snap Sync ise, tüm blok doğrulama sürecini atlar, doğrudan en son kontrol noktasının durum verilerini ve sonraki blok verilerini indirir.
  • Eğer en son duruma senkronize olmuş bir düğümse, o zaman sürekli olarak Engine API üzerinden konsensüs katmanından mevcut en son üretilen blokları alacak ve blokları doğrulayacak, ardından EVM aracılığıyla bloktaki tüm işlemleri gerçekleştirerek durum veritabanını güncelleyecek ve blokları yerel zincire yazacaktır.
  • En son durumla senkronize edilmiş bir düğümse ve konsensüs katmanı blok oluşturma hakkını elde ettiyse, yürütme katmanını Engine API aracılığıyla en son bloğu üretmeye yönlendirecek ve yürütme katmanı işlemi işlem havuzundan alacak ve yürütecek ve ardından bir blok halinde birleştirecek ve Engine API aracılığıyla konsensüs katmanına iletecek ve konsensüs katmanı bloğu konsensüs katmanı p2p ağına yayınlayacaktır

03\ kaynak kodu yapısı

go-ethereum'in kod yapısı oldukça büyük, ancak bu kodların birçoğu yardımcı kod ve birim testlerine aittir. Geth kaynak kodunu araştırırken, yalnızca protokolün temel uygulamasına odaklanmak gerekir. Her bir modülün işlevleri aşağıdaki gibidir. core, eth, ethdb, node, p2p, rlp, trie & triedb gibi modüllere özellikle dikkat edilmelidir:

  • hesaplar: Ethereum hesaplarını yönetmek, özel ve genel anahtar çiftlerinin oluşturulması, imza doğrulaması, adres türetme gibi işlemleri içerir.
  • beacon: Ethereum Beacon Chain ile etkileşim mantığını işler, Proof of Stake (PoS) konsensüsünün birleştirilmesinden (The Merge) sonraki işlevselliği destekler.
  • build: Betik oluşturma ve derleme yapılandırmaları (örneğin Dockerfile, çoklu platform derleme desteği)
  • cmd: Komut satırı aracı girişi, birden fazla alt komut içerir
  • Ortak: Bayt işleme, adres biçimi dönüştürme ve matematiksel işlevler gibi genel yardımcı program sınıfları
  • konsensüs: konsensüs motorunu tanımlar, önceki iş kanıtı (Ethash) ve tek makine hisse kanıtı (Clique) ile Beacon motoru gibi.
  • konsol: Kullanıcının komut satırı aracılığıyla Ethereum düğümü ile doğrudan etkileşimde bulunmasına (örneğin Web3 API çağrıları yapmak, hesapları yönetmek, blok zinciri verilerini sorgulamak) olanak tanıyan etkileşimli JavaScript konsolu sağlar.
  • çekirdek: Blok zinciri temel mantığı, blok/işlem yaşam döngüsü yönetimi, durum makinesi, Gaz hesaplaması vb. ile ilgilenir.
  • kripto: Şifreleme algoritması uygulamaları, eliptik eğri (secp256k1), hash (Keccak-256), imza doğrulama
  • docs:Belgeler (örneğin tasarım standartları, API açıklamaları)
  • eth: Ethereum ağ protokolünün tam uygulanması, düğüm hizmetleri, blok senkronizasyonu (hızlı senkronizasyon, arşiv modu gibi), işlem yayını vb.
  • ethclient: Ethereum istemci kütüphanesini gerçekleştiren, JSON-RPC arayüzünü kapsayan ve Go geliştiricilerinin Ethereum düğümü ile etkileşimde bulunmasını sağlayan (blok sorgulama, işlem gönderme, sözleşme dağıtma gibi)
  • ethdb: Veritabanı soyutlama katmanı, LevelDB, Pebble, bellek veritabanları gibi destekler, blok zinciri verilerini (blok, durum, işlem) saklar.
  • ethstats: Düğüm çalışma durumunu toplar ve istatistik servisine bildirir, ağ sağlığını izlemek için kullanılır.
  • etkinlik: Olay aboneliği ve yayın mekanizmasını gerçekleştirir, düğüm içi modüller arasında asenkron iletişimi destekler (örneğin yeni blok ulaştığında, işlem havuzu güncellendiğinde)
  • graphql: Karmaşık sorguları destekleyen GraphQL arayüzü sağlar (bazı JSON-RPC işlevlerinin yerini alır)
  • internal:İç araçlar veya dış erişimi sınırlayan kod
  • log: Hiyerarşik log çıktısını ve bağlamsal loglamayı destekleyen bir log sistemi
  • metrikler: Performans göstergelerinin toplanması (Prometheus desteği)
  • madenci: Madencilik ile ilgili mantık, yeni bloklar oluşturma ve işlemleri paketleme (PoW senaryosunda)
  • node:Düğüm hizmet yönetimi, p2p, RPC, veritabanı gibi modüllerin başlatılması ve yapılandırılması
  • p2p: Noktadan noktaya ağ protokolü uygulaması, düğüm keşfi, veri iletimi, şifreli iletişim destekler.
  • params:Ethereum ağ parametrelerini tanımlayın (ana ağ, test ağı, genesis blok yapılandırması)
  • rlp: Ethereum'a özel veri serileştirme protokolü RLP'yi (Recursive Length Prefix) uygulamak için, bloklar, işlemler ve diğer veri yapılarını kodlamak/şifresini çözmek için kullanılır.
  • rpc: JSON-RPC ve IPC arayüzlerini uygulayarak, dış programların düğüm ile etkileşimde bulunmasını sağlar.
  • signer: İşlem imza yönetimi (donanım cüzdanı entegrasyonu)
  • testler: Entegrasyon testleri ve durum testleri, protokol uyumluluğunu doğrulama
  • trie & triedb: hesap durumunun verimli bir şekilde depolanması ve yönetimi, sözleşme depolaması için Merkle Patricia Trie ağacının bir uygulaması

04\İcra katmanı modül bölümü

Geth düğümüne dış erişim için iki şekil vardır; biri RPC aracılığıyla, diğeri ise Console aracılığıyla. RPC, dış kullanıcılar için açmak için uygundur, Console ise düğüm yöneticileri için uygundur. Ancak RPC veya Console aracılığıyla olsun, hepsi içerde zaten paketlenmiş yeteneklerin kullanımıdır, bu yetenekler katmanlı bir şekilde inşa edilmiştir.

En dış katman, dışarıdan düğümlere erişim için API'nin çeşitli yetenekleridir. Engine API, yürütme katmanı ile konsensüs katmanı arasındaki iletişim için kullanılır; Eth API, dış kullanıcılar veya programlar tarafından işlem göndermek ve blok bilgilerini almak için kullanılır; Net API ise p2p ağının durumunu almak için kullanılır. Örneğin, bir kullanıcı API aracılığıyla bir işlem gönderdiğinde, bu işlem nihayetinde işlem havuzuna gönderilir ve işlem havuzu tarafından yönetilir. Ayrıca, kullanıcı bir blok verisi almak istediğinde, ilgili bloğu almak için veri tabanının yeteneklerini çağırması gerekir.

API'nin bir alt katmanında, işlem havuzu, işlem paketleme, blok üretimi, blok ve durum senkronizasyonu gibi temel işlevlerin uygulanması bulunmaktadır. Bu işlevler daha alt katman yeteneklerine bağımlıdır; örneğin, işlem havuzu, blok ve durum senkronizasyonu p2p ağ yeteneklerine dayanır. Blokların üretilmesi ve diğer düğümlerden senkronize edilen blokların yazılmadan önce doğrulanması gerekmektedir; bu da EVM ve veri depolama yeteneklerine dayanır.

! Ethereum ana istemcisi: Geth genel mimarisi

İcra Katmanı Temel Veri Yapısı

Ethereum

eth/backend.go içindeki Ethereum yapısı, tüm Ethereum protokolünün soyutlamasıdır ve temelde Ethereum'daki ana bileşenleri içerir. Ancak EVM bir istisnadır; her işlem işlendiğinde örneklendirilir ve tüm düğümün başlatılmasıyla birlikte gelmez. Aşağıdaki Ethereum ifadesi, bu yapı anlamına gelir:

Ethereum struct { // Ethereum yapılandırması, zincir yapılandırması dahil *ethconfig yazın. Config // İşlem havuzu, kullanıcının işlemi gönderildikten sonra txPool *txpool işlem havuzuna gidin. TxPool // Yerel işlemleri izlemek ve yönetmek için kullanılır localTxTracker *locals. TxTracker // Blok zinciri yapısı blok zinciri *çekirdek. BlockChain // Ethereum düğümünün ağ katmanının temel bileşenidir ve blok senkronizasyonu, işlem yayınlama ve alma dahil olmak üzere diğer düğümlerle tüm iletişimi yönetmekten ve ayrıca eş düğüm bağlantı işleyicisini yönetmekten sorumludur // düğüm keşfi ve düğüm kaynak yönetimi discmix *enode. FairMix // Blok zinciri veri zinciriDb ethdb'nin kalıcı olarak depolanmasından sorumludur. Veritabanı // Çeşitli dahili olayların eventMux *event'e yayınlanmasından ve abone olunmasından sorumludur. TypeMux // Motor konsensüsü. Motor // Kullanıcı hesaplarını ve anahtarlarını yönetin accountManager *hesapları. Yönetici // Günlük filtrelerini ve yığın filtresini yönetinHaritalar *filtermaps. FilterMaps // Düğümler kapatıldığında kaynakların doğru şekilde temizlenmesini sağlayan filterMaps'i güvenli bir şekilde kapatmak için kanal closeFilterMaps chan chan struct{} // RPC API APIBackend için arka uç desteği sağlayın *EthAPIBackend // PoS altında, blok madencisini doğrulamak için konsensüs motoruyla çalışın *madenci. Madenci // Düğüm tarafından kabul edilen en düşük gaz fiyatı gasPrice *big'dir. Int // Ağ Kimliği networkID uint64 // Ağ durumunun RPC netRPCService *ethapi aracılığıyla sorgulanmasına izin vererek ağ ile ilgili RPC hizmetleri sağlayın. NetAPI // P2P ağ bağlantılarını yönetin, düğüm keşfini ve bağlantı kurmayı yönetin ve p2pServer *p2p ağ taşıma işlevlerinin temelini sağlayın. Sunucu // Değiştirilebilir alanlara eşzamanlı erişimi koruyun kilit senkronizasyonu. RWMutex // Düğümün düzgün bir şekilde kapalı olup olmadığını izler ve anormal bir kapanmadan sonra shutdownTracker'ın geri yüklenmesine yardımcı olur *shutdowncheck. ShutdownTracker }

Düğüm

Node, node/node.go'da bulunan başka bir çekirdek veri yapısıdır; çeşitli hizmetlerin çalışmasını yönetmek ve koordine etmek için bir konteyner olarak işlev görür. Aşağıdaki yapıda, lifecycles alanına dikkat etmek gerekir; Lifecycle, iç işlevlerin yaşam döngüsünü yönetmek için kullanılır. Örneğin, yukarıdaki Ethereum soyutlaması, başlatılabilmesi için Node'a bağımlıdır ve lifecycles içinde kaydedilmelidir. Bu şekilde, belirli işlevlerin soyutlama ile ayrılması sağlanır ve tüm mimarinin ölçeklenebilirliği artırılır; bu Node, devp2p'deki Node'dan ayırt edilmelidir.

type Node struct { eventmux *event.TypeMux config *Config // Hesap yöneticisi, cüzdan ve hesapları yönetmekle sorumlu accman *accounts.Manager log log.Logger keyDir string keyDirTemp bool dirLock *flock.Flock stop chan struct{} // p2p ağ örneği server *p2p.Server startStopLock sync.Mutex // Düğüm yaşam döngüsü durumunu (başlatma, çalışmakta, kapalı) izler state int lock sync.Mutex // Tüm kaydedilen arka uçlar, hizmetler ve yardımcı hizmetler lifecycles []Lifecycle // Mevcut sunulan API listesi rpcAPIs []rpc.API // RPC için sunulan farklı erişim yolları http *httpServer ws *httpServer httpAuth *httpServer wsAuth *httpServer ipc *ipcServer inprocHandler *rpc.Server veritabanları map[*closeTrackingDB]struct{} }

Eğer Ethereum'un yürütme katmanına soyut bir boyuttan bakarsak, Ethereum bir dünya bilgisayarı olarak üç parçayı içermelidir: ağ, hesaplama ve depolama. Ethereum yürütme katmanındaki bu üç parçaya karşılık gelen bileşenler şunlardır:

  • Ağ: devp2p
  • Hesaplama: EVM
  • Depolama: ethdb

devp2p

Ethereum temelde dağıtık bir sistemdir, her düğüm p2p ağı aracılığıyla diğer düğümlerle bağlantı kurar. Ethereum'daki p2p ağ protokolünün uygulanması devp2p'dir.

devp2p'nin iki temel işlevi vardır; biri düğüm keşfi, böylece düğümler ağa bağlandığında diğer düğümlerle bağlantı kurabilirler; diğeri ise veri iletim hizmetidir, diğer düğümlerle bağlantı kurulduktan sonra veri alışverişi yapılabilir.

p2p/enode/node.go içindeki Node yapısı, p2p ağındaki bir düğümü temsil eder. enr.Record yapısında düğümle ilgili ayrıntılı bilgilerin anahtar-değer çiftleri olarak saklandığı, bunlar arasında kimlik bilgileri (düğüm kimliği için kullanılan imza algoritması, genel anahtar), ağ bilgileri (IP adresi, port numarası), desteklenen protokol bilgileri (örneğin eth/68 ve snap protokollerini destekleme) ve diğer özel bilgiler bulunur. Bu bilgiler RLP yöntemiyle kodlanmıştır, belirli standart eip-778'de tanımlanmıştır:

type Node struct { // Düğüm kaydı, düğümün çeşitli özelliklerini içerir r enr.Record // Düğümün benzersiz tanımlayıcısı, 32 byte uzunluğunda id ID // hostname Düğümü izleyen DNS adı hostname string // Düğümün IP adresi ip netip.Addr // UDP portu udp uint16 // TCP portu tcp uint16 }// enr.Recordtype Record struct { // Seri numarası seq uint64 // İmza signature []byte // RLP kodlanmış kayıt raw []byte // Tüm anahtar-değer çiftlerinin sıralı listesi pairs []pair }

p2p/discover/table.go içindeki Table yapısı, devp2p'nin düğüm keşif protokolünü uygulayan temel veri yapısıdır; Kademlia benzeri dağıtılmış bir hash tablosu uygulayarak ağdaki düğüm bilgilerini korumak ve yönetmek için kullanılır.

printf("type Table struct { mutex sync. Mutex // Bilinen düğüm demetlerini mesafeye göre indeksleyin [nBuckets]*kova // önyükleme düğümü kreşi []*enode. Node rand reseedingRandom ips netutil. DistinctNetSet yeniden doğrulama tablosuYeniden doğrulama // Bilinen düğümlerin veritabanı db *enode. DB net transport cfg Yapılandırma günlüğü günlüğü. Logger // Ağdaki çeşitli olayları periyodik olarak işler refreshReq chan chan struct{} revalResponseCh chan revalidationResponse addNodeCh chan addNodeOp addNodeHandled chan bool trackRequestCh chan trackRequestOp initDone chan struct{} closeReq chan struct{} closed chan struct{} // nodeAddedHook düğümleri için arabirim ekleme ve kaldırma func(*bucket, *tableNode) nodeRemovedHook func(*kova, *tableNode)} dünya!" );

ethdb

ethdb, Ethereum veri depolamanın soyutlamasını tamamlar, birleşik bir depolama arayüzü sunar. Alt düzeydeki veritabanı leveldb, pebble veya başka bir veritabanı olabilir. Arayüz katmanında birliği korudukça birçok genişleme yapılabilir.

Bazı veriler (blok verileri gibi) ethdb arayüzü aracılığıyla doğrudan temel veritabanına okunabilir ve yazılabilir ve diğer veri depolama arayüzleri ethdb'ye dayanır, örneğin, veritabanındaki verilerin büyük bir kısmı bir MPT yapısında düzenlenecek olan durum verileridir ve Geth'teki karşılık gelen uygulama trye'dir. bu verileri ve ara durumu yönetmek ve son olarak ETHDB aracılığıyla kalıcı hale getirmek.

ethdb/database.go dosyasında temel veritabanının okuma ve yazma yeteneklerine dair bir arayüz tanımlanmıştır, ancak belirli bir uygulama dahil edilmemiştir; belirli uygulama farklı veritabanları tarafından gerçekleştirilecektir. Örneğin, leveldb veya pebble veritabanı. Database içinde iki katmanlı veri okuma ve yazma arayüzü tanımlanmıştır; KeyValueStore arayüzü, en son bloklar, durum gibi aktif ve muhtemelen sık değişen verileri depolamak için kullanılır. AncientStore ise, yazıldıktan sonra nadiren değişen tarihsel blok verilerini işlemek için kullanılır.

// Veritabanının üst düzey arayüzü type Database interface { KeyValueStore AncientStore } // KV verilerinin okuma/yazma arayüzü type KeyValueStore interface { KeyValueReader KeyValueWriter KeyValueStater KeyValueRangeDeleter Batcher Iteratee Compacter io.Closer } // Eski verilerin okuma/yazma arayüzü type AncientStore interface { AncientReader AncientWriter AncientStater io.Closer }

EVM

EVM, Ethereum'un durum makinesinin durum geçiş işlevidir ve tüm durum veri güncellemeleri yalnızca EVM aracılığıyla gerçekleştirilebilir ve p2p ağı, EVM tarafından işlendikten sonra durum veritabanının bir parçası olacak işlem ve blok bilgilerini kabul edebilir. EVM, temel donanımdaki farklılıkları koruyarak, programların farklı platformlardaki EVM'lerde tutarlı sonuçlarla yürütülmesine olanak tanır. Bu, köklü bir tasarım yöntemidir ve Java'daki JVM'ye benzer.

core/vm/evm.go'daki EVM yapısı, yürütme bağlamı, durum veritabanı bağımlılıkları vb. dahil olmak üzere EVM'nin genel yapısını ve bağımlılıklarını tanımlar; core/vm/interpreter.go'daki EVMInterpreter yapısı, yorumlayıcının uygulanmasını tanımlar ve EVM bayt kodunun yürütülmesinden sorumludur; core/vm/contract.go'daki Sözleşme yapısı, arayan, sözleşme kodu, giriş vb. dahil olmak üzere sözleşme çağrısının belirli parametrelerini kapsüller ve core/vm/opcodes.go'daki tüm geçerli işlem kodlarını tanımlar:

EVMtype EVM struct { // Blokla ilgili bilgileri içeren blok bağlamı Context BlockContext // İşlemle ilgili bilgileri içeren işlem bağlamı TxContext // Hesap durumuna erişmek ve değiştirmek için kullanılan durum veritabanı StateDB StateDB // Geçerli çağrı derinliği int // Zincir yapılandırma parametresi chainConfig *params. ChainConfig chainRules parametreleri. Kurallar // EVM Yapılandırma Yapılandırması // Bayt Kodu Yorumlayıcı yorumlayıcısı *EVMInterpreter // Yürütme bayrağını iptal et atomik. Bool callGasTemp uint64 // map[common'ı önceden derler. Adres]PrecompiledContract jumpDests map[ortak. Hash]bitvec }type EVMInterpreter struct { // Ait olduğu EVM örneğini işaret edin evm *EVM // Opcode Jump Table table *JumpTable // Keccak256 hasher instance, opcode'lar arasında hasher crypto'yu paylaşın. KeccakState // Keccak256 hash sonucu buffer hasherBuf common. Hash // Salt okunur mod olsun, salt okunur modda durum değişikliğine izin verilmez readOnly bool // Son ÇAĞRI'nın dönüş verileri sonraki yeniden kullanım için kullanılır returnData []byte }type Contract struct { // arayanın adresi arayan ortak. Adres // Sözleşme adresi adres ortak. Adres atlama haritası[ortak. Hash]bitvec analizi bitvec // Sözleşme Bayt Kodu Kodu []bayt // Kod karması CodeHash ortak. Hash // Çağrı girişi []byte // Sözleşme için IsDeployment bool'un dağıtılıp dağıtılmayacağı // IsSystemCall bool'un çağrılıp çağrılmayacağı // Kullanılabilir gas gas uint64 // *uint256 çağrı değerine eklenen ETH miktarı. int }

Diğer Modül Uygulamaları

Yürütme katmanının işlevi, katmanlı bir şekilde gerçekleştirilir; diğer modüller ve işlevler bu üç temel bileşenin temelinde inşa edilmiştir. İşte birkaç temel modül hakkında bilgi.

eth/protocols altında mevcut Ethereum'un p2p ağ alt protokollerinin uygulanması vardır. eth/68 ve snap alt protokolleri, bu alt protokoller devp2p üzerinde inşa edilmiştir.

eth/68, Ethereum'un ana protokolüdür, protokolün adı eth'dir, 68 ise sürüm numarasıdır. Bu protokolün temelinde, işlem havuzu (TxPool), blok senkronizasyonu (Downloader) ve işlem senkronizasyonu (Fetcher) gibi işlevler gerçekleştirilmiştir. snap protokolü, yeni düğümlerin ağa katıldığında blok ve durum verilerini hızlı bir şekilde senkronize etmeleri için kullanılır ve bu, yeni düğümlerin başlatma süresini önemli ölçüde azaltabilir.

ethdb, temel veritabanının okuma ve yazma yeteneklerini sağlar. Ethereum protokolünde birçok karmaşık veri yapısı bulunduğundan, bu verilerin yönetimi doğrudan ethdb aracılığıyla gerçekleştirilememektedir. Bu nedenle, ethdb üzerine blok ve durum verilerini ayrı ayrı yönetmek için rawdb ve statedb uygulanmıştır.

EVM, tüm ana süreçleri kapsar; blok oluşturma veya blok doğrulama olsun, işlemleri yürütmek için EVM kullanılmalıdır.

05\Geth Düğüm başlatma süreci

Geth'in başlatılması iki aşamaya ayrılır, birinci aşama düğümün başlatılması için gerekli bileşenlerin ve kaynakların başlatılmasını içerir, ikinci aşama ise düğümün resmi olarak başlatılmasını ve ardından dışa hizmet vermesini sağlar.

Ethereum ana akım istemcisi: Geth genel mimarisi

Düğüm Başlatma

Bir geth düğümü başlatırken aşağıdaki kodlarla ilgili olacaktır:

Ethereum ana akım istemcisi: Geth genel mimarisi

Her bir modülün başlatılması aşağıdaki gibidir:

  • cmd/geth/main.go: geth Düğüm başlatma girişi
  • cmd/geth/config.go(makeFullNode):Yapılandırmayı yükle, düğümü başlat
  • node/node.go: Ethereum düğümünün çekirdek konteynerini başlatma
  1. node.rpcstack.go: RPC modülünü başlat
  2. accounts.manager.go:accountManager'ı başlat
  • eth/backend.go: Ethereum örneğini başlatma
  1. düğüm/node.go OpenDatabaseWithFreezer: chaindb'yi başlat
  2. eth/ethconfig/config.go: Konsens motoru örneğinin başlatılması (buradaki konsens motoru gerçekten konsensüse katılmaz, yalnızca konsens katmanının sonuçlarını doğrular ve validator'ın çekim taleplerini işleme alır)
  3. core/blockchain.go: blockchain'ı başlatma
  4. core/filterMaps.go: filtermaps'ı başlat
  5. core/txpool/blobpool/blobpool.go: blob işlem havuzunu başlat
  6. core/txpool/legacypool/legacypool.go: normal işlem havuzunu başlatır
  7. cord/txpool/locals/tx_tracker.go: Yerel işlem izleme (yerel işlem izlemeyi etkinleştirmek için yapılandırma gereklidir, yerel işlemler daha yüksek öncelik ile işlenecektir)
  8. eth/handler.go: Protokolün Handler örneğini başlatma
  9. miner/miner.go: İşlem paketleme modülünün örneği (eski madencilik modülü)
  10. eth/api_backend.go: RPC hizmetinin örneklenmesi
  11. eth/gasprice/gasprice.go: Gaz fiyatı sorgulama servisini başlat
  12. internal/ethapi/api.go: P2P ağ RPC API'sini örnekleme
  13. düğüm/düğüm.go(KayıtlıAPIs): RPC API kaydı
  14. düğüm/düğüm.go(RegisterProtocols):p2p için Ptotocols kaydet
  15. düğüm/düğüm.go(Yaşam Döngüsü Kaydı): çeşitli bileşenlerin yaşam döngüsünü kaydetme
  • cmd/utils/flags.go(RegisterFilterAPI):Filter RPC API'sini kaydet
  • cmd/utils/flags.go(RegisterGraphQLService):GraphQL RPC API'sini kaydet (varsa yapılandırılmışsa)
  • cmd/utils/flags.go(RegisterEthStatsService): EthStats RPC API'yi kaydet (eğer yapılandırılmışsa)
  • eth/catalyst/api.go: Engine API'yi kaydet

Düğümün başlatılması cmd/geth/config.go içindeki makeFullNode'da tamamlanacak ve özellikle aşağıdaki üç modül başlatılacaktır.

Ethereum ana istemcisi: Geth genel mimarisi

İlk adımda node/node.go içindeki Node yapısı başlatılacak, bu bütün Düğüm konteyneridir, tüm işlevlerin bu konteyner içinde çalışması gerekmektedir, ikinci adımda Ethereum yapısı başlatılacak, bu da Ethereum'un çeşitli temel işlevlerinin uygulanmasını içermektedir, Etherereum'un da Node'a kaydedilmesi gerekmektedir, üçüncü adım ise Engine API'nin Node'a kaydedilmesidir.

Node'in başlatılması, bir Node örneği oluşturmayı, ardından p2p sunucusunu, hesap yönetimini ve dışa açılan http gibi protokol portlarını başlatmayı içerir.

Ethereum ana akım istemcisi: Geth genel mimarisi

Ethereum'in başlatılması çok daha karmaşık olacak, çoğu temel işlev burada başlatılıyor. Öncelikle ethdb başlatılacak ve depolamadan zincir yapılandırması yüklenecek, ardından konsensüs motoru oluşturulacak; buradaki konsensüs motoru konsensüs işlemlerini gerçekleştirmeyecek, yalnızca konsensüs katmanından dönen sonuçları doğrulayacak. Eğer konsensüs katmanında bir çekim talebi olursa, burada gerçek çekim işlemi de tamamlanacak. Ardından Block Chain yapısı ve işlem havuzu başlatılacak.

Bunlar tamamlandıktan sonra handler'ı başlatacak, handler, tüm p2p ağ isteklerinin işleme giriş noktasıdır; işlem senkronizasyonu, blok indirme vb. dahil olmak üzere, Ethereum'un merkeziyetsiz çalışmasını gerçekleştiren ana bileşendir. Bunlar tamamlandıktan sonra, devp2p temelinde gerçekleştirilen bazı alt protokoller, örneğin eth/68, snap gibi, Node konteynerine kaydedilecek ve en sonunda Ethereum, Node konteynerine bir yaşam döngüsü olarak kaydedilecek, Ethereum başlatılması tamamlanacaktır.

Ethereum ana akım istemcisi: Geth genel mimarisi

Sonunda Engine API'nin başlatılması oldukça basittir; sadece Engine API'yi Düğüm'e kaydetmek gerekir. Buraya kadar, düğüm başlatma işlemi tamamen tamamlanmıştır.

Düğüm Başlat

Düğümün başlangıcını tamamladıktan sonra, düğümü başlatmanız gerekir. Düğüm başlatma süreci oldukça basittir, yalnızca kayıtlı olan tüm RPC hizmetlerini ve Lifecycle'ı başlatmanız yeterlidir, böylece tüm düğüm dışa hizmet verebilir.

Ethereum ana akım istemcisi: Geth genel mimarisi

06\özet

Ethereum'un yürütme katmanının uygulanmasını derinlemesine anlamadan önce, Ethereum'un genel bir anlayışına sahip olmak gerekir. Ethereum'u genel olarak bir işlem odaklı durum makinesi olarak görebiliriz. Yürütme katmanı işlemlerin yürütülmesi ve durum değişikliklerinden sorumluyken, konsensüs katmanı yürütme katmanının çalışmasını sağlamakla yükümlüdür. Bu, yürütme katmanının blok üretmesini, işlemlerin sırasını belirlemesini, bloklar için oylama yapmasını ve blokların nihai hale gelmesini sağlamayı içerir. Bu durum makinesi merkeziyetsiz olduğundan, durum verilerinin tutarlılığını ortaklaşa korumak için p2p ağı aracılığıyla diğer düğümlerle iletişim kurmak gerekir.

Yürütme katmanı, işlemlerin sırasını belirlemekten sorumlu değildir, yalnızca işlemlerin yürütülmesinden ve yürütüldükten sonra durum değişikliklerinin kaydedilmesinden sorumludur. Burada iki kayıt şekli vardır, biri tüm durum değişikliklerini bloklar şeklinde kaydetmek, diğeri ise mevcut durumu veritabanına kaydetmektir. Aynı zamanda, yürütme katmanı aynı zamanda işlemler için giriş noktasıdır ve henüz bloklar halinde paketlenmemiş işlemler işlem havuzu aracılığıyla saklanır. Diğer düğümlerin blok, durum ve işlem verilerine erişmesi gerekiyorsa, yürütme katmanı bu bilgileri P2P ağı üzerinden gönderir.

İşlem katmanı için üç ana modül vardır: hesaplama, depolama ve ağ. Hesaplama, EVM'nin uygulanmasına karşılık gelir, depolama ise ethdb'nin uygulanmasıyla ilişkilidir, ağ ise devp2p'nin uygulanmasıyla ilgilidir. Bu genel anlayışa sahip olduktan sonra, her bir alt modülü derinlemesine anlamaya geçebiliriz ve belirli detaylarda kaybolmayız.

07\Ref

[1]

[2]

[3]

[4]

[5]

[6]

·SON·

İçerik | Ray

Düzenleme & Tipografi | Huan Huan

Tasarım | Daisy

View Original
The content is for reference only, not a solicitation or offer. No investment, tax, or legal advice provided. See Disclaimer for more risks disclosure.
  • Reward
  • Comment
  • Share
Comment
0/400
No comments
  • Pin