比特币相关机制与原理

什么是区块链? #

一个分布式账本

区块链网络的核心是一个分布式账本,记录网络上发生的所有交易。

区块链账本通常被描述为 去中心化的 ,因为它会被复制到许多网络参与者中,每个参与者都在 协作 维护账本。

除了分散和协作之外,信息仅能以附加的方式记录到区块链上,并使用加密技术保证一旦将交易添加到账本就无法修改。这种“不可修改”的属性简化了信息的溯源,因为参与者可以确定信息在记录后没有改变过。这就是为什么区块链有时被描述为 证明系统

什么是去中心化? #

去中心化就是在一个分布有众多节点的系统中,每个节点都具有高度自治的特征。节点之间可以自由连接,形成新的连接单元。任何一个节点都有可能成为阶段性的中心。

优势

  • 容错性能力强
  • 不易被攻击
  • 数据无法篡改
对等网络 #

也称P2P网络,位于网络中的每一个节点都彼此对等,各个节点共同提供网络服务。区块链网络基于国际互联网的P2P网络架构,由对等节点Peer构成,每个节点以扁平的拓扑结构互相连通,不存在任何服务端、中心化服务,以及层级结构,而且必须遵守相同的约定(P2P协议)。

交易池 #

张三验证交易有效后,将交易写入自己的草稿本。这个草稿本也称交易池,存放每个节点收到的有效交易。每个节点的交易池中都有很多交易,可能每个人的交易池不一样,比如并非每一条交易都传递到每个人手中。

挖矿 #

解答数学题的过程叫挖矿,谁解出答案,告知大家,其他人就停止答题,本轮记账权的获胜者已产生。每个人草稿上上的内容是不一样的。谁有记账权,谁将自己草稿本上的内容写入账本。

创币交易 #

为了鼓励大家答题,获胜者获得5元钱,以交易的形式写入账本。实现货币总量的增长,比特币中“获胜矿工”获得的奖励除了创币金额外,还包括交易费。同时,比特币的创币金额是衰减的。

工作量证明 #

如果把挖矿当作一份工作,解题答案也被称为工作量证明。

矿工获得记账权后,翻开自己的账本,到最新页,将奖励作为第一条交易,草稿上的逐个抄入,每次最多只能写满一页,多余的舍弃,少的留白。多余的交易,不算成功,由发起者再度创建,写入纸条继续在大厅传递。交易写入账本后,在大厅黑白上写明。其他人开始验证,验证结束后写人自己的账本。

共识与共识算法 #

所有节点验证成功后记入自己的账本,保证账本数据的一致性,即节点达成了共识。共识通过村民验证解题答案,即工作量证明而达成的。采用工作量证明(POW)来达成共识也被称为工作量证明共识算法或共识机制。

确认 #

交易写入区块链就能得到确认,但由于共识算法自身的原因会导致偶然事件的发生,可能会出现区块链数据在接下来几个区块内数据回滚的情况,比如比特币的偶然分叉。比特币交易的永久生效需要在当前区块上继续添加6个区块。

诚实节点和恶意节点 #

遵守规则的节点和不遵守规则的节点

区块链分叉 #

恶意节点创建无效交易,使得网络中出现节点数据不一致的情形,称为区块链分叉。这种分叉是短暂的,新区块会替换掉旧区块,而且,无效区块会导致记账节点失去奖励,得不偿失。

  • 软分叉

    当系统中出现了新版本的软件(或协议),而旧软件能接受新软件的区块,新老双方始终都工作在同一条链上,这称为软分叉。

  • 硬分叉

    当系统中出现了新版本的软件(或协议),并且和前版本软件不能兼容,老软件节点无法接受新软件节点挖出的全部或部分区块(认为不合法),导致同时出现两条链。尽管新节点算力较大,比如99%的算力为新节点,1%的老节点依然会维护着不同的一条链,因为新节点产生的区块老节点实在无法接受(尽管它知道网络上99%的节点都接受了),这称为硬分叉。

智能合约 #

为了支持以同样的方式更新信息,并实现一整套账本功能(交易,查询等),区块链使用 智能合约 来提供对账本的受控访问。

智能合约不仅是在网络中封装和简化信息的关键机制,它还可以被编写成自动执行参与者的特定交易的合约。

共识 #

保持账本在整个网络中同步的过程称为 共识 。该过程确保账本仅在交易被相应参与者批准时更新,并且当账本更新时,它们以相同的顺序更新相同的交易。

比特币 #

简介 #

比特币(Bitcoin)的概念最初由中本聪在2008年11月1日提出,并于2009年1月3日正式诞生。

根据中本聪的思路设计发布的开源软件以及建构其上的P2P网络。比特币是一种P2P形式的虚拟的加密数字货币。点对点的传输意味着一个去中心化的支付系统。

