区块链介绍

区块链提供了比特币的公共账本,这是一个有序的、带有时间戳的交易记录。这个系统用于防止重复消费和修改之前的交易记录。

Introduction

比特币网络中的每个完全节点都独立存储只包含该节点验证的块的区块链。当多个节点在他们的区块链中都有相同的块时,他们被认为达成了一致。这些节点遵循的用来保持一致性的验证规则被称为一致性规则。这一部分描述了比特币核心使用的许多一致性规则。

上面的插图展示了区块链的简化版本。一个或多个新的交易信息将会被收集到区块的交易数据部分。然后,每一笔交易都会被复制并进行哈希处理,这些哈希值接着会被配对,再进行哈希处理,如此反复,直到最后留下一个单独的哈希值,也就是 merkle 树的 merkle 根。

Merkle根被存储在区块头中。每个区块还存储了前一个区块头的哈希值,从而将所有区块链接在一起。这确保了无法修改交易记录,除非同时修改记录该交易的区块和所有后续区块。

交易也是相互链接的。比特币钱包软件给人的印象是,satoshis是从一个钱包发送到另一个钱包的,但实际上,比特币是从一个交易移动到另一个交易的。每一个交易都花费了在一个或多个早期交易中先前收到的satoshis,所以一个交易的输入就是前一个交易的输出。


注:"Satoshis"是比特币的最小单位,就像美元的最小单位是分一样。这个单位是为了纪念比特币的创始人中本聪(Satoshi Nakamoto)而得名。1比特币等于100,000,000 Satoshis。

单一交易可以创建多个输出,这就像是向多个地址发送时的情况,但是特定交易的每个输出在区块链中只能被使用一次作为输入。任何后续的引用都是被禁止的双重支出——尝试花费同样的satoshis两次。

输出与交易标识符(TXIDs)相绑定,这些标识符是签名交易的哈希值。

由于特定交易的每个输出只能被花费一次,所以包含在区块链中的所有交易的输出可以被分类为未花费交易输出(UTXOs)或已花费交易输出。要使支付有效,它只能使用UTXOs作为输入。

忽略coinbase交易(稍后会描述),如果交易的输出值超过其输入值,那么交易将被拒绝--但是,如果输入值超过输出值,任何价值的差额可以被创建包含该交易的区块的比特币矿工作为交易费用来获取。例如,在上述插图中,每笔交易消费的satoshis少于它从其合并输入中接收的,有效地支付了10,000 satoshi的交易费用。

Proof Of Work

区块链由网络上的匿名节点共同维护,因此,比特币要求每个区块都证明在其创建过程中投入了大量的工作,以确保那些想要修改已有区块的不信任节点需要比只想新增区块到区块链的诚实节点付出更多的努力。

将区块串联在一起使得修改任何区块中包含的交易无法在不修改所有后续区块的情况下完成。因此,修改特定区块的成本会随着新增到区块链的每个新区块而增加,从而放大了工作证明的效果。

比特币中使用的工作证明利用了密码学哈希的随机性特性。一个好的密码学哈希算法可以将任意数据转变成一个看似随机的数字。如果以任何方式修改了数据并重新运行哈希,就会生成一个新的看似随机的数字,因此,没有办法修改数据使哈希数字变得可以预测。

为了证明你为创建一个区块做了额外的工作,你必须创建一个区块头的哈希值,这个值不能超过某个特定值。例如,如果哈希值的最大可能值是2256 - 1,那么你可以通过产生一个小于2255的哈希值来证明你尝试了两种不同的组合。

在上述例子中,你平均每尝试两次就会成功产生一个哈希值。你甚至可以估计出给定的哈希尝试生成的数值小于目标阈值的概率。比特币假设,当它降低目标阈值时,将需要尝试的哈希尝试次数(平均)将线性增加。

只有当区块的哈希至少与共识协议预期的难度值一样具有挑战性时,新的区块才会被添加到区块链中。每生成2,016个区块,网络便使用存储在每个区块头部的时间戳来计算生成最后2,016个区块的第一个和最后一个之间流逝的秒数。理想的值是1,209,600秒(两周)。

  • 如果生成2,016个区块花费的时间少于两周,那么预期的难度值会成比例地增加(最多可增加300%),这样在哈希以相同的速度进行检查的情况下,下一个2,016个区块的生成时间应该正好是两周。
  • 如果生成区块的时间超过了两周,那么预期的难度值会成比例地降低(最多可降低75%),原因也是一样。

