区块链与区块链平台的工作流程

创块纪

中本聪说,要有区块链,就有了区块链
中本聪看区块链是好的,就在创世区块上留下了天启"The Times 03/Jan/2009 Chancellor on brink of second bailout for banks"

指路牌

  • 区块链是什么?
  • 区块链的历史
  • 区块链平台(y以太坊为例)的工作流程

背景

近来工作上有需要去调研了一下以太坊,心里很是开心总算可以揭开附带n多光环,宣传的天花乱坠的区块链技术。调研是从以太坊切入的,由于沉迷技术无法自拔,一开始完全忽略了调研之初的business的目的,于是又重新调研了一番,将区块链技术诞生到现在的前世今生都看了一遍,并且和研究生阶段专门从事区块链领域研究的同事Even师兄请教了甚多,最终得到了这篇文章。

从结果上来讲,揭开区块链技术的面纱之后内心的想法多少有点失望吧,因为和软文宣传的功能和效果还是有差距的,一种理想和现实的落差感。毫无疑问,区块链技术的伟大的,只是现阶段尚且年轻,其前景和发展有待观察,用Even师兄的一句描述区块链现状就是"blockchain is blocked"。但无论如何还是学到了很多东西。

声明一点:我并不是一个区块链领域的专家,只是阅读了很多blog,整理和实践,然后得到了一下的整体认知,如有错误欢迎指出讨论。

名词辨析

区块链与区块链平台

就像很多人分不清SAP与ERP的关系一样,这种将一个东西做到极致以至于成为代名词导致的名词概念模糊,很多时候会误导初学者,所以第一步,我们先区分两个重要的名词概念:区块链 and 区块链平台

说起区块链我们肯定会首先想到比特币,业内人士可能还会想到以太坊、Hypeledger,EOS等,所以他们和之间到底是什么关系呢?

区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式,本质上是一个去中心化的数据库 (分布式数据库)
区块链平台:如以太坊, 是一个开源的有智能合约功能的公共区块链平台. 区块链平台不仅包含有一个公共的区块链分布式数据库, 同时还有其他组成部分。

至于各种币,是区块链技术应用的产物,所以"区块链 != 数字货币",然后区块链本质是一种数据库,区块链平台是将区块链技术"封装"成平台能让开发者参与进来让区块链技术应用到更多的领域。所以,区块链技术不能帮忙分析数据,不具有AI的功能。

区块链编年史

首先通过区块链技术的历史来了解一下其发展阶段:(该部分用处不大,可快速掠过)

JouyPub – 区块链发展历程

史前纪元 理论知识的铺垫

  • 1976年,Bailey W. Diffie、Martin E. Hellman论文《密码学的新方向》
  • 1976年,哈耶克《货币的非国家化》
  • 1977年,RSA算法诞生 1980年,Merkle Ralf提出了Merkle-Tree这种数据结构和相应的算法
  • 1982年,Lamport提出拜占廷将军问题
  • 1985年,Koblitz和Miller各自独立提出了著名的椭圆曲线加密(ECC)算法。
  • 1997年,HashCash方法,也就是第一代POW(Proof of Work)算法出现了
  • 1998年,密码学货币的完整思想终于破茧而出,戴伟(Wei Dai)、尼克·萨博同时提出密码学货币的概念
  • 1999年~2001年,Napster、EDonkey 2000和BitTorrent分别先后出现,奠定了P2P网络计算的基础。
  • 2001年,NSA发布了SHA-2系列算法,其中就包括目前应用最广的SHA-256算法

此阶段为理论知识的储备阶段, 为后续区块链技术的诞生埋下伏笔.

区块链1.0 代表产物:比特币

  • 2008年 中本聪《比特币:点对点的电子现金系统》
  • 2019年 中本聪 创始区块 “Chancellor on brink of second bailout for banks”
  • 2010年 第一个矿场Slush发明了多个节点合作挖矿的方式
  • 2011年 比特币官方有正式记载的第一个版本:0.3.21发布
  • 2013年 比特币发布了0.8的版本,完善了比特币节点本身的内部管理、网络通讯的优化

区块链1.0时代的特征就是只用于发币, 交易和记账, 但区块链平台已具有雏形. 区块链平台具有去“中间人”的高度可信性, 因此具有拓展到其他行业的潜力, 所谓区块链时代的进步过程, 也是区块链技术拓展应用领域的过程.

