主页 > imtoken冷钱包官方下载 > 区块链 - 比特币开发指南

区块链 - 比特币开发指南

imtoken冷钱包官方下载 2023-03-25 06:04:35

原文链接:#block-chain

翻译:terryc007

版本:1.0

比特币开发指南

1. 区块链

2. 事务

3.合约

4.钱包

5.支付处理

6.工作模式

7.P2P网络

8.挖矿

比特币开发指南主要是为你提供一些必要的信息,让你了解比特币,开发一些基于比特币的应用。但这不是关于比特币的手册。为了更好地使用本开发指南,您可以安装当前的比特币内核源代码,或者编译后的比特币内核客户端。

关于比特币开发的问题最好在比特币开发社区提出。在 Bitcoin.org 上,有关文档的错误或建议可以作为问题提交或发布在比特币文档邮件列表中。

比特币交易id查询网站_全球最大比特币交易网站mtgox破产_国外最大的比特币交易网站

在后面的开发文档中,有些文字会被省略或隐藏:“[…]”表示多余的数据已被删除,行尾的“”符号表示后面的部分仍然是线。如果将鼠标移到段落上,带有交叉引用链接的文本将变为蓝色。如果您将鼠标悬停在带有交叉引用链接的术语上,则会显示该术语的简短工具提示。

区块链

区块链提供了比特币的公共分类账,其中包含有序的、带有时间戳的交易记录。区块链系统用于防止重复发行,防止之前的交易记录被篡改。

在比特币网络中,每个全节点独立保存一个区块链,其中包含仅由自身验证的区块数据。当节点在其区块链中具有相同的块时,它们被认为具有共识。节点用来维护共识的这些验证规则称为共识规则。本节描述了比特币内核中使用的许多共识规则。

区块链概述

上图是区块链的简化版本。一个或多个新的交易记录被收集到一个块中,其中存储了交易数据。为每笔交易生成一个哈希值,然后将哈希值成对配对,然后生成哈希值,再将之前生成的哈希值配对,然后生成哈希值,直到只剩下一个哈希值,最后一个哈希值是默克尔树的根。

Merkle 根存储在区块头中。每个区块都会存储前一个区块头的哈希值,这样所有的区块就串联起来形成一个区块链。这保证了在不修改交易所在的区块和该区块的所有后续区块的情况下,交易不能被篡改。

交易记录也被链接在一起。比特币钱包给我们的直观印象是 satoshis(比特币的最小单位,1btc = 100,000,000 satoshis)在钱包之间来回发送,但实际上比特币是从一笔交易到另一笔交易的转移。每笔交易都会花费一笔或多笔先前交易的聪,因此一笔交易的输入就是前一笔交易的输出。

一个交易可以创建多个输出,就像发送到多个地址时一样,但是在区块链中,每个特定的交易输出只能被交易输入使用一次。任何随后的引用都是被禁止的双重打击——尝试使用 satoshis 两次。

交易输出会绑定交易id(TXIDS),所谓交易id就是交易的hash值。

由于每个特定交易的输出只能使用一次比特币交易id查询网站,因此区块链中的所有交易输出可以分类为:未使用的交易输出(UTXO)或费用交易输出。对于有效的支付,它必须且仅使用 UTXO 作为输入。

比特币交易id查询网站_全球最大比特币交易网站mtgox破产_国外最大的比特币交易网站

除了 coinbase 类型的交易(一个区块中的第一笔交易,通常由矿工创建用于领取挖矿奖励并提供 100 字节的空间来存储任何数据),如果交易的输出值大于它,则该交易将被拒绝. 但如果交易输入值大于交易输出值,差额就是交易费用,用于支付比特币矿工(负责创建包含交易的区块)。例如,在上图中,每笔交易的交易费用小于交易输入的总和,实际支付 10,000 satoshis。

工作证明

