区块链架构详解

news/2024/7/2 23:36:09

链客,专为开发者而生,有问必答!

此文章来自链客区块链技术问答社区,未经允许拒绝转载。

在这里插入图片描述

准备工作

区块链不是一种技术实现,而是一个系统的架构设计,使用一系列的技术组合用于完成去中心化的数据存储。比特币在区块链之上融入了金融学,货币学,博弈学,甚至一定程度的哲学思想,用于电子货币的发行,运行和交易。在学习区块链之前有一些基础知识需要提前掌握好,后面将不再对具体技术展开描述,而是从这个技术解决了什么问题,为什么要用这个技术这个角度去描述。

P2P

不可逆算法

不对称加密算法

Merkle树

CAP理论

最终一致性算法

比特币要做什么?

如果你是一个架构师,做一个系统的架构,你首先要搞清楚这个系统要做什么?要解决一个什么问题?带着这个问题进行分析,设计系统整体的架构。对于比特币也一样,首先搞清楚比特币是要做什么,要解决什么问题?然后带着这些问题去解析比特币的技术实现。

如果用一句话来描述比特币要做什么,那么可以这样描述:做一个去中心化电子货币发行交易系统。这里有三个关键词:

去中心化

电子货币发行

电子货币交易

去中心化

当今世界的所有货币交易都是有一个第三方可信任的金融机构提供服务处理,任何人不能访问由这个第三方机构中心化存储的数据,理论上来说如果这个金融机构发生了欺诈或倒闭,那么存储在这个机构中的货币,以及所做的交易就会存在风险。当然比特币的去中心化,不是因为担心这种风险,而是根本就不需要这个第三方机构了。这也是区块链的强大颠覆性之一,凡是需要某个第三方可信任的机构需要安全保存处理的数据,都可以去中心化安全存储,所有人都可以访问。

从技术角度分析,如何做到去中心化?

中心化对应的就是分布式,去中心化就是分布式。把原先存储在某个第三方机构,中心化存储的数据,进行分布式存储。

分布式存储要解决的3个基本问题

网络结构

数据不可篡改性

最终一致性

网络结构

去中心化的分布式存储是指整个发行的电子货币,以及货币交易数据由不同机构,不通个人的成千上万的计算机共同存储,共同维护了同一份相同的数据,只有共同维护的这份相同的数据才是认为最终正确的数据,任何个人篡改自己的数据都没有意义,并且存储的数据所有人都可访问。

利用P2P协议进行节点之间数据传输主要有两个功能点:

a. 把需要存储的数据广播到所有节点上进行储存。 b. 查询整个网络集群中所有节点的最新数据,如果自己节点的数据与大部分节点的数据不一致,则更新自身的数据与大部分节点存储的数据一致。

比特币是去中心化存储,最大的风险是整个比特币网络集群被破坏,篡改了整个网络存储的数据。但是上述第二个功能点能够有效的防止这种风险,由于系统会自动更新为整个集群中大部分节点存储的相同数据,所以要篡改数据,必须要同时篡改整个网络一半以上的数据,这不是说做不到,但是比特币利用区块链的方式再加上利益博弈机制,当你拥有这种能力的时候,也不需要去做篡改这种投入产出比这么低的事了,在数据不可篡改性一节中再详细描述。

数据不可篡改性

在设计了比特币系统运行的网络结构之后,需要考虑数据的不可篡改性,因为这种数据存储是去中心化的,任何人都可以访问,那么就容易被篡改,上节描述了在这种网络结构的运行机制下,要篡改数据,必须同时更改这个网络集群上一半以上的节点数据,如果每个节点没有一个安全的保护机制的话,那是很容易做到被同时修改网络集群中一半以上节点的数据。