此阶段是“one chain one coin” 的时代, 这个时代的区块链主要就是发币, 每一种数字货币都会创造一条链, 而后续的数字货币都是通过过修改比特币源代码的参数而来的, “山寨币” 也是这个时代的产物: “比特金、莱特银、元宝同”.(简书 – JouyPub)

区块链2.0 代表产物:以太坊

  • 2013年 Vitalik Buterin提出以太坊的概念
  • 2014年 以太坊通过ICO众筹开始快速发展
  • 2015年 以太坊正式版本发布

此阶段拓展了区块链的应用范围, 从单纯的发币拓展到金融领域.
智能合约的出现是一个重大突破, 智能合约允许自定义业务流程,同时以太坊允许用户在其上发布智能合约, 也因此扩大了开发群体, 让广大开发者可在其上部署自己的应用. 以太坊让区块链成为了一个通用平台.
智能合约: 就是通过代码编写业务细节, 部署到以太坊后将不可删除修改, 将强制执行.

区块链3.0 代表产物 : Hyperledger

  • 2011年 莱特比诞生 scrypt 应用
  • 2015年 Linux基金会宣布Hyperledger项目启动
  • 2016年 创始成员确定

超越金融领域的区块链, 将区块链的应用范围扩展到社会领域的方方面面, 如身份认证、公正、物流、域名、投票、签证等.

根据定义,个人觉得以太坊同样符合区块链3.0的特征

以太坊

以太坊是什么?

是一个基于区块链技术的去中心化平台,允许任何人在这个平台上开发去中心化应用和使用它们.

以太坊中会出现的角色

  • 一般用户(一般账号):使用以太坊中应用的人.我认为包含使用以太坊钱包交易的人,以及使用基于以太坊智能合约开发出的Dapp的用户
  • 开发者(智能合约账号):编写智能合约,并发布应用到以太坊的开发者.

这个描述可能不太准确,因为智能合约帐号与苹果开发者帐号是不一样的,并不是一个开发者持有一个帐号,帐号管理多个应用,而是每个开发者会有多个智能合约账号,智能合约账号拥有对应创建的智能合约。

  • 节点:存储区块链数据的数据节点.
  • 矿工:进行运算校验的物理设备.

以太坊的结构组成及工作流程

以下结构图是我所理解的基于以太坊平台开发应用的结构图。映射一下前部分提到的角色,一般用户使用应用,开发者开发应用以及智能合约。智能合约,区块链(特制存储数据的区块体),节点or矿工是以太坊的组成部分,其中节点or矿工的连接方式图中仅仅只是一种示意。节点or矿工共同维护一个区块链(特制存储数据的区块体)。

数据节点不一定就是矿工,但无论数据节点还是矿工都是现实中的物理机设备,提供底层的设备基础。

以太坊的工作流程大致描述如下:用户使用DAPP进行交互,DAPP将会调用以太坊中的智能合约,但调用某些智能合约定义好的功能后将通过矿工向区块链(特制存储数据的区块体)写入记录。

区块链与区块链平台的工作流程

以太坊的盈利模式

有了上一段的工作流程分析,继续分析一下以太坊(为以太坊资源提供设备的人)是怎么盈利的。
对于传统ECS服务商,他们提供物理设备,开发者或按量或按月支付服务器费用。而在以太坊中,数据节点和矿工都是由不同地区的人自愿接入,成为算力的一部分的,购买设备的费用需要自行承担(基金会的情形不考虑),为什么会有人做这样的事情呢?

因为可以赚钱。

区块链平台的运行方式是全部接入的矿工将会基于现有最新节点来进行大量计算,这个计算机制很复杂,我们可以想象成一群人在黑灯瞎火的屋子里开锁的钥匙,屋子里有很多钥匙,设备算力越强的走的越快,走的越快的人能越早找到钥匙,但是钥匙不一定对,最先找到钥匙的人会告诉所有人我找到钥匙了,然后大家轮流尝试看钥匙是否能打开门,最早找到能打开门钥匙的人将获得奖励,也就是以太币。当有人第一个找到正确的钥匙并且所有人(有时候也可能是几个人)都确认正确后所有人在都会到起点,开始找下一个钥匙来开下一个门。以太币可以换算成现实中的货币,如此就实现赚钱的效果。

具体技术细节如果有人感兴趣可以可自行再深入了解,因为这个过程比较复杂,而且对于开发者来说是透明的,所以这里没深入介绍,总之就是区块链通过一些机制让全网设备都有计算出正确结果的可能性,所以即使个人矿机也能挖的出币,但是挖矿收益与代笔汇率密切挂钩,所以赚钱与否的决定因素非常多,下面这篇blog有具体分析。以太坊挖矿的利润究竟有多大?

