区块链工程师的总结血泪史

时间在流逝,转眼间, 2020年已经过去了一半。回顾过去的一年,成长,失败,喜悦和眼泪……总之,可以说是“忙碌,收获,疲惫,快乐”。 是令人难忘的一年。对我来说,我一生遇到了一些挫折,也经历了公司变更的痛苦。在此过程中,我和公司的所有同事都不惧怕,更不用说了。我们始终相互信任,朝着我们的目标迈进。既然所有工作都又步入正轨,这意味着我们将再次起航。我相信有一天,我们将为我们的坚持不懈和辛勤工作感到自豪。

区块链是目前一个比较热门的新概念,蕴含了技术与金融两层概念。从技术角度

来看,这是一个牺牲一致性效率且保证最终一致性的的分布式的数据库,当然这

是比较片面的。从经济学的角度来看,这种容错能力很强的点对点网络,恰恰满

足了共享经济的一个必须要求——低成本的可信 环境。

本次分享一下聊聊区块链技术,以及目前区块链技术架构,并且介绍一下价值互

联网。

由于区块链是一个新兴的技术概念,本文所有的观点仅代表个人观点,未必全部

正确。

#1. 技术人员看待区块链的正确姿势

区块链虽然是一个新兴的概念,但它依赖的技术一点也不新,如非对称加密技

术、P2P网络协议等。好比乐高积木,积木块是有限的,但是不同组合却能产生非

常有意思的事物。

我接触过一些工程师,初次接触区块链时,不约而同的表达了:都是成熟的技

术,不就是分布式存储嘛。站在工程师的角度,第一反应将这种新概念映射到自

己的知识框架中,是非常自然的。但是细究之下发现,这种片面的理解可能将对

区块链的理解带入一个误区,那就是作为一个技术人员,忽略了区块链的经济学

特性——一个权力分散且完全自治的系统。

区块链本质上是一个基于P2P的价值传输协议,我们不能只看到了P2P,而看不到

价值传输。同样的,也不能只看到了价值传输,而看不到区块链的底层技术。

可以这么说,区块链更像是一门交叉学科,结合了P2P网络技术、非对称加密技

术、宏观经济学、经济学博弈等等知识,构建的一个新领域——针对价值互联网

的探索。

那什么是价值互联网?价值互联网可以是当下如日中天的电子商务所衍生的支付

业务。但,真的只是支付领域吗?很显然这是不够的,一级资本市场,实体资产

确权与转移,证券登记交割、证信与反欺诈。我们再仔细想想,我们的各大电商

平台的专业差评师,恶意刷单还少吗?

如今的金融领域,除了支付比较便利之外,在其他绝大部分的业务中,我们就像

是被套着锁链走路一样,我们反复确认,反复审核,反复监督,我们反复构建一

个又一个的大大小小的高可用集群,保证线上服务的可靠性与连续性,我们雇佣

一个又一个的安全工程师,交付一个又一个的渗透测试项目。为什么?因为作弊

的成本太低了,低到只要改数据库的一行记录就可以提取上百万的资金。

强大的互联网给了我们成本几乎为零的高速信息传输通道,却没有一个成本低廉

可靠的高速价值传输通道,那么这也就是区块链即将带来的。

区块链是一个公共的分布式总账,下面从技术角度简单介绍一下:

想象有一个100台的分布式数据库集群,现在的情况是这100个节点实际上的拥有

者是一个机构,并且所有节点处在该机构的内网当中,所以这个机构想让这100个

数据库节点干嘛就干嘛,换句话说这100个节点之间是处于一个可信任的环境,并

且受控于一个实体,这个实体具有绝对仲裁分配权。

另外的情况是这样的,想象这100个节点分别归不同的人所有,且每个人的节点数

据都是一样的,即完全冗余,并且所有的节点是处在广域网当中,换句话说就是

这100个节点之间是不信任的,且不存在一个实体,它拥有绝对仲裁权。

现在考虑第二种情况,采用什么样的算法(共识模型)能够提供一个可信任的环

境,使:

1. 每个节点交换数据过程不被篡改;交换历史记录不可被篡改;

2. 每个节点的数据会同步到最新数据,且承认经过共识的最新数据;

3. 基于少数服从多数的原则,整体节点维护的数据本身客观反映了交换历

史。

区块链本质上就是要解决以上第二种情况的一种技术方案,更确切的说应该叫分

布式的冗余的链式总帐本方案。有关区块链的一些要素,在我以往的文章里有总

