Skip to main content
  1. Web3s/

比特币技术汇总

·3622 words·8 mins·

什么是比特币 #

比特币具有多重概念:

  1. 一种电子货币;
  2. 这种电子货币所依赖的整套系统;
  3. 比特币的整个生态;

这篇博客主要聊的是这套系统的技术实现。

区块链 #

区块链是比特币的一个基础设施。可以将区块链分成两部分——区块和链。

区块 #

从技术的角度看,区块链就是一个去中心化的数据库,而区块就是存储数据的地方

区块分为两部分:header和body——类似于http——header用于存储关键信息,body用于存储数据。

区块头字段

图来源:Understanding the Bitcoin Blockchain Header | by RJ Rybarczyk | FCAT Blockchain Incubator | Medium

Header中每个字段都十分重要,直接介绍字段的功能会很抽象,所以留在后面结合功能讲解。

Body #

区块链的数据存储使用了默克尔树,是一颗二叉哈希树。这棵树将区块中所有的交易信息进行了哈希,最终得到了一个32位的哈希值。这个哈希值就是区块内交易信息的标识——一旦某个交易信息被篡改,这个哈希值就一定会改变。

默克尔树 #

默克尔树(Merkle tree)又称为哈希树。从下往上看,叶子结点存储数据,叶子结点的父节点存储数据的哈希值,再上一层则将两个子节点的哈希值相加再进行哈希(如果子节点数量为奇数,则复制最后一个子节点数据创建为新节点以保证子节点数量为偶数),重复这个步骤直到获得根节点。

区块的头部会记录默克尔树根节点的哈希值。

Merkle Proof #

轻节点只会存储区块头而不存储交易数据,那么当轻节点发生了一笔交易后如何证明这笔交易已经上链了呢?

  1. 轻节点会向全节点请求交易验证,请求携带这个交易所在区块的默克尔树根节点哈希值和这笔交易的信息L2。

  2. 全节点在区块链中找到对应的区块以及其默克尔树,并将Hash1与Hash0-0的值交给轻节点。

  3. 轻节点根据L2和Hash0-1能够计算得到Hash0,在根据Hash0和Hash1计算得到根节点哈希值

  4. 判断计算得到的根节点哈希值与区块头部记录的根节点哈希值是否相同。

Merkle Proof实现了零知识证明:在这个过程中,全节点没有提供任何实际的交易数据,但是向轻节点证明了区块链存在这笔交易。

#

类似于链表,区块之间也是通过”指针“进行的链接,只不过这个指针是区块的哈希值

从创世区块开始,每个子区块都记录父区块的哈希值,通过这个哈希值比特币将所有的区块进行了链接,于是形成了区块链。

哈希的魅力 #

比特币系统中大量使用了哈希算法,比如用公钥生成比特币地址、工作量证明中的解题、默克尔树的构建、区块之间的”链“等等。

哈希算法具有以下几点优势:

  1. 输出长度稳定。比如经过SHA256,输入任意长度的字符串都能得到固定的输出长度——64位。这对用户友好——如果输出长度不固定,很多情况需要做特殊处理。
  2. 输出结果稳定。同样的输入,经过同一个哈希算法,得到的输出一定是相同的。
  3. 碰撞概率低。哈希不同的输入得到相同的输出的概率极低,基本不用考虑。因此,如果H(X)=H(Y),那么可以认为X=Y。
  4. 隐私友好。这体现在两方面,一个是对输入做任意的修改,就能够得到完全不同的输出,另一个是如果输入源足够大,由于碰撞概率低,也没办法通过暴力破解来根据输出得到输入

账户 #

在普通的账号系统中,使用账号+密码的方式来做账户的识别,并且用账号来跟踪余额变动。在比特币系统中使用了完全不同的方式。

账号 #

在比特币系统中,使用由椭圆加密生成的公私钥作为账号,使用哈希算法通过公钥生成比特币地址。

图片源自《精通区块链编程》

  • 私钥不能泄露,用于对交易进行签名。
  • 公钥可以泄露,用于验证这笔交易的签名。
  • 比特币地址需要告知他人,用于转账。

余额 #

比特币系统中不存在“余额”信息,只有转账记录。而通过转账记录(即“交易链”)就能够追踪到账户的余额

为了加快这个追踪过程,比特币系统中使用UTXO(unspent transaction output)来表示未花费的交易输出,每个全节点都维护了一个集合来保存当前状态下区块链中所有未花费的交易输出,我们称这个集合为UTXOs

每个钱包软件都会监听区块的变化,从而维护自己的秘钥可用的UTXO,因此用户能够直接从钱包软件上看到自己的余额而无需等待。

交易 #

交易内容 #

假设Alice想要向Bob转1一个BTC,那么首先Alice需要从区块链中获取交易信息,从而确定自己的余额充足!

经过确定,Mark和Jessica曾经各自转账0.6个BTC给Alice,因此Alice的余额充足。

转账时需要付“小费”给矿工,Alice将其设定为0.05BTC,不然矿工可能不会对这笔交易打包。

在比特币系统中,交易费不是手动设定的,而是自动计算出来的。交易费 = All(输入)- All(输出)。