与所有的货币不同,比特币不依靠特定货币机构发行,它依据特定算法,通过大量的计算产生,比特币经济使用整个P2P网络中众多节点构成的分布式数据库来确认并记录所有的交易行为,并使用密码学的设计来确保货币流通各个环节安全性。P2P的去中心化特性与算法本身可以确保无法通过大量制造比特币来人为操控币值。基于密码学的设计可以使比特币只能被真实的拥有者转移或支付。这同样确保了货币所有权与流通交易的匿名性。比特币与其他虚拟货币最大的不同,是其总数量非常有限,具有的稀缺性。

区块结构 #

父区块头哈希值:前一区块的哈希值,使用SHA256(SHA256(父区块头))计算。占32字节 版本:区块版本号,表示本区块遵守的验证规则。占4字节 时间戳:该区块产生的近似时间,精确到秒的UNIX时间戳,必须严格大于前11个区块时间的中值,同时全节点也会拒绝那些超出自己2个小时时间戳的区块。占4字节 难度:该区块工作量证明算法的难度目标,已经使用特定算法编码。占4字节 随机数(Nonce):为了找到满足难度目标所设定的随机数,为了解决32位随机数在算力飞升的情况下不够用的问题,规定时间戳和coinbase交易信息均可更改,以此扩展nonce的位数。占4字节 Merkle根:该区块中交易的Merkle树根的哈希值,同样采用SHA256(SHA256())计算。占32字节

如此,细心的同学会发现,区块头总共占了80字节。

区块体除了筹币交易记录(由一棵Merkle二叉树组成)外,还有一个交易计数。

默克尔根 #

默克尔树是一种哈希二叉树,它是一种用作快速归纳和校验大规模数据完整性的数据结构。这种二叉树包含加密哈希值,术语“树”在计算机学科中常被用来描述一种具有分支的数据结构。

在比特币网络中,默克尔树被用来归纳一个区块中的所有交易,同时生成整个交易集合的数字指纹,且提供了一种校验区块是否存在某交易的高效途径。

生成一棵完整的默克尔树需要递归地对哈希节点对进行哈希,并将新生成的哈希节点插入到默克尔树中,直到只剩一个哈希节点,该节点就是默克尔树的根。

说人话,默克尔树可以理解为一颗倒立的树,这棵树每个树杈只能分两个树枝出来,最终每个最小树枝上都会挂两片叶子。

这里的每片叶子就是一笔交易记录,每个树杈的分叉点就是一个哈希值,每个哈希值都是根据树杈分出的两个树枝的分叉点或者叶子的哈希值计算出来的。

这些这些分叉节点的哈希值向上一级分叉点汇聚,再进行哈希计算生成一个哈希值。以此类推,最终汇聚到树根上,这个树根计算出来的哈希值就是根哈希值。通过这种结构能够快速对其中的某笔交易进行定位。

默克尔树的特点是:底层数据的任何变动,都会传递到其父亲节点,一直到树根

区块数据(交易) #

交易池 #

又叫内存池,是用来存储待确认交易的地方。每个比特币挖矿节点均有自己独立的交易池,因交易池体积,最低交易费比例限制等不同,各节点的交易池也不相同。矿工(矿池)在构造预备区块时,需要从交易池中选择要打包的交易。由于交易池经常被调用,它的数据被存放在节点服务器的RAM中,这就意味着交易池的体积不会太大。

挖矿节点 #

在比特币网络中,参与记录和验证比特币交易和区块的是一个个保存比特币数据的节点。其中有一部分节点,不仅参与记录和验证的工作,还参与比特币新区块的创建工作,他们构造新区块,并通过PoW工作量证明竞争记账权,进而获得创建新区块的权限。

奖励 #

又叫创币交易。比特币协议规定,每产生一个新的比特币区块,比特币网络就会产生N个比特币,作为维护比特币网络的奖励支付给创建这个区块的矿工。

交易过程 #

1.产生交易(待确认的交易会先进入交易池中)

此时的交易信息是待确认的交易,它包含交易输入信息(未使用的UTXO和正确私钥签名)和交易输出信息(锁定新的钱包地址的待确认UTXO)。

2.交易传播

待确认交易在经过验证后,由交易发起方向比特币网络广播,比特币网络中的节点,均可验证和收录广播的信息。其中,挖矿节点会在收到广播后,验证待确认交易信息,验证通过后,挖矿节点会将待确认交易加入到自己的交易池中。

3.创建区块

挖矿节点从交易池中选择交易,构造预备区块。当挖矿节点要构造预备区块,准备生成新区块时,会按照优先级排序,从交易池中取待确认交易。预备区块通常会预留一定空间给高优先级的交易,剩下的空间会按照交易费比例(Sat/B)由高到低顺序一直把区块加满或者把交易池的交易用光。但比特币区块中不仅仅包含从交易池中取的待确认交易。