网络中的匿名节点共同维护区块链,因此比特币在创建区块时需要有效的工作量证明,以确保试图修改历史区块的不受信任节点比受信任节点支付更多费用。很多工作。

连接块使得在不修改当前块和所有后续块的情况下无法修改任何块中的事务。因此,每次向区块链添加新区块时,都会增加修改特定区块的成本,从而放大工作量证明的效果。

比特币中使用的工作量证明利用了密码散列中的自然随机性。一个好的密码散列算法可以将任意数据变成看似随机的数字。如果数据被修改,无论如何,当重新计算数据的哈希值时,会产生一个新的随机数,因此无法预测修改后数据的哈希值。

为了证明你做了一些工作来创建一个块,你必须生成一个块头的哈希,它不能超过某个值。例如,如果最大哈希是 2256-1,您可以通过生成小于 2255 的哈希来证明您尝试了这两种组合。 [?]

在上面的示例中,您为生成有效哈希所做的每次尝试在概率上都是相同的。甚至可以估计哈希计算尝试产生的值小于三哈希的概率。比特币使用线性概率,即哈希目标值越小,需要的哈希计算尝试次数越多。

只有当其生成的哈希值满足共识协议预期的难度值时,才能将新块添加到区块链中。每 2016 个区块,比特币网络使用存储在区块头中的时间戳来计算从第一个区块到第 2016 个区块的经过时间(以秒为单位)。实际值为 1209600 秒(两周)。

(注意:在比特币内核实现中,单个偏移量错误导致难以从仅 2015 块更新到 2016 块,从而导致轻微偏移)[?]。

因为每个区块头在生成哈希值时必须小于目标阈值,并且每个区块都必须链接到它的前一个区块,并且修改后的区块必须在整个比特币网络中广播,也就是说,平均而言,它需要消耗:从修改块创建时间到当前时间,所有块所需的计算能力。只有拥有大量算力比特币交易id查询网站,才能可靠地进行 51 次攻击(不过需要注意的是,即使只有不到 50% 的算力,也有可能成功进行这样的攻击)。

区块头提供了几个易于修改的字段,例如专用的临时字段,这样就可以在不等待新交易的情况下获得新的哈希值。[?] 同样的,当用于工作量证明时,只需要计算只有 80 字节的区块头的哈希值,因此区块中的大量交易数据不会减慢哈希值的计算速度, 它只是增加了一些额外的交易数据,需要重新计算 Merkle 树中父节点的哈希值。

块高度和分叉

只要它生成的区块头哈希低于目标阈值,任何比特币矿工都可以将整个区块添加到区块链中。这些块由块高度寻址。所谓区块高度——指当前区块与第一个比特币区块(通常称为创世区块)之间的区块数。比如区块高度为2016的区块,就是第一次难度调整后的区块。

国外最大的比特币交易网站_全球最大比特币交易网站mtgox破产_比特币交易id查询网站

多个区块可以同时具有相同的区块高度,因为两个或多个矿工同时生产一个区块是很常见的。这会在区块链中创建一个清晰的分叉,如下图所示。

当矿工在区块链末端同时产生多个区块时,每个节点都会独立接受该区块。节点通常会选择他们看到的第一个块而不考虑其他节点,如下所述。

最终,每个矿工将产生另一个区块,该区块将被添加到区块链中,同时进行竞争挖矿[?]。这使得分叉链比其他侧链更困难。如果一个分叉只包含有效区块,普通节点通常会根据最困难的链重建区块链,同时移除属于较短链的陈旧区块(有时称为孤块,但也称为孤块)。块,也用于表示那些没有父块的块。)。

陈旧的块

不在最难的区块链上,而是在其他分叉的侧链上的块,有时被称为孤块,也指那些没有被本地节点处理过,没有父块的块。

很长的叉子是可能的。例如,不同的矿工为不同的目的工作。例如,一些矿工努力扩展区块链。同时,其他矿工试图通过实施 51% 算力攻击来修改交易记录。

