主页 > token.im官网 > 区块链 - 区块链基础知识:交易哈希链

区块链 - 区块链基础知识:交易哈希链

token.im官网 2023-08-28 05:11:13

区块链 - 区块链基础知识:深入了解交易哈希链

这篇文章的主题是执行交易哈希链,交易池的作用,以及最长的区块链如何始终占主导地位。

讨论的细节包括以下内容:

技术包括:

回顾“交易哈希链”

前面讨论了用于追踪数字资产所有权的交易哈希链数据结构。 本文深入讨论哈希链的工作原理。

出于对区块链的尊重,本文从中本聪2008年发表的比特币白皮书(bitcoin.org/bitcoin.pdf)开始。虽然比特币的实现细节发生了很大的变化,但白皮书仍然是一个很好的参考. 尤其是交易哈希链的设计理念原图。

该图的目的是告知交易哈希链是如何构建的以及数字签名如何验证所有权的转移。 但是这张图抽象度很高,有点混乱,为了弄清楚当前交易哈希链是如何工作的,转载了这张图。

image

图注:中本聪的原始交易哈希链

此图表中有 3 笔交易。 Alice 的 Transaction0,Bob 的 Transaction1,Charlie 的 Transaction2。 第一笔交易将 Alice 作为数字资产的原始所有者比特币哈希值查询,第二笔交易将所有权转移给 Bob,第三笔交易将所有权转移给 Charlie。 每笔交易都包含以下实线概述的字段:

虚线框中的其他字段被使用但未存储在交易中:

上图是一个简化的交易哈希链,因为它在所有权转移过程中只跟踪一个数字资产(DigitalAssetID0),而加密货币的交易哈希链通常有多个数字资产输入和输出。 另外,不要将交易哈希链与区块链混淆,区块链将经过验证的交易聚合到块中。 最后,交易哈希链通常不保存在单链表数据结构中。 相反,交易哈希链可以从存储在区块链中的交易数据中快速创建(通过索引)。

正如上一篇文章所说:交易顺序得以保留,因为每个新所有者的交易都包含一个哈希值,该哈希值与前一个所有者的交易相关联。 如上所示。 当前一个交易的交易哈希值保存在当前交易中时,就建立了反向链接。

例如:Bob 的交易包含一个交易哈希字段,其中包含 Alice 的 TransactionHash0 值。 同样,Charlie 的交易包含一个交易哈希字段,该字段包含 Bob 的 TransactionHash1 值。

反向链接只是交易哈希链数据完整性的几个组成部分之一。 交易哈希链还强制执行验证所有权转移的过程。 例如,爱丽丝是世界上最好的葡萄酒供应商,她想维护一个账本来跟踪她的每一瓶酒的状态。 有一天,爱丽丝去了酒窖,决定在她的区块链上将自己注册为所有葡萄酒的原始所有者,有效地将她收藏的每一瓶葡萄酒都放入交易哈希链中。

她拿起一瓶 1947 年的白诗南,并用包含唯一 ID 的二维码在上面做标记。 然后她扫描二维码标签并将其存储在她的区块链客户端软件中,该软件作为网络中的一个节点运行。 该软件将扫描的代码转换为数字资产 ID(DigitalAssetID0),然后添加一些可选数据(OptionalData0),以及 Alice 的公钥(PublicKey0)。 如上图所示,这些字段代表各自矩形线框中的未签名交易。 每笔交易都包含一个反向交易哈希链和一个签名,但由于这是哈希链中的第一笔交易,因此这些字段为空(影子字段 Transaction0)。

顶部的每个交易都是一个唯一的交易哈希值。 该哈希值是通过软件将所有交易字段(交易哈希值、数字资产ID、可选数据、公钥)与SHA-256哈希算法结合得到的。 和签名)一起计算。 而这个计算出来的哈希值就是下一笔交易的DigitalAssetID0的反向链接。

