写在前面 


  • 博客主页:kikoking的江湖背景
  • 欢迎关注点赞收藏⭐️留言
  • 本文由 kikokingzz 原创,CSDN首发!
  • 首发时间:2021年1月12日
  • 最新更新时间:2021年1月12日
  • ✉️坚持和努力一定能换来诗与远方!
  • 作者水平很有限,如果发现错误,请留言轰炸哦!万分感谢感谢感谢!
  • 热榜杂谈必看文:你说,区块链也是一种数据结构?

目录

 写在前面 

1.基本知识

1.1 区块

1.2 区块高度

2.货币的发展阶段

2.1 以物易物

2.2 实物货币

2.3 纸币

2.4 中心化记账货币

2.5 比特币诞生

3.比特币的钱包、私钥和签名

3.1 比特币的所有权确立

3.2 公钥与私钥

3.3 钱包

钱包定义

冷钱包 

热钱包 

3.4 交易

UTXO

 例1

公钥脚本

多方签名

4.非对称加密算法

4.1 为什么要使用非对称加密?

4.2 什么是非对称加密?

4.3 非对称加密的工作原理

4.4 非对称加密的应用

比特币的所有权

交易验证

4.5 椭圆曲线算法

5.如何避免记假账? 

6.哈希运算与难以篡改 

6.1 哈希算法

6.2 哈希算法的特征

1.单向性

2.可以根据任意长度的消息计算出固定长度的散列

3.不同的输入就有不同的输出

4.四是算法效率高

6.3 典型的哈希算法

6.4 哈希函数的特性

6.5 哈希指针

区块链和普通链表的区别

哈希指针与区块链的关系

6.6 Merkle树

什么是Merkle树呢?

Merkle树的作用

Merkle树的特点

7.双花问题与UTXO

7.1 双花问题

7.2 如何避免双花问题?

传统电子支付

比特币系统

7.3 UTXO机制

UTXO的概念

比特币与UTXO的关系

比特币交易的规则

8.共识机制

8.1 什么是共识?

达成共识的主体

对什么达成一致

8.2 什么是共识算法?

8.3 比特币的共识算法——PoW

PoW如何证明你的工作量呢?

为什么不采用过程导向的共识机制?

PoW的特征:不对称性

9. (51%攻击)

9.1 算力

9.2 区块链转账的基本原理

9.3 51%攻击

典型案例

9.4 什么时候才会发生51%攻击呢?

某个矿池的算力过大

有无限的资本

9.5 51%攻击悖论


1.基本知识


1.1 区块

区块是一种容器数据结构,这种数据结构被包含在公开账簿里,聚合了交易信息;而这个公开账簿是区块链;区块是构成区块链的基本单元,由区块头区块体构成。


1.2 区块高度

区块高度是用来标识一个区块在区块链中位置的一个概念。

为什么区块高度不能唯一标识一个区块?

因为在同一时间,有可能存在两个或两个以上的区块,他们相对于整条区块链来说,处于平等的位置,所以他们有着相同的区块高度。

✨✨✨我是分割线✨✨✨ 

2.货币的发展阶段



2.1 以物易物

以物易物的方式需要满足双重偶然性,举个例子来说就是我这恰好有一袋苹果,对方那刚好也有一袋面粉,同时我们彼此需要对方的东西,这时候才可以进行交换。


2.2 实物货币

此时我们通过贝壳或者一些金银来作为等价物作为中介来交换,此时就不需要像之前的以物换物那样满足双重偶然性了;但是由于实物容易磨损、不易携带、数量有限等缺点进而发展出了纸币


2.3 纸币

现在我们生活中的一张红色的毛爷爷制作成本其实很低,但是却可以用它购买价值100元的商品,这是因为国家的信用在背书,让人们相信一文不值的货币具有100元的购买力

“信用背书”意思是信用担保。比如用公司的信誉作为你的“信用背书”,意思就是我公司担保你为可信之人,可以与他建立业务。


2.4 中心化记账货币

