比特币原理交易挖矿原理全解析

网上很多人分析了一堆,但是具体的交易流程,具体怎么工作的,很少有人分析清楚,现在我力求把这个过程说清楚,这个更适合技术人员查看,没有废话

交易挖矿整体流程

比特币原理交易挖矿原理全解析_第1张图片

  1. 交易者用钱包客户端生成交易
  2. 然后选择一个自有节点或者公共节点peerA将自己的交易发送过去
  3. peerA获取到交易信息之后,进行一长串的验证,验证通过之后,加入本地的未确认交易池,而且广播到与之连接的所有节点peerB,peerC
  4. peerB和peerC接收到交易之后,进行验证,通过之后,加入到交易池中,同时判断交易池中交易数量是否超过1000,超过就按照交易池中的交易hash,批量获取所有的完整交易数据。同时,验证通过的交易会继续广播到与之相连的所有的节点,转瞬之间,交易就会传播到所有节点
  5. 拿到所有交易数据之后,从交易池中选取一部分交易组成一个新的区块。在区块头中添加一个32bit的随机数Nonce,范围0~2^32,不断的更改随机数,同时需要改变创币交易中的附带消息,让merkle root也发生变化,以便最终的区块hash低于难度目标值(例如0xb4796ec3),一旦完成挖矿,将本区块链接到本地链的最后,然后将这个区块发给与之相连的所有节点
  6. peerB接收到这个新区块,立即停止自身的挖矿工作,然后验证这个新区块是否合法,如果合法,并且本地链没有此区块,添加到自己的链中,并且将此区块转发给自己相连的所有节点,例如peerA

生成交易

  • UTXO
  • 交易输出
  • 交易输入
  • 交易费
  • 签名加密

UTXO

UTXO易于理解的说就像是账户的余额。它是比特币交易的基本单位,是未经使用的一个交易输出,Unspent Transaction Output,简称UTXO,“未花费的交易输出”。UTXO不能再分割,1 个UTXO可以是 1“聪” 的任意倍,就像美元可以被分割成“美分”一样,“分”就不可以再分割了。UTXO被记录于区块链中,比特币网络监测着以百万为单位的所有可用的UTXO。

假设此时glowd拥有 2 比特币,当glowd接收到 0.3 比特币时,这个金额被当作UTXO记录到区块链里,现在glowd一共拥有的 2.3 比特币,同样都被当作UTXO分散到数百个交易和数百个区块中。实际上,并不存在一个储存比特币的地址或账户余额的地方,只有被glowd(所有者)锁住的、分散的UTXO。

因此,“glowd的比特币余额”这个概念,是通过扫描区块链并聚合所有属于该用户的UTXO来计算该用户的余额。

交易输出

一笔比特币交易是一个含有输入值和输出值的数据结构,其中包含了将一笔资金从初始地址(输入)转移至目标地址(输出)的代码信息:版本规则、输入&其数量、输出&其数量、时间戳。

每一笔比特币交易创造输出,输出都会被比特币账簿记录下来。所有的输出都能创造一定数量的可用于支付的比特币(也就是UTXO)。这些UTXO会被整个网络所识别记录,其所有者可在未来的交易中使用它们。发送比特币实际上是创造新的UTXO,并且能被用于新的支付。

交易输入

交易输入是指向UTXO的指针,当用户付款时,他的钱包通过选择可用的UTXO来构造一笔交易。

例如:想要支付0.015比特币,钱包应用会选择一个 0.01 UTXO和一个 0.005 UTXO,使用它们加在一起来得到想要的付款金额作为交易输入

交易费

大多数交易包含交易费,这是给比特币矿工一种激励。大多数钱包自动计算并计入交易费,交易费被挖出这个区块的矿工得到,并且记录在这个交易的区块链中。交易的数据结构没有交易费的字段,意味着你无法从交易信息中直接看到交易费的金额。

例如:glowd想要支付0.25比特币,为了自己的交易被矿工优先处理,他愿意支付0.01比特币作为交易费,那么钱包至少需要从区块链记录中整合至少0.26比特币的UTXO。假设他的钱包有一个1比特币的UTXO可用,那么这笔新的交易就会产生一个1比特币的输入,和两个输出:一个是0.25比特币的消费金额被支付给目标地址,另一个0.74比特币的输出作为找零支付给glowd的钱包地址,其中有0.01比特币未分配,就是“隐藏的”交易费用。

