历史

https://www.daimajiaoliu.com/daima/486f0e16c100402

Stuart Haber & W. S. Stornetta : How to time-stamp a digital document
既然我们始终要去信任某个人或者机构来确保数字文档的准确性,那就去信任每一个人,也就是说,让世界上的每一个人都是数字文档记录的见证者。能够让所有的数字记录在被创造的时候就传输到每一个用户那里,这样就没有人可以篡改这个记录。

Satoshi Nakamoto: Bitcoin: A Peer-to-Peer Electronic Cash System
正式提出区块链的概念

技术定义

简单来说,区块链是一个提供了拜占庭容错、并保证了最终一致性的分布式数据库;
从数据结构上看,它是基于时间序列的链式数据块结构;
从节点拓扑上看,它所有的节点互为冗余备份;从操作上看,它提供了基于密码学的公私钥管理体系来管理账户。

七个特征

  1. 区块链的存储基于分布式数据库
  2. 数据库是区块链的数据载体,区块链是交易的业务逻辑载体
  3. 区块链按照时间序列化区块数据,整个网络有一个最终确定状态
  4. 区块链只对添加有效,对其他操作无效
  5. 交易基于非对称加密的公私钥加密验证
  6. 区块链网络要求拜占庭将军容错
  7. 共识算法能够解决双花问题,double spent

    技术组成

P2P
P2P 网络协议是所有区块链的最底层模块,负责交易数据的网络传输和广播、节点发现和维护。

初次连接到其他节点会被要求按照握手协议来确认状态,在握手之后开始请求 Peer 节点的地址数据以及区块数据。

分布式存储区块链,每个节点加入后,都会获得当前区块链的完全拷贝
新加入的区块会广播到所有节点,新加入的区块数据量很少
所有人都能判断这个区块有没有被篡改,最终达成共识(投票权),最后才会被加入到区块链当中,所以需要获得50%以上的投票权才能篡改

所以想要篡改,成本高于收益,所以不如挖矿

分布式一致性算法
一致性是指在某个分布式系统中,任意节点的提案能够在约定的协议下被其他所有节点所认可,也就是所有节点对外呈现的信息一致,而不是对信息的内容认可

加密签名算法

挖矿算法,生成地址算法,公私钥密码算法

从技术上看,我们先从生成私钥开始,其次从私钥生成公钥,最后从公钥生成地址,以上每一步都是不可逆过程,也就是说无法从地址推导出公钥,从公钥推导到私钥。

账户与加密模型

作为底层的存储设施,多以轻量级嵌入式数据库为主,由于并不涉及区块链的账本特性,这些存储技术与其他场合下的使用并没有什么不同

区块链的账本特性,通常分为 UTXO 结构以及基于 Account-Balance 结构的账本结构,我们也称为账本模型。UTXO 是“unspent transaction input/output”的缩写,翻译过来就是指“未花费的交易输入输出”。

数据结构

最简单的block存什么:

  • 数据:一系列交易,第一笔交易一般是挖矿奖励
  • 前一个区块的哈希值(第一个区块叫做祖先Genesis区块,这个字段为空)
  • 哈希值(由存储的数据以及前一个区块的哈希值进行计算)作为一个区块的指纹,校验数据会不会被更改

区块链
区块链接起来后,就组成了区块链(区块构成的有序链表),如果篡改了任何一个区块的数据,那么这个区块的哈希值就不正确了,这样下一个区块和当前区块的链接关系就被破坏掉了

也就是说
如果需要篡改一个区块的数据,就需要篡改一个区块以及他之后的所有区块的哈希值,这个其实也不难

如果只修改最后一个区块呢??
分布式的节点也不会接受

区块链怎样防止数据被篡改?
工作量证明机制Proof of work
工作量=经验
证明工作量=升级

激励促使大家诚信来获得收益而不是作弊来获得收益,因为诚实获得的激励的概率更大,成本更小

Merkel Hash是什么
保证了本区块的所有交易,把一系列数据的哈希根据一个简单算法变成一个汇总的哈希
image.png
如果不好直接合并,那就复制同层次的一份
image.png
修改任意一个交易哪怕一个字节,或者交换两个交易的顺序,都会导致Merkle Hash验证失败,也就会导致这个区块本身是无效的,所以,Merkle Hash记录在区块头部,它的作用就是保证交易记录永远无法修改。

Merkle树也就是哈希树,叶子结点为数据记录,非叶子结点就是对影子节点串联字符串的哈希值,对于交易记录的任何一点改变都能够体现在树根的值上

Block Hash
通过计算区块头部hash得到的,没有记录到区块头部

如果一个恶意的攻击者修改了一个区块中的某个交易,那么Merkle Hash验证就不会通过。所以,他只能重新计算Merkle Hash,然后把区块头的Merkle Hash也修改了。这时,我们就会发现,这个区块本身的Block Hash就变了,所以,下一个区块指向它的链接就断掉了。

由于比特币区块的哈希必须满足一个难度值,因此,攻击者必须先重新计算这个区块的Block Hash,然后,再把后续所有区块全部重新计算并且伪造出来,才能够修改整个区块链。

在后面的挖矿中,我们会看到,修改一个区块的成本就已经非常非常高了,要修改后续所有区块,这个攻击者必须掌握全网51%以上的算力才行,所以,修改区块链的难度是非常非常大的,并且,由于正常的区块链在不断增长,同样一个区块,修改它的难度会随着时间的推移而不断增加。