菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
68
0

《如何开发区块链底层平台》

原创
05/13 14:22
阅读数 551

摘要:2019年11月26日,同济创业谷与 PPIO CodeTalks 联合举办了《创新X - 区块链与创新创业》区块链技术分享会。

在本次分享会中,我们有幸邀请到了四位重量级嘉宾来做主题分享。在本期文章中,我们为大家带来韧思能源科技CTO、创客资本合伙人,杨显波老师的主题分享 — 《如何开发区块链底层平台》。

嘉宾简介:

杨显波- 韧思能源科技CTO / 创客资本合伙人

以下为讲稿(原文有删改): 

“ 我希望和大家分享区块链到底是什么,能做什么,怎么做这三大问题。

我们直接进入主题:

什么是区块链

字面上就是区块 + 链。

区块就是一块数据,链就是数据之间是链起来的,就是数据之间不能加塞,链接起来后也不能改。

区块链的本质是一个不可变的账本。

注意:我这里没有加“共享的”,“分布式的”。从区块链的组成要素来看,它不包含账本是如何生成的,账本的使用方式,这个我们后面有详细的讨论。

数据是以区块链的形式存储的,我们在解决一个业务痛点的时候,需要考虑是否一定要用到区块链技术。

区块链的创新不是一个新技术的创新, 而是使用方法和数据存储方式的创新, 所以可以用区块链方式来解决一些现存的问题。

区块链应用领域

其实区块链行业的从业人员是非常幸运的,只要是数据存储相关的,都能用到。 

当然也要看业务场景,是否用了区块链就能解决业务痛点,而我们互联网行业当今面临的痛点是我们丧失了数据的主权和数据审查权。

我们还处于区块链的早期阶段,也很幸运在这个阶段,可以做很多事情。

区块链的存储方面,可以以数据库或者文件的方式实现,比如你的数据存在哪?你的介质数据库或者关系型数据库,关键是看你去怎么样去存这个账本。现有的企业有大量的遗留的业务系统,大部分都是基于关系型数据库。

在这种场景下,你可能选择将你的区块链解决方案用关系型数据库来进行存储,这样你的账本会很方便的被大多数人读取。

区块链的种类

  • 公有链;
  • 联盟链;
  • 私有链。

关于私有链,有一个有意思的业务场景。我们一谈到区块链都是多节点,那私有链是单节点还是多节点?私有链是一个私有实体掌握这条链,他如果是单节点的话能不能做成区块链,如果让你们来做解决方案,你会怎么做 ?

单节点没有一个共享的账本去同步节点,账本只有一份,别人没法监督。那么在这种情况下,你要把你的哈希值公布出来,要实时的公布,一旦有人要看你的数据有没有问题的时候,你可以把哈希值拿出来,把账本里的数据拿出来,用Merkel去证明你这个数据确实是在你的账本里的。 

比如以下方式:

  • 发布在官网上,每分钟刷新;
  • 发布在报纸上面,每天公布某某公司的哈希值;
  • 发布在以太坊的链上,证明一致性和公正性。

区块链协议

当我们谈论区块链平台的时经常听说某协议,比如你在看开源代码时, 如:go语言实现,java语言实现。

实际上一个区块链协议,就是定义区块链是什么样子。当开发一个区块链平台的时候,就是去实现一个自己设计的区块链协议。

区块链协议主要包括什么呢?

  • 如何处理和验证交易;
  • 由谁去创建区块,即所谓的区块生产者是谁;
  • 节点之间如何交互;
  • 数据是如何广播出来的,账本数据是怎么同步;
  • 应用程序的编程接口。(有内部接口,有各个节点互相调用接口,也有对外接口。其他区块链如果想调用你的区块链数据的话,使用这种对外的编程接口。)

典型的区块链协议

  • 比特币;
  • 以太坊;
  • Hyperledger。

我们把区块链协议包含的主要模块拿出来:

  •   账户模型

首先你设计区块链协议的时候,先要设计账户模型,其中包括什么呢?包括你的账户名生成规则是什么样子的:

确定你的账户类型是基于UTXO / 基于余额的。

  • 加密算法

平台上用的加密算法是什么加密算法?

  • 数据结构

每个区块都有区块头,区块头要放什么东西?比如说,前一个区块的哈希,还有一些随机值,当前区块的哈希等等。当前高度,交易数据结构,一个交易,区块链所有数据产生都是通过交易产生的。交易不是说我卖给你什么东西,比如我发一条消息给你,这也是一条交易。

  • 节点通讯

节点通讯要怎么实现?

如果是开发一条公链的话,需要去实现一个Peer 2 Peer网络。

