Ethereum PoS Node Kurulumu

Ethereum’da uzun zamandır beklenen/planlanan, en büyük güncellemelerden biri olan PoS’a geçiş yani nam-ı değer –The Merge– işlemi 15 Eylül 2022 tarihi itibarıyla gerçekleşti. Bundan sonra Ethereum, Proof of Stake konsepti ile yoluna devam edecek. Hazır Ethereum PoS mimarisine geçmişken, node tarafında gerçekleşen bazı değişiklikleri pratik olarak uygulayalım.
Ethereum node kurmak için, temelde bir istemci uygulaması kullanıyor. PoW yapısında bu şekilde bir Execution Client(Çalıştırıcı istemci) vardı. Ancak PoS ile beraber, yeni bir katman daha ortaya çıktı: “Konsensüs(Consensus)”. Yine eskisi gibi block işlemlerini Execution Layer katmanı gerçekleştirecek, ancak konsensüs işlemleri(slotlar, epoch eventler vs) bu yeni katman tarafından yönetilecek. Şimdi, hem Execution tarafı hem de Konsensüs tarafında kurulumlara bakalım:

1. Execution Client(Eski adıyla ETH1 client):

Aslında bu PoS öncesi de olan bir katman idi. Piyasada birkaç tane uygulaması var
* Geth: Go dili ile yazılmış, Ethereum resmi istemcisidir. Mainnet ve tüm testnetlerde çalışır. Full ve Snap senkronizasyonu destekler. Tüm başat işletim sistemlerinde çalışıyor(Linux, Windows, macOS)

* Erigon: Go ile yazılmıştır. Full senkronizasyonu destekler. Tüm başat işletim sistemlerinde çalışıyor(Linux, Windows, macOS)

* Nethermind: C# ile yazılmıştır. Mainnet ve tüm testnetlerde çalışır. Full ve Snap senkronizasyonu destekler. Tüm başat işletim sistemlerinde çalışıyor(Linux, Windows, macOS)

* Besu: Java ile yazılmıştır. Mainnet ve tüm testnetlerde çalışır. Full senkronizasyonu destekler. Tüm başat işletim sistemlerinde çalışıyor(Linux, Windows, macOS)

* Akula: Rust ile yazılmıştır. Linux üzerinde çalışıyor. Full senkronizasyonu destekler. Tüm başat işletim sistemlerinde çalışıyor(Linux, Windows, macOS)

Bu makalede, şu an için popüler olan Geth uygulamasını kurup ayarlayacağız. https://geth.ethereum.org/downloads/ adresinden istenilen işletim sistemi için ilgili paket indirilir ve kurulur(Örneklerim Windows üzerinde olacak). ilgili setup dosyasını çalıştırıp, kurulumu tamamlıyoruz.

Diğer bir önemli nokta da, decentralization’ın teknik altyapısı olan network discovery. Gerek bitcoin gerekse de Ethereum ve diğer merekzi olmayan uygulamalar, network katmanında haberleşiyorlar(yani merkezi bir URL vs yok). Ethereum bunun için 30303 nolu portu kullanıyorlar. Eğer bilgisayarınız bir modem, vpn vs arkasında ise, 30303 portunu hem TCP hem de UDP için dış dünyaya açıyoruz ve içerde geth kurulu makinaya yönlendiriyoruz(NAT işlemi). Bununla beraber, geth uygulamasının çalışacağı makinadaki 30303 portu da erişime açılır. Bu şekilde, hem bizim makina dışardaki peer’leri görür, hem de onlar bizi görebilecek.

Şimdi geldik çalıştırmaya. Bnun için bir terminal penceresi açıyoruz. ‘geth‘ komutunu yazdığımızda aşağıdaki gibi bir çıktı üretir

C:\Users\Mahsum>geth
INFO [10-01|18:54:48.637] Starting Geth on Ethereum mainnet…
INFO [10-01|18:54:48.638] Bumping default cache on mainnet provided=1024 updated=4096
INFO [10-01|18:54:48.640] Maximum peer count ETH=50 LES=0 total=50
INFO [10-01|18:54:48.646] Set global gas cap cap=50,000,000
INFO [10-01|18:54:48.646] Allocated trie memory caches clean=614.00MiB dirty=1024.00MiB

Peki, geth ne gibi parametreler alıyor? Burda önemli birkaç nokta var. Senkronizasyon modu, hangi networkdatanın nerde saklanacağı, kullanılacak olan hesaplar vs. Tüm seçeneklere şu adresten ulaşabilirsiniz.

