区块链

1.区块链是世界上最慢的数据库

2.hash碰撞会发生,因为他输出的范围是有限的(2的256次方),但输入的范围是无限的(任意形式的输入),

3.例如x≠y H(x)=H(y) 两个不同的输入,输出却是相等的,这就称哈希碰撞,(即x≠y,则函数值不相等)

4.在比特币系统中开账户:
在本地创立一个公私钥匙对(public key ,private key),这就是一个账户。公私钥匙对是来自于非对称的加密技术(asymmetric encryption algorithm)。

5.两人之间信息的交流可以利用密钥(encryption key),A将信息加密后发给B,B收到后用密钥解密,因为加密和解密用的是同一个密钥,所以叫对称加密。前提是有渠道可以安全地把密钥分发给通讯的双方。因此对称加密的缺点就是密钥的分发不方便,因为在网络上很容易被窃听。非对称密钥是用一对密钥而不是一个,加密用公钥,解密用私钥,加密和解密用的都是接收方的公钥和私钥。公钥是不用保密的,私钥要保密但是私钥只要保存在本地就行,不用传给对方。公钥相当于银行账号,别人转账只要知道公钥就行,私钥相当于账户密码,知道私钥可以把账户上钱转走。公钥和私钥是用来签名。
假如A想向B转10个比特币,A把交易放在区块链上,别人怎么知道这笔交易是A发起的呢?这就需要A要用自己的私钥给交易签名,其他人收到这笔交易后,要用A的公钥去验证签名。签名用私钥,验证用公钥,用的仍然是同一个人的。创建账户产生相同公私钥的可能性微乎其微,所以大量创建账户来窃取其他人账户是不可行的。
我们假设产生公私钥时有一个好的随机源(a good source of randomness),产生公私钥是随机的,如果随机源不好,就有可能产生相同的公私钥。比特币中用的签名算法,不仅是生成公私钥的时候要有好的随机源,之后每一次签名时也要有好的随机源。只要有一次签名用的随机源不好的话,就有可能泄露私钥。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

第三节:比特币的数据结构
普通指针存储的是某个结构体在内存中的地址。假如P是指向一结构体的指针,那么P里面存放的就是该结构体在内存中的起始位置。而哈希指针除了要存地址之外,还要保存该结构体的哈希值H()。好处是:从哈希值这个哈希指针,不仅可以找到该结构体的位置,同时还能够检测出该结构体的内容有没有被篡改,因为我们保存了它的哈希值。

比特币中最基本的结构就是区块链,区块链就是一个一个区块组成的链表。区块链和普通的链表相比有什么区别:
①用哈希指针代替了普通指针(B block chain is a linked list using hash pointers)

区块链第一个区块叫作创世纪块(genesis block) 最后一个区块 是最近产生的区块(most recent block) 每一个区块都包含指向前一个区块的哈希指针
一个区块的哈希指针怎么算:是把前面整个区块的内容,包括里面的hash pointer ,合在一起取哈希值。通过这种结构,可以实现tamper-evident log。如果有人改变了一个区块的内容,后面一个区块的哈希指针就对不上,因为后一个区块哈希指针是根据前一个区块的内容算出来的,所以后一个哈希指针也得改,以此类推,我们保留的是最后一个哈希值也会变化。(见拍的图①)

②普通链表可以改变任意一个元素,对链表中其他元素是没有影响的。而区块链是牵一发而动全身,因为只需要保存最后一个哈希值,就可以判断区块链有没有改变,在哪里改变了。
因此比特币没有要保存所有区块的内容,可以只保留最近的几千个区块。如果要用到以前的区块,可以向系统中其他节点要这个区块。有些节点是有恶意的,怎么判断?这里要用到哈希值一个性质,如下:
其他节点给你一个区块,如何判断它是正确的?算出它的哈希值,与保留的区块的哈希值对比,即可。

比特币中的另外一个结构是:Merkle tree。(见拍的图②,其中最下面一层是数据块(data blocks),上面三层内部节点都是哈希指针(hash pointers),第一层是根节点,根节点的区块也可以取个哈希,叫根哈希(root hash))
另外一个概念:binary tree。

这种结构的好处:只要记住根哈希值,就能检测出对树中任何部位的修改。
它们的区别:①用哈希指针代替了普通指针。
比特币当中各区块之间用哈希指针连接在一起,每个区块所包含的交易组织成一个merkle tree的形式,最下面一行data blocks每个区块实际上是一个交易,每个区块分为两部分,分别是块头和块身(block header ,block body)。块头里面有根哈希值,每个区块所包含的所有交易组成的merkle tree的根哈希值存在于区块的块头里面,但是,块头里没有交易的具体内容,只有一个根哈希值,块身里面是有交易的列表的。

