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

article/2025/8/21 23:18:44

转载,作者: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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


http://chatgpt.dhexx.cn/article/1uMsNvIi.shtml

相关文章

如何使用API接口

API其实就是一类服务的封装。我们可以使用不同的编程语言编写API,开发习惯和编程语言的不同导致API风格也存在差异。常见的API有以下几种形式: 1、HTTP类型接口 基于HTTP协议提供的API,这类API常常以“网址”形式提供的,像现在主…

微信小程序:调用API接口

首先去果创云之类的API调用的网站找到你想调用的API 以大学查询接口为例 复制API的接口,然后要现在第一个?前面加上appkey,然后name可以换成变量,最后的10是显示的条数,也可以改。 最后效果是可以查询你想要查询的学校…

api接口如何有效对接

一、背景 在平时工作中,经常会遇到的一种场景是:A公司要对接B公司的API方法,这时,A公司就要阅读B公司的接口文档,从接口文档中找到自己需要对接的API,并根据接口文档的要求,完成编码工作&#…

API接口怎么使用(教你使用api接口获取数据)

API是应用程序的开发接口,在开发程序的时候,我们有些功能可能不需要从到到位去研发,我们可以拿现有的开发出来的功能模块来使用,而这个功能模块,就叫做库(libary)。比如说:要实现数据传输的安全&#xff0c…

request调用API接口

通过requests请求api接口,返回的数据为一串字典,可使用字典的方式进行操作 import requests url https://api.github.com/search/repositories?qlanguage:python&sortstars r requests.get(url) print(status code:,r.status_code,verifyFalse) p…

调用api接口

我们平常是怎么调用接口的呢?在Vue中我们平常通过axios这个库来调用就接口,但是在uniapp进行开发,那么就要借用uniapp的库来进行开发,接下来我们一起来探究下。 一.uni.request(OBJECT) 作用:发送网络请求 OBJECT参数说明&#…

api 接口简单调用

互联网的资源是很丰富了&#xff0c;我又发现了个网站&#xff0c;提供api ,供我们联系用 https://www.showapi.com/ 我注册好之后 注册完之后&#xff0c;提供了 appid和 key <!DOCTYPE html> <html lang"en"><head><meta charset"UT…

调用第三方API(接口)

1&#xff1a;选用一个提供API的第三方&#xff08;这里推荐极速数据&#xff09; 2&#xff1a;使用 using Newtonsoft.Json; 如果没有需要先安装 3&#xff1a;定义API方法具体代码如下&#xff1a; public static string API(string url) { HttpWebRequest re W…

如何调用API接口获取数据

下面以调用丁香园的API接口获取新冠疫情数据为例。 丁香园提供的API接口及说明如下&#xff1a; 调用该API接口获取数据的代码如下&#xff1a; import requests import json import pandas as pd #以requests.get方式调用API接口&#xff0c;获取JSON格式的数据 datarequest…

如何调用api接口获取其中的数据

part1.API接口可以运用到的场景&#xff0c;主要包括以下几个方面&#xff1a; 1. 应用程序集成&#xff1a;API可以使不同的应用程序相互之间进行集成&#xff0c;比如将某个应用程序的数据传递给另一个应用程序&#xff0c;或者调用另一个应用程序的功能。 2. 数据共享&#…

API接口是什么?API接口怎么调用?

part1.API接口是什么&#xff1f; API&#xff08;Application Programming Interface&#xff0c;应用程序编程接口&#xff09;是软件系统之间互相访问和交换信息的一种方式。它定义了在一个应用程序中调用另一个应用程序的方式&#xff08;或服务&#xff09;。API接口可以…

API接口调用演示

本文以深圳市政府数据开放平台为素材对象&#xff0c;演示如何调用其开放的API接口&#xff0c;主要目的在于以直观的视角&#xff0c;熟悉API接口的格式及调用方式。 在首页数据菜单中有数据目录、数据集、数据接口和数据地图4个菜单。 选择数据集&#xff0c;选择教育局&…

API接口的调用方式

API接口的调用方式分为以下几种&#xff1a; 1.RESTful API 这是一种基于HTTP协议的API调用方式&#xff0c;通常使用HTTP协议的POST、GET、DELETE、PUT等方法进行调用。使用RESTful API的优点是简单易懂、易于扩展和利于缓存。常见的RESTful API有Twitter API、Facebook API…

api接口的获取调用方式是什么?

API接口的获取调用方式&#xff0c;通常分为以下几个步骤&#xff1a; 1.注册账号并申请API Key&#xff1a;在API服务提供商的官方网站上注册账号&#xff0c;并申请API Key&#xff08;包括通行证ID和密钥&#xff09;&#xff0c;以便后面的API调用验证。 2.查看API接口文档…

MySQL分库分表相关面试知识点

基础概念 分表 能够解决单表数据量过大带来的查询效率下降的问题 分库 面对高并发的读写访问&#xff0c;当数据库master服务器无法承载写操作压力时&#xff0c;不管如何扩展slave服务器&#xff0c;此时都没有意义。此时&#xff0c;则需要通过数据分库策略&#xff0c;提…

MySQL分库分表及中间件Mycat

文章目录 一、前言1.1 垂直切分1.2 垂直切分的优缺点&#xff1a;1.3 水平切分1.3.1 水平分表1.3.2 水平分库 1.4 水平切分优缺点 二、Mycat 中间件实现读写分离2.1 mycat2.2 mycat安装2.3 利用mycat实现mysql的读写分离 三、Mysql高可用 一、前言 刚开始我们的系统只用了单机…

Mysql - 分库分表

介绍 问题分析 随着互联网及移动互联网的发展&#xff0c;应用系统的数据量也是成指数式增长&#xff0c;若采用单数据库进行数据存储&#xff0c;存在以下性能瓶颈&#xff1a; IO瓶颈&#xff1a;热点数据太多&#xff0c;数据库缓存不足&#xff0c;产生大量磁盘IO&#x…

MySQL分库分表原理

前言 ❤Java学习路线个人总结-博客 ❤欢迎点赞&#x1f44d;收藏⭐留言 &#x1f4dd;分享给需要的小伙伴 文章目录 前言1、为什么要分库分表02、分库分表03、不停机分库分表数据迁移4、分库分表实现5、读写分离实现 1、为什么要分库分表 分库分表目的&#xff1a;解决高并发&a…

mysql分库分表(二)

微信搜索&#xff1a;“二十同学” 公众号&#xff0c;欢迎关注一条不一样的成长之路 一种可以避免数据迁移的分库分表scale-out扩容模式 一种可以避免数据迁移的分库分表scale-out扩容方式 目前绝大多数应用采取的两种分库分表规则 mod方式dayofweek系列日期方式&#xff…

Mysql分库分表方案

相关文章&#xff1a; 1、 使用Spring AOP实现MySQL数据库读写分离案例分析 2、MySQL5.6 数据库主从&#xff08;Master/Slave&#xff09;同步安装与配置详解 3、MySQL主从复制的常见拓扑、原理分析以及如何提高主从复制的效率总结 4、使用mysqlreplicate命令快速搭建 Mysql 主…