一种方式是每个人把自己的插入的这条数据hash后用自己的密钥进行签名,然后附带上自己的公钥,系统可以用签名和公钥验证插入的数据是否被修改过。如果把数据库表比喻为一本帐本,表中的每一条数据就认为是账本中记录的每一笔交易。这里还有两个问题,第一,不能随意插入数据,如果你没有比特币,但还是插入一条转帐给某人的数据,系统需要发现是不合法的,拒绝此次插入请求。第二,除了不能随意插入和修改外,也需要防止删除数据,上述把每条记录进行签名并不能阻止被恶意删除。

一旦形成了链式帐本后就无法去更改某个历史帐本中的数据,更改了某个历史帐本,那么在它之后的所有帐本都需要更改,但是每个帐本都是根据当前的系统时间戳验证hash值是否满足条件才能接收,所以无法去篡改历史帐本的数据。所能做的只能另外投入非常大的代价再构建一个比特币集群,这个集群超过当前的集群,那么数据就自动按照新构建的集群为准。这就是多个帐本的相互保护机制比单个帐本更难以被篡改。后续货币的发行和交易中再会描述,当你有能力重新构建一个新的比特币网络集群用于去攻击篡改数据时,你获得的收益将远远低于你投入的成本。

为了防止上个帐本的数据被篡改,产生新的帐本需要依赖于上一个帐本中的所有交易记录的hash值,这样一旦上个帐本的数据发生变化就与新帐本对应不上。但是帐本中所有交易记录计算hash值是一件耗时的计算,因此比特币采用了merkle树对某个帐本中的所有交易记录进行hash计算。它主要是解决帐本中交易记录hash计算的效率问题。如下图HA,HB…HP是具体的交易记录,每相临的两条交易记录向上形成一个Hash值,再与相邻的节点再往上形成hash值,一直到树根形成所有交易记录的唯一hash值。

之前描述的网络结构和本节描述的帐本链式结构,本质上都是用于解决去中心化的数据安全存储。

最终一致性

是分布式存储就绕不开CAP理论,比特币也一样,比特币采用P2P协议进行节点之间的数据传输,放弃了CAP中的Consistency,采用了AP两个维度。如果放弃了Consistency这个属性,那么就产生了拜占庭将军问题,这么多节点如何达成数据一致性。拜占庭军队都是一个个小分队组成,每个小分队都有一个将军负责,将军们通过号令兵传达一系列行动,但是当中出现一些叛将,故意破坏号令怎么办?

分布式存储系统和拜占庭将军问题一样,做到一致性是很难的,在比特币开放式的全球化部署的系统集群更是如此。所以比特币放弃了强一致性,并且通过P2P点对点通信,没有中心节点,整个集群中的服务器故障,离开,加入集群都不会对整个集群产生影响。

电子货币发行

上一章节去中心化中,主要描述了一个去中心化系统,如何做到安全的数据存储,不被篡改。它主要采用了P2P网络结构+区块链式结构解决了数据的安全存储。但是对于一个货币,还需要解决一个货币的发行,如何发行,发行给谁?如何让比特币系统能够让所有的人自发的运行下去?货币的发行需要公平,公开,公正,而且货币不能发行到某个第三方机构中,任何人只要符合一定的条件就能获取发行的货币。想一想,如果你是架构师,你会如何设计系统去发行货币?

本质上讲,比特币系统自身就可以寻找一个随机值,产生新的帐本。但是比特币把发行货币和寻找新帐本背后的计算力结合在一起。寻找新帐本需要消耗计算力,谁找到了符合新帐本条件的随机值,代表了他消耗了大量的计算力,新帐本一旦被系统接收,那么系统自动在该新帐本中记录一条转帐给他一定个数比特币的纪录,就完成了货币的发行。

电子货币交易

上节电子货币发行一节中描述了,谁通过算力找到了新的帐本,系统就会自动记一笔账,转一定数量的比特币给谁,他也就获得了比特币。那么如何确认记录的这笔交易是属于你的,而不被别人拿走呢?做为架构师的你如何解决这个问题?

