淺析Move語言背後的設計思想:“不授權”到底安不安全?

作者:@jolestar

來源:《「不授權」到底安全嗎:Move背後的設計思想》

最近關於用戶和Move 智能合約交互,不需要授權(Approve) 是更安全還是更不安全的爭論很多,這裡嘗試用通俗的方式來解釋一下二者背後的區別以及Move 這樣設計背後的思想。

我們先理解一下用戶和智能合約交互的方式。當我們簽了一個交易,去調用一個鏈上的智能合約,就好比從物理世界進入了一個智能合約的數字世界,我們在這個數字世界有一個分身,而這個分身做什麼,是智能合約定義的。

在EVM 中,每個合約都相當於一個獨立的小世界,分身進入這個世界後,只能操作用戶在當前合約世界中的狀態(資產)。

比如進入swap 世界,想用自己的usdt 交換其他資產,而usdt 存在定義usdt 的那個合約世界,沒辦法直接在swap 中以自己的身份從usdt 合約裡提取資產。於是用戶只能先去usdt 的合約世界執行approve,告訴usdt 的合約,swap 可以代自己提取自己的資產,然後再進入swap 世界進行操作。

操作完成之後,再去usdt 那邊取消授權(revoke)。但這裡的approve 和revoke 操作都需要獨立的交易,用戶往往為了節省gas 費用,不進行revoke,結果如果swap 合約出安全問題,用戶的資產就可能在不知情的情況下被盜取。

而在Move 中,所有的合約都在一個大的數字世界運行。用戶的數字分身可以自由的在合約間移動,執行任何操作,同時用戶的狀態(資產)存在用戶自己的存儲空間。

用戶從swap 入口進入,從自己的餘額提取usdt,交換,存儲可以在同一個交易裡原子化完成。這種模式給合約帶來更自由的組合模式,可以玩出很多EVM 上很難實現的組合玩法,這也是EVM 上的賬戶抽象方案想實現的模式。當然,這也帶來了新的安全挑戰。

那EVM 中能否直接增加一個特性,讓合約間的調用可以把用戶身份直接帶過去?這個技術上是可以實現的,但EVM 中支持動態調用,可以調用任意地址的合約,讓這種操作的風險變的很難度量,同時EVM 的狀態變更對用戶和錢包都不友好,錢包很難通過狀態變化對用戶進行提示。

而Move 中解決這個安全挑戰有兩個方法:

1. 在預執行合約的時候把合約執行後的狀態變更提示給用戶,讓用戶可以知道這個交易操作了自己的哪些重要資產,以及執行後的結果。這個方法StarMask 中已經實現,參看鏈接以及附圖https://starcoin.medium.com/starmask-v4-6-

2. 可能有部分合約可以通過設置條件,讓一部分用戶預執行的時候無法發現狀態變更。 @0xmetazen 的分析https://twitter.com/0xmetazen/status/1582581013972414465 ,但Move 中沒有動態調用,合約在部署時,它的執行邏輯就是確定的。可以通過靜態分析字節碼,得到合約所有可能路徑上操作的狀態,在區塊瀏覽器或錢包裡提示給用戶。

EVM 和Move 的兩種方案,帶來的安全風險是不一樣的。 Approve 方案的安全風險是把一個即時的授權變為長期授權,它的風險不是立刻發生的,比如合約漏洞未被發現或者惡意合約放長線釣大魚。而一旦發生,用戶往往很被動,很多用戶可能都忘記授權過哪些合約了。

而Move 的方案給了合約更大的自由權,遇到惡意合約會有較大風險,但這種風險是即刻發生的,是可以通過技術手段來檢測的。最壞的情況,至少前面衝的快到人趟坑了,可以給後面的人警示,惡意合約會快速暴露出來。

最後,世上沒有銀彈,不可能靠用了某種技術就解決了所有安全問題,需要鏈,工具,用戶一起努力。

對Move 用戶的安全建議:

1. 選用狀態變更提示更完備的錢包,並嘗試理解錢包的提示。

2. 不要隨意和來源未知或未開源的DApp 交互。

3. 如果做不到上面兩點,可以等別人先趟一下坑。

Move 在安全方面的挑戰以及改進方案不僅僅是這些,我會在《為什麼是Move》系列的安全篇裡詳述,想了解的朋友可以關註一下。

Total
0
Shares
Related Posts