在分叉链上,由于多个区块可能具有相同的区块高度,因此区块高度不能用于全局唯一标识。相反,该块由块的块头的哈希引用(以十六进制,反向字节顺序)。

交易数据

每个块必须包含一个或多个事务。第一个交易必须是 coinbase 交易。也称为创世交易。用于接收和消耗区块奖励(包括开采区块的补贴,以及为区块内所有交易支付的交易费用)。

创世交易的UTXO有一个特定的子句,即小于100个区块确认,不能发送(即不能作为其他交易的输入)。这暂时阻止了矿工放弃从区块中获得的区块奖励,因为在分叉链上,矿工可能会挖掘后来可能被视为孤儿的区块。

区块不需要包含任何非币基交易,但矿工几乎总是会在区块中添加一些额外的交易以获取交易费用。

国外最大的比特币交易网站_全球最大比特币交易网站mtgox破产_比特币交易id查询网站

所有交易,包括 coinbase 交易,都以二进制源交易 [?] 格式编码在块中。

交易 id (txid) 是通过对源交易格式进行散列生成的。对于这些交易 id,通过配对 txid 并对它们进行散列来构建 Merkle 树。如果是奇数的交易id,自己配对,实现pairwise pair,然后进行hash计算。

然后将这些哈希计算结果(即哈希值)成对配对,然后计算哈希值。如果有任何哈希值没有配对,则与自身配对,然后计算哈希值。重复这个过程,直到只剩下一个哈希值。这个值是默克尔根。

例如,如果交易没有经过哈希处理,则 5 个交易的 Merkle 树将如下图所示:

 ABCDEEEE .......Merkle root
        /        \
     ABCD        EEEE
    /    \      /
   AB    CD    EE .......E is paired with itself
  /  \  /  \  /
  A  B  C  D  E .........Transactions

正如简化支付验证 (SPV) 段落中所讨论的,通过区块头中的 Merkle 树根,以及从全节点获得的中间哈希 [?] 列表,Merkle 树允许客户端以根自身验证交易是否在一个街区。全节点不一定要受信任,因为伪造区块头的成本很高,而且中间哈希值列表也不能伪造,否则验证会失败。

例如,为了验证交易 D 是否已被添加到区块中,SPV 客户端只需要交易 C、AB、EEEE 的哈希值以及该区块的 Merkle 根;客户不需要知道任何其他交易。在这个区块中,假设 5 个交易中的最大大小,下载整个区块大约需要 500,000 字节 - 但下载 3 个哈希加上区块头只需要 140 字节。

注意:如果在同一个区块中发现相同的交易 id,Merkle 树可能会与区块发生碰撞,导致部分或全部交易 id 被删除,这取决于不平衡的 Merkle 树 [? ] 是如何实现的(复制孤立的哈希)。由于不同的交易不可能有相同的交易id,这对那些忠实的软件来说不是负担,但是如果缓存了一个块的无效状态,那么就必须检查该块;否则,一个去重事务 id 的有效区块可能具有相同的 Merkle 树根和区块哈希值,但由于缓存的无效区块状态,会导致安全漏洞(例如)CVE-2012-2459,并且该区块将被阻止。拒绝。

共识规则变更

为了保持共识,所有全节点都使用相同的共识规则来验证区块。但是,有时需要更改共识规则以引入新功能以防止滥用比特币网络。当新的共识规则实施时,未升级的节点将继续遵循长期存在的共识规则,升级后的节点将遵循新的共识规则。这种情况可能会持续一段时间,这会导致两种不同的共识。

遵循新共识规则的块被升级节点接受,但被未升级节点拒绝。例如,区块正在使用一个交易功能:升级节点知道该功能并接受它,而非升级节点则由于其他违反旧共识规则的行为而拒绝接受它。

违反新共识规则的块被升级节点拒绝,但被非升级节点接受。例如,在一个区块中使用了一个被滥用的交易函数:升级节点会因为它违反新的共识规则而拒绝它,而非升级节点会因为它遵守旧的共识规则而接受它。