值得说明的是:一定要定义清楚0.74比特币是一个指向自己钱包的输出,这样找零才会有效“退回”给glowd的钱包,否则0.74比特币也都将成为交易费,被矿工挖到这份惊喜的“红包”。

签名加密

一笔比特币交易一旦被创建,它就会被资金所有者(可能存在多位所有者)签名。如果它是合法创建并签名的,则该笔交易现在就是有效的。它包含资金转移时所需要的所有信息。用户的私钥用于生成支付比特币所必需的签名,来证明资金的所有权,这样的签名加密是为了确保交易内容不被篡改。

网络中节点收到交易信息后,会对交易的合法性进行检查,资金所有者的签名加密是重要的验证依据,检查都通过后,则将交易标记为合法的未确认交易,才会在网络中进行广播。

私钥

一个比特币钱包中包含一系列的密钥对,每个密钥对包括一个私钥和一个公钥。私钥是一个数字,通常是随机产生的。一个比特币地址中的所有资金的控制取决于相应私钥的所有权和控制权。私钥必须保密,因为一旦被泄露,相当于该私钥保护下比特币也就丢失了。

通过在一个密码学安全的随机源中取出一串随机字节,对其使用SHA256哈希算法进行运算,生成了一个256位的数字,这样的一个数字就可以作为私钥。以十六进制格式表示一个随机生成的私钥,即:

DEA94FBC4ED27612315A2616A2B0E9E52CED330AC530EDCB32C8FFC6A526AEDD

公钥

比特币原理交易挖矿原理全解析_第2张图片

通过椭圆曲线算法可以从私钥计算得到公钥,这是不可逆转的过程。由公钥经过单向的加密哈希算法生成的比特币地址以数字“1”开头,在交易中比特币地址就是收款人的地址。比特币地址时使用的算法是Secure Hash Algorithm (SHA)和the RACE Integ rity Primitives Evaluation Message Digest (RIPEMD),具体一点说就是SHA256和RIPEMD160。

以公钥K为输入,计算其SHA256哈希,然后再计算RIPEMD160哈希,所得到的160位(20字节)的数字就是比特币地址。

A = RIPEMD160(SHA256(K))  //其中K是公钥,A是比特币地址

peerA进行验证交易

  • 交易的语法和数据结构必须正确。
  • 输入与输出列表都不能为空。
  • 交易的字节大小是小于MAX_BLOCK_SIZE的。
  • 每一个输出值,以及总量,必须在规定值的范围内 (小于2,100万个币,大于0)。
  • 没有哈希等于0,N等于-1的输入
  • 交易的字节大小是大于或等于100的
  • 交易中的签名数量应小于签名操作数量上限。
  • 池中或位于主分支区块中的一个匹配交易必须是存在的。
  • 对于每一个输入,如果引用的输出存在于池中任何的交易,该交易将被拒绝(避免双花)
  • 对于每一个输入,在主分支和交易池中寻找引用的输出交易。如果输出交易缺少任何一个输入,该交易将成为一个孤立的交易。如果与其匹配的交易还没有出现在池中,那么将被加入到孤立交易池中。
  • 对于每一个输入,如果引用的输出交易是一个coinbase输出,该输入必须至少获得COINBASE_MATURITY (100)个确认。
  • 对于每一个输入,引用的输出是必须存在的,并且没有被花费。
  • 使用引用的输出交易获得输入值,并检查每一个输入值和总值是否在规定值的范围内 (小于2100万个币,大于0)。
  • 如果输入值的总和小于输出值的总和,交易将被中止。
  • 如果交易费用太低以至于无法进入一个空的区块,交易将被拒绝。
  • 每一个输入的解锁脚本必须依据相应输出的锁定脚本来验证。

peerA广播交易Hash

  • peerA会广播交易Hash到所有与之相连的peer节点上
  • peerA的这个交易并不保证广播到比特币网络的所有节点。只要到达足够多的节点,那么没多久这些交易就会被打包进一个区块。区块广播也容许一些消息被丢弃。如果一个节点并未接收到某个区块,那么这个节点会在它接收到下一个区块的时候意识到自己错失了之前的区块,因此会发出补充那个遗失区块的请求。

peerC选择交易组成新区块 参阅

比特币原理交易挖矿原理全解析_第3张图片

