bitcoin

// 启动

ui      CMyApp::OnInit()

ui          CMyApp::OnInit2()

db              CAddrDB::LoadAddresses()                        // 加载地址

db                  加载用户自定义的地址 CAddress from addr.txt

db                  再从 Berkeley DB addr.dat 中加载 CAddress

net                     AddAddress()                                // 添加地址

net                         拒绝不能路由的地址(内网地址被判定为不能路由) // CAddress::IsRoutable

net                         拒绝当前节点的地址           // 节点的地址 保存在 全局变量 addrLocalHost

net                         保存到 全局变量 mapAddresses 中, key 是 IP + Port

main            LoadBlockIndex                      // 加载区块

db                  CTxDB::LoadBlockIndex();    // key是"blockindex"+块hash

db                      从 BerkeleyDB 中加载 到 全局变量 mapBlockIndex 中

main                如果 mapBlockIndex 为 empty, 说明 刚刚启动主链(狭义的,局部的,极有可能会被推翻的), 发起一个交易(无效的),并打包这个创世区块

db              LoadWallet                      // 加载钱包

db                  CWalletDB::LoadWallet           // 以键值对方式存储,

                        name为地址本,       存入 mapAddressBook

                        tx:钱包交易CWalletTx,           存入 mapWallet

                        key:公钥私钥对,      存入 mapKeys, mapPubKeys

                        defaultkey:当前用户公私钥对信息           存入 keyUser

                        setting: 是否挖矿, 交易费用, 外部IP+端口

main            ReacceptWalletTransactions          // 将不在块中的钱包交易放入到对应的内存交易对象 mapTransactions中

                    CTxDB::ContainsTx       // key是"blockindex"+钱包交易hash

main                CWalletTx::AcceptWalletTransaction

                        CMerkleTx::AcceptTransaction

                            CTransaction::AcceptTransaction

                                存入 mapTransactions(用于保存未打包的交易)

ui          CMainFrame::show()

ui              CMainFrame::CMainFrame()

net         StartNode()

                创建 tcp 监听socket

                启动 ThreadIRCSeed                        // 聊天线程

                启动 ThreadSocketHandler              // socket监听线程

                启动 ThreadOpenConnections                // 连接其他node的线程

                启动 ThreadMessageHandler             // 消息处理线程

net         ThreadBitcoinMiner          // 启动挖矿线程






 

// 用于: 1:监听新进连接, 2: 处理vNode的 接收 和发送 缓冲区

ThreadSocketHandler

    LOOP{

        断开不使用的节点        

        accept 新连接(非阻塞), 存入 vNode

        循环处理所有节点的 recv buffer 和 send buffer

    }

    

 

// 用于不停的创建与其他节点的连接

ThreadOpenConnections

    LOOP{

        从 mapAddresses 加载所有地址, 排序分组

        随机创建连接 存入 vNode

    }

 

// 用于处理每一个节点上的消息, 与 ThreadSocketHandler 的分工是, 它处理消息逻辑, 会读取和写入 节点上的 recv buffer 和 send buffer, 而 由 ThreadSocketHandler 去完成 具体的 send 和 recv 函数调用

ThreadMessageHandler

    LOOP vNode{

        ProcessMessage 处理消息

            version: 消息的版本

            addr: 地址消息, 添加的本地地址簿中

            inv: 库存(交易, 区块, review, product)消息: CInv 中只有类型和内容hash, 该消息用于告知别人我有啥, 收到消息的node查看自己是否有, 如果没有就将请求放入 对方节点 的 mapAskFor 中, 在后续的 SendMessage 中处理

            getdata:    // 有人找我要Block数据, 直接掉对方 CNode::PushMessage("block") 等待发送

            getblocks:

            tx:             // 接受到了交易信息

            review:

            block:

            getaddr:

            checkorder:

            submitorder:

            reply:


 

        SendMessages 发送消息

            addr: 地址信息发送, 告诉别人我知道谁谁谁

            inventory:

            getdata: 遍历 节点 的 mapAskFor 发送 getdata 消息

 

    }

    

    

 

// 挖矿

ThreadBitcoinMiner