当 Alice 的经理 Bob 想要购买 Alice 的酒时,Bob 使用他的客户端软件为交易生成一个新的公私密钥对。 Bob 也可以跳过这一步,而是将他所有的数字资产聚合在一个以前使用过的公钥下,但这会让他面临风险。 因此,他需要生成一个新的公钥-私钥对,并给Alice一个他从未使用过的公钥。 这样,如果他之前丢失了配对的私钥,那么他只会丢失一个数字资产。

为了响应 Bob 的请求,Alice 启动了她的客户端软件并浏览了她的数字资产。 她选择与 Bob 想要的那瓶酒关联的交易 ID,然后用 Bob 的公钥发起交易请求,这也是交易的目标地址。客户端节点然后创建一个新的交易(Transaction1)包含

至此,这个客户端节点为Bob创建了一个新的未签名交易Transaction1,下一步就是用Alice的私钥对这个交易进行签名。 这一步很重要,Alice现在拥有这个数字资产,所以只有她才能把这个数字资产转给Bob。

椭圆曲线密码学

在上图中,标签 1 和标签 2 表示交易的签名和验证位置。 因此,在这个版本中,比特币区块链利用公钥加密(PKC)的实现,称为椭圆曲线加密(ECC)。 与流行的 RSA/Diffie-Hellman 相比,ECC 以更短的密钥值提供更强的加密结果。 区块链节点使用ECC生成非对称密钥对,生成过程是指在二维图中随机选择点的公式。 这种模式允许丢失的公钥由私钥重新生成(当然,不允许丢失的私钥由公钥重新生成)。

比特币之后的区块链模型也是使用ECC进行数字签名。 与上一篇文章中提到的简化的PKC RSA(Rivest-Shamir-Adelamn)算法不同,比特币现在使用椭圆曲线数字签名算法(ECDSA)对交易进行签名,(准确的说是用ECDSA的SHA-256算法)。 该算法与其他签名技术略有不同:在 ECDSA 中,您必须将签名者的私钥与要签名的消息一起传递给函数,该函数使用 ECDSA 签名生成算法创建签名(在上图)。 后面要验证签名,必须将签名者的公钥、消息体和签名传递给函数,该函数使用ECDSA验证算法生成一个true或false值来表示签名是否有效(上图中2表示) ) 。

下图总结了使用 ECDSA 进行签名和验证的过程:

image

图注:上图为ECDSA生成的签名,下图为验证算法。

在上一篇文章中,在使用PKC-RSA算法创建数字签名时,通过计算哈希值来验证签名。 出于好奇,该签名验证策略不适用于 ECDSA。 PKC-RSA 算法是一种确定性数字签名算法,因为使用给定的私钥签署消息每次都会生成相同的签名。 ECDSA算法是非确定性的:即每次将消息和私钥传递给ECDSA签名函数,都会得到不同的签名。 有关详细信息,请参阅 bit.ly/2MCTuwl。

继续这个例子,Alice要签署一笔将DigitalAsset0的所有权转移给Bob的交易,客户端节点将Alice的私钥(PrivateKey0)和消息(NewTransactionHash1)传递给ECDSA签名生成算法函数,得到一个签名为一个输出值(Signature1)。 该客户端节点将签名值添加到新交易的签名字段中。 最后,客户端节点计算交易哈希值(TransactionHash1),即所有交易字段(包括签名)计算出的SHA-256哈希值。 至此,客户端节点已经成功生成签名交易,可以发送到交易池中。

签名的交易在被矿工节点验证之前被认为是未验证的。 当一个矿工节点试图验证 Bob 的交易时,矿工使用交易哈希的反向链接指向前一个交易的公钥,它指向 Alice 的 Transaction0。 一旦客户端节点访问了之前的交易,它将把该交易的公钥(PublicKey0)和新交易的哈希值(NewTransactionHash1),以及Bob交易的签名(Signature1)传递给ECDSA验证算法,然后返回true或false,表明签名是否有效。

顺便说一下,Alice 的私钥(PrivateKey0)和新的交易哈希(NewTransactionHash1)并没有保存在这个交易中。 私钥值不应该保存在区块链中,也不需要保存新的交易哈希值,因为它可以在需要时重新计算。