移动电子支付的实质为记账货币,是通过银行、第三方支付机构、央行负责记账的,而央行具有整个国家大账本的记账权,本质上就是一种中心化的记账方式。无论是使用微信或者支付宝,我们都不得不完全信任第三方,因为我们的钱存储在他们这仅显示为数字,假如第三方数据遭受到篡改,我们的财产就会遭受到损失。


2.5 比特币诞生

为解决此问题,则必须要有一套独立的电子货币体系:于是乎比特币诞生了!

中本聪在《一种点对点的电子现金支付系统》中提到:

为了满足比特币的要求,区块链技术应运而生了,或者说比特币是区块链兴起的源头,是区块链最早、最成功的应用。

✨✨✨我是分割线✨✨✨

3.比特币的钱包、私钥和签名


3.1 比特币的所有权确立

比特币的所有权是通过私钥和地址来确立的。

·地址类似于一个银行账户的账号,要想给一个人转比特币,只要知道他的比特币地址就可以了。

·私钥的作用主要是给交易来签名,用来证明这笔交易是由你发起的,别人收到这笔交易,通过验证签名就可以确认交易中涉及的资金是合法的。


3.2 公钥与私钥

比特币采用的就是非对称密码体制

公钥加密发明于20世纪70年代,自从公钥加密被发明之后,一些不可逆的数学函数被提出,就是说只能向一个方向计算,但不可以向相反方向倒推。

在比特币中,公钥用于接收比特币私钥用于生成其对应地址上支付比特币所必需的签名,以唯一确定这些比特币的所有权。具体到比特币地址的生成,其实是先产生私钥,私钥通过椭圆曲线算法这种不可逆的函数来产生公钥,公钥经过一系列不可逆的运算再来产生地址。


3.3 钱包

从上述内容我们可以知道,私钥持有者才是比特币的拥有者,那么私钥放在哪里呢?

钱包是私钥的容器,是密钥的管理工具,它只包含密钥而不是确切的某一个代币。一个比特币钱包中包含一系列的密钥对,每个密钥对包括一个私钥和一个公钥。


钱包定义

​wallet.dat文件其实是用我们自己设置的密码加密过的,登录钱包软件时,需要用户输入密码来对文件进行解密得到真正的私钥,这时私钥存在钱包程序的内存中,当我们需要发起一笔交易时,钱包软件去内存中获取这一私钥来对交易进行签名操作。

冷钱包 

热钱包 


3.4 交易

比特币交易就是:从一个比特币钱包向另一个中转账,每笔交易都有数字签名来保证安全。一个交易一旦发生那么就是对所有人都公开的每个交易的历史可以最终追溯到相应的比特币最初被挖出来的那个点。用户用钱包中的私钥来签名交易,从而证明他们拥有交易的输出,也就是其中的比特币。

·比特币是以交易输出的形式储存在区块链中的。

比特币并不存在于任何地方,即使是硬盘上。持有比特币其实是拥有特定比特币的地址,但是其实所谓的币并不是直接就存在于这个地址中的,地址就相当于你的银行账户。世界上没有一个可以摸得着的实物,或者是一个数据文件,可以被叫做 “比特币” 的。有的只是各个地址之间的转账记录,余额时增时减。所有的交易都存放在一个非常大的账本文件中,这个文件叫做“区块链”。如果想知道一个比特币地址中的余额,那么这个不是直接存放在比特币地址中的,我们需要到区块链中去计算出来。


UTXO

第一笔矿工挖矿的收入交易通常被称为Coinbase,它没有输入,所以交易输入的哈希总是被标记为0000…0000;其他任何一个交易输入都会唯一追溯到区块链上在本区块之前的某个交易哈希以及索引。通过交易哈希和索引,即可唯一确定一个未花费的交易输出——UTXO。这样,每一个交易输入都和之前的某个交易输出关联了起来。

对于Bob来说,他有来自Alice的30个BTC输入,但是有0输出,则可以计算出Bob的UTXO=20+10=30


 例1

Q1:请写出Alice和Bob交易时产生的“输入”中的信息,及Bob的UTXO值

