区块链入门的几个基本问题

news2024/11/16 16:43:02

目录

    • 前言
    • 比特币
    • 区块链
    • 区块链大揭秘
      • 抛砖引玉
      • 故事一
      • 故事二
      • 总结
    • 引人入胜
    • 侃侃而谈
      • 去中心化
      • 开放性
      • 不可篡改性
    • 相关技术
      • 共识机制
      • 共识机制的两大核心
        • 达成共识的主要过程(产生新区块的过程)
        • 工作量如何理解?
        • Hash计算
        • Bits和目标Hash值
        • Merkle Root
        • 双花问题
        • 如何避免

前言

当我们在提到区块链的时候,很多人都知道这是个跟金融,就是跟money有关的东西,与其说区块链,我们常用的词应该是区块链技术,这种说法其实就揭露了其本质——技术。那与区块链相关联的另一个名词又是什么呢?那当然就是大名鼎鼎的比特币(BitCoin)。

比特币

比特币,你可以把它当作是一种电子货币,它的出现绝对不是偶然,然是历史发展的必然。在中本聪的论文(见附件)中对比特币出现的前因后果大致是这么描述的(翻译可能有误)

在物理世界中,货币是由各国的央行发行,这是一个中心化的发行机制,说白了,就是容易受到某个中心化机构的控制
货币的流转
电子货币:可信的第三方(银行、支付宝等)承担着货币的流转
物理货币:人直接把cash交给另一个人
当然,人与人直接交易,流转货币,这种方式方式当然是安全的(除非遇到假钞,这里不讨论这种情况哈)
那么,可信的第三方作为货币流转的中介,这种方式有什么问题吗?我看平时支付宝用的好好的啊。中本聪的论文里是这么讲的:

中心化的第三方,没法完全保证可信
中心化的第三方,所有的交易,用户的余额都存在一个中心化的数据库中,不能完全保证交易的不可更改(因为只有一个人知道,你改了,我找谁说去?)
在人与人交易的过程中,第三方作为中间人,也是需要承担风险的,万一两个交易的人扯皮子,你说我作为担保人是不是得吃闷亏,这样就无形中增加了这种交易的成本,甚至有可能让很多人放弃这种方式的交易
中心化的第三方不是福利机构啊,人家凭什么要给你管账本,要陪你扯皮子呢?还不是由服务费吗?
那么,中本聪就设想,在电子交易的过程中,能不能通过某种方式,把这个第三方给去了,像物理世界中的先进交易那样,用户A直接就把货币打到用户B的钱包里?

于是乎,比特币就这么登上历史的舞台。。。

区块链

看完上面,相信你们对比特币是干嘛用的已经有了一个大致的了解了,中本聪的论文里称比特币是一种点对点的电子现金系统,那么作为与物理世界里的钞票对应的电子现金,需要解决什么问题呢?

货币的发行,首先得像央行发行软妹币一样,有一定的机制去保障这些个货币能被正常的发行出来啊。但是,又不能像央行发行软妹币那样一家说了算,我想发多少就发多少,这样迟早完蛋啊,很多血淋淋的例子我就不多列举了
货币的转移,比特币这种电子现金系统肯定也要有一种机制去保证货币能在用户之间流转吧,并且这种流转也不能再有第三方介入了啊
交易、余额等,我得有一套机制去存人与人之间的产生的交易信息吧,我还要去记录一个人还剩多少钱吧,并且,这个过程也不能让某一个中心化的机构来做
上面说到的这样,可以看成是实现比特币这套电子现金系统中,必须解决的关键性问题,那么怎么解决这些个问题呢?那就是今天的主角——区块链技术发挥作用的地方了。大概的意思就是:区块链是什么比特币这种电子货币,保障比特币发挥作用的底层技术!

区块链大揭秘

抛砖引玉

下面,我们来说一个故事,借此来引出区块链技术的关键问题。

故事一

