This commit is contained in:
louzefeng
2024-07-09 18:38:56 +00:00
parent 8bafaef34d
commit bf99793fd0
6071 changed files with 1017944 additions and 0 deletions

View 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&lt;CONNECTED,PREFERRED&gt;
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/)

View File

@@ -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这样的经典共识算法呢你可以给我留言我们一起讨论。
感谢你的收听,我们下期再见。

View 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比如字符串&quot;geekbang1234&quot;nonce就是1234我们要找到符合条件的nonce。
我们以Python代码作为示例。
```
#!/usr/bin/env python
import hashlib
def main():
base_string = &quot;geekbang&quot;
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(&quot;0000&quot;):
print pow_hash
print &quot;nonce: %s scan times: %s&quot; % (nonce, count)
break
nonce = nonce + 1
if __name__ == &#39;__main__&#39;:
main()
```
代码中,我规定了基础字符串是&quot;geekbang&quot;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挖矿算法ETHASHETHASH是Dagger-Hashimoto的修改版本它是典型的内存困难型挖矿算法。直到如今也没有芯片厂商设计出挖矿芯片。
正如我们上文所说,因为工作量证明要求的组件从计算资源转变为内存资源,而对内存的高要求使得矿工必须加内存。
在专业矿机上加一块内存的收益与在GPU上加一块内存获得的收益是差不多的所以厂商并没有研发内存困难型专业矿机的动力没有专业矿机的出现这从某种程度上也缓解了算力中心化的问题。
## PoW的优势和劣势
PoW共识的内在优势在于可以稳定币价因为在PoW币种下矿工的纯收益来自Coinbase奖励减去设备和运营成本成本会驱使矿工至少将币价维持在一个稳定水平所以攻击者很难在短时间内获得大量算力来攻击主链。
PoW共识的外在优势是目前它看起来依然是工业成熟度最高的区块共识算法,所以在用户信任度上、矿工基础上都有很好的受众。
PoW共识最大的缺点是非常消耗计算资源耗电耗能源这一点也一直为人们所诟病。因为每次产生新的区块都会让相当一部分工作量证明白白浪费了也就是将计算资源浪费了。
目前来看这个是无解的只要是PoW共识一定会遇到计算资源浪费的问题。不过人们也想了一些改进方案早期如素数币近期有比原币它们都号称深度学习友好型的工作量证明方法。
从理论上来看PoW会一直有51%算力攻击的问题即攻击者只需要购买超过全网51%算力设备,即可发起“双花攻击”,甚至“重放攻击”等多种高收益攻击,这个问题目前没有解决方案。
除了51%攻击PoW共识还有自私挖矿的问题自私挖矿是一种特殊的攻击类型不会影响区块链正常运转但是会形成矿霸间接造成51%攻击,我们就曾经遇到过这样的自私挖矿攻击。
PoW共识机制是一种简单粗暴的共识算法它不要求高质量的P2P网络资源它可以为公链提供稳定有效的记账者筛选机制。同时它也面临了挖矿中心化严重的问题这也促使人们研究出了新的共识机制我们留到下一篇讲解。
## 总结
今天我介绍了PoW工作量证明并且使用Python语言演示了一遍基于SHA256的挖矿算法工作过程又介绍了发展历程和算法分类最后提到了PoW的优势和缺陷。相信你对PoW机制的理解可以更加深入了。
PoW工作量证明的挖矿过程是否可以替换成有意义的算法呢历史上是否有过类似创新你可以调查一下我们一起分享。