在这里插入图片描述H()是哈希指针的意思
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
哈希指针可以用在任何无环的数据结构

https://blog.csdn.net/Mu_Xiaoye/article/details/104334253
数字货币,不想传统货币(纸币)不可复制,所以传统数字货币必须要有中央机构来保证。
谁来发行呢,这个机制来发行,但是机制的运转需要电力,算力谁来支撑呢,系统给奖励,一个是挖矿奖励,一个是打包奖励(挖矿工有权利打包)
交易的时候要有输入和输出,发送信息要用接收方的公钥加密。
每个交易的过程都是一个脚本,都要对脚本进行验证(当前的输入脚本和提供币的来源的输出脚本结合起来)
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

比特币网络
比特币工作在应用层(application layer:Bitcoin block chain),它的底层是一个网络层(network layer:P2P overlay network)。

比特币的P2P网络是非常简单的,所有节点都是对等的。不像有的P2P网络有所谓的超级节点、纸节点。

要加入P2P网络首先得知道至少有一个种子节点,然后你要跟种子节点联系,它会告诉你它所知道的网络中的其他节点,节点之间是通过TCP通信的,这样有利于穿透防火墙。当你要离开时不需要做任何操作,不用通知其他节点,退出应用程序就行了。别的节点没有听到你的信息,过一段时间之后就会把你删掉。

比特币网络的设计原则是:简单、鲁棒,而不是高效。每个节点维护一个零度节点的集合,消息传播在网络中采取flooding的方式。节点第一次听到某个消息的时候,把它传播给去他所有的零度节点,同时记录一下这个消息我已经收到过了。下次再收到这个消息的时候,就不用转发给零度节点了。

零度节点的选取是随机的,没有考虑底层的拓扑结构。比如一个在加利福尼亚的节点,它选的零度节点可能是在阿根廷的。这样设计的好处是增强鲁棒性,它没有考虑底层的拓扑结构,但是牺牲的是效率,你向身边的人转账和向美国的人转账速度是差不多的。

比特币系统中,每个节点要维护一个等待上链的交易的集合。假如一个集合的交易都是等待写入区块链里的,那么第一次听到某个交易的时候,把这个交易加入这个集合,并且转发这个交易给节点,以后再收到这个交易就不用转发了,这样避免交易会在网络上无线的传播下去。转发的前提是该交易是合法的。

这里有冲突的情况,有可能你会有两个有冲突的交易,差不多同时被广播到网络上。比如说A→B和A→C,这两个如果同时广播在网络上,那么每个节点根据在网络中的位置的不同,收到两个交易的先后顺序不同。

比如一个人先收到第一个交易,就写入到集合里,再收到第二个交易的时候就不会写入集合,因为跟上一个交易有冲突,就认定是非法的。假设这两个交易花的是同一个币,那么写入集合的交易就会被删掉。
2020-01-26 17:37回复

第六节课程 第二部分

比如说节点听到一个新发布的区块,里面包含了A→B的交易,那么这个交易就可以删掉了,因为已经写入到了区块链里。如果节点又听到了A→C的交易,该怎么办?这时候也要把A→B删掉。因为A→C如果已经被写入到了区块里,那么A→B就变成了非法交易,就变成了double spending,这就是冲突的情况。可能某个先收到A→C的节点,抢先挖到了矿,发布了区块。

新发布的区块在网络上的传播有很多方式,跟新发布的交易是类似的。每个节点除了要检查区块的内容合法性之外,还要查它是不是在最长合法链里。越是大的区块,在网络上传播速度越慢。

比特币协议对区块的大小有1M字节的限制。比特币系统采用的传播方式是非常耗费带宽的,带宽是瓶颈。按1M的区块大小限制来算的话,一个新发布的区块有可能需要几十秒,才能传输到网络大部分境地,这已经是挺长时间了,所以这个限制值不算小。

还需要注意的一点:我们讲的比特币网络的传播属于best effort 。一个交易发布到比特币网络上,不一定所以的节点都能收到,而且不同的节点收到这个交易的顺序也不一定是一样的。网络传播存在延迟,而且这个延迟有的时候可能会很长,有的节点也不一定按照比特币协议的要求进行转发。

可能有的该转发的不转发,导致某些合法的交易收不到,也有的节点可能转发一些不该转发发的消息,比如说有些不合法的交易也被转发了。这就是我们面临的一个实际问题。

比特币的挖矿难度调整

目标预值越小,挖矿的难度越大。调整挖矿的难度就是调整目标空间在整个输出空间中所占的比例。

