区块链技术与应用——肖臻(BTC)

目录

BTC-实现

BTC-网络

BTC-挖矿难度

为什么调整挖矿难度

具体怎么调整挖矿难度

 BTC-挖矿

全节点和轻节点

 挖矿设备

大型矿池出现

矿池架构

矿池利益分配方法

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

1、分叉攻击

2、封锁交易

3、盗币

BTC-比特币脚本

交易的宏观信息:

交易的输入结构

 交易输出结构

 输入输出脚本的几种形式

1、最简单的一种:P2PK(Pay to Public Key)

2、P2PKH (Pay to Public Key Hash)

 3、最复杂的形式:P2SH( Pay to Script Hash)

多重签名 

 BTC-分叉

硬分叉(hard fork)

 软分叉(soft fork)

BTC-问答

BTC-匿名性

BTC系统中什么情况会破坏其匿名性?

(这一部分参考他人博客进行的笔记北京大学肖臻老师《区块链技术与应用》公开课笔记12——BTC匿名性篇1(匿名性分析)_区块链技术与应用-btc匿名性-CSDN博客https://blog.csdn.net/Mu_Xiaoye/article/details/104439918)

零知识证明

同态隐藏

盲签

 零币和零钞

BTC-思考

哈希指针

区块恋 

分布式共识

比特币的稀缺性

量子计算


BTC-实现

UTXO:Unspent Transcation Output

BTC-网络

工作原理:比特币工作在应用层;比特币的P2P网络是非常简单的,所有节点都是对等的。不像其他网络存在超级节点;要加入P2P网络,至少需要知道一个种子节点,然后你和种子节点联系,它会告诉你它所知道的网络中的其他节点,节点之间的通信采用TCP协议,便于穿透防火墙。当节点要离开时不用做任何操作,不用通知其他节点,只需自行退出即可,其他节点在一定时间后没有收到该节点的消息,便会将其删掉。

比特币网络设计原则:simple,robust,but not efficient

每个节点维护一个邻居节点的集合,消息传播在网络中采取flooding的方式。节点第一次收到某个消息时,它会把此消息传播给所有邻居节点并标记已经收到过此消息,下次再收到此消息便不会发送出去。
邻居节点的选取随机,未考虑网络底层的的拓扑结构。一个在加州的节点,它选取的邻居节点可能是在阿根廷的,这样的设计的好处是增强鲁棒性,但牺牲了网络效率。

区块越大,网络上传播时延越长;区块越小,可包含的交易数目越少;比特币网络传播属于 尽力而为(Best effort),一个交易发布到比特币网络,不一定所有节点都能收到,也未必收到交易的顺序都一致。有的节点也不一定按比特币协议的要求进行转发(比如不合法交易)

BTC-挖矿难度

为什么调整挖矿难度

H(block header)<=target

所以挖矿就是不断调整nonce,使block header的哈希值小于等于目标阈值。

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

比特币用的哈希算法是SHA-256,产生的哈希值是256位的,所以整个输出空间为2^256,调整目标空间所占比例,通俗的说,就是要求哈希值前面要有多少个0.

挖矿难度和目标阈值成反比

挖矿难度等于1的时候的目标阈值,就是最小挖矿难度,是个很大的值

如果不调整挖矿难度会有什么问题:系统总算力越来越强,挖矿难度不变的话,出块时间会越来越短。(一个别的博客上对老师的话的总结)

出块时间越来越短会有什么问题: 出块时间变短,交易可以更快被写入区块链,提高了系统效率;会使出现分叉会成为常态,不仅会出现二分叉,可能会出现很多的分叉。分叉过多对系统达成共识是没有好处的,而且造成算力分散,使攻击者发动分叉攻击的成本大大降低。

10分钟的出块时间是最优的吗:不一定,出块时间需要维持在一个常数范围内。

具体怎么调整挖矿难度

比特币规定每隔2016个区块需要重新调整目标阈值(大概每两个星期2016*10/60*24=14天)

actual time:产生2016个区块实际花费的时间

expected time:产生2016个区块理想花费的时间:2016*10分钟(理想状况下每十分钟产生一个区块)

实际中,上调和下调都有四倍的限制,假如实际时间超过了8个星期,计算公式也只能按8个星期算,少于0.5个星期也一样。

如何让所有的矿工同时调整目标阈值呢:计算target的算法是写在比特币系统的代码里,每挖到2016个区块会自动进行调整。

 BTC-挖矿

全节点和轻节点

全节点轻节点
一直在线不是一直在线
在本地硬盘上维护完整区块链信息不保存整个区块链,只需要保存每隔区块块头
在内存中维护UTXO集合,以便于快速检验交易合法性不保存全部交易,只保存和自己有关的交易
监听比特币网络中交易内容,验证每个交易合法性无法验证大多数交易合法性,只能检验和自己相关的交易合法性
决定哪些交易会打包到区块中无法检测网上发布的区块正确性
监听其他矿工挖出的区块,验证其合法性可以验证挖矿难度
挖矿:
1. 决定沿着哪条链挖下去。
2. 当出现等长分叉,选择哪一个分叉
只能检测哪个是最长链,不知道哪个是最长合法链

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

memory less无记忆性,progress free挖矿本身具有无记忆性,前面无论挖多久,对后续继续挖矿没有影响

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

 挖矿设备

普通CPU -> GPU ->ASIC芯片(挖矿专用矿机)

大型矿池出现

对于单个矿工来说,即使使用了ASIC矿机,其算力在整个系统中仍然只占据很少一部分,即使从平均收益看有利可图,但收入很不稳定。
此外,单个矿工除挖矿还要承担全节点其他责任,造成了算力的消耗。

矿池架构

是一个全节点驱动多台矿机。矿工只需要不停计算哈希值,而全节点其他职责由矿主来承担。ASIC芯片只能计算哈希值,不能实现全节点其他功能。此外,矿池出现解决了单个矿工收益不稳定的问题。当获得收益后,所有矿工对收益进行分配,从而保证了收益的稳定性。

矿池一般具有两种组织形式。1.类似大型数据中心(同一机构),集中成千上万矿机进行哈希计算。2.分布式。矿工与矿主不认识(不同机构),矿工与矿主联系,自愿加入其矿池,矿主分配任务,矿工进行计算,获得收益后整个矿池中所有矿工进行利益分配。

矿池利益分配方法

平均分配,所有人平分出块奖励。这一点有些类似我国某段历史时期,大家一起"吃大锅饭",会导致某些矿工懈怠,不干活(挖矿要费电,需要成本)。
所以,这里也需要进行按劳分配,需要一个工作量证明的方案。如何证明每个矿工所作的工作量呢?

降低挖矿难度(可行方案)。假设原本挖矿难度要求,计算所得126位的哈希值前70位都必须为0,现在降低要求,只需要前60位为0,这样挖矿会更容易挖到。当然,这个哈希是不会被区块链所承认的,我们将其称为一个share,或almost valid share。矿工每挖到一个share,将其提交给矿主,矿主对其进行记录,作为矿工工作量的证明。等到某个矿工真正挖到符合要求的的区块后,根据所有矿工提交的share数量进行分配。

  • 问:有没有可能,某个矿工平时正常提交share,但真正挖到区块后不提交给矿主而是自己偷偷发布出去,从而避免他人分走挖矿所得到的出块奖励?
  • 答:事实上,这种情况是不可能的。因为每个矿工挖矿任务是矿主分配的。矿主组装区块,交给矿工计算,而区块中铸币交易的收款人地址是矿主,如果矿工修改该地址,计算的nonce值也会作废。
  • 问:如果矿工自己刚开始就自己偷偷组装一个区块,
  • 答:自己挖矿,这样就类似于其脱离了该矿池。因为其自己所组织的区块不会被矿主所认可,其提交的share也不会被认可,也就得不到分配的收益。
  • 问:有没有可能矿工捣乱?平时提交share,等挖到后扔掉区块,不提交?
  • 答:这种可能是有的,如果矿工本身仅仅想捣乱,是可以这么做的。但扔掉区块后,对其本身来说,也没有相应的奖励获得,看似是损人不利己的情况。
  • 但是,矿池之间存在竞争关系。有可能为了打击竞争对手,会派出矿机加入竞争对手矿池挖矿,从而起到搞破坏的作用。即只参与其他矿工挖矿分红,自己挖到的区块却丢掉不给他人分。

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

1、分叉攻击

对已经经过6次确认的交易分叉,利用51%算力将交易记录回滚。

矿工只能计算哈希值,并不知道区块包含哪些交易,区块链状况是什么。所以,这些“群众”是无知的,容易被利用;此外,51%攻击只是一个概率问题,并非达到51%算力就能发动攻击,不能达到就无法发动攻击。此外,矿池本身算力也是在不断变化的。

2、封锁交易

假如攻击者不喜欢某个账户A,不想让A的交易上区块链,在监听到有其他人将A的交易发布到区块链上时,立刻发动分叉攻击,使A所在链无法成为”最长合法链“。这样,便实现了对A账户的封锁。

3、盗币

这个是不可能的,因为其并没有他人账户私钥。如果依仗算力强,强行将没有签名的转账发布到区块链,正常节点不会认为其合法,这样,即使这条链再长,其他人也不会认为其是最长合法链。

BTC-比特币脚本

BTC使用的脚本语言是非常简单的,唯一能访问的内存空间就是一个堆栈 ,不像C,C++那样有全局变量和局部变量还有动态分配的内存空间;所以叫基于栈的语言:stack base language

交易的宏观信息:

交易的输入结构

是个数组一个交易可以有多个输入,每个输入都要说明这个输入花的币来自之前哪个交易的输出

 交易输出结构

也是一个数组结构

 

有一个交叉,后面的交易的输入要放在前面,前面的交易的输出要放在后面

早期的BTC脚本中这两个脚本是拼接在一起的,从头到尾执行一遍

出于安全因素的考虑,现在这两个脚本分开执行,首先执行输入脚本,如果没有出错,再执行输出脚本,

最后栈顶的结果为非0值,也就是true,那么验证通过 ,这个交易就是合法的,如果执行过程中出现任何错误,这个交易就是非法的

如果一个交易有多个输入脚本,那么所有的输入脚本都要与对应的输出脚本匹配之后来进行验证,全都验证通过这个交易才是合法的

 输入输出脚本的几种形式

1、最简单的一种:P2PK(Pay to Public Key)

  1. 把输入脚本提供的签名压入栈中,
  2. 把输出的公钥压入栈,
  3. 把栈顶的两个元素弹出来,用公钥检查一下签名是否正确,如果正确返回TRUE,说明验证通过,否则出错

2、P2PKH (Pay to Public Key Hash)

与第一种的区别是输出脚本里没有直接给出收款人的公钥

给出的是公钥的哈希

公钥是在输入脚本里给出的

输入脚本既要给出签名也要给出公钥

输出脚本里的DUP,HASH160都是为了验证签名的正确性

1、把签名压入栈中
2、把公钥压入栈中
3、DUP:含义是把栈顶的元素复制一遍,所以栈顶又多了一个公钥
4、HASH160是把栈顶元素弹出来取哈希,然后把得到的哈希值再压入栈中,所以栈顶变成了公钥的哈希值
5、把输出脚本中提供的哈希值压入栈,这时栈顶有两个哈希值
6、EQUALVERIFY是弹出栈顶的两个元素,即刚刚的两个哈希值,比较它们是否相等,防止有人冒名顶替(用自己公钥冒充接受者的公钥)
7、弹出栈顶的两个元素,用公钥检查签名是否正确

 3、最复杂的形式:P2SH( Pay to Script Hash)

 

 

 第一阶段验证

还是将输入脚本和输出脚本拼接在一起

第一阶段步骤

  1. 把输入脚本的签名压入栈

  2. 把赎回脚本压入栈

  3. 得到赎回脚本的哈希

  4. 将输出脚本的哈希值压入栈,RSH是指redeemsrcipt hash

  5. 判断两个赎回脚本的哈希值是否相等

 第二阶段的验证

第二阶段步骤:

  1. 将输入脚本里提供的序列化的赎回脚本进行反序列化,反序列化的操作由每个节点自己完成,并不在PPT中展示,之后执行赎回脚本,将Public Key压入栈
  2. 然后验证输入脚本里给出的签名的正确性

多重签名 

输出脚本中需要N个,输入脚本只需要提供M个合法签名就可以验证通过,N>=M,N>1/2M

输入脚本有一个BUG,执行的时候会从堆栈中多弹出一个元素,所以第一个为多余的元素

M个签名的顺序要在N个公钥中签名的顺序一致才可以

 

  1. FALSE就是多余的元素

  2. 将输入脚本的两个签名压入栈中

  3. 将阈值M=2压入栈

  4. 将三个公钥压入栈

  5. 将N=3压入栈

  6. 执行CHECKMULTISIG,看看是不是符合多重签名

 

本质是将复杂度从输出脚本转移到输入脚本 

脚本执行过程

第一阶段

步骤:

  1. FALSE还是应对那个BUG
  2. 两个签名压入栈
  3. 序列化的数据压入栈
  4. 取Hash
  5. 将输出脚本里面的RSH压入栈中
  6. 最后判断这两个赎回脚本的hash值是否相同

 

  1. 把M压入栈
  2. 将三个公钥压入栈
  3. 将N压入栈
  4. 检查多重签名的正确性

 BTC-分叉

原来是一条链,现在是两条链就叫分叉

state fork:如果两个节点差不多同时挖到一个区块,这两个区块都是挂在当前的区块上的,不同节点先收到的区块不同,就会各自沿着先收到的区块往下扩展,这种时候就会出现临时性的分叉,称为state fork,即由于对区块链当前的状态有意见分歧而产生的分叉。

deliberate fork:分叉攻击(forking attack)也属于state fork,只不过这种意见分歧是人为造成的,这种情况也称为deliberate fork。 

protocol fork:要修改比特币协议需要软件升级,在去中心化的系统中,没办法要求所有的结点都升级软件;假设大部分节点升级了软件,少部分节点没有升级(可能是没来得及升级,也可能是不同意协议的修改),这种分叉称为protocol fork,即对比特币协议产生了分歧,使用不同版本的协议而产生的分叉。

在protocol fork中,根据对协议修改的内容的不同,又可以分为硬分叉和软分叉。 

硬分叉(hard fork)

如果对比特币协议增加一些新的特性,扩展一些新的功能,这时候没有升级协议的那些结点是不认可这些新特性的,认为它们是非法的。

硬分叉的一个例子就是比特币中的区块大小限制。(block size limit)

比特币限制每个区块不超过1M,这样算下来大约最多能容纳4000个交易。而平均10分钟产生一个区块,算下来大约平均每秒只能写入7个交易。

假设软件更新了,将区块大小的限制从1M提高到4M,假设大多节点更新了软件以支持这个协议。节点的“多数”和“少数”不是按照账户数目来算的,而是根据算力来算的,上面那句话是假设系统中拥有大多哈希算力的节点都更新了软件。

 当系统运行起来。假设新节点挖出一个区块,这个区块是比较大的,但旧节点是不认可这个区块的,不会沿着这个区块继续往下挖,而是继续沿着之前的区块往下挖下一个区块。

旧的节点不认可大的区块,小的区块新旧节点都认可。

假定大多节点都是新节点,即更新了软件支持新的协议,因为“大多数”即是其算力更强,新节点的新区块的分叉很快就比旧节点的分叉长了

对新节点而言,上下两条链都是合法链,但因为只会去扩展最长合法链,所以还是会沿着上面的链往下挖。因为只是约束了大小不到4M就可以,新节点也可能挖出一些大小不到1M的区块

这样的区块是新旧节点都承认的,但上面这条链上有旧节点认为不合法的区块,所以旧节点始终不会去扩展这条链,还是继续沿着下面这条链往下挖

这样的分叉是永久性的,只要这些旧节点不更新软件,这样的分叉就不会消失。比特币网络中,会有部分很保守的人,像这样的协议更新势必会有一些节点不同意,产生硬分叉。 

出现硬分叉之后,出现了两条平行运行的链,两条链上的BTC也是不相干的,各挖各的矿。在某条链上的出块奖励,对于认可这条链为最长合法链的节点而言是有效的,对认可另一条链的则是无效的,而分裂之前产生的BTC则是在两条链上都认可的。从这个意义上来看,硬分叉可以认为是产生了新的一种加密货币。

 软分叉(soft fork)

如果对比特币协议加了一些限制,使得原本某些合法的交易或区块,在限制后的新协议中变得不合法,那么形成的分叉是软分叉。

假设对软件进行更新:使区块大小变小,从1M变为0.5M。假设大多节点是新节点,即已经更新了协议,区块限制为0.5M;少部分节点是旧节点,仍然认定区块限制为1M。

这时,新节点挖出的区块,旧节点会认为是合法的(因为在1M以内);但是旧节点挖出的区块,新节点很可能不认为是合法的(因为很可能不在0.5M内):

 因为新节点占了大部分算力,所以很可能先挖到某个区块,出现上图的情况。这时旧节点观察到上面那条是最长合法链,就会放弃自己的分叉,接着上面的链继续挖。

某个时刻,旧节点先于新节点挖出一个区块,将其上链:

这个区块大于0.5M,新节点不认,会继续扩展上一个合法的区块

所以在这种情况下,会持续出现软分叉,只要旧节点不更新协议,挖出的区块就一直无法上链。相比硬分叉,软分叉即是非永久存在的分叉,只会临时存在一段时间。

实际中,给某些目前协议中没有规定的域增加新的含义
这种情况下即是当前协议中未限制的一些域,被赋予了新的规则。一个例子就是铸币交易的CoinBase域,没人规定也没人检查。前面学习挖矿难度时,提到这个域可以作为extra nonce来使用,比如拿出前8个字节来和nonce一起调整,以增大挖矿的搜索空间。

CoinBase即便拿出了前8个字节,后面还是有很长的可调整空间。有人就提出将其作为UTXO(未花费的交易输出)的根哈希值,因为目前这个UTXO集合只是每个全节点自己在维护,目的就是快速查找,判断交易合法性,这个集合的内容没有写到区块链里。

Merkle proof可以证明某个交易存在于某个区块中,那么如何证明某个账户A中有多少钱?全节点可以在本地的UTXO集合里算一下,即找到UTXO中所有转账给A的交易的输出,加在一起。

有人提出将UTXO中的交易也组织成一个Merkle Tree,将其根哈希值写在铸币交易的CoinBase域里面,而铸币交易中的此内容也会随着影响交易的Merkle Tree的根哈希值,这在轻节点里是保存了的。所以在这种方式下就可以像Merkle proof的方式一样证明账户里有多少钱,需要提供UTXO的Merkle Tree对应位置的哈希。

比特币历史上著名的软分叉例子:P2SH(Pay to Script Hash)

硬分叉特点:只要系统中半数以上(算力)的节点更新了软件,就不会出现永久性的分叉。这类分叉为软分叉

软分叉特点:必须系统中所有(算力)的节点都更新了软件,才不会出现永久性的分叉。

BTC-问答

转账交易时候,如果接收者不在线(没有连在比特币网络上)怎么办?
转账交易只需要在区块链上记录,将某账户比特币转到另一账户,而接收方是否在线并无影响。

假设某全节点收到某个转账交易,会不会有可能转账交易中收款人地址该全节点从未听过。
可能,因为比特币账户只需要本地产生即可。只有该账户第一次收到钱时,其他节点才能知道该节点的存在。

如果账户私钥丢失怎么办?
没有办法。因为比特币是去中心化货币,没有第三方中心机构可以重置密码,所以账户上的钱也就变成了死钱。
通过加密货币交易所(中心化机构),一般需要提供身份证明,如果忘记私钥可以找交易所申请追回私钥。但目前这类货币的交易所,尚且处于缺少监管的状态,并不一定具有可信力。而且,其本身仅起到“中介”作用,与该提问的回答“私钥丢失无法追回里面的比特币”并不冲突。
在历史上,有很多次交易所被黑客攻击偷走大量加密货币的事情,其中最著名的为Mt. GOX(中文译为:门头沟)事件。该交易所曾经为全球最大比特币交易所,交易量占到全球比特币交易量的70%左右,设于日本。后来由于被攻击丢失大量比特币,导致交易所破产,其CEO被判刑入狱。
此外,也有交易所监守自盗,工作人员卷款跑路(有点类似 rm -rf */ 删库跑路系列)。

私钥泄露怎么办?
尽快将剩余BTC转到其他安全账户上,没有第三方中心机构重置密码或冻结账户,只能自己对自己负责。
BTC系统中账户便是公私钥对,密码就是私钥,无法更改。

转账写错地址怎么办?
没有办法,只能自认倒霉,无法取消已经发布的交易。如果转入不存在地址,则该部分比特币便成为了死钱。当然,比特币系统中UTXO会永久保存该交易,记录该并不存在的地址。因此,对全节点来说,这是不友好的。

之前在BTC脚本中介绍了OP_RETURN指令,我们提到,这种方法为普通用户提供了一个向比特币网络中写入想要一直保存的内容。但OP_RETURN执行结果是无条件返回错误,而交易返回错误,区块又怎么会包含它?区块链又如何会接收这个区块?

BTC-匿名性

一般来说,匿名性多与隐私保护相关。但实际上,比特币中的匿名并非真正的匿名,而是假的匿名。

实际上,比特币中的数据是完全公开的,而网上的交易是要与实体世界进行交易的,所以大大破坏了其匿名性。

BTC系统中什么情况会破坏其匿名性?

(这一部分参考他人博客进行的笔记北京大学肖臻老师《区块链技术与应用》公开课笔记12——BTC匿名性篇1(匿名性分析)_区块链技术与应用-btc匿名性-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/Mu_Xiaoye/article/details/104439918

1、用户可以生成多个地址账户,但这些地址账户可以被关联起来
表面上看,每次交易可以更换公私钥对,从而每次都是新的账户,具有很强的匿名性。但实际上,这些账户在一定情况下,是可以被关联起来的。

2、地址账户与个人在真实社会中的身份也可能会产生关联。
任何使得BTC和实体世界中关联的操作都有可能泄露用户真实身份,其中最明显的就是资金的转入转出。要得到BTC,如果用钱买,就会与实体世界进行交互。想要将BTC转为现实中的货币,也同样需要与实体世界交互。

3、BTC支付时候
例如某些商家接受用BTC进行支付,例如可以用BTC购买咖啡、蛋糕等。(这种场景信用卡已经解决的很好了,用BTC交易延迟高,交易费贵,并非一个好的idea)
在进行支付时候,便和个人账户建立了联系,从而会泄露掉个人信息。

实际上,暴露用户隐私正是由于区块链的公开性和不可篡改性。不可篡改性对于隐私保护,实际上是灾难性的。

零知识证明

零知识证明:一方(证明者)向另一方(验证者)证明某一个陈述是正确的,但不需要透露除该陈述是正确的之外的任何信息。

同态隐藏

零知识证明的数学基础便是同态隐藏。上图为同态隐藏的三个性质。
第一个性质,说明如果有E(X)=E(y),则必然有x=y。(无碰撞)
第二个性质,说明加密函数不可逆。知道加密值,无法反推出密码值。
第三个性质,最为重要,称为同态运算。说明对加密后的函数值进行某些代数运算,等价于对输入直接进行代数运算再加密。

盲签

 零币和零钞

从数学上看,零币和零钞是安全的。但其并不是百分之百的匿名,其并未解决与系统外部实体发生交互时对匿名性的破坏。 

零币在花费的时候,只需要用零知识证明来证明所花掉的币是系统中存在的某一个合法的币,但不用透露具体花掉的是系统中哪一个币。这样就破坏了关联性。
当然,这类货币并非主流加密货币,因为其为了设计匿名性,付出了一定代价,而且,需要强匿名性的用户并不多。

BTC-思考

哈希指针

指针保存的本地内存地址,只有在本地计算机上才具有意义,如果发送给其他计算机就没有意义了。那么在区块发布时候,哈希指针如何通过网络进行传播?

所谓哈希指针,只是系统中一种形象化的方法。实际应用时候,只有哈希而没有指针。

回顾之前提过的Block header数据结构:

全节点一般将区块存储于一个key-value数据库中,key为哈希,value为区块内容。常用的key-value数据库为levelDB,只要掌握到最后一个区块的哈希值即可依据哈希值一直往前找到区块链所有内容。
有些节点只保存区块链部分信息,如果需要用到前面的区块,可以问其他节点要。哈希指针性质保证了整个区块链内容是不可篡改的。

区块恋 

有情侣一起买BTC,将私钥从中截断,每人保留其中一部分。如果未来两人依旧感情很好,就可以将钱取出;如果分手,这部分钱就会永久锁死,谁也无法取出,通过区块链的不可篡改性作为两人的爱情见证。如此下来,N个人怎么办?
如果按照这种方法,将私钥分为N份。但这样会有一系列问题。一. 如果N个人中任意一个人忘记私钥,则无法将钱取出。二.截断私钥长度,会降低安全性,因为私钥长度会直接影响破解难度(2^256 远远大于 2^128),之间难度差距远远不止一倍。【可见,对于多个人账户,应该使用多重签名,而非截断私钥的方法。】三.如果分手,该钱变成死钱,一直保存在UTXO集合中,对矿工不友好。

分布式共识

理论上来说,分布式系统不可能达成共识。严格来说,比特币并没有取得真正意义上的共识,随时可能被推翻,例如分叉攻击导致系统回滚。
此外,理论和实际存在差异。不可能结论针对特定模型,实际中对模型稍微修改或添加线下方法即可将不可能变为可能。

比特币的稀缺性

早期BTC难度低且出块奖励高,从而吸引矿工。

BTC总量固定,有人认为其是一个精妙的设计。但实际上,总量固定的东西并不适合作为货币,这也就决定了BTC并不能在未来完全颠覆现有货币体系。以太坊中便没有BTC中出块奖励定期减半的做法,此外,某些新型货币会自带通货膨胀的功能。

量子计算

会不会BTC这种建立在密码学上的加密货币,在量子计算出来后会不会变得不安全。
一. 量子计算距离使用仍然有很长距离(人工智能也是,目前仍然处于弱人工智能阶段。其实很多技术都是如此,炒的情况很严重,但距离实用很远。但是不炒便不会有资本流入进行研究,这也是一个非常相悖的地方)。
二. 量子计算若真正使用到破坏现有加密算法,对传统金融业的破坏仍然是最大的。
三. 实际中使用的并非公钥,而是采用公钥哈希。而哈希函数一般都是不可逆的,所以即使量子计算也无法反推私钥。

BTC中用的SHA-256,无论输入多大,最终结果都为256位

所以加密可逆、哈希不可逆;加密不损失信息、哈希破坏信息

  • 23
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值