虽然挖矿和计算机和开发者无关,但是开发者需要知道的概念就是gas,字面上的意思,但是理解成佣金可能更好理解一些,开发者发布智能合约需要向矿工支付足够的佣金,矿工才将智能合约成功部署到以太坊,如果gas耗尽了,就像汽车一样会抛锚(发布失败),由于区块链系统优先处理大金额交易的特点,同一个智能合约需要佣金的多少在不同时间还是浮动的(部署个程序还要看行情…程序员:“我真是太南了”)

区块链适用的场景

这个问题其实才是我调研任务的核心,到底什么时候样的场景才需要使用的区块链呢?

回答这个问题之前我们需要先明确一点,我们到底是要用区块链,还是要用区块链的名头?
开头已经说了,区块链本质上来说是一个分布式数据库,如果我们的目的仅仅是为了和区块链沾上边的话,也就是想要使用区块链的名头,而不是这个技术本身,那么其实什么场景都能使用,因为什么场景不需要记录呢?记录就可以使用区块链,使用区块链了就可能借着区块链的名字"招摇撞骗"(此处表意中性)。

这可能也是一堆"伪应用"诞生的原因吧,

回归区块链技术本身呢?在我看来只有涉及需要强制执行力、与高度公信力的场景,才适合使用区块链。比如投票(大选?)只要应用是一个真实的区块链应用,排除通过更强算力攻击的情形,里面几乎可以确定是"真实可信的",所以当需要免除用户质疑暗箱操作,或记录虚假,记录被篡改,或无中间人强制执行等场景中,区块链具有非常强的用武之地。

此处没有提及区块链在金融场景的应用,因为其本身就是金融领域的拓展出来的。

区块链的现状

性能 (TPS)

一个平台的使用和性能具有密切的关系,其中一个重要的指标就是TPS,每秒可以处理的交易笔数。时下几个比较热门的区块链项目的TPS如下

平台 TPS
比特币 7
以太坊 10~20
EOS 3600

来个对比体会一下这些数字的概念吧?2017年双十一某国内平台TPS是25.6w,现在当然是更高了。

智能合约的缺陷

The DAO事件,感兴趣可以了解一下

算力浪费

区块链的安全保障打个不恰当的比方有点像"谁的嗓门大谁说了算",如果想要攻击就必须拥有匹敌甚至超越现有区块链系统总算力的能力,所以区块链是使用大量计算能力来确保安全,以上机制导致的一个直接结果就是性能低,且大量计算属于无效计算(没有算出正确结果的节点),成果也就是那和区块链几乎等价的标签"安全"。我很想找到区块链有效算力使用率有多高,可惜没有数据,但是看区块链的算力有效率本身也确实是不公平的,因为没有这些算力也不会有现在"安全"的标签。


(我是分割线)以下开始的内容是写给程序员的


再次名词辨析

分布系统与集群

集群是个物理形态, 分布式是个工作方式.
一堆机器被统一管理在一个地方(如机房), 就可以叫集群, 但是他们不一定在一起协作工作,所以不一定是分布式
一个程序或系统, 只要运行在不同的机器上, 就可以叫分布式.
集群可能运行着一个或多个分布式系统, 也可能根本没有运行分布式系统;分布式系统可能运行在一个集群上, 也可能运行在不属于一个集群的多台(2台也算多台)机器上.

区块链与分布式系统

区块链是一种特殊的分布式系统, 通过解决拜占庭将军问题实现了非信任网络环境下的最终一致性. 代价是相对较低的效率.
为什么效率低?因为大部分的运算都是无效的, 浪费的, 运算的竞争机制导致资源的大面积浪费.
如果剔除区块链的去中心化因素, 由一个或几个中心节点来控制整个系统, 区块链就退化为传统的分布式系统

区块链平台与传统模式对比

在我整理出以太坊的结构后之后,突然冒出了下面这个类比,觉得两者在某种角度上来讲是有一定相似度的。需要强调的是这个类似是"非常不严谨"的,但是有助于理解区块链的一些概念。
区块链与区块链平台的工作流程
对于学习计算机的人而言,最熟悉的莫过于C/S架构,总会存在一个运行着服务的物理设备作为S端,与运行着与用户直接交互的C端。
物理设备:提供存储和运算能力
S端: 数据库与服务程序(提供API与操作数据库)
C端: 与用户直接交互,可能是手机APP、浏览器或电脑应用。

