区块链相关论文研读6: FASTKITTEN,关于比特币的实用智能合约

区块链相关论文研读6: FASTKITTEN,关于比特币的实用智能合约

这篇文章发表在顶会USENIX Security Symposium 2019上面,题目为《FASTKITTEN: Practical Smart Contracts on Bitcoin》,第一作者为Poulami Das。通过下面的链接可以找到作者在会议上面演讲视频。PPT很好,演讲也很好,建议在看论文之前先看作者的演讲。

本文章不是论文的直接翻译。本人通过阅读和理解上面论文原文,结合参考其它资料,提取出论文的主体内容,用自己的语言,希望以通俗易懂的方式跟读者分享和交流区块链技术。

论文的问题描述

区块链上的智能合约本质上是区块链上的代码,因此能够进行逻辑运算。比如可以使用智能合约实现上图所示的扑克牌游戏,三个玩家分别向智能合约输入自己的牌,然后智能合约进行逻辑运算,确定赢家,输出结果。智能合约能够让一个区块链网络有不同的用途,同一个区块链中的不同智能合约相当于智能手机中的不同的应用软件。智能合约这么重要,但是现在区块链最成功的应用之一比特币不支持智能合约,它只有一种功能:数字加密货币。那么,

是否可以让比特币网络支持智能合约?

但是现在的加密货币的智能合约(比如以太坊)存在速度慢、贵、运行时无隐私保护等问题。本论文针对比特币网络提出了一个能够在链外执行(off-chain execution)且能执行多个轮回(multi-round)的高效的智能合约协议,叫FastKitten,它具有强的隐私和安全性以及速度快的特点。

在讲解FastKitten之前,先介绍一下可信执行环境(Trusted Execution Environment,TEE)

可信执行环境TEE

一个理想的TEE可以理解为一个沙盒,任何人都不能改变和窥探里面的执行逻辑和状态信息。一个TEE能够保证其中的逻辑代码被正确执行,维护其中的隐私状态,并且能够提供TEE中的程序被正确设置的证明。所以,一个TEE的拥有者(论文表示为Operator)只能改变TEE的输入或者输出,停止或者启动TEE。

下面讲解本论文所提出的协议

FastKitten协议

该协议可以分为四个主体,分别为TEE,Operator,Parties和区块链。可以把TEE理解为一台特殊的服务器,Operator便是这台服务器的拥有者;Parties是活动的参与者,比如上图中打扑克牌的三个小伙子;这里的区块链就是比特币中的区块链。

FastKitten协议分为三个阶段,分别是Setup,Round和Finalize。

  • Setup阶段

Operator提交惩罚押金给智能合约,通过向区块链发起一个交易 TX_{0} 来实现。这个交易的输入是Operator未花费的钱,输出是各个parties的地址,也就是把Operator的惩罚押金转给每一个parties,但是它time-lock的,只有到了timeout的时间之后,该交易的输出金额才能被parties花费掉。从后面的分析中会发现,这个设置可以防止Operator作恶。

所以,Operator需要把这个交易分别发给各个parties。如下图所示。

对于各个Party,她们通过验证Operator发过来的数据,知道Operator已经提交了押金,以及TEE已经设置好了。于是她们需要向智能合约提交惩罚押金,也是通过向区块链发起一个交易TX来实现,对应下图的 TX_A,TX_B, TX_C 。它们不是time-lock的。其输入是Party没有花费的钱,输出为TEE的地址。


这样就完成了Setup阶段,进入Round阶段

  • Round阶段

(1)各个parties通过Operator向TEE发送智能合约的输入数据,

(2)TEE计算得到结果,

(3)通过Operator向各个parties返回TEE的计算结果。

这个过程可以根据需要重复多次。所有在网络中传输的数据都通过Transport Layer Security (TLS)来加密,因此Operator无法知道parties的输入内容和TEE的计算结果。并且,这个round阶段在正常情况下是不用访问区块链的,因此该阶段不需等待区块链打包确认,能够很快执行完成。

  • Finalize阶段

上一个阶段智能合约执行了其中的代码逻辑,得到了扑克牌游戏的赢家,接下来到了结算的时候了。Operator通过TEE的最终计算结果的输出 out_{final} 向区块链发起一个交易 TX_{final} ,用于向Operator和各个parties退还押金以及向赢家发送相关报酬等。这一步的操作需要写到区块链中,防止篡改和欺骗。

上面的三个阶段是在各个参与者都诚信可靠的情况下完成的。但是,

如果有人作恶怎么办?

对于作恶,可以归结为两种,一种是篡改数据,第二种是丢弃数据或者故意停止工作。前者可以通过数字签名来解决。而后者怎么办呢?论文主要讲解后者。

情况1,Operator作恶

如果Operator故意丢弃数据或者故意停止服务,那么其之前所提交的押金在timeout之后被各个parties消费掉,以此来惩罚operator。

情况2,Party作恶

比如Alice故意停止工作,没有给Operator发送TEE所需要的input数据。这时候TEE没有收到Alice的input数据,但是TEE不确定是Operator丢弃了该数据还是Alice没有发送。Operator为了证明自己的清白,于是,它向区块链发起一个challenge交易,记 TX_{Challenge} ,如下图所示,该交易的输入是Operator自己的一些未花费的钱,输出是Alice的地址,并且有一个数据域Data,里面存储了在当前round中TEE计算结果的输出值 out_{i} 。如果Alice没有作恶,只是她发给Operator的input数据在网络传输途中丢失了。这时候,Alice需要证明自己的清白,因此她需要回应Operator所发起的challenge交易。Alice需要时时检查有没有发给自己的challenge交易,如果有,需要向区块链发起一个交易,记 TX_{response} ,作为对应challenge交易的回应。该response交易的输入是Operator发给Alice的钱,输出是Operator的地址,目的是把这个钱返还给Operator,并且其数据域Data是发送给TEE的input数据。这样,Operator检查到Alice的回应之后,就能够从区块链中拿到这个input数据,然后转发给TEE,TEE正常执行。如果在Operator发起 TX_{Challenge} 过了一定的时间之后Alice还是没有反应,那么TEE中的智能合约就能够断定Alice作恶,因此没收Alice的押金,结束协议。

怎么没收Alice的押金呢?如下图所示,通过向区块链发起一个交易 TX_{Final} ,其输出包含Operator的地址和除了Alice的其它parties的地址。

以上便是FastKitten协议的主要内容了。

该协议存在的缺点:

  • 在round阶段,parties需要时时检查区块链是否有发给自己的challenge交易被打包进区块中。
  • FastKitten协议使用time-lock的方式来限制恶意智能合约无限循环执行(以太坊使用消耗gas来限制)。如何设置一个合理的timeout时间长度呢?短了,协议没执行完成;长了,可能存在恶意无限循环计算的问题。可否给出一个计算出合理的timeout时间长度的方法呢?
  • 本协议是基于理想的TEE的。如果TEE被黑客攻破,那么本论文的安全隐私保证就不成立了。TEE是有漏洞的。
  • 在进入round阶段,需要知道并且确定parties的数量。这在一定程度上限制了FastKitten智能合约的应用。

本人存在的疑问:

(1)parties提交了押金给TEE中的智能合约之后,operator作恶,把TEE服务关闭,智能合约停止运行。parties如何收回自己的押金呢?论文表示所有所有party可以只依赖单个TEE来完成一个活动(比如打扑克牌)。

谢谢!


都看到这里了,给一个赞呗

编辑于 2019-11-04 21:10