區塊鏈相關論文研讀6: FASTKITTEN,關於比特幣的實用智能合約

這篇文章首發於知乎專欄:https://zhuanlan.zhihu.com/p/89090472

 

這篇論文發表在頂會USENIX Security Symposium 2019上面,題目爲《FASTKITTEN: Practical Smart Contracts on Bitcoin》,第一作者爲Poulami Das。通過下面的鏈接可以找到作者在會議上面演講視頻。PPT很好,演講也很好,建議在看論文之前先看作者的演講。

FastKitten: Practical Smart Contracts on Bitcoin​www.usenix.org

 

論文的問題描述

區塊鏈上的智能合約本質上是區塊鏈上的代碼,因此能夠進行邏輯運算。比如可以使用智能合約實現上圖所示的撲克牌遊戲,三個玩家分別向智能合約輸入自己的牌,然後智能合約進行邏輯運算,確定贏家,輸出結果。智能合約能夠讓一個區塊鏈網絡有不同的用途,同一個區塊鏈中的不同智能合約相當於智能手機中的不同的應用軟件。智能合約這麼重要,但是現在區塊鏈最成功的應用之一比特幣不支持智能合約,它只有一種功能:數字加密貨幣。那麼,

是否可以讓比特幣網絡支持智能合約?

但是現在的加密貨幣的智能合約(比如以太坊)存在速度慢、貴、運行時無隱私保護等問題。本論文針對比特幣網絡提出了一個能夠在鏈外執行(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提交懲罰押金給智能合約,通過向區塊鏈發起一個交易 [公式] 來實現。這個交易的輸入是Operator未花費的錢,輸出是各個parties的地址,也就是把Operator的懲罰押金轉給每一個parties,但是它time-lock的,只有到了timeout的時間之後,該交易的輸出金額才能被parties花費掉。從後面的分析中會發現,這個設置可以防止Operator作惡。

所以,Operator需要把這個交易分別發給各個parties。如下圖所示。

對於各個Party,她們通過驗證Operator發過來的數據,知道Operator已經提交了押金,以及TEE已經設置好了。於是她們需要向智能合約提交懲罰押金,也是通過向區塊鏈發起一個交易TX來實現,對應下圖的 [公式] 。它們不是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的最終計算結果的輸出 [公式] 向區塊鏈發起一個交易 [公式] ,用於向Operator和各個parties退還押金以及向贏家發送相關報酬等。這一步的操作需要寫到區塊鏈中,防止篡改和欺騙。

上面的三個階段是在各個參與者都誠信可靠的情況下完成的。但是,

如果有人作惡怎麼辦?

對於作惡,可以歸結爲兩種,一種是篡改數據,第二種是丟棄數據或者故意停止工作。前者可以通過數字簽名來解決。而後者怎麼辦呢?論文主要講解後者。

情況1,Operator作惡

如果Operator故意丟棄數據或者故意停止服務,那麼其之前所提交的押金在timeout之後被各個parties消費掉,以此來懲罰operator。

情況2,Party作惡

比如Alice故意停止工作,沒有給Operator發送TEE所需要的input數據。這時候TEE沒有收到Alice的input數據,但是TEE不確定是Operator丟棄了該數據還是Alice沒有發送。Operator爲了證明自己的清白,於是,它向區塊鏈發起一個challenge交易,記 [公式] ,如下圖所示,該交易的輸入是Operator自己的一些未花費的錢,輸出是Alice的地址,並且有一個數據域Data,裏面存儲了在當前round中TEE計算結果的輸出值 [公式] 。如果Alice沒有作惡,只是她發給Operator的input數據在網絡傳輸途中丟失了。這時候,Alice需要證明自己的清白,因此她需要回應Operator所發起的challenge交易。Alice需要時時檢查有沒有發給自己的challenge交易,如果有,需要向區塊鏈發起一個交易,記 [公式] ,作爲對應challenge交易的迴應。該response交易的輸入是Operator發給Alice的錢,輸出是Operator的地址,目的是把這個錢返還給Operator,並且其數據域Data是發送給TEE的input數據。這樣,Operator檢查到Alice的迴應之後,就能夠從區塊鏈中拿到這個input數據,然後轉發給TEE,TEE正常執行。如果在Operator發起 [公式] 過了一定的時間之後Alice還是沒有反應,那麼TEE中的智能合約就能夠斷定Alice作惡,因此沒收Alice的押金,結束協議。

怎麼沒收Alice的押金呢?如下圖所示,通過向區塊鏈發起一個交易 [公式] ,其輸出包含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來完成一個活動(比如打撲克牌)。

謝謝!

 

都看到這裏了,給一個讚唄

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章