Quorum ile 3 node 'lü RAFT Blockchain Network kurulumu -4

    Malumunuz Blockchain teknolojisinin temeli verinin merkezilikten çıkarak dağıtık ve güvenilir bir şekilde tutulmasında yatıyor. Daha önceki yazılarımızda dev ortamı ganache ' i kullanarak tek node lu bir development ortamı üzerinden testlerimizi yapmıştık. Şimdi ise birden fazla node ile çalışarak yani dev ortamından çıkarak gerçek bir blockchain ortamı ile çalışmak için altyapı kurulumu yapalım.

Web3j ve Ganache ile Ethereum Dünyasına Giriş - 1 (buraktunali.blogspot.com)

Solidity ile Akıllı Kontratlar ve Ethereum Dünyası -2 (buraktunali.blogspot.com)

React Native ve Web3 ile Transaction Ethereum Dünyası -3 (buraktunali.blogspot.com)

Aslında birden fazla node kurulumunu quick start kurulum üzerinden yapabiliyorsunuz. Ancak biz bu yazımızda göstereceğimiz gibi bazı konfigurasyonlar üzerinden de yapabiliyor olacağız.

Yazımızın temelinde olan Quorum ile başlayalım.

https://consensys.net/quorum/

Quorum u tamamen açık kaynaklı blockchain teknolojisi sunan altyapı olarak tanımlayabiliriz. 

Bu altyapı Go dilinde yazılmış. Linkini vermiş olduğum Consensys firması ise GoQuorum dan sonra yoluna Hyperledger Besu ile devam etmeye hazırlanıyor şaşırmayın. :)

Şimdi bu yapacağımız işlemler için bu yazıdan bağımsız bir şekilde "next->next" düzeyinde aşağıdaki linkten hem Besu hem de Quorum networklerini dockerize edilmiş bir şekilde çalıştırıldığını göreceksiniz. Biz yazımızda blockchain teknoloji içerisindeki konfigurasyonları anlama adına bu işlemleri elle gerçekleştireceğiz.

https://github.com/ConsenSys/quorum-dev-quickstart 

Geth,bootnode,enode gibi kavramları öğrenmemiz gerekiyor. Sırasıyla başlayalım.

GETH

Node larımızı tekil olarak ayağa kaldıracak olan Geth ile başlayalım. Geth'in ethereum client ının GoQurom a ait geliştirilmiş versiyonunu kullanıyor olacağız. Derleme için Go gerekiyor.

https://consensys.net/docs/goquorum/en/latest/deploy/install/binaries/#release-binaries

Aşağıda oldukça fazla parametre bulunan bir liste göreceksiniz. Burada GoQuorum a ait olan raft ve emitconnections gibi parametreler bulunmuyor tabi.

https://geth.ethereum.org/docs/interface/command-line-options

GoQuroum sayfasında bulunan node'u ayağa kaldıran komut aşağıdaki gibi. Önce temel parametreler ile başlayalım.

PRIVATE_CONFIG=ignore geth --datadir data --nodiscover --verbosity 5 --networkid 31337 --raft --raftport 50000 --http --http.addr 0.0.0.0 

 --http.port 22000 --http.api admin,db,eth,debug,miner,net,shh,txpool,personal,web3,quorum,raft -

 -emitcheckpoints --port 21000

Temel parametreler

--datadir : burada bir klasör verelim. Bu klasör node un kalbi gibi. Okuyacağı parametre dosyalarını buraya koyacağız.. 

--nodiscover : Diğer nodeları elle ekleme yapacağımız için bu özelliği kapatıyoruz.

--verbosity : loglama derecesi başlangıç için 5 ideal

--networkid : Network umuze bir id verelim

--http : Http RPC serverını çalıştırıyoruz. Bu şekilde ikinci yazımızdaki gibi Remix üzerinden nodelarımızı ve altındaki accountları görebilir ve kontrat yükleyebiliyor olacağız.

--http.api : Api üzerinden verilecek hizmetleri ekliyoruz.

-- port : Node umuzun çalışacağı port. Her node için ayrı ayrı verilmeli.

GoQurom parametrelerine gelirsek;

--raft : Burada bir parantez açalım. 

Raft ve IBFT kavramlarına bir bakalım.

Raft i anlamak için Byzantine fault tolerance kavramını biliyor olmamız lazım.

