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…

bitcoin源码分析 – 概览

从程序上看,比特币程序采用一个进程多个线程的结构,既是服务器,又是客户端。 如没有特殊说明,本系列以最新源码为准进行分析。 主要模块: 初始化 区块 交易 网络 挖矿 钱包 RPC GUI 主要依赖: berkeley-db boost level db libevent miniupnpc openssl protobuf qrencode qt zmq 主要入口: 文件 函数 bitcoind.cpp main AppInit AppInitMain bitcoin-cli.cpp main AppInitRPC CommandLineRPC CallRPC bitcoin-tx.cpp main AppInitRawTx CommandLineRawTx MutateTx OutputTx 主要线程: 线程 作用 主线程 创建其它线程,等待interrupt ScriptCheck 脚本检查 scheduler 执行一般任务例如定时任务 HTTP Server 提供RPC REST服务接口 import…

基于java nio的server设计

最近由于业务需要,写了一个 java server用来与我们的游戏服务器实现交互。 server只实现了最基本的功能: 维护多个长连接,发送与接收消息;连接建立及断开(主动与被动)。 在实现的过程中,最有意思的是java nio里的buffer,但我认为这是一个失败的设计。 java nio buffer三个主要的属性,position, limit, capacity. 通常来讲,传统的ringbuffer都会有一个read index和write index, 但buffer nio将两者统一为postion,然后弄出了读写模式切换的概念。 当从buffer里取出数据,即buffer.getXXX或者channel.write(buffer), 当往buffer里放入数据,即buffer.putXX或者channel.read(buffer), 的前后,经常要考虑模式的切换,比如调用flip,这样的设计增加了复杂性,对库的使用者带来困难(笔者才疏学浅,一直疑惑他们为什么这么设计,求高人指教),这本质上是因为position属性既要当作readindex来使用,又要当作writeindex来使用。 另外一点就是由于postion的大小不能超过limit和capacity, 导致使用的过程中经常需要compact, 每次compact会导致额外的内存拷贝;传统的ringbuffer会在writeindex < readindex在的时候才可能涉及到额外内存的拷贝。 也难怪,netty里抛弃了这种设计。

CURLOPT_POSTFIELDSIZE Post

最近用libcurl向某商web服务器作登录校验踩了一坑。 事情的表象是这样的,在windows上没有问题,linux上投递过去的数据乱码。但是如果将curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data)中的data写死,即写成字符串常量,也是没有问题的。 开始以为一些参数和环境的问题,查了半天问题依旧,才怀疑到变量生存周期的问题,将data生命期拉长,就好了。