Yazılımcılar İçin Bitcoin Full Node

Faruk Terzioğlu
Blokzincir
Published in
5 min readJul 19, 2019
Source: https://kubedex.com/resource/bitcoind/

Bu yazı içerisinde bitcoin blockchain’i ile haberleşmek için gerekli olan full node kurulumuna pratik bir yol sunacağım. Daha önce “Bitcoin’i Kodlamak” yazısında golang ile yazılmış bitcoin full node uygulaması btcd’nin nasıl kurulduğuna değinmiştim. Aynı şekilde “Bitcoin Full Node Çalıştırmak” yazısında da referans bitcoin client’ı Bitcoin Core’un nasıl kurulup çalıştırılacağına değinmiştim.

Fakat iki yazıda daha geniş bir konuya odaklandığı için kurulum kısmı fazla karmaşık olabilir. Bu yazı içerisinde en hızlı şekilde full node kurarak yazılımlarınız ile haberleşmesini sağlayacağız.

Kurulumların hepsini kendi PC’nizde yapabileceğiniz gibi Docker ile çalıştıracağınız bir Ubuntu serverda da deneyebilirsiniz.

$ docker run -it ubuntu /bin/bash

Aşağıdaki komutlar ile Bitcoin Core uygulamasını kuralım. Gerekli güncellemeleri aldıktan sonra bitcoin uygulamasını yeni oluşturduğumuz ‘download’ dizinine indirelim. Bu yazıyı yazdığım sırada güncel versiyon 0.18 idi. Şu sayfadan son sürümü kontrol edip indirme linkin kopyalabilirsiniz;

$ apt update && apt upgrade
$ apt install wget
$ mkdir download
$ cd download/
$ wget https://bitcoin.org/bin/bitcoin-core-0.18.0/bitcoin-0.18.0-x86_64-linux-gnu.tar.gz

İndirdiğiniz uygulamaların orijinal olup olmadığından emin olmak ve kötü niyetli veya kodu değiştirilmiş olup olmadığı doğrulamak için geliştirici imzaları ile kontrol etmelisiniz. Nasıl yapılacağını şurada inceleyebilirsiniz;

Arşiv dosyasını açalım ve Bitcoin Core uygulamasını yükleyelim.