第一种情况,非升级节点拒绝接受,从非升级节点获取区块数据的挖矿软件拒绝与从升级节点获取区块数据的挖矿软件构建相同的区块链。这将创建一个永久分叉——非升级节点所在的链和升级节点所在的链——也称为硬分叉。

全球最大比特币交易网站mtgox破产_国外最大的比特币交易网站_比特币交易id查询网站

在第二种情况下,该块被升级节点拒绝,如果升级节点控制了大部分哈希算力,则可以避免硬分叉。这是因为,在这种情况下,未升级的节点会接受来自升级节点的所有有效区块,因此升级后的节点可以构建更健壮的区块链,而未升级的节点会接受这条链是最好的有效链. 这称为软分叉。

虽然分叉是区块链中的真正分叉,但修改共识规则通常被描述为创建硬分叉或软分叉。例如,“将块大小增加到 1MB 以上需要硬分叉”,在这种情况下,不需要实际的区块链分叉 - 但这是一种可能的解决方案。

可以通过多种方式激活对共识规则的更改。在比特币的前两年,中本聪执行了几次软分叉,通过发布向后兼容的客户端更改共识规则,使这些客户端立即执行新的共识规则。许多软分叉,例如 BIP30,都是由标志日期激活的。也就是说,新的共识规则被强制在预定的时间或区块高度被激活。通过标记这样的日期来激活的分叉称为用户激活软分叉 (UASF)。因为在标记日期之后,这些分叉依赖于一些有效的用户(节点)来执行新的共识规则。

之后,软分叉需要等待大部分算力(通常为 75% 或 95%)发出信号,表明他们已准备好执行新的共识规则。一旦超过所需信号的阈值,所有节点都会执行新的共识规则。这种分叉称为矿工激活软分叉(MASF),因为分叉依赖于矿工停用。

资源:BIP16、BIP30、BIP34 是通过改变共识规则来实现的,导致了软分叉。BIP50 导致意外硬分叉,后来通过暂时降级升级节点的能力得到解决,并在临时降级被移除时通过故意硬分叉解决。这是 Gavin Andresen 关于如何实施未来共识规则变更的文件。

检测分叉

上述两个分叉中,可以使用未升级的节点,发送不正确的信息会造成多种情况,造成财产损失。事实上,非升级节点可以转发和接受升级节点认为无效的交易。这些交易永远不会成为全球公认的最佳区块链的一部分。非升级节点也可以拒绝转发已添加或即将添加到最佳区块链的交易,从而提供不完整的信息。

比特币内核具有通过查看区块链工作量证明来检测硬分叉的代码。如果未升级的节点收到一些块头,这些块头中至少有6个块可以证明新块所在区块链的工作量小于该节点认为的最佳区块链上的工作量。不仅如此,节点将在 getnetworkinfo RPC 结果中报告警告,并运行 -alertnotify 命令(如果已设置)。这警告运营商,非升级节点无法切换到最可能的最佳区块链。

全节点还可以检查区块、交易的版本号。如果最近一个区块的区块版本号或交易版本号高于新节点使用的区块的版本号,则认为它没有使用当前的共识规则。比特币内核将通过 getnetworkinfo RPC 报告此情况,并运行 -alertnotify 命令(如果已设置)。

在任何一种情况下,如果区块交易数据明显来自未使用当前共识协议的节点,则不应转发区块交易数据。

SPV客户端会链接全节点,通过链接多个全节点,同时保证这些全节点在同一个区块链中处于相同的区块高度,考虑到交易延迟,陈旧区块,可以加减几个块,就有可能检测到可能的硬分叉。如果有分叉,SPV 客户端可以断开较弱链上节点之间的连接。

SPV 客户端还应监控区块的增量、交易版本号,以确保 SPV 客户端将处理收到的交易并使用新的共识规则创建新的交易。