因此在这个场景中,Alice需要指定两个输出,一个是给Bob的1BTC,另一个是给自己的0.15BTC。

现在的钱包软件已经帮我们实现了这个功能,我们只需要指定交易费而无需指定转给自己的交易。

那么此时就是将Mark和Jessica转给Alice的0.6*2个BTC,转给了Bob1个BTC,矿工0.05个BTC,转给自己的0.15个BTC。

当Alice确认好交易内容后,就会想比特币网络广播这笔交易。矿工会验证这笔交易,并通过工作量证明来竞争“记账权”。

矿工 #

矿工是一类节点的简称,这类节点需要汇总交易并打包成块写入区块链中。

奖励机制 #

显然没有矿工,区块链就不会“延长”。矿工维持着区块链系统的正常运行,并且矿工越多,整个比特币系统就越安全(假设作恶的节点是少数)。

因此奖励机制十分重要。

比特币系统存在两种奖励:创建新区块的奖励以及交易费。

交易费就是一个区块所有交易输入减去输出的总和;新块奖励会稍微复杂一些:初始奖励为50BTC,每210000个块减半(大概4年)

工作量证明 #

比特币系统使用工作量证明作为共识机制。简单来说,就是通过寻找一个随机数来与区块头的信息结合,并通过哈希算法获得一个哈希值,如果这个哈希值小于目的值,就可以将块打包写入区块链,经过其他矿工验证后就可以得到奖励。

这个证明过程可以简单的记为Hash(block header+nonce) < target

所谓的目的值就是一个不断调节的难度(以维持平均10分钟一个块),难度越大,哈希结果命中的概率就越大。

随着竞争的加剧,遍历完32位的nonce值也不一定能够得到这个目的值,因此还可以修改区块头中的time(可微调)和coinbase中的数据来加大输出范围。

交易池 #

矿工在进行工作量证明的同时,也会监听比特币网络中广播的交易以准备下个区块的竞争。

当矿工监听到一笔交易后,会先验证这笔交易是合法的,然后将这笔交易放入交易池中。

如果一笔交易的输入不存在,那么就说明该矿工没有收到这笔交易的前置交易,这时候这笔交易不能被写入区块中,因此需要将其放入孤儿池中,等待前置交易的到来。

与此相似,节点中也存在一个孤块池来保存未找到父块的区块。

如果矿工监听到当前正在竞争的块已被证明,那么就可以放弃当前块,并开启下个区块的竞争。

在竞争前,矿工会将交易池中已经被打包的交易(竞争成功的区块中的交易)去掉。

验证交易 #

区块链中如何证明一笔交易是合法的呢?也即如何证明Alice有这笔钱呢?

交易的输入是UTXO,UTXO中存在锁定脚本,锁定脚本中存在所属账户的公钥或者比特币地址。

在每个交易中都存在一个解锁脚本,解锁脚本中含有花这笔钱的账户(私钥)生成的签名。

验证程序会执行这两个脚本来验证Alice能否使用这个UTXO。

确认交易 #

交易往往是双向的,Alice向Bob转移1BTC以换取其他物品,以电脑为例。当Bob接收到Alice支付的1BTC后,Bob不应该将电脑立马交给Alice,而是应该等待半个小时到一个小时

这是因为最新的区块还存在被回滚的可能。比如Alice在另一笔交易中用同样的UTXO支付给自己一笔钱,这两笔交易同时出现在两个区块中,并且被不同的节点所验证。在后续的“站队”过程中,只会有一个区块会加入到区块链中,另一笔交易由于输入的UTXO已经无效而被丢弃。因此Bob存在损失这笔钱的可能性。而等待半个小时到一个小时,区块链中已经存在3~6个最新的区块,这时已经能保证这笔交易不会被回滚。

其他问题 #

节点启动时如何发现其他节点 #

比特币代码中硬编码了一些“种子地址”,如:

  • dnsseed.bitcoin.org

  • dnsseed.bluematt.me

  • dnsseed.bitcoin.sipa.be

  • seed.bitcoin.sipa.be

通过这些节点加入网络后可以再去获取其他节点作为自己的邻居节点。

为什么要保证10分钟一个区块 #

如果时间太短,会容易造成区块链不稳定。出块时间越短,分叉的可能性就越大,而分叉就代表着算力的拆分,一条链算力越小,越容易被攻击。

当然,出块时间也不应太长,否则会导致一个块太大且交易太慢。

为了维持平均10分钟一个区块,比特币系统规定每2016个区块(两周)调整一次难度,方式为根据过去2016个块的出块时间来调整挖矿难度。

相关资料 #

  1. Understanding the Bitcoin Blockchain Header | by RJ Rybarczyk | FCAT Blockchain Incubator | Medium
  2. How bitcoin transactions work | How Do Bitcoin and Crypto Work? | Get Started with Bitcoin.com
  3. What The Heck is UTXO. Peeking into the Bitcoin Transaction… | by Rajarshi Maitra | BitHyve | Medium
  4. 《精通区块链》
  5. 北京大学肖臻老师《区块链技术与应用》公开课
  6. Understanding the Bitcoin Blockchain Header | by RJ Rybarczyk | FCAT Blockchain Incubator | Medium