(六)区块的生成、验证及挖矿

1. 交易的传播和验证

  • 交易包含两部分:n个输入个m个输出,其中n>=0,m>0
    输入=要花费的UTXO+解锁脚本
    输出=UTXO(币的数量+锁定脚本)

  • 钱包生成交易,并向邻近节点传播。节点对收到的交易进行验证,并丢弃不合法的交易。节点对交易的验证主要包括以下几方面:

交易的size要小于区块的size的上限
交易输入UTXO是存在的
交易输入UTXO没有被其它交易引用-防止双花(Double Spending)
输入总金额>输出总金额(多出来的钱是给旷工的小费)
解锁脚本验证成功

验证合格后将交易加入到本地的Transaction数据库中,并转给邻近节点,邻近节点再做一遍验证然后再转给邻近的节点。

2.区块的生成与验证

区块结构.jpeg

区块是区块链的基本结构单元,由区块头和区块主体构成。区块体包括交易数量和交易详情。

  • 挖矿之前需要先构造区块,首先将coinbase交易打包进区块 ,然后将交易池中高优先级的交易打包进区块。
  • 优先级=交易额度*UTXO深度/交易size(防止粉尘攻击),粉尘攻击是大量低额度、低交易费的交易以至网络拥堵。从理论上说一个交易如果交易费为零,随着UTXO深度的增加,优先级也会变高,但事实上很多旷工会直接拒绝零交易费的交易。
  • 创建区块的头部,区块头包括版本号 、父区块哈希(实际上是父区块的区块头哈希值,用来回溯父区块和保证父区块不被篡改)、Merkle树根、时间戳、难度目标值、Nonce。
  • 挖矿成功后,将计算出来的随机数Nonce填入区块头部,向邻近节点传播。

相邻区块收到新区快后,立即做以下验证:

验证POW的nonce值是否符合难度值
检查时间戳是否小于当前时间2小时
检查Merkle树根是否正确
检查区块size是否小于区块size的上限
第一个交易必须是coinbase交易
验证每个交易

时间戳

  • 矿工们在挖矿的过程中,对收集到的交易记录加盖数字时间戳,并将其打包到区块中。而时间又不能从某个中心服务器获取,这样会违背去中心化思想。其实方法也很简单,还是利用“多数人的正义”,时间来自于连接的其他节点时间的中位数(比平均值更不受极端数字影响),要求连接的节点数量至少为5,中位数和本地系统时间差别不超过70分钟,否则会提醒你更新本机的时间。

Merkle树

  • 这里Merkle树其实就是一颗二叉树,首先对交易进行两次SHA256运算得到相应的哈希值,然后对哈希值两两组队再进行两次SHA256运算,如果交易数量为奇数,则对最后一个哈希值进行复制然后再做哈希运算。比如上图如果再有个交易9,Hash9 = SHA256(SHA256(Transaction9)),Hash99 = SHA256(SHA256(Hash9 + Hash9))。以此类推最后会得到一个Merkle root存入区块头中。这样任何一个交易被篡改,Merkle root必然发生改变,区块头哈希值也就随之改变,之后所有的区块都将是无效区块。因此Merkle树能够校验数据完整性,防止数据被篡改。

  • 通过对一个区块头的所有信息进行哈希运算得出一个哈希值,此哈希值可以唯一并且准确标识这个区块,只要其哈希值不发生变化,就代表区块中的信息没有被篡改。每个区块头都包含上一个区块的区块头哈希值,这使得每一个区块都能找到前一个区块,这样一直倒推就能形成一条完整的区块链。

3.挖矿

  • 为什么要挖矿?
    当用户发布交易后,需要有人将交易进行确认,写到区块链中,形成新的区块。在一个互相不信任的系统中,有谁来完成这件事情呢?怎么保证这个记账的人不作恶呢?

  • 什么是挖矿?
    就是对区块头进行哈希运算,通过不断改变区块头中的nonce值来得出不同的哈希值,如果哈希值小于系统给定的难度目标值,就算挖矿成功,就能获得记账权,同时也能获得奖励和这个区块内的所有交易费。因此如果这个节点作恶,那么别的节点将不会认可这个区块,这个区块将会是白挖了,而且还白白浪费了大量的算力。因此通过挖矿来保证节点不作恶。比特币系统规定每挖21万个区块奖励减半,到2140年比特币将全部被挖出,矿工挖矿将没有奖励,完全靠手续费为生。

  • 有没有可能找不到对应的nonce值
    nonce占4个字节,就是32位,如果遍历整个2^32后还没算出来,可以通过改变交易的顺序来改变Merkle root,再重新遍历nonce。

  • 难度调整
    比特币平均每隔10分钟出一个区块,而算力是不断增大的。比特币系统会每隔2016个区块调整一次难度,新目标 = 当前目标值*过去2016个区块用时分钟 / 2016分钟,难度值越大,目标值越小,挖矿也就越难。

  • 矿池
    由于全网算力越来越大,挖矿难度也越来越大,单个旷工挖出矿的概率越来越小,因此收入就非常不稳定。现在已经很少有个人矿工了,而是很多矿工一起组成矿池。矿池管理员维护全节点,负责打包区块,并将任务分段,给矿工布置挖矿任务。比如A矿工负责0到10万的nonce值的哈希运算,B负责10万到20万,这样挖矿速度就会大大提升。同时矿池内部也会有一个难度值,通过计算每个矿工找到符合矿池难度值得数量来衡量矿工的算力。

比如矿池一天挖出100个比特币,A矿工有10次nonce值计算的哈希值小于矿池难度目标值,而矿池所有矿工共有1000次符合的nonce值,则A矿工提供的算力占矿池的百分之一,应获得1个比特币。至于交易费,不同的矿池有不同的分发。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容