LOOP{

根据最高的Block(即上一个Block)计算出本次挖矿的难度值

新建一个BaseCoin交易

新建一个Block, append 刚刚的BaseCoin交易

收集最新的交易放入区块中

LOOP 本地交易池 mapTransactions

{

根据交易系列化大小计算fee

本次打包拒绝fee太低的交易

}

计算满足难度的hash值

处理Block ::ProcessBlock

}

 

// 自己挖到, 或接手到

// 处理Block

::ProcessBlock

判断重复

校验合法 CBlock::CheckBlock

判断高度, 发起缺失的block的请求 CNode::PushMessage("getblocks")

接受存储改Block CBlock::AcceptBlock

        RelayInventory          // 转播库存, 告知被人我有了这个 Block (消息中只有Block的hash)

            放入 每一个 vNode 的 vInventoryToSend, 等待 ThreadMessageHandler处理


 

递归处理依赖于此块的任何孤立块

 

// 转账, 注: 要求对方在线

CSendingDialog::StartTransfer()

判断余额

链接对方

向对方发送 checkorder 以询问对方是否接受交易并允许查看order内容

等待回复

CreateTransaction // 创建钱包交易

寻找自己的vOut

签名

CommitTransactionSpent // 提交交易

加入到钱包

标记 vOut 已经花掉了

CNode::PushRequest("submitorder") 确认一个order已经被提交

验证并接受交易, 存入 mapTransactions 中

 

ThreadRequestProductDetails



 

// 退出

ui      CMyApp::OnExit()

ui          ::Shutdown()

net             ::StopNode()

                    等待所有线程退出







 

// 打印 Block tree

db          CTxDB::LoadBlockIndex();

                从 db 中加载出 CBlockIndex, 组织成 <块哈希, CBlockIndex*> 存入全景变量 mapBlockIndex 中

main        PrintBlockTree();


 

// CBlockIndex 的 作用是 从本地的 blkxxxx.dat 文件中 索引出 CBlock 数据

    CBlock::ReadFromDisk

// CBlockIndex 是 存在 Berkeley DB 中的, 其数据文件 blkindex.dat

### Bitcoin Core 安装配置与最佳实践 #### 一、安装前准备 为了成功安装并配置 Bitcoin Core,在开始之前需确认操作系统已具备相应的开发工具包以及依赖库。对于Linux发行版而言,通常可以通过包管理器来获取这些前置条件;而在Windows环境下,则建议利用WSL(Windows Subsystem for Linux)来进行部署[^1]。 #### 二、下载与验证 访问官方站点 (https://bitcoincore.org/) 下载最新版本的比特币核心客户端。考虑到安全性因素,务必采用GPG签名文件校验所下载压缩包的真实性与完整性。此过程有助于防止潜在恶意篡改风险。 #### 三、初始化设置 解压后进入目录执行`./configure`命令完成初步设定工作。如果遇到权限不足的情况可以尝试加上sudo指令获得更高权限操作。之后运行 `make` 编译源码直至结束无误即可启动节点服务端程序 bitcoind 或者图形界面应用 bitcoin-qt。 ```bash $ ./autogen.sh && ./configure --disable-wallet CXXFLAGS="-O2" $ make ``` #### 四、配置参数调整 编辑 ~/.bitcoin/bitcoin.conf 文件加入如下几项重要选项以便优化性能表现: - server=1 启动API-RPC服务器支持远程调用; - daemon=1 背景模式持续监听网络连接请求; - txindex=1 构建完整的交易索引方便后续查询统计分析; - prune=<size> 设置区块数据修剪大小以节省磁盘空间占用(单位MB),当硬盘容量有限时尤为有用。 #### 五、同步区块链 首次开启将会自动从互联网上抓取全量历史记录直到当前时刻为止。这可能耗费较长时间视乎网速快慢而定。期间可借助 addnode 参数指定可信节点加速进程进展速度。 #### 六、日常维护事项 定期备份钱包文件 wallet.dat 和整个 .bitcoin 配置路径下的资料以防意外丢失造成资产损害。另外也要关注社区动态及时更新至稳定新版本修复漏洞缺陷提升稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值