(注意:比特币核心实现中的一个差一错误导致难度每2016个区块就会更新一次,但是只使用2015个区块的时间戳,因此会产生少许偏差。)

因为每个区块头部必须哈希到目标阈值以下的值,并且因为每个区块都与它之前的区块链接在一起,所以平均来说,传播修改过的区块需要的哈希力量与从创建原始区块到现在的整个比特币网络所耗费的哈希力量相当。只有当你获得了网络哈希力量的大部分,你才能可靠地针对交易历史执行这样的51%攻击(尽管,值得注意的是,即使少于50%的哈希力量也有执行这样的攻击的好机会)。

区块头部提供了几个易于修改的字段,如专用的随机数字段,因此获取新的哈希不需要等待新的交易。另外,只有80字节的区块头部会被用于工作量证明的哈希,所以在一个区块中包含大量的交易数据不会因为额外的I/O减慢哈希速度,并且增加额外的交易数据只需要重新计算默克尔树中祖先哈希。

Block Height And Forking

成功将区块头哈希到目标阈值以下的比特币矿工可以将整个区块添加到区块链(前提是该区块其他方面均有效)。这些区块通常按照它们的区块高度来定位——它们与第一个比特币区块(区块0,通常称为创世区块)之间的区块数量。例如,区块2016是首次可以调整难度的地方。

在一个区块链分叉期间,多个区块可能同时具有相同的区块高度,这种情况通常发生在两个或更多的矿工几乎同时产生一个区块的时候。如上图所示,这在区块链中创建了一个明显的分叉。

当矿工在区块链的末尾同时产生区块时,每个节点都会独立选择接受哪个区块。在没有其他考虑因素的情况下,节点通常会使用他们首先看到的区块。

最终,有一个矿工会产生另一个区块,这个区块只连接到其中一个同时挖掘的竞争区块。这使得分叉的那一侧比另一侧更强。假设一个分叉只包含有效的区块,正常的节点总是遵循最困难的链复原,并抛弃属于较短分叉的陈旧区块。(这些陈旧的区块也有时被称为孤儿或孤儿区块,但这些术语也被用于没有已知父区块的真正的孤儿区块。)

如果不同的矿工做出相反的努力,比如一部分矿工努力延长区块链,而另一部分矽谷试图进行51%攻击来修订交易历史,那么长期的分叉是可能的。

由于在区块链分叉期间,多个区块可以具有相同的高度,因此区块高度不应该被用作全局唯一标识符。相反,区块通常是通过它们的头部的哈希来引用的(通常以字节顺序反转,并以十六进制表示)。

Transaction Data

每个区块都必须包含一个或多个交易。这些交易中的第一个必须是一个coinbase交易,也被称为生成交易,它应该收集和使用区块奖励(由区块补贴和本区块中包含的交易支付的任何交易费用组成)。

Coinbase交易的UTXO有一个特殊条件,那就是它不能被花费(作为输入)至少100个区块。这一点暂时防止矿工花费可能在区块链分叉后被确定为过时的区块的交易费用和区块奖励(因此coinbase交易被销毁)。

区块不需要包含任何非coinbase交易,但矿工几乎总是会包含额外的交易,以收集他们的交易费用。

所有的交易,包括coinbase交易,都被编码成二进制的原始交易格式的区块。

原始交易格式被哈希处理来创建交易标识符(txid)。从这些txid中,通过将每个txid与另一个txid配对,然后一起哈希来构建merkle树。如果txid的数量是奇数,没有伙伴的txid会与其自身的副本一起哈希。

生成的哈希本身每一个都与另一个哈希配对并一起哈希。任何没有配对的哈希会与其自身进行哈希。这个过程重复,直到只剩下一个哈希,也就是Merkle根。

For example, if transactions were merely joined (not hashed), a five-transaction merkle tree would look like the following text

如在简化支付验证(SPV)小节中所讨论的,merkle树允许客户端自己验证交易是否已被包含在块中,这通过获取一个块头的merkle根和一个完整节点的中间哈希列表来实现。完整节点不需要被信任:伪造块头很昂贵,而且如果中间哈希被伪造,验证将会失败。