那是一个晴空万里的早上,始金向往常一样高高兴兴的上班去了,一到公司,成晓就告诉他,老板觉得你很不错,刚刚说要给你升职加薪,始金一听,心想肯定骗我的,就没当回事,不料,过一会盛哥又来了,说了跟成晓一样的话,始金心里开始打鼓了,难道这是真的?没过一会,黎晨也对他说了同样的话,子墨,罕喻也是,这下不得了了,始金开始信了,这不得不信啊,毕竟这么多人都说了,那肯定就是真的啊!

故事二

那是一个晴空万里的早上,始金向往常一样高高兴兴的上班去了,一到公司,马老师就对始金说,公司决定要给你升职加薪,始金立马就信了。

通过上面的两个故事,大家可以看到,要让用户相信一件事,其实可以通过两种方式,一种是故事一中的很多人说这是真的,另一种就是有一个权威的第三方来说这是真的。而区块链技术正式借助故事一的思想来实现对交易的有效性的保障。

总结

这就是区块链技术的最重要的思想——去中心化

当然,这个去中心化,包括两层意思,第一层是货币的发行去中心化;另一层是货币的转移(流转)去中心化。意思就是货币的发行不再由像央行这样的中心化的机构来控制,而是由整个系统来决定,至于决定货币发行的因素,我们后面再谈;与此同时,货币在用户之间的流转也要去中心化,用户直接将货币转给另一个用户,而不需要第三方来记账担保,而是所有参与的用户都来共同担保,大家一起来见证这笔交易,保证交易的有效性。

引人入胜

下面我们就以比特币的在用户之间的转移(交易)为例,来引出区块链的各种神奇的机制。

广播交易信息
在这里插入图片描述

吃瓜群众在收到交易信息后,拿出自己的小本本记下A和B的交易,一旦记录成功,就不可撤销,不可更改

在这里插入图片描述

划重点!!!

吃瓜群众为什么要替别人记账本?由此引出矿工挖矿,这也是比特币的发行机制。也就是说记账的用户,系统会给予它相应的奖励。
这么多吃瓜群众,每个人都拿着小本本来记账,那么到底最后的账本应该采取谁的呢?因此,必须要有一种机制让所有人都能认同最终都记账结果的有效性,这就是比特币采取的共识机制——基于工作量证明的共识机制
各位看官,你们的小本本记好了吗?

继续,在共识机制的保障下,获得最终记账权的群众会向全网广播本次交易的交易信息,其他群众会核对确认这本交易,交易达到6个确认以上就会被记录在案。(什么?为什么是6个?)

吃瓜群众在记录交易信息的时候,会盖上时间戳(Hash值),形成完整的时间链,这个时间戳其实是一种存在证明,表明这笔交易确实真实的发生过
每次经过确认的交易记录都会形成一个区块(Block)
区块与区块之间会通过某个神奇的算法链接起来
在这里插入图片描述

侃侃而谈

好了,通过上面一番操作之后,相信各位看官对比特币啊,区块链啊这些基本的概念,还有一般的流程什么的都有了一个感性上的认识(嗯。我好像知道区块链是什么了!)下面我们来深入的总结一下区块链的关键思想和技术吧!

去中心化

比特币的网络中,没有一个中心化的服务器,整个网络由各种节点组成,共同组成了一个去中心化的网络
货币发行的去中心化,在比特币网络中,货币发行是由"矿工挖矿"这种机制来保障的,而这种机制是一个完全的去中心化的机制
货币的交易流转去中心化,比特币的每一笔交易都是由网络中的所有节点来共同保证其有效性和不可篡改的

开放性

所有比特币用户的交易信息都被记录在一个分布式账本中,这个账本信息对所有用户公开,任何人都可以下载这个账本信息
比特币网络是开放的,任何服务器都可以接入到网络中,也可以下载到全量的账本信息

不可篡改性

每一笔交易信息都被存放在区块之中,每一个新产生的区块都是按照时间(Hash 值)的顺序链接在一起的,时间的不可逆导致任何试图修改区块信息的操作都是可以被追溯的
每一个新产生的区块都应用量哈希算法来进行加密,参与哈希的因子不仅包括本次交易的信息,而且还包括上一个区块的哈希值,这种方式下,如果对某一区块的信息进行修改,需要更改所有区块的信息,造假几乎是不可能的