鲍勃正在使用他的开瓶器,准备享受一瓶红酒,这时鲍勃接到了查理的电话,查理是爱丽丝另一家餐厅的经理。 查理想要一瓶特别的酒款待新员工,鲍勃遗憾地答应把这瓶红酒交给查理。 Bob 向 Charlie 询问公钥,并使用相同的过程将 DigitalAsset0 的所有权从 Bob 转移给 Charlie。

现在 DigitalAsset0 有 3 笔交易,属于这 3 个人,每笔交易都经过验证并合并到区块链中。 在矿工在包含交易的区块之上开采了一定数量的额外区块后,交易被视为已确认(确认数量因实施而异)。 这样一来,数字资产的正式所有者始终是数字资产交易哈希链中最后一笔确认交易的私钥持有者。

需要“共识”

如您所见,交易哈希链是一种专用于强制执行数字资产所有权的数据结构。 但要明白,这些交易存储在分布式、去中心化、异步、易受攻击的公共网络上,并暴露给不需要诚实区块链协议规则的其他节点(也称为“不良行为者”)。 ”)。这样做的结果是,不良行为者节点可以验证实际上无效的交易,或者也可以损害区块链的完整性。

交易池

为了防止这些交易完整性问题,所有交易都需要经过验证和确认过程,并且每个交易都由网络中的单个节点创建。 例如,假设爱丽丝在墨西哥,鲍勃在美国,当爱丽丝将其数字资产的所有权转移给鲍勃时,墨西哥节点创建交易Transaction1,然后广播到网络上的其他节点。 同时,其他节点也向网络广播自己创建的交易。 这些向全球网络上其他节点的广播取决于网络延迟。 区块链协议将所有新交易放入未经验证交易的交易池中,而不管交易最初是在全球网络中的哪个节点上进行的。

PoW 和 PoS

在区块链中,为了获得奖励 PoW,矿工节点主动从交易池中选择交易。 当然,矿工节点在构建候选区块时,会对每一笔交易进行验证,因为如果一个区块中包含任何坏的交易,都会立即被其他节点拒绝,这也意味着这个节点的工作毫无价值。

回想一下上一篇文章提到的,每个节点都在竞争寻找一个nonce(随机数),这个nonce(随机数)节点创建一个候选区块比特币哈希值查询,从而获得经济奖励,然后恢复做PoW时消耗的能量. 比特币区块链之前的奖励是 12.5 btc,价值 100,000 美元。 有时经济奖励是交易费,有时是btc加交易费。 理解 PoW 的要点是,节点必须花费能源,消耗设备和基础设施成本,才能达到不断挖掘区块的目的。 要拥有一个可持续的(负担得起的)路口,这些成本必须被收益抵消。

难怪矿工找到一个 nonce(随机数)后,会立即将区块广播给网络上的其他节点,希望将其添加到区块链的末尾。 比特币区块链会调整它的 nonce 的难度,这样大约每 10 分钟就会发现一个新的 nonce,所以如果它慢了一秒钟,其他矿工可能会找到这个 nonce 并将其作为候选区块广播。

由于矿工竞争失败的实现机制,考虑到矿工节点不能及时找到nonce,所有消耗的能量都被浪费了。 没有找到 nonce 的矿工别无选择,但也不能停止处理当前区块并重新开始获取和验证交易池中的其他交易。 原因是当他们知道其他矿工找到了一个随机数,这个随机数是一个候选块,并且这个块已经有一个反向链接指向区块链中前一个块的哈希值时,他们必须迅速停止挖矿。 当另一个矿工挖出一个指向前一个区块的已验证区块时,失败的矿工也必须放弃之前选择的交易,然后从交易池中选择一个新的交易,因为其他节点将拒绝任何包含前一个区块的新区块。

节点必须能够承担支持挖矿设备的所有费用。 因为比特币区块链还在不断增长,这就导致了另一种竞争:矿机算力的竞争。 矿工节点的算力越强,越有可能在 10 分钟内解决加密算法问题并找到 nonce。

