Closed4

素人がブロックチェーンに developer としてふわっと入門する記録

このスクラップの目的

素人がブロックチェーン(特に Bitcoin, Ethereum)に入門する記録です。気の済むまで勉強するだけなんですが、目標の感覚としては以下をすべて達成することです。

  • フルノードを動かせる。
  • やろうと思えばマイニング畑を構築できる。
  • Dapp を作れるようになる
  • Bitcoin / Ethereum どちらかのノードとして振る舞うプログラムをスクラッチで実装する。

インストールする前のお勉強

理論から入ろうとする派なのでまずはお勉強した。

色々読んだが、元の WhitePaper の他に質の良い情報だったのは意外に Youtube だった。

英語圏の技術系動画は本当にレベル高い。

勉強した気分は得られたが、じゃあ手を動かせるかと言うと何もできないので、インストールしていじっていく

勉強のための良い情報源があれば、もしよければ教えていただきたいです。
一応手元に講談社の「ブロックチェーン・プログラミング」(山崎, 安土, 田中) があり、これをベースに最初は勉強していこうと考えています。

bitcoin-core をソースからビルドする

自宅のPCは Ubuntu 20 なので snap が利用できるのだが、後々いじりにくくなりそうなのでソースからビルドする。
長時間のネットサーフィンを経て公式が一通り用意してくれていることがわかった。

プログラムの構成

こちらから呼び出すプログラムは bitcoind, bitcoin-cli の2つ。
メインは bitcoind で、これにアクセスするユーティリティとして bitcoin-cli がある。

ソースを落としてインストールの準備をする

クローンして準備

# 適当に workspace dir をつくってそこに入ってから
git clone https://github.com/bitcoin/bitcoin.git

cd bitcoin/

# Latest Release を確認してそのブランチに切り替える
git checkout <latest hash>
# 確認
git branch
```bash
### ビルドの下準備

とりあえずまず
```bash
./autogen.sh

で「必要だよ」と言われているツールを何も考えず全部ぶっこむ。

sudo apt install build-essential libtool autotools-dev automake pkg-config bsdmainutils
sudo apt-get install libevent-dev libboost-dev libboost-system-dev libboost-filesystem-dev libboost-test-dev
sudo apt install libsqlite3-dev
sudo apt install libminiupnpc-dev libnatpmp-dev
sudo apt install systemtap-sdt-dev

近頃のUbuntu はすでに BerkeleyDB5.1 だか 5.3 に切り替えていて標準でインストールされていない。bitcoin-core は4.8 を要求している。
が、これも(bitcoin)公式がインストール用の .sh を用意してくれている。

./contrib/install_db4.sh `pwd`

満を持して configureする。 GUI は必要ないのでそうする。

./configure --without-gui 

ビルドしてインストール

make # [-s スピード] [-j N 並列に動くジョブの数を指定できる]

結構時間かかった。

# お好みで
make install

これでもう bitcoind は起動できるはずだけど、いろいろ設定してから起動したい。
特に、testnet, mainnet (開発用のネットワークと、本物のビットコインのネットワーク)のデータ展開先なんかも分けておきたい。

bitcoind 用の config を設定して、test/main net をそれぞれ分ける

bitcoind は起動するとまず ~/.bitcoin/bitcoin.config を読みに行って、オプションを読んでくれるらしい。
あとで bash の alias にセットするのでどこでもいいのだが、標準に則ってこの場所に config を作って、同じ場所にデータが展開されるようにする。

全部のデータが入るディレクトリを作る

cd ~
mkdir .bitcoin

cd .bitcoin/

まずテストネットの設定を書く

~/.bitcoin/ 直下に .testnet3.config を作成して、以下のように書く。

# 現行のテストネットは version3 らしい?
testnet=3

# データの展開先を指定する。 ~ とかは上手く分かってくれないので絶対パスでかく
datadir=/home/hitoshi/.bitcoin/testnet/

# server としての機能はいつも使うと思うので
server=1
rest=1

# これがないと Credential がない!と怒られた。無きゃいけないのだろうか
rpcuser=test
rpcpassword=test

# とりあえず全部許可。おいおい勉強していく
rpcallowip=0.0.0.0/0

# 貧乏なので550MiBでぷるーんします。
# ぷるーんとは最新のデータだけ持つよ、という設定
# 全データを持とうとすると今は700GiBくらいあるらしい。
prune=550

で datadir を設定したので、その場所も用意してあげる。

mkdir testnet

bash alias の登録

# conf で、読み取るファイルを指定できる。これも何故か絶対パスじゃないと読み取ってくれない
alias bitcoind-test='bitcoind -conf=/home/hitoshi/.bitcoin/.testnet3.conf -daemon'
source .bashrc

これで動くはず

テスト

~~~~~: ~~~~$ bitcoind-test
Bitcoin Core starting

bitcoin-cli から何か叩いてみる

bitcoin-cli -testnet -rpcuser=test -rpcpassword=test getblockchaininfo

ごちゃごちゃした JSON が返ってきたら成功

{
  "chain": "test",
  "blocks": 2024816,
  "headers": 2065374,
  "bestblockhash": "000000000000ace85964639d6ca7b01e03930a4ebd9ae6767cc36456c5fb54d5",
  "difficulty": 65536,
  "mediantime": 1625740857,
  "verificationprogress": 0.9926471735387098,
  "initialblockdownload": true,
  "chainwork": "00000000000000000000000000000000000000000000051811ccd27607f031c7",
  "size_on_disk": 544595163,
  "pruned": true,
  "pruneheight": 1907118,
  "automatic_pruning": true,
  "prune_target_size": 576716800,
  "softforks": {
    "bip34": {...},
    "bip66": {...},
    "bip65": {...},
    "csv": {...},
    "segwit": {...},
    "taproot": {...},
  "warnings": ""
}

Mainnet も同様に設定する

.mainnet.conf
# testnet=3
# mainnet=1 は書かなくても良くなったらしい?

datadir=/home/hitoshi/.bitcoin/mainnet/

server=1
rest=1

rpcuser=****
rpcpassword=****

rpcallowip=0.0.0.0/0

prune=2000
# ~/.bitcoin/ 直下で
mkdir mainnet

alias の登録

alias bitcoind-main='bitcoind -conf=/home/hitoshi/.bitcoin/.mainnet.conf -daemon'

テスト

~~~~~: ~~~~$ bitcoind-main
Bitcoin Core starting
bitcoin-cli -rpcuser=**** -rpcpassword=**** getblockchaininfo
{
  "chain": "main",
  "blocks": 0,
  "headers": 59999,
  "bestblockhash": "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",
  "difficulty": 1,
  "mediantime": 1231006505,
  "verificationprogress": 1.49002701706867e-09,
  "initialblockdownload": true,
  "chainwork": "0000000000000000000000000000000000000000000000000000000100010001",
  "size_on_disk": 293,
  "pruned": true,
  "pruneheight": 0,
  "automatic_pruning": true,
  "prune_target_size": 2097152000,
  "softforks": {...}
}

成功

疲れた。。

このスクラップは5ヶ月前にクローズされました
ログインするとコメントできます