作为一个区块链从业者,学习比特币源码并没有强目的性而是一种情怀,因此阅读、搭建了BTCD,BTCD是比特币的go语言版本,但目前只支持全节点(QQ:529832517 简书:https://www.jianshu.com/u/ba1665546875)
一、安装
######下载地址:
https://github.com/btcsuite/btcd
###### 执行以下命令:
$ go get -u github.com/Masterminds/glide
$ git clone https://github.com/btcsuite/btcd $GOPATH/src/github.com/btcsuite/btcd
$ cd $GOPATH/src/github.com/btcsuite/btcd
######因为国内很多工具类无法下载,需要翻墙,或者修改源
$ rm -rf ~/.glide
$ mkdir -p ~/.glide
$ glide mirror set https://golang.org/x/mobile https://github.com/golang/mobile --vcs git
$ glide mirror set https://golang.org/x/crypto https://github.com/golang/crypto --vcs git
$ glide mirror set https://golang.org/x/net https://github.com/golang/net --vcs git
$ glide mirror set https://golang.org/x/tools https://github.com/golang/tools --vcs git
$ glide mirror set https://golang.org/x/text https://github.com/golang/text --vcs git
$ glide mirror set https://golang.org/x/image https://github.com/golang/image --vcs git
$ glide mirror set https://golang.org/x/sys https://github.com/golang/sys --vcs git
######安装依赖包
$ glide init
$ glide install
######编译工程
$ go install . ./cmd/...
二、结构图
三、地址管理
####1)调用位置
btcd server启动时调用
####2) 数据结构
AddrManager:
peersFile: 保存在文件中的连接节点信息
addrNew: map[桶树编号][地址map集合],未被确定可连接的集合
nNew:addrNew大小
addrTried: 连接成功集合
nTried:addrTried大小
addrIndex: addrNew 与 addrTried地址集合
KnowAddress
refs: 节点被连接次数
lastsuccess: 最后一次成功连接时间
lastattemp:最后一次连接时间
attemps: 连接次数
####3) 提供服务
定时将节点连接信息保存至文件
提供的API:
Good:
1. server通知地址管理哪个IP Addr为有效地址
2. 更新lastsuccess、lastattemp、attemps字段
3. 同时从addrNew中删除该IP地址
4. 该IP添加到addrTried桶树
GetAddress:
1.从addrTried提供有效IP
2.从addrNew提供IP
AddAddresses:
1.如果地址不存在,将地址添加到addrNew
2. 如果地址存在,更新地址连接属性
Connected:
1.更新地址属性信息
四、连接管理
####1)调用位置
btcd server启动时调用
####2) 数据结构
Listeners: listeners,
OnAccept: s.inboundPeerConnected,
RetryDuration: connectionRetryInterval,
TargetOutbound: uint32(targetOutbound),
Dial: btcdDial,
OnConnection: s.outboundPeerConnected,
GetNewAddress: newAddressFunc,
####3) 提供服务
开启监听handleConnected与handleDisconnected服务
提供的API:
NewConnReq:调用地址管理获取一个ip,并连接。如果连接成功,调用 handleConnected服务;如果连接失败,调用handleDisconnected服务。
Disconnect:调用handleDisconnected服务
Connect: 根据链接结果调用handleConnected或handleDisconnected服务。
当调用handleConnected时,服务调用OnConnection函数,开辟协程处理Peer服务。
####4) Peer服务
1. 启动Peer服务时,发送OnVersion信息,当接受到版本信息时,发送连接成功消息Good至地址管理
2.启动queueHandler,需要发送的报文需由queueHandler处理后发送至其他节点。
3.启动pingHandler, 心跳检测
4.启动inHandler, 接受其他节点发送的报文
5.启动outHandler, 发送报文
五、 交易管理
######数据结构
TxPool
lastUpdated: 最后一次更新内存池时间
pool 交易池
orphans : 孤立交易池
orphansByPrev:后向指针,指向子节点
部分Manager
rejectedTxns 拒绝的交易集合
requestedTxns
######流程
1. handleTxMsg 处理交易入口
2. 检测该交易Hash是否已经存在于交易池或者孤立池
3. 检查交易大小金额是否正确
4. 检查是否有双花
5. 检查交易输入是否有效、签名等
6. 策略过滤
7. 将交易封装加入到交易池,更新lastUpdate
8.如果输入不存在,则进入孤立交易处理流程
挖矿管理、PoW流程管理原理比较简单,但想要阐述清楚需要做图,后续有时间跟进。