结过一些:

包含一个分布式数据库

分布式数据库是区块链的物理载体,区块链是交易的逻辑载体,所有核

心节点都应包含该条区块链数据的全副本

区块链按时间序列化区块,且区块链是整个网络交易数据的唯一主体

区块链只对添加有效,对其他操作无效

基于非对称加密的公私钥验证

记账节点要求拜占庭将军问题可解/避免

共识过程(consensus progress)是演化稳定的,即面对一定量的不同节

点的矛盾数据不会崩溃。

共识过程能够解决double-spending问题

所以作为一个技术人员,不应当只看到了区块链所依赖的技术,更应该关注区块

链以外的点和面,综合来看,区块链将会有趣得多。

#2. 区块链的一般性架构介绍

有关区块链本身的发展史,网络上资料比较多,本文不再赘述。

而有关区块链技术的介绍,在各个区块链平台的社区是有详细资料的,但是针对

这些资料的总结,以及抽象出一共通概念的介绍,还是凤毛麟角,本文尝试总结

一下。

在介绍之前,我想稍微介绍一下公有链,联盟链的概念,这些概念是以太坊创始

人Vitalik提出的,我在这些概念的基础上做了一些研究。

其实区分公有链、联盟链很简单,只要看这个区块链的访问权限就可以了,如果

访问该区块链需要获得链上节点的许可,那么这是一个联盟链,否则是公有链。

根据名称,我们也可以”望文生义“,公有表示一个完全开放的网络,联盟表示

一个半开放的网络,成员之间是共享的,非成员身份是没有自由访问权限的,所

以我们也称联盟链为许可链。

下面我们来看几个比较主流的区块链平台(公有链,皆开源):

比特币 Bitcoin

以太坊 Ethereum/经典以太坊 Ethereum Classic

比特股 Bitshares

我一般戏称为”三巨头“,从生态上来看,比特币是最为成熟稳定的,以太坊更

像是一个冲在前面的勇士,比特股相比前两位生态要小很多,但是从创新的角

度,也不亚于前两位。

其他的很多项目,是从这三个区块链上衍生出来的,所以以这三个为基础,基本

上可以吃透区块链了。

不得不提的还有Linux基金会项目——HyperLedger项目(主打联盟链,开源),

也是旨在打造一个通用的区块链技术,不过我认为目前尚在开发迭代当中,还没

有具体的应用案例,按下不讲。

另外还有一些好玩的联盟链项目——R3 CEV项目(联盟链,闭源),以及中国的

R3项目——ChinaLedger(联盟链,闭源),当然这些不是开源的,我无法获得有

用的资料进行分析,所以就不展开了。

从技术上来看,针对不同的业务场景,对区块链有不同需求,比如实时结算业

务,要求区块链提供秒级的交割,相对应的就是出块速度的要求,而出块速度过

快往往会导致区块链分叉(fork),形成孤儿链,孤儿链是无效的,那么交易也

就作废了,影响了区块链的最终一致性。

如果频繁产生分叉造成相当比例的用户交易失效,那么可以认为系统是不可靠

的。

如果我们将这种实时性要求比较高的业务安插到联盟链中,就可以控制风险,通

过调整共识算法,利用快速一致共识模型(Consensus Model)来避免上述问题,

虽然不如公有链那么健壮,但对某些特殊场景足够了。

所以架构层面,对公有链和联盟链的技术也要差异化对待。

不过客户端整体的设计还是有一些通用的概念的,如下图:

(图1)

一个区块链至少分为三层,

最底层是一些通用的基础模块,比如基础加密算法,网络通讯库,流处理,线程

封装,消息封装与解码,系统时间等;

中间一层是区块链的核心模块,一般包含了区块链的主要逻辑,如P2P网络协议,

共识模块,交易处理模块,交易池模块,简单合约或者智能合约模块,嵌入式数

据库处理模块,钱包模块等等;

最上面一层,往往都是基于Json Standard RPC的交互模块,基于Json-RPC,我们

还可以做出更好的UI界面,也可以是一个web-service。

如果区块链 支持智能合约,可能还要分更多的层,比如增加BaaS层,区块链上的

智能合约提供自治的服务,比如下面这张以太坊的架构图(来自google,仅作参

考):

(图2)

这种分层更加关注的是区块链本身的分层,即业务上的视角,而不完全是技术

的。

我们再转向比特币的设计:

(图3)

比特币几个模块之间的耦合度其实比较高,而且有不少历史包袱,比特币的发明