例如,为了验证交易D已经被添加到块中,一个SPV客户端只需要复制C,AB,和EEEE哈希以及merkle根;客户端不需要了解任何其他交易的信息。如果这个块中的五笔交易都是最大大小,那么下载整个块将需要超过500,000字节 - 但下载三个哈希加上块头则只需要140字节。

注意:如果在同一块中发现相同的txid,可能会因不平衡的merkle树实施方式(复制孤独的哈希)产生碰撞,部分或所有重复项可能被移除。由于完全有相同的交易ID进行分开交易是不切实际的,所以这并不给诚实的软件带来负担,但是如果要缓存一个块的无效状态,就必须进行检查;否则,一个删除了重复项的有效块可能具有相同的merkle根和块哈希,但会因为被缓存的无效结果而被拒绝,导致安全漏洞,如CVE-2012-2459。

Consensus Rule Changes

为了维护共识,所有的全节点都使用相同的共识规则来验证区块。然而,有时候共识规则需要改变以引入新的功能或防止网络滥用。当新规则实施时,可能会有一段时间内部分未升级的节点依然遵循旧的规则,而升级的节点则遵循新的规则,这可能会导致共识的破裂,有两种可能的方式:

  • 一个根据新的共识规则生成的区块,被升级的节点接收,但被未升级的节点拒绝。例如,一个区块中使用了新的交易功能:升级的节点理解这个功能并接收它,但未升级的节点会因为它违反了旧规则而拒绝它。
  • 一个违反新的共识规则的区块,被升级的节点拒绝,但被未升级的节点接收。例如,一个区块中使用了滥用的交易功能:升级的节点因为它违反了新的规则而拒绝它,但未升级的节点因为它遵循旧的规则而接收它。

在第一种情况下,由于未升级的节点的拒绝,从这些未升级的节点获取区块链数据的挖矿软件拒绝与从升级节点获取数据的挖矿软件建立在同一条链上。这会导致永久分裂的链条——一条为未升级的节点,一条为升级的节点——这被称为硬分叉。

在第二种情况下,由升级的节点拒绝,在升级节点控制大部分哈希率的情况下,有可能防止区块链永久分裂。因为在这种情况下,未升级的节点会接受所有与升级节点一样的有效块,所以升级的节点可以建立一个更强大的链,未升级的节点会把它接受为最好的有效区块链。这就叫做软分叉。

尽管分叉是区块链实际发散的情况,但改变共识规则通常根据其可能导致硬分叉还是软分叉的潜力来描述。例如,“将区块大小提高到1MB以上需要硬分叉。”在这个例子中,实际的区块链分叉并非必需,但它是一种可能的结果。

共识规则的改变可能通过各种方式激活。在比特币的前两年,中本聪通过发布向后兼容的客户端而实现了几次软分叉,这种客户端立即开始执行新的规则。多次软分叉,如BIP30,已经通过预设的时间或区块高度开始执行新规则的标志日来激活。这种类型的分叉被称为用户激活的软分叉(UASF),因为他们依赖于在标志日后有足够的用户(节点)来执行新的规则。

后来的软分叉等待大部分哈希率(通常是75%或95%)来表示他们准备好执行新的共识规则。一旦达到信号阈值,所有节点都将开始执行新的规则。这种类型的分叉被称为矿工激活的软分叉(MASF),因为它们依赖于矿工进行激活。

Detecting Forks

非升级节点可能在两种类型的分叉期间使用并分发错误的信息,这可能导致多种财务损失的情况。特别是,非升级节点可能转发和接受升级节点认为无效的交易,因此永远不会成为公认的最佳区块链的一部分。非升级节点可能也会拒绝转发已经被添加到最佳区块链或即将被添加到的区块或交易,因此提供不完整的信息。

Bitcoin Core 包含一段通过查看区块链的工作证明来检测硬分叉的代码。如果一个非升级的节点接收到展示至少比它认为有效的最佳链多出六个区块的工作证明的区块链头,该节点会在“getnetworkinfo” RPC结果中报告警告,并运行设定的 -alertnotify 命令。这会警告操作者,非升级的节点无法切换到最可能的最佳区块链。

完整节点也可以检查区块和交易版本号。如果在几个最近的块中看到的块或交易版本号比节点使用的版本号高,它可以假设它没有使用当前的共识规则。Bitcoin Core 通过 "getnetworkinfo" RPC 和 如果设置的 -alertnotify 命令报告这种情况。