相关技术

下图是一个真正区块的展示,区块中本次我们重点介绍的几个字段有:

Bits
Nonce
Hash
Previous Block
Merkle Root
在这里插入图片描述

共识机制

http://c.biancheng.net/view/1897.html

区块链技术解决了在一个去中心化网络中进行价值表示和价值传输的问题,而这种分布式的去中心化网络中如何对数据达成一致是一个非常关键的问题。在我们的日常生活中,几乎所有的事情都是达成共识的过程。而这也恰恰是比特币最核心的突破之一,即:如何在去中心化的情况下,对某个交易事件达成一致。

共识机制的两大核心

经济激励:通过每个区块产生一定数量的新的比特币来奖励参与者
引入外部资源确保安全:即通过大量的外部计算来确保共识的安全性,也就是工作量证明(Proof of Work)

达成共识的主要过程(产生新区块的过程)

监听:节点监听全网的交易信息,通过验证的交易会进入节点的内存池
构建:构建一个空的区块,称为候选区块
交易:从内存池中打包交易至候选区块
造头:构造区块头,填写区块头的下述字段
版本号version字段:表示本区块遵守的验证规则
父区块哈希值Previous Block
用merkle树汇总全部的交易,将merkle root的哈希值填写至merkle root字段
时间戳timestamp字段
填写目标值Bits字段
运算:不断调整随机数Nonce,进行Hash计算,使得计算出的Hash值满足一定的要求,即:小于目标Hash。(OR:计算出来的Hash值的二进制表示具有一定数量的前导0)
因为比较二进制数,其实比较的就是前面的0,谁的0多,谁就越小呗
打包:打包区块信息,并对外广播(gossip协议)新区块
验证:其他节点验证通过后,将其链接(Previous Block)至主链(难道还有侧链?嗯。。。)
等待:等待主链后再链接5个新区块(也就是5+1个区块)后,那么区块正式生效,不可篡改。
这种达成共识的过程,我们叫做基于工作量证明的共识机制。这里有几点可以解释一下:

工作量如何理解?

不断调整随机数进行SHA-256运算比拼的是计算机算力,这种依托算力进行的计算是一种工作量
计算Hash值小于目标Hash为什么就可以体现出工作量?
掷骰子掷出的点数<=6,平均需要掷一次,工作量可以量化为1;那么要求掷出的点数<=3呢?平均需要掷2次,工作量翻倍。当目标值很小的时候,想要让计算出的Hash值小于目标值,难道非常大
随着计算机算力的提升,如何控制计算的难度?
256位二进制数构成的目标Hash值,任意改变一个bit,难道难度就翻倍,因此,可以通过调整目标Hash值来调整难度

Hash计算

一般采用的是一次SHA-256运算,计算输出的Hash值是一个256位的二进制数构成,为了表示方便,采用16进制表示,那么就是256/4=64位16进制数
输入的一点点改变,都会引起输出的巨大变化,毫无规律可言

Bits和目标Hash值

Bits与难度是相对应的,它是用一个32位的整数来压缩存储当前256位的目标Hash值。

目标Hash值:0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
Bits:0x1D00FFFF
怎么压缩的呢?规则为:

目标Hash值的有效位数 = (64-8)+ 2 = 58 (也就是29个字节),那么Bits字段的最高字节 = 29,16进制表示就是 0x1D
+2是因为目标Hash值的最高位0xFF(1111 1111)> 0x80(1000 0000)
Bits剩下的3个字节,取Hash值的最高3个字节来存储

Merkle Root

在比特币中使用梅克尔树,是为了将交易信息存储在每个区块中。

在这里插入图片描述

用Merkle树来汇总所有的交易信息,并且将汇总得到的Merkle Root放在区块头,这样做的好处是显然的:

