当前位置: 首页 > news >正文

【BTC】比特币系统的具体实现

目录

一、比特币账本模式与 UTXO 数据结构

二、交易的输入、输出与交易费

三、比特币与其他账本模式对比

四、比特币区块信息与挖矿

五、交易合法性验证与脚本

六、比特币总量与稀缺性

七、比特币安全性分析

7.1 自私挖矿(Selfish Mining)


这节讲比特币系统的具体实现。

一、比特币账本模式与 UTXO 数据结构

比特币采用基于交易的账本模式,每个区块记录交易信息,包括转账交易铸币交易,但系统不直接记录账户余额,需通过交易记录推算全节点维护 UTXO(未花费交易输出)数据结构,它由未被花掉的交易输出组成,用于检测双花问题,确保交易合法性。一个交易可能有多个输出,部分输出被花费后会从 UTXO 中移除,而新产生的未花费输出则会加入。注意,UTXO的结构是全节点维护的,但是这个结构并没有存储在区块链上,只是每一个全节点都存储了一份UTXO账本表。

这部分内容老师详细讲解了比特币的账本模式以及 UTXO 数据结构,具体如下:

  1. 比特币的账本模式:比特币采用基于交易的账本模式(transaction base),每个区块中记录的是交易信息,包含转账交易铸币交易。但系统中并没有直接记录每个账户上有多少钱,例如想要知道 A 账户上的余额,就需要通过交易记录来推算。具体方式是查看该账户转入了多少比特币,以及其中哪些已经被花掉,哪些还未花费,从而得出当前的余额
  2. UTXO 数据结构的定义:比特币系统的全节点需要维护一个叫做 UTXO(Unspent Transaction Output)的数据结构,即还没有被花出去的交易的输出。因为交易的输出存在已被花掉和未被花掉两种状态,所有未被花掉的交易的输出所组成的集合就是 UTXO
  3. UTXO 数据结构的特点:一个交易可能产生多个输出。以 A 的转账交易为例,若 A 给 B 转了五个比特币,给 C 转了三个比特币,之后 B 把五个比特币花掉了,那么这部分输出就不在 UTXO 里面;而 C 收到的三个比特币还没花出去,所以这部分输出就在 UTXO 里面。也就是说,同一个交易的不同输出,有的可能在 UTXO 集合中,有的可能不在。每个 UTXO 元素要给出产生这个输出的交易的哈希值,以及该输出在这个交易里是第几个输出,通过这两个信息就可以定位到 UTXO 中的输出。

  1. UTXO 数据结构的作用:全节点维护 UTXO 数据结构的主要目的是为了检测 double spending(双花问题),即判断新发布的交易是否合法只有当想要花掉的比特币在 UTXO 集合里面时,该交易才是合法的;如果不在这个集合里面,说明想要花掉的比特币要么不存在,要么以前已经被花掉了。因此,全节点要在内存中维护 UTXO 这样一个数据结构,以便快速检测双花问题(避免同一笔资金被多次重复花费)
  2. UTXO 数据结构的动态变化:每个交易都会消耗掉一些 UTXO 中的输出,同时也会产生新的输出。例如 A 把五个比特币转给 B,B 又把这五个比特币转给了 D,此时 A 转给 B 的那个输出就不在 UTXO 里面了,但 B 转给 D 的这个新输出又会保存在 UTXO 中。随着交易的不断发布,UTXO 集合中的输出不断变化。如果某个人收到比特币转账后一直不花这笔钱,那么该信息就要永久地保存在 UTXO 中,比如有的人不想花或者把密钥丢了导致无法花掉比特币,这些对应的 UTXO 信息都会一直存在。目前,UTXO 集合虽在逐渐增大,但装在普通服务器的内存里还是没有问题的。

二、交易的输入、输出与交易费

每个交易可包含多个输入和输出,输入金额总和需等于输出金额总和。若输入金额略大于输出金额,差额作为交易费给予获得记账权的节点。交易费是比特币系统的第二个激励机制,虽然目前交易费金额较小,但随着出块奖励逐渐减半,未来可能成为矿工挖矿的主要动力。

