转载,作者:Alphabet_666

1. 交易的传播和验证

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

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

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

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

2.区块的生成与验证


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

  • 挖矿之前需要先构造区块,首先将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个比特币。至于交易费,不同的矿池有不同的分发。

作者:Alphabet_666
链接:https://www.jianshu.com/p/21ce865adee9
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

(六)区块的生成、验证及挖矿相关推荐

  1. 比特币的区块的生成、链接和分叉

    比特币的区块生成.链接和分叉 交易的传播 & 验证 交易包含两个部分,n 输入和 m 输出.n > =0 , m >0. 输入 == 要被花费的 UTXO + 解锁脚本 输出 == ...

  2. 支付宝支付 第六集:生成支付二维码

    支付宝支付 第六集:生成支付二维码 一.资源 支付宝沙箱显示APP-ID错误:我的原因是支付宝网关地址写错了 支付宝沙箱环境报 invalid-app-id 错误原因: 无效的AppID参数 错误 支 ...

  3. 微软向开发者推出区块链概念验证框架

    微软在近期的一篇博文中宣布了一个新的框架,用以在Azure云平台上加速已通过企业概念验证(PoC)的区块链部署.微软希望用户能在可支持分布式账本(DLT)解决方案的基础设施上,借助于灵活的契约和更少的 ...

  4. struts2官方 中文教程 系列六:表单验证

    先贴个本帖的地址,以免被爬:struts2教程 官方系列六:表单验证  即 http://www.cnblogs.com/linghaoxinpian/p/6906720.html 下载本章节代码 介 ...

  5. 【机器学习算法面试题】六.训练集、验证集、测试集的理解。

    欢迎订阅本专栏:<机器学习算法面试题> 订阅地址:https://blog.csdn.net/m0_38068876/category_11810806.html [机器学习算法面试题]一 ...

  6. 讲讲我对比特币和区块链的认知,挖矿不难,挖到难

    比特币的概念 众所周知,比特币是数字货币 比特币相比我们的纸质货币,有以下优点: 1.财产可控,不像银行可以冻结你的账户,比特币不受他人控制 2.无通胀烦恼.银行可以根据经济情况,去印刷更多的钱,但比 ...

  7. 区块链可验证查询论文阅读(一)vChain: Enabling Verifiable Boolean Range Queriesover Blockchain Databases

    2019年7月发表在顶会SIGMOD上的论文<vChain: Enabling Verifiable Boolean Range Queries over Blockchain Database ...

  8. 区块链和比特币以及挖矿

    我理解的区块链:大家凑份子组成个联盟,信息上随时互通有无,因为计算机是个死物,只要大家都遵守某共同协议计算机之间互通效率就很高,可以造成个人独占数据的假象. 我理解的比特币:我要搞区块链,但是没有小伙 ...

  9. python随机生成英文字符串_Python练习第六题,生成随机字母

    第六题:使用 Python 生成类似于下图中的字母验证码图片 1.思路:随机生成一位字母 参考文档string - 常用字符串操作stringstring.ascii_letters 小写字母 'ab ...

最新文章

  1. 3D Slicer实现纤维追踪(大脑纤维束成像)+核磁共振影像数据处理
  2. 实现数据集多( 高 )维可视化(附代码)
  3. arduino 智能车组装步骤_【本周福利】arduino从入门、进阶到精通学习资料包(免费滴)...
  4. 有关matlab拟合工具箱的使用
  5. 后悔贪心+P2949 [USACO09OPEN]Work Scheduling G
  6. jquery 修改下拉条 Ben Plum selecter
  7. Suggestion [3,General]: 找不到命令 webpack,但它确实存在于当前位置。默认情况下,Windows PowerShell 不会从当前位置加载命令。如果信任此命令,请改为键
  8. 2台电脑一根网线传文件_用1根网线直连2台电脑,能干嘛?
  9. python实战===用python识别图片中的中文
  10. 轻松三步教你配置oracle,Oracle Net Configuration Assistant 配置步骤简明教程
  11. GDataDate 的本地时间转换
  12. 定时任务时间表达式的规则
  13. 【测试能力提升】Jira 和禅道数据库分析,方便你写周报、写总结、出报告
  14. 卷积神经网络的网络结构——Hourglass
  15. 常变量和符号常量的区别?常变量和文字常量的区别?
  16. M1芯片处理器mac能用的AI(llustrator CC 2021 直装版M1优化版)解决M1版MAC安装AI闪退问题 完美支持M1芯片处理器
  17. 基于gensim的Deep learning with paragraph2vec 官方models.doc2vec文档解释
  18. 怎么加入到开源社区,开心做开源
  19. 放大电路为什么要保证“发射结正偏,集电结反偏”?集电极和发射极电流等比例变化(放大)的本质原因是什么?
  20. 微信域名网址强制跳转至浏览器打开指定app网页

热门文章

  1. .pdm文件怎么打开
  2. php 复制文件夹并压缩到最小_php获取所有文件并压缩
  3. C 语言隐式类型转换
  4. 安卓gpio操作示例
  5. 数据库关系代数中除运算讲解和SQL语句的实现
  6. vcruntime140_1.dll无法继续执行代码,vcruntime140_1.dll丢失修复方法
  7. 从数据类型 varchar 转换为 numeric 时出错
  8. Python下openCV打开图片的几种方式/适应窗口大小
  9. opensuse下安装网易云音乐netease-cloud-music
  10. C++ 函数指针 类成员函数指针