もういろんな人がやっているかもしれませんが、goでブロックチェーンを実装してみました。
レポジトリはこちらです。
本ネタはこちらでpythonで実装していたものをgoに移植してみた感じになります。
普通のチュートリアルと違うところ
- httpサーバーにして、インタラクティブにしてみました。
- ノードを複数立ち上げて、コンセンサスを取る処理も実装しています。
- 一応テストコードを部分的に書いています。(timeのところが怪しいままになっていますが)
コンセンサスを取るところまでのシミュレーション
readmeにも書かれていますが、シミュレーションをしてみます。
複数ノード立ち上げてみます。
$ go run main.go :8080
別セッションで:
$ go run main.go :8081
8080のほうに8081のノードを登録します。
$ curl localhost:8080/nodes/register -d \
'{"Nodes": "localhost:8081"}'
New nodes have been added. Total nodes: map[localhost:8081:{}]
8081をわざと長くしてみます。
$ curl localhost:8081/mine
New block forged, block index 2, transactions [0xc00011c840] proof 35293, previousHash 2aa689b29c7e3bef87216b319de7a09aa5916da4f47586e46d4444c3e58c6583
これで8081のほうのチェーンは長さ2、8080はチェーンの長さが1のため、8081が正とされます。
8080はいやでも8081に従わなければいけません。
これは以下のAPIを叩くことでわかります。
$ curl localhost:8080/nodes/resolve
chain was replaced, [0xc00007c980 0xc00007c9c0]
最後に
ブロックチェーンとgo両方について理解する良い機会になりました!
ノード同士のコンセンサスは実装することでさらに理解が深まりました。