者——中本聪在开发比特币的时候,使用VC++开发,而VC++的标准库中的sstream

流处理性能非常感人,不得不放弃,自行实现了了基于vector的流处理容器。而

随着c++11的推出以及标准库的更新迭代,性能不可同日而语。

从整张图我们可以看出,比特币的模块比较少,也比较简单。chain-paramters描

述了整个区块链的参数设置,wallet是与地址/加密还有存储相关的,mem-pool是

未确认的交易池。得益于比特币核心开发者的不朽贡献,相比中本聪时代的比特

币代码,现在的比特币代码质量已经相当不错了。

以上无论哪种设计,一般都要从P2P网络协议作为切入,作为一个P2P钱包,既要

提供Service也要提供Client,作为Service依赖P2P网络协议,作为Client依赖

Json-RPC。

需要指出的是,目前”三巨头”所使用的账户模型是不同的(所谓账户模型是指

账户记账方法),比特币使用UXTO模型,以太坊和比特股使用账户余额模型。

UXTO模型(Unspent Transaction Outputs (UTXOs) ):此模型表达了一种转移

的概念,即任何产生的新币,在以后的生命周期中,只有转移,没有消亡,转移

实质上是由加密算法的签名与验证控制的:

(图4)

账户余额模型:账户余额模型摒弃了这种强验证的账户模型,即账户余额回归到

数字加减,这样做提升了交易的效率。

#3. 共识算法与分布式

终于来到重点了,本文每节其实都可以展开成为独立的文章,内容所限,简单

讲。

所谓区块链共识过程,在上文有所提及,是指如何将全网交易数据客观记录并且

不可篡改的过程。目前"三巨头"分别使用不同的共识算法(Consensus

Algorithm), 比特币使用工作量证明PoW(Proof of Work),以太坊即将转换为

权益证明PoS(Proof of Stake),比特股使用授权权益证明DPoS(Delegated

Proof of Stake)。

以上这些算法我称之为“经济学”的算法,所谓经济学的算法,是指让作弊成本

可计算,且让作弊成本往往远大于作弊带来的收益,即作弊无利可图,通过这种

思想构造一个用于节点之间博弈的算法,并使之趋向一个稳定的平衡。

相对应的我们还有计算机领域的分布式一致性算法,例如Paxos、Raft,我也称之

为传统分布式一致性算法。

他们之间的最大区别是:系统在拜占庭将军(Byzantine Generals Problem)情

景下的可靠性,即拜占庭容错(PBFT算法支持拜占庭容错)。然而无论是Paxos还

是Raft算法,理论上都可能会进入无法表决通过的死循环(尽管这个概率其实是非

常非常低的),但是他们都是满足safety的,只是放松了liveness的要求, PBFT也

是这样。

下面是一些传统分布式一致性算法和区块链共识过程的异同点:

相同点:

Append only

强调序列化

少数服从多数原则

分离覆盖的问题:即长链覆盖短链区块,多节点覆盖少数节点日志

不同点:

传统分布式一致性算法大多不考虑拜占庭容错(Byzanetine Paxos除

外),即假设所有节点只发生宕机、网络故障等非人为问题,并不考虑恶意

节点篡改数据的问题;

传统分布式一致性算法是面向日志(数据库)的,即更通用的情况,而

区块链共识模型面向交易的,所以严格来说,传统分布式一致性算法应该处

于区块链共识模型的下面一层。

考虑上面的不同点,结合公有链和联盟链的特征,我们有:

联盟链:半封闭生态的交易网络,存在对等的不信任节点,如房地产行

业A、B、C、D公司。

公有链:开放生态的交易网络,这层主要是为行业链和私有链提供全球

交易网络。

由于联盟行业链其半封闭半开放特性,使用Delegated Proof of XXX 是可行的,

可以考虑以传统一致性算法作为基础加入拜占庭容错/安全防护机制进行改进也是

可以的。

而针对公有链,PoW/Pos/DPos等“经济学”的算法可能是最优算法。

技术上,以上不同的共识算法,我们很多新开发区块链都相应的支持一个特性:

共识模块可插拔,以应对不同场景下的要求。

下图是一张未来区块链生态示意图:

(图5)

公有链提供可信可靠的价值传输网络,上面可以继续组建去中心化应用(DAPP)

或者部署联盟链,甚至传统数据库都行,在上层搭建C端应用。

ref:浅谈区块链共识机制与分布式一致性算法 · blockchaindev.org

#4. 数字资产与价值流通网络