这部分内容老师围绕比特币交易的输入、输出与交易费展开了详细讲解,具体如下:

  1. 交易的输入和输出数量及关系:每个比特币交易既可以有多个输入,也能够有多个输出。并且,所有输入的金额总和必须等于所有输出的金额总和。这是比特币交易的一个重要规则,确保了交易在金额上的平衡。比如在上一小节给出的例子中展示了有两个输出的情况,而输入同样也可以是多个,且这些多个输入不一定是来自于同一个地址。
  2. 多输入与多签名的关系:由于交易的多个输入可能来自不同地址,这就解释了为什么一个交易可能需要有多个签名。因为每个输入地址都需要提供对应的签名,以此来证明交易的合法性和对资金的支配权。
  3. 交易费的产生机制:在一些交易中,会出现 total input(总输入)略微大于 total output(总输出)的情况。例如 total input 可能是 1 个比特币,而 total output 可能是 0.99 个比特币,那么这中间 0.01 个比特币的差额就会作为交易费,支付给获得记账权并发布区块的那个节点

  1. 交易费的作用及现状:比特币系统设计了交易费这一激励机制,它可以被理解成是一种 “小费”。目前在比特币系统当中,交易费的金额普遍都比较小,像上述例子中 0.01 个比特币就算是比较大的交易费了,很多交易的交易费只有零点几个比特币,甚至还有一些简单的交易是没有交易费的。当前矿工去挖矿、争夺记账权,主要目的还是为了得到出块奖励(Block Reward,因为出块奖励相对较多,比如有 12.5 个比特币。不过出块奖励是逐渐减小的,每隔 21 万个区块要减半,比特币系统规定每个十分钟左右产生一个区块,所以大约每 4 年出块奖励减半一次。随着时间推移,很多年以后出块奖励可能变得很小,那时交易费就可能变成矿工收益的主要来源 。

三、比特币与其他账本模式对比

与基于账户的账本模式(如以太坊)不同,比特币基于交易的模式隐私保护性较好,但每个交易都需说明币的来源,因为系统没有账户余额的直接记录;而以太坊系统会显示记录每个账户的币数量,使用体验更接近日常银行账户查询。

这部分内容老师将比特币基于交易的账本模式与其他账本模式(以以太坊基于账户的模式为例)进行了详细对比,具体如下:

  1. 比特币的账本模式特点:比特币采用基于交易的账本模式。在这种模式下,系统并不直接显示记录每个账户上有多少币。若要知晓某个账户的余额,例如账户 A,需依据交易记录进行推算,即统计该账户转入的比特币数量,以及其中已花费和未花费的部分,进而确定当前余额。并且,比特币中的转账交易,必须明确说明币的来源。因为系统没有账户概念,不存在记录账户总币数的地方,所以每笔交易都得详细阐述所使用的币是来自之前哪一个交易的哪个输出。
  2. 以太坊的账本模式特点:与之对应的是基于账户的模式,以太坊采用的就是这种模式。在该模式中,系统会明确显示记录每个账户上拥有多少个币。这种模式与人们日常的体验更为接近,就如同想要了解银行账户的余额,登录银行网站即可查询到。
  3. 两种模式的优缺点对比:比特币基于交易的模式,其优势在于隐私保护性相对较好。但它也存在一定代价,如前文所述,每笔转账交易都要详细说明币的来源,操作相对繁琐。而以太坊基于账户的模式,不存在需要显示说明币来源的问题,使用起来更为便捷,但在隐私保护方面可能相对比特币的模式要弱一些。

四、比特币区块信息与挖矿

比特币区块包含总输出、交易费、出块奖励等信息。挖矿时需不断调整随机数(nonce),使区块头哈希值小于等于目标阈值,符合难度要求的区块头哈希值开头有一长串零。由于当前挖矿难度高,仅调整 nonce难以找到符合要求的哈希值,还可通过调整 coin base 域内容(当作 extra nonce)来增大搜索空间。

这部分内容老师围绕比特币区块信息与挖矿进行了详细讲解,涵盖了区块的各项具体信息、挖矿的原理、过程以及相关的调整策略等方面,具体如下:

  1. 比特币区块信息:从blockchain.info网站截图的例子来看,比特币区块信息包含多个关键部分。
    1. 总输出表示该区块中总的比特币输出数量;
    2. 总的交易费是该区块内所有交易产生的交易费总和;
    3. 出块奖励是获得记账权的节点发布区块所得到的比特币报酬。
    4. 当前出块奖励与交易费相比,出块奖励是大头,约为交易费的 100 倍,这也是矿工挖矿的主要动力。
    5. 此外,区块信息还包括区块的序号(height)、时间戳(time stem),例如提到的某个区块是上个月月底产生的。
    6. 挖矿难度(difficult)每隔 2016 个区块会进行调整,目的是保持出块时间在十分钟左右。
    7. 随机数(nonce)是挖矿时尝试的数值,最终找到的符合难度要求的 nonce值会记录在区块中。右边显示的三个哈希值分别是该区块的块头哈希值、前一个区块的块头哈希值,计算哈希值时只算 block header 部分。符合难度要求的区块,其块头哈希值开头都有一长串零。

  1. 挖矿的原理和过程:挖矿的本质是不断地调整随机数 nonce,使得整个 block header 的哈希值小于等于给定的目标阈值。由于比特币现在的挖矿难度极高,单纯靠调整 block header 里 32 位无符号整数类型的 nonce,即便遍历完二的 32 次方个可能取值,也很可能找不到符合难度要求的结果,因为搜索空间不够大。

  1. 增加挖矿搜索空间的方法:除了 nonce,block header 里还有一些域可以进行调整。比如区块产生的时间,比特币系统对时间要求并非非常精确,在一定范围内可以调整,但该域只有四个字节。

  1. 特殊的铸币交易(coin base transaction)的 coin base 域可以写入任何内容,且无人检查。改变 coin base 域的内容,会使该交易的哈希值发生变化,进而沿着 Merkle 树的结构往上传递,最终导致 block header 里的根哈希值改变。所以可以把这个域当作 extra nonce来用,比如将 coin base 域的前八个字节当作 extra nonce,这样搜索空间一下子增大到二的 96 次方。真正挖矿的时候存在两层循环,外层循环调整 coin base 域的 extra nonce,算出 block header 里的根哈希值之后,再进行内层循环等其他操作 。

以上是一个小型区块链的示意图,链表中的每一个节点都存储的block head,然后我们把最后一个区块节点的block head中存储的默克尔树的根哈希值所对应的默克尔树画出来,得到如上示意图。

五、交易合法性验证与脚本

比特币系统通过将交易的输入脚本与提供币来源的前一个交易的输出脚本配对执行,来验证交易的合法性。若拼接后的脚本能够顺利执行且无错误,则该交易合法。

六、比特币总量与稀缺性

比特币总量为 2100 万,通过出块奖励产生,出块奖励每隔 4 年减半,其稀缺性是人为设定的。挖矿过程虽求解的谜题本身无实际意义,但对维护系统安全性至关重要,它提供了凭借算力投票的手段,确保大部分算力掌握在诚实节点手中时系统的安全。

这部分内容老师围绕比特币总量的计算、稀缺性的形成原因以及挖矿对于系统安全性的意义展开了讲解,具体如下:

  1. 比特币总量的计算:出块奖励(block reward)是比特币系统中产生新比特币的唯一途径,因为规定了每生成21万个区块后出块奖励就减半,比特币平均每10分钟生成一个区块,所以大约每隔 4 年出块奖励减半。这种减半机制使得产生的比特币数量构成了一个几何序列。最初,21 万个区块能够生成的比特币是 50 个,接下来的 21 万个区块生成的比特币变为 25 个,再接下来的 21 万个区块生成 12.5 个,以此类推。通过数学计算,将 210000×50 提取出来,括号内是一个等比数列 1 + 1/2 + 1/4 + … ,根据等比数列求和公式,这个数列的和为 2,所以整个等式化简后为 210000×100 = 2100 万,这就是比特币系统中所有比特币的总量。

  1. 比特币稀缺性的误解与真相:一些不太了解比特币的人存在错误观点,他们以为比特币挖矿是在解决类似寻找符合某种条件质数的数学难题,并且认为比特币越来越难被挖到,是因为越到后面符合条件的质数越来越少。但实际上,比特币求解的谜题除了比拼算力之外,并没有其他实际意义。比特币越来越难被挖到,是由于出块奖励被人为地减少,通过不断减半的方式,造成了比特币的稀缺性是人为设定的结果。
  2. 挖矿对于系统安全性的意义:虽然挖矿求解的谜题本身没有实际意义,甚至看起来像是在做无用功还浪费电,但挖矿过程对于维护比特币系统的安全性至关重要。对于一个去中心化且没有中心机构控制的系统而言,挖矿提供了一种凭借算力投票的有效手段。只要大部分算力掌握在诚实的节点手中,系统的安全性就能得到保证。这就是所谓的 “bitcoin is secure by mining”,即比特币通过算力(金钱投入用于挖矿设备和电力等)来保障安全。
  3. 挖矿动力的变化:出块奖励每隔 4 年减半,按常理可能认为大家挖矿的动力会越来越小。然而,从过去几年的情况来看,实际情况恰恰相反,挖矿的竞争变得越来越激烈。这是因为比特币的价格飙升,尽管出块奖励的数目减少了,但奖励的价值反而更高。虽然从今年开始比特币价格有所下跌,从原来最高的 2 万美元跌到大概 6000 多美元,但当出块奖励越来越少最后趋于零的时候,还有交易费这一激励机制存在,矿工仍有动力继续挖矿。

七、比特币安全性分析

假设大部分算力由诚实矿工掌握,虽不能完全保证记账权不落入恶意节点手中,但能提供概率上的安全保证。恶意节点无法伪造签名转移他人资金,在进行双花攻击(double spending)时,若转账交易后有多个确认(比特币协议默认 6 个确认),攻击成功的概率会大幅下降。此外,还有零确认(zero confirmation)的情况,虽风险较大,但在实际中也有应用,部分原因是比特币协议默认接收最先听到的交易,且交易处理存在时间间隔。

这部分内容老师从多个角度对比特币的安全性进行了分析,涵盖了在大部分算力由诚实矿工掌握的假设下,比特币系统所面临的各种潜在攻击以及相应的防范措施,具体如下:

  1. 基本假设与安全保证:假设大部分算力掌握在诚实的矿工手里,比特币挖矿给出的是概率上的安全保证,即有较大概率下一个区块由诚实矿工发布,但不能保证记账权绝对不会落到恶意节点手中。例如,若好的矿工占 90% 的算力,坏的矿工占 10% 的算力,平均下来 10% 的情况记账权会落到恶意节点手里。
  2. 恶意节点转账攻击分析:恶意节点(如节点 m)无法将别人账上的钱转给自己。因为将他人账户(如 a 账户)的钱转走的交易需要 a 的签名才有效,而恶意节点 m 即便获得记账权,也不知道 a 的私钥,无法伪造 a 的签名。若 m 强行将未经合法签名的交易写入区块,诚实的节点不会接受这个区块,会继续沿着上一个区块挖矿。因为比特币要求扩展最长合法链,m 发布的包含非法交易的区块不是合法链,即便其长度增加也无用,该区块会作废,攻击者不仅得不到出块奖励,还会遭受损失,所以这种攻击无法成功
  3. 双花攻击(double spending)分析:恶意节点 m 获得记账权后,不能轻易将已经花出的币再花一遍。例如,m 先把钱转给 a(m 转给 a 的交易),之后又想把钱转回给自己。若 m 直接将把钱转回给自己的交易连在后面的区块,诚实节点不会接受。m 若要发布这个交易实现双花,只能采用分叉攻击(focking attack),在合适的位置插入包含该交易的区块。但在插入时,需要在刚开始挖矿时就决定好区块位置,因为 block header 里要填上前一个区块的哈希值。当出现两个等长的合法链时,取决于其他节点沿着哪一个链往下扩展,最终有一个链会胜出,另一个链会作废。这种攻击的目的是,如果 m 转给 a 的钱产生了不可逆的外部效果(如网上购物中网站以为支付成功给了 m 商品),m 再通过分叉攻击回滚交易,把钱转给自己,从而不当获利。

  1. 防范双花攻击的方法:防范双花攻击的一种简单方法是多等几个区块(多等几个确认)。当交易刚写到一个区块里时,称为 one confirmation(一次确认),后面跟了一个区块就叫 two confirmation(两次确认),以此类推。比特币协议中默认要等六个确认,此时才认为前面的交易是不可篡改的。由于平均出块时间是十分钟,所以等六个确认需要一个小时,等待时间较长。实际上,这种不可篡改性只是概率上的保证,相对容易被改掉,但经过等待时间和多个确认后,被篡改的概率会大幅度下降,呈指数级下降。

  1. 零确认(zero confirmation)情况分析:零确认是指转账交易发布后,下一个区块还没有被挖出来的状态。在电商购物例子中,买家发布转账交易告诉电商已付款,电商运行全节点会验证交易合法性(有合法签名且以前未被花过)。虽然零确认听起来风险大,但在实际中应用比较普遍。原因一是比特币协议默认节点接收最先听到的交易,当两个交易有冲突时,先收到的会被接受,所以在零确认位置 m 转给 a 的交易被节点收到后,m 再发布将钱转给自己的交易,诚实节点有较大概率不接受;原因二是交易处理天然有一定时间间隔,如电商在买家支付成功后可能第二天才发货,若发现转账交易未写到最长合法链上,电商可选择取消发货,这是比特币系统外的防范手段。
  2. 恶意节点其他潜在攻击分析:若恶意节点获得记账权,不处理合法交易(将合法交易排除在自己发布的区块外),这种情况问题不大。因为合法交易可以被写到下一个区块里,总会有诚实节点愿意发布这些交易。有时可能会出现合法交易数量多,而比特币协议规定每个区块大小有限制(最多不能超过一兆字节),导致有些交易只能等到下一个区块再发布的情况。

7.1 自私挖矿(Selfish Mining

自私挖矿是指挖到区块后先不发布,用于分叉攻击或减少竞争。在分叉攻击中,恶意节点需占据较大算力(如 51% 以上)才可能成功;在正常挖矿场景下,算力较强的节点采用自私挖矿策略可减少竞争,获取更多出块奖励,但也存在风险,如长时间不发布可能导致挖到的区块作废。

每一个区块需要有前面一个区块的哈希值才能构建,所以区块只能一个一个创建,不可能前面的区块还没创建,就把后面的区块创建出来了。

这部分内容老师详细介绍了自私挖矿的概念、目的、实施方式、成功条件以及风险,具体如下:

  1. 自私挖矿的概念:正常情况下,矿工挖到一个区块后会马上发布,因为不发布的话,别人发布了新的区块,自己挖到的这个区块就会作废,无法得到出块奖励,就如同写论文有了好想法要抢先发布,不然别人先发表自己的成果就没用了。但自私挖矿(selfish mining)却不是这样,它是指矿工挖到区块后先藏起来,不着急发布。
  2. 自私挖矿的目的和实施方式:
    1. 用于分叉攻击:在分叉攻击(focking attack)中,恶意节点可以利用自私挖矿的策略。比如先偷偷地挖出多个区块并藏起来,当看到目标交易(如 m 转给 a 的交易)产生了不可逆的外部效果(如电商已发货)且经过了一定数量的确认后,一下子发布出自己藏着的一长串区块,尝试覆盖原有的最长合法链(自己创造了一个更长的链,但是这个链本质是非法的),从而实现将已花出的币再花一遍(双花攻击),达到不当获利的目的。

  1. 正常挖矿减少竞争:在正常挖矿过程中,自私挖矿也有一定好处。当某节点挖到一个区块后不发布,其他节点以为该区块是最后一个区块,就会继续沿着这个区块往下挖。如果该节点算力较强,在其他节点还在争抢沿着原链挖下一个区块时,它已经挖到了再下一个区块。当听到有人挖到上面的区块时,它再把自己藏着的两个区块都发布出去,这样其他节点之前为挖上一个区块所做的工作就白费了,而它能得到两个出块奖励,从而减少了竞争。
  1. 自私挖矿成功的条件:普通矿工实施自私挖矿成功的可能性不大。例如,在好的节点占 90% 算力,恶意节点占 10% 算力的情况下,自私挖矿成功概率较低。因为自私挖矿时,藏着的区块其他节点不知道,所有节点都会沿着可见的链往下挖,只有实施自私挖矿的节点及其同伙会挖下面这条链。所以,自私挖矿若要成功,恶意节点需要占据很大一部分算力,比如 51% 以上的算力,成功的可能性才会比较大。否则自私挖矿生成区块的速度是远远赶不上由其他所有节点沿着可见链生成区块的速度快的
  2. 自私挖矿的风险:自私挖矿存在较大风险。比如挖到一个区块不发布,想继续挖下一个区块,等别人挖出一个时,自己能挖出两个并发布,从而让别人的努力白费。但如果自己还没挖到下一个区块,别人就已经挖出了当前正在竞争的区块,此时就会出现等长的链。这种情况下,实施自私挖矿的节点需要赶快把藏着的区块发布出去跟别人竞争,否则可能会失败,导致自己之前的努力都白费,什么都得不到。也就是说,自私挖矿虽然在一定程度上能让实施者减少竞争、让别人做无用功,但同时也伴随着较高的风险,回报并不是很高 。

 相关文章:【BTC】密码学原理-CSDN博客
                  【BTC】数据结构-CSDN博客
                  【BTC】协议(共识机制)-CSDN博客

http://www.lryc.cn/news/582034.html

相关文章:

  • 【机器学习实战】线性回归分析
  • 【redis相关】
  • QML中的Item
  • TCP 事务全面研究:从原理到优化与故障排除
  • 百度开源文心 4.5 系列开源大模型 GitCode 本地化部署,硅基流动:文心 vs. DeepSeek vs. Qwen 3.0 深度测评
  • 剑指offer第2版:动态规划+记忆化搜索
  • 使用make编译ROS2节点
  • 如果让计算机理解人类语言- Word2Vec(Word to Vector,2013)
  • 利用英译法案例演示RNN中的注意力机制(基于PyTorch)
  • 超越存在性检查:掌握Linux中`ls`命令的终极指南
  • .net core mvc部署到win10本地的Ubuntu上
  • 【Linux | 网络】网络基础
  • 多模式编译器——vim的使用
  • FastMCP:用于构建MCP服务器的开源Python框架
  • UE 材质 变体 概念
  • C++11标准库算法:深入理解std::none_of
  • Pandas 学习教程
  • T01_神经网络
  • 【python实用小脚本-130】基于 Python 的 HTML 到 Markdown 转换工具:实现高效文档格式转换
  • 钉钉企业内部机器人实现单聊会话互动开发指南
  • 【LeetCode 热题 100】234. 回文链表——快慢指针+反转链表
  • TypeScript 基础与类型系统详解:从入门到实践
  • TB62216FTG,TB62216FNG东芝BiCD集成电路硅单片,PWM斩波型电机驱动集成电路
  • 【Chrome】‘Good助手‘ 扩展程序使用介绍
  • 【操作系统】页面置换
  • OpenWebUI(2)源码学习-后端retrieval检索模块
  • vulnhub靶机渗透:PWNLAB: INIT
  • 海外短剧系统开发:PC端与H5端的全栈实践与深度解析
  • Java-66 深入浅出 分布式服务 Netty详解 EventLoop
  • [特殊字符] Excel 读取收件人 + Outlook 批量发送带附件邮件 —— Python 自动化实战