前几年一直做区块链的项目, 最近一段时间有空闲时间就自己实现了一下 bitcoin 的功能.
代码在 gitee 上, github 因为网络原因更新会延迟.
架构
- 基于
spring-boot
开发, 使用了spring-boot-starter-webflux
(因为需要实现 http 的bitcoin-rpc
接口) - 网络使用
netty
框架, 区块链的索引使用leveldb
的java实现 - 钱包使用
H2
的数据库 - 签名使用
bouncycastle
第三方实现 (JDK secp256k1 实现有BUG) - RPC 接口使用作者之前的实现
rpc-bitcoin
功能列表
- 基于 netty 实现了 bitcoin 的网络协议
com.github.microwww.bitcoin.net
- 区块的下载和存储
com.github.microwww.bitcoin.store.PeerChannelClientHandler
/DiskBlock
, 区块文件格式跟bitcoin-core的完全相同/blocks/blk?????.dat
- 脚本
com.github.microwww.bitcoin.script
实现了少部分常用功能函数, 主要为交易校验使用 - 钱包
com.github.microwww.bitcoin.wallet
使用 H2 的数据库, 钱包地址每次生成是随机的, 跟bitcoin-core 不同 - 交易模版
com.github.microwww.bitcoin.script.PubKeyScript
, - 交易签名的校验
com.github.microwww.bitcoin.chain.sign
- UTXO 交易查询(暂未实现)
- 本地交易的创建(暂未实现)
- 缓存交易
com.github.microwww.bitcoin.store.TxPool
- 挖矿
com.github.microwww.bitcoin.chain.GenChainBlock
, 性能不好, 只为测试使用 - RPC 接口基本没有实现
com.github.microwww.bitcoin.rpc
代码说明
- Bitcoin 启动入口
com.github.microwww.bitcoin.provider.BitcoinStarter
- Server 监听
...provider.ServerStarter
默认监听8333
/18333
/18444
, netty 监听PeerChannelServerHandler
- Peer 的入口
...provider.PeerEventListener
, 配置来源自 BitcoinStarter, netty 网络解析PeerChannelClientHandler
- 区块链的校验:
PeerChannelClientProtocol.tryBlock
方法 - 交易的校验 : 在
tryBlock
方法的chain.getTransactionStore().verifyTransactions(cb);
(完)
网友评论