4.矿工挖矿

挖矿节点构建好预备区块后,就会将区块头信息下发给矿工,矿工通过不断调整区块头中随机数来变更预备区块的哈希值,当预备区块的哈希值低于比特币网络当前目标哈希值时,这个区块就是一个合法新区块。

5.区块验证

挖矿节点会及时地向比特币网络广播新区块,比特币网络中其他比特币节点在接到广播信息后,对新区块进行验证。

6.区块入链

验证通过后,将新区块加入本地。

比特币相关问答 #

比特币里的交易是怎么存的?介绍Merkle Tree的性质、优点,为什么用Merkle Tree存?(实现SPV、Merkle Proof) #

默克尔树是一种哈希二叉树,它是一种用作快速归纳和校验大规模数据完整性的数据结构。这种二叉树包含加密哈希值,术语“树”在计算机学科中常被用来描述一种具有分支的数据结构。

在比特币网络中,默克尔树被用来归纳一个区块中的所有交易,同时生成整个交易集合的数字指纹,且提供了一种校验区块是否存在某交易的高效途径。

生成一棵完整的默克尔树需要递归地对哈希节点对进行哈希,并将新生成的哈希节点插入到默克尔树中,直到只剩一个哈希节点,该节点就是默克尔树的根。

这里的每片叶子就是一笔交易记录,每个树杈的分叉点就是一个哈希值,每个哈希值都是根据树杈分出的两个树枝的分叉点或者叶子的哈希值计算出来的。

这些这些分叉节点的哈希值向上一级分叉点汇聚,再进行哈希计算生成一个哈希值。以此类推,最终汇聚到树根上,这个树根计算出来的哈希值就是根哈希值。通过这种结构能够快速对其中的某笔交易进行定位。

默克尔树的特点是:底层数据的任何变动,都会传递到其父亲节点,一直到树根

一旦获得了树根,就可以从其他从不可信的源获取Merkle tree。通过可信的树根来检查接受到的Merkle Tree。如果Merkle Tree是损坏的或者虚假的,就从其他源获得另一个Merkle Tree,直到获得一个与可信树根匹配的Merkle Tree。

介绍比特币的UTXO #

账本中的钱有两种形式,一种是已经消费过的,被盖了红章,一种是未消费过的。如果将指向某人的所有未消费交易输出累加起来,总和就是这个人的账户余额。

未消费交易输出(UTXO),UTXO是不可分割的,它只有两种状态,未消费和已消费,这也是其能溯源的原因。基于这种数据结构的模型也成UTXO模型。

比特币查询余额只能从头开始遍历整条链吗,有没有高效方法? #

比特币系统目前建立了UTXOSet缓存来持续更新、维护所有的UTXO,从而避免每次都需要从头开始遍历交易历史。

比特币地址是怎么生成的? #

(助记词 <-> seed -> 私钥 -> 公钥 -> PubKeyHash <-> address, 其中<->表可双向转换,->表单向转换,最后的PubKeyHash转换为address的时候用的是base58编码,base58编码的原理即辗转相除法)

第一步,随机选取一个32字节的数,大小介于1~0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD2 5E8C D036 4141之间,作为私钥

18e14a7b6a307f426a94f8114701e7c8e774e7f9a47e2c2035db29a206321725

第二步,使用椭圆曲线加密算法(ECDSA-SECP256k1)计算私钥所对应的非压缩公钥(共65字节,1字节0x04,32字节为x坐标,32字节为y坐标)。

0450863AD64A87AE8A2FE83C1AF1A8403CB53F53E486D8511DAD8A04887E5B23522CD470243453A299FA9E77237716103ABC11A1DF38855ED6F2EE187E9C582BA6

第三步,计算公钥的SHA-256哈希值

600FFE422B4E00731A59557A5CCA46CC183944191006324A447BDB2D98D4B408

第四步,计算上一步哈希值的RIPEMD-160哈希值

010966776006953D5567439E5E39F86A0D273BEE

第五步,在上一步结果之间加入地址版本号(如比特币主网版本号"0x00")

00010966776006953D5567439E5E39F86A0D273BEE

第六步,计算上一步结果的SHA-256哈希值

445C7A8007A93D8733188288BB320A8FE2DEBD2AE1B47F0F50BC10BAE845C094

第七步,再次计算上一步结果的SHA-256哈希值

D61967F63C7DD183914A4AE452C9F6AD5D462CE3D277798075B107615C1A8A30

第八步,取上一步结果的前4个字节(8位十六进制数)D61967F6,把这4个字节加在第五步结果的后面,作为校验(这就是比特币地址的16进制形态)

00010966776006953D5567439E5E39F86A0D273BEED61967F6

第九步,用base58表示法变换一下地址(这就是最常见的比特币地址形态)

16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM

#