huanggang 2019-06-30
你有没有想过区块链的挖掘过程如何进行的,或者你的交易如何得到确认并添加到了区块链?好吧,我也是如此。由于我找不到任何明确的逐步解释这个过程文章,我决定深入研究并自己编写指南。以下是区块链交易如何通过七个步骤从你的钱包处理到区块链中。
用户注销交易从他们的钱包应用程序,尝试从他们发送某个加密币或代币给其他人。
交易由钱包应用程序广播,现在等待矿工在相应的区块链上接收。只要它没有被挖掘,它就会在“未经证实的交易池”中徘徊。此池是网络上等待处理的交易的集合。这些未经证实的交易通常不会收集在一个巨型池中,但更常见的是在小型细分的本地池中。
网络上的矿工(有时称为节点,但不完全相同!)从这些池中选择交易并将其形成“块”。除了一些元数据之外,块基本上是交易的集合(此时,仍然是未经证实的交易)。每个矿工都构建他们自己的区块,但是多个矿工可以选择要包含在他们区块中的相同交易。
示例:两名矿工,矿工A和矿工B。矿工A和矿工B都可以决定将交易X包含在他们的区块中。块具有最大数据大小。在比特币区块链中,块的最大大小是最大1MB的数据。但在将交易添加到其块之前,小型企业需要根据区块链历史检查交易是否有资格执行。如果发件人的钱包余额根据现有的区块链历史记录具有足够的资金,则该交易被认为是有效的并且可以添加到该块中。矿工通常会优先考虑设置高交易费的交易,因为这会给他们更高的回报。
通过选择交易并将其添加到其区块,矿工创建一个交易块。要将此交易块添加到区块链(以使所有其他节点和矿工注册交易),该块首先需要签名。此签名是通过解决每个交易块所特有的非常复杂的数学问题来创建的。每个块都有不同的数学问题,这意味着每个矿工都会处理他们构建的块所特有的不同问题,但所有这些问题同样难以解决。为了解决这个数学问题,需要大量的计算能力(因此需要大量的电力)。这是称为挖掘的过程。如果你想了解更多有关其工作原理的信息,请继续阅读下面的内容,否则请跳至第5步。
当尝试向区块链添加块时,每个矿工面临的数学问题是找到其块中的数据的哈希输出(也称为签名),其以一定量的连续零开始。这听起来很复杂吧?但实际上并不那么难。让我试着用一个简单的方法向你解释。
在我们继续之前,解哈希函数是什么很重要。不用担心,我不会涉及太多的技术细节。哈希函数只是一个很难解决的数学问题,但答案很容易验证。
哈希函数接受数字和字母的输入字符串(字面意思是任意字符串的随机字母,数字和/或符号),并将其转换为由随机字母和数字组成的新的32位字符串。这个32位数字符串是哈希输出。如果输入字符串中的任何数字或字母发生更改,则哈希输出也将随机更改。但是,相同的输入字符串将始终提供相同的输出字符串。
现在考虑块内的数据作为哈希输入(一串数据)。当对此输入进行哈希处理时,它会提供哈希输出(32位数字符串)。比特币区块链的一个规则是该输出字符串需要以连续数量的零开始,以便有资格作为块签名。这是每个矿工在尝试向区块链添加区块时所寻找的东西;以一定量零开始的输出字符串。但是如果块的数据字符串没有哈希到以零的数量开头的输出字符串中呢?好吧,这就是为什么矿工们反复更改其块内的一部分数据,称为nonce。由于随机数会一直在变化,因此哈希函数的输入数据也会发生变化,从而导致不同的哈希输出。最终,矿工希望找到一个输入字符串(块数据和字符串的字符串),这些字符串哈希为符合条件的输出字符串(以零的数量开头)。下面的例子使用七个零,但这个零的数量实际上取决于区块链的区块难度。如果你还没准备好,请不要点击它。
这就是矿工们需要找到符合条件的签名的方式,这也是解决这个数学问题需要如此大的计算能力的原因。猜测这么多不同的nonce需要花费大量的时间和计算能力。如果你顺利完成了很好的工作,现在让我们继续前进到第5步。
注意:此过程实际上并未定义为数学问题,而是定义为确定性事项——计算机正在对数字执行预定操作以查看输出是否合乎需要。
矿工首先为其区块找到符合条件的签名(解决方案),将此签名广播给所有其他矿工。
其他矿工现在验证该解决方案是否与发件人块的问题相对应(如果哈希输入实际上导致该签名)。如果有效,其他矿工将确认解决方案并同意该块可以添加到区块链中。这就是“工作量证明”定义的来源。找到解决方案的矿工将其“工作量证明”(又称解决方案)发送给其他矿工,然后他们将验证解决方案是否合法。如果是,那么其他矿工将同意并且就区块链达成“共识”。现在可以将块添加到区块链中,并将其广播到网络上的所有其他节点及其签名。只要块内的交易与该时间点的当前钱包余额(交易历史)正确对应,其他节点将接受该块并将其保存到其交易数据中。
如果大多数矿工达成共识,则块被添加到区块链中。每次在此块的顶部添加另一个块时,它将被视为其下方块的另一个“确认”。例如,如果我的交易包括在块502中,并且区块链是507个区块长,则意味着我的交易有5个确认(507-502)。这也是Etherscan在向你展示交易详情时所指的内容。你的交易确认越多,攻击者就越难以改变它。当新区块被添加到区块链时,所有矿工将不得不在第3步重新开始,形成一个新的交易区块。矿工们不能继续(好吧,他们可以,但这是无关紧要的)采矿也解决了他们正在研究的区块问题,原因有两个。
这就是它成为区块链的原因。如果矿工继续挖掘他们已经在处理的块,其他矿工会注意到哈希输出与区块链上最新添加的块的输出不对应,因此将拒绝该块。
======================================================================
分享一些以太坊、EOS、比特币等区块链相关的交互式在线编程实战教程:
- java以太坊开发教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。
- python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。
- php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和交易等内容。
- 以太坊入门教程,主要介绍智能合约与dapp应用开发,适合入门。
- 以太坊开发进阶教程,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
- C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器和交易等。
- EOS教程,本课程帮助你快速入门EOS区块链去中心化应用的开发,内容涵盖EOS工具链、账户与钱包、发行代币、智能合约开发与部署、使用代码与智能合约交互等核心知识点,最后综合运用各知识点完成一个便签DApp的开发。
- java比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Java代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Java工程师不可多得的比特币开发学习课程。
- php比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Php代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习课程。
- tendermint区块链开发详解,本课程适合希望使用tendermint进行区块链开发的工程师,课程内容即包括tendermint应用开发模型中的核心概念,例如ABCI接口、默克尔树、多版本状态库等,也包括代币发行等丰富的实操代码,是go语言工程师快速入门区块链开发的最佳选择。
汇智网原创翻译,转载请标明出处。这里是原文区块链矿工如何以七个步骤处理挖掘工作并进行交易