View 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) &lt; Target**
从公式中我们可以看到PoW下所有矿工的目标值是一样的只要计算结果哈希小于目标值即可简化来看就是前导0的个数。
而在PoS系统中这个公式变更为
**Hash (block_header) &lt; Target * CoinAge**
我们可以看出多引入了一个变量叫做CoinAge也就是币龄这里就有意思了。
这个变量为会造成每个矿工看到的目标值不一样,如果你的币龄越大,也就意味着你的获得答案越容易。这里的Target与PoW一致与全网难度成反比用来控制出块速度的。
例如当前全网的目标是4369A矿工的输入的币龄是15那么A矿工的目标值为65535换算成十六进制就是0xFFFF完整的哈希长度假设是8个字节也就是0x0000FFFF。
而B矿工比较有钱他输入的币龄是240那么B矿工的目标值就是0x000FFFFF。你如果仔细观察肯定会发现相比A矿工的目标值B直接少了一个零。即如下
- A 矿工 Hash( block_header ) &lt; 0x0000FFFF
- B 矿工 Hash( block_header ) &lt; 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共识机制呢你可以给我留言我们一起讨论感谢你的收听我们下期再见。

View 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的精髓。
我们在前面的文章中曾简单提过BMBM的本名是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)

View 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经过哈希运算后返回给你固定长度的数据hz叫做原像h是哈希结果又称作“数据指纹”z可选的数据集合构成了X。
哈希算法具有下面的4种特性。
1. **原像不可逆。**原像不可逆是指对于任意给定的h都无法依据h自身的信息推导出z。
1. **难题友好性。**难题友好性通俗的理解就是如果要得到难题答案你只能暴力枚举没有比这更好的方法。在h = HASH( X | z )中从h无法推导出z只能不断地计算尝试那么z所在的数值集合构成了XX的大小是哈希算法的安全因子之一。
1. **发散性。**发散性是指对于任意的z即使我们只改动非常少的信息量例如改动1个比特位生成z&#39;那么HASH(z) 与 HASH(z&#39;) 就是两个大相径庭的结果,完全不相似。
1. **抗碰撞性。**抗碰撞性是指对于任意两个不相同的z那么他们对应的h值也不同。如果对于任意的 y 不等于 z则 HASH(y) 不等于 HASH(z)满足上述定义哈希特性的算法我们也称作具有严格抗碰撞性。如果我们任意给定一个z你都无法找到另外一个z&#39;使得其值也等于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 = [
{&quot;prev_block_hash&quot;:&quot;0000000000000000000000000000000000000000000000000000000000000000&quot;, &quot;content&quot;:&quot;genesis block:A pay C 12.3 BTC&quot;},
{&quot;prev_block_hash&quot;:&quot;to_be_hashed&quot;, &quot;content&quot;:&quot;2nd block:C pay B 2.0 BTC&quot;},
{&quot;prev_block_hash&quot;:&quot;to_be_hashed&quot;, &quot;content&quot;:&quot;3th block:transactions...&quot;},
{&quot;prev_block_hash&quot;:&quot;to_be_hashed&quot;, &quot;content&quot;:&quot;4th block:transactions...j&quot;},
{&quot;prev_block_hash&quot;:&quot;to_be_hashed&quot;, &quot;content&quot;:&quot;5th block:transactions...&quot;}
]
# 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[&quot;content&quot;] + prev_block_header[&quot;prev_block_hash&quot;]
header[&quot;prev_block_hash&quot;] = hashlib.sha256(target_buffer).hexdigest()
print header
index = index + 1
if __name__ == &#39;__main__&#39;:
main()
```
我们可以直接得到结果这是一个典型的哈希指针链表每一个区块的prev_block_hash域指向上一个区块哈希。
```
{&#39;content&#39;: &#39;genesis block:A pay C 12.3 BTC&#39;, &#39;prev_block_hash&#39;: &#39;0000000000000000000000000000000000000000000000000000000000000000&#39;}
{&#39;content&#39;: &#39;2nd block:C pay B 2.1 BTC&#39;, &#39;prev_block_hash&#39;: &#39;01279c1208a8eca3d4a47a123119b04f1dcc592c818aace2715b2c418b38822a&#39;}
{&#39;content&#39;: &#39;3th block:transactions...&#39;, &#39;prev_block_hash&#39;: &#39;6d96c220b22371dc1d2b3549da42bd3ea2191f07f18112bf195bc6675bbc6b97&#39;}
{&#39;content&#39;: &#39;4th block:transactions...j&#39;, &#39;prev_block_hash&#39;: &#39;9e41c61fa151320145a56a38e85c01b8c025729614f4c10596d99068ea0b3395&#39;}
{&#39;content&#39;: &#39;5th block:transactions...&#39;, &#39;prev_block_hash&#39;: &#39;34f002b445a38fa7402e590629e76943060ffc4de96b1b9bc6b0f564e5a7bc72&#39;}
```
如果我们将第二块中的content从&quot;C pay B 2.1 BTC&quot; 修改为 &quot;C pay B 2.0 BTC&quot;,那么我们将得到如下结果,我们可以发现从第三个块往后所有的块指向的前一个区块的哈希都不再与上面的一致。
```
{&#39;content&#39;: &#39;genesis block:A pay C 12.3 BTC&#39;, &#39;prev_block_hash&#39;: &#39;0000000000000000000000000000000000000000000000000000000000000000&#39;}
{&#39;content&#39;: &#39;2nd block:C pay B 2.0 BTC&#39;, &#39;prev_block_hash&#39;: &#39;01279c1208a8eca3d4a47a123119b04f1dcc592c818aace2715b2c418b38822a&#39;}
{&#39;content&#39;: &#39;3th block:transactions...&#39;, &#39;prev_block_hash&#39;: &#39;f91faad6b874fb97a20ad9cbc57ef1302a431a2cce4ac5efe28a64b353526849&#39;}
{&#39;content&#39;: &#39;4th block:transactions...j&#39;, &#39;prev_block_hash&#39;: &#39;99d17dfe9a9fab68cffd6a82bc3786fe3c2d3165f1fba30b3f2ffc418c97fc8b&#39;}
{&#39;content&#39;: &#39;5th block:transactions...&#39;, &#39;prev_block_hash&#39;: &#39;d2f42291ef0811e5babc1d38ca8019ee457f84b323a3d549a04b6a4535357d7f&#39;}
```
以上我们构造了一个极简的区块链的基本结构,区块头描述了一个区块的基本信息,在实际应用中,里面通常包含了下面的几个内容。
<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/)

View File

@@ -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万 --&gt; 张三 10万<br />
 <br>        --&gt; 村长 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的前向交易是TX2TX2中的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数组里的意思就是前向输出作为本次的输入。
```
{
&quot;hash&quot; : &quot;89e80e14db07c4904a57e2c1efb689bccbbf43942103c1a92166d5c0f27ea3d2&quot;,
&quot;height&quot; : 1093399,
&quot;inputs&quot; :
[
{
&quot;address&quot; : &quot;MLWtmjwCtmK44FMwJMSfAkHaEvnnb2N6HX&quot;,
&quot;previous_output&quot; :
{
&quot;hash&quot; : &quot;770a72f35d3e3a78bd468949bad649f03b241cf7e2a84cc2d6fdabacdcc47f06&quot;,
&quot;index&quot; : 0
},
&quot;script&quot; : &quot;[ 304402202b21d7a79276985dc99777b70fd5095796dad58f35e29a019d2cb6cca5df481802205ffab088a6047f5b6382ba02a0eed4e78ab7950fe264d3774e8b0b357a7593d101 ] [ 03ea3462dc01e7b5569e89737211887035f8f1e99e1fe4332181d83daccaa6d917 ]&quot;,
&quot;sequence&quot; : 4294967295
}
],
&quot;lock_time&quot; : &quot;0&quot;,
&quot;outputs&quot; :
[
{
&quot;address&quot; : &quot;MGz9yjLLn4AqyraRjSpiP2GmTWKnT3yfiL&quot;,
&quot;attachment&quot; :
{
&quot;type&quot; : &quot;etp&quot;
},
&quot;index&quot; : 0,
&quot;locked_height_range&quot; : 0,
&quot;script&quot; : &quot;dup hash160 [ 63ab0013d183f2592e4b46a358df01e88a09c0b8 ] equalverify checksig&quot;,
&quot;value&quot; : 45000000000
},
{
&quot;address&quot; : &quot;MLWtmjwCtmK44FMwJMSfAkHaEvnnb2N6HX&quot;,
&quot;attachment&quot; :
{
&quot;type&quot; : &quot;etp&quot;
},
&quot;index&quot; : 1,
&quot;locked_height_range&quot; : 0,
&quot;script&quot; : &quot;dup hash160 [ 8a63941b392771c40f1c15e4374808f6bb464cba ] equalverify checksig&quot;,
&quot;value&quot; : 118082150283
}
],
&quot;version&quot; : &quot;2&quot;
}
```
我们再看看比特币上的例子:
<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或账户模型是否引发过比较严重的使用缺陷呢你可以给我留言我们一起讨论感谢你的收听我们下期再见。

View 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比如石墨烯系列的DPOSRipple的共识。
如果我们把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的方案呢各有什么样的优劣你可以给我留言我们一起讨论。
感谢你的收听,我们下期再见。

View 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模型也不同于银行账户它是由以太坊开发者设计了自己的账户模型。
以太坊上的账户有两种类型第一类叫做合约账户CAContracts Accounts)第二类叫做外部账户EOAExternally Owned Accounts
简单理解就是CA是智能合约代码用的账户EOA是人用的账户所以CA可以存储并执行智能合约代码它的智能被EOA激活它也不保存和存储私钥合约账户可以调用其他合约。
EOA则是人们直接控制的账户可以存储以太币可以发送交易到合约账户触发既定的逻辑。EOA账户由公钥标识由对应的私钥控制。
当合约账户被调用时存储其中的智能合约可以在矿工处的虚拟机中自动执行并消耗Gas如果Gas不足则会触发“Out of Gas”异常被终止执行。
无论是CA还是EOA在以太坊内部都被看做状态对象state objects意思就是说这些账户都有自己的状态EOA具有以太币余额的状态而CA除了余额还多了合约存储状态。
### 3.以太币和Gas
Gas是执行智能合约操作的燃料智能合约的每一个步骤都会消耗GasGas是由以太坊的平台代币以太币转化而来最小单位是wei1ETH 相当于 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)

View 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-ethereumGo语言、ParityRust语言、Cpp-ethereumC++语言、Ethereum-libJavascript)、EthererumJ(Java语言)、PyethappPython语言),基本涵盖了主流编程语言。
<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搭建一条属于自己的以太坊区块链也就是以太坊私链。
怎么搭建呢?其实很简单,只需要修改配置文件和一些运行参数即可。
```
{
&quot;config&quot;: {
&quot;chainId&quot;: 98,
&quot;homesteadBlock&quot;: 0,
&quot;eip155Block&quot;: 0,
&quot;eip158Block&quot;: 0
},
&quot;difficulty&quot;: &quot;200000000&quot;,
&quot;gasLimit&quot;: &quot;2100000&quot;,
&quot;alloc&quot;: {
&quot;7df9a875a174b3bc565e6424a0050ebc1b2d1d82&quot;: { &quot;balance&quot;: &quot;300000&quot; },
&quot;f41c74c9ae680c1aa78f42e5647a62f353b7bdde&quot;: { &quot;balance&quot;: &quot;400000&quot; }
}
}
```
然后执行:
```
$ 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 &#39;helloWorld&#39;;
}
}
```
执行 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二进制数据是用十六进制表示的。
```
&gt;code=&quot;0x6060604052341561000f57600080fd5b6101578061001e6000396000f300606060405260043610610041576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063942ae0a714610046575b600080fd5b341561005157600080fd5b6100596100d4565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561009957808201518184015260208101905061007e565b50505050905090810190601f1680156100c65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100dc610117565b6040805190810160405280600a81526020017f68656c6c6f576f726c6400000000000000000000000000000000000000000000815250905090565b6020604051908101604052806000815250905600a165627a7a72305820fcce0b6910e479539e4796b7d56620a6f90e03ba47449c843bec54958f68bf700029&quot;
&gt;abi=[{&quot;constant&quot;:false,&quot;inputs&quot;:[],&quot;name&quot;:&quot;renderHelloWorld&quot;,&quot;outputs&quot;:[{&quot;name&quot;:&quot;&quot;,&quot;type&quot;:&quot;string&quot;}],&quot;payable&quot;:false,&quot;stateMutability&quot;:&quot;nonpayable&quot;,&quot;type&quot;:&quot;function&quot;}]
```
你可以在控制台分别执行,由于结果比较长,这里就不放出来了。
```
// 这一步解锁账户,用于方便部署合约
&gt;personal.unlockAccount(&quot;0xf8f7ff845596f0bab1e973859bfcaec6cd2a82ab&quot;)
// 使用上述定义的abi变量生成合约信息
&gt;myHelloWorld=eth.contract(abi)
// 注入code信息激活合约
&gt;contract=myHelloWorld.new({from:&quot;0xf8f7ff845596f0bab1e973859bfcaec6cd2a82ab&quot;,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)

View 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是一个交易平台的基本需求。
其次,比特股是去中心化的交易平台。目前流行的中心化数字货币交易平台最大的问题是资金管理系统和撮合系统都由同一家控制的。
然而在传统的证券交易领域,证券登记和交易撮合是两个不同的主体,他们之间是协作关系,共同受到证券会的管辖。
所以,如果你的数字货币存在中心化交易平台,你的交易撮合也受它来控制,这里的交易撮合指的是一个交易双方通过挂出买单和卖单,系统完成撮合匹配直至最终成交的过程。
由于以上的这一切都是不透明的,这里面就有很多的不确定因素。
比如交易平台跑路风险、黑客攻击、资产莫名其妙丢失,或者撮合的过程中,交易对手方是谁,是否有内幕交易。这些情况都会带来较大的风险。
## 比特股的两个机制
那么比特股是如何设计中心化交易所来避免上述风险的呢?
比特股作为一个去中心化的交易所,它有两个机制可以避免上述的风险。
第一、资金出入是由承兑商来支持的,人人都可以成为承兑商,也就是人人承兑;
第二、锚定机制提供了稳定货币的出入金过程,锚定机制也保证了比特股的出入资金和交易撮合是分离的,避免了中心化交易平台的弊端。
这个过程可以简述为:法币&lt;&gt;锚定资产(系统内置货币)&lt;&gt;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按照11兑换的。而人人承兑货币其实就是提供了bitCNY和真正人民币之间的相互转换。
它的机制上有点类似那个比特币的场外交易。所谓场外交易,就是没有中心化撮合中介,交易双方自行议价成交。
例如,我想要买比特币,就可以找到一个专门的承兑商,直接把这个钱支付给交易商,然后承兑商再把比特币支付给我。这部分的内容,后面我们讲数字货币交易所的时候会和你详细讲解。
人人承兑在逻辑上差不多它提供了一个CNY法币和bitCNY的兑换手段实际上就是让法币和比特股系统内置货币的交换能够进行,而且是去信任的进行。
所以从资金托管的角度来看,比特股与中心化交易所很大的区别,比如你在一个交易所里充值,你只能信任这个交易所在保管你的钱,在你要提现的时候,你只能信任交易所愿意让你提出。
但是人人承兑的就不一样了人人承兑是你从A承兑商获取bitCNY你可以找B承兑商再换成人民币不需要只在同一个地方兑换。
因此一个人此时有充值的需求,过一段时间可能就有提现的需求,所以实际上每个人都可以成为承兑商,我可以是买家也可以是卖家,交易角色的转换可以让市场更灵活。当然市场上也有专门提供充值和提现服务的 “承兑商”,这些承兑商收取手续费来盈利。
但是,不是所有的中心化风险都可以通过技术解决,人与人的信任问题没有一劳永逸的解决办法,即使你们当面交易也有可能遇到对方欺诈的行为。
我们只能说CNY法币与bitCNY锚定之后的充值和提现相对更安全人人承兑提供了一种有效的机制缩短了出金入金的周期提升了安全性如果资金在比特股系统之内整个使用期间也没有人能威胁到你的资产。
### 2.锚定机制
锚定机制是一种去中心化的抵押机制。我们刚才提到了比特股系统内置了多种货币它锚定了多数法币例如bitCNY、bitUSD、bitEUR等等这些系统内置货币是可以与CNY、USD、EUR按照11兑换的。
系统内置货币的发行商是系统自身发行给抵押了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-UIBitshares-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>

View File

@@ -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==&amp;mid=2247483719&amp;idx=1&amp;sn=c225cd7ed63434b24255e5bc35b11622&amp;chksm=fe0ee406c9796d1009ff002712fc9019cf4b2373cac89b28e0d8f7dbfde478648436db9a1fe3&amp;scene=21#wechat_redirect)
</li>
<li>[V神回应BM你说的没错但我必须要提醒你](https://mp.weixin.qq.com/s?__biz=MzU5MzQ5MDk5MA==&amp;mid=2247483727&amp;idx=1&amp;sn=09819643108cee1fdf117958b4963916&amp;chksm=fe0ee40ec9796d18dc4a07240c94b3cd1fb1c9a00234861e057ed990502fcf349e0668668c6a&amp;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>

View 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
总体思路是总结人与人、人与资产之间的关系把总结后的通用需求抽象成模型然后做到区块链底层供使用者方便使用这种方式我们叫做BISCBuit-in Smart Contract内置智能合约它可以降低商业应用在开发和使用过程中的技术风险。
通过BISC元界提供了数字资产MST、数字身份Avatar、Oracle以及资产交易的功能这一切都是围绕资产和人来展开的。
数字资产MST可以让人们获得区块链带来的点对点操作资产的优势数字身份Avatar体现了人与人、人与资产之间的关系。
它可以连接到MST上通过Avatar任何人都可以成为OracleOracle可以帮助人们构建不可篡改的去中心化信誉系统资产交易可以为MST解决基础的流动性需求。
人们将区块链作为基础服务植入IT系统中的过程叫做BaaSBlockchain As A ServiceBaaS是一种快速、方便构建区块链应用的方式。
### 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网络协议、模块化的共识协议组模块化的智能合约机制几个主要模块。
本体的产品形式是ONTOONTO是基于本体的综合客户端产品、区块链搜索引擎和区块链体系的入口。
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)

View 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中的ComposerExplorer就是区块浏览器。
我们不排除随着超级账本的发展,还有新的技术框架加入,当然,也可能存在既有的框架被市场淘汰。不过这些都不是本文的重点,所以我们不作过多介绍,你可以通过查阅超级账本官方网站获得更多内容。
### 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等语言。
相比以上四个特点最引人注意的其实是锯齿湖提供了一个新的共识算法叫做PoETProof of Elapsed Time它的中文译作时间流逝证明。
如果你熟悉Raft共识算法的话我们知道Raft算法是一类强Leader的共识算法选举Leader的时候每个节点自己倒计时CountDown最先数完的那个成为候选人。
这个过程叫做超时选举Election Timeout)。每个节点每轮选举中得到的倒计时时间是不同的它的代码实现为随机产生通常是150毫秒到300毫秒。
PoET与上述规则类似只是倒计时时间的产生变更为硬件依赖的这里的硬件目前是由英特尔提供的SGXSoftware 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
因迪也是一个从身份出发去构建一个分布式经济系统的技术框架。
因迪具有如下的特征。
- 基于多冗余拜占庭容错RBFTRedundant Byzantine Fault Tolerance实现的共识算法叫做Plenum。
- 意图通过构建去中心化的身份来打造分布式账本。
- 全局唯一性的身份,无需中心化授权。
- 基于W3C标准的身份属性和格式
- 提供零知识证明手段。
因迪与其他通用技术框架显得非常不同,对身份的研究或许会成为因迪的突破点,这点与元界的数字身份很像。
## BaaS与BTaaS
超级账本很多技术框架是可以依托云计算来帮助企业进行快速搭建的当然IBM和微软已经开始这么干了他们将它称之为BaaSBlockchain 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)

View 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)