在任何情况下,如果数据来自一个明显不使用当前共识规则的节点,不应依赖区块和交易数据。

连接到完整节点的SPV客户端可以通过连接到几个完整节点并确保它们都在具有相同区块高度的同一链上,加上或减去几个区块以补偿传输延迟和过期块,来检测可能的硬分叉。如果存在分歧,客户端可以从链较弱的节点断开连接。

SPV客户端也应监视区块和交易版本号的增加,以确保它们使用当前的共识规则处理接收到的交易和创建新的交易。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/174327.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

00TDI 这件红色大衣也太适合过年穿了

分享女儿的时尚穿搭—红色大衣 这款大衣非常厚实 摸起来很软糯的触感 复合了660-700g绵羊绒 厚实度堪比一件厚实的羽绒服 门禁处做了立体的爱心装饰 精致又可爱!!!

java--单继承、Object

java是单继承的,java中的类不支持多继承,但是支持多层继承。 反证法: 如果一个类同时继承两个类,然后两个类中都有同样的一个方法,哪当我创建这个类里的方法,是调用哪父类的方法 所以java中的类不支持多继…

【Linux】:信号的产生

信号 一.前台进程和后台进程1.前台进程2。后台进程3.总结 二.自定义信号动作接口三.信号的产生1.键盘组合键2.kill信号进程pid3.系统调用1.kill函数2.raise函数3.abort函数 四.异常五.软件条件六.通过终端按键产生信号 一.前台进程和后台进程 1.前台进程 一个简单的代码演示 …

【云备份】数据管理模块

文章目录 1. 数据管理模块要管理什么数据?2. 数据管理模块如何管理数据?3. 数据管理模块的具体实现BackupInfo 数据信息类NewBackupInfo —— 获取各项属性信息 DataManager 数据管理类构造函数析构函数insert —— 新增update —— 修改GetOneByURL——…

数据结构之时间复杂度与空间复杂度

1.算法效率 1.1 如何衡量一个算法的好坏&#xff1f; 比方说我们非常熟悉的斐波拉契数列&#xff1a; long long Fib(int N) {if(N < 3)return 1;return Fib(N-1) Fib(N-2); } 递归实现方式非常简洁&#xff0c;但一定好吗&#xff1f;如何衡量其好与坏&#xff1f; 1…

JVM——垃圾回收器(Serial,SerialOld,ParNew,CMS,Parallel Scavenge,Parallel Old)

目录 1.垃圾回收器的组合关系1.年轻代-Serial垃圾回收器2.老年代-SerialOld垃圾回收器3.年轻代-ParNew垃圾回收器4.老年代- CMS(Concurrent Mark Sweep)垃圾回收器CMS执行步骤&#xff1a;CMS垃圾回收器存在的问题缺点&#xff1a;CMS垃圾回收器存在的问题 – 线程资源争抢问题…

机器学习——支持向量机(SVM)

1.线性支持向量机 1.1数学模型 机器学习最终都是求解目标函数的最优问题&#xff1b; 一般都是讲问题转化为最小值来求解。 数学模型获得是一个不等式约束的最小化问题&#xff0c;求解时可通过构建拉格朗日函数求解。 1.2 拉格朗日函数及对偶问题求解 1.3 SMO算法求解 SMO算…

鸿蒙应用开发-初见:ArkTS

作者&#xff1a;HarderCoder ArkTS ArkTS围绕应用开发在 TypeScript &#xff08;简称TS&#xff09;生态基础上做了进一步扩展&#xff0c;继承了TS的所有特性&#xff0c;是TS的超集 ArkTS在TS的基础上扩展了struct和很多的装饰器以达到描述UI和状态管理的目的 基本语法 …

Redis Lua沙盒绕过 命令执行(CVE-2022-0543)漏洞复现

Redis Lua沙盒绕过 命令执行(CVE-2022-0543)漏洞复现 Redis如果在没有开启认证的情况下&#xff0c;可以导致任意用户在可以访问目标服务器的情况下未授权访问Redis以及读取Redis的数据。–那么这也就是redis未授权访问了 Redis的默认端口是6379 可以用空间测绘搜索&#xff…

【青蛙跳台阶问题 —— (三种算法)】

