你为什么写这篇文章?最近看了很多讲解区块链的文章,发现很多文章要么过于概念化,要么讲一些应用前景和行业判断,要么过于专业晦涩,让很多没有技术背景的小伙伴很难真正了解区块链技术。基于以上原因,我希望通过一个比特币交易的完整生命周期来解释比特币中的区块链技术。在这样一个特定的过程场景中,我相信会更容易理解区块链。
基础知识:
区块链不等于比特币,区块链只是比特币系统用来记录交易信息的账本;比特币没有账户余额的概念。所有交易只记录资金的来源和去向。所谓账户余额,就是在区块链中计算出来的结果;挖矿奖励是维护整个系统的奖励,鼓励人们利用自己设备的计算能力资源,共同验证每笔交易的有效性;
交易的完整过程:从创建新交易到创建新区块,假设比特币交易A一旦创建,其生命周期就开始了。随后,交易A将被一个或多个签名加密(这些签名用于表明交易A中的资金流动是资金所有者所允许的)。然后,交易A被广播到比特币网络,相邻的2-3个节点最快接收到广播信息。这些节点都会参与验证交易,同时在网络中再次广播交易,直到交易A被网络中的大部分节点接收到(所有下载比特币客户端的设备都可能成为这样的节点)。
最后,事务A由参与挖掘的节点验证。事务A与其他最近创建的事务一起打包到块B中,并添加到区块链中。此时,整个区块链被扩展,并增加了一个新的B区。B块被“确认”6次以上就被认为是不可撤销的,因为取消和重建6个块需要巨大的计算量,交易打包在一起放入块时需要巨大的计算量来证明,而验证已经证明只需要很小的计算量。
我们简单地将上述交易过程描述细分为以下六个步骤:
生成新的交易签名,加密交易,在比特币网络中传播和整合交易,构建新的区块,挖掘新的区块并将其连接到区块。我们将详细分析六个交易步骤的具体细节以及所采用的底层技术。在解释每个步骤和具体概念的时候,我会举适当的例子来帮助你理解。如果你还是不明白,那一定是你读得太快了.
隔壁老王想把钱包里的一个比特币转给老张时,交易是用老王的钱包构造的。
把一个比特币交易理解成一张纸质支票,对我们是有帮助的。比特币交易是一种以转账为目的的工具,就像收款人或持有人拿着支票去银行,银行会无条件支付指定金额。并且交易的发起者不一定是签署交易的人。
任何在线或离线的人都可以创建比特币交易,即使创建交易的人不是该账户的授权签署人。就像这种企业里秘书写的支票(发起交易),需要等老板签字交易(数字签名)。
为了更深入地理解“新事务构造”的一些细节,有四个概念需要理解:
UTXO交易输出交易输入交易费用
UTXOUTXO很容易理解为一个账户的余额。它是比特币交易的基本单位,也是一个未使用的交易输出,未用交易输出(简称UTXO),“未用交易输出”。UTXO无法细分。一个UTXO可以是1“丛”的任意倍数。就像美元可以细分为“美分”一样,“美分”是不能细分的。UTXO在区块链被记录,比特币网络以百万计监控所有可用的UTXO。
假设隔壁老王此时拥有1.9比特币。当隔壁的法老收到0.1比特币时,这个数额在区块链被记录为UTXO。现在老王拥有的2个比特币也是以UTXO的形式分布在数百笔交易和数百个区块中。其实比特币的地址或者账户余额都没有地方存放,只有老王(主人)锁着的零散的UTXO。
所以“隔壁老王的比特币余额”这个概念就是通过扫描区块链,聚合所有属于用户的UTXO,来计算用户的余额。
交易的输出一个比特币交易是一个有输入值和输出值的数据结构,包含了从起始地址(输入)向目标地址(输出)转移一笔钱的代码信息:版本规则、输入数量、输出数量和时间戳。
每一次比特币交易都会产生一个输出,这个输出会被比特币的账本记录下来。所有的输出都能创造出一定数量的比特币(也就是UTXO),可以用于支付。这些UTXO记录将被全网认可,其拥有者可以在以后的交易中使用。给隔壁老王送比特币,其实就是在创造一个新的UTXO,可以被他用来进行新的支付。
事务输入是指向UTXO的指针。当用户支付时,他的钱包通过选择可用的UTXO来构建交易。
比如隔壁老王想支付0.015的比特币,他的钱包应用会选择一个0.01的UTXO和一个0.005的UTXO,相加得到想要的支付金额。
交易费用大部分交易都包含交易费用,这是在网络安全方面对比特币矿工的补偿。大部分钱包都是自动计算并包含在交易费用中的,交易费用是由挖掘出这一块的矿工获得,并记录在本次交易的区块链中。交易数据结构中没有交易手续费字段,也就是说不能从交易信息中直接看到交易手续费金额。
比如隔壁老王想花0.015比特币,他愿意支付0.001比特币作为自己交易被矿工优先的交易费用。那么法老的钱包至少需要整合来自区块链记录的0.016比特币UTXO。假设他的钱包里有0.2个比特币的UTXO可用,那么这个新交易将产生0.2个比特币的输入和两个输出:一个是0.015个比特币的消费金额支付到目标地址,另一个0.184个比特币的输出作为零钱支付老王的钱包地址,其中0.001个比特币没有分配,这是“隐藏”的交易费用。
值得注意的是:必须明确0.184比特币是指向老王自己钱包的输出,这样零钱才会有效“返还”到老王的钱包里,否则0.184比特币也会变成交易费,矿工们就会去挖这个惊喜“红包”。
02签名加密比特币交易一旦创建,将由资金所有人(可能有多个所有人)签名。如果它是合法创建和签署的,则交易现在是有效的。它包含资金转账所需的所有信息。用户的私钥用于生成支付比特币所需的签名,以证明资金的所有权。这样的签名加密是为了保证交易内容不被篡改。这和前面介绍的纸质支票的授权签名效果是一样的。
网络中的节点收到交易信息后,会对交易的合法性进行校验,资金所有人的签名加密是重要的校验依据。所有检查通过后,该交易将被标记为合法未确认,并在网络中广播。
为了更深入地理解“签名加密”的一些细节,需要理解四个概念:
私钥公钥钱包交易脚本
私钥比特币钱包包含一系列密钥对,每个密钥对包括一个私钥和一个公钥。私钥是一个数字,通常是随机生成的。对一个比特币地址内所有资金的控制取决于对相应私钥的所有权和控制权。私钥一定要保密,因为一旦泄露,就相当于比特币在这个私钥的保护下丢失了。
通过从加密安全的随机源中获取一串随机字节,并使用SHA256哈希算法对其进行操作,可以生成一个256位的数字,并且该数字可以用作私钥。以十六进制格式表示随机生成的私钥,即:
1e 99423 a4 ed 27608 a 15 a 2616 a2 b 0 e 9e 52 ced 330 AC 530 edcc 32 c8 ffc 6a 526 aedd
公钥可以通过椭圆曲线算法从私钥计算出来,这是一个不可逆的过程。公钥通过单向密码哈希算法生成的比特币地址以数字“1”开头,比特币地址是交易中收款人的地址。
钱包比特币钱包是私钥的容器。钱包只包含私钥而不包含比特币,每个用户都有一个包含多个私钥的钱包。钱包包含成对的私钥和公钥,用户用它们来签署交易。
一种常见且典型的钱包是使用“助记词汇表”作为种子来生成私钥的钱包。这样的单词序列可以重新创建种子,并重新创建钱包和所有私钥。第一次创建钱包时,带有助记码的钱包应用会生成12到24个单词给用户,单词的顺序就是钱包的备份。
交易脚本交易脚本是检查交易是否合法的核心机制。通常,每个事务将包括两个脚本:输出脚本scriptPubKey和输入脚本scriptSig。
输出脚本一般由付款方设置锁定交易,用于控制收款方的权限,比如限制一个公钥(比特币地址)的所有者消费交易。
输入脚本(签名脚本)往往包含由用户私钥生成的数字签名,以证明其能够满足交易输出脚本的锁定条件,即交易中比特币资金的所有权。
值得注意的是,比特币交易的输入输出不仅仅是简单的对应付款人的私钥和收款人的公钥地址,还包含了更多的内容。可以通过脚本直接验证交易的有效性,实现了更复杂的交易方式,比如“多重签名脚本”,保证输出只有在用户和第三方钱包共同签名后才能使用,从而保证黑客攻击第三方钱包后无法花光用户的比特币。
03比特币网络中传播的交易一笔交易需要传输到比特币网络中,才能传播并加入区块链。一个比特币交易只有300到400字节的数据。一旦交易被发送到连接到比特币网络的任何节点,交易将被该节点验证。如果该事务被验证为有效,则该节点将该事务传播到连接到该节点的其他节点。
无论交易是否通过节点验证,交易发起方都会收到一条回执消息,其中包含交易是否被接受的返回信息。几秒钟后,一个有效的事务将在网络中呈指数级传播,直到连接到网络的所有节点都收到它。
值得注意的是,每个节点在传播每个事务之前进行独立的验证。因此,一个异常事务只能到达一个节点。因此,比特币网络可以有效抵御入侵,避免垃圾邮件和有效的拒绝服务攻击。
为了更深入地理解“交易沟通”的一些细节,有四个概念需要理解:
客户端完整节点轻型节点(SPV)节点挖掘节点
客户端bitcoin.org可以下载标准客户端,即比特币核心,也称为“中本聪客户端”。包含了比特币系统的所有内容:钱包功能、完整的交易账本副本(区块链)、交易确认引擎、P2P比特币网络中的一个完整的网络节点。
完整节点保存完整且最新的区块链副本的节点称为“完整节点”。一个完整的节点可以独立检查所有的交易,不需要任何外部参考。
轻量级节点/SPV节点只保留一部分区块链,通过一种叫做简单支付验证(SPV)的方式完成交易验证的节点称为SPV节点,也叫轻量级节点。越来越多的用户钱包是SPV节点,尤其是运行在智能手机等资源受限的设备上。这些设备没有空间来存储完整的150G区块链。
挖掘节点挖掘节点通过在特殊硬件设备上运行的工作负载证明算法,以竞争方式创建新块。一些挖掘节点也是完整节点,保留区块链的完整副本;还有一些参与矿池挖掘的节点是轻量级节点,它们必须依靠矿池服务器维护的整个节点来工作。
在整合交易以构建新的块来验证交易之后,每个比特币网络节点会将这些交易添加到自己的内存池中,该内存池也称为交易池,用于临时存储尚未添加到块中的交易记录。除了收集和验证事务之外,挖掘节点还将这些事务打包到候选块中。
挖掘节点需要为内存池中的每个事务分配一个优先级,选择优先级较高的事务记录来构建候选块。在块被填满之后,内存池中剩余的事务将成为下一个块的候选事务。例如,一个挖掘节点整合了内存池中的所有事务,新的候选块包含418个事务,总矿工费为0.09094925比特币。
既然已经创建了包含418个事务的候选块,挖掘节点就可以使用它进行挖掘了。
为了更深入地理解“集成交易”的一些细节,需要理解四个概念:
临时未验证事务池事务优先级块结构矿池
临时未确认交易池比特币网络中几乎每个节点都维护一个未确认交易的临时列表,这个列表被称为内存池或交易池。节点使用该池来跟踪和记录网络已知但不包括在区块链中的事务。交易池存储在本地内存中,而不是硬盘中,因此不同节点的两个池的内容可能会有很大不同。
事务优先级挖掘节点需要为内存池中的每个事务分配一个优先级,并选择优先级较高的事务记录来构建候选块。事务的优先级由UTXO的事务创建时间决定,事务输入值高且创建时间早的事务比输入值新且小的事务优先级高。
用于存储块中事务的前50K字节保留给更高优先级的事务。如果块中有足够的空间,高优先级事务将不需要矿工费用。矿工费越高,交易优先级越高。
块结构块是聚集事务信息容器的数据结构。它由块头和块体组成。块头80字节,平均每个事务至少250字节,每个块平均包含至少500个以上的事务。
块头包含三组元数据:
用于连接先前块并从父块的哈希值索引的数据;挖掘难度、Nonce(工作量证明算法的计数器)、时间戳;Merkle(默克尔)根数据,可以汇总并快速汇总验证块中的所有事务数据。
矿池改变了原来挖矿奖励由一个获胜矿工单独获得的状态,采用团队合作模式集中计算力进行挖矿,输出数字货币按计算力进行分配。
采矿成为了一项团队运动,2010年12月16日,一群矿工在雪泥矿池中一起挖掘出了第一块石头。根据他们贡献的工作量,每个矿工都得到了相应的报酬。随后的两个月,slush mine池的计算能力从1400 hash/s提升到60 g hash/s。
05挖掘现在已经创建了候选块,挖掘节点准备使用它来进行挖掘。矿工们比赛完成一个基于加密哈希算法的数学问题,获胜者有权在区块链记录交易并获得奖励。每隔10分钟左右就会生成一个大小不超过1 MB的新块,这个块记录了这10分钟内发生和验证的交易。矿工在采矿的过程中会获得两种奖励:创造新区块的新货币奖励和区块中包含的交易的交易费。
一旦一个挖掘节点在功率竞争中获胜,首先得到数学问题的答案,它会立即将这个块发送给它所有的邻居节点。在接收并独立验证这个新块之后,这些节点将继续传播这个块,并且每个节点将把它作为新块添加到它自己的区块链副本。
为了更深入地理解“确认交易”的一些细节,有三个概念需要理解:
造币交易工作量证书比特币基地奖励和矿工费
工作量证明工作的证据,并通过计算猜测一个nonce。具体到比特币,矿工必须在满足全网难度的同时,解决SHA256算法。优先完成工作量证书的矿工可以获得比特币奖励。确保在一段时间内只有少数法律提案可以出现在系统中。
哈希问题是不可逆的,只有暴力计算才能找到答案。一旦得到满足要求的nonce,说明相应的计算能力是按概率支付的。谁的计算能力更强,谁就更有可能先解决问题。
造币交易块中的第一个交易是一个特殊的交易,称为造币交易或比特币基地交易,由挖矿节点构造,用于奖励挖矿者做出的贡献。
造币交易的输入:造币交易与其他交易的区别在于,交易输入没有UTXO,也没有“输入脚本”。这个字段被比特币基地数据取代,矿工可以使用比特币基地的其他地方,随意填写除了前几个字节以外的任何数据。因此,中本聪在创世街区比特币基地填写了“Times 03/Jan/2009银行二次救助渠道”等数据。造币交易的产出:由挖矿获胜的矿工将造币奖励和矿工费支付到自己的比特币钱包地址而建立。
比特币基地奖励和矿工费矿工在采矿的过程中会获得两种奖励:创造新区块的新硬币和区块中包含的交易的交易费。比特币的货币是挖矿发行的,每四年减少一半。2009年1月,每个街区奖励50个比特币。到2012年11月,每块奖励25个比特币减半。现在,每一个新的区块奖励12.5个比特币。比特币挖矿的奖励呈指数级递减,直到2140年所有比特币发行完毕,不再产生新的比特币。
比如老王隔壁的挖矿节点构造了一个造币交易,付给自己12.59094928个比特币,其中12.5个比特币是比特币基地奖励,0.09094928个比特币是矿工费。
06新块连接区块链比特币交易生命周期的最后一步是将新块连接到工作量证明最大的链。一旦节点验证了新的块,它将尝试将新的块连接到现有的区块链并组装它。
节点维护三种块:第一种是连接到主链的块,第二种是从主链分支的块(备用链),最后一种是在已知链中找不到已知父块。在验证过程中,一旦发现不符合标准的东西,验证就会失败,该块就会被节点拒绝,不加入任何链。
如果一个节点接收到一个有效块,但是在现有的区块链中没有找到它的父块,那么这个块被认为是“孤立块”。孤儿被保留在孤儿池中,直到它们的父块被节点接收。
每个节点总是选择并试图扩展代表累积最大工作量证明的区块链,即最长或最长的累积难度链。只要所有节点选择累计难度最长的区块链,整个比特币网络最终会收敛到一致状态。
为了更深入地理解“连接到链上的新块”的一些细节,需要理解四个概念:
创编板块的难度目标和难度调整;区块链分叉区块浏览器
创造街区区块链的第一个街区建于2009年,被称为创造街区。它是区块链中所有区块的共同祖先,这意味着你将从任何区块往回走,并沿着这条链走,最终你将到达创造区块。
创世块的哈希值为:000000000019d 6689 c 085 AE 165831 e 934 ff 763 AE 46 a 2 a 6 c 172 B3 f1 b 60 A8 c 26 f。
在区块浏览网站(blockchain.info)搜索区块哈希值,会发现这个哈希值描述了这个区块内容的页面:
难度目标和难度调整平均每10分钟生成一个比特币块。这是比特币货币发行速度和交易完成速度的基础,必须永远不变。随着技术的发展,计算机的性能将会迅速提高。此外,参与挖掘的人和计算机也会不断变化。为了保持每10分钟产生一个新块的速度,挖掘的难度必须根据这些变化进行调整。
2009年12月30日,比特币挖矿难度首次提高。寻找一个比特币块需要全网10分钟处理,每找到2016块会根据前2016块的完成时间调整难度。
新难度=旧难度*(最后2016块的实际时间/20160分钟)
当两个矿工在短时间内完成工作量证明解时,区块链出现了分叉。两个矿工一在各自的候选块中找到解,就立刻把自己的“获胜”块传播到网络,先传播到邻居节点,再传播到整个网络。
因为每个矿工的块数据不一样,他们解题得到的结果也不一样,都是正确答案,只是块不一样。区块链此时此刻,有两个不同的区块都符合要求。不同的矿工依次看到这两个区块。通常,矿工会先复制他们看到的区块,然后在这个区块开始新的采矿工作。这时,分叉就发生了。
从分叉块来看,由于分叉链上矿工的数量不同,计算力也不同,两条链的增长速度也不同。总有一条链条比另一条长。当矿工发现整个网络中存在更长的链时,他会放弃自己当前的分叉链,在更长的主链上继续挖掘。
区块链浏览器用户想要浏览区块链信息,他们必须使用区块链浏览器。每个块中记录的内容可以从区块链浏览器中查看。区块链浏览器可以说是浏览区块链信息的主要窗口。
以太坊的块浏览器如下图所示:
得出比特币挖矿通过人性解决了区块链维护的问题,这也解释了为什么比特币系统能稳定运行8年,让比特币成为区块链技术这么多应用中最有活力的一个。中本聪对人性的利用,使得人们在开采利润的过程中能够维持这一系统的运转。但是矿机的出现使得比特币的去中心化并不完善,所以比特币的创新和改进从未停止。如果想了解更多,可以看我上一篇文章《一篇文章,看透500多种数字货币哪些是真正有价值的技术创新》,介绍如何进一步解决矿机对整个区块链网络的影响。
对区块链技术的深刻理解