有没有想过区块链的挖矿是如何运作,或者你的交易如何得到确认并被添加到区块链中?以下是区块链中交易的处理过程,分七个步骤。
步骤1:1个用户在他们的钱包里确认交易,尝试发送某种加密货币给其他人。
步骤2:交易由钱包传达出去并等待对应的区块链上的矿工接收。只要没有接受,它就会等待在“未确认的交易池”中。这是一个待处理的未确认的交易集合池。而这些待确认的交易通常不会集中在一个巨型池中,而是在分开的小型本地池中。
步骤3:网络上的矿工(有时称为节点,但不完全相同!)从这些池中选择交易并形成“区块”。除了一些额外的元数据之外,块区基本上是交易的集合(此时,仍然是未经确认的交易)。每个矿工都构建自己的交易块,多个矿工可以选择同样的交易包含在自己的区块中。
示例:有两名矿工,矿工A和矿工B。矿工A和矿工B都可以将交易X包含在自己的区块中。每个区块链都有自己的区块规模。在比特币区块链上,区块最大可存储1 MB数据。在向区块添加交易之前,矿工需要根据区块链历史检查交易是否有能够进行。根据当前区块链历史记录,如果发起人的钱包余额充足,则交易被认为是有效的并且可以添加到该区块中。矿工通常会优先考虑高交易费的交易,这样回报更高。
步骤4:通过选择交易并将其添加到自己的区块,矿工创建了一个交易块。为了把交易块添加到区块链(让所有矿工和节点记录),该区块需要签名(也称为工作证明)。此签名是通过解决每个交易块所特有的数学问题来创建。每个区块都有不同的数学题,因此每个矿工需要处理他们构建的区块所特有的问题,所有这些问题难度相同。为了解决这个数学问题,大量算力被占用(因此需要大量的电力)。你可以想象成在计算器上运行计算,只是在电脑上更难,这就是挖矿的过程。如果你想了解更多数学问题的解决过程,请继续阅读下文,或者请跳至步骤5。
挖矿又叫哈希(工作量证明共识算法)
当在区块链上添加区块时,每个矿工面临的数学问题是为其区块中的数据找到哈希输出(也称为签名),该输出以一定量的连续零开始。这听起来很复杂吧?但实际上并不那么难。我们试着用一个简单的方法解释。
在我们继续之前,了解什么是哈希函数很重要。哈希函数是一个很难解决的数学问题,但答案很容易验证。
哈希函数接收数字和字母的字符串(任意随机字母,数字或者符号的字符串),并将其转换为由随机字母和数字组成的新的32位字符串。这个32位数字符串是哈希输出。如果接收的字符串中任何数字或字母发生更改,则哈希输出也将随机变化。但是,接收相同的字符串将始终得到相同的字符串输出。
现在将区块内的数据想象为哈希输入(一个数据串),当对此输入进行哈希处理时,它会得到哈希输出(32位字符串)。比特币区块链的一个规则是,如果一个区块的签名(哈希输出)以一定量的零开始,才能将其添加到区块链中。但是,输出字符串每次都是由随机的输入字符串产生的,那么如果区块的数据字符串不能产生以多个连续零开头的签名(哈希输出)怎么办?好吧,这就是为什么矿工需要反复更改其区块内数据,这称为nonce。每次矿工更改nonce时输入字符串都会改变,因此也会产生随机的输出字符串(签名)。矿工一直重复此过程直到找到满足签名要求(以多个连续零开始)的输出字符串。下面有一个示例,它使用七个零,但零的数量实际上取决于区块链的“区块难度”。“区块难度”有点复杂,所以我建议你先保存(现在不是非常重要)。
这就是矿工们找到合格签名的过程,也是解决这个数学问题需要如此多算力的原因。如此多的nonce需要花费大量的时间和算力;如果更多的矿工加入区块链,数学问题的难度也会随之增加,这将导致更高的电费。如果你很好地理解这个过程,现在让我们来看第5步。
步骤5:矿工首先为区块找到合格的签名,然后再把该区块及其签名广播给其他矿工。
步骤6:其他矿工需要确认签名的合法性,通过接收被广播的区块的数据串来计算输出的字符串是否匹配签名。如果它是有效的,其他矿工将确认其有效性并同意该区块可以添加到区块链中(他们达成共识,也就是说彼此一致,因此术语叫共识算法)。这也是“工作量证明”的来源。签名就是所执行工作的“证明”(花费了算力)。然后该区块就可以添加到区块链中,并被网络上的其他节点传播。只要区块内的交易与当前钱包余额(通过交易历史)能对应,其他节点就会接受该区块并保存到其交易数据中。
步骤7:将一个区块添加到链上后,之后添加的每个区块都被看成该区块再次的“确认”。例如,如果我的交易包含在区块502中,总共链长是507个区块,则意味着我的交易被5次确认(从502-507)。之所以被称为确认,因为之后添加区块时,区块链会在整体交易历史上再次达成共识,包括你的交易及区块。所以可以说区块链确认了你的交易5次。这也是Etherscan在展示交易详情时所指的内容。你的交易被确认次数越多(也就是嵌入链中更深的区块),攻击者就越难以改变它。在添加新区块到区块链后,所有矿工需要从第3步形成一个新的交易区块开始。这是,矿工们不能继续(实际上他们可以,但这与本文无关)挖掘来解决区块中的问题,原因有两个。
一:它可能包含已被添加到区块链的上一个区块确认的交易(请记住,矿工可以选择/包含区块中相同的交易),因此这些交易中的一些可能不再有效,而使整个区块无效。
二:每个区块都需要添加上一个区块的哈希输出(签名),这个哈希输出已经添加到区块链的元数据中。这就是它成为区块链的过程。如果矿工继续挖掘他们正在处理的区块,其他矿工就会看到哈希输出与区块链上最新添加的区块不对应,因此将遭到拒绝。