节点需要为交易池中的每笔交易分配一个优先级,并选择较高优先级的交易记录来构建候选区块。交易的优先级是由交易输入所花费的UTXO的“块龄”(币在块中存在的时间,转账频繁在块中的时间就会越短)决定,交易输入值高、“块龄”大的交易比那些新的、输入值小的交易拥有更高的优先级。如果区块中有足够的空间,高优先级的交易行为将不需要矿工费。数额越大、币龄越高优先级越高。数额较小或刚开采出来不久,转账就不免费。
交易的优先级是通过输入值和输入的“块龄”乘积之和除以交易的总长度得到的:

Priority = Sum (Value of input * Input Age) / Transaction Size

Priority<0.576就要付费,btc提现时候都要加一个0.0001.
在这个等式中,交易输入的值是由比特币单位“聪”(1亿分之1个比特币)来表示的。UTXO的“块龄”是自该UTXO被记录到区块链为止所经历过的区块数,即这个UTXO在区块链中的深度。交易记录的大小由字节来表示。

一个交易想要成为“较高优先级”,需满足的条件:优先值大于57,600,000,相当于一个比特币(即1亿聪),年龄为一天(144个区块),交易的大小为250个字节:

High Priority > 100,000,000 satoshis * 144 blocks / 250 bytes = 57,600,000

区块中用来存储交易的前50K字节(1/20 * 1M)是保留给较高优先级交易的。节点在填充这50K字节的时候,会优先考虑这些最高优先级的交易,不管它们是否包含了矿工费。这种机制使得高优先级交易即便是零矿工费,也可以优先被处理。

然后,挖矿节点会选出那些包含最小矿工费的交易,并按照“每千字节矿工费”进行排序,优先选择矿工费高的交易来填充剩下的区块,区块大小上限为MAX_BLOCK_SIZE=1M。

如区块中仍有剩余空间,挖矿节点可以选择那些不含矿工费的交易。有些矿工会竭尽全力将那些不含矿工费的交易整合到区块中,而其他矿工也许会选择忽略这些交易。

在区块被填满后,内存池中的剩余交易会成为下一个区块的候选交易。因为这些交易还留在内存池中,所以随着新的区块被加到链上,这些交易输入时所引用UTXO的深度(即交易“块龄”)也会随着变大。由于交易的优先值取决于它交易输入的“块龄”,所以这个交易的优先值也就随之增长了。最后,一个零矿工费交易的优先值就有可能会满足高优先级的门槛,被免费地打包进区块。

比特币交易中没有过期、超时的概念,一笔交易现在有效,那么它就永远有效。然而,如果一笔交易只在全网广播了一次,那么它只会保存在一个挖矿节点的内存中。因为内存池是以未持久化的方式保存在挖矿节点存储器中的,所以一旦这个节点重新启动,内存池中的数据就会被完全擦除。而且,即便一笔有效交易被传播到了全网,如果它长时间未处理,它将从挖矿节点的内存池中消失。如果交易本应该在一段时间内被处理而实际没有,那么钱包软件应该重新发送交易或重新支付更高的矿工费。

区块

比特币原理交易挖矿原理全解析_第4张图片
1个区块最大1M空间,区块头80字节

  • version 版本号,4个字节,跟随比特币客户端而定的,一段时间内不会改变。即使要改变,也会有比特币的核心开发人员来协调升级策略,这个可以理解为一个静态常数。
  • previous_block_hash 前一区块的摘要,32个字节
  • merkle_root 默克尔树的根,32个字节
  • time 区块生成时间,4个字节,一般是打包时的时间查阅
  • bits 难度目标,是一个数字,4个字节,参考上两周产生的区块的平均生成时间而定的,软件会计算最新的2016个区块生成的时间,然后做对比,随之调整难度
  • nonce 随机数,4个字节,这个数字可以变化,而且要从0试到最大值。直到最后出现的hash结果,其数字必须低于难度目标值。不过以现在的计算机算力,这个数字用不了一秒就把全部的变化可能计算完了,所以还需要改变区块内部的创币交易中的附带消息,这样就让merkle root也发生了变化,从而有更多的可能去找到符合要求的nonce

回收磁盘空间Merkle 树