在以太坊中呢?
数据节点与矿工:提供存储和运算能力
智能合约:提供类似接口的调用,有能力写入区块链(特指数据库)
Dapp:与用户直接交互,可能是手机APP、浏览器或电脑应用。

是不是发现很相似?做完以上类比对区块链结构这块知识的怎么处理,就看个人了,起码在我这里"智能合约"这个概念不再是那么玄而又玄了。

性能

总算力 截至2019年7月

区块链 算力
比特币是 70 EH/s
莱特币LTC 434 TH/s
以太坊 170 TH/s

H/s = Hash/s1 EH/s = 10^6 TH/s 10^18 H/s

处理能力 TPS

公链 TPS 出块时间 共识算法
BTC(比特币) 7 10min POW
ETH(以太坊) 0~40 15s POW+POS
EOS 3600 0.5s DPOS

节点数

在2017年,以太坊节点数达到2.5w个,超越了比特币成为第一
但是在2019年,以太坊节点数仅剩8585个,位置跌落回第二

为什么变少了?可以查看前面一篇分析以太坊挖矿收益的文章,因为收益不可观。

技术关键词

再看以太坊结构

我们将一个应用再细化看看项目结构是什么样的。
区块链与区块链平台的工作流程

  • Web3.js
    为了让API工作在以太坊, 可以使用由web3.js库提供的web3对象. 底层通过RPC调用本地节点进行通信. web3.js可以与以太坊任何一个节点通信.

  • Geth
    用于和以太坊建立连接的客户端,启动将同步以太坊数据,并将本地同步成节点

Geth是以太坊的一个客户端,开发者需要在服务器上启动geth与以太坊主网建立连接,web3.js可以类比一下ajax或axios,用于调用以太坊的智能合约。

Smart Contract的本质

以太坊执行的是二进制编码, 智能合约与语言没有直接的关系, 官方语言是Solidity.
但其实只要根据白皮书的规范, 具有编译原理的知识, 即可以自己开发出一套相应的语言.

Dapp真的是一次部署永不宕机吗?

我在接触区块链最早看到的让我心动,同时也困惑不已的一点就是有文章宣称Dapp是"一次部署,永不宕机"。但是实际情况呢?我们从上面系统系统结构会发现,部署在以太坊的智能合约毫无疑问是一定不会宕机的(起码还有8000多台服务器运行着呢),但是与用户直接交互的客户端呢?如果是一个App还好,但一个Web应用呢?我们是否需要一个ECS来启动一个Apache或Nginx来让网页运行呢?那么当ECS宕机了,用户无法打开网页,即使智能合约是工作的,但是整个服务能称得上"没有宕机"吗?

也许有人会说使用IPFS部署web应用,目前我只找到了使用IPFS部署静态页面的方法,如果你知道如何使用IPFS部署一个Vue项目,请务必告诉我。-- 2019年9月20日

以太坊账号

普通账户:包含资产(40位16进制编码)
智能合约帐号:包含代码 + 资产 (40位16进制编码)

区块链适用场景再分析

区块链无论对于一般用户还是开发者,其帐号组成都如上面写的40位16进制编码组成,比银行卡和身份证号都长,我个人觉得让用户自己记住这个字符串是不现实的,但是如果不这么做又该怎么办呢?难道自己再额外搭建一个服务,做一个账号映射,把这个40位16进制编码的帐号关联到邮箱或者电话吗?

40位16进制编码的帐号带来的好处是帐号注册可以"离线"完成,但是对比邮箱与电话号码,对于一般用户无疑是灾难级的体验。

区块链hello world

参见我写的另一篇blog 区块链 Hello World – 基于以太坊的投票Dapp

参考资料

Ethereum
remix
比较以太坊、EOS和Hyperledger等区块链的不同
区块链百科
比特币中的智能合约及时,图灵完备???
比特币与以太坊区别浅谈(有以太坊智能合约的例子)
区块链发展历程
详细解读区块链2.0,区块链2.0的应用和意义,区块链入门必读
以太坊的生态与入门指南
以太坊投票Dapp教程
图文详述以太坊的节点和分片(二) 节点与矿工
科普以太坊挖矿原理
以太坊源码机制:挖矿
以太坊挖矿的利润究竟有多大?
ethereum price
以太坊网络困境无解,Conflux如何续走区块链之路, 以太猫的例子
以太坊主网节点搭建
以太坊主网同步踩过的坑
…etc

要获取更多Haytham原创文章,请关注公众号"许聚龙":
区块链与区块链平台的工作流程