比特币用的哈希算法是SHA-256,这个产生的哈希值是256位。所以整个输出空间是2的256次方。调整这个比例,即目标空间占输出空间的比例,通俗的说,就是哈希值前面要有多少个0。比如说256位的哈希值,要是合法的区块,要求算出来的哈希,前面至少有70个0。当然这只是通俗的说法,因为这个目标预值,并不是说前面都是0,从某一个位置开始,后面都变成了1。

挖矿的难度跟目标预值是成反比的,公式是:difficulty=difficulty 1 target / target。上面是指挖矿难度等于1的时候所对应的目标预值,挖矿难度最小就是1,这个时候对应的目标预值是个非常大的数。

即target越大,挖矿是越容易的。所以公式里很大的一个数,除以当前的目标预值,得到的就是当前的挖矿难度。所以difficulty和target大小是成反比的。

为什么要调整挖矿难度呢?如果不调会有什么问题呢?系统里的总算力越来越强,挖矿难度保持不变的话,出块时间是越来越短的。

出块时间越来越短,会有什么问题吗?
比如说不到一秒就出一个区块,区块在网络上传播的时间可能需要几十秒,底层的比特币网络可能需要几十秒才能让其他节点都收到。别的节点没有收到这个区块之前还是继续沿着已有的区块链往下扩展。如果有两个节点同时都发布一个区块,这个时候就会出现分岔。

出块时间如果越来越短的话,这种分岔会成为常态,而且不仅会出现二分岔,可能会出现很多的分岔。比如10个区块同时被挖出来,系统可能会出现10分岔。

分岔如果过多,对于系统达成共识是没有好处的,而且危害了系统的安全性。比特币协议是假设大部分算力掌握在诚实的矿工手里。系统当中的总算力越强,安全性就越好,因为有恶意的节点想掌控51%的算力就越难。如果掌握了51%的算力,它就可以干很多坏事,比如分岔攻击。

如果后面分岔多的话,前面某个区块里的某个交易,很可能就遭受分岔攻击,恶意节点会试图回滚。因为后面分岔多,算力就会分散,恶意节点得逞的概率更大。这个时候恶意节点就不需要51%的算力了,可能10%的算力就够了,因此出块时间不是越短越好。

那10分钟的出块时间是不是最优的呢?不一定。改成其他值也可以,有间隔只是说应该有个常数范围。以太坊系统出块时间就降低到了15s,所以以太坊的出块速度是比特币的40倍。

出块时间大幅度下降之后,以太坊就要设计新的协议,叫ghost。在该协议中,这些分叉,产生的orphan block(即产生最长合法链后另一个要被丢弃的区块)就不能丢弃掉了,而是也要给它们一些奖励,这叫uncle reward。以太坊也要调整挖矿难度,使出块时间保持在15s。

讲完了为什么要调整挖矿难度,现在讲一下怎么调整挖矿难度。比特币协议中规定,每2016个区块后就要调整目标预值,这大概是每两个星期调整一次。

具体的调整公式:target =target×(actual time/expected time)。actual time指产生2016个区块实际花费的时间,expected time指产生2016个区块应用的时间,即2016×10min。

如果实际花费时间超过了两周,即平均出块时间超过了10min。那么这时候挖矿难度要调的低一点,应该让出块更容易。因此该公式算出来的target会变大,则难度会下降。

实际上,上调和下调都有四倍的限制。假如实际时间超过了8个星期,那么我们计算公式时也只能按4倍算,目标预值增大最多只能增大4倍。

那怎么才能让所有的矿工同时调整目标预值呢?计算target的方法写在比特币系统的代码里,每挖到2016个区块会自动进行调整。如果有有恶意的节点故意不调,会怎么样?

如果一个节点不调,将区块发布出去,诚实的节点是不会认的。nBits是target一个编码的版本,在block header里没有直接存储target的域,因为target的域是256位,直接存target的话要32个字节。nBits在header里只有四个字节,所以可以认为是它的一个压缩编码。

如果遇到有恶意的矿工,该调的时候不调,这时检查区块的合法性就通不过。因为每个节点要独立的验证发布的区块的合法性。检查的内容就包括:nBits,目标预值设的对不对。如果投机取巧设计一个过大的目标预值,使得你自己挖矿容易了,但这个区块是不会被接受的。

在这里插入图片描述

在比特币网络中,大多数节点都是轻节点。如果只是想进行转账操作,不需要挖矿,就无需运行一个全节点。在挖矿过程中,如果监听到别人已经挖出区块延申了最长合法链,此时应该立刻放弃当前区块,在本地重新组装一个指向最后这个新合法区块的候选区块,重新开始挖矿。

