作为一个区块链从业者,学习比特币源码并没有强目的性而是一种情怀,因此阅读、搭建了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 ######因为国内很多工具类无法下载,需要 F-Q ,或者修改源
$ 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流程管理原理比较简单,但想要阐述清楚需要做图,后续有时间跟进。
|
请发表评论