如果一枚硬币最近发生的交易发生在足够多的区块之前,那么,这笔交易之前该硬币的花销交易记录可以被丢弃 —— 目的是为了节省磁盘空间。为了在不破坏该区块的哈希的前提下实现此功能,交易记录的哈希将被纳入一个 Merkle 树[7、2、5]之中,而只有树根被纳入该区块的哈希之中。通过砍掉树枝方法,老区块即可被压缩。内部的哈希并不需要被保存。

一个没有任何交易记录的区块头大约是 80 个字节。假设每十分钟产生一个区块,80 字节乘以 6 乘以 24 乘以 365,等于每年 4.2M。截止 2008 年,大多数在售的计算机配有 2GB 内存,而按照摩尔定律的预测,每年会增加 1.2 GB,即便是区块头必须存储在内存之中也不会是什么问题。

区块生成

通过创造出新区块,比特币以一个确定的但不断减慢的速率被发行。大约每十分钟产生一个新区块,每一个新区块都伴随着一定数量从无到有的全新比特币。每开采210,000个块,大约耗时4年,货币发行速率降低50%。
在2016年的某个时刻,在第420,000个区块被“挖掘”出来之后降低到12.5比特币/区块。在第13,230,000个区块(大概在2137年被挖出)之前,新币的发行速度会以指数形式进行64次“二等分”。到那时每区块发行比特币数量变为比特币的最小货币单位——1聪。最终,在经过1,344万个区块之后,所有的共20,999,999.9769亿聪比特币将全部发行完毕。换句话说,到2140年左右,会存在接近2,100万比特币。在那之后,新的区块不再包含比特币奖励,矿工的收益全部来自交易费。

创世区块

区块中的第一笔交易是笔特殊交易,称为创币交易或者Coinbase交易

创币交易的输入:创币交易于其他交易的不同点在于其交易输入没有UTXO,也没有“输入脚本”。这个字段被Coinbase数据替代,除开始的几个字节外,矿工可以任意使用Coinbase的其他部分,随意填充任何数据。因此,中本聪在创世区块的Coinbase中填入了这样的数据 “The Times 03/Jan/ 2009 Chancellor on brink of secondbailout for banks”。

区块链里的第一个区块创建于2009年,被称为创世区块。它是区块链里面所有区块的共同祖先,这意味着你从任一区块,循链向后回溯,最终都将到达创世区块。

创世区块的哈希值为:000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f

矿工

矿工是指设置为挖矿状态的节点(查阅比特币节点),处于挖矿状态的节点需要贡献算力,可能获取到写入区块的权利,从而获取比特币。

比特币的链要想正常生长,理论上只要有一个节点处于挖矿状态即可。实际上维护比特币网络长期正常运行需要多个挖矿节点,保持链正常生长。多个节点处于挖矿状态时,则多个节点竞争写区块的权利,每个区块的生成具有随机性,但是贡献工作量/算力大小决定了你获取权利的概率。

难度调整

比特币的区块平均每10分钟生成一个。这就是比特币货币发行速率和交易达成速度的基础,必须始终保持恒定。随着技术发展,计算机性能将飞速提升。此外,参与挖矿的人和计算机也会不断变化。为了能让新区块的保持10分钟一个的产生速率,挖矿的难度必须根据这些变化进行调整。

2009年12月30日,比特币挖矿难度首次增长。寻找一个比特币区块需要整个网络花费大约10分钟来处理,每发现2,016个区块时会根据前2,016个区块完成的时间对难度进行调整。

New Difficulty = Old Difficulty * (Actual Time of Last 2016 Blocks / 20160 minutes)

区块链的分叉

分叉发生在两名矿工在较短的时间内,各自都算得了工作量证明解的时候。两个矿工在各自的候选区块一发现解,便立即传播自己的“获胜”区块到网络中,先是传播给邻近的节点而后传播到整个网络。

由于每个矿工的区块数据都不一样,所以他们解题得出的结果也是不一样的,都是正确答案,只是区块不同。区块链在这个时刻,出现了两个都满足要求的不同区块。不同的矿工看到这两个区块是有先后顺序的,通常情况下,矿工们会把自己先看到的区块复制过来,然后接着在这个区块开始新的挖矿工作。这时分叉就产生了。

从分叉的区块起,由于分叉的链上矿工的数量不同,因此算力也有差别,两条链的增长速度也是不一样的,总有一条链的长度要超过另一条。当矿工发现全网有一条更长的链时,他就会抛弃他当前分叉的链,而继续在更长的主链上进行挖矿工作。

你可能感兴趣的:(BTC,区块链)