这样是不是有些可惜?之前花费好多资源,全部白挖了。
实际上并不可惜。之前文章中提及,挖矿本身具有无记忆性,前面无论挖多久,对后续继续挖矿没有影响。

比特币系统如何安全性?
一是密码学的保证:别人没有自己的私钥,就无法伪造其合法签名,从而无法将其账户上BTC转走。(前提:系统中大多数算力掌握在好人手中)
二是共识机制:保证了恶意交易不被系统承认。

思考:ASIC芯片的出现是好事吗?
很明显,ASIC芯片并不是普通人可以参与的,一定程度上提升了挖矿的门槛,违背了比特币系统去中心化的初衷。理想状态下,所有人用CPU挖矿,这样只要有一台家用计算机便可以参与挖矿。当然,后续有一些货币便考虑到了这个问题,设计了抗ASIC芯片化的解决方案,后续介绍以太坊时会对这种方案进行介绍。
但反过来想,如果大家都用ASIC矿机挖矿,如果有人想要颠覆BTC系统,必然会导致BTC价格跳水,从而导致其所购买ASIC矿机作废,投入成本血本无归。所以,很多人反倒认为ASIC芯片出现,一定程度上并不是坏事。

如果比特币价格大幅度下降的话,挖矿可能是赔本的,可能还抵不上电费。即使在比特币发展的黄金时期,价格不断上涨,这时挖矿是有利可图的。但是竞争也是越来越激烈的,定制的ASIC芯片可能用不了几个月就过时了。一款ASIC矿机刚上市的时候大部分的利润是在它上市的前两个月获得的,因为这个时候它的算力在同类产品中是最强的。再往后随着更强的矿机出现,它就可能被淘汰掉。所以购买ASIC矿机的时机很重要,现在都是要提前预定的。有些不良厂商,ASIC矿机生产出来之后,不是立即提供给消费者,而是自己先用来挖矿一段时间,赚取比特币,等到最赚钱的黄金时间即这前两个月过去之后,再把矿机发给用户。当比特币系统中算力突然有一个很大的提升,就说明某个大公司生产出了新一款的ASIC矿机。所以在挖矿热潮中真正赚钱的不一定是挖矿的用户,而可能是卖矿机的大厂商。

而有些新的加密货币设计的是Alternative mining puzzle。而设计它的出发点是asic resistance(抗asic芯片化),目的是让通用的计算机也能参与挖矿的过程

所以要引入矿池,所谓的矿池,就是把这些矿工组织起来,作为一个整体,矿池的架构一般是一个全节点会驱动很多矿机,一个矿池有一个矿主,叫pool manager。下面连了很多矿工,这些矿工只负责计算哈希值,全节点的其他职责都由矿主来承担。他负责监听网上的交易,把这些交易组织打包成区块,同时要看一看有没有其他的节点抢先发布区块,如果有的话看怎样进行调整…

ASIC芯片只能负责计算哈希值,它不能干全节点的其他功能。矿池的出现还为了解决另一个问题:收入不稳定。单个矿工的收入是不稳定的,所以大家一起干,有了收益再进行分配。

那么收益该如何分配?矿池一般有两种组织形式,一种是像大型数据中心那样,有的互联网公司,有成千上万个服务器,大的矿池里面也有成千上万的矿机,这些矿机如果是属于同一个机构的话,那么收入怎么分配就不重要了。

51%算力矿池可以发动哪些攻击

分叉攻击
对已经经过6次确认的交易分叉,利用51%算力将交易记录回滚。
矿工只能计算哈希值,并不知道区块包含哪些交易,区块链状况是什么。所以,这些“群众”是无知的,容易被利用(《乌合之众》当中提出的观点,大多数人真的就能掌握真理吗?)。
此外,51%攻击只是一个概率问题,并非达到51%算力就能发动攻击,不能达到就无法发动攻击。此外,矿池本身算力也是在不断变化的。
封锁交易(Boycott)
假如攻击者不喜欢某个账户A,不想让A的交易上区块链,在监听到有其他人将A的交易发布到区块链上时,立刻发动分叉攻击,使A所在链无法成为”最长合法链“。这样,便实现了对A账户的封锁。
像不像即当裁判又当运动员?”堂下何人状告本官“?
盗币(将他人账户BTC转走)
这个是不可能的,因为其并没有他人账户私钥。如果依仗算力强,强行将没有签名的转账发布到区块链,正常节点不会认为其合法,这样,即使这条链再长,其他人也不会认为其是最长合法链。
矿池出现的优劣

优点:解决了矿工收入不稳定的问题,减轻了矿工的负担。
缺点:威胁到了区块链系统的安全,使得51%攻击变得容易起来。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值