BTCD学习(比特币go语言版本)

作为一个区块链从业者,学习比特币源码并没有强目的性而是一种情怀,因此阅读、搭建了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流程管理原理比较简单,但想要阐述清楚需要做图,后续有时间跟进。



猜你喜欢

转载自blog.csdn.net/xjmtxwd24/article/details/79359078