* Network: Varsayılan olarak mainnet’e bağlanır. Eğer herhangi bir testnete bağlanılmak istenirse –testnet-adi yazılır. –goerli veya –sepolia gibi
* Senkronizasyon(sync) modu: Bunun detaylı hali için şurdaki makaleyi inceleyebilirsiniz. Varsayılan olarak “snap” modunda çalışıyor. değiştirmek için –syncmode parametresi kullanılır. –syncmode snap veya –syncmode full gibi.
* Blockzincir datasının tutulacağı yer: İster full node olsun ister de snap(ve PoW döneminde light mode), datayı nerde saklayacağının parametresi gerekiyor. Bunun için –datadir parametresi kullanılır. Windows için örnek: –datadir C:\eth\mainnet
* Eğer, execution client üzerinde RPC-JSON API kullanılacaksa, bunun açılması lazım. ilgili parametre –http. Bu durumda varsayılan adres localhost ve varsayılan port 8545’dir(bu yüzden bilgisayarınızda 8545 portunun boş olduğundan emin olunuz veya farklı bir port kullanmak isterseniz –http.port parametresi ile istediğiniz portu kullanabilirsiniz)

Örnek tam komut listesi: geth –datadir C:\eth\mainnet –syncmode snap –mainnet –http

Ayrıca, uygulamanın başarılı bir şekilde çalışıp çalışmadığını web tarayıcısından da kontrol edebilirsiniz. Bunun için herhangi bir web tarayıcıda(Chrome, Firefox vs) http://localhost:8545/ adresine gidin. Eğer herhangi bir hata çıkmadıyssa, uygulama başarılı bir şekilde çalışıyor.

Not: Bu makalede Validator kurulum işlemleri anlatılmayacak.

2. Konsensüs(Consensus) istemcisi

Burda da farklı dillerde yazılmış birçok uygulama vardır.
* Prysm: Go ile yazılmıştır
* Lighthouse: Rust ile yazılmıştır
* Teku: Java ile yazılmıştır
* Nimbus: Nim ile yazılmıştır
* Lodestar: TypeScript ile yazılmıştır

Şu an için Teku ile devam edeceğiz. (Bu noktada, Ethereum ekosistemi tek bir uygulamaya yoğunlaşmayı önermiyor. Olabildiğince tüm uygulamaların eşit derecede kullanılıp, olası bir bug veya uygulama arızasında network stabilitisi sağlanması isteniyor. Client Diversity)

Teku bir zip dosyası olarak geliyor. https://github.com/ConsenSys/teku/releases adresinden son sürüm indirilir. İstenilen bir klasorde dosya açılır.
Not: Uygulamanın çalışması için, makinanızda güncel bir JDK yüklü olmalıdır.

Daha sonra konsensus ve execution client’ın kendi arasında iletişim kruması için JWT token oluşturulur. Burda da iki seçenek var:
* Bilgisayarınızda openssl kutuphanesi var ise openssl rand -hex 32 | tr -d “\n” > jwtsecret komutu ile oluşturulabilir.
* Geth’in oluşturduğu(geth çalıştırma kısmında, datanın saklanacağı klasorde) jwt token kullanılabilir. Bu makalede bu seçeneği değerlendiriyorum.

Diğer adım, tıpkı execution client gibi konsensüs istemcisinin de discovery network için kullandığı portu dış dünyaya açıyoruz. Bunun için 9000 portunu hem TCP hem UDP için açıyoruz.(modem üzerinde aç, NAT yap ve makina üzerinde firewall ‘dan izin verilir)

Artık uygulamayı çalıştırabiliriz. Bunun için açtığımız zip dosyasında, açılan klasorede bin klasorune gidiyoruz. burada bir terminal açıyoruz.
terminalde “teku” komutunu çalıştırdığımızda aşağıdaki gibi loglar üretir.

2022-10-01 19:40:40,398 main INFO Configuring logging for destination: console and file
2022-10-01 19:40:40,426 main INFO Logging file location: C:\Users\Mahsum\AppData\Local\teku\logs\teku.log
2022-10-01 19:40:40,426 main INFO Logging includes events: true
2022-10-01 19:40:40,426 main INFO Logging includes validator duties: true
2022-10-01 19:40:40,426 main INFO Logging includes color: true
2022-10-01 19:40:40,631 main INFO Include P2P warnings set to: false
19:40:41.506 INFO – Teku version: teku/v22.10.2/windows-x86_64/oracle-java-18
19:40:41.510 INFO – This software is licensed under the Apache License, Version 2.0 (the “License”); you may not use this software except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
Invalid configuration. –ee-endpoint parameter is mandatory when Bellatrix milestone is enabled

To display full help:
teku [COMMAND] –help