$ tar xzf bitcoin-0.18.0-x86_64-linux-gnu.tar.gz
$ install -m 0755 -o root -g root -t /usr/local/bin bitcoin-0.18.0/bin/*

Yüklendiğinden ve düzgün bir şekilde çalıştığından emin olmak için aşağıdaki komutu çalıştıralım. Çıktık olarak yüklü versiyonu ekrana basacaktır.

$ bitcoind --version
Bitcoin Core Daemon version v0.18.0

bitcoind uygulamasını çalıştıralım ve loglarını inceleyim. Varsayılan olarak mainnet’te çalışacağı için durdurulana kadar tüm bitcoin verisini (~210gb) indirir. Ctrl+C ile durdurabilirsiniz.

$ bitcoind

Alternatif olarak daemon modda arka planda çalışmasını sağlayabiliriz. Durdurmak için bitcoin-cli ile stop komutu gönderebilirsiniz.

$ bitcoind -daemon
Bitcoin server starting
$ bitcoin-cli stop

Sık kullanılan ayarları her defasında komut satırından tanımlamaya gerek kalmadan config dosyasından okuyabiliriz. Varsayılan config dosyası; ~/.bitcoin/bitcoin.conf dizinindedir. Bu dosyayı düzenlemek için;

$ sudo nano ~/.bitcoin/bitcoin.conf

Dosya içine aşağıdaki değerleri yazacağız. Her birini açıklarsam;

  • regtest: simülasyon ağına bağlanmak için kullanılır
  • testnet: Bitcoin test ağına bağlanmak için kullanılır (# ile kapalı)
  • daemon: bitcoind uygulamasının arka planda çalışmasını sağlar
  • server: Komut satırı ve rpc isteklerini kabul eder
  • listen: Diğer bitcoin node’larından gelen bağlantı isteklerini kabul eder
  • rpcuser: rpc istekleri için basic authentication kullanıcı adı
  • rpcpassword: rpc istekleri için basic authentication şifresi
regtest=1
#testnet=1
daemon=1
server=1
listen=0
rpcuser=myuser
rpcpassword=SomeDecentp4ssw0rd

Tüm ayarların listesi için şuraya bakabilirsiniz; https://en.bitcoin.it/wiki/Running_Bitcoin

Dosyayı kaydedip çıktıktan sonra bitcoind yi tekrar çalıştıralım. Farkettiyseniz config dosyasına yazdıklarımızdan dolayı-daemon yazmadan da arka planda çalışmakta.

$  ~ bitcoind 
Bitcoin server starting

Arka planda çalıştığı için uygulama loglarını göremiyoruz. Fakat loglar bitcoind çalışma dizinindeki debub.log dosyasına yazılmakta. Bu dosyayı ‘tail’ komutu ile izlersek;

$  cd ~/.bitcoin  
$ tail -f regtest/debug.log

Simülasyon ağında çalışken blockchain logları ~/.bitcoin/regtest dizininde, tetsnet de iken ~/.bitcoin/testnet3 mainnet te iken de ~/.bitcoin dizinindeki debug.log dosyasına yazılmakta. Eğer blockchain verilerini (block, tx vs.) sıfırlamak isterseniz de bu dizinlerdeki ‘blocks’ ve ‘chainstate’ klasörlerini silebilirsiniz.

Artık bitcoind uygulaması çalıştığına göre örnek olarak aşağıdaki komutları çalıştıralım. Yeni bir adres oluşturacak, yeni bir blok üretip blok ödülünü oluşturduğumuz adrese tanımlayacağız. Bakiyemizi sorguladığımızda 0 olduğunu görürüz. Çünkü blok ödülünün kullanabilmesi için 100 blokluk olgunluğa erişmesi gerekmektedir. Bunun için 100 blok daha üretiyoruz.

Daha sonrasında ise başka bir adres daha oluşturup bu adrese 10 bitcoin gönderiyoruz.

$ bitcoin-cli getnewaddress
[ADRES]
$ bitcoin-cli generatetoaddress 1 [ADRES]
$ bitcoin-cli getbalance
$ bitcoin-cli generatetoaddress 100 [ADRES]
$ bitcoin-cli getbalance
$ bitcoin-cli getnewaddress
[ADRES2]
$ bitcoin-cli sendtoaddress [ADRES2] 10

Aynı cli aracını kullanarak blockchain hakkında bilgi almak üzere şu komutu gönderelim.

$ bitcoin-cli getblockchaininfo

Sonuç alarak aşağıdaki çıktıyı alıyoruz;

{ 
"chain": "regtest",
"blocks": 101,
"headers": 101,
"bestblockhash": "01f98e2211091465c0fcecd6e3d622dcd4e5dcbf9ccd9dab3b9c1e46819d9155",
"difficulty": 4.656542373906925e-10,
"mediantime": 1563574014,
"verificationprogress": 1,
"initialblockdownload": false,
"chainwork": "00000000000000000000000000000000000000000000000000000000000000cc",
"size_on_disk": 30577,
"pruned": true,
"pruneheight": 0,
"automatic_pruning": true,
"prune_target_size": 576716800,
....
}

Artık http istekleri göndererek bitcoin blockchain’i ile haberleşebiliriz. Örnek olarak aynı komutu curl olarak gönderelim;

$ curl --user myuser:SomeDecentp4ssw0rd  --data-binary '{"jsonrpc":"1.0","id":"curltext","method":"getblockchaininfo","params":[]}' -H 'content-type:text/plain;' http://127.0.0.1:18443/

VS Code eklentisi REST Clientı ile aşağıdaki gibi istek gönderebiliriz.

POST http://127.0.0.1:18443 HTTP/1.1
content-type: text/plain
authorization: Basic myuser SomeDecentp4ssw0rd
{"jsonrpc":"1.0","id":"curltext","method":"getblockchaininfo","params":[]}

Aynı isteği Postman’den gönderdiğimizde de aşağıdaki çıktıyı alırız.

Artık herhangi bir dilde yazılmış programdan http istekleri yaparak blockchain ile haberleşebiliriz. Veya düz http istekleri yapmak yerine halihazırda geliştirilmiş kütüphaneleri kullanabiliriz. Aşağıdaki görselde bazı bitcoin kütüphanelerini görebilirsiniz.

https://github.com/igorbarinov/awesome-bitcoin#net-libraries

Örneğin NBitcoin kütüphanesi kullanarak C# ile rpc istekleri yapmak istersek;

http://localhost:5000/api/btcrpc/block?count=2

--

--