对 PoW 的一个普遍批评是它鼓励建立计算中心和使用更多的电力。 竞争优势将分配给 PoW 支持的区块链网络上最强大的计算设备的所有者。 例如,价值数百万美元的数据中心现在用于挖掘比特币。 根据 digiconomist.net 的数据,比特币每年的区块链能源消耗量为 71.12 TWh(截至 2018 年 6 月),相当于智利一年的能源消耗量。

另一个广泛讨论的共识算法是 PoS(股权证明),它奖励证明自己在网络中的经济权利的节点。 可以证明,PoS 最大的吸引力在于它更节能。 此外,它不会奖励矿工挖区块的加密货币,尽管也会奖励交易费用。 此外,PoS 还需要竞争寻找解决加密算法问题的随机数。 与 PoW 不同,PoS 网络基于加密货币单位的总价值和年龄,随机选择一个节点将自己注册为“铁匠”(与 Bitby 的“矿工”不同)。 各种实施细节致力于在选择铁匠时强制执行随机性和公平性。 被选中的铁匠在30天内不能参与其他轮次的锻造。 更有效的是,包含最古老加密货币的高价值铁匠节点拥有其他铁匠节点的边缘。

PoS 的支持者利用更节能、鼓励更多参与者和更高级别的去中心化。 具有讽刺意味的是,PoS 系统不鼓励使用区块链旨在用于交易的加密货币,因为支出会降低节点的总价值并降低被选为铁匠的机会。

需要考虑的一件事:区块链专家 Anders Antonopoulos 指出:“PoW 也是 PoS 的一种,但 PoS 不是 PoW”。 他解释说:PoW 提供了这两种共识算法的组合。 在矿工参与的 PoW 网络中,矿工的选择不是基于加密货币单元的年龄值,而是矿工节点通过提供所需的能量来参与,以有效地杠杆经济投资。 在这种情况下,PoW 中的“Stake”模式就是节点的电力成本,这将导致一个区块的成功挖掘。 来源于:

最长链条

区块链网络不断扩张、分支和修剪。 区块链的整个视图称为“块树”。 每个矿工节点的挖矿都会让区块树的最长链变长。 你可以把最长的链想象成拥有最多块的块,但实际上这个序列是从最初产生最多工作量的块开始定义的。 您可以将此工作量视为每个块的持续挖掘难度(衡量找到作为块候选者的随机数的难度)。 网络协议维护这个值,比特币区块链调整为每 2016 个区块寻找一个 nonce,这样几乎每 10 分钟可以处理一个。 这个难度值存储在每个块中,以便节点可以计算出尝试识别最长链的工作量。

有时,不可避免地会出现A和B两个节点,他们会以几秒甚至几毫秒的间隔通过挖矿来证明PoW。 因为每个节点在将块广播到网络之前将其新块添加到它可以看到的最长链的末尾,所以“块树”中会出现一个分支。 根据节点在网络中的位置和连接节点的宽度,树的某些部分将首先找到块 A 作为新块并将其添加到链的末尾。 网络的其他部分会首先找到区块 B 作为一个新区块,并将其添加到链的尾部。 这导致一些节点以块 A 和一些以块 B 作为结束节点。 如下所示:

image

当出现分叉时,如上图上部,两条链都在区块树上,长度相等,都是有效的。 这个图代表的问题是:当矿工节点在挖矿之前寻找最长的链时,因为矿工需要知道链末端区块的哈希值。

如果矿工成功挖出区块 C 并在区块 A 上工作,它将把区块 C 添加到区块 A 的末尾作为最后一个区块。 完成后,这会将区块 C 广播到网络,然后其他节点会发现区块 A 是最长的链,而在区块 B 上工作的节点会发现区块 A 比区块 B 长,它会停止挖矿,开始挖新矿,继续区块C。这样,网络将释放区块B的所有交易,并将区块B返回交易池,从而进行新一轮的挖矿。

你可能想知道:如果矿工已经赚取了 B 区块的比特币怎么办? 交易委员会和区块奖励实际上并不发放奖励。 在比特币网络中,当开采出的区块超过 100 个区块时,这些奖励不会发放给矿工。