作者:Nic Lin @imToken Labs
校對:imToken Labs
封面來源:rawpixel.com @freepik
適合讀者:一般區塊鏈錢包使用者
先備知識:
- 了解智能合約
- 知道 EOA(External Owned Account)及合約帳戶的不同
以下將視「帳戶」或「錢包」兩個詞為同義並將交互使用;另外「Contract Account」、「Contract Wallet」也會視為同義,都是指「合約錢包」。
合約錢包的 Recovery 機制
相比於 EOA 的控制權就是那一把私鑰,合約錢包的「控制權」可以非常複雜且多元,因為它是透過智能合約實現。舉一個基本的合約錢包 Recovery 機制為例,這個合約錢包裡有兩個角色,分別是 Owner 與 Guardian。當 Alice 建立自己的合約錢包時會指定自己的地址為 Owner,並指定 Bob 的地址為 Guardian。當 Alice 遺失自己的私鑰時,她可以請 Bob 去觸發她的合約錢包,將 Owner 更新成她的新地址。
Guardian 可以將 Owner 換成其他地址
當 Alice 遺失私鑰時,可以請 Bob 幫忙更新錢包 Owner 為新的地址
可以看到合約錢包的 Recovery 機制並不是真的找回 Owner 原本的私鑰,而是找回合約錢包的控制權,確保使用者還能繼續使用合約錢包就好。這是因為 EOA 的控制權和其私鑰是完全綁定,但合約錢包的控制權不需和某一把特定私鑰綁定,而是可以任意切換。只要合約裡規則定好,控制錢包的私鑰都能隨時進行更換。
和利用 SSS 的 Recovery 機制比較
利用 SSS 的 Recovery 機制可以參考上一篇的備份部分私鑰。以下為了方便比較,會將 SSS 中負責保管 Share 的角色也稱為 Guardian。
相同之處:必須要信任 Guardian
使用者必須相信 Guardian 在需要執行 Recovery 的時候會提供幫助、相信 Guardian 不會在未經允許的情況下執行 Recovery 並拿走錢包控制權。在合約錢包中 Guardian 會被授權可以將 Owner 設置為另一個地址,好讓 Owner 在遺失私鑰時可以透過 Guardian 協助更新 Owner 地址來拿回錢包控制權。但這也表示 Guardian 有權利來將 Owner 設置為任意地址,所以使用者必須相信 Guardian。
註:合約錢包沒辦法知道 Owner 是否真的遺失私鑰,它只能按照它寫好的規則執行:如果 Guardian 來執行 Recovery,它就相信 Owner 真的遺失私鑰了。
合約錢包沒辦法識別 Owner 私鑰是否真的遺失。Guardian 請求更新 Owner,合約錢包就會執行
相同之處:可以有多個 Guardian
如果使用者不相信單一個 Guardian,他也可以同時設置多個 Guardian。和 SSS 中一樣,合約錢包也會設定一個門檻值 t,要有超過 t 個 Guardian 授權才可以執行 Recovery。
相同之處:可以設定 Share 或 Guardian 權重
和 SSS 可以為 Share 指定權重一樣,合約錢包也可以讓使用者指定每個 Guardian 的權重,例如 Alice 為自己的家人都指定 100 的權重,為自己的好友指定 50 的權重,為工作同事指定 10 的權重。所以如果門檻值 t 設為 100 的話只需要一位家人參與;如果是好友的話就需要兩位;如果是好友加上同事的話就需要一位好友加上五位同事。
Guardian 權重及各個可以超過門檻值的 Guardian 組合
不過要注意權重這個設計帶來彈性,但相對地在評估安全性會更複雜。例如每次當使用者新增或移除一位 Guardian、調整某位 Guardian 的權重,或調整門檻值 t,他都要評估過一次所有 Guardian 彼此的不同組合,看是否會導致原本預期的某些組合從「足夠權重可以還原」變成「權重不夠還原」,或是從預期「權重不夠還原」變成「足夠還原」,破壞原本使用者的安全假設。
新增一個 Guardian (Grace),造成新的三組可以超過門檻值的 Guardian 組合
調整一個 Guardian (Bob) 的權重,造成一組舊的組合無法超過門檻值
調整門檻值 t,造成新的五組可以超過門檻值的 Guardian 組合
不同之處:SSS 的 Share 是永久有效
前一篇用 SSS 將私鑰分片並分配 Share 給不同 Guardian 的方式有一個缺點是:Share 是永久有效的,除非使用者換一把私鑰。這表示雖然攻擊者駭進了其中一個 Guardian 並拿到一份 Share,雖然還不足以還原出完整私鑰,但攻擊者可以持續發動攻擊去拿到其他份 Share,直到他湊滿足夠的 Share。但在合約錢包裡如果 Owner 懷疑 Guardian 被駭,他可以直接將 Guardian 替換掉,被替換掉的 Guardian 將無法再對該合約錢包起任何效用。
不同之處:合約錢包更多彈性
在 SSS 中,門檻值 t 一但設定了就沒辦法改變,除非換一把私鑰。但在合約錢包中,使用者可以新增、移除 Guardian,也可以隨時改變門檻值 t。另外合約錢包也能加上例如時間鎖的機制(下面會介紹)。
比較表格
可以結合 SSS 和合約錢包 Recovery
合約錢包 Recovery 機制不會規定 Guardian 該怎麼設計,只要 Guardian 能夠送交易到合約來執行即可,所以使用者可以採用合約錢包 Recovery 機制,而讓 Guardian 採用 SSS 來提升 Guardian 的可靠程度。
Guardian 的選擇
在 SSS 中將 Share 存在雲端或交給親朋好友保管,並在有需要的時候再取回 Share 來還原私鑰。但在合約錢包中,Guardian 不是作為單純保管 Share 的功用,Guardian 需要是能持有私鑰並能實際去鏈上執行合約錢包的角色。
錢包廠商作為 Guardian
使用者使用錢包廠商提供的合約錢包及錢包軟體,其實就隱含著使用者相信錢包商。錢包商如果要作惡,它是可以拿走使用者資產甚至錢包控制權的。而因為這一個不可避免的信任關係,錢包商很適合作為 Guardian:使用者沿用原本對錢包商的信任,就不需再引入對其他第三方的信任需求。
Social Recovery
如果使用者請自己的朋友同學來擔任 Guardian,那就屬於 Social Recovery。如果使用者覺得要相信錢包廠商作為 Guardian 而感到不放心的話,使用者也可以指定他相信的親朋好友作為 Guardian。但因為這些親朋好友不一定是專業的人,不像錢包商那樣能保管好自己的私鑰、能隨時提供服務,而這也是 Social Recovery 的缺點:親朋好友的服務品質較低且參差不齊。因此如何設計出簡單好用但又安全的 Social Recovery 介面與流程,避免機制出錯或親朋好友失誤導致無法還原就是 Social Recovery 的主要挑戰。
註:如果使用者邀請許多信任度沒有那麼高的朋友同事來作為 Guardian 的話,有一個能降低這些 Guardian 彼此合謀機會的機制會是一個不錯的設計,例如不讓其他人從合約錢包就能看出 Guardian 有誰,就能避免 Guardian 彼此互相聯繫。但這樣的功能會有相對應的代價,不過這邊礙於篇幅不展開介紹。
遏止 Guardian 作惡的機制
前面有提到不管是哪種 Recovery 機制,都必須要信任 Guardian。使用者可以新增多位 Guardian 並設定較高的門檻值 t,但一樣必須要相信這些 Guardian 中不會超過 t 位壞人。這個信任是沒辦法避免的,要引入第三方的幫忙,就會需要信任第三方,否則就只能靠自己備份。
如果使用者對「完全信任 Guardian」的關係感到不安,他可以在合約錢包的 Recovery 機制中加入一些遏止機制來提昇一些保障,例如時間鎖。但請記住,這些遏止機制「不能取代對 Guardian 的信任需求」!這些遏止機制只是多了一些機關讓使用者在發現 Guardian 作惡時能即時制止對方。
註:這些防範機制只適用於合約錢包的 Recovery 機制,不適用於 SSS Recovery 機制。
時間鎖及取消鍵
時間鎖能延長 Recovery 生效的時間。例如 Guardian 來執行 Recovery 將 Owner 地址換掉,但需要兩天才能生效。在這兩天期間內,Owner 能隨時來「取消」Recovery,並把 Guardian 換掉。但如果 Owner 沒能在時間鎖期間內取消,Recovery 就會生效,Owner 就會被換掉,使用者就失去錢包控制權。
有了時間鎖,Guardian 更新 Owner 不會馬上生效
如果 Owner 即時發現,就可以取消 Recovery 並換掉 Guardian
時間鎖能多一層保障,讓 Recovery 不會馬上生效、讓使用者有時間反應,但仍然無法免除對 Guardian 的信任需求。
如果 Owner 沒有發現,當時間鎖結束 Owner 就會被換掉,等於失去合約錢包控制權
總結
- 合約錢包因為是用智能合約來實現,所以它的控制權可以比 EOA 錢包來得更彈性多元
- 合約錢包的控制權並不會和單一把私鑰綁定,而是可以隨時依照合約寫好的規則將有控制權的私鑰換成另外一把。因此使用者並不需要擔心一定要把他的私鑰備份好,當他遺失舊的私鑰時,只要產生一把新的私鑰並透過 Recovery 機制換掉合約錢包裡記錄的私鑰即可
- 使用者在合約錢包裡的角色是 Owner,而合約錢包 Recovery 機制會有另一位角色,稱為 Guardian。Guardian 會負責在使用者遺失私鑰時,將 Owner 地址更新成使用者新的私鑰對應的地址
- 合約錢包的 Recovery 機制和利用 SSS 的 Recovery 機制相比,有以下相同之處:(1) 都必須信任 Guardian、(2) 可以有多位 Guardian、(3) 可以為 Share/Guardian 設定權重
- 如果 Guardian 是壞人(或多數是壞人)或被駭,那 Guardian 就能透過 Recovery 機制拿走合約錢包或 EOA 錢包的控制權
- 權重設計帶來彈性,但也要記得每次新增移除 Guardian、調整 Guardian 權重或是調整門檻值 t,都要記得重新評估不同 Guardian 組合,看是否有新的組合從「權重不夠還原」變成「足夠還原」,或是舊的組合從「權重足夠還原」變成「不夠還原」
- 合約錢包的 Recovery 機制和利用 SSS 的 Recovery 機制相比,有以下不同之處:(1) 合約錢包的 Guardian 是可以被移除、註銷的,不像 SSS 的 Share 是永久有效的,除非使用者換一把私鑰、(2) 合約錢包更多彈性,可以隨時調整門檻值 t、可以新增像是時間鎖的機制
- Guardian 可以選擇錢包廠商作為 Guardian,優點是其專業程度,以及可以沿用原本對錢包廠商的信任(Guardian 是必須要被信任的);使用者也可以選擇找親朋好友作為 Guardian,但要確保對方能保管好自己的私鑰、能隨時提供服務
- 如果對 Guardian 不是太放心,可以加上時間鎖的機制,避免 Recovery 馬上生效,讓使用者有時間反應。但要注意,時間鎖並不能移除對 Guardian 的信任。如果 Guardian 是壞人且使用者沒有在時間鎖結束前取消,錢包控制權依然會被拿走