Peer 2 Peer网络互相之间是怎么进行数据传输的,需要选择一个方法。

实现点对点的方式也很多,可以通过HTTP的方式,也可以通过socket的方式,GRPC方式都可以。

  • 共识机制

如果你的区块链平台是一个公有链平台,你可能会选择POW,POS,POA等共识机制。

但如果是一个联盟链,你可以选择在一些适用于联盟链场景的,比如PBFT / RAFT等。

  • 智能合约

智能合约是目前大多数通用区块链平台的合约语言,这里面包括合约语言和运行环境。比如说以太坊的智能合约是Solidity语言,并且它有自己的虚拟机。再比如Hyperledger是通过Docker去运行go语言代码和java语言代码。

账户设计

账户设计是开发区块链平台面临的第一件事情。

首先选择一个椭圆的加密算法。

这里你可以选可以选择的curve 25519,还有其他的一些椭圆算法。我为什么说要选择椭圆算法?因为你的账户名实际上就是你的公钥。

账户名不是简简单单的公钥,它是通过公钥计算出来的。单纯通过你的账户名,是没法知道你的公钥到底是什么?我选择椭圆曲线加密算法,实际上目的是当我提供我的私钥的时候,不需要任何其他多余的数据,我通过私钥我就能把公钥算出来,然后再通过公钥再把我的账户名算出来。

你要自己设计一套这样的机制,当然是可以参照现有的一些做法。

一般情况下账户名包含三部分:

一个就是你的账户类型,通常情况下就是你账户名的第1个字母代表你的账户类型。账户类型可以包含多种,关键就是看你想要设计一个什么样的平台,最典型的比如说你像以太坊,它有外部账户,就是我们每个人操控的账户,还有智能合约账户,你可以把它用0或者1来进行标识,也可以把创世账户单独拿出来用另外一个字符代替。

因为创世账户比较特殊,它只能往出发币,且只发一次。

在区块链底层,实际上是不允许创世账户再进行交易的。也可以把创世账户当一个黑洞账户,比如说如果要销毁一些通证的话,可直接把通证发给创世账户就OK了,因为平台不会允许创世账户做任何交易。

还有一个就是公钥映射的一部分。公钥映射的一部分,就是我们通过私钥需要转成公钥,然后再把公钥显示在我们的账户名上面。公钥一般都是通过哈希值去进行计算,然后哈希后就可以把公钥映射的部分再通过base58进行转换。

为什么要通过Base58?Base58是比较友好的,他不会说既有0又有O,即有1又有L,否则很难搞清到底是什么?

因为账户名一般都非常长,所以当你要让一个用户去手动输入完这些账户名的时候,很难保证输入正确,要有一个校验位就来校验它账户名是不是正确。

校验位的生成规则,实际上可以通过对前两部分的内容进行哈希后,再取哈希值的前几位作为这个校验位,这个是BTC的典型的操作。

先是把他的公钥进行哈希,之后再一步一步的操作,然后通过Base58生成。

账户生成的时候是比较特殊的,它不需要任何系统,完全可以离线生成账户,生成的规则完全是独立于你的平台的。

账户生成的时候,一般都会提示你一段密语。用过钱包都知道,创建一个账户的时候钱包会给你大概20多个单词让你记住,目的是为什么?实际上就是把这些单词作为文本,然后拿到后台去把这些文本转化成自己的序列,然后对这些序列哈希加密,取得的这些字节序列作为种子去生成你的私钥,有了私钥,那公钥和账户名自然而然就有了。

那么,密语大家觉得安全吗?

密语怎么来的?

在后台有一个密码本,大概有100多个单词,当你点击创建账户的时候,他从这100个单词里面随机挑选二十几个单词给显示出来,我们通过他的代码,就能把密码本能拿出来。

那你们觉得这样做是否安全?如果我拿出密语来,去撞别人的东西,我一旦撞到了,我就拿到私钥了,他所有的东西都是我的?实际上是非常安全的。

为什么敢把密码跟密码本给你看?

从100个单词里面,如果拿出20多个单词放在这,能撞到别人的机会,有多大呢?

实际上有多少种可能呢?这种可能性的数量,比整个宇宙的原子的数还多。

就是说别人在整个宇宙中选定了一个原子,现在让你去,您有信心去尝试吗?

所以说也没有人真正的去用密语去撞别人的私钥,因为永远也不可能撞出。

我们是不是要有一个密码才能登录系统?实际上是不需要的,因为你的私钥实际上就是代表你控制了你所有的一切。

如何登陆这个系统?实际上你不需要登录系统,你只是在用你的账户发交易的时候,系统才会需要你的私钥进行签名,为什么是这样?区块链的系统所有的账户都公开,它这个系统原则上来讲,你可以登陆任何人的系统,比如说你去看它的区块浏览器,然后找到某一个人的地址,你用他的地址去登陆他的系统,你发现你能登进去。