所有的交易参与Hash计算,直至汇总到Merkle Root。如果有人篡改了梅克尔树底部的一些数据区块,会导致上一层的哈希指针不匹配,那么他不得不一直篡改上一层的哈希指针,直到数的顶端,而此刻,篡改即将终止,因为我们存储了树根节点的哈希指针,这样就可以防止交易信息被篡改
简化支付验证:将Merkle Root保存在区块头,而不是所有的完整的交易信息,可以实现一个light client,用户只需下载非常小的区块头数据就可以验证一笔交易的真实性
按最长链原则,拉取所有的区块头到本地
计算待验证交易的tx_hash值
找到存有tx_hash的区块头
找到这个区块中的Merkle Tree的一些关键节点,并按构造规则构建一颗Merkle-Tree-Copy
比较Merkle-Tree-Copy的Root和区块中的Root是不是一样
只要我们记住最前面的树根节点的哈希指针,我们就可以根据哈希指针回溯到表中的任意位置
3.1.6 为什么通过验证后还需要等待6个区块
交易被打包进入区块,并且通过验证之后,需要再等待6个区块才会正式生效,主要是为了解决"双花"问题。那么什么是"双花"问题呢?这里,我们整理一下与此相关的几个概念:

51%算力攻击
双花问题
3.1.6.1 51%算力攻击
在基于工作量证明的共识机制当中,网络中的节点比拼计算机算力进行复杂的Hash运算,最先算出结果的那个节点所生成的区块将被全网接受,链接到区块链上,称为新的区块。那么,当某个人或组织掌握了全网51%的算力时,就可以按"随心所欲"的伪造交易。

双花问题

假设小黑有666BTC,他把这些币支付的大白同时,也把这些币发到自己的另一钱包地址上。

最终,发给大白那笔交易先被得到了确认,并打包在区块高度为N的区块内。

这时,控制了超过50%算力的小黑,发起51%算力攻击,他通过重新组装第N个区块,将发给自己那笔交易打包进区块里,并持续在这条链上延展区块,由于算力的优势,这条量将称为合法的最长链。(用户只承认他看到的最长链——最长链原则)

这时,转账给大白的那边交易就被篡改。

如何避免

为了避免双花造成的损失,一般认为,等 6 个区块确认后的比特币交易基本上就不可篡改了。
在这里插入图片描述

一般来说,确认的区块数越多,越安全,交易被篡改的可能性就越低。

想要实现双花,其实就是恶意节点和安全节点相互比拼算力挖矿的过程,当恶意节点形成的恶意链比安全节点形成的可信链长的时候,恶意节点就可以实现双花。这里,做了一个假设,即:假设恶意节点占全网的算力为p,那么安全节点就为q=1-p,在经过第n个区块后,恶意链追上可信链的概率为:

(pq)n ( p q ) n
那么,当可信节点产生了n个区块后,恶意节点产生了多少个区块呢?

在这里,中本聪假设恶意节点产生的区块的个数服从一个泊松分布:

P(X=k)=(λkk!)e−λ P ( X = k ) = ( λ k k ! ) e − λ
这个公式表示:恶意节点产生k个区块的概率为:P(X=k)

因此,我们可以求出,在可信节点产生n个区块后,恶意节点产生区块的期望值。

∑∞k=0(λkk!)e−λ(pq)n−k ∑ k = 0 ∞ ( λ k k ! ) e − λ ( p q ) n − k
对这个数列求和,当N=6,p=10%时sum=0.0002。

表示:当可信节点产生6个区块后,恶意节点产生区块个数的期望值为0.0002

也就是说,在上述假设的条件下,经过6个区块的确认后,恶意节点造假的可能性几乎为0。

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

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

相关文章

新手python学什么最吃香?

前言 今天跟大家聊聊Python的几个主要发展和就业方向&#xff0c;给准备学习Python的小伙伴解惑。 “ 我想学Python&#xff0c;但是学完Python后都能干啥&#xff1f;” “ 现在学Python&#xff0c;哪个方向最简单&#xff1f;哪个方向最吃香&#xff1f;” “ …… ” …