Temel olarak bazı nodeların yanlış yönlendirme yapıyor olma ihtimaline karşı önlem olarak oylama yöntemi ile doğru dataya ulaşmaya çalışma yöntemidir. Burada temel olarak network validatorleri yani oylama katılımcılarının %50 den fazla ele geçirelemediği varsayılmıştır.

https://www.youtube.com/watch?v=VWG9xcwjxUg

Peki raft ne yapmaktadır ? Node burada liderini takip eder. Lideri güvenilir olduğu sürece network güvendedir. Tabii bu yöntemin seçilmesi bize hız olarak geri dönmektir.

--raftport : Node listesi oluştururken kullanacağımız port

Opsiyonel ekleyebileceğiniz diğer parametreler;

websocket için aşağıdaki parametreleri ekleyebilirsiniz. Bu da standart geth özelliğidir.

Permission ;

 Hangi nodeların birbirini görmesini istiyorsak bir permision listesi oluşturabiliyoruz.

Bunun için geth "--permissioned" parametresi ile permission-nodes.json dosyası ile yönetibiliyoruz. Bu dosya tipi discover ı kapattığımız için kullanacağımız static-nodes.json dosyası ile aynı formatta.

https://consensys.net/docs/goquorum/en/latest/configure-and-manage/configure/permissioning/basic-permissions/


BOOTNODE

Node listesi oluşturacağız. ip ve port bilgilerine sahibiz. Şimdi bootnode ile key oluşturalım.

[  "enode://ac6b1096ca56b9f6d004b779ae3728bf83f8e22453404cc3cef16a3d9b96608bc67c4b30db88e0a5a6c6390213f7acbe1153ff6d23ce57380104288ae19373ef@127.0.0.1:21000?discport=0&raftport=50000",

]

bootnode --genkey=nodekey komutu ile oluşturup bu atabilirsiniz. 

bootnode --nodekey=nodekey --writeaddress ile oluşacak id yi static listeye her node için yaparak ekleyebilirsiniz.

Key generation zorunlu değil. Nodelar çalıştıktan sonra data içinde geth klasörü altında bir nodekey oluştuğunu göreceksiniz. Bu durumda listesiz bir şekilde çalışıyor sistem ancak nodelar bağlı olmuyor.

Tüm nodeların datasının altına 3 node için oluşturacağımız dosyayı atıyoruz.

ACCOUNT OLUŞTURMA 

Yine her bir node için açağımız data klasörü altında genesis.json ile açılacak accountları belirtiyoruz. 

Alloc kısmı accountlarımızı tanımlayabiliyoruz. Yazıyı uzatmamak adına diğer ayrıntılar için aşağıdaki yazıya bakabilirsiniz.

https://lightrains.com/blogs/genesis-json-parameter-explained-ethereum

{

  "alloc": {

    "0xed9d02e382b34818e88b88a309c7fe71e65f419d": {

      "balance": "1000000000000000000000000000"

    },

    "0xca843569e3427144cead5e4d5999a3d0ccf92b8e": {

      "balance": "1000000000000000000000000000"

    },

    "0x0fbdc686b912d7722dc86510934589e0aaf3b55a": {

      "balance": "1000000000000000000000000000"

    }

  },

  "coinbase": "0x0000000000000000000000000000000000000000",

  "config": {

    "homesteadBlock": 0,

    "byzantiumBlock": 0,

    "constantinopleBlock": 0,

    "istanbulBlock": 0,

    "petersburgBlock": 0,

    "chainId": 10,

    "eip150Block": 0,

    "eip155Block": 0,

    "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",

    "eip158Block": 0,

    "maxCodeSizeConfig": [

      {

        "block": 0,

        "size": 32

      }

    ],

    "isQuorum": true

  },

  "difficulty": "0x0",

  "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000",

  "gasLimit": "0xE0000000",

  "mixhash": "0x00000000000000000000000000000000000000647572616c65787365646c6578",

  "nonce": "0x0",

  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",

  "timestamp": "0x00"

}

Bundan sonra yukarda oluşturacağınız 3 node lu geth komutlarını çalıştırmanız gerekiyor. Log takibi için komutların sonuna >>/logs/x.log & ekleyebilirsiniz. Kolay gelsin.

 















Yorumlar

Bu blogdaki popüler yayınlar

IONIC BAŞLANGIÇ

Cannot resolve the collation conflict between “Turkish_CI_AS” and “SQL_Latin1_General_CP1_CI_AS” in the equal to operation

Golang working with interfaces and functions -3