Q2:请写出Bob与Tom和Jimmy交易时产生的“输入”中的信息,及Bob的UTXO值

A1:其中记录了最初Alice拥有这些币是从哪个地址转给她的;此时Bob的UTXO=10+20=30

A2:由上述交易过程中的信息可知,在Bob与Tom、Jimmy的交易过程中一共输出了25BTC,由于Bob与Alice的单笔交易中:10BTC与20BTC无法单独满足,因此在与Tom和Jimmy的交易信息的输入:应当包含Alice向Bob的两笔交易所包含的所有信息;此时Bob的UTXO=30-20-5=5


公钥脚本

从上述的例子中我们不难发现,输入是对之前输出的引用,那么其他人是否也可以引用Alice的交易数据作为自己的输入,也就是把这笔钱搞到自己的账户里去呢?

那当然是不行啦!因为Alice在给Bob转账的时候,加了一个条件,这个条件在比特币交易中叫做公钥脚本。而在上述例子中的公钥脚本里的内容,就是使用交易输出的账户地址必须是Bob,那么其他人可不可以冒充Bob来花费这笔输出呢?因为其他人也有可能知道Bob地址和公钥其他人也可能知道。这就引出了签名与验签:


多方签名

比特币中还支持多方签名。如果Bob要使用Alice转给Bob的这两笔交易,那么不仅需要Bob签名,还需要Alice签名,这样万一其中一个人的私钥被盗,也不会丢失比特币的!

✨✨✨我是分割线✨✨✨

4.非对称加密算法


4.1 为什么要使用非对称加密?

为此我们可以对快递包中的内容加密,但是如何把加密信息的密码安全地发送给Bob呢?


4.2 什么是非对称加密?

简单概括为16字方针:公钥加密、私钥解密、私钥签名、公钥验签


4.3 非对称加密的工作原理


4.4 非对称加密的应用

比特币的所有权

我们平时所说的某人对一个比特币拥有所有权,事实指的是他拥有这个比特币地址所对应的私钥

交易验证

当使用一个UTXO时,用户要提供这个UTXO中描述的地址对应的公钥、同时用这个公钥对应的私钥对这个交易进行签名,这样比特币的接收者才能去验证这笔交易是否有效。

其中比特币中的公私钥生成以及签名算法ECDSA都是基于椭圆曲线算法的 


4.5 椭圆曲线算法

✨✨✨我是分割线✨✨✨

5.如何避免记假账? 


在比特币交易中有三个保障来避免记假账:

1.用私有密钥对交易信息签名,必须用配对的公共密钥验证签名,私用密钥的使用者必须是付款人(采用非对称加密算法)

2.被签名的交易信息在网络上进行广播,所有参与到比特币网络的人都可以接收到这笔交易信息,并且可以对交易信息进行验签,确保交易是合法的(采用非对称加密算法)