LeetCode题解 二叉树(五):226 翻转二叉树;101 对称二叉树;100 相同的树;572 另一个树的子树

226 翻转二叉树 easy 这道题有一段广为人知的传说&#xff1a;曾有人说Homebrew&#xff08;适用于macOS和Linux的开源软件包管理器&#xff09;的作者Max Howell&#xff0c;没有在白板上写出这道题目&#xff0c;被Google拒绝了。 至于是不是真的因为没做出来这道题就被拒绝…

深入浅出JVM之执行引擎的解释执行与编译执行

本篇文章围绕执行引擎&#xff0c;深入浅出的解析执行引擎中解释器与编译器的解释执行和编译执行、执行引擎的执行方式、逃逸分析带来的栈上分配、锁消除、标量替换等优化以及即时编译器编译对热点代码的探测 执行引擎 hotspot执行引擎结构图 执行引擎分为解释器、JIT即时编译…

大数据框架Hadoop篇之Hadoop入门

1. 写在前面 今天开始&#xff0c;想开启大数据框架学习的一个新系列&#xff0c;之前在学校的时候就会大数据相关技术很是好奇&#xff0c;但苦于没有实践场景&#xff0c;对这些东西并没有什么体会&#xff0c;到公司之后&#xff0c;我越发觉得大数据的相关知识很重要&…

Jmeter(二十二):硬件性能监控指标

硬件性能监控指标 一、性能监控初步介绍 性能测试的主要目标 1.在当前的服务器配置情况&#xff0c;最大的用户数 2.平均响应时间ART&#xff0c;找出时间较长的业务 3.每秒事务数TPS&#xff0c;服务器的处理能力 性能测试涉及的内容 1.客户端性能测试&#xff1a;web前…

洛谷——【入门2】分支结构

文章目录题单简介【深基1-2】小学数学 N 合一题目描述问题 1问题 2问题 3问题 4问题 5问题 6问题 7问题 8问题 9问题 10问题 11问题 12问题 13问题 14输入格式输出格式样例 #1样例输入 #1样例输出 #1提示AC代码【深基2.习6】Apples Prologue / 苹果和虫子题目描述输入格式输出格…

尝鲜:SpreadJS-en已出 16.0 SpreadJS-cn 16.0-23年1月出

此次版本更新将带来众多的增强功能&#xff0c;而其中新的文件结构尤为重要&#xff0c;是近几个版本中最重要的架构级更新&#xff01; 其设计目标是 *减少 SSJSON 的体积&#xff0c;平均减小到原来 30% *提供按需加载&#xff08;Lazyload&#xff09;能力&#xff0c;相对…

【学习】https://gitee.com/DingJiaxiong

【学习】https://gitee.com/DingJiaxiong 文章目录【学习】<https://gitee.com/DingJiaxiong>0 前言1 Java SE2 Java Web3 Maven基础4 Git5 SSM框架6 MybatisPlus7 SpringBoot0 前言 事情是这样&#xff0c;我准备把之前所有的笔记都放到Gitee 上了 不用GitHub … 就别问…

Spring的AOP切面应用对【后台对接口增强】

目录&#x1f4da;简介&#xff1a;&#x1f4a8;切面表达式&#xff1a;&#x1f4ad;切面通知类型&#xff1a;&#x1f5fa;️创建项目演示&#xff1a;&#x1f3a2;创建项目&#xff1a;&#x1f383;添加依赖&#xff1a;&#x1f4a8;编写切面类&#xff1a;&#x1f68…

前端显示分页详解

我们在浏览页面的时候&#xff0c;是不是经常看到网页经常是以页面的形式给我们展现出来的&#xff0c;我们以淘宝的页面为例&#xff08;如下图&#xff09;&#xff0c;那这样按照页面呈现有什么好处呢&#xff1f;这篇文章让我们来深入探究了解这其中的奥秘。 优点&#xff…

泛型自动装箱