因为所有的数据都在那,所有的数据都是公开的,可以登进去看,你可以看他有100个数字资产在,但是对你来讲是没意义的,因为你没有私钥。

所以说我们在做区块链平台的时候,就不用考虑再搞另一套密码系统,你只要选定你的非对称加密算法就OK了。

加密算法的选择

非对称加密算法,在区块链里面是非常重要的。为什么非对称?因为对称加密做不到签名和验签,我必须得确认发出的交易是你真实的主观交易,在区块链里交易的签名和验签都要用到加密系统对交易数据的加密。

这里的交易数据加密,我是指的对称加密。

对称加密为什么也会在非对称加密这里面体现出来的?

比如说我想要发一个私密的消息给你,肯定要加密,不然别人就都看到,用我的私钥和你的公钥算出的结果,和你的私钥和我的公钥算出一个东西出来。

就可以基于算出来的对称加密的Key,去加密你们之间的消息。

加密Key没有保留发送人的信息,只是用接收人的公钥去加密,但是加密的数据不知道是谁加密的。还有散列算法在区块链里面也是非常重要。

交易签名为什么要用到散列算法?实际上是你对一个交易进行签名,不是对交易的所有的字节进行签名,是先把交易的内容算出一个哈希值,然后对哈希值进行签名。

所以说签名的动作里面也要用到散列算法。

共识机制这方面还是拿公有链做比较,在竞争区块生产者的时候,实际上是在用散列算法去算常规区块生产的机率和和验证的规则都要用到散列算法。

我在一个区块链平台,能不能支持不同的加密算法?目前来讲,所有的区块链平台就是选择一个加密算法。

在做区块链平台的时候,你要在哪几个地方要有所思考的?一个是在交易结构这个地方,发起一个交易的时候,你要对交易进行签名。但这个签名用的非对称算法,到底是哪一种签名算法,要在你的交易结构里面加一个属性,加一个字段来标识,我们用的是椭圆曲线的x加密算法。

另外一个是用国密的SM 2,再者就是账户的数据结构里面,你可能也需要加一个通过私钥算出公钥的属性账户,到底是用哪种算法把这个私钥算出公钥,这个也是要考虑。

数据结构与存储设计

 数据结构的设计包括账户的数据结构,区块的数据结构,交易的数据结构,还有一个节点数据结构。如果是关系型数据库的话,主要是一些数据库表:有账户表、区块表、交易表,还有一个节点表。这个节点表就是说你要记住都有哪些节点是和你建立联系的?

数据存储我们可以按照你的需求,可以选择任意的存储方式。我认为数据存储这一块可以剥离一个比较独立的地方。你可以把区块链平台的共识机制这一块,还有数据存储这一块,以API的形式,给它做成可插拔的设计。这样的话就是说你做的平台或者解决方案,可以在不同的业务场景下满足不同的业务需求。

目前大部分都是用的NoSQL的数据库,比如说RocksDB还有LevelDB,甚至可以选Oracle,这种大型的数据库你也可以选,他们为什么选择的就是这RocksDB的LevelDB呢,因为它是嵌入式的数据库,嵌入式数据库的一个好处就是我可以在性能要求比较低的情况下,运行起来,他们的目的是让更多的人去用它。

当我们去解决某个业务场景的时候,其实我们不用开始对接,我们可以用传统的企业级的计算的架构去设计我们区块链的底层,我们可以跑oracle数据库。

节点通讯协议的设计

节点通信无外乎就是说你能访问到它,且能它给你反馈。可以通过HTTP,还可以通过Socket的去实施算数,也可以用通过的GRPC去做。通过的GRPC的效率可能比HTTP更高一点。

节点通讯存在一个问题:这里面有拜占庭节点,我们怎么处理拜占庭节点呢?

建立一个区块链的平台,首先要定义一个节点的种子,这个种子是写在你的代码里。你就把这些节点全记下来,问题就是这些节点不一定都是好的节点,有的节点可能他只开机一次,就关掉了。

还有个别节点可能是专门作恶的,他给你的都是假的数据或者错误的数据。像这种情况你要设计一个惩罚机制,发现这个数据根本就不靠谱,跟别人给的数据都不同。当然还要设计一个机制,怎么验证他不对。

如我要访问7个节点,其中里面有4个节点给我的数据是一致的,我就认为这个数据是对的。发现另外3个给的不对,这3个节点就定义成拜占庭节点。所以在你定义节点的数据库表的时候,里面应该有一个字段,就是标记他。标记他是什么样的节点?如果是拜占庭节点,你可能要对他进行惩罚,一般的做法就是给他拉到黑名单里,但是不是说拉到黑名单之后就判死刑了,你还要设计一个释放的机制。

