mirror of
https://github.com/cheetahlou/CategoryResourceRepost.git
synced 2025-11-18 23:23:43 +08:00
del
This commit is contained in:
147
极客时间专栏/geek/深入浅出区块链/第二章 深入区块链技术/第10讲 | 深入区块链技术(二):P2P网络.md
Normal file
147
极客时间专栏/geek/深入浅出区块链/第二章 深入区块链技术/第10讲 | 深入区块链技术(二):P2P网络.md
Normal file
@@ -0,0 +1,147 @@
|
||||
<audio id="audio" title="第10讲 | 深入区块链技术(二):P2P网络" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/34/3c/34791d69dd0c3772a9a8e4ec344ff53c.mp3"></audio>
|
||||
|
||||
在上一篇文章中,我大致讲解了一下区块链技术的几个核心要素。P2P网络协议、分布式一致性算法(共识机制)、加密签名算法、账户与存储模型。今天我们就来看看区块链技术的第一个核心要素:P2P网络。
|
||||
|
||||
如果我们简单来看P2P技术,它的应用领域已经非常广泛了,从流媒体到点对点通讯、从文件共享到协同处理,多种领域都有它的身影出现。
|
||||
|
||||
同样的,P2P的网络协议也有很多,比较常见的有BitTorrent、ED2K、Gnutella、Tor等,也就是我们常说的BT工具和电驴。
|
||||
|
||||
比特币、以太坊等众多数字货币都实现了属于自己的P2P网络协议,但是这种模式并不同于以上讨论的P2P网络协议,所以我们今天讨论的重点主要是区块链技术的P2P技术,也就是比特币和以太坊的P2P网络。
|
||||
|
||||
由于区块链的P2P网络技术知识繁多,我们主要提炼其中的四个内容进行讲解:区块链的网络连接与拓扑结构、节点发现、局域网穿透与节点交互协议。
|
||||
|
||||
希望读完本篇可以让你对目前成熟的区块链P2P网络的拓扑结构以及运行原理有个大体的认知。
|
||||
|
||||
## 网络连接与拓扑结构
|
||||
|
||||
### 1.网络连接
|
||||
|
||||
除去少数支持UDP协议的区块链项目外,绝大部分的区块链项目所使用的底层网络协议依然是TCP协议。
|
||||
|
||||
所以从网络协议的角度来看,区块链其实是基于TCP/IP网络协议的,这与HTTP协议、SMTP协议是处在同一层,也就是应用层。
|
||||
|
||||
在“区块链的常见误区”这篇文章中,我们提到了“区块链是否会颠覆互联网”这一说法,如果要是认真分析的话,它颠覆的层面其实最多只到HTTP协议,不能再多了。
|
||||
|
||||
以HTTP协议为代表的、与服务端的交互模式在区块链上被彻底打破了,变更为完全的点对点拓扑结构,这也是以太坊提出的Web3.0的由来。
|
||||
|
||||
比特币的P2P网络是一个非常复杂的结构,考虑到矿池内部的挖矿交互协议与轻节点。我们仅仅讨论全节点这种场景下的P2P网络发现与路由。
|
||||
|
||||
比特币的P2P网络基于TCP构建,主网默认通信端口为8333。
|
||||
|
||||
以太坊的P2P网络则与比特币不太相同,以太坊P2P网络是一个完全加密的网络,提供UDP和TCP两种连接方式,主网默认TCP通信端口是30303,推荐的UDP发现端口为30301。
|
||||
|
||||
### 2.拓扑结构
|
||||
|
||||
P2P网络拓扑结构有很多种,有些是中心化拓扑,有些是半中心化拓扑,有些是全分布式拓扑结构。
|
||||
|
||||
比特币全节点组成的网络是一种全分布式的拓扑结构,节点与节点之间的传输过程更接近“泛洪算法”,即:交易从某个节点产生,接着广播到临近节点,临近节点一传十十传百,直至传播到全网。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/09/28/09275293ad4cbd85950e4b1191775228.png" alt="" />
|
||||
|
||||
(比特币全球节点图,图来自网络)
|
||||
|
||||
全节点与SPV简化支付验证客户端之间的交互模式,更接近半中心化的拓扑结构,也就是SPV节点可以随机选择一个全节点进行连接,这个全节点会成为SPV节点的代理,帮助SPV节点广播交易。
|
||||
|
||||
## 节点发现
|
||||
|
||||
节点发现是任何区块链节点接入区块链P2P网络的第一步。这与你孤身一人去陌生地方旅游一样,如果没有地图和导航,那你只能拽附近的人问路,“拽附近的人问路”的这个动作就可以理解成节点发现。
|
||||
|
||||
节点发现可分为初始节点发现,和启动后节点发现。初始节点发现就是说你的全节点是刚下载的,第一次运行,什么节点数据都没有。启动后发现表示正在运行的钱包已经能跟随网络动态维护可用节点。
|
||||
|
||||
### 1.初始节点发现
|
||||
|
||||
在比特币网络中,初始节点发现一共有两种方式。
|
||||
|
||||
第一种叫做DNS-seed,又称DNS种子节点,DNS就是中心化域名查询服务,比特币的社区维护者会维护一些域名。
|
||||
|
||||
比如seed.bitcoin.sipa.be这个域名就是由比特币的核心开发者Sipa维护的,如果我们通过nslookup会发现大约二十多个A纪录的IPv4主机地址。
|
||||
|
||||
我们通过nc命令尝试连接域名下的某个主机的8333端口会发现连接成功,运行结构如下。
|
||||
|
||||
```
|
||||
|
||||
✘ chenhao@chenhaodeMacBook-Pro ~ nc -nvv 149.202.179.35 8333
|
||||
found 0 associations
|
||||
found 1 connections:
|
||||
1: flags=82<CONNECTED,PREFERRED>
|
||||
outif en0
|
||||
src 192.168.1.104 port 62125
|
||||
dst 149.202.179.35 port 8333
|
||||
rank info not available
|
||||
TCP aux info available
|
||||
Connection to 149.202.179.35 port 8333 [tcp/*] succeeded!
|
||||
|
||||
|
||||
```
|
||||
|
||||
好的,到目前为止我们已经手动做了一遍初始节点发现的工作,这些操作是由比特币的代码完成的。
|
||||
|
||||
第二种方式就是,代码中硬编码( hard-code )了一些地址,这些地址我们称之为种子节点(seed-node),当所有的种子节点全部失效时,全节点会尝试连接这些种子节点。
|
||||
|
||||
用在以太坊中,思路也大致相同,也是在代码中硬编码(hard-code)了一些种子节点做类似的工作。
|
||||
|
||||
### 2.启动后节点发现
|
||||
|
||||
在Bitcoin 的网络中,一个节点可以将自己维护的对等节点列表(peer list)发送给临近节点,所以在初始节点发现之后,你的节点要做的第一件事情就是向对方要列表:“快把你的节点列表给我复制一份。”
|
||||
|
||||
所以在每次需要发送协议消息的时候,它会花费固定的时间尝试和已存的节点列表中的节点建立链接,如果有任何一个节点在超时之前可以连接上,就不用去DNS seed 获取地址,一般来说,这种可能性很小,尤其是全节点数目非常多的情况下。
|
||||
|
||||
而在以太坊网络中,也会维护类似的一个节点列表(NodeTable),但是这个节点列表与比特币的简单维护不同,它采用了P2P网络协议中一个成熟的算法,叫做Kademlia网络,简称KAD网络。
|
||||
|
||||
它使用了DHT来定位资源,全称Distributed Hash Table,中文名为分布式哈希表。KAD网络会维护一个路由表,用于快速定位目标节点。由于KAD网络基于UDP通信协议,所以以太坊节点的节点发现是基于UDP的,如果找到节点以后,数据交互又会切换到TCP协议上。
|
||||
|
||||
### 3.黑名单与长连接
|
||||
|
||||
公有区块链面临的网络环境是非常开放的,任何人只要下载好钱包,打开运行就进入了这个P2P网络,这也会带来被攻击的可能。
|
||||
|
||||
所以在比特币的代码中,会有一段去控制逻辑,你可以手动将你认为可疑的节点移除并加入禁止列表,同时去配置可信的节点。当然,以上并不属于客户端的标准协议的一部分,任何人都可以实现属于自己的P2P网络层。
|
||||
|
||||
以太坊上有针对账户进行的黑名单处理,但是这属于业务层。我没有找到很详尽的资料,所以你有兴趣的话,可以自己尝试一下。
|
||||
|
||||
不过总的来说,黑名单我们也可以通过操作系统的防火墙去处理,这并不算一个特别棘手的问题。
|
||||
|
||||
## 局域网穿透
|
||||
|
||||
前面我们说到了区块链的P2P网络结构是一种全分布式的拓扑结构。但是,如今我们的网络环境是由局域网和互联网组成的。也就是说,当你在局域网运行一个区块链节点,在公网是发现不了的,公网上的节点只能被动接受连接,并不能主动发起连接。
|
||||
|
||||
如果这个局域网是你可以控制的,那么很好说,咱们只需要在VPC网络中配置路由,将公网IP和端口映射到局域网中你的IP和端口即可。
|
||||
|
||||
这个条件是非常苛刻的,那么到底有没有一种方案可以自行建立映射呢?答案是:有,就是NAT技术和UPnP协议。
|
||||
|
||||
NAT技术非常常见,这里使用的是源NAT,简而言之就是替换TCP报文中的源地址并映射到内网地址。
|
||||
|
||||
UPnP是通用即插即用(Universal Plug and Play)的缩写,它主要用于设备的智能互联互通,所有在网络上的设备马上就能知道有新设备加入。
|
||||
|
||||
这些设备彼此之间能互相通信,更能直接使用或者控制它,一切都不需要人工设置。有关UPnP的资料比较多,这里就不赘述了,你可以自行搜索相关的信息。
|
||||
|
||||
比特币和以太坊均使用了UPnP协议作为局域网穿透工具,只要局域网中的路由设备支持NAT网关功能、支持UPnP协议,即可将你的区块链节点自动映射到公网上。
|
||||
|
||||
## 节点交互协议
|
||||
|
||||
一旦节点建立连接以后,节点之间的交互是遵循一些特定的命令,这些命令写在消息的头部,消息体写的则是消息内容。
|
||||
|
||||
命令分为两种,一种是请求命令,一种是数据交互命令。
|
||||
|
||||
节点连接完成要做的第一件事情叫做握手操作。这一点在比特币和以太坊上的流程是差不多的,就是相互问候一下,提供一些简要信息。
|
||||
|
||||
比如先交换一下版本号,看看是否兼容。只是以太坊为握手过程提供了对称加密,而比特币没有。
|
||||
|
||||
握手完毕之后,无论交互什么信息,都是需要保持长连接的,在比特币上有PING/PONG这两种类型的消息,这很明显就是用于保持节点之间长连接的心跳而设计的;而在以太坊的设计中,将PING/PONG协议移到了节点发现的过程中。
|
||||
|
||||
请求命令一般分为发起者请求,比如比特币中的 getaddr 命令是为了获取对方的可用节点列表,inv命令则提供了数据传输,消息体中会包含一个数据向量。
|
||||
|
||||
我们说区块链最重要的功能就是同步区块链,而同步区块恰巧是最考验P2P网络能力的。区块同步方式分为两种,第一种叫做HeaderFirst,它提供了区块头先同步,同步完成以后再从其他节点获得区块体。
|
||||
|
||||
第二种叫做BlockFirst,这种区块同步的方式比较简单粗暴,就是从其他节点获取区块必须是完整的。第一种方案提供了较好的交互过程,减轻了网络负担。这两种同步方式会直接体现在节点交互协议上,他们使用的命令逻辑完全不同。
|
||||
|
||||
## 总结
|
||||
|
||||
今天我与你分享了区块链的P2P网络结构与节点交互过程,一般P2P网络技术要解决两个主要问题,第一是资源定位,第二是资源获取,这一篇文章也是主要围绕这两点展开,其中节点发现和局域网穿透是属于资源定位问题,节点交互协议是属于资源获取问题。
|
||||
|
||||
在这一篇文章中,我仅以比特币和以太坊为例进行分享,虽然区块链项目比较多,但是他们要做的事情大多是类似的,比如以太坊是改进版的实现,而比特币使用了简单版实现。
|
||||
|
||||
P2P网络模块作为所有区块链的最底层模块,直接决定了整个区块链网络的稳定性。区块链网络是一个网状分布式的结构,与互联网结构有点相似,那么,亲爱的读者,我们是不是可以设计一个节点爬虫,去爬全网节点呢?你可以给我留言,我们一起讨论。
|
||||
|
||||
感谢你的收听,我们下次再见。
|
||||
|
||||
参考链接:[https://bitnodes.earn.com/](https://bitnodes.earn.com/)
|
||||
@@ -0,0 +1,117 @@
|
||||
<audio id="audio" title="第11讲 | 深入区块链技术(三):共识算法与分布式一致性算法" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/a6/3d/a6de7356adcff461b94b677e3250603d.mp3"></audio>
|
||||
|
||||
共识机制的概念,我们在前面的文章“浅说区块链共识机制”中已经讲解了一部分,但是,共识算法其实是一个非常大的话题,一篇文章肯定没有办法做到面面俱全。
|
||||
|
||||
那么今天的内容,我会将重点放在梳理技术的脉络上,详细分析的部分会少一点。如果你对共识算法有兴趣的话,可以自行查找相关内容,也可以和其他的资料进行相互补充的阅读。
|
||||
|
||||
## 从相亲大会说起:分布式系统的模型
|
||||
|
||||
由于区块链就是一种分布式系统,所以这篇文章我就从这一概念开始讲起。 为了让你更容易理解分布式系统,我们先来构建一个模型。
|
||||
|
||||
在“浅说区块链共识机制”那篇文章中,我举了一个村庄举办相亲大会的例子,我们来回顾一下。
|
||||
|
||||
1. 大村子因为人口增长变成11个小村落分散在地图各地;
|
||||
1. 村落之间的通信只能依靠信鸽;
|
||||
1. 一只信鸽可能无法完全覆盖所有村落,需要有中继村落代为传输消息。
|
||||
|
||||
相亲大会的举办权会为村子带来巨大收益,为了产生合理的举办者,人们约定了几条规则:
|
||||
|
||||
1. 大会举办权从A和B两个村子中产生,他们每一届都是候选村;
|
||||
1. 投票时所有村落仅能投A或B;
|
||||
1. 用投票的方式产生举办者,少数服从多数。
|
||||
|
||||
所有村子会为了举办权都会使出浑身解数,比如延迟发送投票结果、篡改别人的投票结果、假装没有接收到通知等等。
|
||||
|
||||
其实这是一个典型的分布式系统,可以看成是我们简化版的区块链网络环境,那么这个分布式系统会遇到什么样的问题呢?
|
||||
|
||||
## 分布式系统面临的问题
|
||||
|
||||
分布式系统面临了几个问题:一致性问题,可终止性问题、合法性问题。
|
||||
|
||||
可终止性可以理解为系统必须在有限的时间内给出一致性结果,合法性是指提案必须是系统内的节点提出。当然其中面对的最重要也是最基础的问题,就是我们常说的一致性问题。
|
||||
|
||||
一致性是指在某个分布式系统中,任意节点的提案能够在约定的协议下被其他所有节点所认可。
|
||||
|
||||
需要提醒你区分的一点是:这里的“认可”表示所有节点对外呈现的信息一致,而不是对信息的内容认可。一致性也分严格一致性、最终一致性,这些我们在后文会谈到。
|
||||
|
||||
我们回到上面的例子,我们提到了所有的村子只能投A或B,其实这个投票的动作可以理解为提案。
|
||||
|
||||
在“投票过程被大家所认可”这个语境下,“被大家所认可”表示某个村落投票的结果已经被记录,用于最后统计结果,而不是认可投给A或者投给B,这也是我在上述强调你要注意区分的一点。
|
||||
|
||||
那我们这里所说的一致性到底体现在那里呢?
|
||||
|
||||
主要体现在下面两种类型的问题上。
|
||||
|
||||
1. **非人为恶意的意外投票过程。**非人为恶意篡改可归类为信鸽半路挂掉、信鸽迷路、信鸽送错目的地、信鸽送信途中下雨导致信件内容模糊、接收信件的人不在家、天气变化信鸽延迟送达等等。这些对应到分布式系统面临的问题就是:消息丢包、网络拥堵、消息延迟、消息内容校验失败、节点宕机等。
|
||||
1. **人为恶意篡改投票过程。**人为恶意篡改包括“精神分裂式投票”,中继篡改上一个村落的投票信息。对应到分布式系统面临的问题就是:消息被伪造、系统安全攻击等等。发生的人为恶意篡改的过程就可以称之为系统发生了拜占庭错误(Byzantine Fault),如果系统可以容忍拜占庭错误而不至于崩溃,也就是在发生系统被恶意篡改的情况下仍然可以达成一致,我们将这样系统称作为做拜占庭容错系统。
|
||||
|
||||
问题1我们已经有较成熟的方案了。分布式系统本质上是一种并行异步操作,如果通过中心化的手段将系统中的“并行不确定”操作变更为“同步串行”操作就能解决上述的问题。
|
||||
|
||||
比如让第三方机构介入托管所有人的投票;或者构造一个不可伪造令牌,大家轮流将投票统一写到令牌上。
|
||||
|
||||
这些也是现代分布式系统经常使用的方法。但是这些方法有个缺陷,如果在分布式系统中被过多地使用以后,系统便会越来越像单点系统。
|
||||
|
||||
我们设计分布式系统的初衷就是为了克服单点系统的可用性不足、扩展性不好、单点性能上限等缺陷,这种退化的方案可能不是我们想要的。
|
||||
|
||||
而问题2要求设计拜占庭容错系统,这个在IT行业并不常见,因为多数IT系统是中心化的,所以如果我们想要解决问题2,这就引出了我们今天要介绍的共识算法与分布式一致性算法。
|
||||
|
||||
## 有关分布式系统的定理
|
||||
|
||||
我们在介绍具体的分布式一致性算法之前,先介绍两个定理,做一下铺垫。
|
||||
|
||||
- **第一个是FLP不可能性**,简单来说是:即使网络通信完全可靠,只要产生了拜占庭错误,就不存在一个确定性的共识算法能够为异步分布式系统提供一致性。换句话来说就是,不存在一个通用的共识算法可以解决所有的拜占庭错误。
|
||||
- **第二个是CAP定理**,CAP定理是分布式系统领域最重要的定理之一,这个我们在“理解区块链的常见误区”一文中稍微讲到过。也就是在设计分布式系统的过程中,“一致性”“可用性”“分区容忍性”三者中,我们只能选择两个作为主要强化的点,另外一个必然会被弱化。
|
||||
|
||||
我们由CAP定理可以推导出严格一致性和最终一致性。严格一致性是指在约定的时间内,通常是非常短、高精度的时间内,系统达到一致性的状态,这种系统很难实现,即使实现也很难有高的性能。
|
||||
|
||||
所以人们从工程的角度提出了最终一致性,最终一致性不要求严格的短时间内达到一致。为了其他两个指标,我们相当于让一致性在时间上做了妥协。区块链满足了最终一致性,而且处理过程时间比较长。
|
||||
|
||||
可用性其实是传统技术后端架构上非常重要的指标,从单点到主备模式、从主备模式到异地多活,再到现在的Paxos和Raft协议。
|
||||
|
||||
我们从软件架构上也经历了基于ESB的模块化SOA模式,到无状态的微服务架构。从工程的角度来看,根据业务需求达到4个9、6个9就足够了,只是肯定比不了区块链近乎100%的可用性。
|
||||
|
||||
分区容忍性在企业内部极少出现,尤其是中心化的服务性应用,所以很少考虑。然而区块链的P2P网络环境十分复杂,所以必须要保证很高的分区容忍性。
|
||||
|
||||
通过以上我们可以发现比特币、以太坊等公链是偏重高可用性、分区容忍性(AP),满足最终一致性(C)且TPS较低的分布式系统。
|
||||
|
||||
所以如果有人号称他们的区块链能够达到媲美中心化系统上万的TPS,先别着急投资,你问问他们技术是不是知道CAP定理,再问问他们的去中心化程度如何。
|
||||
|
||||
这点我们也可以从EOS等高性能的区块链身上佐证,EOS全球只有21个记账节点,而以太坊全球有上万个节点可以随时参与记账,所以越想去中心化,你的TPS就不可能高,这也就是为什么EOS的TPS高,而以太坊的TPS低。
|
||||
|
||||
接下来我来介绍一下经典的分布式一致性算法和区块链的共识算法。经典的分布式一致性算法在多数的论文中一般被叫做共识算法,在这里,我为了与区块链的共识算法做出区别,所以在命名上改成了分布式一致性算法,但是它们要解决的问题是一样的。
|
||||
|
||||
## 共识算法与分布式一致性算法
|
||||
|
||||
### 1.经典的分布式一致性算法
|
||||
|
||||
经典分布式一致性算法有Raft协议,Raft协议是一种强Leader的一致性算法,它的吞吐量基本就是Leader的吞吐量,它无法抵御节点恶意篡改数据的攻击。
|
||||
|
||||
稍微复杂一点的就是Paxos协议,Paxos能提供不同场合不同种类的一致性算法,所以Paxos有很多变种,经典Paxos是Leaderless的,有变种是强Leader型的,叫做Fast Paxos,有关Paxos的文献非常丰富,这里就不赘述了。
|
||||
|
||||
以上两种都是不提供拜占庭容错的系统,下面介绍一种具有拜占庭容错的一致性算法。
|
||||
|
||||
PBFT全称实用性拜占庭容错系统(Practical Byzantine Fault Tolerance, PBFT),PBFT是一种状态机,要求所有节点共同维护一个状态,所有节点采取的行动一致,PBFT非常适合联盟链等对性能具有较高要求的场合,超级账本项目中的Fabric框架默认采用的就是PBFT的修改版本。
|
||||
|
||||
### 2.区块链共识算法
|
||||
|
||||
区块链的共识算法,我在某些场合直接称作基于经济学的博弈算法,以区别于经典分布式一致性算法思路,它的整体思路就是让攻击者的攻击成本远远大于收益。
|
||||
|
||||
区块链中的共识算法目前具有工业成熟度的是PoW,另外两种比较成熟的是PoS和DPoS,其次还有一些变种和单一币种使用的共识算法,例如Ripple共识、PoC共识(概念性证明)、PoE共识(存在性证明)。
|
||||
|
||||
在使用PoW共识算法的情况下,容错阈值是50%,而PBFT及其变种的容错阈值是33%左右,这里的百分比是指作弊节点占全网节点的比例。
|
||||
|
||||
PoX类的算法其实都延续了PoW的设计理念,相比较经典分布式一致性算法,PoX类算法通过概率选择记账者降低了潜在的提案者,另外是延长了达成最终一致性的时间。
|
||||
|
||||
第一条降低了系统通信复杂度,每次记账系统的确定性其实是概率确定的,又由于被选中需要付出成本,此处才提高了记账成本阈值,结合区块链的基础代币设计,是一个非常天才的想法。
|
||||
|
||||
有关PoW、PoS、DPoS的内容,我在后面会有专文介绍。
|
||||
|
||||
## 总结
|
||||
|
||||
今天我们从相亲大会开始说起,介绍了分布式系统所面临的问题,之后,我们又引出了区块链所要解决的拜占庭容错问题,并重点介绍了分布式系统的基本定理,最后我还介绍了经典共识算法和区块链算法。
|
||||
|
||||
区块链并没有逃离分布式系统这个理论框架,希望今天的内容能够帮助你分辨出真实的区块链项目。最后给你留一个思考题,区块链行业有哪些公司使用了如PBFT、Paxos这样的经典共识算法呢?你可以给我留言,我们一起讨论。
|
||||
|
||||
感谢你的收听,我们下期再见。
|
||||
|
||||
|
||||
158
极客时间专栏/geek/深入浅出区块链/第二章 深入区块链技术/第12讲 | 深入区块链技术(四):PoW共识.md
Normal file
158
极客时间专栏/geek/深入浅出区块链/第二章 深入区块链技术/第12讲 | 深入区块链技术(四):PoW共识.md
Normal file
@@ -0,0 +1,158 @@
|
||||
<audio id="audio" title="第12讲 | 深入区块链技术(四):PoW共识" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/44/56/4499875f1fc699265a2a65481e40a756.mp3"></audio>
|
||||
|
||||
上一篇文章中,我们谈到了区块链其实就是一种分布式系统,它在技术上并没有跳出分布式系统的理论框架,只是给出了一种不同于计算科学领域的解决方案。今天,我们就来重点聊聊区块链的这种解决方案: PoW 共识机制。
|
||||
|
||||
## PoW工作量证明
|
||||
|
||||
因为比特币采用了PoW共识机制,所以这个概念才得以被广泛传播。PoW全称Proof of Work,中文名是工作量证明,PoW共识机制其实是一种设计思路,而不是一种具体的实现。
|
||||
|
||||
PoW机制其实早在1997年就被提出了,它早期多被应用在抵抗滥用软件服务的场景中,例如抵抗垃圾邮件(所以PoW在邮件服务系统会有所涉及)。
|
||||
|
||||
我们借用维基百科的一张图来解释一下PoW机制是如何用在这个场景中的。
|
||||
|
||||
为了防止垃圾消息泛滥,接收者并不直接接受来自任意发送者的消息,所以在一次有效的会话中,发送者需要计算一个按照规则约定难题的答案,发送给接受者的同时,需要附带验证这个答案,如果这个答案被验证有效,那么接受者才会接受这个消息。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/c5/82/c5ddd1f74c990471750a8db6ad177182.png" alt="">
|
||||
|
||||
可以看出PoW的核心设计思路是提出一个计算难题,但是这个难题答案的验证过程是非常容易的,这种特性我们称之为计算不对称特性,我们在“浅谈区块链共识机制”中举的24点游戏的例子就具备了计算不对称特性。
|
||||
|
||||
## 如何理解区块链PoW
|
||||
|
||||
上面介绍了一般的PoW是什么,那么区块链上的PoW又是如何设计的呢,我们还是以比特币为例子来讲一讲,这个部分会有代码演示,如果你在收听音频,可以点击文稿查看。
|
||||
|
||||
在分析拜占庭将军问题的时候可以看出,如果所有节点在同一时刻发起提案,那么这个系统的记账过程将会非常的复杂混乱,为了降低具有提案权的节点数量,采用工作量证明不失为一个好办法。
|
||||
|
||||
所以我们需要构造一个计算不对称的难题,这个难题在比特币中被选定为以SHA256算法计算一个目标哈希,使得这个哈希值符合前N位全是0。
|
||||
|
||||
举个例子,假设我们给定一个字符串“geekbang”,我们提出的难题是,计算一个数字,与给定的字符串连接起来,使这个字符串的SHA256计算结果的前4位是0,这个数字我们称作nonce,比如字符串"geekbang1234",nonce就是1234,我们要找到符合条件的nonce。
|
||||
|
||||
我们以Python代码作为示例。
|
||||
|
||||
```
|
||||
|
||||
#!/usr/bin/env python
|
||||
import hashlib
|
||||
|
||||
def main():
|
||||
base_string = "geekbang"
|
||||
nonce = 10000
|
||||
count = 0
|
||||
while True:
|
||||
target_string = base_string + str(nonce)
|
||||
pow_hash = hashlib.sha256(target_string).hexdigest()
|
||||
count = count + 1
|
||||
if pow_hash.startswith("0000"):
|
||||
print pow_hash
|
||||
print "nonce: %s scan times: %s" % (nonce, count)
|
||||
break
|
||||
nonce = nonce + 1
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
||||
```
|
||||
|
||||
代码中,我规定了基础字符串是"geekbang",nonce从10000开始自增往上搜索,直到找到符合条件的nonce值。
|
||||
|
||||
我们计算的结果放在图中,你可以点击查看。
|
||||
|
||||
```
|
||||
# 前4位是0
|
||||
0000250248f805c558bc28864a6bb6bf0c244d836a6b1a0c5078987aa219a404
|
||||
nonce: 68828 scan times: 58829
|
||||
# 前5位是0
|
||||
0000067fc247325064f685c32f8a079584b19106c5228b533f10c775638d454c
|
||||
nonce: 1241205 scan times: 1231206
|
||||
# 前7位是0
|
||||
00000003f41b126ec689b1a2da9e7d46d13d0fd1bece47983d53c5d32eb4ac90
|
||||
nonce: 165744821 scan times: 165734822
|
||||
|
||||
```
|
||||
|
||||
可以看出,每次要求哈希结果的前N位多一个0,计算次数就多了很多倍,当要求前7位都是0时,计算次数达到了1.6亿次。这里我同时截图了操作系统当时CPU的负载,可以看到单核CPU负载长时间达到100%。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/6c/b5/6c4b21deef14e84091e477ac1ff6b3b5.png" alt="">
|
||||
|
||||
通过上述程序,希望你对区块链PoW机制有个直观的了解。由于结果只能暴力搜索,而且搜索空间非常巨大,作弊几乎不可能,另外符合条件的nonce值也是均匀分布在整个空间中的,所以哈希是一个非常公平且粗暴的算法。
|
||||
|
||||
以上代码的基本逻辑就是PoW挖矿过程,搜索到一个目标值就会获得记账权,距离上一次打包到现在未确认的交易,矿工就可以一次性将未确认的交易打包并广播了,并从Coinbase获得奖励。
|
||||
|
||||
实际挖矿的基本步骤如下。
|
||||
|
||||
1. 生成Coinbase交易,并与其他所有准备打包进区块的交易组成交易列表,并生成默克尔哈希;
|
||||
1. 把默克尔哈希及其他相关字段组装成区块头,将区块头(Block Header)作为工作量证明的输入,区块头中包含了前一区块的哈希,区块头一共80字节数据;
|
||||
1. 不停地变更区块头中的随机数即nonce的数值,也就是暴力搜索,并对每次变更后的的区块头做双重SHA256运算,即SHA256(SHA256(Block_Header))),将结果值与当前网络的目标值做对比,如果小于目标值,则解题成功,工作量证明完成。
|
||||
|
||||
如果更深程度去理解的话,PoW机制是将现实世界的物理资源转化成区块链上虚拟资源的过程,这种转化为区块链提供了可信的前提。
|
||||
|
||||
## PoW挖矿的发展历程
|
||||
|
||||
好了,现在我们知道了,PoW的过程其实就是计算一个难题解的过程。
|
||||
|
||||
在区块链的发展史上,PoW经历了大致两个阶段。分为早期分散挖矿阶段和中心化矿池挖矿阶段。我们目前处于第二个阶段,并且将会长期处于这个阶段。
|
||||
|
||||
早期分散挖矿是中本聪的愿景,期望是1CPU=1票,所以如果CPU挖矿,那么将会是非常理想化的情况,而现实的情况是,SHA256只需要非常简单的重复计算逻辑,它不需要复杂的逻辑控制。
|
||||
|
||||
那么CPU这种重控制逻辑,轻重复计算的计算单元来搞这么低端的暴力计算非常吃力不讨好,大部分人的第一反应肯定是用GPU呀,非常正确。
|
||||
|
||||
所以这个时期,出现了GPU挖矿,它的效率是CPU的十几甚至上百倍,那么1CPU=1票的逻辑就被打破了,挖矿工具的改变让人们意识到挖矿技术也是极大改进的。除了GPU挖矿,我们还有ASIC芯片挖矿,这部分内容我们在讨论挖矿算法分类时会详细讲解。
|
||||
|
||||
同期我们也慢慢进入到了中心化挖矿阶段。中心化挖矿很好理解,算力如果越分散,也就意味着竞争越激烈,如果某个节点计算出答案了,那么也意味着其他矿工这段时间的工作量几乎都白费了,投入了物理资源结果零收益,可以说是负收益。
|
||||
|
||||
那怎么办呢?思路就是把分散的算力汇聚到一个池子里面,这个池子我们称作矿池,就像四面八方的小溪流最终汇总成一条大江一样。
|
||||
|
||||
矿工参与到某个矿池,相当于矿工把算力租给矿池了,与其他矿工联合挖矿,最后看起来矿池这个节点的算力就会很大,获得记账权的概率就越大,如果这个矿池计算出了答案,将获得Coinbase的奖励,矿池就会按既定的分配比例打给每一位参与的矿工。
|
||||
|
||||
我们借用一下《精通比特币》一书中的部分图来看一下:
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/39/3e/391f50f6f720912df35cebd501efd43e.png" alt="">
|
||||
|
||||
矿池作为一个中心节点,可以被矿工连接,而在比特币全网来看,矿池节点本质上也只是一个全节点,它与其他全节点一起组成了比特币的点对点网络,特殊的地方仅仅在于它可以产生新的区块。
|
||||
|
||||
## PoW挖矿算法分类与简介
|
||||
|
||||
PoW挖矿算法大致分为两个大类,第一类叫做计算困难,第二类叫内存困难。
|
||||
|
||||
这两类的区别在于对于提供工作量证明的组件要求不同。我们知道计算机的组成分为计算单元和存储单元,通过以往的编程经验我们还可以知道,一个计算机的瓶颈往往是IO,如果要制造大量的IO操作,可以通过写程序撑大内存,制造大量的数据处理过程,使工作量证明从计算单元转变为存储单元。
|
||||
|
||||
那为什么要这么做呢?
|
||||
|
||||
其实在PoW挖矿中心化以后,又出现了一次挖矿工具改进,这次超越了GPU,人们先是尝试在FPGA上尝试SHA256的计算过程,结果计算效率成倍于GPU。
|
||||
|
||||
FPGA出现的时间比较短暂,最终人们开发出了ASIC专业芯片来计算SHA256,这就是我们常说的专业矿机。
|
||||
|
||||
专业矿机的出现加速了PoW挖矿的中心化过程,因为购买专业矿机需要额外的时间和精力,配置运行还有一定的门槛,普通人也只能从专业机构手里购买专业矿机。
|
||||
|
||||
所以这些专业矿机直接就是数字货币印钞机,生产专业挖矿芯片的商业公司几乎成了数字货币的货币发行司,这不得不说到市值直逼英伟达的比特大陆公司,它用的就是专业生产数字货币挖矿芯片。
|
||||
|
||||
新的数字货币开发者们为了防止情况重演,不断发明新的挖矿算法。有名的有Scrypt、X11、SHA-3,不过这些依然是计算困难型的挖矿算法,依然没有逃脱出现专业矿机的命运。
|
||||
|
||||
这里不得不提到以太坊的PoW挖矿算法:ETHASH,ETHASH是Dagger-Hashimoto的修改版本,它是典型的内存困难型挖矿算法。直到如今,也没有芯片厂商设计出挖矿芯片。
|
||||
|
||||
正如我们上文所说,因为工作量证明要求的组件从计算资源转变为内存资源,而对内存的高要求使得矿工必须加内存。
|
||||
|
||||
在专业矿机上加一块内存的收益与在GPU上加一块内存获得的收益是差不多的,所以厂商并没有研发内存困难型专业矿机的动力,没有专业矿机的出现,这从某种程度上也缓解了算力中心化的问题。
|
||||
|
||||
## PoW的优势和劣势
|
||||
|
||||
PoW共识的内在优势在于可以稳定币价,因为在PoW币种下,矿工的纯收益来自Coinbase奖励减去设备和运营成本,成本会驱使矿工至少将币价维持在一个稳定水平,所以攻击者很难在短时间内获得大量算力来攻击主链。
|
||||
|
||||
PoW共识的外在优势是目前它看起来依然是工业成熟度最高的区块共识算法,所以在用户信任度上、矿工基础上都有很好的受众。
|
||||
|
||||
PoW共识最大的缺点是非常消耗计算资源,耗电耗能源,这一点也一直为人们所诟病。因为每次产生新的区块都会让相当一部分工作量证明白白浪费了,也就是将计算资源浪费了。
|
||||
|
||||
目前来看这个是无解的,只要是PoW共识,一定会遇到计算资源浪费的问题。不过人们也想了一些改进方案,早期如素数币,近期有比原币,它们都号称深度学习友好型的工作量证明方法。
|
||||
|
||||
从理论上来看,PoW会一直有51%算力攻击的问题,即攻击者只需要购买超过全网51%算力设备,即可发起“双花攻击”,甚至“重放攻击”等多种高收益攻击,这个问题目前没有解决方案。
|
||||
|
||||
除了51%攻击,PoW共识还有自私挖矿的问题,自私挖矿是一种特殊的攻击类型,不会影响区块链正常运转,但是会形成矿霸,间接造成51%攻击,我们就曾经遇到过这样的自私挖矿攻击。
|
||||
|
||||
PoW共识机制是一种简单粗暴的共识算法,它不要求高质量的P2P网络资源,它可以为公链提供稳定有效的记账者筛选机制。同时它也面临了挖矿中心化严重的问题,这也促使人们研究出了新的共识机制,我们留到下一篇讲解。
|
||||
|
||||
## 总结
|
||||
|
||||
今天我介绍了PoW工作量证明,并且使用Python语言演示了一遍基于SHA256的挖矿算法工作过程,又介绍了发展历程和算法分类,最后提到了PoW的优势和缺陷。相信你对PoW机制的理解可以更加深入了。
|
||||
|
||||
PoW工作量证明的挖矿过程是否可以替换成有意义的算法呢,历史上是否有过类似创新?你可以调查一下,我们一起分享。
|
||||
|
||||
|
||||
108
极客时间专栏/geek/深入浅出区块链/第二章 深入区块链技术/第13讲 | 深入区块链技术(五):PoS共识机制.md
Normal file
108
极客时间专栏/geek/深入浅出区块链/第二章 深入区块链技术/第13讲 | 深入区块链技术(五):PoS共识机制.md
Normal file
@@ -0,0 +1,108 @@
|
||||
<audio id="audio" title="第13讲 | 深入区块链技术(五):PoS共识机制" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/73/ff/730c1308679c52b92ce24440b9a574ff.mp3"></audio>
|
||||
|
||||
上一篇我们讲到了PoW共识机制,这一篇我们就来分享另外一种共识机制,PoS共识机制。
|
||||
|
||||
PoS全称是Proof of Stake,中文翻译为权益证明。这一篇我们会将PoS与PoW对比讲解,帮助你加深理解。
|
||||
|
||||
## PoS的由来
|
||||
|
||||
PoS最早出现在点点币的创始人Sunny King的白皮书中,它的目的就是为了解决使用PoW挖矿出现大量资源浪费的问题。PoS共识机制一经提出就引起了广泛关注,Sunny King 也基于PoW的基础框架实现了第一代PoS区块链:点点币。
|
||||
|
||||
PoW的具体实现有很多版本,但它们大多只是在挖矿算法上有所改进,主体逻辑并没有发生质的变化。PoS包含了多个变种实现,每个变种往往会涉及区块链代币经济模型的改动,可以说是牵一发而动全身。
|
||||
|
||||
这些实现有点点币、黑币、未来币、瑞迪币,它们都推动了PoS机制的发展,PoS研究前沿还有以太坊的 Casper ,以及 Cardano 的Ouroboros。
|
||||
|
||||
那到底是什么样的机制导致PoS具有这样的特性呢?让我们来看一看。
|
||||
|
||||
## 什么是PoS?
|
||||
|
||||
在讲PoS之前,我先来讲一个叫做币龄的概念,币龄这个概念其实很好理解,它的英文是 CoinAge,字面意思就是币数量乘以天数。
|
||||
|
||||
比如你有100个币,在某个地址上9天没有动,那么产生的币龄就是900,如果你把这个地址上这100币转移到任意地址,包括你自己的地址,那么900个币龄就在转移过程中被花费了,你的币数量虽然还是100个,但是币龄变更为0。币龄在数据链上就可以取到,任何人都可以验证。
|
||||
|
||||
我们回过头来看看PoS究竟是什么,区块链共识机制的第一步就是随机筛选一个记账者,PoW是通过计算能力来获得记账权,计算能力越强,获得记账权的概率越大。
|
||||
|
||||
PoS则将此处的计算能力更换为财产证明,就是节点所拥有的币龄越多,获得的记账的概率就越大。这有点像公司的股权结构,股权占比大的合伙人话语权越重。
|
||||
|
||||
以上算是简述了PoS的概念,实际上,PoS的发展经历了三个版本,第一个版本是以点点币为代表的PoS1.0版本,这个版本中使用的是币龄;第二个版本的代表是黑币(blackcoin),对应使用的是币数量,相当于是财产证明,后面黑币又升级到PoS3.0,这个版本又回到了币龄。
|
||||
|
||||
PoW早在比特币出现之前就已经应用了,而PoS是才是真正意义上为了区块链而创造出来的概念。
|
||||
|
||||
## PoS的实现原理
|
||||
|
||||
好了,现在我们开始讲解PoS的具体实现原理吧。这一部分公式较多,如果你在收听音频,可以点击文稿查看。
|
||||
|
||||
通过上一篇我们知道PoW挖矿的基本逻辑和步骤,我们先寻求一个nonce小于目标值,这一步用公式可表示为:
|
||||
|
||||
**Hash (block_header) < Target**
|
||||
|
||||
从公式中我们可以看到,PoW下所有矿工的目标值是一样的,只要计算结果哈希小于目标值即可,简化来看就是前导0的个数。
|
||||
|
||||
而在PoS系统中,这个公式变更为:
|
||||
|
||||
**Hash (block_header) < Target * CoinAge**
|
||||
|
||||
我们可以看出多引入了一个变量叫做CoinAge,也就是币龄,这里就有意思了。
|
||||
|
||||
这个变量为会造成每个矿工看到的目标值不一样,如果你的币龄越大,也就意味着你的获得答案越容易。这里的Target与PoW一致,与全网难度成反比,用来控制出块速度的。
|
||||
|
||||
例如当前全网的目标是4369,A矿工的输入的币龄是15,那么A矿工的目标值为65535,换算成十六进制就是0xFFFF,完整的哈希长度假设是8个字节,也就是0x0000FFFF。
|
||||
|
||||
而B矿工比较有钱,他输入的币龄是240,那么B矿工的目标值就是0x000FFFFF。你如果仔细观察肯定会发现,相比A矿工的目标值,B直接少了一个零。即如下:
|
||||
|
||||
- A 矿工 Hash( block_header ) < 0x0000FFFF
|
||||
- B 矿工 Hash( block_header ) < 0x000FFFFF
|
||||
|
||||
所以B矿工获得记账权的概率肯定要比A高。
|
||||
|
||||
具体代码分析这里就不讲解了,这里需要币龄作为输入,如果我们写示例代码也只是一个简单的参数,PoS需要放到区块链的语境中才能运作。
|
||||
|
||||
## PoS的相关问题
|
||||
|
||||
通过上述的介绍我们知道:PoS似乎完美地解决了PoW挖矿资源浪费的问题,甚至还顺带解决了51%攻击的问题,这里可以顺便讲一下51%攻击是什么,它是指PoW矿工如果积累了超过51%的算力,则可以一定程度篡改账本。
|
||||
|
||||
这里顺便科普一下,什么是51%攻击呢,我们发现,矿工挖矿的成本不再是物理设备和电费,而是虚拟代币,它的边际成本几乎为零,本质上PoS让挖矿者和使用者合二为一了。
|
||||
|
||||
这也意味着如果挖矿者发起51%攻击,就需要拥有全网51%的币或币龄,这几乎不可能办到,即使你成功地实施了51%攻击,那么也意味着作为全网最大的持币大户的你,损失也会最大。
|
||||
|
||||
PoS看起来相当完美,其实并不然,PoS有很多缺陷。
|
||||
|
||||
PoS遇到的第一个问题就是币发行的问题。一开始的时候,只有创始区块上有币,意味着只有这一个节点可以挖矿,所以让币分散出去才能让整个网络壮大,那么如何分散出去又是另外一个难题了。
|
||||
|
||||
所以早期PoS币种基本都采用了分阶段挖矿,有的叫混合挖矿,其实,我并不同意混合挖矿这个说法,混合就意味着同时。很多币种其实是分了阶段的,即第一阶段是PoW挖矿,到第二阶段才是PoS挖矿。
|
||||
|
||||
随着ERC20类型的标准合约代币的出现,这个问题被解决了,不再需要第一阶段改成PoW,也可以将代币分散出去。
|
||||
|
||||
第二个问题是由于币龄是与时间挂钩的,这也意味着用户可以无限囤积一定的币,等过了很久再一次性挖矿发起攻击;所以解决方案是:PoS机制需要引入一个时间上限来控制时间因素的自然增长。
|
||||
|
||||
第三个问题是虽然引入了时间上下限,用户还是倾向于囤积代币,这会造成币流通的不充分;基于此,所以瑞迪币引入了币龄按时间衰减,构造了权益速度证明,鼓励用户流动代币,而不是倾向于囤积代币。
|
||||
|
||||
第四个问题是离线攻击,即使引入了时间上下限,时间仍然是自然流动的,也就是可以不需要求挖矿节点长时间在线。挖矿是可以离线的,这简直是灾难,所以任意一个PoS机制的实践形式都必须避免这个问题,因为网络节点数量的多少直接关系到区块链网络的健壮性。
|
||||
|
||||
当然这些问题都不是致命问题,还记得我们一开始提到了PoS经历了三个版本,而第二个版本PoS 2.0使用的不是币龄,而直接是币的数量。
|
||||
|
||||
这会造成完全不同的结果,上述第二、三、四问题都不存在了,似乎看起来直接使用币的数量会更好一些,但却出现了整个PoS机制的致命问题。
|
||||
|
||||
这个问题叫做Nothing at Stake,翻译过来叫做无成本利益问题。大体的意思在PoS系统中做任何事几乎没有成本,比如在PoS系统上挖矿几乎没有成本,这也就意味着分叉非常方便。
|
||||
|
||||
方便到什么程度呢,每个诚实矿工在产生孤块的时候都可以继续挖下去,反正也没什么成本,反正分叉链和主链都可以同时挖,也就是任何持币较少的用户都可以尝试分叉,并且把分叉链广播出去。
|
||||
|
||||
这个时候如果其他诚实矿工看到了,第一反应也是没有成本,那么咱们也来挖吧,说不定什么时候就值钱了,意思就是说任何逐利的矿工并不会使这个系统变得更强壮稳定,而是更加的混乱。
|
||||
|
||||
无成本利益问题无论以币龄还是币数量作为PoS的参数,都无法避免。
|
||||
|
||||
而PoW则没有这样的问题,我们回到PoW系统中来看,因为任何的分叉都会造成挖矿成本直接变成负收益,所以这会抵抗分叉的产生,矿工倾向于跟随“最长”的链。
|
||||
|
||||
由于以太坊部分采用了PoS共识,它的名字叫做Casper,它必须解决上述无成本利益问题攻击。所以Casper协议要求PoS矿工需通过抵押保证金的方法对共识结果进行下注,具体实践结果我们还需要拭目以待。
|
||||
|
||||
## 总结
|
||||
|
||||
最后我们来总结一下PoS共识机制,PoS的区块链系统无需外部物理输入,所以它相比PoW更为环保不费电,并且矿工就是使用者,这会在一定程度上抵御了51%攻击,所以基于PoS机制的数字货币属于理想状态的数字货币。
|
||||
|
||||
PoS的缺点是缺乏工业级的区块链应用,从逻辑上来看有点循环自证明的味道,就是用自己的币来维护系统的安全,而币的安全性是由系统保证的,所以现阶段PoS共识机制往往不是独立运行的,而是混合了PoW一起运行,这就可以弥补PoS的缺陷。
|
||||
|
||||
PoS共识机制目前也出现了矿池,也可能会出现中心化挖矿的风险。
|
||||
|
||||
虽然PoS共识机制未来变数依然很多,但它的可塑性比PoW好,技术上的探索空间大,目前PoS币种相比较PoW币种风险也较高。
|
||||
|
||||
那么有哪些区块链项目使用了PoS共识机制呢?你可以给我留言,我们一起讨论,感谢你的收听,我们下期再见。
|
||||
169
极客时间专栏/geek/深入浅出区块链/第二章 深入区块链技术/第14讲 | 深入区块链技术(六):DPoS共识机制.md
Normal file
169
极客时间专栏/geek/深入浅出区块链/第二章 深入区块链技术/第14讲 | 深入区块链技术(六):DPoS共识机制.md
Normal file
@@ -0,0 +1,169 @@
|
||||
<audio id="audio" title="第14讲 | 深入区块链技术(六):DPoS共识机制" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/19/c6/195d7fea94b6cb2fcc0ab8ba16f17ac6.mp3"></audio>
|
||||
|
||||
上一篇文章里,我们讲解了PoS共识机制,这一篇我们来分享PoS的一个扩展机制,这个机制在业界也非常的流行,它叫做DPoS共识机制。DPoS全称是Delegated Proof of Stake,中文翻译过来是代理权益证明。
|
||||
|
||||
## 从BM开始聊起的故事
|
||||
|
||||
我们聊DPoS时,为什么要从BM聊起呢,
|
||||
|
||||
其实,这和聊比特币绕不开中本聪一样,DPoS是BM一手创造的。DPoS不是独立提出的共识算法,而是直接被BM应用到比特股项目中,在稳定运行了3年多后,又接着被BM构造成可复用的区块链工具箱:石墨烯。
|
||||
|
||||
虽然应用得很早,但DPoS算法直到2017年才被BM单独拎出来作了一篇“DPoS技术白皮书”,这期间伴随着比特股、Steemit、EOS三个项目的依次发布。
|
||||
|
||||
那么到底BM是谁,市场上对这个人的评价为什么富有争议呢?或许我们从了解BM开始,才能体会到DPoS的精髓。
|
||||
|
||||
我们在前面的文章中曾简单提过BM,BM的本名是Daniel Larimer,由于他的GitHub昵称是ByteMaster,所以才被称作BM。BM是比特股、Steemit、EOS项目的创始人,截止发稿时,这三个产品的市值均在区块链项目的Top33以内。
|
||||
|
||||
与年少成名V神的辍学经历不同,BM 2003年毕业于弗吉尼亚理工学院,获得计算机学士学位,算是正经的科班出身。
|
||||
|
||||
BM曾直言不讳地说到:“我的人生目标就是找到自由市场的方案来保护生命、自由和财产”。他认为要达成这个目标,就必须要从货币开始。
|
||||
|
||||
我们在数字货币一节提到过,无论是贵金属还是信用货币,都是历史的必然,所以在选择使用什么货币上,BM认为不一定是美元,他希望的是:构造一种自由安全的数字货币。
|
||||
|
||||
2009年,他怀揣梦想开始了数字货币的事业,他先发现了比特币,于是不遗余力地推广着这个项目。
|
||||
|
||||
然而在2010年,BM指出中本聪10分钟一次的交易确认时间太长了,这样的话,性能会是一个瓶颈,然而这样的想法却遭到了中本聪的暴击:看不懂就算了,我没时间搭理你。
|
||||
|
||||
于是,BM觉得比特币不是希望,便着手开发第一个项目——比特股,同时创造出DPoS,把自己的高性能共识算法想法形成了实践。
|
||||
|
||||
在这里,我们可以看出DPoS与其他共识机制的第一个区别,就是交易确认时间短。
|
||||
|
||||
2014年,当V神还在到处奔走,开始发起以太坊项目的众筹时,当很多项目还是基于比特币的微创新时,比特股就已经横空出世了。
|
||||
|
||||
所以比特股一跃成为了当时的明星项目,它的口号是“Beyond Bitcoin”,在这里我们可以感受到极强的攻击性和目的性,也正因为如此,日益强大的比特币社区被树在了它的对立面。
|
||||
|
||||
比特股一共有2个版本,比特股在1.0版本之前,某些版本甚至都没有提供向下兼容。虽然后来正式发布了1.0版本,似乎并没有改善多少。糟糕的使用体验,庞大的系统资源开销,还是让尝鲜的用户逐渐流失了。
|
||||
|
||||
这时候BM利用了自己手里超过1/3的记账节点,在没有达成社区共识的情况下,强行增发了比特股总量。这一招几乎就是比特股项目的灭顶之灾,社区人就此纷纷退出。
|
||||
|
||||
虽然社区萎靡,BM还是继续了开发工作,将比特股升级到了2.0,它的易用性和稳定性勉强可以满足正常使用。随着比特股2.0的发布,BM也同时发布了石墨烯工具箱。
|
||||
|
||||
尽管在技术上提供了改进,但比特股社区最终选择让BM离开比特股项目,比特股回到了另一位币圈大佬——巨蟹的手里。随后比特股的发展陷入了长期的低迷,长期在2分,最多到2角钱左右,直到去年的牛市,比特股涨到过2元人民币。
|
||||
|
||||
虽然最终离开了比特股,但是BM依然会参与BTS紧急Bug修复工作。与此同时,BM又开发了一款旨在颠覆传统互联网媒体行业的项目——Steemit,这也是开辟了基于区块链Token内容社区的先例。Steemit也是基于石墨烯技术的,它非常流行。
|
||||
|
||||
2017年,随着Steemit的成熟,BM宣布退出了Steemit,开展了下一个项目EOS。EOS的目的是要做出区块链行业的操作系统,为开发者提供底层功能,包括并行运算、数据库、账户系统等等。
|
||||
|
||||
EOS一经发布,就广受关注,短短五天内,EOS便筹集到了数亿美金,它的代币销售规模在目前为止是最大的。
|
||||
|
||||
现阶段的EOS超级节点竞选也体现出了BM强大的影响力。 EOS项目影响力也越来越大,BM因为与V神在区块链上的理念不合,也经常互怼,他们争论的重点是二人对于去中心化的前提假设不同,这也造就了两个不同的设计逻辑,所以,两人的争论过程可以说是非常地吸引眼球了。
|
||||
|
||||
我们从BM的个人经历、项目经验、影响力都可以看出BM是一个很懂金融的天才式程序员,同时也是一个有点刚愎自用导致与社区矛盾不断的意见领袖。
|
||||
|
||||
## DPoS详解
|
||||
|
||||
讲完了BM的故事,我们再来讲讲DPoS。我们在前文粗略地讲过DPoS算法,我们先来回顾一下。
|
||||
|
||||
简单来理解,DPoS共识算法就是将PoS共识算法中的记账者转换为指定节点数组成的小圈子,而不是所有人都可以参与记账,这个圈子可能是21个节点,也有可能是101个节点,这一点取决于设计,只有这个圈子中的节点才能获得记账权。这将极大地提高系统的吞吐量,因为更少的节点也就意味着网络和节点的可控。
|
||||
|
||||
### 1.DPoS共识的目标
|
||||
|
||||
从名称上,我们也可以判断出DPoS与PoS共识是直接关联的。DPoS算法是BM根据当时PoW、PoS的不足而改进的共识算法,它的目的就是为了提高性能,也就是交易确认时间短。
|
||||
|
||||
在PoS共识中,人们使用财产证明来“挖矿”,也就是说,这是任何人都可以参与的,只要你持有币,你就可以参与挖矿。
|
||||
|
||||
但是我们可以看出,PoS并没有解决性能问题,在这里我们直接认为提高性能就是提高TPS,我们可以构造一个等式,:
|
||||
|
||||
**TPS = transactions / block_time**
|
||||
|
||||
TPS表示区块链每秒能确认的交易数, transactions 是由区块大小block_size和平均每笔交易大小决定的,而区块大小受全网网络状态network_bandwidth 限制,也是由记账节点之间物理带宽witness_performance决定的。
|
||||
|
||||
记账节点的个数witness_count直接决定了物理带宽的上限,因为记账节点数量越多,则对物理带宽要求越高,对网络的稳定性要求也越高。
|
||||
|
||||
要注意的一点是在DPoS中,记账节点不叫做矿工,而是改称为见证人,Witness。
|
||||
|
||||
所以这个公式变成了下面的样子。
|
||||
|
||||
<strong>TPS = (block_size * network_bandwidth * witness_performance) /<br />
|
||||
(block_time * witness_count)</strong>
|
||||
|
||||
我们可以看到,要提高TPS,可以提升分子项,降低分母项,也就是增大区块大小block_size、提升记账节点网络带宽network_bandwidth、提升记账节点处理性能witness_performance,减小区块时间block_time、减小记账节点数量witness_count。
|
||||
|
||||
分子项我们可以看到,它基本受限于物理资源的上限,目前工业水平制造的物理资源的使用上限基本就是整个项的上限了,所以可操作性不大。
|
||||
|
||||
而分母项是由共识算法决定的,所以我们从区块时间,以及记账节点数入手,DPoS算法便正是从这两项着手的。
|
||||
|
||||
首先改动的便是限制记账节点的数量,也就是见证人的数量。
|
||||
|
||||
我们在PoW和PoS中可以看到,成为记账节点是无需门槛的,你可以随时参与挖矿,随时退出。
|
||||
|
||||
那这会带来什么问题呢,首先无法确定记账节点的数量,其次无法确定记账节点之间的网络环境,记账节点数越多网络环境越复杂,这些不确定性会增大网络分区的概率,从而导致区块链分叉。
|
||||
|
||||
如果我们事先规定好记账节点的数量,接着让全网所有节点可以投票决定哪些节点可以成为记账节点,这样就限制并减小了分母项witness_count,这个过程我们也称作投票选举。
|
||||
|
||||
因为记账节点数量不多,那么我们可以在共识算法中可以规定出块时间为一个固定值,这个值可以很小,通过轮流出块的方式来进行记账。
|
||||
|
||||
以上思路基本就是DPoS的基本设计思路,BM还为DPoS算法确立两个原则:
|
||||
|
||||
1. 投票选举过程一定要保证最大权益所有者最终能控制全网,因为一旦出了问题,他们的损失最大;
|
||||
1. 与PoW、PoS一样,所有节点仅承认“最长”链。
|
||||
|
||||
这两个原则确立了DPoS共识的基本特性,第一条放大了PoS共识使用者就是记账者的优点,第二点则规定了分叉时系统应该表现的行为。
|
||||
|
||||
### 2.DPoS共识算法分析
|
||||
|
||||
在DPoS共识算法中,区块链的正常运转依赖于见证人(Delegates),见证人是由全网节点投票产生的,见证人也是记账节点的实际控制人,相当于咱们选课代表,课代表帮我们整理作业。
|
||||
|
||||
见证人在完成打包交易的同时可以领取区块奖励和交易的手续费,并且可以执行社区投票的提案,所以DPoS共识算法不仅仅是算法,而是一个包含了协作治理关系的共识机制。
|
||||
|
||||
我们可以引用“DPoS算法白皮书”中的内容,来看看BM设计DPoS算法是怎样的思路。
|
||||
|
||||
BM认为所有区块链实际是建立交易之上的确定性状态机。共识是在确定交易顺序,过滤无效交易的一个达成一致意见的流程。
|
||||
|
||||
DPoS为了尽快确定交易顺序,过滤无效交易,所以规定了在正常情况下,所有记账节点轮流每3秒产生一个区块,轮到了某个记账节点出块时,必须在3秒内提交区块,否则就会错块。
|
||||
|
||||
假设一直没有记账节点错过自己顺序,那么他们生产的链条势必是最长的链条,如果记账节点在非指定时间生产区块被认为是无效的,每经过一轮,所有节点轮流出块的顺序就会发生重新洗牌。
|
||||
|
||||
下图就是一个理想的轮流记账状态。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/9e/d3/9ed26aa5463938f7ad4010f752bc19d3.png" alt="" /><br />
|
||||
(图来自白皮书)
|
||||
|
||||
DPoS算法白皮书介绍了7种异常的情况会打破上面的正常情况。
|
||||
|
||||
例如少数记账节点发起恶意分叉或者发生故障,如下图。<br />
|
||||
<img src="https://static001.geekbang.org/resource/image/2a/83/2abb394283fe4692205f16378bea3783.png" alt="" /><br />
|
||||
(图来自白皮书)
|
||||
|
||||
在这种情形下,B节点只能在9秒内生产1个块,而大多数分支,由于数量多一倍,将预期能在9秒内生产2个块,诚实的2/3的大多数可以比小的那一部分创建一个更长的链条,由于原则二,DPoS可以抵御这种攻击。
|
||||
|
||||
在DPoS白皮书中介绍了少数记账节点恶意或故障造成的分叉、网络分区情况下重复出块、少数记账节点重复出块、记账节点数量不足、多数记账节点的联合腐败等各种情况。
|
||||
|
||||
由于篇幅有限,你如果感兴趣的话可以自行阅读。遗憾的是白皮书中的内容没有经过严格证明,以定性分析为主,所以我们无法确定DPoS算法是否有设计缺陷。
|
||||
|
||||
在实际应用中,比特股中见证人是101人,EOS里是21人。比特股中见证人们赚取手续费,EOS里见证人们分享EOS的通胀收益。他们都是通过公开选举选出来的,选票就是大家手里的比特股或EOS。
|
||||
|
||||
### 3.有关DPoS的一个争论:中心化问题。
|
||||
|
||||
我们之前文章中提过的FLP和CAP定理,如果为了提升性能,即一致性的效率,势必会牺牲其他两项。这也会引出有关DPoS的一个争论:中心化问题。
|
||||
|
||||
我们以比特股社区为例,每个人都可以尝试成为101个见证人节点中的一个,他们可以在社区里拉票,为社区做事,或者干脆用钱买很多bts。平时大家象征性地开个会,因为是轮流记账,各个节点之间竞争不大。
|
||||
|
||||
但是不要忘记,区块链的发展非常依靠社区,这种方式势必会带来社区的中心化。虽然比特股中101个见证人负责记账,但总得有人指定发展方针,于是又设计出了11人理事会,这同样是通过选票选出来的。
|
||||
|
||||
11人理事会有很高的权力,他们相当于11个超级节点,通过举手表决,甚至可以决定修改代码,而这11人理事会是比特股系统里的中心,也是规则的制定者。
|
||||
|
||||
这是DPoS算法的优势,也是DPoS算法的劣势。在PoW中,矿工、开发者、用户三权分立。
|
||||
|
||||
而DPoS似乎将这三权合并到了见证人和理事会手中。在EOS中,BM还制定了区块链宪法,要求所有记账节点必须遵守,所以也有人抨击这是具备了BM特色的去中心化。
|
||||
|
||||
从某种角度来看,DPoS是社区治理加上共识算法,不再是单纯的技术共识,这是与PoW、PoS算法最大的不同。
|
||||
|
||||
DPoS的基本假设是相信节点是好的,所以尽可能快速选择记账节点,而把问题发生后的修复过程推迟到投票中,可以说DPoS并不考虑拜占庭容错问题,把拜占庭容错推给了社区治理,而在社区治理上可归纳为一切皆投票。
|
||||
|
||||
而现实生活中,很多情况下,投票并不能解决问题,比如投票人都是有惰性的,集齐所有人投票成本是很高的,如果记账节点没有上限,所有节点的投票都投给自己,DPoS系统就会退化成PoS系统。
|
||||
|
||||
## 总结
|
||||
|
||||
我们来总结一下DPoS共识机制。
|
||||
|
||||
DPoS共识机制本身将“矿池”纳入系统内部,并把它们统称为见证节点,虽然不会出现中心化挖矿的风险,但是DPoS由于节点数不多,并且见证节点权力较大,可以认为DPoS本身就是带中心化思路的共识机制。
|
||||
|
||||
最后留一个思考题给你,有关DPoS算法,你能想到有哪些攻击方式吗?欢迎给我留言,我们一起讨论。
|
||||
|
||||
感谢你的收听,我们下期再见。
|
||||
|
||||
链接:
|
||||
|
||||
1. [https://mp.weixin.qq.com/s/r-bmH1tu-Gnn1eJ3GhI0nQ](https://mp.weixin.qq.com/s/r-bmH1tu-Gnn1eJ3GhI0nQ)
|
||||
1. [http://me.tryblockchain.org/blockchain-dpos-bm-eos.html](http://me.tryblockchain.org/blockchain-dpos-bm-eos.html)
|
||||
192
极客时间专栏/geek/深入浅出区块链/第二章 深入区块链技术/第15讲 | 深入区块链技术(七):哈希与加密算法.md
Normal file
192
极客时间专栏/geek/深入浅出区块链/第二章 深入区块链技术/第15讲 | 深入区块链技术(七):哈希与加密算法.md
Normal file
@@ -0,0 +1,192 @@
|
||||
<audio id="audio" title="第15讲 | 深入区块链技术(七):哈希与加密算法" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/01/f9/0168c2158c09b894b1fc45320e3a95f9.mp3"></audio>
|
||||
|
||||
区块链最核心的两个技术点是共识机制和密码学,由于共识机制是公链的基础,所以这部分内容我已经在前面的内容中优先讲解了。
|
||||
|
||||
接下来,我来讲一讲区块链的密码学基础,有关区块链密码学你只需要了解它的基本原理和优劣即可。
|
||||
|
||||
另外,区块链的密码学中文资料也十分丰富,如果你感兴趣的话,可以在学有余力的基础上酌情深入。
|
||||
|
||||
区块链中主要应用了两类密码学算法,第一类是哈希算法,第二类是非对称加密算法。
|
||||
|
||||
我们先来看看哈希算法。
|
||||
|
||||
## 1.哈希算法
|
||||
|
||||
哈希算法是一类数学函数算法,又称散列算法,它是一种数据映射关系。
|
||||
|
||||
为了方便举例,我们假设 h = HASH( X | z ),你输入一个任意长的数据z,经过哈希运算后,返回给你固定长度的数据h,z叫做原像,h是哈希结果,又称作“数据指纹”,z可选的数据集合构成了X。
|
||||
|
||||
哈希算法具有下面的4种特性。
|
||||
|
||||
1. **原像不可逆。**原像不可逆是指对于任意给定的h,都无法依据h自身的信息推导出z。
|
||||
1. **难题友好性。**难题友好性通俗的理解就是如果要得到难题答案,你只能暴力枚举,没有比这更好的方法。在h = HASH( X | z )中,从h无法推导出z,只能不断地计算尝试,那么z所在的数值集合构成了X,X的大小是哈希算法的安全因子之一。
|
||||
1. **发散性。**发散性是指对于任意的z,即使我们只改动非常少的信息量,例如改动1个比特位生成z',那么HASH(z) 与 HASH(z') 就是两个大相径庭的结果,完全不相似。
|
||||
1. **抗碰撞性。**抗碰撞性是指对于任意两个不相同的z,那么他们对应的h值也不同。如果对于任意的 y 不等于 z,则 HASH(y) 不等于 HASH(z);满足上述定义哈希特性的算法,我们也称作具有严格抗碰撞性。如果我们任意给定一个z,你都无法找到另外一个z',使得其值也等于h,满足这样的哈希特性的算法就有弱抗碰撞性。
|
||||
|
||||
目前流行的 Hash 算法包括了MD5、SHA-1 和 SHA-2,其中MD5被证明不具有强抗碰撞性。SHA (Secure Hash Algorithm)是一个 Hash 函数族,分为SHA-1、SHA-2、SHA-3,代表了三代哈希标准,目前使用比较多的是SHA-2系列。
|
||||
|
||||
第一代的SHA-1 基于 MD4设计,并且模仿了该算法,SHA-1 已被证明了不具备“强抗碰撞性”,所以安全性不够高。
|
||||
|
||||
为了提高安全性,第二代 SHA-2一共包含了 SHA-224、SHA-256、SHA-384,和 SHA-512 算法(统称为 SHA-2),它们跟 SHA-1 算法原理类似。SHA-3 相关算法也已被提出,它的出现并不是要取代SHA-2,因为SHA-2目前并没有出现明显的弱点。
|
||||
|
||||
由于对MD5、和SHA-1出现成功的破解,我们需要一个不同与之前算法,可替换的加密散列算法,也就是现在的 SHA-3。
|
||||
|
||||
### 1.1 区块链上的哈希算法
|
||||
|
||||
哈希算法被广泛地使用在构造和验证区块、交易的完整性上,由于哈希算法的四个特性,使得我们可以把任意的交易数据做成数据摘要,然后再一个一个链接起来,形成数据块的链式结构。
|
||||
|
||||
这样我们可以通过验证每个区块间接地验证交易,然后每个交易原数据也可以做成哈希数据摘要,用于验证交易数据的完整性。
|
||||
|
||||
我们借用比特币开发者文档中的图,这个图表达了区块链的基本数据结构,
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/0c/03/0c4e65db96ced396a61f6f4a17efe803.png" alt="">
|
||||
|
||||
在图中可以看出,当前区块里面包含上一个区块的哈希,形成一个哈希指针链表,由于哈希的发散性,所以这个链表也有极大的发散性。
|
||||
|
||||
我们可以用代码模拟一遍,我们先列表构造5个简化的区块,其中第一个块是创世区块,我们规定它指向的前向区块的哈希全为零;
|
||||
|
||||
后面第2个块,第3个块中content分别记录了两笔交易,这里为了方便理解,我使用了文字表述交易的内容,实际上,区块链上的交易是二进制格式化的数据,而不是文本数据。代码中并没有填充哈希,是在运行时填充的。
|
||||
|
||||
```
|
||||
#!/usr/bin/env python
|
||||
import hashlib
|
||||
|
||||
def main():
|
||||
# example:
|
||||
block_headers = [
|
||||
{"prev_block_hash":"0000000000000000000000000000000000000000000000000000000000000000", "content":"genesis block:A pay C 12.3 BTC"},
|
||||
{"prev_block_hash":"to_be_hashed", "content":"2nd block:C pay B 2.0 BTC"},
|
||||
{"prev_block_hash":"to_be_hashed", "content":"3th block:transactions..."},
|
||||
{"prev_block_hash":"to_be_hashed", "content":"4th block:transactions...j"},
|
||||
{"prev_block_hash":"to_be_hashed", "content":"5th block:transactions..."}
|
||||
]
|
||||
|
||||
# hash prev block header
|
||||
index = 0
|
||||
for header in block_headers:
|
||||
# genesis block, ignore
|
||||
if index == 0:
|
||||
print header
|
||||
index = index + 1
|
||||
continue
|
||||
|
||||
# generate hash chain
|
||||
prev_block_header = block_headers[index - 1]
|
||||
target_buffer = prev_block_header["content"] + prev_block_header["prev_block_hash"]
|
||||
header["prev_block_hash"] = hashlib.sha256(target_buffer).hexdigest()
|
||||
print header
|
||||
index = index + 1
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
||||
```
|
||||
|
||||
我们可以直接得到结果,这是一个典型的哈希指针链表,每一个区块的prev_block_hash域指向上一个区块哈希。
|
||||
|
||||
```
|
||||
{'content': 'genesis block:A pay C 12.3 BTC', 'prev_block_hash': '0000000000000000000000000000000000000000000000000000000000000000'}
|
||||
|
||||
{'content': '2nd block:C pay B 2.1 BTC', 'prev_block_hash': '01279c1208a8eca3d4a47a123119b04f1dcc592c818aace2715b2c418b38822a'}
|
||||
|
||||
{'content': '3th block:transactions...', 'prev_block_hash': '6d96c220b22371dc1d2b3549da42bd3ea2191f07f18112bf195bc6675bbc6b97'}
|
||||
|
||||
{'content': '4th block:transactions...j', 'prev_block_hash': '9e41c61fa151320145a56a38e85c01b8c025729614f4c10596d99068ea0b3395'}
|
||||
|
||||
{'content': '5th block:transactions...', 'prev_block_hash': '34f002b445a38fa7402e590629e76943060ffc4de96b1b9bc6b0f564e5a7bc72'}
|
||||
|
||||
```
|
||||
|
||||
如果我们将第二块中的content从"C pay B 2.1 BTC" 修改为 "C pay B 2.0 BTC",那么我们将得到如下结果,我们可以发现从第三个块往后所有的块指向的前一个区块的哈希都不再与上面的一致。
|
||||
|
||||
```
|
||||
{'content': 'genesis block:A pay C 12.3 BTC', 'prev_block_hash': '0000000000000000000000000000000000000000000000000000000000000000'}
|
||||
|
||||
{'content': '2nd block:C pay B 2.0 BTC', 'prev_block_hash': '01279c1208a8eca3d4a47a123119b04f1dcc592c818aace2715b2c418b38822a'}
|
||||
|
||||
{'content': '3th block:transactions...', 'prev_block_hash': 'f91faad6b874fb97a20ad9cbc57ef1302a431a2cce4ac5efe28a64b353526849'}
|
||||
|
||||
{'content': '4th block:transactions...j', 'prev_block_hash': '99d17dfe9a9fab68cffd6a82bc3786fe3c2d3165f1fba30b3f2ffc418c97fc8b'}
|
||||
|
||||
{'content': '5th block:transactions...', 'prev_block_hash': 'd2f42291ef0811e5babc1d38ca8019ee457f84b323a3d549a04b6a4535357d7f'}
|
||||
|
||||
```
|
||||
|
||||
以上我们构造了一个极简的区块链的基本结构,区块头描述了一个区块的基本信息,在实际应用中,里面通常包含了下面的几个内容。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/73/37/73e78324c6c1e360afab9eb8f051d937.png" alt="">
|
||||
|
||||
图中有当前区块高度、本区块的哈希、前一区块哈希、nonce值等等。
|
||||
|
||||
所以前一区块哈希是一个区块头必备的数据域,这种链式结构具备发散传导性,越往历史以前的篡改,越容易导致大面积的影响,这也叫做历史逆向修改困难。
|
||||
|
||||
在PoW共识机制的情况下,这种逆向修改的难度会随着当前全网算力线性增长。
|
||||
|
||||
### 1.2 默克尔树(Merkle tree)
|
||||
|
||||
哈希算法的一个重要应用是默克尔树(Merkle tree),默克尔树是一种数据结构,通常是一个二叉树,也有可能是多叉树,它以特定的方式逐层向上计算,直到顶部,最顶层叫做默克尔根,默克尔树最为常见和最简单的是二叉默克尔树。
|
||||
|
||||
默克尔树的基本结构如下图。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/91/2e/91a74bdc394f2f79a202c49a2f0c722e.png" alt="">
|
||||
(图片来自维基百科)
|
||||
|
||||
比特币和以太坊都使用了默克尔树这种数据结构,只不过里面存放的数据都是哈希。我们在比特币的核心版本源码中可以发现注释中有介绍。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/d1/21/d114ccc1d247e41b18d9af5c3b819321.png" alt="">
|
||||
|
||||
(图片来自比特币Core源码)
|
||||
|
||||
以太坊中针对比特币的设计做了改进,叫做默克尔帕特里夏树(Merkle Patricia tree),相对于比特币在块头中只有一棵树,以太坊有三棵树。
|
||||
|
||||
区块链的挖矿算法也应用了哈希算法,挖矿算法利用的是其难题友好性,我们在PoW共识机制中讲解过,这里不再赘述。
|
||||
|
||||
## 2.非对称加密算法
|
||||
|
||||
非对称加密算法是相对于对称算法而言的,这两者组成了密码学的核心内容。
|
||||
|
||||
这两者的使用区别体现在密钥是否可以公开,对称密钥要求加解密过程均使用相同的密钥,而非对称加密可以提供一对钥匙,私钥自己保管,公钥可以公开。
|
||||
|
||||
常见的对称加密算法有 DES、3DES、AES、IDEA, 常见的非对称加密算法有RSA、ECC等。
|
||||
|
||||
在比特币等众多数字货币的项目中,在账户层面主要使用的是非对称加密算法。
|
||||
|
||||
在对称加密算法里,由于双方需要提前共享密钥,在使用过程中有诸多不便,非对称算法的出现解决了这一难题。
|
||||
|
||||
在非对称算法中,私钥一般是通过一个随机数产生的,这个随机数我们也叫做种子,从这个角度来说,知道了这个随机数也就等于知道了私钥,不过私钥的产生范围非常大,在比特币中是2的256次方,差不多在10的70方数量级上。
|
||||
|
||||
如果你产生随机数的算法足够均匀分布,私钥碰撞的可能性比中了1亿大奖同时被雷劈中的概率还要小数亿倍。所以区块链对产生随机数的算法要求比较高,它要求真实的均匀随机分布,而不是计算机伪随机数。
|
||||
|
||||
如果我们有了私钥,接下来就如图所示:
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/c7/f9/c701e41eb73354a7ee241e9869b041f9.png" alt="">
|
||||
|
||||
我们从私钥到公钥,是由非对称加密算法保证的,这种算法在比特币中选择的是ECDSA算法,ECDSA算法中选择的椭圆曲线名为secp256k1。
|
||||
|
||||
而从公钥到地址,是由哈希算法保证的,在这一步使用了SHA256和RIPEMD160。椭圆曲线加密算法ECC利用了“寻找离散对数”的难解性提供了单向不可逆性,具体原理你可以找资料了解一下。
|
||||
|
||||
在区块链上,一个比特币交易的产生由两部分组成,第一部分是签名加锁,对应到的是交易的输出、第二部分是解锁花费,对应到的是交易的输入,当我们构造一笔交易的时候必然会用到私钥,这是所有数字货币资产控制权由私钥保证的根本原因。具体逻辑我们留到下篇讲解UTXO的时候讨论。
|
||||
|
||||
最后来谈谈量子威胁的内容。我在讨论比特币等众多数字货币项目的时候,很多人会问我如何看待量子计算的威胁问题,大家认为量子计算的强大计算力威胁到了哈希的抗碰撞性。其实这不是一个设计缺陷,而是一个发展问题,是可以在区块链的发展过程中解决的。
|
||||
|
||||
我对于量子计算的威胁论有以下的看法。
|
||||
|
||||
1. 即使出现了量子计算攻破非对称加密算法的问题,那么首先要看是什么算法,例如是RSA,还是ECC。
|
||||
1. 其次要看攻击成本是否足够低,因为理论上的可行性并不代表工程可行性,这是两码事。例如持续攻击比特币要花费1亿美金,持续攻击时间超过20年才能生效,那么这笔买卖很明显不划算。
|
||||
1. 量子计算威胁的对象不止加密货币,而是整个密码学体系,如果发生破解事件,很可能是银行、互联网后端系统,目前整个互联网应用都基于HTTPS,如果HTTPS被破解,在量子计算面前传统的账号密码几乎不可用。
|
||||
1. 量子计算目前发展虽然看起来喜人,但是离实际应用还很远,很多计算其实并非是通用计算,而是专用计算,也就是说一个量子计算机写入的算法只能解决一个特定问题,而且还是概率解,可用性易用性还需要较长时间转化。
|
||||
|
||||
## 总结
|
||||
|
||||
今天我向你介绍了哈希算法,讲解了区块链哪些地方使用了哈希算法,并介绍了非对称加密算法,最后还谈了一下我对量子计算威胁论的看法。
|
||||
|
||||
密码学是所有区块链的基础,可以说如果没有密码学的支撑,区块链将会退化成普通的分布式日志系统。
|
||||
|
||||
那么亲爱的读者,比特币地址有哪些类型呢?以太坊的地址又是如何生成的呢?你可以给我留言,我们一起讨论。感谢你的收听,我们下次再见。
|
||||
|
||||
参考阅读:
|
||||
|
||||
1. 《区块链技术指南》
|
||||
1. 《精通比特币》
|
||||
1. [https://yeasy.gitbooks.io/blockchain_guide/content/crypto/](https://yeasy.gitbooks.io/blockchain_guide/content/crypto/)
|
||||
|
||||
|
||||
@@ -0,0 +1,190 @@
|
||||
<audio id="audio" title="第16讲 | 深入区块链技术(八): UTXO与普通账户模型" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/b0/03/b02223494b43f21cc7b6dc6c8b027003.mp3"></audio>
|
||||
|
||||
我们在第2讲“区块链到底是怎么运行”一文中,提到了村长给张三转账的例子,那里村长的例子就是UTXO模型的一个简化版本。
|
||||
|
||||
评论区里有不少留言在问:“为什么不直接记余额呢?”看来很多人都对这个问题很感兴趣,今天我们就来聊一聊这个话题。
|
||||
|
||||
区块链网络中有两种记账模式,除了UTXO模型还有 Account Based 结构,也就是普通账户模型,也叫账户余额模型,前者在比特币系的数字货币中被广泛使用,后者更多是用在智能合约型的区块链上。
|
||||
|
||||
## 普通账户模型
|
||||
|
||||
我们先从传统的账户模型出发来聊聊是如何记账的,假设我们现在有一个支付系统,在这个支付系统中有村长和张三两个账户,村长账户里有100万,现在要转账给张三10万,这其中涉及的操作是这样的:
|
||||
|
||||
1. 检查村长的账户余额是否大于10万;
|
||||
1. 把村长的账户扣除10万变成90万,然后发送一笔转账消息给张三的账户;
|
||||
1. 张三的账户接受到转账消息,将张三的账户余额加10万。
|
||||
|
||||
我们可以发现,无论是村长还是张三,都具有一个余额作为状态,即当前余额是记录在某个地方的,只需要读出来即可,这种设计我们叫做账户余额模型。
|
||||
|
||||
如果以上三个步骤是在一个中心化系统中,甚至在同一个数据库中,那将非常简单,会直接退化成一个事务,我们见到的银行账户、信用卡系统、证券交易系统、各种电商类应用,理财类应用基本都是一个中心化系统中的,最多也就是跨表跨数据库。
|
||||
|
||||
想必这类场景下的设计,各位工程师对此应该是了如指掌的。
|
||||
|
||||
如果以上的步骤中,村长和张三的账户分属两个不同的系统,例如从A银行到B银行,就需要经过人民银行支付系统,即可信任的中心化第三方来做中介。
|
||||
|
||||
你可能发现了,在跨行转账的这种情况下,是没有办法做事务的,所以1和3是不同步的,如果3操作失败,还需要从2倒退到1的状态,这个情况叫做冲正交易。
|
||||
|
||||
普通账户模型具有自定义数据类型的优点,但是却需要自己设计事务机制,就是上述所说的冲正交易。而接下来所讲的UTXO模型则恰恰相反。
|
||||
|
||||
## UTXO模型
|
||||
|
||||
UTXO全称是:“Unspent Transaction Output”,这指的是:未花费的交易输出。这里面三个单词分别表示 “未花费的”“交易”“输出”,接下来我来详细讲解一下UTXO的含义。
|
||||
|
||||
UTXO的核心设计思路是无状态,它记录的是交易事件,而不记录最终状态,也就是说只记录变更事件,用户需要根据历史记录自行计算余额。
|
||||
|
||||
有点像MySQL中的Binlog,主从模式的情况下,按照Binlog来更新数据,Redis的AOF模式备份模式也是如此,UTXO也是类似的思路。
|
||||
|
||||
下面我们按照按照普通账户中的例子来重新讲解一遍。
|
||||
|
||||
如果要记录交易本身,那么我们可以构造一笔交易,这笔交易中村长转账10万给张三的同时,90万转给自己。
|
||||
|
||||
如下所示:
|
||||
|
||||
村长 100万 --> 张三 10万<br />
|
||||
<br> --> 村长 90万
|
||||
|
||||
这里其实有三条子记录,左边一条,右边两条,左边叫做输入,右边叫做输出。
|
||||
|
||||
输入和输出组成了交易,输入和输入需要满足一些约束条件:
|
||||
|
||||
1. 任意一个交易必须至少一个输入、一个输出;
|
||||
1. 输入必须全部移动,不能只使用部分,所以才产生了第二个输出指向村长自己;
|
||||
1. 输入金额 = 输出金额之和 + 交易手续费,这里必须是等式。
|
||||
|
||||
对于村长来说,首先构造交易的输入输出,满足上述条件,然后广播到全网,接收方自行判断交易是否属于自己。这里满足约束条件构成的交易模型,也就是村长记录的三条转账事件就是UTXO模型。
|
||||
|
||||
## 账户余额模型与UTXO的比较
|
||||
|
||||
我们可以归纳出UTXO与普通账户模型的一些区别。
|
||||
|
||||
<li>
|
||||
存储空间,UTXO占用空间比账户模型高,因为账户模型只记录最终状态。
|
||||
</li>
|
||||
<li>
|
||||
易用性,UTXO比较难处理,账户模型简单容易理解。例如UTXO在使用上,还需要配合高效的UTXO组装算法,这个算法要求尽可能降低输入输出的个数,还要让“零钱“归整,算法的复杂度相比账户余额无疑要高。
|
||||
</li>
|
||||
<li>
|
||||
安全性,UTXO比账户模型要高,UTXO本身具备ACID的记账机制,而账户模型需要自行处理,例如重放攻击。
|
||||
</li>
|
||||
|
||||
普通账户模型具有较高的自由度,可以让智能合约有更好的发挥空间,并且它避免了UTXO的复杂组装逻辑,精度控制上也更为得心应手。
|
||||
|
||||
UTXO似乎天然是为数字货币设计的,具有较高频次跨账户转移场景都使用UTXO会比较好,考虑到智能合约的普适性,UTXO与智能合约并不能很好地兼容,但是这也对开发者的自身水平提出了更高的要求。
|
||||
|
||||
## 区块链中的UTXO模型
|
||||
|
||||
我们借用比特币开发者文档中UTXO模型的图示,来看看UTXO实际的构造形式。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/76/1a/76b8045f3b23c2397b31b263f9e3521a.png" alt="" />
|
||||
|
||||
上图中,所有的交易都可以找到前向交易,例如TX5的前向交易是TX2,TX2中的Output1作为TX5中的Input0。
|
||||
|
||||
意思就是TX2中的付款人使用了Output1中指向的比特币转移给 TX5 中的收款人,接着TX5中的人又把收到的比特币转移给了TX6中的收款人,成为了TX6中 Output0。
|
||||
|
||||
我们也可以发现,TX6中的收款人还没有产生TX7交易,也就是说Output0还没有被花费,这时候我们终于得到了UTXO的真正语义:Unspent Transaction Output,未花费的交易输出。
|
||||
|
||||
我们这时候可以发现UTXO也同样能表示余额,不过是重演计算的方式,它用不同的方式表达了余额,我们把一个地址上所有的UTXO全部找出来,就是这个地址总的余额了。
|
||||
|
||||
我们还可以发现,无论是TX5还是TX2,都已经成为历史交易,它们都忠实客观地记录了两笔交易,这两笔交易代表的是事件,而不是余额状态转移,这是我们看到的最直观的区别。
|
||||
|
||||
我们再来看看一个真实的交易例子。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/e3/f3/e33ad9fe34f60d9254f9616565800cf3.png" alt="" />
|
||||
|
||||
这是区块链上一笔真实交易的例子,它记录了一笔450ETP的转账记录。
|
||||
|
||||
左边是输入,右边是两笔输出,其中第二个输出是给自己的账户,这和我们村长转账给张三的例子是一样的。
|
||||
|
||||
下图是交易解码为JSON格式的样子,可以看到Previous_output是放到Inputs数组里的,意思就是前向输出作为本次的输入。
|
||||
|
||||
```
|
||||
{
|
||||
"hash" : "89e80e14db07c4904a57e2c1efb689bccbbf43942103c1a92166d5c0f27ea3d2",
|
||||
"height" : 1093399,
|
||||
"inputs" :
|
||||
[
|
||||
{
|
||||
"address" : "MLWtmjwCtmK44FMwJMSfAkHaEvnnb2N6HX",
|
||||
"previous_output" :
|
||||
{
|
||||
"hash" : "770a72f35d3e3a78bd468949bad649f03b241cf7e2a84cc2d6fdabacdcc47f06",
|
||||
"index" : 0
|
||||
},
|
||||
"script" : "[ 304402202b21d7a79276985dc99777b70fd5095796dad58f35e29a019d2cb6cca5df481802205ffab088a6047f5b6382ba02a0eed4e78ab7950fe264d3774e8b0b357a7593d101 ] [ 03ea3462dc01e7b5569e89737211887035f8f1e99e1fe4332181d83daccaa6d917 ]",
|
||||
"sequence" : 4294967295
|
||||
}
|
||||
],
|
||||
"lock_time" : "0",
|
||||
"outputs" :
|
||||
[
|
||||
{
|
||||
"address" : "MGz9yjLLn4AqyraRjSpiP2GmTWKnT3yfiL",
|
||||
"attachment" :
|
||||
{
|
||||
"type" : "etp"
|
||||
},
|
||||
"index" : 0,
|
||||
"locked_height_range" : 0,
|
||||
"script" : "dup hash160 [ 63ab0013d183f2592e4b46a358df01e88a09c0b8 ] equalverify checksig",
|
||||
"value" : 45000000000
|
||||
},
|
||||
{
|
||||
"address" : "MLWtmjwCtmK44FMwJMSfAkHaEvnnb2N6HX",
|
||||
"attachment" :
|
||||
{
|
||||
"type" : "etp"
|
||||
},
|
||||
"index" : 1,
|
||||
"locked_height_range" : 0,
|
||||
"script" : "dup hash160 [ 8a63941b392771c40f1c15e4374808f6bb464cba ] equalverify checksig",
|
||||
"value" : 118082150283
|
||||
}
|
||||
],
|
||||
"version" : "2"
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
我们再看看比特币上的例子:
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/75/02/754ac55278597b78be616aea2a561d02.png" alt="" />
|
||||
|
||||
这一笔比特币交易包含6个输入,几十个输出,交易一共3.5kb,交易的输入输出会影响交易大小,比特币的交易费是根据字节收费的,交易尺寸越大越贵,而交易尺寸主要和输入输出的个数有关,也就是说,算法上并不规定输入输出的个数,而只有区块尺寸限制。
|
||||
|
||||
在比特币中将小于100kb的交易称为标准交易,超过100kb的称为非标准交易。它的前向input以及生成一个out约占用161~250 bytes 。所以在比特币中,大约的inputs/ouputs的最大数目限制为 100KB/161B ~= 600个。
|
||||
|
||||
## UTXO的特性及缺点
|
||||
|
||||
从计算的角度来说,UTXO具有非常好的并行支付能力,也就是我们上文中所说的如果没有尺寸限制,一笔交易可以包含任意笔输入输出,同时也没有次序要求,在一笔交易中哪一个UTXO在前,哪个在后面不影响最终结果。
|
||||
|
||||
从存储的角度来说,UTXO具有较好的可裁剪特性,可裁剪性指的是UTXO类型的交易,如果从最老的那一笔UTXO开始截断数据库,那么之前的数据可以删除掉了。
|
||||
|
||||
如果想进一步压缩数据尺寸,可以在任意位置截断,记录UTXO对应的交易哈希即可,然后从其他节点获取并校验UTXO,这也是SPV轻钱包工作的基础之一。
|
||||
|
||||
以太坊中并没有使用比特币的这种UTXO设计,这与以太坊的宗旨有关,以太坊的目标是构建通用计算,而比特币是数字货币,需求不同导致设计的不同。
|
||||
|
||||
V神指出了UTXO的缺陷,一共有三类。
|
||||
|
||||
### 1.可表达的状态少 。
|
||||
|
||||
UTXO只能是已花费或者未花费状态,这就没有给需要任何其它内部状态的多阶段合约或者脚本留出生存空间,这也意味着UTXO只能用于建立简单的、一次性的合约,UTXO更像是一种二进制控制位。
|
||||
|
||||
### 2.区块链盲点(Blockchain-blindness)。
|
||||
|
||||
UTXO的脚本只能看到自己这条历史轨迹,无法看到区块链的数据的全貌,这导致了功能性扩展受到了限制,我们在花费比特币的过程中需要小心翼翼的组合UTXO,这也导致了系统状态逻辑复杂,不适合设计成智能合约的基础结构。
|
||||
|
||||
### 3.价值盲点(Value-blindness)。
|
||||
|
||||
UTXO脚本不能提供非常精细的金额控制,基于账户模型的余额在花费过程中,可以任意的按值存取,它仅取决于程序能表示的最小精度。
|
||||
|
||||
而UTXO要求必须全部移动,如果要满足一个目标值金额,对组合UTXO算法的要求会比较高,采用许多有不同面值的UTXO,一方面要求尽可能地精确,另一方面又要求输入输出的数量尽可能的小。
|
||||
|
||||
UTXO是比特币上的原生设计,在区块链以前是没有这种逻辑数据结构,UTXO的出现给了人们看待数据转移的不同视角,但UTXO不是所有区块链所必需的,公链开发过程中的是否选用UTXO模型可以根据业务场景进行判断。
|
||||
|
||||
## 总结
|
||||
|
||||
好了,今天我们分别介绍了普通账户模型和UTXO模型,并从不同角度比较了二者的优劣。
|
||||
|
||||
从技术选择上来看,比特币选择UTXO是为了满足支付的安全性,以太坊选择普通账户模型是为了智能合约的自由度。
|
||||
|
||||
最后留给你一个问题,历史上UTXO或账户模型是否引发过比较严重的使用缺陷呢?你可以给我留言,我们一起讨论,感谢你的收听,我们下期再见。
|
||||
123
极客时间专栏/geek/深入浅出区块链/第二章 深入区块链技术/第17讲 | 去中心化与区块链交易性能.md
Normal file
123
极客时间专栏/geek/深入浅出区块链/第二章 深入区块链技术/第17讲 | 去中心化与区块链交易性能.md
Normal file
@@ -0,0 +1,123 @@
|
||||
<audio id="audio" title="第17讲 | 去中心化与区块链交易性能" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/f2/59/f2a85c7041ccca3de2542ac4c33ed359.mp3"></audio>
|
||||
|
||||
通过前面的文章我们了解了一些区块链的基本技术细节,今天这篇文章我将带你一起看看区块链争议的最大内容——去中心化与区块链交易性能。
|
||||
|
||||
比特币和以太坊的TPS一直被技术领域的人所诟病,或许这与工程师“高性能高并发”的情节有关。
|
||||
|
||||
那么说,去中心化与高性能TPS是否真的可以做到鱼和熊掌的兼具呢?区块链业界又采取了哪些方案进行改善呢?围绕这两个主题,我们开始聊聊今天的话题。
|
||||
|
||||
## 再谈去中心化
|
||||
|
||||
说到区块链的最大标签,莫过于“去中心化”,在任何讨论区块链的场合,这个词几乎都会被提起。
|
||||
|
||||
今年3月份,全球顶级数字资产交易平台OKEX的负责人徐明星曾经发文,他表示业界应该避免使用“去中心化”这样的词汇,而改用“点对点”,“点对点”一词后来甚至被直接冠到了比特币白皮书的标题上。
|
||||
|
||||
去中心化与点对点有区别吗?我认为是有的,去中心化是包含了一定政治主观色彩的词汇,点对点只是一个中性词汇,更适合用来描述系统的性质。
|
||||
|
||||
去中心化这种说法树立了一个无形的靶子,这个靶子可大可小,大到政府机关,小到小商小贩。
|
||||
|
||||
正如我们说的是P2P网络,而不是去中心化网络。所以在技术领域使用点对点,而不是去中心化,可以避免这种概念被过度消费,
|
||||
|
||||
说到了“过度消费”,我认为“去中心化”已经演变成了区块链行业对外宣传的消费概念,这是一种情怀消费,它消费了人们对强权者的不满,例如店大欺客的商家、死皮赖脸的中间商、缺乏诚信的供应商。
|
||||
|
||||
这些内容,你或多或少都在生活中经历过,当“去中心化”的口号响起的时候,人们终于找到了一个发泄口,强烈的共鸣放大了区块链的光环,造成了区块链能掀起一场大革新的错觉。
|
||||
|
||||
革新肯定是有的,但去中心化只是表象,如果我们加深层次去理解,就可以发现数字货币和数字资产带来更多的是交易效率的成倍提升。
|
||||
|
||||
人类的现代文明是建立在交易的基础上的,没有交易就意味着直接回到了农耕社会。所以交易效率的提升才是区块链的根本所在,那么说,区块链本来是这样看似低效的TPS,为什么说它提高了交易效率呢?
|
||||
|
||||
我们先回到传统的交易模式来看一看。
|
||||
|
||||
交易首先是基于中心化平台的,当我们进入某个中心化平台,在这个平台内部,交易效率是提升了,但是我们回顾整个交易的生命周期,就会发现这个平台可能只是交易的一环,平台和平台之间的协作似乎并不是那么顺畅。
|
||||
|
||||
跨境支付便是典型的例子,市值长居Top3的区块链项目Ripple就是为了解决跨境支付的难题而产生的。
|
||||
|
||||
我们再来看区块链点对点的交易模式,它的TPS看似低效,但是它提供了全局无缝衔接的资产流转过程,这减少了整个交易生命周期的步骤,这也是区块链提升交易效率的关键所在。
|
||||
|
||||
所以说,虽然中心化系统能提供优秀的高性能服务,但是慢在人工审核、平台之间衔接、内部审计,平台之间的协作业务推进,想必你一定也深有体会。
|
||||
|
||||
## 技术上的去中心化
|
||||
|
||||
我们在聊DPOS共识机制的时候,提到过一个TPS的计算公式,
|
||||
|
||||
<strong>TPS = (block_size * network_bandwidth * witness_performance) /<br />
|
||||
(block_time * witness_count)</strong>
|
||||
|
||||
其中witness_count 记账节点的数目与准入门槛在业界的争议比较大,如果完全去中心化的话,首先就意味着记账节点没有准入门槛,记账的节点可以无限多,当然这只是一个理想环境,工程实施的可行性几乎为零。
|
||||
|
||||
比特币全球的全节点1.2万个,大大小小的挖矿节点只有几十个,常出块的只有5大矿池,但是比特币依然没有限制记账节点的准入门槛,以太坊也是如此。而在EOS中,既规定了记账节点的数目,又规定了门槛。
|
||||
|
||||
可以这么说,控制了记账节点的数量和准入门槛,就等于决定了区块链TPS的大小。
|
||||
|
||||
为了帮助你深层次地理解去中心化与TPS的关系,这时候我们再次回到之前一直提到的CAP定理中。
|
||||
|
||||
CAP定理中,C为最终一致性,决定了出块时间的长短。A是可用性,这个是必选的,必须要保证区块链7 X 24 X 365全部可用。
|
||||
|
||||
P是网络分区容忍性,P的含义在区块链上有两层,第一层是必须保证分区可容忍,也就是一旦出现因为网络分区而导致区块链分叉,必须有一种机制可以合并区块链;第二层含义是如果我们尽量避免出现网络分区,那么就可以避免P的出现,从而提升C的性能。
|
||||
|
||||
C和P是可以相互调整的,有两种情况。
|
||||
|
||||
- 情况1,如果我们选择调整C,也就是拉长了最终一致性的确认时间,那么对P的要求就会减弱,也就是网络产生分区不要紧,反正区块链有足够的时间恢复最终一致性。
|
||||
- 情况2,如果我们选择调整P,也就是限制较少的记账节点的数量,并且对记账节点之间的带宽提出要求,降低出现网络分区的可能性,那么对C的要求就会减弱,就可以降低出块时间。
|
||||
|
||||
情况1就是比特币和以太坊的典型思路,情况2就是EOS的典型思路。
|
||||
|
||||
区块链属于分布式系统,通过简单分析我们可以知道,区块链交易TPS与去中心化的具有不可调和性,任何一个号称TPS过万的区块链项目肯定是极其中心化的(至少技术上是的)。
|
||||
|
||||
所以,那些试图兼具高性能与去中心化的工作大多都是徒劳的。
|
||||
|
||||
## 各个区块链的TPS指标
|
||||
|
||||
我们接下来看看一些区块链项目的TPS指标。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/d8/a6/d8e96d2e77a564dcbb10a309baac2aa6.png" alt="" />
|
||||
|
||||
图中是TPS都在千笔以上的区块链项目,通过控制了记账节点的数量,牺牲了去中心化特性提升了TPS,比如石墨烯系列的DPOS,Ripple的共识。
|
||||
|
||||
如果我们把CAP做一个可视化处理,就构建出来一个三角形分布,我们可以得到下图:
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/d6/db/d65dca930a46701096e64afdce89ebdb.png" alt="" />
|
||||
|
||||
从图中我们可以看出,PoW、PoS型公链偏好AP特性,于是TPS有限。联盟链以及DPoS型共识偏好比较均匀,可以达到可观的TPS。
|
||||
|
||||
传统数据中心往往不考虑P在第二层语义上的问题,更不考虑拜占庭容错问题,所以他们拥有更好的TPS,但是在网络分区和出现拜占庭错误的时候,表现得不尽如人意。
|
||||
|
||||
这些共识机制在不同场景中可以有不同的选择,不存在适用所有场景的的共识机制。
|
||||
|
||||
## 业界的可选方案之一:Sharding 分片
|
||||
|
||||
好了,我们在上文讨论了CAP定理对区块链的影响,那么业界也还是使出了浑身解数来尽可能地提升TPS。
|
||||
|
||||
目前一共有两种正在讨论的方案,分别是Sharding分片技术和闪电网络。闪电网络旨在解决比特币微小额支付的实时性问题,其中的算法是比特币TPS扩展的一种方案,这部分的详细内容我们留到比特币专题再进行讲解。
|
||||
|
||||
这两种方案不涉及修改共识机制。如果我们修改为DPoS共识机制、DAG共识算法,也可以提升TPS,不过不在本篇的讨论范围。DAG共识机制我们在后续文章进行深入讨论。
|
||||
|
||||
分片技术是一种安装传统数据库分片的扩展,主要思路是将数据库分成多个分区(碎片)并将分区放置在不同的服务器上。
|
||||
|
||||
在区块链场景下,全网的节点相当于于分布式数据库中的不同服务器,这时候我们可以将交易分成不同的部分,然后每个记账节点只需要验证交易的一部分即可,而不必验证完整的交易性。
|
||||
|
||||
这带来的好处是就是并行化处理,记账节点之间相当于是协作关系,而不再是单纯的独立关系。
|
||||
|
||||
随着网络的增长,这种协作关系也可以随之扩展,这种扩展也叫做水平扩容。
|
||||
|
||||
分片技术有以下优势:首先是TPS可以从十几笔提升至少两个数量级,也就是千笔每秒,这不但对应用友好,也提升了用户体验;其次TPS的提升可以带来更多应用,这些应用在共识的激励下可以水平扩展区块链的性能,形成一种良性循环。
|
||||
|
||||
下面我介绍一下分片的两种方案:状态分片、网络分片。
|
||||
|
||||
第一种方案是是网络分片,网络分片是我们按照网络进行分区,区域内的交易归集在一起并在区域内进行验证,这样区域内的用户可以享受低延迟高吞吐的TPS,但是会带来跨区域分片的复杂性。我们也可以将网络分片比喻成数据库集群分区。
|
||||
|
||||
其次是状态分片,状态分片是在以太坊上提出的方案,状态分片目前没有确切的技术方案,尚在研究讨论阶段。
|
||||
|
||||
我们可以简单类比数据库的分表。我们将同一张表的数据塞到不同的节点,这些节点分布在全世界各地并且没有可信的网络环境。所以状态分片是非常复杂的技术,实践的最终结果我们需要看以太坊后续的动作。
|
||||
|
||||
## 总结
|
||||
|
||||
好了,今天我们再次讨论了去中心与高性能区块链的问题,因为有了前面文章的储备,这次我们更深入地讨论了去中心化的深层次逻辑,并从技术理论上重新剖析了去中心化的涵义。
|
||||
|
||||
接着我们还比较了各个区块链的性能指标,最后我们提到了一个提升TPS的备选方案。希望读完本篇可以让你对区块链去中心化和性能有更深层次的认识。
|
||||
|
||||
本期的问题是,还存在哪些提升TPS的方案呢?各有什么样的优劣?你可以给我留言,我们一起讨论。
|
||||
|
||||
感谢你的收听,我们下期再见。
|
||||
|
||||
|
||||
141
极客时间专栏/geek/深入浅出区块链/第二章 深入区块链技术/第18讲 | 智能合约与以太坊.md
Normal file
141
极客时间专栏/geek/深入浅出区块链/第二章 深入区块链技术/第18讲 | 智能合约与以太坊.md
Normal file
@@ -0,0 +1,141 @@
|
||||
<audio id="audio" title="第18讲 | 智能合约与以太坊" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/0a/b8/0a21739375aab265c6feafb91ceb7fb8.mp3"></audio>
|
||||
|
||||
在前面的文章里,我们介绍了区块链的核心技术,也穿插介绍了一些项目。然而每个区块链都有自己的特色,接下来我们将针对每个项目进行详细讲解。今天我们就来讲讲智能合约和以太坊项目。
|
||||
|
||||
今天我们从智能合约这个概念入手,聊聊什么是以太坊项目以及它的发展历史。最后还会介绍几款钱包给你,希望通过今天文章的讲解,你也可以尝试在以太坊上编写简单的智能合约。
|
||||
|
||||
## 智能合约的概念
|
||||
|
||||
不同于法律意义上的合约概念,区块链领域的合约表达的是可以“自治自理”的 计算机协议,这套协议具有自我执行、自我验证的属性。
|
||||
|
||||
如果完全从技术角度来看,智能合约等价于一段事先就被规定好逻辑和条款的计算机代码被激活运行的状态,同时,智能合约也提供了通用的用户接口,用户可以通过接口与用户交互。
|
||||
|
||||
智能合约这一概念早在20世纪90年代就有人提出,这个人是从事智能合约和数字货币研究的尼克萨博(Nick Szabo)博士,尼克1996年在《Extopy》期刊上发表了对智能合约的描述,他认为智能合约是一个由数字表单指定的承诺,这个承诺包含关系到多方执行的一组协议。
|
||||
|
||||
从定义中我们可以得知,智能合约由多个协议组成,这些协议包含了用户接口,能表达用户的承诺,它可以安全有效地确定公共网络上的关系。
|
||||
|
||||
换句话说,智能合约是一个由计算机处理、可执行合约条款的交易协议,其总体目标是满足协议既定的条件,例如支付、抵押、保密协议。这可以降低合约欺诈造成的损失,降低仲裁和强制执行所产生的成本以及其他的交易成本。
|
||||
|
||||
我们举个实际的例子解释一下,今年4月9日,上海某建设银行支行开放了“无人银行”,银行中充斥了众多机器和显示屏,智慧柜员机、VTM机、外汇兑换机、VR设备和两台机器人代替了传统的柜台。
|
||||
|
||||
这里的智慧柜员机、外汇兑换机器人众多电子设备都可以认为是智能合约的一种表现形式,用户在办理银行业务时,如办理大额汇兑业务,业务流程和逻辑依据已经定在程序中,用户只需要按照操作一步一步进行,办理完成后即可获得单据。
|
||||
|
||||
这里“既定的业务流程、机器人模样的人机交互界面、双方同意承诺”组成了智能合约的概念,它甚至具有一定的法律效力。
|
||||
|
||||
萨博提出的是智能合约的概念,以及我们举的例子,都是广义的智能合约概念。智能合约具有多种实践形式,而在区块领域所说的智能合约概念,我们其实是指Blockchain-based这种形式。
|
||||
|
||||
在萨博的智能合约概念中提到了开放式网络,而我们知道开放式网络的基本要求就是拜占庭容错,通过前面文章的讲解我们知道,区块链天然具有拜占庭容错特性。所以如果在区块链上实践智能合约这个概念,两者会非常契合,天造地设。
|
||||
|
||||
首先实践了智能合约这一概念的是比特币,比特币脚本(bitcoin script)包含了5种标准交易脚本,这些脚本的功能不仅仅提供了普通单人支付的情况,它还提供了多方共同签名支付的脚本,叫做多重签名支付,多重签名支付可以看成是萨博语义下的智能合约。
|
||||
|
||||
除了比特币,发扬光大智能合约这个概念的区块链项目就是以太坊了,下面,我重点来介绍一下以太坊项目。
|
||||
|
||||
## 以太坊及其发展历史
|
||||
|
||||
以太坊Ethereum项目的目标是打造一个去中心化的新一代互联网应用平台,这个平台称作Dapp平台。
|
||||
|
||||
这些Dapp基于以太坊智能合约虚拟机开发、编译、部署,并且可以自定义业务逻辑,部署后全网可见且自动执行,理想情况下不存在宕机、审查、欺诈、第三方干预的情况。
|
||||
|
||||
<li>2013年底以太坊的创始人Vitalik在比特币开发者社区提出了可以运行图灵完备(Turing-complete)形式的应用,但这一思想并没有得到比特币社区的支持。
|
||||
</li>
|
||||
<li>2014年,Vitalik带着自己的想法,宣布以太坊项目正式成立,2014年上半年开始筹集资金,聚拢一些早期开发者,同年7月份进行了为期42天的ICO,共筹集了超过1800万美元的比特币。
|
||||
</li>
|
||||
<li>2015年7月,第一个版本的以太坊发布,主网正式上线,这一阶段Bug和设计缺陷较多,多是开发者在使用。
|
||||
</li>
|
||||
<li>2016年以太坊发布第二个大版本Homestead,用户逐渐多了起来,同期也吸纳了不少Dapp开发者。
|
||||
</li>
|
||||
<li>2016年6月,以太坊上发生了著名的黑天鹅事件——TheDAO事件,这打开了ICO市场,同时也造成了以太坊社区分叉,形成了以太坊和以太坊经典两个代币。
|
||||
</li>
|
||||
<li>2017年4月,ICO风靡中国,ERC20提供了低成本方便高效的资金募集方式,为ICO提供了极大的便利,趁着数字货币牛市,以太坊的价格涨幅达十多倍,2018年1月以太坊价格突破1000美元。
|
||||
</li>
|
||||
|
||||
## 以太坊的核心概念
|
||||
|
||||
以太坊核心概念包括:智能合约虚拟机EVM和Solidity编程语言、账户模型、以太币和Gas,交易和消息。
|
||||
|
||||
### 1.智能合约虚拟机EVM和Solidity编程语言
|
||||
|
||||
以太坊的核心概念首先是智能合约。
|
||||
|
||||
智能合约包含两部分,一部分是开发语言,主要以Solidity为主,Solidity与Javascript语言在使用上十分接近,这极大地降低了Dapp开发人员的学习成本。
|
||||
|
||||
Dapp开发者编写好代码以后,使用Solidity编译成十六进制字节码,然后部署到EVM上,也就是把合约广播到全网,等矿工打包后就形成了常年运行的Dapp了。
|
||||
|
||||
另一部分就是EVM。 EVM是以太坊智能合约虚拟机,我们可以等价理解它为Javascript、Python等脚本语言的执行引擎。
|
||||
|
||||
它是一个轻量级的虚拟机隔离环境,它并不提供访问本地网络、进程、文件系统的功能,它更像是一个封闭的容器,这个容器里面装了一个正在运行Dapp,可以看成是无法和外界交互的Docker Container。
|
||||
|
||||
Dapp在运行过程中,可以被请求或其他事件触发,然后执行相应的逻辑,这些请求和事件是由以太坊上的交易产生的,不是来自本地操作系统的事件。
|
||||
|
||||
Dapp运行过程中,每次状态发生变化,则意味着全网同步更新,大家的计算结果都是一致的,这有两个特性:
|
||||
|
||||
1. 所有Dapp的计算结果经过全网共识,一旦确认过几乎无法被伪造和篡改;
|
||||
1. 由于必须经过全网共识,所以这限制了整个网络的容量。
|
||||
|
||||
### 2.账户模型
|
||||
|
||||
以太坊并没有采用UTXO模型,也不同于银行账户,它是由以太坊开发者设计了自己的账户模型。
|
||||
|
||||
以太坊上的账户有两种类型,第一类叫做合约账户CA(Contracts Accounts),第二类叫做外部账户EOA(Externally Owned Accounts)。
|
||||
|
||||
简单理解就是:CA是智能合约代码用的账户,EOA是人用的账户;所以CA可以存储并执行智能合约代码,它的智能被EOA激活,它也不保存和存储私钥,合约账户可以调用其他合约。
|
||||
|
||||
EOA则是人们直接控制的账户,可以存储以太币,可以发送交易到合约账户,触发既定的逻辑。EOA账户由公钥标识,由对应的私钥控制。
|
||||
|
||||
当合约账户被调用时,存储其中的智能合约可以在矿工处的虚拟机中自动执行,并消耗Gas,如果Gas不足则会触发“Out of Gas”异常,被终止执行。
|
||||
|
||||
无论是CA还是EOA,在以太坊内部都被看做状态对象(state objects),意思就是说这些账户都有自己的状态,EOA具有以太币余额的状态,而CA除了余额,还多了合约存储状态。
|
||||
|
||||
### 3.以太币和Gas
|
||||
|
||||
Gas是执行智能合约操作的燃料,智能合约的每一个步骤都会消耗Gas,Gas是由以太坊的平台代币以太币转化而来,最小单位是wei,1ETH 相当于 10的18次方 wei。
|
||||
|
||||
以太币可以通过PoW挖矿而产生,目前以太坊主要通过GPU挖矿。挖出一个块可以换得5个以太币,并且还有一定的交易费、以及叔伯块的奖励。今年4月6日爆出著名矿机芯片厂商比特大陆已经开发出针对以太坊的ASIC专业矿机,相比GPU的效率提升2.5倍。
|
||||
|
||||
### 4.交易和消息
|
||||
|
||||
以太坊上的交易与比特币中的UTXO交易不同,它是指EOA账户将一个经过签名的数据包发送到另外一个账户的过程,这个过程产生的账户状态变化将被存储到以太坊区块链上。
|
||||
|
||||
以太坊上除了交易还有消息这个概念,消息指一个合约账户调用其他合约账户的过程,可以类比函数调用过程。
|
||||
|
||||
所以以太坊上的Dapp如果被触发,有两种可能,第一种是交易触发,第二种是消息触发。
|
||||
|
||||
这两种的区别在于前者是EOA发起的,后者只能是其他合约账户发起的。
|
||||
|
||||
状态对象的状态变化被以太坊共识机制的记录下来,交易和消息驱动着状态的变化,于是,在一个开放式的网络中构建一个全球共享的Dapp变得十分方便。
|
||||
|
||||
以太坊上智能合约具有全网准实时同步、准确执行、去中心化运行、较低的人为干预风险等特性,EVM和Solidity为全球开发者提供了较低的进入门槛。
|
||||
|
||||
## 与比特币的主要区别
|
||||
|
||||
以太坊项目又被称作区块链2.0项目,这里2.0就是指智能合约。那么以太坊与比特币相比,到底智能在那里呢?我们具体来看看。
|
||||
|
||||
与比特币相比,以太坊首先不是一个单纯的数字货币项目,它可以提供全世界无差别的区块链智能合约应用平台,这个平台基于我们前面文章所介绍的区块链四大核心技术要素,即P2P网络、共识机制、账户模型、加密模块。
|
||||
|
||||
除了以上的四个技术要素,以太坊还推出了EVM——以太坊智能合约虚拟机,并且,它还推出了自己的智能合约语言Solidity。
|
||||
|
||||
于是,区块链的开发者因为智能合约的出现开始分为两类。第一类是公链底层开发者,主要是以C++和Go语言为主的全节点开发者,他们需要对区块链各个技术模块有很深的理解。
|
||||
|
||||
第二类是智能合约开发者,也就是应用开发者,这类开发者对区块链的运行原理不需要理解很深,只需要会编写Solidity,了解规范即可。
|
||||
|
||||
除了以太坊智能合约这个概念以外,它还设计了下面的内容。
|
||||
|
||||
1. 研究并实现了自己的PoW挖矿算法——ETHASH,这是一个内存困难型的挖矿算法。
|
||||
<li>叔伯块激励机制,降低了挖矿中心化的趋势。
|
||||
取消了UTXO模型,采用了账户模型和世界状态,提供了数据结构的可塑性。</li>
|
||||
<li>设计了Gas机制,避免程序死循环消耗全网资源的情况出现。
|
||||
研究并实现了自己的PoS共识算法——Casper,可防止Nothing-at-Stake攻击。</li>
|
||||
1. 以太坊提供了在区块链自由编程的能力,智能合约让所有人得以开发属于自己的Dapp,这是与比特币作为单纯的数字货币所不具有的能力。
|
||||
|
||||
## 总结
|
||||
|
||||
本篇我们介绍了智能合约的概念以及以太坊项目,并且讲解了与比特币的主要区别,以太坊上的一些核心概念,下一篇我们将结合实际案例讲解智能合约,带领你认识一些智能合约模板,并顺便介绍一下其他区块链智能合约平台。
|
||||
|
||||
亲爱的读者,快来构想一下属于自己的智能合约Dapp吧。你可以给我留言,我们一起讨论。
|
||||
|
||||
参考链接:
|
||||
|
||||
[https://en.wikipedia.org/wiki/Smart_contract](https://en.wikipedia.org/wiki/Smart_contract)
|
||||
[http://tech.ifeng.com/a/20180413/44947993_0.shtml](http://tech.ifeng.com/a/20180413/44947993_0.shtml)
|
||||
|
||||
|
||||
276
极客时间专栏/geek/深入浅出区块链/第二章 深入区块链技术/第19讲 | 上手搭建一条自己的智能合约.md
Normal file
276
极客时间专栏/geek/深入浅出区块链/第二章 深入区块链技术/第19讲 | 上手搭建一条自己的智能合约.md
Normal file
@@ -0,0 +1,276 @@
|
||||
<audio id="audio" title="第19讲 | 上手搭建一条自己的智能合约" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/a6/c2/a643b9d098e33bd4eecabc4cc2a07dc2.mp3"></audio>
|
||||
|
||||
上一篇我们聊到了区块链智能合约,我主要介绍了智能合约的概念,但是并没有给你提供智能合约的实际运行案例,那么今天,我们就自己动手写一个智能合约,并且介绍一下智能合约标准模板,供你参考学习, 并搭建起自己的智能合约。
|
||||
|
||||
本篇将以以太坊作为基础知识进行讲解,本篇面向没有任何智能合约基础的人群,所以配备了较多的插图和操作命令,如果你正在收听音频,可以点击文稿查看,希望读完这篇文章可以帮助你快速入门智能合约。
|
||||
|
||||
## 搭建一条智能合约
|
||||
|
||||
在实际操作智能合约之前,我们首先回顾一下以太坊,以太坊又称以太坊钱包。以太坊钱包提供了包括账户管理,以太坊转账、Dapp部署与使用在内的一些常规功能。
|
||||
|
||||
以太坊社区提供了多种语言实现的客户端和开发库,多数客户端支持JSON-RPC2.0标准,目前支持的客户版本有Go-ethereum(Go语言)、Parity(Rust语言)、Cpp-ethereum(C++语言)、Ethereum-lib(Javascript)、EthererumJ(Java语言)、Pyethapp(Python语言),基本涵盖了主流编程语言。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/36/d6/36bcf515221b62694653e8b7aa6019d6.png" alt="">
|
||||
|
||||
图片来自以太坊官方文档
|
||||
|
||||
官方推荐使用的版本是Go-ethererum,这是Go语言实现的版本,又称Geth客户端。
|
||||
|
||||
需要提醒你的是,这里客户端的实现语言并不是要求用户熟悉相应的编程语言,这里的用户是指Dapp开发者,比如在操作Geth客户端的时候,用户其实并不需要了解Go语言。
|
||||
|
||||
### 1.下载与安装Geth
|
||||
|
||||
本文使用Geth来进行测试,首先我们要获取Geth客户端,如果用户使用的是Ubuntu环境的话,可以直接从PPA安装。
|
||||
|
||||
```
|
||||
# apt-get install software-properties-common
|
||||
# add-apt-repository -y ppa:ethereum/ethereum
|
||||
# apt-get update
|
||||
# apt-get install ethereum
|
||||
|
||||
```
|
||||
|
||||
安装成功后,我们可以查看Geth的版本。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/0b/5d/0bc6084a9514588107557646ea7a945d.png" alt="">
|
||||
|
||||
表示我们已经安装成功,当然你可以也可以编译安装,由于篇幅有限,你可以另寻资料进行尝试。
|
||||
|
||||
### 2.搭建以太坊私链
|
||||
|
||||
如果在以太坊的主网上运行和开发测试智能合约,这是不明智的,因为会消耗真实的以太币,不过我们可以使用Geth搭建一条属于自己的以太坊区块链,也就是以太坊私链。
|
||||
|
||||
怎么搭建呢?其实很简单,只需要修改配置文件和一些运行参数即可。
|
||||
|
||||
```
|
||||
{
|
||||
"config": {
|
||||
"chainId": 98,
|
||||
"homesteadBlock": 0,
|
||||
"eip155Block": 0,
|
||||
"eip158Block": 0
|
||||
},
|
||||
"difficulty": "200000000",
|
||||
"gasLimit": "2100000",
|
||||
"alloc": {
|
||||
"7df9a875a174b3bc565e6424a0050ebc1b2d1d82": { "balance": "300000" },
|
||||
"f41c74c9ae680c1aa78f42e5647a62f353b7bdde": { "balance": "400000" }
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
然后执行:
|
||||
|
||||
```
|
||||
$ geth --datadir /root/geth-test/ init genesis.json
|
||||
|
||||
```
|
||||
|
||||
这样,我们就初始化了属于自己的创世区块信息。
|
||||
|
||||
接下来我们创建一个账户,由于是用户私链挖矿,只有你一个人挖矿,所以使用CPU挖矿完全没有问题。
|
||||
|
||||
我们通过如下命令进入Geth命令行交互页面:
|
||||
|
||||
```
|
||||
$ geth --datadir /root/geth-test/ --networkid 98 console
|
||||
|
||||
```
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/8c/f4/8caf635275f803120000425ad2add6f4.png" alt="">
|
||||
|
||||
如上图所示的那样,运行通过。
|
||||
|
||||
```
|
||||
personal.newAccount()
|
||||
|
||||
```
|
||||
|
||||
我们创建了一个新账户,这个账户就是EOA账户,并通过eth.getBalance获取了当前地址的余额,显示为0。
|
||||
|
||||
输入Exit退出后,我们开始以挖矿模式启动,这里我们最好记录一下我们的地址:
|
||||
|
||||
>
|
||||
【0xf8f7ff845596f0bab1e973859bfcaec6cd2a82ab】
|
||||
|
||||
|
||||
我们使用如下命令启动挖矿,注意在Etherbase的地方填上述地址:
|
||||
|
||||
```
|
||||
$ geth --datadir /root/geth-test/ --networkid 98 --mine --minerthreads=1 --etherbase=0xf8f7ff845596f0bab1e973859bfcaec6cd2a82ab
|
||||
|
||||
```
|
||||
|
||||
以太坊的PoW挖矿算法是内存困难型的,首先需要生成DAG,这个视你设备的性能而定,需要耗费一定时间,请耐心等待,如下图所示,我们可以看到DAG生成非常耗费时间。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/d6/27/d69fd6ce298a755fc50c68cc67e7cd27.png" alt="">
|
||||
|
||||
在我的远程开发机上一共耗费了6分半,又经过了4分钟,我挖到了第一个块,如下图所示。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/9d/cb/9da9ac44f1057bd8918f60fde20877cb.png" alt="">
|
||||
|
||||
这期间机器的负载如下。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/99/a4/9939264d4e1d37ad307e4f12c51d7da4.png" alt="">
|
||||
|
||||
可以看到CPU和内存占用很高,我这里使用测试的机器是2Core 4GB Ubuntu16.04。
|
||||
|
||||
现在我们再去检查一下Etherbase所指向地址的余额。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/9b/44/9b61e6f4a7247f3b86f2962e653f5a44.png" alt="">
|
||||
|
||||
可以看到已经有5个以太币了,以太币的最小单位wei,所以5后面18个零表示5个以太币。
|
||||
|
||||
### 3.编写并部署属于自己的智能合约
|
||||
|
||||
智能合约的开发与钱包是独立的,用户可以使用IDE进行调试等操作,目前Dapp的IDE并不多,常见有Truffle、Embark、Remix几种;
|
||||
|
||||
这篇文章中,我并不使用IDE,这里仅仅会给出一些示例代码,即经典的Hello Word,你如果想尝试编写自己的智能合约,可以使用在线IDE。
|
||||
|
||||
>
|
||||
[https://ethereum.github.io/browser-solidity/。](https://ethereum.github.io/browser-solidity/。)
|
||||
|
||||
|
||||
首先我们要获取Solidity编译器,通过 apt-get install solc 来安装。
|
||||
|
||||
安装成功后,我们新建一个Solidity源码文件,命名为helloword.sol,并且写入代码如下。
|
||||
|
||||
```
|
||||
pragma solidity ^0.4.11;
|
||||
contract helloWorld {
|
||||
function renderHelloWorld () returns (string) {
|
||||
return 'helloWorld';
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
执行 solc --bin helloword.sol 获得EVM二进制码。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/9b/4d/9b89682246dc0304984ee6af011d324d.png" alt="">
|
||||
|
||||
编译器警告我们暂时不必理会,接下来我们还需要生成ABI部署参数,使用命令 solc --abi helloword.sol。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/f1/c4/f13a6440c68435938862ab57873fadc4.png" alt="">
|
||||
|
||||
开始部署,我们进入console,
|
||||
|
||||
定义code和abi两个变量如下,注意code的值最前面有0x,二进制数据是用十六进制表示的。
|
||||
|
||||
```
|
||||
>code="0x6060604052341561000f57600080fd5b6101578061001e6000396000f300606060405260043610610041576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063942ae0a714610046575b600080fd5b341561005157600080fd5b6100596100d4565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561009957808201518184015260208101905061007e565b50505050905090810190601f1680156100c65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100dc610117565b6040805190810160405280600a81526020017f68656c6c6f576f726c6400000000000000000000000000000000000000000000815250905090565b6020604051908101604052806000815250905600a165627a7a72305820fcce0b6910e479539e4796b7d56620a6f90e03ba47449c843bec54958f68bf700029"
|
||||
|
||||
>abi=[{"constant":false,"inputs":[],"name":"renderHelloWorld","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]
|
||||
|
||||
```
|
||||
|
||||
你可以在控制台分别执行,由于结果比较长,这里就不放出来了。
|
||||
|
||||
```
|
||||
// 这一步解锁账户,用于方便部署合约
|
||||
>personal.unlockAccount("0xf8f7ff845596f0bab1e973859bfcaec6cd2a82ab")
|
||||
// 使用上述定义的abi变量生成合约信息
|
||||
>myHelloWorld=eth.contract(abi)
|
||||
// 注入code信息,激活合约
|
||||
>contract=myHelloWorld.new({from:"0xf8f7ff845596f0bab1e973859bfcaec6cd2a82ab",data:code,gas:1000000})
|
||||
|
||||
```
|
||||
|
||||
最终执行结果如下。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/3b/57/3bdc482fc2eb7fed45d8b16835b1cc57.png" alt="">
|
||||
|
||||
我们可以通过txpool来查看未确认的交易。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/d6/d1/d693a9be1149770884217eddf46c2cd1.png" alt="">
|
||||
|
||||
接下来只要等待出块即可,你的合约就会成为正常运行的合约了,否则合约还不可以调用。
|
||||
|
||||
由于我本地挖矿出块异常缓慢,所以我尝试了Remix IDE,运行后我们可以得到如下结果。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/be/03/be4e1b3e4f5727a17ba0494ca352e203.png" alt="">
|
||||
|
||||
至此一个简单的HelloWord智能合约就生成啦,不过它的运行成本非常高昂,所以我们极力建议使用在一些方便的虚拟环境中。
|
||||
|
||||
## 智能合约标准模板
|
||||
|
||||
当任何人都可以写代码自定义业务逻辑的时候,也就意味着需要一套标准让人们降低开发门槛,标准化的接口让产品之间可以协作。那么我们接下来就来讨论一下以太坊上的三种智能合约标准模板。
|
||||
|
||||
这三种模板都与Token有关。那么首先我们就来区分一下数字货币与Token的概念,数字货币一般指一个区块链项目的平台代币,比如以太坊上的以太币,元界上的ETP都是基础代币。
|
||||
|
||||
而Token往往代表了一种资产,这些资产在已经存在的其他区块链之上运行,资产还可以像商品一样交易,例如消费积分、游戏虚拟资产。Token离具体的区块链应用也会更近,因为区块链应用的项目方通常也是Token的发行方。
|
||||
|
||||
目前最广泛使用的三种Token标准都是基于以太坊的,它们分别是ERC20、ERC223、ERC721。这里的ERC表示Ethereum Request for Comments,翻译过来就是以太坊意见征求稿。
|
||||
|
||||
### 1.ERC20
|
||||
|
||||
2015年11月,V神在Github上提交了ERC20代币的技术标准,随后2016年到2017年,大量的区块链项目都使用ERC20作为工具进行ICO。这使得ERC20成为了区块链整个行业内的Token标准,可见这种标准的影响之大。
|
||||
|
||||
实际上ERC20代币是一类运行在以太坊区块链上的智能合约,只不过这些合约代码遵循一定的规范,这个规范就是ERC20标准,它规定了跨Dapp转移Token、Token交易以及一些使用接口。
|
||||
|
||||
ERC20一共定义了6个函数和两个触发事件,他们都是使用Solidity语言编写的。
|
||||
|
||||
6个函数描述了如何转移以及Token的相关数据如何被访问,市面上99%的ERC20 Token都可以找到这6个函数。2个事件提供了Approve和Transfer的格式化输出。
|
||||
|
||||
下面我们重点看一看ERC20的接口。
|
||||
|
||||
```
|
||||
// ---------------------------------------------
|
||||
// ERC Token Standard #20 Interface
|
||||
// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md
|
||||
// -------------------------------------------
|
||||
contract ERC20Interface {
|
||||
function totalSupply() public constant returns (uint);
|
||||
function balanceOf(address tokenOwner) public constant returns (uint balance);
|
||||
function allowance(address tokenOwner, address spender) public constant returns (uint remaining);
|
||||
function transfer(address to, uint tokens) public returns (bool success);
|
||||
function approve(address spender, uint tokens) public returns (bool success);
|
||||
function transferFrom(address from, address to, uint tokens) public returns (bool success);
|
||||
event Transfer(address indexed from, address indexed to, uint tokens);
|
||||
event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
1. Allowance:允许多次创建两个不同的地址之间的单向交易,Token的拥有者可以从此智能合约中提取Token;
|
||||
1. Approve:这个函数需要引用Allowance,顾名思义,它定义了Token的拥有者同意创建属于自己的交易,这个函数要求两个参数作为输入,分别是花费者的地址,以及发送金额;
|
||||
1. BalanceOf:定义了查询目标地址账户余额的接口;
|
||||
1. Transfer和TransferFrom:定义了Token如何转移以及执行转移过程;
|
||||
1. TotalSupply:定义了这个Token最大发行量。
|
||||
|
||||
上面我们简要介绍了ERC20标准合约的接口,下面我们来看看升级版的ERC20。
|
||||
|
||||
### 2.ERC223
|
||||
|
||||
在某些情况下,ERC20也有些缺陷。例如某人使用ERC20发送100个Token到另外一个账户,如果目标账户是一个合约账户,目标账户的合约代码如果不兼容ERC20 标准怎么办呢?
|
||||
|
||||
这一点非常有可能,由于合约代码无法识别交易,所以这笔交易就会被拒绝。
|
||||
|
||||
我们知道以太坊使用的并不是UTXO,这意味着合约之间不满足ACID,那么很遗憾,发送方的这100个Token就永久地丢失了。
|
||||
|
||||
为了解决这个问题,非官方的社区开发者提交了ERC223模板,可以解决这个问题,使用者需要把既存的ERC20合约升级到ERC223合约。
|
||||
|
||||
### 3.ERC721
|
||||
|
||||
2018年初,有一个区块链游戏火了,叫做以太坊养猫游戏,这个游戏也是一个智能合约。它基于ERC721标准,实际上它也是一种Token标准。
|
||||
|
||||
ERC721与ERC20最大的区别是:ERC721定义了每一份Token都是唯一的,它们有唯一的标识。例如芒果和米饭是两种不同属性的资产,从物理世界来看,他们是不能直接混在一起使用的,我们不能把芒果加到大米中。
|
||||
|
||||
这样一来,ERC721中Token的含义也转变成了一种物权所有权凭证,不再是ERC20中的同质资产。
|
||||
|
||||
## 总结
|
||||
|
||||
今天我们介绍了以太坊钱包,手把手教你搭建了一条以太坊私链,并告诉你如何编译和部署智能合约,最后我还介绍了三种流行的智能合约模板,希望能帮助你上手并能深入地理解智能合约。
|
||||
|
||||
今天的问题是,除了以太坊之外,还有哪些主打智能合约的区块链项目呢?你可以给我留言,我们一起讨论。感谢你的收听,我们下次再见。
|
||||
|
||||
参考链接:
|
||||
|
||||
1. [http://www.ethdocs.org/en/latest/ethereum-clients/go-ethereum/index.html](http://www.ethdocs.org/en/latest/ethereum-clients/go-ethereum/index.html)
|
||||
1. [https://github.com/ethereum/wiki/wiki/JSON-RPC](https://github.com/ethereum/wiki/wiki/JSON-RPC)
|
||||
1. [http://remix.ethereum.org](http://remix.ethereum.org)
|
||||
1. [https://github.com/ethereum/go-ethereum/wiki/Private-network](https://github.com/ethereum/go-ethereum/wiki/Private-network)
|
||||
1. [https://theethereum.wiki/w/index.php/ERC20_Token_Standard](https://theethereum.wiki/w/index.php/ERC20_Token_Standard)
|
||||
|
||||
|
||||
127
极客时间专栏/geek/深入浅出区块链/第二章 深入区块链技术/第20讲 | 区块链项目详解:比特股BTS.md
Normal file
127
极客时间专栏/geek/深入浅出区块链/第二章 深入区块链技术/第20讲 | 区块链项目详解:比特股BTS.md
Normal file
@@ -0,0 +1,127 @@
|
||||
<audio id="audio" title="第20讲 | 区块链项目详解:比特股BTS" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/c0/a5/c0f9a2629441e559e537966a56879ea5.mp3"></audio>
|
||||
|
||||
前面两篇我们都聊了智能合约的话题,智能合约可以说是当下区块链最热的概念了,在多数人眼里,没有智能合约的区块链价值几乎就大打折扣。
|
||||
|
||||
那么说,实际上是不是这样呢,我们今天就来聊聊一个并没有开放式智能合约的区块链项目——比特股。
|
||||
|
||||
比特股发布于2014年,虽然没有引入智能合约的概念,但它提供了功能极为丰富的金融类工具,比特股上所有的金融合约都是事先在代码里写好的,所以说它的本身就是一个超级智能合约集合。
|
||||
|
||||
## 什么是比特股
|
||||
|
||||
比特股是一个公开透明的、7*24小时不间断运行的、基于区块链技术的去中心化交易平台。
|
||||
|
||||
它兼具了区块链的优点,也是第一个有关稳定数字货币的尝试,目前比特股提供了若干核心的金融服务,例如支付、撮合交易、资产存托等服务。
|
||||
|
||||
相较于传统的金融IT系统,它的服务器是由分散在世界各地的受托人(Delegated)维护的,即使其中一些人被攻击也不会导致整个系统的宕机。
|
||||
|
||||
比特股目前全网在线的服务器有27个,由于DPoS共识算法提供了较好的交易吞吐性能,理论上比特股的TPS可达10万,这也是比特股在技术上区别于其他区块链的最显著特征。比特股较好的TPS其实也是为了它的功能服务的。
|
||||
|
||||
在这里,我们能看出比特股平台的性质。
|
||||
|
||||
首先,比特股平台是一个交易平台,交易平台的显著特征是整个市场对时间敏感,大家都希望下单之后快速成交,所以高TPS是一个交易平台的基本需求。
|
||||
|
||||
其次,比特股是去中心化的交易平台。目前流行的中心化数字货币交易平台最大的问题是资金管理系统和撮合系统都由同一家控制的。
|
||||
|
||||
然而在传统的证券交易领域,证券登记和交易撮合是两个不同的主体,他们之间是协作关系,共同受到证券会的管辖。
|
||||
|
||||
所以,如果你的数字货币存在中心化交易平台,你的交易撮合也受它来控制,这里的交易撮合指的是一个交易双方通过挂出买单和卖单,系统完成撮合匹配直至最终成交的过程。
|
||||
|
||||
由于以上的这一切都是不透明的,这里面就有很多的不确定因素。
|
||||
|
||||
比如交易平台跑路风险、黑客攻击、资产莫名其妙丢失,或者撮合的过程中,交易对手方是谁,是否有内幕交易。这些情况都会带来较大的风险。
|
||||
|
||||
## 比特股的两个机制
|
||||
|
||||
那么比特股是如何设计中心化交易所来避免上述风险的呢?
|
||||
|
||||
比特股作为一个去中心化的交易所,它有两个机制可以避免上述的风险。
|
||||
|
||||
第一、资金出入是由承兑商来支持的,人人都可以成为承兑商,也就是人人承兑;
|
||||
第二、锚定机制提供了稳定货币的出入金过程,锚定机制也保证了比特股的出入资金和交易撮合是分离的,避免了中心化交易平台的弊端。
|
||||
|
||||
这个过程可以简述为:法币<—>锚定资产(系统内置货币)<—>bts 的相互转换。从法币到系统内置货币用到了人人承兑机制,从系统内置货币到bts的转换用到了锚定机制。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/f1/12/f18f6b2f5f41a2174b6b903cc1f74112.jpg" alt="">
|
||||
|
||||
这里的bts是比特股上流通的平台代币,它和比特币一样有类似的总量上限设定,大约在36亿左右,目前流通量26亿左右。我们接下来就来看看这两个机制。
|
||||
|
||||
### 1.人人承兑
|
||||
|
||||
人人承兑就是提供了从法币到系统内置货币的转换,比特股系统内置了多种货币,它锚定了多数法币。
|
||||
|
||||
例如bitCNY、bitUSD、bitEUR等等,这些系统内置货币是可以与CNY、USD、EUR按照1:1兑换的。而人人承兑货币其实就是提供了bitCNY和真正人民币之间的相互转换。
|
||||
|
||||
它的机制上有点类似那个比特币的场外交易。所谓场外交易,就是没有中心化撮合中介,交易双方自行议价成交。
|
||||
|
||||
例如,我想要买比特币,就可以找到一个专门的承兑商,直接把这个钱支付给交易商,然后承兑商再把比特币支付给我。这部分的内容,后面我们讲数字货币交易所的时候会和你详细讲解。
|
||||
|
||||
人人承兑在逻辑上差不多,它提供了一个CNY法币和bitCNY的兑换手段,实际上就是让法币和比特股系统内置货币的交换能够进行,而且是去信任的进行。
|
||||
|
||||
所以从资金托管的角度来看,比特股与中心化交易所很大的区别,比如你在一个交易所里充值,你只能信任这个交易所在保管你的钱,在你要提现的时候,你只能信任交易所愿意让你提出。
|
||||
|
||||
但是人人承兑的就不一样了,人人承兑是你从A承兑商获取bitCNY,你可以找B承兑商再换成人民币,不需要只在同一个地方兑换。
|
||||
|
||||
因此一个人此时有充值的需求,过一段时间可能就有提现的需求,所以实际上每个人都可以成为承兑商,我可以是买家也可以是卖家,交易角色的转换可以让市场更灵活。当然市场上也有专门提供充值和提现服务的 “承兑商”,这些承兑商收取手续费来盈利。
|
||||
|
||||
但是,不是所有的中心化风险都可以通过技术解决,人与人的信任问题没有一劳永逸的解决办法,即使你们当面交易也有可能遇到对方欺诈的行为。
|
||||
|
||||
我们只能说,CNY法币与bitCNY锚定之后的充值和提现相对更安全,人人承兑提供了一种有效的机制,缩短了出金入金的周期,提升了安全性,如果资金在比特股系统之内,整个使用期间也没有人能威胁到你的资产。
|
||||
|
||||
### 2.锚定机制
|
||||
|
||||
锚定机制是一种去中心化的抵押机制。我们刚才提到了比特股系统内置了多种货币,它锚定了多数法币,例如bitCNY、bitUSD、bitEUR等等,这些系统内置货币是可以与CNY、USD、EUR按照1:1兑换的。
|
||||
|
||||
系统内置货币的发行商是系统自身,发行给抵押了bts的用户,发行的数量是由抵押的代币数量决定的。你用bts抵押,然后换取bitCNY。
|
||||
|
||||
换句话说,任何持有bts的人可以用它来抵押生产系统的内置货币,例如bitCNY,它的抵押规则要求两倍价值的bts进行抵押,由于有2倍价值的bts作为保障,所以定义1 bitCNY = 1元人民币的风险较低。
|
||||
|
||||
比特股系统本身提供bts与bitCNY交易对,例如现在bts价格是0.5元人民币,我就能用4个价值2元的bts抵押产生1枚bitCNY,也就是2倍价格抵押。
|
||||
|
||||
这种抵押担保机制保障了bitCNY的价值,并且从技术层面来讲,比特股的共识机制保证了恶意修改bitCNY的数量的造假行为是不可行的。
|
||||
|
||||
如果bts价格下跌,系统就会自动把我抵押产生的bts卖掉,因为抵押了2倍价值的bts,所以如果没有暴跌50%以上,系统都可以在交易市场上卖掉我抵押产生的bts,并在市场上获得bitCNY。
|
||||
|
||||
如果暴跌50%以上,系统会以一成的价格(强制平仓)卖出抵押的bts,直至卖够抵押产生的bitCNY。
|
||||
|
||||
从操作层面来看,支付bitCNY实际上消耗的还是bts,但需要消耗多少,就以实时价格买入多少bts。
|
||||
|
||||
买入操作是瞬间完成的,在比特股上有专门的代币资金池来提供,实时价格由系统为之决定的,所以使用者不用承担任何比特股代币价格波动带来的风险。
|
||||
|
||||
至此,稳定的bitCNY货币就产生了,它兼具了区块链的优点,且是一种稳定货币。
|
||||
|
||||
除了抵押以外,还有强制平仓、强制清算这种机制来保证价值和实际所锚定的货币等价。内容比较深,留给你自己挖掘。
|
||||
|
||||
## 比特股的技术概览
|
||||
|
||||
比特股的核心代码是由Cryptonomex公司开源的石墨烯(Graphene)框架演变而来,它的主体代码是C++编写的,里面使用了大量的boost库组件,如果你对石墨烯技术感兴趣,并且熟悉C++,可以仔细研究一番。
|
||||
|
||||
除了比特股核心,这里还有一套Javascript编写的UI产品,叫做Bitshares-UI,Bitshares-UI其实是一个轻量级的基于浏览器的钱包:比特股钱包,这个钱包将用户密钥存储在本地浏览器上,并且密钥是通过用户密码加密并储存在浏览器数据库。
|
||||
|
||||
发送交易时,先本地对交易进行签名,再传输到代理服务器上,由服务器广播至比特股全网,这个服务器你也可以自己搭建。
|
||||
|
||||
比特股所使用的共识算法我们已经讲过,是DPoS,所以比特股也有见证人节点,目前有101个见证人节点,从101个节点中,社区又选出了11位代表,我们叫做理事会。理事会接受社区投票然后行使比特股上的治理权。
|
||||
|
||||
比特股使用的也是ECC椭圆曲线非对称加密算法,值得一提的是,比特股并没有类似比特币地址的概念,在比特股上取而代之的是可读的账号系统,这些账号与私钥一一绑定,可读账号就是比特股系统中的地址。
|
||||
|
||||
比如我的账号是“chenhao”,那么在比特股上,你支付给我bitCNY的时候,接收方一栏直接填“chenhao”即可。
|
||||
|
||||
## 总结
|
||||
|
||||
今天我向你详细介绍了比特股系统,比特股也是一场伟大的实验,它打破了区块链应用数字货币的局限性,让区块链技术具有丰富的金融特性。
|
||||
|
||||
比特股技术上的优势多体现在DPoS算法上,所以本篇我重点介绍了比特股的产品特性。
|
||||
|
||||
比特股社区也是区块链界的一股清流,因为持有比特股往往需要学习大量金融知识。
|
||||
|
||||
投资者想要投资比特股,光是弄清楚锚定机制足以让投机者就需要花费大量时间,所以一旦被比特股套牢,似乎只能学习比特股进行自我提升,这也让比特股社区的平均金融知识储备高于其他区块链项目。
|
||||
|
||||
比特股上的“强制平仓”和“强制清算” 是什么意思呢?你可以跟我留言,我们一起讨论,感谢你的收听,我们下期再见。
|
||||
|
||||
附录:
|
||||
|
||||
<li>【[http://bitshares.org/】](http://bitshares.org/】)
|
||||
</li>
|
||||
<li>【[https://github.com/bitshares/how.bitshares.works/tree/master/developers#bitshares-documentation-for-developpers】](https://github.com/bitshares/how.bitshares.works/tree/master/developers#bitshares-documentation-for-developpers】)
|
||||
</li>
|
||||
|
||||
|
||||
@@ -0,0 +1,147 @@
|
||||
<audio id="audio" title="第21讲 | 引人瞩目的区块链项目:EOS、IOTA、Cardano" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/fb/d2/fb714172ecba9b2c722295f14a43a1d2.mp3"></audio>
|
||||
|
||||
在第 8 讲中,我们已经讲过了一些成熟的区块链项目,这些项目多数都属于数字货币项目。
|
||||
|
||||
今天我们来聊几个比较创新型的区块链项目,它们非常吸引人们的视线,容易引起话题,一方面它们的市场营销非常成功,另一方面它们也提出了革新的区块链技术概念。
|
||||
|
||||
下面我们来聊聊三个项目。
|
||||
|
||||
## 柚子EOS
|
||||
|
||||
### 1.什么是EOS
|
||||
|
||||
EOS全称EOS.IO软件,EOS也是EOS.IO上的平台代币缩写,它暂时没有准确的中文翻译,中文社区把EOS叫柚子,这一点其实得益于EOS的发音与水果“柚子”相近。
|
||||
|
||||
EOS是一个以太坊的竞争型区块链,它提供了全新的区块链架构,使得去中心化平台水平扩容和垂直扩容都成为了可能。
|
||||
|
||||
如果智能合约是程序,那么可以把EOS看成是一个超大的操作系统了,它为所有的程序,也就是智能合约提供了基本设施。例如账户、授权、数据库、异步通信等接口。
|
||||
|
||||
它甚至可以跨平台驱动大量的CPU或者集群,所以EOS的TPS肯定是远超以太坊的,这也使得构建基于区块链的应用几乎没有成本而且快速高效。
|
||||
|
||||
### 2.EOS的瞩目之处
|
||||
|
||||
在说EOS之前,我们来回顾一下DPoS。
|
||||
|
||||
DPoS其实是BM参照现实世界中的议会制度而设计的共识算法。DPoS的核心理念其实是投票,它的设计理念是延迟性惩罚,它假设参与者绝大部分都是没有恶意的。
|
||||
|
||||
“人性本善”的假设虽然让系统的作弊成本降低,但是随之而来的惩罚也非常严厉,就是丧失见证人的资格,但是带来的好处则是效率的提升。
|
||||
|
||||
我们来看看EOS吸引人的地方,这里一共有两点,第一是EOS号称可以提供百万级TPS交易性能,第二是EOS的链上治理机制:区块链宪法以及21个超级节点(见证人节点)。
|
||||
|
||||
在EOS中,记账节点又被称作超级节点,EOS一共有21个主节点,另外还有100个备选超级节点,这些超级节点完全是等价的。
|
||||
|
||||
超级节点的基本职责包括了忠实打包交易、执行并验证智能合约、向全网广播有效区块以外,还多了一项职责:保障并促进EOS项目的发展。
|
||||
|
||||
如何促进呢?BM在EOS中强化了DPoS算法的投票机制,并首次提出了区块链宪法的概念,我们可以直接引用EOS技术白皮书中的内容来一探究竟。
|
||||
|
||||
>
|
||||
EOS.IO 应用使得区块链创建了一个点对点的服务条款协议或者绑定用户到一个合约,这都需要用户对其签名,简称“宪法”。
|
||||
宪法的内容定义了仅仅依靠代码无法在用户间履行义务,同时通过建立管辖权和可选的法律来解决相互间的争端。
|
||||
每个在网络广播的交易都必须将宪法的哈希值作为签名的一部分,从而显性地将签名者绑定在合约中。
|
||||
宪法还定义了人类可读意图的源代码协议。 这个意图是用来识别错误和功能之间的差异,当错误发生时,引导社区对什么是适当或不当修复。
|
||||
|
||||
|
||||
可以看出区块链宪法是一种非代码强制执行的规则,有点像我们安装软件时的“同意”协议,所以它更像是一种人为承诺,为了弥补DPoS较弱的抵抗恶意规则的缺陷。
|
||||
|
||||
那么什么人可以发起并修改宪法呢?就是超级节点,也就是记账节点,它规定了17/21以上的节点同意才能发起修改提案。
|
||||
|
||||
我们可以看出超级节点的权力十分巨大,这也引来了人们对此产生了争议。
|
||||
|
||||
### 3.EOS的争议
|
||||
|
||||
Vitalik 针对EOS超级节点竞选发表过意见。他认为21个节点的DPoS虽然引入了治理结构,但也很容易受到选民和持币大户的操纵,最终导致“财阀统治型”的治理结构。
|
||||
|
||||
在超级节点竞选过程中,某些节点为了获得更多的选票,承诺当选后可以给投票者分红,这在西方文化中是无法接受的,这一点似乎违背了BM设计DPoS的初衷,所以BM以及EOS团队都表示坚决反对。
|
||||
|
||||
BM对此也给了回应,BM表示自己的目标是降低创建社区的准入门槛,并允许市场自由竞争来奖励最高效的社区以及惩罚最腐败的社区。
|
||||
|
||||
他也认为善良是主观的,而且每个社区都能定义持有什么样的价值观是好人,并积极驱逐他们所认为的坏人。
|
||||
|
||||
Vitalik和BM都相互发文怒“怼”对方,但是总的来说,Vitalik和BM这种公开讨论推进了区块链行业的发展,给人们带来了更多哲学和设计原则上的思考。我在附录中给出了社区翻译版文章,你可以进行查询。
|
||||
|
||||
## 埃欧塔IOTA
|
||||
|
||||
IOTA是一个为了物联网(IoT)而生的区块链项目。严格来说,IOTA不是“区块链”,因为它没有区块,也不是链式结构。
|
||||
|
||||
IOTA提出了一种基于有向无环图(DAG)的分布式账本结构,这种结构IOTA将其命名为The Tangle,探戈。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/62/8c/62120dfb723cb9fc0920a6875aec598c.png" alt="">
|
||||
|
||||
上图是常见区块链账本结构,而下图展示了Tangle的账本结构。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/32/30/32890808ef65fffee1ee0d975f595830.png" alt="">
|
||||
|
||||
我们来看看这两张图的区别,首先区块链账本结构的打包单位是区块,而Tangle直接就是交易,或者或“交易引用”。
|
||||
|
||||
任意交易Tx-black会引用过去的两条交易记录,这样被引用的交易Tx-purple相当于有了一次确认,间接地证明了合法性,随着一次又一次的被引用,Tx-purple会转变成Tx-green。
|
||||
|
||||
1. Tx-black相当于图种的黑色图块,代表未确认的交易;
|
||||
1. Tx-purple相当于紫色图块,代表已确认但还未成熟的交易;
|
||||
1. Tx-green相当于是绿色图块,代表已确认已成熟的交易,是可信的。
|
||||
|
||||
也就是说,我们发送交易的目标是成本绿色部分的交易,成为绿色部分的交易,可信度是可以计算的,面对不同的交易场景,可信度可以设置为51%,90%或者百分之百。
|
||||
|
||||
那么说,如何计算这种可信度呢?
|
||||
|
||||
IOTA上的共识算法叫做MCMC算法,它可以任意选择黑色部分的两笔交易,进行引用。
|
||||
|
||||
我们回到DAG的结构中,我们发现每一个绿色的交易都会有一条从黑色起始位置通往它的路径,那么你这笔交易的可信程度就可以很容易计算。
|
||||
|
||||
例如我们执行MCMC算法N次,这笔交易被全网接受的概率就是M/N,其中M就是能从底部通往这笔交易的数量。
|
||||
|
||||
Tangle结构和MCMC共识是非常具有吸引力的,它也带来了以下特性。
|
||||
|
||||
1. 0交易费:由于没有记账节点,目前没有考虑设置交易费。
|
||||
1. 水平扩容:由于Tangle的结构不涉及记账节点,交易吞吐可以随着规模大容量也跟着提升。
|
||||
1. 分区再合并:由于不是单链结构,私下记账以后也可以合并到Tangle账本中,不存在分叉这一说。
|
||||
|
||||
IOTA的Tangle账本结构,为区块链技术带来了新的视角,这也是它吸引人的关键。
|
||||
|
||||
## 卡尔达诺Cardano
|
||||
|
||||
卡尔达诺(Cardano)也是一个正在开发中的新一代区块链智能合约平台。
|
||||
|
||||
卡尔达诺项目最大的特色是由理论研究主导,严格采用数学形式化验证的来证明严谨、安全性的区块链。
|
||||
|
||||
卡尔达诺认为现阶段基础公链在无论在可规模化性(Scalability)、可互操作性(Interoperability)和可持续发展性(Sustainability)均存在不足,卡尔达诺希望进行概念和技术上的创新,最终解决上述三个方面问题。
|
||||
|
||||
卡尔达诺的团队认为目前区块链面临着两个比较突出的问题:
|
||||
|
||||
1.区块链协议的升级将会导致区块链分叉;
|
||||
2.区块链的水平扩容和垂直扩容能力不足。
|
||||
|
||||
所以Cardano提出了分层架构理念,这似乎与传统IT架构模式:分层式架构模式有点像,卡尔达诺由两个层次组成。
|
||||
|
||||
1. Settlement Layer清算层:卡尔达诺的代币ADA在该层流动,是整个系统的支付和清算的基础。
|
||||
1. Computation Layer 计算层:卡尔达诺将在计算层提供智能合约、身份认证、消息通信等等功能。
|
||||
|
||||
相比于概念创新,卡尔达诺的团队研究了一种被命名为 Ouroboros 的算法,它其实也是PoS共识算法的变种,不同的是卡尔达诺团队为此提供了数学形式化证明,证明了它是高效、安全的共识算法。
|
||||
|
||||
卡尔达诺是一种理论研究驱动实践的尝试,无论是两层设计,还是Ouroboros算法,都为区块链技术的发展提供了值得参考的视角。
|
||||
|
||||
## 总结
|
||||
|
||||
今天,我们介绍了EOS、IOTA、ADA三个受人瞩目的区块链项目,EOS和ADA都是致力于区块链去中心化的应用平台,IOTA致力于为物联网提供分布式账本。这些项目引领了区块链的发展方向,无论是技术层面还是市场层面,他们都是非常出色的。
|
||||
|
||||
所以,你还可以想到那些技术或者市场做得出色的区块链项目呢?快来分享一下吧。感谢你的收听,我们下次再见。
|
||||
|
||||
### 参考链接:
|
||||
|
||||
<li>[EOS.IO 技术白皮书](https://github.com/EOSIO/Documentation/blob/master/zh-CN/TechnicalWhitePaper.md)
|
||||
</li>
|
||||
<li>[https://github.com/EOSIO/eos/wiki](https://github.com/EOSIO/eos/wiki)
|
||||
</li>
|
||||
<li>[BM回怼V神:加密经济治理有局限,所以我选DPOS](https://mp.weixin.qq.com/s?__biz=MzU5MzQ5MDk5MA==&mid=2247483719&idx=1&sn=c225cd7ed63434b24255e5bc35b11622&chksm=fe0ee406c9796d1009ff002712fc9019cf4b2373cac89b28e0d8f7dbfde478648436db9a1fe3&scene=21#wechat_redirect)
|
||||
</li>
|
||||
<li>[V神回应BM:你说的没错,但我必须要提醒你](https://mp.weixin.qq.com/s?__biz=MzU5MzQ5MDk5MA==&mid=2247483727&idx=1&sn=09819643108cee1fdf117958b4963916&chksm=fe0ee40ec9796d18dc4a07240c94b3cd1fb1c9a00234861e057ed990502fcf349e0668668c6a&scene=21#wechat_redirect)
|
||||
</li>
|
||||
<li>[https://steemit.com/cn/@niking/iota](https://steemit.com/cn/@niking/iota)
|
||||
</li>
|
||||
<li>[https://docs.iota.org/introduction](https://docs.iota.org/introduction)
|
||||
</li>
|
||||
<li>[https://whycardano.com/cn/](https://whycardano.com/cn/)
|
||||
</li>
|
||||
<li>[](http://url)[https://iohk.io/blog/ouroboros-at-crypto-2017/](https://iohk.io/blog/ouroboros-at-crypto-2017/)
|
||||
</li>
|
||||
|
||||
|
||||
153
极客时间专栏/geek/深入浅出区块链/第二章 深入区块链技术/第22讲 | 国内区块链项目技术一览.md
Normal file
153
极客时间专栏/geek/深入浅出区块链/第二章 深入区块链技术/第22讲 | 国内区块链项目技术一览.md
Normal file
@@ -0,0 +1,153 @@
|
||||
<audio id="audio" title="第22讲 | 国内区块链项目技术一览" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/ef/89/efa8e648a43532441eed54e8e606c789.mp3"></audio>
|
||||
|
||||
区块链的深入技术篇写到了现在,我们已经一起看过了很多国外区块链项目的技术逻辑。实际上,国内的优质区块链项目其实也不少,并且势头很足,不容小觑。
|
||||
|
||||
我在前面的文章中介绍过国内的几个区块链项目,不过仅从发展的角度做了一个简要概述,并没有进行深入探讨,今天我们就重点来看一看这些项目的设计思路与技术特点。
|
||||
|
||||
## 小蚁NEO
|
||||
|
||||
### 1.简介
|
||||
|
||||
我们以前讲到过,NEO的前身是小蚁,小蚁最早在2015年发起,它在2017年中正式更名为NEO。
|
||||
|
||||
NEO项目一共经历过两次ICO,第一次ICO是项目创立,第二次ICO是项目更名后的品牌升级。可以说通过NEO项目的起起落落见证了整个国内区块链项目的发展。
|
||||
|
||||
在重做了市值管理和社区建设后,NEO成为了市值TOP10区块链项目之一。
|
||||
|
||||
### 2.设计思路
|
||||
|
||||
NEO是一个开放式智能经济平台,它提供了数字身份、数字资产、智能合约三种核心元素用来支持NEO智能经济生态。
|
||||
|
||||
- 数字资产:数字资产是以电子数据的形式存在的可编程控制的资产,NEO在底层也直接支持类似ERC20的Token机制,所以用户可以在 NEO 上自行注册登记资产、交易和流转。它也通过数字身份解决与实体资产的映射关系,用户通过正规的数字身份所注册登记的资产受到法律的保护。
|
||||
- 数字身份:数字身份是指以电子数据形式存在的个人、组织、事物的身份信息,NEO 将实现一套兼容 X.509 的数字身份标准以及支持 Web Of Trust 式的点对点的证书签发模式。
|
||||
- 智能合约:NEO上的智能合约与以太坊不同,叫做NeoContract。这套智能合约体系的最大特点是直接支持C#、Java 等主流编程语言,所以开发者可以在熟悉的 IDE 环境(Visual Studio、Eclipse 等)中进行智能合约的开发、调试、编译。
|
||||
|
||||
NEO 的通用轻量级虚拟机 Neo VM 具有高确定性、高并发性、高扩展性等优点。
|
||||
|
||||
### 3.技术特点
|
||||
|
||||
- NEO采用了PBFT类的共识算法。NEO的修改版为dBFT共识算法,这里d为Delegated,就是代理人的意思。所有的PBFT类算法都有个特性,就是通信复杂度是节点数量的平方次,例如7个节点出一次块至少通信72次,对网络带宽要求很高。所以记账节点一般不会很多,它带来的优势就是TPS较高,并且不会分叉。
|
||||
- 自成一派的智能合约体系。这里降低了智能合约开发者的局限性,不必使用Solidity语言开发。
|
||||
- C#技术生态。NEO的主要实现都是C#语言编写的,得益于.Net Core的开源,NEO的技术生态也在一直扩张。
|
||||
- Token体系。提供了等价于以太坊ERC20的 NEP-5 Token体系。
|
||||
|
||||
## 元界Metaverse
|
||||
|
||||
### 1.简介
|
||||
|
||||
元界是我所主导的一个开源区块链项目,项目于2016年8月发起,经过了5个月开发和测试,于2017年2月份上线。
|
||||
|
||||
元界是一个关注社会和商业需求的区块链项目,目标是构建以数字资产(Metavase Smart Token)和数字身份(Avatar)为基础新型区块链生态,这种生态会为人类社会带来深刻的变革。
|
||||
|
||||
除了数字资产和数字身份两个概念,我们还提出了BISC内置智能合约和BaaS区块链即服务的概念,并把数字身份作了延伸,提出了Oracle价值中介(此Oracle非彼Oracle)。
|
||||
|
||||
总体思路是总结人与人、人与资产之间的关系,把总结后的通用需求抽象成模型,然后做到区块链底层供使用者方便使用,这种方式我们叫做BISC(Buit-in Smart Contract)内置智能合约,它可以降低商业应用在开发和使用过程中的技术风险。
|
||||
|
||||
通过BISC,元界提供了数字资产MST、数字身份Avatar、Oracle以及资产交易的功能,这一切都是围绕资产和人来展开的。
|
||||
|
||||
数字资产MST可以让人们获得区块链带来的点对点操作资产的优势,数字身份Avatar体现了人与人、人与资产之间的关系。
|
||||
|
||||
它可以连接到MST上,通过Avatar任何人都可以成为Oracle,Oracle可以帮助人们构建不可篡改的去中心化信誉系统,资产交易可以为MST解决基础的流动性需求。
|
||||
|
||||
人们将区块链作为基础服务植入IT系统中的过程叫做BaaS(Blockchain As A Service),BaaS是一种快速、方便构建区块链应用的方式。
|
||||
|
||||
### 2.技术特点
|
||||
|
||||
- 延续并扩展了UTXO模型,一切皆UTXO为资产和身份带来了良好的安全性。
|
||||
- 内置BISC,没有为用户提供自己编写智能合约的功能,提高了安全性,降低了多样性。
|
||||
- PoW挖矿,与以太坊的PoW挖矿算法兼容。
|
||||
- 内置了数字身份,提供了基于数字身份的域名系统,可以连接到数字资产上。
|
||||
- 默认提供HD类型的主私钥账户体系。
|
||||
- 块上限是1MB,但出块速度是33秒,所以TPS大约是比特币的18倍。
|
||||
- 提供等价于ERC20 的MST Token体系。
|
||||
|
||||
## 量子链QTUM
|
||||
|
||||
### 1.简介
|
||||
|
||||
量子链致力于开发比特币和以太坊之外的新型区块链生态,它的目标是通过自行设计,让比特币和以太坊完美地融合在一起,并通过智能合约为人们提供Dapp平台。
|
||||
|
||||
除此之外,量子链还提出了移动端Dapp策略,通过引入身份机制和Data-feed链外数据达到合规性要求,最终通过推动Dapp的普及,让传统互联网企业可以将量子链作为一个新的应用平台进行尝试。
|
||||
|
||||
量子链关注利用区块链技术进行价值传输,首次提出了VTP——Value Transfering Protocal,价值传输协议的概念。这里的价值传输协议是对标HTTP、SMTP、POP3、SSH等协议的。
|
||||
|
||||
量子链认为,在比特币之前人们一直无法在不借助第三方的情况下进行较好的点对点价值转移,比特币是运行在互联网上的一个VTP协议,随着区块链技术的发展,人与人、人与信息的交互更加多样化,未来会有更多的实体会被数字化(Tokenization)。
|
||||
|
||||
这里所说的就是资产登记,被登记完之后,肯定还会面临价值流转的问题。量子链从技术出发,提供了第一个结合比特币UTXO和以太坊EVM的区块链技术生态区来解决上述问题。
|
||||
|
||||
### 2.技术特点
|
||||
|
||||
- 基础代币QTM与比特币脚本高度兼容,兼具UTXO和账户模型的优点。
|
||||
- 与以太坊智能合约体系高度兼容的技术栈。
|
||||
- 共识算法使用了PoS3.0算法,属于经典PoS算法。
|
||||
- 提出了主控智能合约和普通智能合约的概念,通过主控合约可以引入链外数据Data-feed。
|
||||
- 通过主控合约可以提供合规性需求。
|
||||
- 提供了等价于以太坊ERC20的 QRC20 Token体系。
|
||||
|
||||
## 比原链Bytom
|
||||
|
||||
### 1.简介
|
||||
|
||||
比原链是一种多元的资产交互协议。简单来理解也是做数字资产的,不过换了种说法,理念稍不同。比原链认为在区块链上存在两种不同形态资产。
|
||||
|
||||
- 比特资产:是指区块链上原生的数字货币、数字资产,例如比特币、以太币;
|
||||
- 原子资产:对应到现实世界的资产,例如权证、权益、股息、债券、情报资讯、预测信息等。
|
||||
|
||||
人们可以通过比原链进行对上述两种资产进行登记、交换、对赌、甚至基于合约的更具复杂性的交互操作。目的是连通原子世界与比特世界,促进资产在两个世界间的交互和流转。
|
||||
|
||||
比原链采用三层架构。
|
||||
|
||||
1. 应用层对移动终端等多终端友好,方便开发者便捷开发出资产管理应用;
|
||||
1. 合约层采用创世合约和控制合约进行资产的发行和管理,在底层支持扩展的 UTXO 模型 BUTXO, 对虚拟机做了优化,采用自省机制以防止图灵完备中的死状态;
|
||||
1. 数据层使用分布式账本技术,实现资产的发行、花费、交换等操作。
|
||||
|
||||
### 2.技术特点
|
||||
|
||||
- 共识算法是PoW,属于忠实的比特币PoW党。
|
||||
- 挖矿算法采用对人工智能 ASIC 芯片友好型算法,在哈希过程中引入矩阵和卷积计算,使得矿机在闲置或被淘汰后,可用于 AI 硬件加速服务,从而产生额外的社会效益。
|
||||
- 兼容比特币UTXO模型。
|
||||
- 默认提供了基于HD的主私钥账户体系。
|
||||
- 加密模块提供了基于国密SM2、SM3标准算法。
|
||||
- 植入了隔离见证设计。
|
||||
|
||||
## 本体网络Ontology Network
|
||||
|
||||
### 1.简介
|
||||
|
||||
本体网络是原NEO项目组成员李俊创立的,不过与NEO是完全独立的项目,随着技术大咖季宙栋的加入,市值跃入TOP20。
|
||||
|
||||
本体网络是一个主打构建分布式信任体系的区块链项目,支持多链、多系统融合的协议网络,不同的链和不同的系统都可以通过本体的信任协议进行协作。
|
||||
|
||||
本体包含独立的分布式账本、P2P网络协议、模块化的共识协议组,模块化的智能合约机制几个主要模块。
|
||||
|
||||
本体的产品形式是ONTO,ONTO是基于本体的综合客户端产品、区块链搜索引擎和区块链体系的入口。
|
||||
|
||||
ONTO将帮助用户实现包括数字身份管理、数字资产管理、分布式数据交换等综合性功能,ONTO可以将数字身份与现实身份进行映射关联,用户可以利用这款产品建立自己的数字身份和多维的身份画像,通过密码学算法实现隐私保护。
|
||||
|
||||
本体主要提供了以下三种协议。
|
||||
|
||||
1. 提供分布式身份管理框架 (ONT ID),一个基于W3C的DID规范构建的去中心化的身份标识协议。
|
||||
1. 提供分布式数据交易协议 (ONT DATA),用于构建去中心化数据交易应用框架。
|
||||
1. 提供了信用评分协议(ONT Scores),支持建立开发不同的声誉评价逻辑,提供评级授权与审计功能。
|
||||
|
||||
支撑这些协议的是ONT公链,以及ONT区块链高性能可定制化框架。
|
||||
|
||||
### 2.技术特点
|
||||
|
||||
- 基于账户模型,并保留UTXO模型。
|
||||
- 共识算法采用VBFT,它是结合PoS、VRF(Verifiable Random Function)和BFT的全新共识算法。
|
||||
- 模块化的智能合约,提供WASM和NEO VM 两种。
|
||||
- 通过FPGA加速计算密集型的业务模块。
|
||||
- 多层跨链的结构设计。
|
||||
- 提供链上搜索引擎。
|
||||
|
||||
## 总结
|
||||
|
||||
今天带你了解了一些从国内发起的比较知名的区块链项目,其实还有不少区块链项目,例如公信宝、YoYow等,今天就介绍到这里,你可以进入这些项目的社区寻求更详细的资料。
|
||||
|
||||
好了,今天的问题是,你觉得做公链最大的挑战是什么?你可以给我留言,我们一起讨论。
|
||||
|
||||
参考引用:
|
||||
[https://info.ont.io/view-point/V0019/zh](https://info.ont.io/view-point/V0019/zh)
|
||||
|
||||
|
||||
196
极客时间专栏/geek/深入浅出区块链/第二章 深入区块链技术/第23讲 | 联盟链和它的困境.md
Normal file
196
极客时间专栏/geek/深入浅出区块链/第二章 深入区块链技术/第23讲 | 联盟链和它的困境.md
Normal file
@@ -0,0 +1,196 @@
|
||||
<audio id="audio" title="第23讲 | 联盟链和它的困境" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/4e/f8/4eb38dfbd275ca03f1110f6371229af8.mp3"></audio>
|
||||
|
||||
不知不觉我已经写到了深入区块链技术部分的最后一篇,今天我们就一起来聊聊联盟链。
|
||||
|
||||
其实,在2016年的时侯,联盟链是非常火热的,当时的公链还处于探索阶段,以太坊也不够成熟,这给了很多联盟链涌现的机会。所以说,从技术上来看,联盟链其实非常强劲,毫不逊色于著名的区块链项目,下面我们就一起来看看联盟链技术。
|
||||
|
||||
## 简介
|
||||
|
||||
联盟链源自于Vitalik对区块链的概念分类,是他第一次提出了联盟链的说法,联盟链的英文是Consortium Blockchain。
|
||||
|
||||
我们回顾一下联盟链。所谓联盟链,就是这个区块链具有准入许可,不像公链,任何人都可以随时进入,准入许可意味着候选节点进入区块链时需要得到已经在网络中的节点的许可。
|
||||
|
||||
所以联盟链也叫做许可链,也就是Permisson Chain,这个叫法在国外比较常见。联盟链的节点数通常不多,维护成本相比公链要低。
|
||||
|
||||
有关联盟链与公链的概念区别,它们的区别仅仅是看新加入的节点是否要经过全网中其他节点的许可,这决定了一个区块链是否开放,开放程度决定了项目生态的大小,这也是最直观的区别。
|
||||
|
||||
联盟链的技术框架很多,其中又以超级账本项目下的技术框架最为知名,应用也最为广泛,它基本代表了联盟链,所以,今天我们就重点来介绍一下超级账本项目。
|
||||
|
||||
### 超级账本HyperLedger
|
||||
|
||||
超级账本在2015年年底被发起,吸纳了众多重量级公司加入,它们包括大家耳熟能详的IBM、Intel、Accenture、日立、JP摩根、Digital Asset Holdings等公司。
|
||||
|
||||
超级账本的代码和组织结构都结构清晰、层次分明。可以说无论从声势还是实力上来说,它都可以完胜公链。
|
||||
|
||||
例如,超级账本组织是会员制的,加入超级账本需要缴纳一笔入会费,入会费决定了你的会员等级。再如,超级账本Frabric的架构设计简直就是教科书级别的,干净利落、模块清楚,几乎挑不出毛病。
|
||||
|
||||
超级账本由Linux基金会主持,宗旨是构建一个面向企业应用场景的开源分布式账本技术平台。
|
||||
|
||||
因为企业应用场景的多样性,所以超级账本包含了不只一个项目,它是由多个项目组成的。一共9个项目,其中5个是主要的技术框架,其他4个是辅助性工具。
|
||||
|
||||
它的主要技术框架分别是下面的5种。
|
||||
|
||||
1.Hyperledger Fabric :没有中文名,暂译【纺布克】,是IBM提供的,超级账本第一个项目。
|
||||
纺布克旨在用模块化架构作为开发区块链程序或解决方案的基础,允许一些组件——例如共识算法和成员管理变成即插即用的服务。
|
||||
|
||||
2.Hyperledger Sawtooth:中文名【锯齿湖】,Intel提供,是超级账本第二个项目。
|
||||
锯齿湖是一个可以创建、部署和运行分布式账本的模块化平台,基于硬件依赖的PoET共识,可以面向大型分布式验证器群,同时也比较低功耗。
|
||||
|
||||
3.Hyperledger Iroha:没有中文名,暂译【伊路哈】,由Soramitsu提供。
|
||||
伊路哈是为了将分布式账本技术简单容易地与基础架构型项目集成而设计的一个区块链框架。
|
||||
|
||||
4.Hyperledger Burrow:没有中文名,暂译【掘地者】,由Monax提供。
|
||||
掘地者提供了一个模块化的区块链客户端,提供了权限管理的智能合约虚拟机,它部分建立在以太坊虚拟机(EVM)规范的基础上。
|
||||
|
||||
5.Hyperledger Indy:没有中文名,暂译【因迪】。
|
||||
因迪是特别为去中心化的身份而建立的一种分布式账本。它提供了基于区块链或者其它分布式账本互操作来创建和使用独立数字身份的工具、代码库和可以重用的组件。
|
||||
|
||||
另外4个辅助性工具是:Cello、Composer、Explorer、Quilt,这四个辅助性工具可以对以上5个框架进行管理,例如Composer可以类比Docker中的Composer,Explorer就是区块浏览器。
|
||||
|
||||
我们不排除随着超级账本的发展,还有新的技术框架加入,当然,也可能存在既有的框架被市场淘汰。不过这些都不是本文的重点,所以我们不作过多介绍,你可以通过查阅超级账本官方网站获得更多内容。
|
||||
|
||||
### 1.纺布克Fabric
|
||||
|
||||
纺布克是由IBM提供的,它基于Go语言,前身是Openchain项目。在超级账本成立之初,Openchain的代码量就已经达到4万行了,随着项目的推进,项目成员对Openchian进行了重构,也就是我们看到的纺布克1.0版本。
|
||||
|
||||
纺布克提供了比较完备的模块化组件,如下图所示。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/89/71/89e9859c66c49c6133f17d3f6a54ed71.png" alt="">
|
||||
|
||||
我们可以看到,它的架构上分成了:成员关系管理、区块链服务、Chaincode服务三个大模块。
|
||||
|
||||
成员关系管理相当于账户和权限管理系统,区块链服务提供了区块链一样的账本结构,Chaincode服务相当于智能合约。
|
||||
|
||||
成员关系管理是基于 PKI 的成员权限管理,平台可以对接入的节点和客户端的能力进行限制。
|
||||
|
||||
区块链服务提供一个分布式账本平台,多个交易被可以被打包进一个区块中,多个区块单向链接成一条区块链。区块链代表的是账本状态机发生变更的历史过程,这与公链区别不大。
|
||||
|
||||
Chaincode包含核心的业务处理逻辑,并对外提供接口,外部通过调用Chaincode接口来改变账本数据,在纺布克中,Chaincode是运行在隔离环境中的,也就是Docker。
|
||||
|
||||
纺布克的一个可能的工作模式如下图。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/75/f7/7594a537e19a63a7940208cbca1721f7.png" alt="">
|
||||
|
||||
如果Chaincode运行在Docker中,我们按照经典的IT架构来分析,可以发现纺布克基本就是经典分布式系统的升级版,它可以提供宕机容错,可插拔的共识模块让用户自行选择是否需要拜占庭容错。
|
||||
|
||||
### 2.锯齿湖Sawtooth
|
||||
|
||||
锯齿湖也是一个高度模块化的区块链技术框架,它基于Python语言,1.0版本之后和纺布克一样,作为一套稳定的框架,它已经有了实际的应用了。
|
||||
|
||||
它是第一真正意义上提供拜占庭容错共识选项的超级账本项目,有以下四个特点。
|
||||
|
||||
1. 链上治理:利用智能合约进行投票运营成员管理彼此之间的关系。
|
||||
1. 高级交易执行引擎:可以并行处理交易的创建和验证,性能可观。
|
||||
1. 支持以太坊智能合约:兼容了以太坊智能合约技术栈。
|
||||
1. 支持主流语言编写智能合约:编写智能合约不局限Solidity,可以是Go、Javascript、Python等语言。
|
||||
|
||||
相比以上四个特点,最引人注意的其实是锯齿湖提供了一个新的共识算法,叫做PoET(Proof of Elapsed Time),它的中文译作:时间流逝证明。
|
||||
|
||||
如果你熟悉Raft共识算法的话,我们知道Raft算法是一类强Leader的共识算法,选举Leader的时候,每个节点自己倒计时(CountDown),最先数完的那个成为候选人。
|
||||
|
||||
这个过程叫做超时选举(Election Timeout)。每个节点每轮选举中得到的倒计时时间是不同的,它的代码实现为随机产生,通常是150毫秒到300毫秒。
|
||||
|
||||
PoET与上述规则类似,只是倒计时时间的产生变更为硬件依赖的,这里的硬件目前是由英特尔提供的SGX,Software Guard Extensions,它可以提供可信的程序执行环境。
|
||||
|
||||
SGX提供了一种名为Enclave的机制,它支持两个函数“CreateTimer”和“CheckTimer”。CreateTimer用于从Enclave中产生一个计时器。
|
||||
|
||||
CheckTimer会去校验这个计时器是不是由Enclave产生并验证是否已经过期。如果满足这两个条件就给该节点开具一个证明,这个证明可以被其他节点验证,验证通过则表示同意该节点成为记账节点。
|
||||
|
||||
我们看出,PoET共识算法的拜占庭容错是由SGX保证的,具有一定的硬件依赖。
|
||||
|
||||
锯齿湖官方提供了的四种工作模式:开发模式、PoET模式、PoET仿真模式以及Raft模式。
|
||||
|
||||
可以发现,锯齿湖相当于是Raft协议的变种版本,选择Raft模式使得锯齿湖可以退化成经典分布式系统。
|
||||
|
||||
### 3.掘地者Burrow
|
||||
|
||||
掘地者也是一个基于以太坊EVM的智能合约执行引擎的区块链技术框架,最初项目名叫Eris,它是基于Go语言构造的。
|
||||
|
||||
掘地者主要由下述组件组成。
|
||||
|
||||
- 共识引擎:提供了基于Tendermint PBFT算法的高性能拜占庭容错共识算法。
|
||||
- 应用程序区块链接口ABCI:为共识引擎和智能合约引擎提供接口规范。
|
||||
- 许可型以太坊虚拟机EVM:权限许可是可以通过本地安全接口强制绑定到智能合约上,其他与以太坊智能合约一样。
|
||||
- API网关:提供REST和JSON-RPC两种API接口。
|
||||
|
||||
掘地者也是模块化的分布式账本技术,提供许可型的智能合约执行环境,它也基于EVM规范。除了Tendermint PBFT共识算法,没看到与纺布克的的区别。
|
||||
|
||||
### 4.伊路哈Iroha
|
||||
|
||||
以上几个技术框架,基本都是通用技术框架,不涉及业务概念。伊路哈是第一个关注资产创建和管理的区块链平台,通过名字我们也可以发现是一个日本公司主导的项目。
|
||||
|
||||
伊路哈具有如下特征。
|
||||
|
||||
- 可以帮助人们创建和管理多样化的复杂资产,例如货币、不可分割的权利、产品序列号和专利等等;
|
||||
- 提供基于域名分类的账户管理机制,类似“子账本”系统;
|
||||
- 提供权限管理;
|
||||
- 系统本身提供验证业务逻辑规则,以及交易查询接口。
|
||||
- 相较于纺布克和掘地者是Go语言开发,伊路哈是使用C++14开发的。
|
||||
|
||||
### 5.因迪Indy
|
||||
|
||||
因迪也是一个从身份出发去构建一个分布式经济系统的技术框架。
|
||||
|
||||
因迪具有如下的特征。
|
||||
|
||||
- 基于多冗余拜占庭容错RBFT(Redundant Byzantine Fault Tolerance)实现的共识算法,叫做Plenum。
|
||||
- 意图通过构建去中心化的身份来打造分布式账本。
|
||||
- 全局唯一性的身份,无需中心化授权。
|
||||
- 基于W3C标准的身份属性和格式;
|
||||
- 提供零知识证明手段。
|
||||
|
||||
因迪与其他通用技术框架显得非常不同,对身份的研究或许会成为因迪的突破点,这点与元界的数字身份很像。
|
||||
|
||||
## BaaS与BTaaS
|
||||
|
||||
超级账本很多技术框架是可以依托云计算来帮助企业进行快速搭建的,当然IBM和微软已经开始这么干了,他们将它称之为BaaS(Blockchain As A Service)。
|
||||
|
||||
我们进一步思考,例如比特币提供了全球支付的功能,那么这种功能是否可以植入到云服务中呢?
|
||||
|
||||
答案是肯定的。对于诸多有支付需求的应用来说,自己搭建比特币节点,并且结构化区块到数据库中是非常痛苦的过程,毕竟比特币全节点提供的API有限,而我们的查询需求可能细致到交易输出和脚本签名。
|
||||
|
||||
所以,把比特币转化成PaaS服务也是另外一种BaaS思路。
|
||||
|
||||
因此,我们把原来的BaaS概念拆成了两种:
|
||||
|
||||
1. BaaS是指把公链提供的服务转化成云计算中的PaaS服务的过程;
|
||||
1. BTaaS是指把区块链技术框架转化成PaaS服务的过程。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/84/fd/84f7ed68bbc4c802dd9967ab7e5b7dfd.png" alt="">
|
||||
|
||||
这两种概念还是有较大内涵上的差别的,我使用了上图来表达,我认为BaaS是未来区块链的发展方向,BTaaS只是作为经典方案的补充。
|
||||
|
||||
## 联盟链的困境
|
||||
|
||||
超级账本系列技术框架很好地诠释了分布式账本技术走到极致是什么样子的。
|
||||
|
||||
这里也可以看出,几乎所有的超级账本项目都是技术主导,技术的强大也让他们忽视了市场的真实需求。
|
||||
|
||||
联盟链是少数节点之间的活动,它往往退化成微观经济中的博弈,所以利用联盟链构建少数节点之间的协作系统不是一个技术问题,而是变成了如何构造一个稳定的微观经济模型使得协作者可以达成帕累托改进,在这里,技术变成了次要的。
|
||||
|
||||
再好的技术工具如果不结合有效的激励和反馈机制,那么联盟链的应用落地过程似乎变得异常艰难,它很可能最后沦落为普通的分布式系统,这个分布式系统仍然是中心化的。
|
||||
|
||||
这里我再提出一个问题,为什么我们不用已经成熟的技术框架,非要用联盟链技术框架呢?这就是我认为联盟链最大的困境,它是一杆加农炮,但是并没有人来告诉我们这杆加农炮可以解决什么问题。
|
||||
|
||||
## 总结
|
||||
|
||||
今天我们重点介绍了超级账本旗下的五个联盟链技术框架,希望可以给你提供一些技术选型上的参考。随后我们又介绍了区块链即服务这一延伸概念,最后我向你分享了我对于联盟链的观点。
|
||||
|
||||
今天留给你的问题是,除了超级账本之外,还有哪些有名的联盟链技术框架呢? 你可以给我留言,我们一起讨论。感谢你的收听,我们下次再见。
|
||||
|
||||
参考引用:
|
||||
|
||||
1. [https://www.slideshare.net/ormium/architecture-of-the-hyperledger-blockchain-fabric-christian-cachin-ibm-research-zurich](https://www.slideshare.net/ormium/architecture-of-the-hyperledger-blockchain-fabric-christian-cachin-ibm-research-zurich)
|
||||
1. [http://thesecretlivesofdata.com/raft/](http://thesecretlivesofdata.com/raft/)
|
||||
1. [https://intelledger.github.io/introduction.html#proof-of-elapsed-time-poet](https://intelledger.github.io/introduction.html#proof-of-elapsed-time-poet)
|
||||
1. [https://github.com/hyperledger/burrow](https://github.com/hyperledger/burrow)
|
||||
1. [https://github.com/hyperledger/iroha](https://github.com/hyperledger/iroha)
|
||||
1. [https://github.com/hyperledger/indy-plenum/blob/master/docs/main.md](https://github.com/hyperledger/indy-plenum/blob/master/docs/main.md)
|
||||
1. [https://wiki.hyperledger.org/projects/indy](https://wiki.hyperledger.org/projects/indy)
|
||||
1. [https://github.com/hyperledger/indy-node](https://github.com/hyperledger/indy-node)
|
||||
1. [https://www.hyperledger.org/wp-content/uploads/2018/01/Hyperledger_Sawtooth_FAQ.pdf](https://www.hyperledger.org/wp-content/uploads/2018/01/Hyperledger_Sawtooth_FAQ.pdf)
|
||||
1. [https://medium.com/kokster/understanding-hyperledger-sawtooth-proof-of-elapsed-time-e0c303577ec1](https://medium.com/kokster/understanding-hyperledger-sawtooth-proof-of-elapsed-time-e0c303577ec1)
|
||||
1. [https://www.hyperledger.org/wp-content/uploads/2017/08/Hyperledger_Arch_WG_Paper_1_Consensus.pdf](https://www.hyperledger.org/wp-content/uploads/2017/08/Hyperledger_Arch_WG_Paper_1_Consensus.pdf)
|
||||
1. [http://blockchaindev.org/archives/08-on-limitation-of-private-chain.html](http://blockchaindev.org/archives/08-on-limitation-of-private-chain.html)
|
||||
|
||||
|
||||
129
极客时间专栏/geek/深入浅出区块链/第二章 深入区块链技术/第9讲 | 深入区块链技术(一):技术基础.md
Normal file
129
极客时间专栏/geek/深入浅出区块链/第二章 深入区块链技术/第9讲 | 深入区块链技术(一):技术基础.md
Normal file
@@ -0,0 +1,129 @@
|
||||
<audio id="audio" title="第9讲 | 深入区块链技术(一):技术基础" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/41/6b/418ad387e3ec53bcf51dc77f0f172c6b.mp3"></audio>
|
||||
|
||||
在“浅说区块链基础”的部分中,我概括介绍了区块链的入门知识以及区块链的应用领域,在“深入区块链技术”部分的第一篇中,我将带你一起总览下区块链的技术概要,本篇提到的所有技术内容,我们都会在后续文章中进行详细的讲解。
|
||||
|
||||
## 区块链的技术定义
|
||||
|
||||
简单来说,区块链是一个提供了拜占庭容错、并保证了最终一致性的分布式数据库;从数据结构上看,它是基于时间序列的链式数据块结构;从节点拓扑上看,它所有的节点互为冗余备份;从操作上看,它提供了基于密码学的公私钥管理体系来管理账户。
|
||||
|
||||
或许以上概念过于抽象,我来举个例子,你就好理解了。
|
||||
|
||||
你可以想象有100台计算机分布在世界各地,这100台机器之间的网络是广域网,并且,这100台机器的拥有者相不信任,那么,我们采用什么样的算法(共识机制)才能够为它提供一个可信任的环境,并且使得:
|
||||
|
||||
1. 节点之间的数据交换过程不可篡改,并且已生成的历史记录不可被篡改;
|
||||
1. 每个节点的数据会同步到最新数据,并且会验证最新数据的有效性;
|
||||
1. 基于少数服从多数的原则,整体节点维护的数据本身可以客观反映交换历史。
|
||||
|
||||
通常我们在分布式系统领域也见到过上述的要求,比如第2条就阐述了分布式系统基本要求:一致性要求;基于少数服从多数原则是为了容忍网络分区;区块链就是解决上述问题的技术方案。
|
||||
|
||||
我们结合以往讲过的内容,和将要讲的内容,先提炼一下区块链在技术上的7个特征,你先记住,我们后续会慢慢道来:
|
||||
|
||||
1. 区块链的存储基于分布式数据库;
|
||||
1. 数据库是区块链的数据载体,区块链是交易的业务逻辑载体;
|
||||
1. 区块链按时间序列化区块数据,整个网络有一个最终确定状态;
|
||||
1. 区块链只对添加有效,对其他操作无效;
|
||||
1. 交易基于非对称加密的公私钥验证;
|
||||
1. 区块链网络要求拜占庭将军容错;
|
||||
1. 共识算法能够“解决”双花问题。
|
||||
|
||||
## 区块链的类型
|
||||
|
||||
我们在讨论区块链时,通常指的是公有区块链。除此之外,还存在另外一种区块链:联盟链。
|
||||
|
||||
我们在前面的文章介绍过它。所谓联盟链,就是这个区块链具有准入许可,不像公链,任何人都可以随时进入。准入许可也就意味着候选节点进入区块链时需要得到已经在网络中的节点许可,所以联盟链也叫做许可链。
|
||||
|
||||
早期文章里可能还会涉及私有区块链的定义,其实我认为私有区块链更像是一个捏造的概念,如果是完全私有的分布式数据库,技术人员往往会有更好的选择。
|
||||
|
||||
如今云计算日趋成熟,大规模的分布式存储已经不是难题,不必在区块链这种低并发、低吞吐量的系统中折磨自己。
|
||||
|
||||
所以我们所说的区块链通常指的是公链。除了公链和联盟链的概念,还有一种区块链概念,叫作侧链。
|
||||
|
||||
侧链是一种双向挂钩技术,将主链中的代币锁定到侧链中使用。所以可以将主链看作主干道,侧链看作与主链相对独立的一条分支道,作为主链功能的低耦合拓展。
|
||||
|
||||
## 区块链的核心技术组成
|
||||
|
||||
无论是公链还是联盟链,至少需要四个模块组成:P2P网络协议、分布式一致性算法(共识机制)、加密签名算法、账户与存储模型。
|
||||
|
||||
### 1. P2P网络协议
|
||||
|
||||
P2P网络协议是所有区块链的最底层模块,负责交易数据的网络传输和广播、节点发现和维护。
|
||||
|
||||
通常我们所用的都是比特币P2P网络协议模块,它遵循一定的交互原则。比如:初次连接到其他节点会被要求按照握手协议来确认状态,在握手之后开始请求Peer节点的地址数据以及区块数据。
|
||||
|
||||
这套P2P交互协议也具有自己的指令集合,指令体现在在消息头(Message Header)的命令(command)域中,这些命令为上层提供了节点发现、节点获取、区块头获取、区块获取等功能。
|
||||
|
||||
这些功能都是非常底层、非常基础的功能。如果你想要深入了解,可以参考比特币开发者指南中的Peer Discovery的章节。
|
||||
|
||||
### 2. 分布式一致性算法
|
||||
|
||||
在经典分布式计算领域,我们有Raft和Paxos算法家族代表的非拜占庭容错算法,以及具有拜占庭容错特性的PBFT共识算法。
|
||||
|
||||
如果从技术演化的角度来看,我们可以得出一个图,其中,区块链技术把原来的分布式算法进行了经济学上的拓展。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/da/ab/da733238ba80f4b45ddfa5f5f005f3ab.png" alt="">
|
||||
(图片来自网络)
|
||||
|
||||
在图中我们可以看到,计算机应用在最开始多为单点应用,高可用方便采用的是冷灾备,后来发展到异地多活,这些异地多活可能采用的是负载均衡和路由技术,随着分布式系统技术的发展,我们过渡到了Paxos和Raft为主的分布式系统。
|
||||
|
||||
而在区块链领域,多采用PoW工作量证明算法、PoS权益证明算法,以及DPoS代理权益证明算法,以上三种是业界主流的共识算法,这些算法与经典分布式一致性算法不同的是融入了经济学博弈的概念,下面我分别简单介绍这三种共识算法。
|
||||
|
||||
<li>**PoW**:通常是指在给定的约束下,求解一个特定难度的数学问题,谁解的速度快,谁就能获得记账权(出块)权利。这个求解过程往往会转换成计算问题,所以在比拼速度的情况下,也就变成了谁的计算方法更优,以及谁的设备性能更好。比特币本身的演化很好地诠释了这个问题,中本聪设计的思路本来是由CPU计算。随着市场发展,人们发现GPU也可以参与其中,而且效率可以达到十倍百倍,现在,这项工作基本以ASIC专业挖矿芯片为主。
|
||||
</li>
|
||||
<li>** PoS**:这是一种股权证明机制,它的基本概念是产生区块的难度应该与你在网络里所占的股权(所有权占比)成比例,目前有三个版本PoS1.0、PoS2.0、PoS3.0。它实现的核心思路是:使用你所锁定代币的币龄(CoinAge)以及一个小的工作量证明,去计算一个目标值,当满足目标值时,你将可能获取记账权。
|
||||
</li>
|
||||
<li>**DPoS**:简单来理解就是将PoS共识算法中的记账者转换为指定节点数组成的小圈子,而不是所有人都可以参与记账,这个圈子可能是21个节点,也有可能是101个节点。这一点取决于设计,只有这个圈子中的节点才能获得记账权。这将极大地提高系统的吞吐量,因为更少的节点也就意味着网络和节点的可控。
|
||||
</li>
|
||||
|
||||
## 3.加密签名算法
|
||||
|
||||
由于我不是密码学专业出身,所以这里我将会以介绍为主。
|
||||
|
||||
在区块链领域,哈希算法是应用得最多的算法。哈希算法具有抗碰撞性、原像不可逆、难题友好性等特征。
|
||||
|
||||
其中,难题友好性正是众多PoW币种赖以存在的基础,在比特币中,SHA256算法被用作工作量证明的计算方法,也就是我们所说的挖矿算法。
|
||||
|
||||
而在莱特币身上,我们也会看到Scrypt算法,该算法与SHA256不同的是,需要大内存支持。
|
||||
|
||||
而在其他一些币种身上,我们也能看到基于SHA3算法的挖矿算法。以太坊使用了Dagger-Hashimoto算法的改良版本,并命名为Ethash,这是一个IO难解性的算法。
|
||||
|
||||
当然,除了挖矿算法,我们还会使用到RIPEMD160算法,主要用于生成地址,众多的比特币衍生代码中,绝大部分都采用了比特币的地址设计。
|
||||
|
||||
除了地址,我们还会使用到最核心的,也是区块链Token系统的基石:公私钥密码算法。
|
||||
|
||||
在比特币大类的代码中,基本上使用的都是ECDSA。ECDSA是ECC与DSA的结合,整个签名过程与DSA类似,所不一样的是签名中采取的算法为ECC(椭圆曲线函数)。
|
||||
|
||||
从技术上看,我们先从生成私钥开始,其次从私钥生成公钥,最后从公钥生成地址,以上每一步都是不可逆过程,也就是说无法从地址推导出公钥,从公钥推导到私钥。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/d9/9b/d94a096cc3a6f127bf7a086128f08b9b.png" alt="">
|
||||
|
||||
(图来自《精通比特币》一书)
|
||||
|
||||
## 4. 账户与交易模型
|
||||
|
||||
从一开始的定义我们知道,仅从技术角度可以认为区块链是一种分布式数据库,那么,多数区块链到底使用了什么类型的数据库呢?
|
||||
|
||||
我在设计元界区块链时,参考了多种数据库,有NoSQL的BerkelyDB、LevelDB,也有一些币种采用基于SQL的SQLite。
|
||||
|
||||
这些作为底层的存储设施,多以轻量级嵌入式数据库为主,由于并不涉及区块链的账本特性,这些存储技术与其他场合下的使用并没有什么不同。
|
||||
|
||||
区块链的账本特性,通常分为UTXO结构以及基于Account-Balance结构的账本结构,我们也称为账本模型。UTXO是“unspent transaction input/output”的缩写,翻译过来就是指“未花费的交易输入输出”。
|
||||
|
||||
这个区块链中Token转移的一种记账模式,每次转移均以输入输出的形式出现。而在Balance结构中,是没有这个模式的。
|
||||
|
||||
## 总结
|
||||
|
||||
今天我介绍了区块链的技术概念、分类以及核心技术组成,相信你对区块链技术有了一个初步的了解。
|
||||
|
||||
区块链虽然是一个新兴的概念,但它依赖的技术一点也不新,如非对称加密技术、P2P网络协议等。好比乐高积木,积木块是有限的,但是不同组合却能产生非常革新的事物。
|
||||
|
||||
所以区块链也成了一个新的领域,基本上现有的很多概念,都能被“区块链化”,那么你能否在自己的领域,想到“区块链化”哪些概念呢?你可以给我留言,我们一起讨论。
|
||||
|
||||
感谢你的收听,我们下期再见。
|
||||
|
||||
参考链接:
|
||||
|
||||
1. [https://bitcoin.org/en/developer-guide#peer-discovery](https://bitcoin.org/en/developer-guide#peer-discovery)
|
||||
1. [https://en.bitcoin.it/wiki/Protocol_documentation](https://en.bitcoin.it/wiki/Protocol_documentation)
|
||||
1. [https://en.bitcoin.it/wiki/Network](https://en.bitcoin.it/wiki/Network)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user