青蛙跳台阶问题 —— (三种算法&#xff09; 一.题目介绍1.1.题目1.2.图示 二.解题思路三.题解及其相关算法3.1.递归分治法3.2.动态规划算法&#xff08;Dynamic Programming&#xff09;3.3.斐波那契数列法 四.注意细节 一.题目介绍 1.1.题目 一只青蛙一次可以跳上1级台阶&am…

GWAS 分析模型 | FaST-LMM

GWAS 分析模型 | FaST-LMM FaST-LMM (Factored Spectrally Transformed Linear Mixed Models) 是一个用于进行全基因组关联分析&#xff08;GWAS&#xff09;的模型。与标准混合线性模型相比&#xff0c;FaST-LMM 通过对遗传相似性矩阵进行单次谱分解来减少计算资源消耗并提升运…

超全超实用行业解决方案合集,覆盖十大行业数据应用需求

现代企业面对复杂的业务需求&#xff0c;对数据分析的需求日益增加。 从实时销售到市场趋势&#xff0c;从客户行为到产品优化&#xff0c;每个环节都依赖于数据支持。然而&#xff0c;传统的数据分析平台常分散在不同系统和团队中&#xff0c;形成数据孤岛&#xff0c;降低了…

企业如何保障跨境金融业务中的数据安全传输?

随着全球化的不断深入&#xff0c;跨境金融业务日益频繁&#xff0c;然而在这些业务中&#xff0c;数据的安全传输一直是企业面临的重大挑战。跨境业务数据传输可能会遇到多种困难&#xff0c;如网络攻击、数据泄露、通信故障等。因此&#xff0c;企业需要采取有效的措施来确保…

C#,《小白学程序》第二十二课:大数的乘法(BigInteger Multiply)

1 文本格式 using System; using System.Linq; using System.Text; using System.Collections.Generic; /// <summary> /// 大数的&#xff08;加减乘除&#xff09;四则运算、阶乘运算 /// 乘法计算包括小学生算法、Karatsuba和Toom-Cook3算法 /// </summary> p…

漏洞复现--致远 M3 反序列化 mobile_portal RCE

免责声明&#xff1a; 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

AIGC系列之:DDPM原理解读(简单易懂版)

目录 DDPM基本原理 DDPM中的Unet模块 Unet模块介绍 Unet流程示意图 DownBlock和UpBlock MiddleBlock 文生图模型的一般公式 总结 本文部分内容参考文章&#xff1a;https://juejin.cn/post/7251391372394053691&#xff0c;https://zhuanlan.zhihu.com/p/563661713&…

03 项目运行

前面两篇文章对项目架构+源码架构做了分析,这篇文章先将服务部署一下,能够让大家有个直观的感受。 组件资源 项目运行的各种组件已经为你准备好了,有需要的直接百度云盘下载: 链接:https://pan.baidu.com/s/1hN6qf20gamMHPmA_qXwsLg提取码:o4k9MySQL数据库创建 找到的…

2023年最新Dev-C++下载安装以及C语言环境搭建教程(C语言入门)

文章目录 写在前面C语言简介Dev-C简介Dev-C下载安装Dev-C使用教程 写在后面 写在前面 2023年最新Dev-C下载安装以及C语言环境搭建教程&#xff0c;快来看看吧&#xff01; C语言简介 C语言是一种通用的高级程序设计语言&#xff0c;由美国计算机科学家Dennis Ritchie于20世纪…

51单片机的智能窗帘系统【含proteus仿真+程序+报告+原理图】

1、主要功能 该系统由AT89C51单片机LCD1602显示模块DS18B20温度模块DS1302时间模块光敏传感器步进电机蓝牙等模块构成。适用于智能窗帘、智能门窗家具等相似项目。 可实现基本功能: 版本一&#xff1a; 1、LCD1602实时显示北京时间、环境温度、光照强度、手动/自动控制等信息…

什么是磁矩?磁矩与磁通的关系

物质的磁性来源于原子中的电子磁矩 物质由原子构成&#xff0c;而原子是由原子核和电子组成的。在原子中&#xff0c;电子因绕原子核运动而具有轨道磁矩&#xff1b;电子因自旋具有自旋磁矩&#xff0c;原子的磁矩主要来源于电子磁矩&#xff0c;这是一切物质磁性的来源。 磁…