初学者的一些粗略理解,如果有错,欢迎指正。
论文地址
TC官方网站(里面有作者提供的案例)
本文参考了这篇解读,尤其是前半部分,删改不多,感谢作者
这篇论文主要针对的是智能合约,为智能合约提供一个经过身份验证的数据馈送(data feeds)。
(个人理解有点像快递员,把经过验证打包的数据递送给智能合约,它提供验证和传递,但是不会改变数据的内容。)
首先我们了解一下背景信息,智能合约是自动执行合同条款的计算机程序,比如日常的汽车贷款付款、保险等都可以通过智能合约自动完成。
但这意味着,智能合约的执行离不开真实生活中的数据。比如执行汽车贷款支付的智能合约需要知道车主是否及时付款,以确定车主取消是否依旧享有实际访问权限等等。
另一个问题则是数据的隐私性。区块链的分布式的特点能够让每个人都去记账,从而达到防抵赖、防篡改的目的,但从另一个角度来看也是区块链的缺点,所有区块状态都是公开可见的,data feeds可能会暴露出用户的请求,隐私性被破坏。
针对以上两个问题,作者提出了Town Crier——为智能合约提供一个经过身份验证的data feed,在智能合约和外部网络(论文假设外部的数据是可信的、真实的)中构建一座数据流通的桥梁。
Town Crier
Contributions
论文的主要奉献有以下4点:
论文实现的三种智能合约实例为:
TC主要引入的技术包括可信执行环境(论文使用的是Intel的SGX,我的老师建议也了解一下TEE)、TLS/HTTPS以及智能合约。
TC包含三个主要组件:The TC Contract (CTC), the Enclave (代码标记为progencl), and the Relay (R).
这个图给出了TC的架构示意图,显示了它与外部实体的交互,绿色的部分是被信任的组件。
我们看看它的三个主要组件:
需要注意的是Enclave和Relay都是部署在TC服务器上的,而TC智能合约是部署在区块链上的。
另外我们将利用Town Crier服务作为请求者或依赖合同的智能合约称为“用户智能合约”,表示为CU,并将其所有者称为客户或用户。数据源是一个在线服务器(运行HTTPS),该服务器为TC提供用来构成数据报的数据。
TC的整体流程相对简单,一个用户合约CU向TC智能合约CTC请求数据,CTC将请求转发给Enclave,并将结果返回到CU。
数据报周期大致可以分为以下几个步骤:
论文的完整协议包含一个优化,通过该优化,CTC在m1之后将ID作为所有数据流的一致,可信赖的标识符返回给CU。这使得直接处理来自相同CU实例的多个数据报请求成为可能。
图2显示了处理数据报请求所涉及的数据流。为简单起见,该图省略了中继,该中继仅负责数据传递。需要数字签名来验证消息,例如m3,这些消息将从外部来源进入区块链。我们让(skTC,pkTC)表示与Enclave关联的用于此消息身份验证的私钥/公钥对。为了简单起见,图2假定Enclave可以将签名的消息直接发送到CTC。
以太坊的费用模型要求gas费用由发起交易的用户支付,包括因交易确认不断调用而产生的所有费用。这意味着发起对以太坊合约的调用服务必须花费金钱来执行那些调用。如果没有精心设计,这可能会导致财务耗尽,并导致应用程序层拒绝服务攻击。因此,对于基于以太坊的服务的可用性至关重要的是,始终向其发起的区块链计算报销它们的费用。
为了确保服务不会受到此类攻击的影响,作者定义了gas可持续性,这是基于区块链合同的服务的活力所必需的新条件。gas可持续性是任何以太坊服务永续发展的基本要求。它也可以推广到以太坊之外;任何基于分散式区块链的智能合约系统都必须收取某种费用,以补偿矿工进行和验证计算的费用。
令bal(W)表示以太坊钱包W的余额。
定义1(K-Gas可持续性) 具有钱包W和区块链功能f1,…,fn的服务是K-gas可持续的充分条件是:
在以太坊进行的gas不足的调用将会中止,但依然会消耗所有提供的gas。所以如果钱包提交的交易资金不足,钱包的余额将降至0。因此,要使K-gas在K>0的情况下可持续,服务发出的每个区块链调用都必须补偿gas支出。此外,该服务必须为每次调用或者与交易的其他部分一起恢复的补偿提供足够的gas。
在涉及智能合约与链下可信计算环境(例如SGX)交互的系统中,TCB是具有不同属性的两个组件的混合体。智能合约中的计算速度慢,成本高且完全透明,这意味着它不隐秘。 SGX飞地具有强大的计算功能并可以私下执行,但是所有外部交互(尤其是与合同的通信)都必须经过不受信任的中介。尽管此混合TCB的功能强大且远超过TC,但仍带来了挑战:如何在组件之间建立安全的通信,同时最大程度地减少TCB中的代码。
作者在这个图中定义了两个TCB组件的抽象。
为了将这些抽象与形式化的理想功能区分开来,作者使用T表示可信组件。
TOff:链外TCB的抽象
TOn:链内TCB的抽象
OAuth:信息馈送,用来对链上消息的身份验证进行建模,如果输入是有效的区块链事务,该模型将返回true。
由于以太坊块是使用Merkle树进行自我认证的,因此原则上我们可以通过在TCB中包含以太坊客户端来实现OAuth。但是这样做极大地增加了代码占用空间,以太坊的核心实现大约是5万行C ++。类似地,智能合约可以通过检查证明来验证来自SGX的消息,但是在智能合约中实现认证将很容易出错,并且在计算上(因此在经济上)昂贵。
在链外TCB(TOff),我们需要验证收到的区块链请求是否有效;在链内TCB(TOn),我们需要验证请求,信息和签名。这两个是开销最大的地方(图片4中标红的函数)。
所以作者提出了两种通用技术来避免这些调用,从而最大程度地减少TCB中的代码大小。第一种适用于任何TCB组件为区块链合同的混合系统。第二个适用于TCB组件仅通信以发出和响应请求的任何混合系统。
Binding TOff to WTC。将TOff绑定到WTC。
由于链上TCB的计算速度快且成本高,我们希望避免实施签名验证。确实存在一个预编译的以太坊合同,以验证ECDSA签名,但是操作需要高昂的gas费用。
取而代之的是,作者将TOff的身份绑定到以太坊钱包,这使TOn可以简单地检查消息发件人,该消息发件人已经作为以太坊交易协议的一部分进行了验证。这其中的关键是信息只能作为来自钱包的交易插入以太坊区块链。因此,中继器将消息从TOff中继到TOn的唯一方法是通过钱包WTC。由于以太坊本身已经验证了交易上的签名(即用户通过经过身份验证的渠道与以太坊进行交互),因此我们可以在现有交易签名验证机制的基础上执行带TOff签名的验证。
简而言之,TOff使用新的公钥pkOff创建WTC,该公钥的密钥只有TOff知道。为了使这个想法充分发挥作用,必须将公钥pkOff硬编码到TOn中。创建或依赖使用TOn的合同的客户负责确保与TOn交互之前,此硬编码的pkOff具有适当的SGX证明。
通过假设依赖客户端已经验证了TOff的证明,我们可以假定从WTC发送的数据报被信任为源自TOff。这样就无需在TOn中进行昂贵的EPID签名验证。
另外,SGX可以将pkOff密封在非易失性存储中,同时保护完整性和机密性,使我们可以通过服务器重启来保持相同的绑定。
具体我们可以看一下图5,它是用户的SGX认证离线验证。它要求客户端检查飞地代码TOff和公钥pkOff的SGX认证。同时在使用TOn之前检查pkOff是否硬编码到区块链合约TOn中。
如果三个认证都能通过的话就认为TOn是可信的。
Eliminating OAuth。消除OAuth。
为了消除从TOff调用OAuth的需要,作者利用这样一个事实:从TOff到TOn的所有消息都是对现有请求的响应。我们不需要在TOff中验证请求参数,而是可以在TOn中验证TOff是否响应了正确的请求。
对于每个请求,TOn存储该请求的参数。在每个响应中,TOff都包含它用来完成请求的参数。然后,TOn可以检查响应中的参数是否与存储的参数匹配,如果不匹配,则直接拒绝。存储参数和检查相等性是简单的操作,比在TOff中调用OAuth要简单得多。
这种方法可能会开启新的攻击(例如,中继可以发送TOff响应的虚假请求)。但是作者在第7节中所证明了,所有此类攻击都会减少为来自网络的DoS攻击或中继攻击,而混合TCB系统本身就很容易受到这些攻击的影响,并且作者并不打算在TC中对它们进行保护。
为了了解TC协议,我们需要进行一些预备工作。为简单起见,我们假设只有一个飞地实例,其实这个系统是可以扩展多个飞地,甚至多个主机的。
为了确保gas可持续性,TC要求申请人提前支付gas费用。然后TC智能合约偿还TC的gas费用。通过让可信组件执行补偿,我们还可以保证恶意TC在不提供有效数据的情况下无法窃取诚实用户的资金。
Notation.
首先是符号说明。
我们使用符号mi标记与图2中的消息相对应的消息。
付款时,$g表示gas,$f表示非gas货币。为简单起见,作者假设gas和货币采用相同的单位(这样可以避免显式转换)。我们使用以下标识符来表示货币和gas。
Initialization. 初始化。 TC向WTC至少存入$Gmax。
The TC Contract CTC. TC智能合约。 TC合约接受来自CU的数据报请求和费用$f,为其分配一个唯一id,并对其进行记录。然后中继器R监视请求并把它们转发到Enclave。在收到WTC的响应后,CTC验证参数以确保有效性。如果请求有效,CTC通过调用初始请求中指定的callback来转发生成的数据报。为了确保所有花费的gas都可以报销,CTC在这个子调用中设置$gclbk:=$f-$Gmin。(可以报销的最大值=押金-不包含callback的deliver需要的gas),然后把这个值连同数据报一起返回给callback。
The Relay R. 中继器R。 如前面所述,R通过三种方式架起了Enclave和区块链之间的桥梁。
1 它从CTC里获得新请求 (id, params)。
2 使用这两个命令progencl.Initialize() 和progencl.Resume(id, params) 向飞地传入请求。
3 它将数据报从Enclave转发到区块链。
它将已经签署的交易作为WTC转发给区块链。函数AuthSend将交易插入区块链,以WTC的形式,表示交易已被TC私钥签名。诚实的中继器只会为每个有效请求的参数调用一次progencl.Resume。
The Enclave progencl. 飞地。 当通过 Initialize()初始化时,progencl接收当前的挂钟时间;通过存储该时间并设置时钟参考点,它校准其绝对时钟。它生成一个ECDSA密钥对(pkTC,skTC)(在以太坊中参数化),其中pkTC通过插入到证明中绑定到progencl实例。在调用Resume(id, params) 时,progencl通过HTTPS联系params指定的数据源,并检查相应的证书是否有效。然后progencl获取请求的数据报,并将其返回给中继器R,包含params*、id和GASLIMIT $gdvr:=$Gmax,所有这些都是用skTC数字签名的。
The Requester Contract CU . 用户智能合约。 诚实的请求者首先遵循图5中的协议来验证SGX证明。然后她准备params和callback,用params将$greq设置为Request的开销,将$f设置为$Gmin加上执行callback的开销,并用GASLIMIT$greq调用Request(params, callback, $f)。
如果没有执行callback,她可以使用GASLIMIT$gcncl调用Cancel(id)来接收部分退款。一个诚实的请求者将为她的每个请求最多调用一次Cancel,且不会为任何其他用户的请求调用Cancel。
Money Flow。红色箭头表示资金流动,棕色箭头表示gas limits。线条的粗细表示资源的数量。$gclbk箭头很细,因为$gclbk被限制为$f−$Gmin。
(我个人理解$f就是用户垫付的用于支付Deliver所需的gas的费用。)
Authenticity. 可靠性。 直观地说,可靠性意味着对手(包括恶意的用户、中继或其两者结合起来)无法说服CTC接受与在指定时间抓取指定数据源获得的预期内容不同的数据报。
在我们的正式定义中,我们假设用户和CTC的行为是诚实的。回想一下,用户必须预先验证为飞地公钥pkTC担保的证明σatt。
定义2( Data Feed的可靠性) 对于能与任意Fsgx交互的多项式时间A,当data不是时间T时具有公钥pkurl的url中的内容时,A无法让诚实的验证者接受(pkTC, σatt, params := (url, pkurl, T), data, σ)。(在这个模型中是progencl.Resume(id, params) )
// negl()指可忽略不计的。
定理1 (可靠性)
假设∑sgx和∑是安全签名方案,那么,TC协议在定义2中实现了Data Feed的可靠性。
Fee Safety. 收费安全。
一个诚实的用户应该只需要为代表她诚实执行的计算付费。如果传递了有效的数据报,则这是一个常量值加上执行callback的成本。否则,请求者应该能够收回执行Deliver的成本。为了使定理2成立,CTC必须在取消时保留少量费用,但我们允许用户收回除此少量固定金额之外的所有费用。我们现在将这种直觉形式化。
定理3 (诚实请求者的公平支出)
对于任何params和callback,在提交请求(params,callback,$f,$greq)时,$Greq和$F分别是诚实选择的$greq和$f值。对于诚实用户提交的任何此类请求,有以下情况之一:
Other security concerns. 其他安全问题。 在第6.2节中,我们讨论了对基本TC协议中包含的SGX隔离模型之外的攻击的关注。虽然我们在第8.1节中简要讨论了这一问题,但我们在TC中没有提到的威胁是网络对手进行流量分析的风险或针对机密应用程序(例如,使用private datagrams)的中继泄露的风险。我们还注意到,虽然TC假设数据源的正确性,但如果发生刮取故障,TC会传递一个空数据报,从而使依赖的合约失败。(即使传递了无效的空数据报,但依然会花费使用者的gas。)
TCB Size. TCB大小。 Town-Crier的TCB包括Enclave和TC-Contract。Enclave包括大约46.4K的C/C++代码行,其中绝大多数(42.7K行)是修改的mbedTLS库。mbedTLS的源代码已经被广泛部署和测试,而Enclave代码库的其余部分足够小,可以进行正式验证。TC合约也很紧凑;它由大约120行实体代码组成。
Enclave Response Time. 飞地响应时间。 它的定义为(1)中继向enclave发送请求和(2)中继从enclave接收响应之间的间隔。
表1总结了飞地的总响应时间及其在500次运行中的细分情况。所有时间都以毫秒为单位,包括平均值(mean)、比例(%)、最大值(tmax)、最小值(tmin)和标准差(σt)。注意,Total是端到端响应时间,定义为非冲突响应时间。由于较小的开销没有计入,时间总和可能不等于这个总数。对于作者实现的三个应用程序,enclave响应时间从180 ms到599 ms不等。响应时间显然是从网站获取请求的信息所需的时间。在评估的三个应用程序中,SteamTrade的web scraper时间最长,因为它通过多次往返与目标网站交互以获取所需的数据报。
Transaction Throughput. 吞吐量。 我们执行了一系列实验,测量交易吞吐量,同时将单个支持SGX的主机上并发运行的Enclave的数量从1扩展到20。20 TC enclaves是我们使用的特定机型上的enclave内存限制的最大可能值。图10显示,对于所评估的三个应用,单个SGX机器可以处理15到65 tx/秒。
几个重要的数据点显示了TC如何有效地满足当今区块链对认证数据的需求:以太坊目前平均处理低于1tx/秒。比特币目前的处理速度略高于3tx/秒,其最大吞吐量(在全块利用率下)约为7tx/秒。据我们所知,还没有对以太坊对等网络的吞吐量界限进行测量研究。最近的研究[19]表明,如果不重新设计协议,比特币不能扩展到26 tx/秒以上。因此,使用很少的主机,TC可以很容易地满足分散区块链的数据馈送需求。
(我的老师说这里的数据有点问题,以太坊的处理速度应该是比比特币要快的。)
Gas Costs. Gas花费。 从TC获取数据报的总callback独立成本(即,数据报的成本,而不是应用程序的成本)范围为11.9¢ (CashSettledPut)至12.9¢ (SteamTrade)。(差不多人民币7-8毛钱)。这种变化是由不同的参数长度引起的。
Component-Compromise Resilience. 组件折损弹性。 对于CashSettledPut应用程序,我们实现并评估了两种多数表决模式(如第6.2节所示):
Offline Measurements. 离线测量。 因为clock()在SGX中只产生相对时间,所以TC的绝对时钟通过外部提供的挂钟时间戳进行校准。用户可以通过请求数字签名的时间戳来验证Enclave绝对时钟的正确性。实验表明,中继发送时钟校准请求到飞地和接收到响应之间的时间是11.4(1.9)ms,其中10.5(1.9)ms用于签署时间戳。除此之外,还必须加上广域网的往返延迟,很少超过几百毫秒。
————————
感觉这篇论文有意思的点就在于把SGX和智能合约两个完全不相干的东西联系在了一起,有时候就应该多多扩展思维,往不同的方向尝试。