这里有张图:

ref: The New Reality Blockchain Project

“三巨头”中,比特币在“数字货币”处,比特股在“去中心化交易所”附近,

以太坊在“去中心化组织”处。而实际上,区块链和现实的接触点,还在图示位

置。

所以区块链仍是一个正在成长的少年,结合图5,我们希望构建一个基础设施完善

的价值传输网络,上层应用丰富的区块链生态,仍然需要付出巨大的努力。

下一步目标,是将资产数字化(类比资产证券化),例如我们可以将珍稀物品

(艺术品/古董)数字化、知识产权数字化、票据基金等收益权数字化,将极大的

提升市场运作效率,配备智能合约,甚至人工智能,可编程社会不再是梦想。

--------------------------------

Q:还是感觉太抽象,至今都还不能具象化的理解这个区块链,也没找到具象化的

解释,费解???

A:正如区块链这个名词一样,它是被创造出来的,并没有以往的概念可以映射到

上面,所以容易费解。我们不谈这个概念,我们只需要想想我们的互联网还需要

什么。正如比特币白皮书提到的,一个点对点的现金系统,他使用的前提要求是

很低的,不需要注册,不需要手机号,一个点对点的网络,只要你用设备接入,

那么你就可以使用。区块链这个概念也一样,目的是构建一个点对点的生态,解

构权力带来的不对称。它本身只是一个共享的总账本,不同于网络中多节点自己

记账,再对账,这就瓦解了中心权力。

Q: 区块链技术在互联网身份认证方面如何应用?

A:这个问题很好。我目前所做的区块链项目是涵盖了这个概念的,也就是你所说

的互联网身份认证。我们认为它是使区块链接入现实业务的必要一环。

在我们的设想中,首先什么是身份?身份不单单是一个ID号,一个密码,而是一

个使用者所有的操作记录集,这个记录集的代号才是身份。正如账户丢失,然后

申诉一样,申诉的内容才是真正定位到你这个人。区块链也一样,它需要一样

ID,同样它也需要自动验证你历史记录的合法性。目前互联网的身份认证是依赖

公安系统的,最简单的方案就是把公安系统中的身份系统映射到区块链中。另外

一个方案也是用户自定义记录集,根据交易历史核对身份。当然再更远的未来,

结合人工智能,区块链可能有更好的表现。

Q:实时交割数据如果放到联盟链中,联盟链的数据是否要最终同步到公有链?按

分享所说,联盟链的数据对公有链来说是不可信任的,联盟链和公有链中数据是

什么关系?此处没有理解,谢谢老师分享!

A:我认为不可能所有机构都愿意把资产放到公有链上的,一定会出现并存的现

象。理想的情况当然完全使用公有链搭建去中心化应用。联盟链和公有链直接的

数据是单纯的引用关系,我认为开放的关键数据集,如用户身份应该沉淀到公有

链,让用户自己管理,而机构比较私有的关键数据,应该使用访问权限将它与公

有链隔离,所以联盟链的数据和公有链的数据我认为是互补的。也就是说,联盟

链的数据是否要同步到公有链,这个要是视机构本身的需求而定。另外,公有链

的外部数据引用,我们称之为data-feed,这个东西就要把人的因素引入了,比方

说法务,律师,政府机构等等,作为一个仲裁者帮助引用数据,好坏可以让市场

评价信用,正如对一个机构评级一样,如果这样就很透明开放了。

Q: 有一些很有趣的实体项目比如智能门锁,无人租车,这些都是线下项目,怎么

做到互联互通呢?

A:首先区块链的项目都是跨平台的,也就是说嵌入式设备可以依托区块链的低信

用成本的优势,自动记账,可以是联盟链的,也可以是直接基于某个公有链的

DAPP,这些账本是共享的,这些数据在发生引用关系的时候,可以进入公有链通

道,打通两者关系。

其次,任何具体的区块链项目,都是需要依托一个公有链进行的,正如现在很多

落地项目都是基于“三巨头”,然而其实目前并没有一个让大家都特别满意的标

准,让大家都服,所以我我们还要拭目以待。

Q: 多谢分享,能谈谈最后一张图中区块链发展的各个阶段可能对传统金融行业尤

其是银行业的影响吗

A: 对银行业的影响,我认为现阶段影响不大,尤其是国内。这个要视区块链发展

的程度而定。我所了解的,央行已经开始着手自己的数字货币了,这对银行来

说,顶多就是再来一次IT架构升级的事儿而已,可以帮助银行业降低IT成本,也

