美文网首页
深入浅出比特币源码(1)

深入浅出比特币源码(1)

作者: 量子位 | 来源:发表于2018-10-06 13:55 被阅读0次

    在阅读一份代码量巨大的代码前,先了解它提供那些功能,解决什么问题,也就是理解它的“需求”,对理解代码的有如神助。

    比特币代码github上面有,可以自行下载,编译。在比特币代码目录的doc目录下有各种操作的编译方法build_xxx.md,编译出的程序有:

bitcoind: 比特币核心,全节点功能。在启动时可以通过添加-regtest 参数来启动本地测试网络,这样就不会去连比特币网络,免去下载大量数据。

bitcoin-cli:在命令行输入参数,通过rpc方式链接bitcoind,可以通过bitcoin-cli help查看各种rpc命令。

bitcoin-qt:在图形操作系统下会编译出来,包含bitcoind和bitcoin-cli的功能和图形界面。

    下面先介绍一些基本结构和概念。

UTXO模型

    思考题,如何设计一个去中心的货币系统?最基本功能是记录谁谁的余额和转账,最直观的想法是账号模型,一条记录是账号、密码、余额等信息。但比特币使用的是一种UTXO模型。UTXO的意思是Unspent Transaction Output(在比特币代码里Tx代表Transaction),字面意思是未花费输出。在代码transaction.h中可以找到class CTxOut关于输出的定义,它包含了 CAmount nValue和CScript scriptPubKey两个字段,分别表示数量和锁定脚本,谁拥有这个解锁这个脚本的正确签名,就表示谁拥有这个输出,通过构建一个transaction把它花费掉。为了方便理解,我们可以把一个UTXO理解为一个特殊的硬币,它有币额和锁定它的锁。想想如果我们有办法破解比特币的锁,是不是就可以拥有了所有的比特币,一夜暴富,哈哈,想想就兴奋。

Transaction

    关于transaction的简化类图,留下必要的字段。代码见transaction.h。

transaction类图

CTransaction是一个交易的基本结构,它包含输入输出两个字段。我们在创建一笔交易时,先要找出我们可以解锁的币,一个以上,然后再创建一个以上的输出。

CTxIn字段COutPoint prevout指向我们的未花费的输出(币)。COutPoint的uint256 hash指的是这个币来自那个交易的hash,uint32_t n是这个交易vout数组的index。这两个字段就可以表明我们这个输入是来自哪个交易的哪个输出。这里我们仔细想一下,交易的输入输出是串联起来,本次交易的输入是来自上一个(或多个)交易的输出,本次交易的输出可以作为下次交易的输入。CScript scriptSig就是解锁签名。大家(网络上的其他节点)可以通过这个脚本验证花费者拥有对应的私钥。

关于手续费,手续费是通过vout减去vin的差额来隐式表示,而不是显示写在vout里。

这是UTXO模型的好处,所有币都可以溯源。

可能有同学已经想到,一开始都没有交易,那何来输入呢。下面就介绍coinbase交易。

Coinbase交易

比特币是一个分布账簿,那就需要有人来挖矿,维护账簿数据。为了奖励矿工,矿工可以在块里的第一条交易写上coinbase交易,这个交易没有有效的输入,只有输出。输出值等于手续费加上块补贴GetBlockSubsidy。块补贴初始值50个比特币,然后每210000个块后减半(大约是4年)。

Block

前面介绍了transaction,交易的记录。为了把交易记录的到所有人承认,达成共识,那需要把交易写进区块里。block的数据结构图,代码见block.h

block的类图

block的数据分为CBlockHeader和CBlock,CBlock继承CBlockHeader。分成区块头、区块体两部分的好处是,可以先同步区块头,区块头数据小,一次可以发送2000个(static const unsigned int MAX_HEADERS_RESULTS = 2000;)。

hashPrevBlock指的是前一个块的hash,通过这个字段,block就能串成链,就成了blockchain。其中第一个块叫做创世块GenesisBlock,创世块是写在代码里面,有函数CreateGenesisBlock创建,它的hashPrevBlock是NullHash。

hashMerkleRoot默克尔树根,它是根据CBlock部分vtx交易两两hash后再两两hash,直到只剩一个时算到。通过merkle树把大量的交易信息摘要压缩成一个hash值。可以作为校验vtx的数据是否和这个区块头相匹配。后面再详细说。

nTime区块时间。

nBits难度目标值。

nNonce随机值,挖矿时可以修改该值使block的hash满足对应的工作量条件。

CTransactionRef是typedef std::shared_ptr<const CTransaction> CTransactionRef;

先这样,提几个问题,基于现在介绍的数据结构下比特币需要解决的问题有:

1、本地节点创建交易时,需要根据自己的私钥找到属于自己的币(输入),那需要一个管理模块来管理。

2、接收到其它节点的交易时,为了可以验证它的输入是否有效,是否被花费,解锁脚本是否正确,那可能需要个输出(币)的管理器。

我的比特币地址:1Nt5fMXqy5SFrFUAc3YQsFfeVEYb1hxeWK

相关文章

  • 比特币源码研读

    forest21000版 比特币源码研读之一比特币源码研读之二比特币源码研读之三比特币源码研读之四比特币源码研读之...

  • 开始研读比特币1

    1,进入比特币源码目录,先读读编译doc/build-unix.md,查看比特币源码如何编译,了解比特币的依赖库,...

  • 深入浅出比特币源码(1)

    在阅读一份代码量巨大的代码前,先了解它提供那些功能,解决什么问题,也就是理解它的“需求”,对理解代码的有如神助...

  • 比特币源码研读之一

    作者:区块链研习比特币源码研读班 菜菜子 一、源码下载 本文比特币源码下载地址为:https://github.c...

  • 比特币源码研读之十一

    比特币源码研读系列已经发表了十篇了,通过这十篇源码研读系列让我对比特币源码及比特币运行原理有了进一步的理解,也让我...

  • 比特币BTC源码分析(1):地址生成过程

    一、生成一个比特币钱地址 二、根据源码整理比特币地址生成过程 1、取得公钥PubKey 2、使用 RIPEMD16...

  • [Blockchain_Bitcoin] Bitcoin Cor

    Bitcoin Core是比特币的核心源码,可以在比特币官网下载解压,比特币官网还提供了非常值得学习的比特币原理介...

  • 深入浅出比特币源码(2)

    通过调试理解代码 bitcoin-msvc版本可以在https://github.com/kobake/bitco...

  • 比特币源码研读之一

    比特币源码研读之一——区块链研习社 《比特币源码研读班》 一看文件夹结构 和 github编译依赖,分析的依赖库 ...

  • 比特币源码分析——共识模块

    title: 比特币源码分析——共识模块date: 2021-11-02 18:39:52 前言 分析比特币系统的...

网友评论

      本文标题:深入浅出比特币源码(1)

      本文链接:https://www.haomeiwen.com/subject/dkncaftx.html