今日(11月28日),在由Odaily星球日报主办的新区势区块链峰会上,徐葳教授带来了以《区块链与数据融合技术的一些探索》为主题的演讲。徐葳教授毕业于宾夕法尼亚大学,后在加州伯克利攻读硕博,现在清华大学交叉信息研究院担任博导,主要研究方向是大数据、人工智能、金融科技。
以下为徐葳教授的演讲内容精编,由整理。
我过去是做分布式系统的,特别早的时候做了P2P,然后我就对这个东西失望了,所以我是非常典型的反去中心化的思想,我们是一个学术单位,希望能在区块链一些模块的核心技术方面寻找突破。
区块链为什么有趣?它确实是集计算机科学之大成。包括分布式系统的可靠性和一致性技术、密码学理论、博弈论和机制设计、P2P网络、大数据等等。同样因为它集成了这么多技术,所以很难找到一个人,或者一个研究组把它们统统搞懂。好在区块链大部分是开源的,我们就想大家可以单点突破,做一些科研尝试,最后把这些东西集合起来。为此,我们主要专注于两件事,一是提升区块链(联盟链)的性能,二是保护隐私的数据融合。
一、如何提升区块链的性能?
我们要做的事情首先是提升区块链的性能,我这里指的是联盟链,暂时不考虑公链那种比较复杂的情况。现在很多链说自己性能很高,但其实是因为它有多个分区,这是另一回事,我们重点做的事提升单个分区(partition)的性能。
Gosig的基本目标
我们做了一个系统,叫Gosig,这个系统是基于PBFT的,这是一个非常经典的共识协议,它的优点是在集群里即时产生共识,不想比特币的POW机制需要几个区块后才能共识,因此PBFT的性能比较高。当然相对应的它的安全性不如POW,因为它只能防范小于1/3的节点作恶,坏人可以控制整个网络,任意造成网络分割,但是在联盟链里一般不会存在说我今天想攻击谁就攻击谁,而是说我来领导这一轮吧,要是不行这个块就空了。
我们希望既能满足PBFT的所有假设,但是把它的协议扩展到一个很大的范围。坏人可以任意瞬时杀掉一些节点,只要仍满足f<N/3。另外其他的联盟链节点数量一多,性能就不行了,我们希望可以提升它的可扩展性,支持广域网,这是我们设计时的一个基本目标。
Gosig的设计思路
我们基本没有改动PBFT,只是简化了正确性证明。因为分布式系统是个很复杂、很专业的领域,不是拍脑袋就能想出来的。那怎么让它的效率变高呢?原先是要进行多轮投票,而且每个人都要把消息广播给所有人,这种方式听起来就很慢。我们是用Gossip协议边传输数据边投票,具体怎么实施呢?就是我把消息发出去,不会等别人回复的,通过聚合签名来避免投票中的双向通讯,每一轮随机的秘密选出leader,避免针对leader的攻击,所以在生成新的leader之前,我不会知道它是谁。它是一个协议层和网络层的共同优化,我要把所有的操作全部流水线化,充分利用所有的计算和网络资源(PBFT+BitTorrent),任何人在任何时间都有事做,把网络填的满满的。
Gosig的性能实现
我们测试的性能,如果用280个节点,在14个不同的数据中心里面,在广域网环境中,就是它是跨全球的,数据中心的那个延迟性还是蛮高的。在这样一个环境下,我可以实现60MB的block,可以承载单个分区每秒15000笔交易,确认一个块的时间是16秒。
后来我们又找了1000个节点,仿真5000个节点,限制在20Mbps的带宽下,在全网共识下,能达到每秒3000笔交易,确认出块时间是24秒。然后你再观察一下的话,会发现所有的网络带宽全部用上了,平均带宽使用达到16.8Mbps,也就是说物理网络带宽说唯一的瓶颈了,它的物理极限就这么多了。当然我还可以把带宽再加一些,性能会更高。
这样极致的性能有什么好处?天下武功唯快不破,你只有把下层做得足够快,上层应用才能做,这是我做系统设计的一个理念。
二、如何在保护隐私的前提下做数据融合?
上述是我们在底层做的一些探索,上面应用层呢,很多人说区块链能促进数据融合,怎么做得呢?就是让每个人都copy了一份,这当然就数据融合了,但隐私问题怎么考虑呢?
隐私问题不见得需要区块链,但区块链是一个去中心化的方案,可以作为数据交易的媒介。在数据交易中,买方只想买特定应用的使用权,他们只想用这个数据,而不需要把数据全都买过来,但是对于卖方而言,他把数据给了你,谁知道你会怎么用呢?他们的感知是,交易的原始数据就是交易数据的所有权。
所以我们要做的是,通过加密算法和系统限制数据的使用,就是说这个数据分享出来后只能这么用,没有其他的用途,本着这样一个理念,就需要我们系统的任何部分均看不到原始数据,或者中间过程明文,而只能看到明文的结果。这是一个安全协议,是我们院长姚期智院士80年代提出来的,但是这些年一直没有一个好的编程模型。你怎么把它变成一个通用的,能够搭载算法的框架?
我们对此做了很多探索。另外这里面有无数种加密方法,如何选择效率更高的算法呢?我们经过研究,可以做得非常快,也非常通用,可以直接用python写,容易编程,就和平时写程序差不多,最终可以在不看到处理过程的情况下算出最后那个结果来。我们可以优化到一个神经网络模型用毫秒就能识别出来,同时支持基于加密的数据隐私和基于统计的差分隐私。
我们现在做了几个应用场景,第一个应用是个人信用历史的查询和整合。比如查“徐葳借了多少钱”,这里面有两点,一是不能让别人知道你查的是“徐葳”,这样的话别人就知道“徐葳可能在找你借钱”,客户就有可能被别人抢了。二是不能让你知道“徐葳在哪里借钱”,只能得到他借了多少钱的结果。
第二个应用是一个数据融合建模平台,这是一个医药的试用。就是一些药厂在测试一些药的作用,它不想告诉别人具体在测什么,因为这是他的知识产权,但是我们又想得到一个模型预测哪些药对哪些病有作用,所以我们就整合市场的数据,而没有泄漏每一方数据的情况下,整合在一起做预测。那么如果你整合的数据越多,预测算法的准确度也越高。所以说数据是有意义的,如果保证了每个人的数据没有泄漏,数据交易就不会发生,可以从密码的方案来实现。
三、一点思考:公链为什么这么难?
世界上有很多人在研究不同的模块。他们共同帮助区块链构成一个完整的体系。区块链是一个技术集大成者。我这里有一个思考,为什么公链很难设计?
因为传统系统设计理念是分模块的,机制(mechanism)和策略(policy)是分开的。我想写一个文件,怎么把文件写进去?为什么要写这个文件?这两件事是分开的。policy更多的是根据特定应用优化性能,mechanism就是我要把它做得更快、更可靠、更安全。在传统系统中这两个架构是分开做的,但是在公链系统中,这两部分是分不开的,因为你的性能、网络状态、共识机制跟你的系统有多安全,能不能达成共识,跟你的策略,以及奖励都是有关系的,所以它的policy和mechanism是混杂在一起的。
失去了传统的设计和开发的方法论,如何开发?团队如何设计?我们需要多少个天才程序员才能设计出一个完整的系统?把刚刚所说的这些结合在一起,反正我是想不明白。
最后,我想引用一段话:“有两种方法来构建一个软件,一种是设计的非常简单,所以它明显没有缺陷;另一种是让设计变得超级复杂,所以它没有明显的缺陷,前一种方案远比第二种难。”我觉得对于大家想设计一个巨复杂的区块链平台来说,这句话值得大家回味。