区块链安全: 探讨Neo与可信执行环境的结合
背景
可信执行环境(Trusted Execution Environment,TEE)是一个由处理器直接管理的隔离区域,在可信执行环境中运行的代码将完全隔离于系统以及Hypervisor。
目前,主流的芯片架构平台都有各自的可信执行环境。
● ARM平台
ARM平台有TrustZone,目前我们用的安卓或苹果,都是通过TrustZone保护我们录入的指纹信息、脸部信息等个人隐私数据。
● Intel平台
Intel平台有Software Guard Extensions(SGX),归功于Intel提供的便利的SDK和开发环境,成为了目前学术界使用最广泛的一个TEE平台,也是目前已有的较多在区块链项目中使用的TEE平台。
● AMD服务器
AMD的服务器芯片中有Secure Encrypted Virtualization (SEV),这个主要是加密服务器上运行的虚拟机内存,原理是在AMD的处理器里内置一块小的ARM芯片,专门用来加密虚拟机的内存和在状态切换时加密寄存器。
可信执行环境在区块链中的应用案例
● ChainLink 预言机
在区块链的世界里,数据的流入只能通过用户进行的交易而产生,即区块链本身就是由用户交易驱动的。
无论是普通的转账交易还是对合约的调用,一切都只能从用户交易开始。一个封闭的系统虽然在执行转账交易这种简单逻辑时还能运转自如,但当涉及到合约执行时就显得捉襟见肘了。
区块链与现实世界的结合一定需要智能合约的加持,但在区块链虚拟机这种隔离环境里执行智能合约时却往往无法满足现实世界里对各种数据的需求。因此,预言机应运而生,区块链的预言机就是一种为智能合约提供现实世界的数据的系统,例如航班信息,黄金价格等,这样在合约执行时就可以依据现实世界的数据来执行判断逻辑。
ChainLink项目是基于康奈尔大学的FanZhang研发的合约可信数据源Town Crier而建议的。在TownCrier系统中有专门用于运行Intel SGX的节点,它是用于和现实世界中的可信数据源建立Https连接,并且在节点的SGX内运行合约来指定数据获取的具体逻辑。
在这个数据获取的模型中,Intel SGX节点是经过Remote Attestation验证过的合法TEE节点,且运行的是未被修改过的预言机合约。因此,通过此模型而获取的数据只有两种结果,要么获取不到,要么就是真实可信的数据。
- 目前预言机的两种主要实现方式
一种是基于共识基础的预言机,共识节点之间通过对特定数据进行共识验证从而判断现实世界的数据是否可靠,这也是目前Neo3正在着手的课题之一。
另一种就是在可信执行环境与现实世界中的可信数据源间建立可信的通信通道,由可靠的数据源将数据发送给可信执行环境下的预言机系统,然后再将数据发送给区块链。通过远程验证(Remote Attestation)后,可信执行环境中的程序一定会严格按照设定的逻辑执行,所以,通过这种预言机获取的数据是可信的。ChainLink就是基于此逻辑设计的预言机区块链系统。
● Ekiden 隐私保护的区块链
出自于康奈尔大学的Ekiden,主要利用可信执行环境以一种隐私保护的形式来执行智能合约。
在Ekiden的网络里,节点分为计算节点和合约节点。合约节点用于区块链本身的管理维护,计算节点用于执行用户的交易。用户的交易直接发给合约的执行节点,然后在TEE里运行,执行的结果将会以密文的形式保存在区块链上。
● TeeChan 支付管道
支付通道是改善比特币支付可扩展性的解决方案之一,能够解决区块链本身的数据存储,共识等待,手续费高以及拓展性等问题,但支付通道的创建过程是需要用户向区块链发送交易来完成的,这个过程不仅需要消耗手续费,还需要一个完整的确认周期。
为了解决这个问题,帝国理工的 Joshua Lind 在TEE里创建区块链账户,通过管理支付通道的方式避免创建支付通道的繁琐过程。
在TeeChan系统中,没有支付通道的用户可以直接在线下创建支付通道,由于TEE环境本身的隔离性,即使用户本身也无法随意的动用TEE内账户里的资产,因此只要有支付通道在对方TEE里创建,那么你就不需要担心对方在没有你允许的情况下把那笔钱用在别的地方。通过在TEE里创建支付通道,TeeChain避免了创建通道的漫长等待过程。
此外,如果一个状态通道在整个生命周期中没有发生任何的资产变动,那么用户可以直接在TEE中协商关闭通道,而不需要向区块链提交任何的交易。
Neo与可信执行环境结合的优势
介绍了一些项目后,我最想说的还是Neo本身和TEE结合的天然优势。
● 相对去中心化
在我看来,「相对去中心化」是Neo本身最独特的优势。不像比特币和以太坊有沉重的包袱,被一堆利益纠葛所捆绑,也不因为所谓的信仰压制而让创新举步维艰。
同时,这也能够保证共识节点的稳定运行,有助于算力的提升。参考EOS项目对于节点配置的要求,我认为Neo完全可以对交易提供更强的算力支持,而不用像比特币或以太坊一样担心会对一些节点产生DOS的效果。
● 共识机制
我在早期文章《一个可能的Neo链上安全随机数解决方案》里就分析了Neo合约本身共识机制的优势。Neo共识机制在执行交易之前有一轮复杂的共识协商过程,我认为这个过程大有可为。
- 一个可能的随机数生成方案
除了协商共识外,议员也可以协商些别的议题,比如随机数。既然信任大多数的议员,那么在议员共同协商下,可以在新区块生成前先产生一个随机数。没有任何人可以预测,也没有任何人可以更改,在我看来这是一个可行的随机数生成方案。PoW和PoS共识机制里就无法实现这种可行的随机数生成方案,简直是dBFT的天然珍珠。
尤其是目前好像随机数生成依然是区块链世界里的一大难题。如果Neo有志于在链游方面发展,这个随机数解决方案是否可以参考下呢?
可信执行环境下的Neo
前面已经分析了Neo本身的一些特性,这些特性其实可以拓展发挥出更多的功能,尤其是与可信执行环境进行结合的情况下。
● 隐私保护的交易
参考Ekiden对于隐私交易的处理方式,其实Neo以其相对去中心化的特点更容易实现基于可信执行环境的隐私保护交易。
当然Neo本身并不主打隐私保护,所以也没必要把所有的资产都抹去用户信息,但至少可以在合约调用的过程中对用户发送的信息进行加密保护。
● 共识节点私钥保护
和别的区块链项目一样,Neo的共识节点也需要其保证议员的账户一直处于可用状态,以此完成不间断的交易验证区块生成的过程。虽然这是正常操作,但也将议员的账户置于危险之下,因为谁都不能保证议员的共识节点永远不会被黑客攻陷。一旦共识节点被攻陷,黑客获得了对共识节点的控制权,那么黑客就很可能从内存中获取到议员的私钥从而窃取议员的资产。
但是如果将TEE引入Neo共识节点并将议员的私钥加载在TEE中,所有的需要议员签名的过程都将在TEE里执行,并只能用来签名特定类型的交易或者区块而不许转账或者导出私钥,那么即使议员的共识节点被黑客控制链,议员的资产也依然是处于保护状态。
● 私钥寻回
假如所有的议员节点都支持TEE环境,那么是否能够直接允许用户在Neo平台来生成自己的账户?
议员节点将以动态隐私数据共享的形式来维护用户的私钥,此外用户在创建私钥时,让用户提供一些只有用户自己知道的信息作为依据。当用户丢失密钥时,可以通过向Neo提供关键数据来恢复密钥找回资产。由于用户信息的收集以及账户生成的过程都是直接经过TEE进行,因此即便Neo议员节点也无法获取具体的用户隐私信息。
● 安全随机数
正如我在分析Neo优势时所说,Neo本身独特的共识机制其实是大有可为的。虽然我们无法相信单一节点生成的随机数,但我们可以通过议员的协商过程来多方生成一个最终的安全随机数。
● 触发交易
在参与NEL社区开发NNS产品时,我发现一个区块链很让人难受的地方是所有的交易必须立即发送且立即执行,不能是一种先发送然后依据某个事件触发执行的方式,这很难过。
假如我有两个或者三个交易需要按顺序执行,而且每个交易需要在不同的区块里执行,那我唯一的办法就是在第一个交易执行成功后再发送下一个交易,然后以此类推,这样的操作方式是很反人类的。
那我们是不是可以在TEE里实现一种触发交易呢?将触发交易发送给TEE,然后挂靠具体事件,通过将区块链的一些信息发送给TEE触发事件,再由事件通知交易执行,这样是不是更加便利呢?
而且,目前看来这样的交易形式也只有与TEE结合才是最可靠的。因为在Neo环境里,即使合约调用交易失败了,也依然会被写入区块链,这就导致如果用户发出的触发交易不能按照顺序被严格执行,那么很可能会被人打乱执行顺序从而导致交易失败。而TEE就可以完美保护交易顺序。
站在时代前沿
可信执行环境和区块链的结合,应该是一种大势所趋。过去每年的安全定会都会不少相关文章,经过几年科研领域的不断探索,相信未来在工业界也会慢慢出现更多相关的项目。
衷心希望Neo可以在此,有所成就,有所突破。
本文介绍了可信执行环境,并列举了多个成功将可信执行环境和区块链结合的案例。
通过分析Neo项目本身的特点,本文提出了几个将可信执行环境与Neo创造性结合的潜在入手点。
以上均是个人的技术构想,若有疏漏之处,万望见谅。
作者:廖京辉