00 前言
飞龙在天。
01 背景
可信执行环境(Trused Execution Environment,TEE)是一个由处理器直接管理的隔离区域,在可信执行环境中运行的code将完全隔离于系统以及Hypervisor。目前在主流的芯片架构平台都已经有了自己独特的可信执行环境。ARM平台有TrustZone,目前我们用的Android也好苹果也好,都是用TrustZone来保护我们录入的指纹信息,脸部信息等等的个人隐私数据;Intel平台有Software Guard Extensions(SGX),归功于Intel提供的便利的SDK和开发环境,这是目前学术界使用最广泛的一个TEE平台,也是目前已有的较多在区块链项目中使用的TEE;AMD的服务器芯片中有Secure Encrypted Virtualization (SEV),这个主要是对服务器上运行的虚拟机的内存进行加密,原理是在AMD的处理器里内置一块小的ARM芯片专门用来加密虚拟机的内存和在状态切换时加密寄存器。
02 可信执行环境在区块链中的应用案例
ChainLink 预言机
在区块链的世界里,数据的流入只能通过用户构造的交易,可以说,区块链本身就是由用户交易驱动的。无论是普通的转账交易还是对合约的调用,一切都从用户交易开始,也只能从用户的交易开始。但是一个封闭的系统虽然在执行转账交易这种简单的逻辑的时候还能运转自如,但是当涉及到合约执行的时候就显得捉襟见肘。区块链与现实世界的结合一定需要智能合约的加持,但是在区块链虚拟机这种隔离环境里执行智能合约的时候却往往无法满足现实世界里对各种数据的需求。因此,预言机应运而生,区块链的预言机就是一种为智能合约提供现实世界的数据的系统,例如航班信息,黄金价格等,这样在合约执行的时候就可以依据现实世界的数据来执行判断逻辑。
目前已有的预言机主要有两种实现方式,一种是基于共识基础的预言机,共识节点之间通过对特定数据进行共识验证从而判断现实世界的数据是否可靠,NEO3.0 正在开发的就是这种。另一种就是基于可信执行环境与现实世界中的可信数据源之间建立可信的通信通道,由可靠数据源将数据发送给可信执行环境加持的预言机系统,然后再将数据发送给区块链。由于可信执行环境中的程序在通过远程验证(Remote Attestation)之后一定会严格按照设定的逻辑执行,所以通过这种预言机获取到的数据是可信的。ChainLink就是基于这种逻辑设计的预言机区块链系统。
ChainLink项目基于康奈尔大学的FanZhang研发的合约可信数据源Town Crier。在TownCrier系统中有专门的用于运行Intel SGX的节点,这个节点用于和现实世界中的可信数据源建立Https连接,并且在节点的SGX内运行合约来指定数据获取的具体逻辑。在这个数据获取的模型中,Intel SGX节点是经过Remote Attestation验证过的合法的TEE节点并且运行未被修改过的预言机合约。因此经过这样的模型在获取数据时只会有两种结果,要么获取不到,要么就是真实可信的数据。
Ekiden 隐私保护的区块链
Ekiden 也是出自康奈尔大学,我对他们可谓怨念颇深,怪我入行太晚水平又垃圾,每次我有个新的基于TEE的区块链idea,只要一搜基本就是被康奈尔的做了,发自内心的崇拜。Ekiden主要是利用可信执行环境来以一种隐私保护的形式执行智能合约。在Ekiden的网络里节点分为计算节点和合约节点,合约节点用于区块链本身的管理维护,计算节点用于执行用户的交易。用户的交易直接发给合约的执行节点,然后在TEE里运行,执行的结果将会以密文的形式保存在区块链上。
TeeChan 支付管道
支付通道,区块链layer 2 的解决方案之一,的概念在此不多做介绍,不熟悉的同学可以搜索关键字 “payment channel”。虽然支付通道可以解决区块链本身的数据存储,共识等待,昂贵手续费以及拓展性等等的问题,创建支付通道的过程还是需要用户向区块链发送交易来完成,这个过程不仅需要消耗手续费,而且需要等待正常的确认周期。为了解决这个问题,帝国理工的 Joshua Lind 通过在TEE里创建区块链账户来管理支付通道的方式来避免创建支付通道的繁琐过程。
在TeeChan系统中,没有支付通道的用户可以直接在线下创建支付通道,由于TEE环境本身的隔离性,即使用户本身也无法随意的动用TEE内账户里的资产,因此只要有支付通道在对方TEE里创建,那么你就不需要担心对方在没有你允许的情况下把那笔钱用在别的地方。通过在TEE里创建支付通道,TeeChain避免了创建通道的漫长等待过程。
此外,如果一个状态通道在整个生命周期中没有发生任何的资产变动,那么用户也可以直接在TEE中协商关闭通道,而不需要向区块链提交任何的交易。
尤其想要补充的是 TeeChan的增强版弟弟TeeChain可是发表在了计算机最最最最最最顶级会议的SOSP。简直拔剑四顾心茫然,打遍天下无敌手。
其实现在将TEE和区块链相结合的项目还有很多,这里按下不表。
03 NEO与可信执行环境结合的优势
其实说了这么多的别的项目,我最想说的还是NEO本身和TEE结合的天然优势。搞了好多年的TEE和区块链,虽然突破性的坑都已经被人占了,但是一些细枝末节的花花肠子其实还有很多可以说道的地方。
中心化
我这里没有贬损NEO项目的意思,但是我真的感觉NEO其实是一个相对来说相对中心化的一个项目,这种议员议长的制度有点类似民主代议制,基本上选出的议员来来回回变动不会太大。我不是很懂为什么NEO从来没有想过在这里动动心思,不需要跟着别人屁股后面啊,别人搞零知识证明,NEO也跟一个,别人搞侧链,NEO也跟一个,别人支付通道,NEO也跟一个。总是跟着别人那就永远活在别人的光芒下,NEO不应该分析自己的优势,然后发展自己独特的技术让别人羡慕嫉妒恨么?假如有腾空的梦想,那是不是应该先化龙呢?
当然,我一家之言,说实话也并不是很了解NEO的愿景,此处聒噪一二,全当笑谈。
中心化在我看来其实是NEO本身最独特的优势,你完全可以不像Bitcoin和以太坊那样有沉重的包袱,无论干什么都需要考虑一大堆的利益纠葛,也没有所谓的信仰压制,使你创新举步维艰,动不动就背叛中本聪。所以NEO完全可以更加激进一点,在保障安全的前提下大刀阔斧的对新技术进行探索。
共识节点稳定的优势除了中心化之外还有就是可以更容易的提升算力,参考EOS项目对于节点配置的要求,NEO完全可以对交易提供更强的算力支持而不用像Bitcoin或者Ethereum一样担心会对一些节点产生DOS的效果。
共识机制
我在早期博文《一个可能的NEO链上安全随机数解决方案》里就分析了一下NEO合约本身共识机制的优势,NEO共识机制在执行交易之前其实是有一轮复杂的共识协商过程的,这个过程在我看来也是大有可为,议员之间除了协商共识本身之外难道就不能再协商些别的东西?比如随机数呢?既然信任大多数的议员,那么由议员共同协商在生成新区块之前先生成一个随机数不是很好么,这个随机数在用户发送交易之后,在新区块生成之前生成,没有任何人可以预测,也没有任何人可以更改,至少在我看来是一个可行的随机数生成方案,这样的方案就完全无法在PoW和PoS共识机制里实现,简直DBTF的天然珍珠。尤其是目前好像随机数生成依然是区块链世界里的一大难题。如果NEO有志于在游戏方面发展,是不是这个随机数解决方案可以参考呢?
04 可信执行环境加持下的NEO
前一小节分析了下NEO本身的一些特性,这些特性其实是可以进行拓展发挥出更多的功能,尤其是与可信执行环境进行结合的情况下。
隐私保护的交易
参考Ekiden对于隐私交易的处理方式,NEO以其相对中心化的特点其实更容易实现基于可信执行环境的隐私保护交易。当然,由于NEO本身并不主打隐私保护,所以也没必要把所有的资产都抹去用户信息,但是至少可以实现在合约调用的过程中用户发送的信息可以实现加密保护。
共识节点私钥保护
和别的区块链项目一样,NEO的共识节点也需要共识节点本身维持议员的账户一直处于可用状态,以此完成不间断的交易验证区块生成的过程。这样虽然是正常操作,但是却同时也将议员的账户c置于危险之下,因为谁都不能保证议员的共识节点永远不会被黑客攻陷,一旦共识节点被攻陷,黑客获取到了对y共识节点的控制权,那么黑客就很可能可以从内存中获取到议员的私钥从而窃取议员的资产。
但是如果将TEE引入NEO共识节点并且将议员的私钥加载在TEE中,所有的需要议员进行签名的过程全部在TEE里执行并且只用来签名特定类型的交易或者区块而不许转账或者导出私钥,那么即使议员的共识节点被黑客控制,议员的资产也依然是处于保护状态。
私钥寻回
假如所有的议员节点都支持TEE环境,那么是否能够直接允许用户在NEO平台来生成自己的账户,用户的私钥将由议员节点以动态隐私数据共享的形式来维护用户的私钥,此外在用户创建私钥的时候,让用户提供一些只有用户自己知道的信息作为依据,当用户丢失密钥时,可以通过向NEO提供关键数据来恢复密钥找回资产。由于用户信息的收集以及账户生成的过程都是直接经过TEE进行,因此即便NEO议员节点也无法获取具体的用户隐私信息。
安全随机数
就像我在分析NEO优势的时候说的,NEO本身的独特共识机制其实是大有可为的,虽然我们无法相信单一的节点生成的随机数,但是我们可以依靠在共识之前的议员协商过程来多方生成一个最终安全的随机数,这个生成的过程也可以在TEE里进行,虽然并不是很必要。更多区块链随机数解决方案
触发交易
我在参与NEL社区开发NNS的时候就发现区块链本身一个很让人难受的地方就是所有的交易必须立即发送立即执行,不能是一种先发送然后依据某个事件触发执行的方式,这很难过。假如我有两个或者三个交易需要顺序执行,而且每个交易需要在不同的区块,那我唯一的办法就是第一个交易执行成功之后我再发送下一个交易,然后以此类推,这样的操作方式是很反人类的,也是因为这样我很是不喜欢NNS的CGAS兑换机制,但也无可奈何。
那我们可不可以在TEE里实现一种触发交易呢?将触发交易发送给TEE,然后挂靠具体事件,通过将区块链的一些信息发送给TEE触发事件,再由事件通知交易执行,这样是不是更加便利呢?
而且这样的交易形式目前看来也只有与TEE结合才是最可靠的,因为在NEO环境里,即使合约调用交易失败了,也依然会被写入区块链,这就导致如果用户发出的触发交易不能被严格按照顺序执行,那么很可能就会被人打乱执行顺序从而导致最终交易失败。而TEE就可以完美保护交易顺序。
05 站在时代前沿
可信执行环境和区块链的结合应该是一种大势所趋,过去每年安全定会都会不少相关文章,经过几年科研领域的探索,相信未来在工业界也会慢慢出现更多相关的项目。衷心希望NEO可以在此有所成就有所突破。
And I also think the AMD SEV would be a perfect TEE choice for Neo consensus node.
06 总结
本文介绍了可信执行环境并且列举了几个成功的将可信执行环境和区块链结合的案例。通过分析NEO项目本身的特点,本文提出了几个可能的将可信执行环境与NEO创造性结合的入手点。虽如此,本文仍只是个人天真的妄想,不切实际的地方希望不要嘲笑。作者实力所限,难免疏漏之处万望见谅