因为有些情况下即使是好节点,他表现出来的可能也是一个拜占庭节点。比如说在网络不好的情况下,你去访问他的时候,他就是没有在线,或者传输过程中数据数据有丢失,你没有拿到完整的数据。这个时候你不能单纯的认为这个节点就不能再访问了。你要设计一个释放机制,比如说过多长时间,然后释放一次,你再去访问,发现它还不对,你可以增加它黑名单里面的时间,直到你认为这个节点彻彻底无药可救了。

还有是在你的节点设置里面还要加上这个节点的性能,因为有的节点可能离你比较远一点,有的在美国,有的可能就在附近,性能需要标记一下,然后去挑出那些你认为最好的几个节点去和他们去建立联系。

共识机制的设计

共识机制设计实际上就是解决一个最简单的问题。我们所有的节点如果都是同等重要的话,这个数据账本到底由谁来写?这里面列出来的一些共识机制的算法,POW建议大家其实不要考虑,因为它的性能不太高,另外一个它资源浪费很严重,大家基本上都不太考虑。

POS是比较典型的一个共识机制的算法。我建议你在设计共识机制的时候去选用这种,比如说POS还有PBFT大家都比较认可的这种共识算法。

所以一个好处就是开源实现的代码很容易找到,我们其实不用花太多时间,就能把它基本上就搞定。还有智能合约这一块是比较复杂,门槛也高。

智能合约

我在这里想表达的是不一定每条区块链都需要智能合约。

智能合约的目的就是,你上传一段代码,然后我帮你执行。这个代码是每个节点都有的,如果这个账户的金额超过了10个的时候,你就一定要让他把多余的通证转给另外一个账户。比如这是一个最简单的智能合约,每个人都能读到你的代码,然后先预先执行一下智能合约,来验证执行了智能合约之后的结果是什么样。

  • 合约的用途

合约就是我希望这个程序根据共识的规则去执行,不受任何人控制,不是说谁能改动就改动,所有的节点都会达成共识。实际上我刚才也提到,公用的区块链平台都会提供智能合约。我们在做自己的区块链平台的时候,或者给某一个项目方做区块链解决方案的时候,实际上是没必要用智能合约。智能合约是给公共用的,因为作为一个通用平台,它不知道将要支持的业务场景。

业务逻辑是什么样的,如以太坊:需要支持所有人在上面写应用,他自身不知道要支持什么样的具体业务。

但是如果我们非要写一个通用区块链平台,可能是在某一个垂直行业领域创业,然后专注于某一个行业领域,解决一个特定问题。当你在做这方面的区块链解决方案的时候,实际上我们不需要智能合约,我们把所有需要共识的东西全写在你的底层代码里。

这样的话实际上对你来讲是更灵活的一种方式,所以智能合约其实很复杂。写Solidity的代码,如果哪个模块分不好的话,写起来会很复杂,而且还要跟外面的一些业务系统去调用智能合约,实际上是很蹩脚的一个东西,我们可以完全避开它,你要写编译器,解释器,这个没有比较资深的人搞不定。

有没有不提供智能合约的区块链平台?实际上是当然有,而且活得很好。

如:链下的智能合约,实际上跟智能合约根本没什么关系。

它提供平台上面一些接口给你调用,这些接口会把常用的逻辑写在代码里,然后在链外去调用。

提问环节

学生提问:

请问能不能把各种区块链连在一起,然后成为一个网络?

杨显波老师回复:

首先要想一下,你把它做成网状是要解决什么样的问题?

学生提问:

因为各种区块链是相互独立的,然后如果要是把它们连在一起不就可以资源共享,万物互联。

杨显波老师回复:

如果基于这一点考虑的话,我觉得是可以做的。

但是问题就是说,你可能要专门做一个这样的区块链的平台,这里的每个节点,你实际上所要实现的功能就是这个节点背后所代表的区块链网络的里面的一个节点,他应该有双重身份,一个是他所代理的区块链的数据,另外一个是你建立了一个大一统的区块链网络,它背后的数据是另外一个数据库的数据,这里面可能就是要有一个多层的身份在里面。

可能就像刚才我说的,这个平台的共识机制可能会比较复杂,要包括所有你要连接区块链平台的那些共识机制,然后你的加密算法要支持所有的区块链平台的加密算法,这个实际上是比较复杂的,但是我认为这可能是是一个比较好的想法。”

发表评论

0/200
68 点赞
0 评论
收藏
为你推荐 换一批