比特币采用了非对称加密技术对用户的帐户操作,公钥就是用户的帐户号码,谁找到了新帐本,系统自动往新帐本发现者的公钥帐户,记一条特定数量比特币的纪录。当用户要消费比特币时,需要用私钥进行签名,系统会用帐户号码也就是公钥验证签名是否正确,并且根据用户的帐户号码从历史的交易中计算出当前帐户中的真实金额,确保用户操作的资金在帐户真实金额之内。这里的设计有两个要点:

插入的每一条纪录都需要用私钥签名,系统用帐户号码也就是公钥进行验证签名是否正确,验证正确则认为合法。

如果满足第一个条件,则验证插入的纪录中转帐金额是否正确,验证的方式是对该公钥以往的所有交易纪录进行计算得出该帐户当前的金额,如果不超过该金额值则为合法。图示如下:

区块链的应用

比特币系统解决了去中心化的安全存储问题,解决了货币的发行问题,解决了货币交易的帐户安全问题后,就构建了一个当前的比特币电子虚拟货币系统了。而比特币使用的区块链被认为是一个颠覆性的技术,革命性的技术,那他的颠覆性体现在什么地方呢?它不是技术上面的颠覆,主要是在思想层面上的,商业运作模式层面上的革命性。就比如一个国家从集权式的到民主式的转变,对这个国家和社会就是一个革命性的变化。而区块链技术带来两个基本功能:

去中心化的数据存储

保证帐户的安全性

理论上让原先需要通过某个第三方机构提供的数据服务,都可以革命性更改为去中心化的方式提供服务,比如比特币可以替代各个国家的法币使用。区块链这种特性也会衍生出各行各业的商业模式颠覆性的变化。


http://lihuaxi.xjx100.cn/news/237408.html

相关文章

python 文件追加写入_Python写入文件–解释了打开,读取,追加和其他文件处理功能

python 文件追加写入欢迎 (Welcome) Hi! If you want to learn how to work with files in Python, then this article is for you. Working with files is an important skill that every Python developer should learn, so lets get started.嗨! 如果您想学习如何…

消息队列的面试题7

1、面试题 如果让你写一个消息队列,该如何进行架构设计啊?说一下你的思路 2、面试官心里分析 其实聊到这个问题,一般面试官要考察两块: (1)你有没有对某一个消息队列做过较为深入的原理的了解,或…

区块链基础:理论和术语

链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载。 一、区块链: 1.百度百科上对区块链的定义是:区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机 技…

vm

为什么80%的码农都做不了架构师?>>> ps ax -O ppid,flags,mwchan | awk $6 ~ /^D/ || $6 "STAT" 转载于:https://my.oschina.net/doz/blog/1630464

堆和栈的区别 之 数据结构和内存

数据结构的栈和堆 首先在数据结构上要知道堆栈,尽管我们这么称呼它,但实际上堆栈是两种数据结构:堆和栈。 堆和栈都是一种数据项按序排列的数据结构。 栈就像装数据的桶或箱子 我们先从大家比较熟悉的栈说起吧,它是一种具有后进先…

gdb -iex_如何使用IEX Cloud,Matplotlib和AWS在Python中创建自动更新数据可视化

gdb -iexPython is an excellent programming language for creating data visualizations.Python是用于创建数据可视化的优秀编程语言。 However, working with a raw programming language like Python (instead of more sophisticated software like, say, Tableau) presen…

tailf

功能说明:tailf命令几乎等同于tail -f,与tail -f不同的是,如果文件不增长,那么它不会去访问磁盘文件,也不会更改文件的访问时间。tailf命令在工作中的主要使命就是跟踪日志文件,首先将默认输出日志文件的最…

面向对象进阶2 组合

2019独角兽企业重金招聘Python工程师标准>>> 一:命名空间 class Person:Country 中国人 # 静态变量print(Person.Country) alex Person() # 创建了一个空的命名空间 alex.name alex # 对象 alex.Country 泰国人 egon Person() egon.name ego…