目录 前言 泛型 1.泛型的目的 2.泛型存在的意义和注意事项&#xff1a; 3.擦除机制 4.泛型的边界 5.泛型方法&#xff1a; 包装类&#xff1a; 前言 只要知道《》是啥意思&#xff0c;其他了解即可 泛型的上界 通配符简单知道就行 泛型 1.泛型的目的 指定当前的容器&am…

【JVM】浅析程序计数器与虚拟机栈

文章目录1. 程序计数器2. 虚拟机栈3. 栈内存溢出1. 程序计数器 Program Counter Register 程序计数器&#xff08;寄存器&#xff09; 程序计数器的作用是什么&#xff1f; 是记录下一条JVM指令的执行地址行号 程序计数器有什么特点&#xff1f; 线程私有的不会存在内存溢出 …

ADI Blackfin DSP处理器-BF533的开发详解59:DSP控制ADXL345三轴加速度传感器的应用2(含源码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 MEMS三轴加速度传感器 我做了一个三轴加速度传感器的子卡&#xff0c;插在这个板子上&#xff0c;然后写了一些有意思的应用程序。 硬件实现原理…

Linux——定制Linux

Linux启动流程 首先&#xff0c;Linux要通过自检&#xff0c;检查硬件设备有没有故障如果有多块启动盘的话&#xff0c;需要在BIOS选择启动磁盘启动MBR中的bootloader引导程序加载内核文件执行所有进程的父进程、老祖宗systemd欢迎界面 加载内核文件的关键文件 kernel文件&a…

C#调用Python脚本训练并生成AI模型(以Paddle框架为例)

目录一. IronPython语言移植1.1 IronPython安装1.2 示例代码1.3 运行结果1.4 特点二. C#调用Python文件打包dll2.1 步骤2.2 限制三. C#命令行调用.py文件执行3.1 代码3.3 运行结果3.4 特点四. C#调用Python可执行exe4.1 步骤4.1.1 使用pyinstaller打包python程序4.1.2 在c#中调…

入门:手动构建镜像

前面我们已经了解了Docker镜像的结构&#xff0c;实际上所有常用的应用程序都有对应的镜像&#xff0c;我们只需要下载这些镜像然后就可以使用了&#xff0c;而不需要自己去手动安装&#xff0c;顶多需要进行一些特别的配置。当然要是遇到某些冷门的应用&#xff0c;可能没有提…

【细胞分割】中值滤波+分水岭法细胞计数【含Matlab源码 640期】

⛄一、图像分割简介 理论知识参考&#xff1a;【基础教程】基于matlab图像处理图像分割【含Matlab源码 191期】 ⛄二、部分源代码 clear; close all; %------------------ %程序中定义图像变量说明 %Image->原图变量; %Image_BW->二值化图象; %Image_BW_medfilt->中…

【实时数仓】DWM层跳出明细计算之需求分析、读取数据、通过Flink的CEP完成跳出判断、写回kafka、测试

文章目录一 DWM层-跳出明细计算1 需求分析与思路&#xff08;1&#xff09;什么是跳出&#xff08;2&#xff09;计算跳出行为的思路&#xff08;3&#xff09;实现思路2 读取数据&#xff08;1&#xff09;代码编写&#xff08;2&#xff09;测试3 通过Flink的CEP完成跳出判断…

【MATLAB100个实用小技巧】——数值分析(85-100)

文章目录前言系列文章85.86. 三次样条插值法87. NEWTON 插值88. hermite 插值89. newton 形式的 hermite 插值90. 平方根法91. gauss 消去法92. 三角分解法93. jacobi 迭代法94. gauss 迭代法95. sor 迭代法96. 最速下降法97. 共额梯度法98. newton 迭代法99. broyden 迭代法10…

前端媒体查询@media示例详解和calc()函数的使用

媒体查询media media 可以针对不同的屏幕尺寸设置不同的样式&#xff0c;特别是如果需要设置设计响应式的页面&#xff0c;media 是非常有用的。当重置浏览器大小的过程中&#xff0c;页面也会根据浏览器的宽度和高度重新渲染页面。 eg&#xff1a;如果文档宽度小于 500 像素…