比特币和区块链详解: Bitcoin: A Peer-to-Peer Electronic Cash System白皮书

背景

考虑当前手机上的余额、手里的现金,其实本质都归属于银行发给我们的欠条,是在政府监管下的流通货币。当我们在做交易时,银行属于可信第三方,银行发行的货币在交易过程中起到了重要作用。但基于金融机构的受信任第三方容易受调解纠纷的影响。这些成本和支付的不确定性可以通过使用实物货币来避免,但不存在在没有可信方的情况下通过通信渠道进行支付的机制。

在2008年,中本聪提出了本文,该论文被认为是区块链的白皮书。讲解了Bitcoin这个分布式账本系统的运转方式。

Bitcoin是一个完全不需要第三方的交易系统,通过计算保证了交易的不可逆性,保证了卖家的资产安全,Bitcoin使用点对点分布式时间戳服务器来生成交易时间顺序的计算证明。只要诚实节点共同控制比任何合作的攻击者节点组更多的 CPU 功率,系统就是安全的(后续会讲解为什么是安全的)。

密码学相应基础

散列函数(英语:Hash function)又称散列算法哈希函数,是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。

当前业界所用比较广泛的加密方式即是SHA256[在线加密演示],可以将任意数据(文本、图片、视频)转换成256位长度的01字符串(转换为16位表示法就是)。使用该标准,使用方可以很轻易的生成所需要加密数据的哈希值(即称为摘要),但是其他人很难通过摘要还原出原始数据

非对称加密

简单来说,公钥和私钥不相同,即可称之为非对称加密,比较经典的算法即是RSA算法

用户可以同时生成公钥和私钥,私钥自己保留,然后交给问价接收者公钥,用户通过私钥对数据进行加密,接收者只能通过公钥对该数据进行解密

2. Transactions

在文章中,中本聪将电子硬币定义为数字签名链

We define an electronic coin as a chain of digital signatures.

每个人在Bitcoin 注册账号后,可以通过一个随机数生成一对公钥和私钥,根据公钥可以生成自己的钱包地址

当A对B发起交易时,A需要公开自己的公钥和钱包地址,B只需要提供自己的钱包地址(只是针对交易内容),因为B需要知道A的公钥,才能对A地数字链所有权进行验证。而下面介绍的是全局验证

假设前一个交易的已经存在hash值,此时A拥有该链(注意是交易链,不是区块链),A对B发起交易,A上一笔交易的散列值为sign0,此时需要sign0 和B的公钥一起进行散列运算得到A的签名sign A, sign A是由A的私钥签名所得到的。如果想验证A的签名就要使用A的公钥。

当A将自己的签名附在交易中之后,这笔电子货币的所有权就从A转给了所有者B。

此时A对应的就是图中的Owner 1,B对应的就是图中的Owner 2,所发生的交易也就是中间的块过度到右边的块(不是指的区块,只是单纯图中的形状),对应着该块电子硬币的所有人从A转给了B

由于没有第三方的监管,所有的交易必须公开宣布,并且需要所有的分布式账本的参与者对交易的历史顺序达成一致。但是只通过该方法无法解决双重支付的问题

双重支付:假设A只拥有10个比特币(BTC),他在发起一笔10BTC的交易给B后,又发起了一笔10BTC的交易给C

收款人将难以检验之前的某位所有者是否对这枚电子货币进行了双重支付。传统银行的解决方案是引入信得过的权威:比如类似于造币厂( mint )的机构。在发生每笔交易后,都需要将所交易的电子货币收回。后面会有该内容的相应解决办法

Timestamp Server

本文为了解决该双重支付的问题,添加了时间戳服务器的使用,需要在对数据求哈希值时,加入当前时间,以此之后,每个散列都包含上一个交易发生的时间戳,以及本次发生交易的时间戳。这个后面会讲述

Proof-of-Work

中本聪最开始定义的区块链中,每个区块差不多1MB大小,每个区块最多只能包含2000多笔交易,每十分钟只能生成一个区块,意味着每十分钟就只能处理2000多笔交易。

当需要形成一个块时,不同的矿工会竞争完成一个"数学题",谁实现了本次数学题,也就完成了本次所需要的"工作量"