3.接收到交易信息后,大家会按照约定的规则生成区块,就是一个数据块,这个数据块中包括所有的交易明细信息,按照merkle树的方式组装起来(所有的交易数据是按照merkle树的方式组装起来,merkle树的数据结构可以很好的保证数据安全

✨✨✨我是分割线✨✨✨

6.哈希运算与难以篡改 


6.1 哈希算法

相同的数据输入将得到相同的结果。输入数据只要稍有变化(比如数据中一个1变成了0)则将得到一个于差万别的结果,且结果无法事先预知。具体来说就是哈希算法将数据打乱、混合、压缩成一个摘要,使得数据量变小,重新创建一个叫做哈希值的指纹。


6.2 哈希算法的特征

1.单向性

哈希算法必须具备单向性:只能由输入的数据或者消息计算出一个定长的哈希值,而不能通过这个哈希值反向推算出输入的数据或者消息。

2.可以根据任意长度的消息计算出固定长度的散列

哈希算法生成的哈希值的长度必须是固定的,而且是针对任意长度的输入数据这一性质保证了哈希算法的易用性。

因为哈希算法的一个使用目的就是用最后的哈希值来代表输入数据,那么最后的哈希值很长、不固定或跟原始数据一样长,那么通过哈希值的对比来确定原始数据就跟直接校验原始数据一样费力没有区别了。最后的长度要控制在一个固定的、合适的值,才能体现出哈希值作为原数据指纹或者说摘要的特征。

3.不同的输入就有不同的输出

哈希算法被发明的目的之一就是根据此需求来的:可以实现对数据完整性和一致性的判定,只有一模一样的数据经过同一个哈希运算得到的哈希值才是一样的。

无论输入数据的长度大小,都会产生定长的哈希值,这样比对结果就比较快速方便,对于数据的防篡改、防缺失都是很好的校验方式。

4.四是算法效率高

计算哈希值的时间短,保证不管数据有多长,都能在可接受的范围内得到哈希结果。


6.3 典型的哈希算法

Hash算法中比较著名的是MD系列和SHA系列。

·MD系列算法是在上个世纪o年代初由Mit laboratory for computer science和RSA data security inc的Rivest设计的,MD代表消息摘要(MessageDigest),MD2(1989)、MD4(1990)和MD5(1991)都产生一个128位的信息摘要。

·SHA系列算法是NIST根据Rivest设计的MD4和MD5开发的算法,国家安全局发布SHA作为美国政府标准,SHA(Secure Hash Algorithm)表示安全散列算法


6.4 哈希函数的特性

1.可以用于“任意”长度的消息

2.产生的Hash值是固定长度的

3.对于任意给定的消息M,容易计算 H(M) 值

4.单向性(抗原像性):对于给定的Hash值h,要找到M使得 H(M)=h 在计算上是不可行的。


6.5 哈希指针

普通指针只是保存结构体在内存中的位置,而哈希指针是不仅要保存结构体在内存中的位置,还要保存结构体的哈希值;这样的好处是,通过哈希指针,不仅能够找到结构体的位置,还能知道结构体是否被篡改。

区块链和普通链表的区别

比特币背后的技术主要是区块链,而区块链是由一个个区块连接而成,区块链和普通链表的主要区别就在于用哈希指针代替了普通的指针。普通链表如果内容发生了改变,指针不会发生改变,区块链一旦内容发生了变化,后面区块的哈希指针都会发生变化,类似于多米诺骨牌效应。

哈希指针与区块链的关系

可见哈希运算能够帮助识别区块链是否被篡改,区块链的哈希指针能够唯一而精准地识别一个区块,区块链中任意结点通过简单的哈希运算,都可以获得这个区块的哈希指针,计算出的哈希值没有变化就意味着区块链中的信息没有被篡改。另外,哈希运算还能够帮助把各个区块串连成区块链。每个区块都包含上一个区块的哈希值和下一个区块的值,就相当于通过上一个区块的哈希值挂钩到这一个区块,通过这一个区块的哈希值挂钩到下一个区块,然后自然而然形成一个链式结构的区块链


6.6 Merkle树

什么是Merkle树呢?

它使用单向哈希:哈希树的顶部为顶部哈希(根哈希/主哈希),它是通过并联两个子哈希来往树上爬直到找到根哈希。

Merkle树的作用

1.可以快速定位每笔交易,由于交易在存储上是线性存储,定位到某笔交易会需要遍历,效率低时间慢,通过这样的二叉树可以快速定位到想要找的交易

2.在不需要存储整个数据的情况下,就可以简明地核实交易是否被篡改,从交易到每个二叉树的哈希值,有任何一个数字的变化都会导致根哈希的变化。同时,如果有错误,可以快速定位到错误的地方。

Merkle树的特点

·Merkle tree是一种树状结构,它具有树结构的所有特点

·Merkle tree的叶子结点的值是数据集合的单元数据,或者是单元数据的哈希值

·非叶子结点的值是根据它下面所有叶子结点的值,按照哈希算法计算而得出的

 ✨✨✨我是分割线✨✨✨

7.双花问题与UTXO


7.1 双花问题


7.2 如何避免双花问题?

传统电子支付

·依赖于第三方信任机构

·对数据进行中心化管理,并通过实时修改账户余额来防止“双花”的 出现

·弊端:人类需要为交易中第三方验证支付巨额费用。

比特币系统


7.3 UTXO机制

UTXO的概念

UTXO是Unspent Transaction Outputs的缩写,全称叫做“尚未使用的交易输出”

  • U代表Unspent,表示未支付的或尚未使用的,“尚未支付”指的是这个交易输出还没有出现在其它交易的输入端。
  • TX是transaction的缩写,交易是从一个比特币钱包向另一个钱包转账,是唯一可以改变比特币所有权的方式,包含了输入、数目和输出这些基本内容。
  • O是Output,是输出的意思,TXO连起来就是指交易输出

比特币与UTXO的关系

比特币里并没有用户帐户的概念。 我们说自己有多少比特币实际上是指的我们拥有所有权的那些UTXO中所指明的比特币的数量。Alice有10个比特币,本质上来说其实是当前区块链账本中,有若干笔交易的UTXO项收款人写的是Alice的地址,而这些UTXO项的数额总和是10


比特币交易的规则

1.除了 coinbase交易之外,所有的资金来源都必须来自前面某一个或者几个交易的 UTXO。

2.任何一笔交易的交易输入总量必须等于交易输出总量,等式两边必须配平;即每一次交易的输入值都必须全部花掉,不能只花掉部分。

  • 比如,我要转出比特币给你的钱包地址中只有 8 个比特币,那么很简单,我发起一个交易,把这 8 个比特币转到你的钱包地址中,我签名确认这个交易。但假如我的钱包地址中有 25 个比特币,那我发起的交易就不是转给你 8 个比特币,然后自己的钱包地址中还剩下 17 个比特币。这时,我发起的交易是:从我的钱包地址中转 8 个比特币给你,同时转 17 个比特币给我的同一地址。

我们这里通过一个比特币交易的例子加深对于UTXO的理解:

1. 假设Alice之前通过挖矿获得了 12个比特币,在她的地址中,这些比特币是某个币基交易的 UTXO

2.Alice 发起两个交易,第一个交易的输入是自己的上一个交易,输出是 Bob 的地址,数量是 2个比特币;第二个交易的输出是Alice自己的地址,数量是10个比特币。Alice 用自己的私钥对交易进行签名。

 ✨✨✨我是分割线✨✨✨

8.共识机制


8.1 什么是共识?

共识,从语文的角度进行理解,即许多不同的人对同一件事情达成一样的或者至少说方向一致的看法。这个解释同样适用于比特币网络。

达成共识的主体

当前这个区块链中的一些节点,到底哪些节点需要达成一致,这是一个需要考虑的问题。

对什么达成一致

共识机制涉及了区块该如何生成以及生成之后如何选择的问题。 ——区块和交易

在区块链当中,由于每个节点都是平等的,没有一个中心机构的存在,因此这时候就需要通过共识机制来达成节点间的一致。


8.2 什么是共识算法?

共识算法是为了达成共识所依据的一种规则,是筛选出具有代表性的节点的方法为此,区块链设计了一定的底层算法,通过这个特定的算法来选出那个可以生成新区块的节点,同时对于每一笔在这条区块链上进行的交易是否准许完成进行了约束和规定,也就是共识算法。共识算法规定了,下一个新区块由哪个矿工生成,同时,在这条区块链上一笔交易要达成,需要被共识算法选出的部分节点达成一致的观点,也就是说对于一笔交易,如果利益不相干的若干个结点能够达成共识,就可以认为全网对此也能够达成共识。


8.3 比特币的共识算法——PoW

比特币采用工作量证明(PoW, Proof of Work)算法,用来确认你做过一定量的工作

区块链中的每个矿工都有资格生成区块,因此为了决定下一个区块由谁生成,需要通过一定的方法来决定。在Pow机制中,所有结点通过随机的尝试和计算,直到有一个结点找到了那个随机哈希散列的数值解,成为有资格生成新区块的主体。

·优点:完全去中心化

·缺点:1. 挖矿行为造成了大量的资源浪费     2. 达成共识所需要的周期较长


PoW如何证明你的工作量呢?

通过工作结果——>当用户做一定难度的工作得出一个结果时,通过展现出这个结果证明你完成了一定的工作量——>也就是说PoW作为一种共识机制, 它是结果导向而非过程导向的。

为什么不采用过程导向的共识机制?

因为在实际应用中,如果我们通过监测工作的整个过程来证明工作量,这是极为低效的,为了保证一定的效率,就设计了通过验证结果的方式证明工作量的方法。


PoW的特征:不对称性

进行实际工作的用户需要付出很多的工作量才能得到一个符合已定条件的结果,但是作为验证方却可以根据用户提供的材料很容易重算这个结果,同时验证这个结果是否满足提前规定好的条件。

所以,在工作量证明中,你工作的时间越长,工作时采用的设备越先进,你的工作量就越高,你收获的也会越多。虽然短期看可能有运气因素,但是宏观长期来看是公平的,谁工作付出的多,谁得到的就多。

 ✨✨✨我是分割线✨✨✨

9. (51%攻击)


9.1 算力

算力,也叫哈希率,是用来衡量进行哈希运算的能力的指标,或者说进行一次哈希计算所需要使用的时间。如果说网络达到了10T hash/s(10T哈希每秒)的哈希率时,就意味着它可以每秒进行10万亿次计算。

哈希碰撞:解出随机哈希值不断尝试的过程。

一个挖矿机每秒钟能做这种碰撞的次数,代表其算力

矿工进行挖矿所使用的机器越先进,算力就会越高。


9.2 区块链转账的基本原理

整个区块链网络之所以能运行,靠的就是整个网络的“矿工“,因为他们通过算力解答加密难题,从而挖出新的区块。挖出区块后,他们就有权力将转账信息放入区块中,然后完成这笔转账,这就是区块链转账的基本原理。


9.3 51%攻击

51%攻击(Majority Attack),就是说在整个网络中有人的算力超过了全网的50%。那么他就可以尝试对区块链的状态进行修改,进行反向交易,实现双花。


典型案例

我们设想,Alice现在控制了比特币网络上51%以上的算力,在控制算力的期间,她把一定数量的比特币发给自己在交易所的钱包,这条分支我们命名为分支A。同时,她又把这些比特币发给另一个自己控制的钱包,这条分支我们命名为分支B。分支A上的交易被确认后,她立马卖掉这些比特币,成功套现。这时候,分支A成为主链。然后,Alice在分支B上进行挖矿,因为她控制了全网50%以上的算力,所以有很大的几率获得记账权,于是很快,分支B的长度就超过了分支A的长度,那么分支B就会成为主链,分支A上的交易就会被回滚。所谓回滚,指的是程序或数据处理错误,将程序或数据恢复到上一次正确状态的行为。

这时候,由于交易回滚,分支A恢复到Alice发起第一笔交易之前的状态,所以她之前换成现金的那些比特币又回到了自己手里。于是这些比特币就成为了交易所的损失。最后,Alice把这些比特币发到自己的另一个钱包。就这样,她凭借51%以上的算力控制,实现了同一笔token双花


9.4 什么时候才会发生51%攻击呢?

某个矿池的算力过大

ps:矿池(Mining Pool),为了将少量算力合并联合运作所建立的网站。

由于现在生产新区块越来越难,出现了矿工间合作组成矿池,汇聚数以千计参与者们的算力,一起参与挖矿并分享奖励的行为。在这种情况下,一旦某个矿池汇集了过多的矿工,其算力超过了全网的50%,这时就出现了51%攻击的风险

有无限的资本

拥有无限的资本,购买无限多的设备,就可以发起51%的攻击


9.5 51%攻击悖论

虽然看起来51%攻击非常恐怖,不过这通常仅存在于理论情况下。因为如果你想做到,首先需要足够的钱去掌控全网51%的算力,这将是非常大的一笔投资。其次在攻击后,币种价格会受到影响,你要卖出非常多的币才能达到收支平衡。这就是51%攻击悖论。