Golang と Blockchain 技術の勉強に、こちら の記事を参考にして Bitcoin の SPV Wallet を Golang で実装してみました。
結構雑ですが、とりあえず以下のことができます。
- Bitcoin Address の生成
- UTXOをかき集めて残高を計算
- UTXOをかき集めて指定したBitcoin Addressに送金
実用には耐えませんが簡単なSPV Walletの一通りの機能は実装できたかなと思います
(そんなことなくてエラーハンドリングが雑だったりP2Pノードとしての役目を放棄してたり、取得するmerkleblockをハードコードした高さより高いblockのみ取得するようになってたりする)
参考
実装の際には主に @lotz氏のこちらの記事を参考に実装しました(ほとんど氏の実装をGolangに移植しただけw + 計算したUTXOを使って送り先と金額を指定するだけで送金できる機能)
こちらの記事では同様のWalletがHaskellで実装されており、解説がすごく丁寧で分かりやすいので、細かい解説が気になる方は是非読んでみてください!!
その他参考 🙏🙏
- Mastering Bitcoin | The Bitcoin Book - Programming the Open Blockchain
- bitcoin wiki
- GitHub - prettymuchbryce/hellobitcoin: A collection of simple programs which can generate bitcoin wallets, create and sign transactions, and send transactions over the bitcoin network.
- Developer Guide - Bitcoin
- Bitcoinウォレットを実装する - ビットコインの仕組み:Bitcoinを技術的に徹底解説!
- Go言語と暗号技術(AESからTLS) | SOTA
感想
Blockchain技術に興味を持ってMastering Bitcoinを読んだり簡易的なBlockchainもどきを実装してみて、全体像はなんとな~く分かってきたものの
- Merkle Tree でトランザクションを検証するために Merkle Path を取得するってあるけど、具体的にどういう形で送られてくるんだ!?
- スクリプトってどう表現されるんだ...
- 「署名する」ってあるけど具体的にはどうするんじゃ
などなど細かい疑問がたくさんありました。
しかし今回SPV Walletを実装してみて少なくともSPV Walletの実装についてはしっかり理解できました。SPV Walletの細かい挙動に興味のある人は是非氏の記事を読んで自分の好きな言語で実装してみると良さそう!