所需要实现的内容,是构建一个字符串

  1. 字符串 = 前区块的头部 + 本块中的交易信息 + 时间戳 ( 时间戳服务器生成 ) + 随机数 字符串 = 前区块的头部+本块中的交易信息+时间戳(时间戳服务器生成)+随机数 字符串=前区块的头部+本块中的交易信息+时间戳(时间戳服务器生成)+随机数
  2. 对该字符串求两次hash
    1. Hash=sha256(sha256(字符串))

要求:要求所生成的256位hash值,前N位必须为0。

矿工根据自己的时间戳,以及不断尝试随机数,最终达成所需要满足的要求,当发现了该随机数,即广播自己完成了本次工作。此时矿工会构建该块,并会得到构建区块所提供的奖励。(也会出现两个矿工同时达成目标,竞争块的情况,后续会讲到

除了构建区块的奖励外,矿工还会对交易进行抽成,交易方需自己指定本次交易的手续费,如果没有手续费,不会有矿工对本次交易进行结块。

比特币是一个没有通胀的货币,发行是有限的,矿工出块的奖励每四年会减半,到2140年,发行量达到2100万后,将不会再有出块奖励。

难度设置

关于所生成的256位hash值,前N位的N设置,决定了构建块的难度

N越大,随机生成满足条件的概率越小,随N的增长呈指数级降低

做个简单的计算题,以10000台矿机为例,每台计算机的运行次数为10T/s = 1.4 ∗ 10 13 次 / s 1.4*{10}^{13}次/s 1.41013/s,此时需要满足10分钟构建一个块的要求,

1.4 ∗ 10 次 / s 13 ∗ 1 0 4 ( 机器数目 ) ∗ 600 s ( 10 分钟 ) = 2 N 1.4*{10}次/s^{13} * 10^4(机器数目)*600s(10分钟) = 2^{N} 1.410/s13104(机器数目)600s(10分钟)=2N

此时所计算的N大小约为66,所需要满足前66位为0,能在10分钟内构建块

Network(系统运行机制)

因此Bitcoin这个分布式账本的运行方式就呼之欲出了

  1. 新交易被广播到所有节点(矿工们)
  2. 每个节点根据手续费等因素选择是否将交易收集到一个区块中
  3. 每个节点同时都致力于为其区块寻找困难的工作量证明
  4. 当节点找到工作量证明是,他会将块信息广播到所有节点,
  5. 其他节点会验证该块的交易是否有效,如验证有效后,会接受该块,并且将放弃对自身块工作量证明的寻求
  6. 节点通过使用已接受块的哈希值作为前一个哈希值创建链中的下一个块来表达对块的接受。(继续寻找新的区块)

节点始终遵循最长链原则,此时就可以解决上一节两个矿工的情况

矿工A和矿工B同时完成了对新区块的构建, 同时广播该块的信息,黑色小人先收到A矿工的广播信息,构建自己的A块,红色小人先收到B矿工的广播信息,构建自己的B块,两组分别基于自己的新块构建下一个块,当某一个小组的新块构建成功后,会广播自己的新块,另一个小组在收到该新的最长链的消息后,放弃之前的分歧链,选择在最长链之后构建新块。

通常两个小组的算力决定了下一个区块的归属。

同样,如果某一个区块的消息丢失,也是借鉴相似的运行方式,在收到下一个区块,意识到自己不是最长链的情况下,会放弃构建自己的区块,选择最长链作为自己的主链并继续自己的工作

当在消除分歧时,假设消除矿工A构建的新块,会收回矿工A的手续费和交易构建费(这笔交易应该也是发生在自己的下一个区块构建上,本质上还是区块链上支持的一笔交易),如果A执意选择在自己的块上构建,随着落后的区块数目越来越多,所能追上的概率也就越来越小,最后一节计算了在N个节点落后的情况下追上的概率。

Incentive

本系统的激励机制如上一节描述的那样

交易可以是由完全不熟悉本系统的两个人发起,由其他人对该交易进行记账。别人(矿工)帮你保存该交易的记录,也就会收到该行为所带来的奖励

假设A向B发起一笔10BTC(bitcoin)的交易,他会在发起的同时,标注手续费的大小,该手续费也就是给矿工们保存记录的抽成。

这种激励机制会很有效的鼓励节点保持诚实,因为在分布式账本中要发生欺骗,通常意味着攻击者拥有本系统中超过50%的算力,在该激励条件下,选择遵守该系统的标准,反而更有利于获得财富

Reclaiming Disk Space

一旦硬币中的最新交易被埋在足够多的区块下,之前花费的交易就可以被丢弃以节省磁盘空间。 为了在不破坏区块哈希的情况下实现这一点,交易在默克尔树 中进行哈希处理,只有根包含在区块的哈希中。 然后可以通过砍掉树的树枝来压缩旧块。 内部哈希不需要存储

基于Merkle Tree,比如验证事务3是否真实发生,只需图中的Hash01Hash2的值即可,并不需要知道其他Hash值,Nonce代表的是随机数

关于Merkle Tree 可以看下这篇文章:MIT 6.824 Lecture 18 Fork Consistency & CT & Merkle Tree的应用

这些事务都是在一个Block块中,可能是由多个不同的发起者生成的交易

Simplified Payment Verification

无需运行完整的网络节点即可验证付款。 用户只需要保留最长工作量证明链的区块头副本,他可以通过查询网络节点来获取该副本,直到他确信自己拥有最长的链,并获得将交易链接到区块的 Merkle 分支 他无法自己检查交易,但通过将其链接到链中的某个位置,他可以看到网络节点已接受该交易,并在进一步确认网络已接受该交易后添加区块。

Combining and Splittng Value

尽管可以单独处理硬币,但为转账中的每一分钱进行单独的交易会很麻烦。 为了允许价值的分割和组合,交易包含多个输入和输出。 通常情况下,要么是来自较大的先前交易的单个输入,要么是组合较小金额的多个输入,并且最多有两个输出:一个用于付款,一个将找零(如果有)返回给发送者。

应该注意的是,扇出(其中一个事务依赖于多个事务,而这些事务又依赖于更多事务)在这里不是问题。 永远不需要提取交易历史记录的完整独立副本。

扩展

结合上两节,本节讲一下身份验证、余额检查和双重支付的问题

身份验证

  1. A发起一笔交易,通过Hash生成该交易的摘要,然后使用私钥对该摘要进行加密生成"密码"
  2. A向全网络广播自己的这笔交易(又可能并不是本人广播的), 附带自己的公钥和经过私钥生成的密码
  3. 其他人(矿工)根据这笔交易hash生成摘要1,然后使用公钥对密码进行解密生成摘要2
  4. 如果摘要1和摘要2比对后法案一致,证明A的密码是正确的,意味着“A”有唯一的私钥,确定是A地广播

余额检查

BitCoin分布式账本通过追溯的方式确定用户的余额,当已有的块上,A已经拥有了两笔交易,分别是获取的50个BTC,以及已经支付的20个BTC

此时当A发起10BTC的交易给B,此时矿工们会检查之前的块,如果通过,会将其构建在自己的块中,本处为通过

此时当A发起60BTC的交易给B,此时矿工们也会检查之前的块,不通过

双重支付

这小节来讲一下双重支付的问题,假设A有10个BTC,然后同时发起了两笔交易

  1. 给B转账10BTC
  2. 给C转账10BTC

此时有两组矿工分别先后接受了这两笔交易,假设上面这一组先接受了A给B发起的交易,下面这组先接受了A给C发起的交易,矿工们在确认先接受的交易符合余额的要求,后面接受的交易不符合要求,舍弃。

此时两组会分别将这两个交易打包到自己的块中,然后争取完成工作量证明,假设上面的红色框中的小人完成了工作量证明。A给B发起的10个BTC的交易完成。他会广播自己构建的新块,此时下面的小组就会放弃自己构建的A发起的给C的交易记录

Privacy

该分布式系统通过保持公钥匿名

公众只会看到一笔交易的发起,却看不到交易者的信息,同时,为了防止个人地址被攻击。

每笔交易都应使用新的密钥对,以防止它们链接到共同的所有者。 对于多输入交易,一些链接仍然是不可避免的,这必然表明它们的输入由同一所有者拥有。 风险在于,如果密钥的所有者被泄露,链接可能会泄露属于同一所有者的其他交易。

Calculation

本节就是计算了在落后z个区块后,追上最长链的概率

p = 诚实节点发现新块的概率 q = 攻击者发现新块的概率 q z :攻击者在落后 z 个区块后追上的概率 p = 诚实节点发现新块的概率\\q=攻击者发现新块的概率\\q_z:攻击者在落后z个区块后追上的概率 p=诚实节点发现新块的概率q=攻击者发现新块的概率qz:攻击者在落后z个区块后追上的概率

感兴趣的可以看看这个公式的计算过程

p和q对应着算力比率,通常情况下,攻击者的算力会远远小于诚实节点的算力

论文中给出了攻击节点在0.1和0.3概率线,落后z个节点,追上的概率。

以及计算了需要多个区块,在不同攻击者算力占比的情况下,追上概率小于0.001的情况

通常情况下,大额的比特币交易,只有在构建六个长区块的情况下,才会确认这笔交易完成。防止被恶意追上的情况。

总结

由于比特币对交易双方隐私的保护,以及比特币价值不断增长,越来越多不法分子通过Bitcoin这个分布式账本完成非法交易。同时,由于激励机制与实际财富绑定,滋生了大量的矿工,为了分一杯羹,甚至一些电脑制造业和显卡厂商下场参与比特币的获取。不得不承认,有些人通过比特币实现了财富扩张,但也有很多跟风者做了韭菜。

投资不代表投机,抛开滋生的灰色产业不谈,比特币所产生的影响是划时代的,他真正将分布式系统知识融入进了金融领域,对传统货币体系造成了冲击。社会上很大一部分价值的本质最终还是来源于知识。

Reference

  1. https://ccie.lol/knowledge-base/bitcoin-a-peer-to-peer-electronic-cash-system/
  2. 【比特币和区块链啥原理?矿机挖矿咋回事?李永乐老师讲比特币(1)】 https://www.bilibili.com/video/BV1Bb411B7dq/?share_source=copy_web&vd_source=30d519915fac59bb5f6e7a62b910a5a2
  3. 【比特币交易如何防伪?私钥公钥地址啥意思?李永乐老师讲比特币(2)】 https://www.bilibili.com/video/BV12b411q7ku/?share_source=copy_web&vd_source=30d519915fac59bb5f6e7a62b910a5a2
  4. 【新人必看,10分钟了解比特币工作原理和流程,你不得不懂的知识。区块链资讯 比特幤bitcoin||比特币BTC】 https://www.bilibili.com/video/BV15z411v7ob/?share_source=copy_web&vd_source=30d519915fac59bb5f6e7a62b910a5a2

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用pytorch构建带梯度惩罚的Wasserstein GAN(WGAN-GP)网络模型

本文为此系列的第三篇WGAN-GP,上一篇为DCGAN。文中仍然不会过多详细的讲解之前写过的,只会写WGAN-GP相对于之前版本的改进点,若有不懂的可以重点看第一篇比较详细。 原理 具有梯度惩罚的 Wasserstein GAN (WGAN-GP)可以解决 GAN 的一些稳定性…

【WEEK6】 【DAY2】DQL查询数据-第二部分【中文版】

2024.4.2 Tuesday 接上文【WEEK6】 【DAY1】DQL查询数据-第一部分【中文版】 目录 4.4.连接查询4.4.1.JOIN 对比4.4.2.七种JOIN4.4.3.例4.4.3.1.本例中INNER JOIN和RIGHT JOIN结果相同4.4.3.2.LEFT JOIN4.4.3.3.查询缺考的同学4.4.3.4.思考题:查询参加了考试的同学信…

Visual Studio安装下载进度为零已解决

因为在安装pytorch3d0.3.0时遇到问题,提示没有cl.exe,VS的C编译组件,可以添加组件也可以重装VS。查了下2019版比2022问题少,选择了安装2019版,下面是下载安装时遇到的问题记录,关于下载进度为零网上有三类解…

redis的哈希Hash

哈希是一个字符类型的字段和值的映射表,简单来说就是一个键值对的集合。 查看里面的name或者age在不在里面,0说明已经删了的 用来获取person里的键

[C#]使用OpencvSharp去除面积较小的连通域

【C介绍】 关于opencv实现有比较好的算法,可以参考这个博客OpenCV去除面积较小的连通域_c#opencv 筛选小面积区域-CSDN博客 但是没有对应opencvsharp实现同类算法,为了照顾懂C#编程同学们,因此将 去除面积较小的连通域算法转成C#代码。 方…

Java获取IP地址以及MAC地址(附Demo)

目录 前言1. IP及MAC2. 特定适配器 前言 需要获取客户端的IP地址以及MAC地址 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;public class test {public static void main(String[] args) {try {// 执行命令Process process…

Nginx在Kubernetes集群中的进阶应用

简介 在现代DevOps环境中,Nginx作为负载均衡器与Kubernetes的Ingress资源的结合,为应用程序提供了强大的路由和安全解决方案。本文将深入探讨如何利用Nginx的灵活性和功能,实现高效、安全的外部访问控制,以及如何配置Ingress以优…

智能小车测速(3.26)

模块介绍: 接线: VCC -- 3.3V 不能接5V,否则遮挡一次会触发3次中断 OUT -- PB14 测速原理: cubeMX设置: PB14设置为gpio中断 打开定时器2,时钟来源设置为内部时钟,设置溢出时间1s&#xff0c…

上位机图像处理和嵌入式模块部署(qmacvisual图像清晰度)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 做过isp的同学都知道,图像处理里面有一个3a,即自动曝光、自动白平衡和自动对焦。其中自动对焦这个,就需要用输入…

qt通过setProperty设置样式表笔记

在一个pushbutton里面嵌套两个label即可,左侧放置图片label,右侧放置文字label,就如上图所示; 但是这时的hover,press的伪状态是没有办法“传递”给里面的控件的,对btn的伪状态样式表的设置,是不…

IP SSL的应用与安装

IP SSL,即互联网协议安全套接字层,它是一种为网络通信提供安全及数据完整性的安全协议。在网络传输过程中,IP SSL可以对数据进行加密,这样即便数据在传输途中被截取,没有相应的解密密钥也无法解读内容。这一过程如同将…

防抖节流面试

1、防抖 1.1、条件 1、高频 2、耗时(比如console不算) 3、以最后一次调用为准 刷到个神评论,回城是防抖,技能cd是节流 1.2、手写 传参版本 function debounce(fn,delay){let timerreturn function(...args){//返回函数必须是普…

动态规划详解(Dynamic Programming)

目录 引入什么是动态规划?动态规划的特点解题办法解题套路框架举例说明斐波那契数列题目描述解题思路方式一:暴力求解思考 方式二:带备忘录的递归解法方式三:动态规划 推荐练手题目 引入 动态规划问题(Dynamic Progra…

QT子窗口关闭时自动释放及注意事项

先说方法,很简单,有如下API函数可用: testDialog->setAttribute( Qt::WA_DeleteOnClose, true ); 他的官方解释如下: 最后,说一个注意事项: 最近写python程序比较多,回过头来&a…

OPPO VPC 实践探索

01 概述 一年前(20年6月),OPPO云网络技术底座开始支持VPC方案,解决了用户担心的云上安全和虚拟实例的性能问题。我们称这个版本为VPC1.0,其采用了先进的智能网卡加速和VXLAN隧道隔离技术,实现了VPC从无到有的突破。 然而由于业务快…

爬虫部署平台crawlab使用说明

Crawlab 是一个基于 Go 语言的分布式网络爬虫管理平台,它支持 Python、Node.js、Jar、EXE 等多种类型的爬虫。 Crawlab 提供了一个可视化的界面,并且可以通过简单的配置来管理和监控爬虫程序。 以下是 Crawlab 的一些主要优点: 集中管理&am…

绿联 安装Mysql数据库

绿联 安装Mysql数据库 1、镜像 mysql:5.7 数据库5.7.x系列。 mysql:8 数据库8.x.x系列,安装方式相同。 2、安装 2.1、拉取镜像 拉取5.7.x版本的镜像。 2.2、基础设置 重启策略:第三或第四项均可。 2.3、网络 桥接即可。 2.4、命令 在原有的“mys…

概率论基础——拉格朗日乘数法

概率论基础——拉格朗日乘数法 概率论是机器学习和优化领域的重要基础之一,而拉格朗日乘数法与KKT条件是解决优化问题中约束条件的重要工具。本文将简单介绍拉格朗日乘数法的基本概念、应用以及如何用Python实现算法。 1. 基本概念 拉格朗日乘数法是一种用来求解…

EPSON机器人仿真实战攻略:从设置通信到运行调试一网打尽!

EPSON机器人 仿真测试深度教程 机器人还没到,怎么提前验证写好得机器人程序? 强大的仿真功能来了!本文详细深入的介绍了仿真的功能,一步步教会你如何仿真! 请先关注公众号收藏,防止走丢! 需要先设置电脑与控制器通信的虚拟连接,设置-电脑与控制器通信-增加-选择连接…

第27篇:T触发器实现4位计数器

Q:本篇我们用T触发器实现时序逻辑电路--计数器。 A:T触发器(Toggle Flip-Flop)只有一个信号输入端,在时钟有效边沿到来时,输入有效信号则触发器翻转,否则触发器保持不变,因此T触发器…