ethereum源码分析 – 主流程

主要入口 cmd/geth/main.go/main() 线程与协程 dlv threads 查看,19个左右线程 dlv goroutines 查看,91个左右协程 主流程 (a) init: app.Before 主要是加载环境, 配置Cache,GC参数, 启动测量等 (b) main: app.Run -> app.Action -> geth() (1)创建Node (2)启动Node (3)Node等待结束 创建Node和启动Node为核心流程。 创建Node: (1)RegisterEthService: Light, Fast, Full模式 les.New(): 轻量级 eth.New(): db,blockchain,network,mine,rpc等创建或打开 (2)RegisterDashboardService 用来监视状态 (3)RegisterShhService Whisper, 用于DApps之间通信 (4)RegisterGraphQLService 用于explore (5)RegisterEthStatsService 用于状态统计 其中(2)-(5)根据配置可选。 启动Node: (1)启动创建Node时注册的服务 (2)创建RPC client (3)钱包及钱包事件 (4)启动挖矿 (c) app.After 关闭程序

bitcoin源码分析 – 交易验证

Transaction — Verify 交易验证是bitcoin的核心逻辑之一。交易验证包含两个问题: (1)验证的时机 (2)如何验证。 when and where 交易 区块 how AcceptToMemoryPoolWorker VerifyScript when and where 交易 当交易即将放如交易内存池中时, 将进行交易的验证。 调用时机: init(即程序启动时): LoadMempool 交易消息: NetMsgType::TX Wallet: (1)CommitTransaction (2)ReacceptWalletTransactions (3)ResendWalletTransactionsBefore UpdateMempoolForReorg AcceptToMemoryPool函数调用栈如下: AcceptToMemoryPool: AcceptToMemoryPoolWithTime AcceptToMemoryPoolWorker CheckInputs VerifyScript 其中AcceptToMemoryPoolWorker交易验证最核心的函数。 区块 (1)当ConnectBlock(新块产生或收到新块)时, 会对区块包含的所有交易进行验证。 init: CVerifyDB::VerifyDB(需checklevel4,默认为3,故默认不执行) TestBlockValidity(miner.cpp里BlockAssembler::CreateNewBlock调用) CChainState::ConnectTip 部分代码如下所示: CChainState::ConnectBlock: for (unsigned int i = 0; i < block.vtx.size();…

bitcoin源码分析 – 区块操作

Block — 操作 区块产生 区块网络消息 区块回滚 区块序列化 区块产生 ProcessNewBlock 区块网络消息 区块回滚 (1) init: ReplayBlocks (2) ActivateBestChain() ActivateBestChain() ActivateBestChainStep() chainActive.FindFork // Disconnect active blocks which are no longer in the best chain. DisconnectTip DisconnectBlock UndoReadFromDisk // Build list of new blocks to connect. ConnectTip ConnectBlock WriteUndoDataForBlock 孤立块保留多长时间? setBlockIndexCandidates 区块序列化

bitcoin源码分析 – 区块数据

Block — 数据 区块数据结构 区块与交易硬盘数据 区块与交易内存数据 区块数据结构 block.h block.cpp class CBlockHeader { public: // header int32_t nVersion; uint256 hashPrevBlock; uint256 hashMerkleRoot; uint32_t nTime; uint32_t nBits; uint32_t nNonce; nTime表示时间戳, 如果当前区块的时间戳大于前11个区块的平均时间戳, 并且小于网络调整时间(Network Adjust Time)+2小时, 则认为该时间戳是有效的; 网络调整时间是指与之连接的所有节点的平均时间。 Adjust Time相关源码可以参考: NetMsgType::VERSION AddTimeData相关部分。 nBits即target, 表示挖矿难度。 nNonce表示随机数, 用来产生hash。 class CBlock : public CBlockHeader { public:     // network and disk…

bitcoin源码分析 – 初始化

main函数主流程(bitcoind)     AppInit         AppInitBasicSetup             // ************************************ Step 1: setup注册网络及Signal         AppInitParameterInteraction             // ************************************ Step 2: parameter interactions 交互参数             // ************************************ Step 3: parameter-to-internal-flags 内部参数         AppInitSanityChecks…