Burda da birkaç önemli parametre var.
* Execution client ile iletişim adresi: Bunun için –ee-endpoint parametresi kullanılır. Execution client çalıştırıldığı zaman, akan loglarda bu adres bilgisi verilir. Varsayılan olarak http://localhost:8551 adresidir. Tam komut –ee-endpoint=http://localhost:8551
* JWT dosyasının yeri: –ee-jwt-secret-file parametresi kullanılır. Geth’in ürettiği dosyayı kullanabiliri. –ee-jwt-secret-file=C:\eth\mainnet\geth\jwtsecret (unutmayın, sizin kendi bilgisayarınızda istediğiniz bir path klasorede olabilir, bu standart bir path değildir)
* Diğer parametreler: –metrics-enabled=true ve –rest-api-enabled=true parametreleri verilir.

Sonuç olarak: teku –ee-endpoint=http://localhost:8551 –ee-jwt-secret-file=C:\eth\mainnet\geth\jwtsecret –metrics-enabled=true –rest-api-enabled=true
çalıştırdığımız zaman, aşağıdaki gibi bir log üretir.

2022-10-01 19:45:27,081 main INFO Configuring logging for destination: console and file
2022-10-01 19:45:27,089 main INFO Logging file location: C:\Users\Mahsum\AppData\Local\teku\logs\teku.log
2022-10-01 19:45:27,089 main INFO Logging includes events: true
2022-10-01 19:45:27,089 main INFO Logging includes validator duties: true
2022-10-01 19:45:27,089 main INFO Logging includes color: true
2022-10-01 19:45:27,204 main INFO Include P2P warnings set to: false
19:45:27.639 INFO – Teku version: teku/v22.10.2/windows-x86_64/oracle-java-18
19:45:27.642 INFO – This software is licensed under the Apache License, Version 2.0 (the “License”); you may not use this software except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
19:45:27.865 INFO – Storing beacon chain data in: C:\Users\Mahsum\AppData\Local\teku\beacon
19:45:27.867 INFO – Loading 0 validator keys…
19:45:27.870 INFO – Loaded 0 Validators:
19:45:27.867 INFO – Using portable BLST library.
19:45:28.520 INFO – Initializing storage
19:45:32.434 INFO – Storage initialization complete
19:45:32.441 WARN – Rest API is enabled but no default fee recipient has been configured via the validators-proposer-default-fee-recipient option! It is strongly recommended to configure it to avoid possible block production failures in case the node has not been prepared for potential proposers by the Validator Client.
19:45:36.058 INFO – Loading generated p2p private key from: generated-node-key
19:45:36.352 INFO – PreGenesis Local ENR: enr:-Iu4QNyL1v7Mk6L4eorOWpVw_TfF62O8nEBYSDKhJebCVNV4Uka38ZsDVTdAXyUWXsx8JU5IMtB-zEANcSdE7F3O2opChGV0aDKQ9aX9QgAAAAD__________4JpZIJ2NIlzZWNwMjU2azGhAyZbI6gRWm6qp7raG0AIdQBtPTOJ9kPkNsugtJkWKnNT
19:45:36.852 INFO – Listening for connections on: /ip4/192.168.56.1/tcp/9000/p2p/16Uiu2HAmFEiStbEFoQtsHXebHgnmtJ4shuA1hVddrto23AYx8YkJ
19:45:36.928 INFO – Local ENR: enr:-Iu4QF-lHBpyS9xYo9DRZ77W1N8brQenb68Vo5bjBxsnToWnfA3z-F08XQRJbGu7ve4I0ivAq-SJv_YuQZsQJYDATllDhGV0aDKQSibFiwIAAAD__________4JpZIJ2NIlzZWNwMjU2azGhAyZbI6gRWm6qp7raG0AIdQBtPTOJ9kPkNsugtJkWKnNT
19:45:37.053 INFO – Syncing *** Target slot: 3264626, Head slot: 874853, Remaining slots: 2389773, Connected peers: 0
19:45:37.194 INFO – Loading deposits up to Eth1 block 0
19:45:47.001 INFO – Syncing *** Target slot: 3264627, Head slot: 874853, Remaining slots: 2389774, Connected peers: 0
19:45:52.051 INFO – Syncing started
19:45:59.002 INFO – Syncing *** Target slot: 3264628, Head slot: 874857, Remaining slots: 2389771, Connected peers: 3
19:46:11.177 INFO – Syncing *** Target slot: 3264629, Head slot: 874925, Remaining slots: 2389704, Connected peers: 4

Burada, PoS konsensüs slotlarının senkron edilmesi biraz zaman alabilir.

Başka bir makalede görüşmek üzere,
node’larınız her daim canlı olsun.