可以方便加强监管。但如果在更远的未来,银行可能不会特别封闭,变成一些区

块链的代理节点,也会被所有人所监督,而不是几个特殊机构。

Q:如果公有链能够记录所有历史,有没有技术能破坏或封禁,有没有生命终结的

那天?

A:有一点技术风险,通用量子计算商用的时候,目前的加密技术很多都失效了,

基于密码学的区块链受影响最大(当然现在的中心化架构也会受到影响)。这取

决于理论研究的成果,如果出现了新的密码学理论可以抵抗量子计算就没问题。

如果从P2P网络的角度,是没有任何机构或个人能封禁的,只要有两个节点还能做

交易也能记账,这个区块链就是alive的。

从经济学的角度,区块链的生死也不主要在于加密技术是否被攻破,而主要在于

链上聚集了多少财富和利益,链上的数据有多少价值,如果没有价值了,链自然

就死了,反之如果被攻破了,不过是分叉、或者等待新的加密算法出来之后进行

数据迁移,这一点跟中心化数据库恢复备份没有什么太大区别。

1.工作总结。

(1)首先,我非常感谢公司为我提供了这样的发展平台,以便我可以继续学习和进步自己的工作,并逐步提高自己的素质和才能。在进入公司的一年多时间里,他参与了开发过程,根据项目的不同业务,分别设计了不同的数据库,部署了相应的开发环境,使用了不同的开发框架等。职业技能发挥了非常重要的作用。特别是,补充服务器维护步骤的知识使我受益匪浅。只是考虑工作会议,面对服务器的操作我很茫然,现在我精通服务器上的一些基本命令,当网站遇到问题时,服务器的故障排除和故障排除都是。取得了很大进展。

(2)在发展的同时,各方严格要求自己,始终保持“谦虚,谨慎,自律”的工作态度。珍惜每一次学习的机会,努力提高自己,认真完成任务,做好工作,坚持理想,坚定信念,继续加强学习,稳定自己的工作技能!与同事沟通,彼此沟通,提高工作效率并增强团队合作精神。

(3)积极参加公司组织的活动,不仅锻炼身体,而且增强团队凝聚力。由于技术的发展,大部分时间都花在了座椅和电脑前部,因此很容易对身体造成一些伤害。在这种情况下,确实有必要让我们参加公司组织的更多活动。我也希望将来公司能够组织更多的运动和体育比赛等活动。

(4)对当前开发项目的一些小建议区块链性能提升,吞吐量测试(tweet): b。优化了编辑器,用于发布消息,支持表达式,表达式包和其他内容。 (未完待续 ...)

第二,工作经验和不足。

1.发展渴望成功。在开发某些项目功能时,由于渴望获得成功且没有认真思考,因此代码上线后仍然存在许多问题。这是一个非常坏的习惯,将来我们必须特别注意它。在阐明了整个逻辑之后,我们可以开始编写代码。

2.发展的安全性。在项目开发过程中,我们必须减少代码错误,尤其是涉及金钱,数据和其他安全方面的代码错误,以防止网站受到攻击并给公司造成重大或无法弥补的损失。

3.注意代码标准化。在编写代码的过程中,我们必须首先考虑代码的标准化,不仅要便于将来对代码的修改和维护,还必须考虑其他同事阅读代码的便利性。提高开发效率。

3.未来计划

已经过去,新的一年将迎来更多的机遇和挑战。我希望我们不会忘记我们的初衷,继续努力,努力工作。 2018年肯定会改变我们的面貌并腾飞一年。并希望在接下来的日子里,我们可以做到以下几点:

(1)增强责任心,切实迈出每一步。责任心是认真做事的精神状态,是在遇到困难时会进步的意志和品格;只有增强责任感并减少工作量,下一项工作才能顺利,迅速地发展。

(2)增强整体视野,更好地为团队服务。无论是在代码开发过程中还是在日常生活中,都必须有一定的全局。必须考虑到,总体利益总是大于个人利益,并且必须具有团队意义。

(3)了解更多并改进更多。学习无尽的镜子。对于您已经熟悉的知识,您必须努力进行进一步的研究。没有最好,只有更好。此外,由于自身的弱点,您必须花时间学习,提高综合能力并扩展

我的微dnf767 欢迎交流,任何工作、学习、开发中遇到什么问题都可以找我解决

乐于交友,嘻嘻

猜你喜欢

转载自blog.csdn.net/v_dnf767/article/details/106288369