Cover photo

錢包 Recovery 機制(下)

錢包 Recovery 機制介紹(下):Recover Contract Account

  • 作者: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 換成其他地址
Guardian 可以將 Owner 換成其他地址
當 Alice 遺失私鑰時,可以請 Bob 幫忙更新錢包 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,合約錢包就會執行
合約錢包沒辦法識別 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 組合

不過要注意權重這個設計帶來彈性,但相對地在評估安全性會更複雜。例如每次當使用者新增或移除一位 Guardian、調整某位 Guardian 的權重,或調整門檻值 t,他都要評估過一次所有 Guardian 彼此的不同組合,看是否會導致原本預期的某些組合從「足夠權重可以還原」變成「權重不夠還原」,或是從預期「權重不夠還原」變成「足夠還原」,破壞原本使用者的安全假設。

新增一個 Guardian (Grace),造成新的三組可以超過門檻值的 Guardian 組合
新增一個 Guardian (Grace),造成新的三組可以超過門檻值的 Guardian 組合
調整一個 Guardian (Bob) 的權重,造成一組舊的組合無法超過門檻值
調整一個 Guardian (Bob) 的權重,造成一組舊的組合無法超過門檻值
調整門檻值 t,造成新的五組可以超過門檻值的 Guardian 組合
調整門檻值 t,造成新的五組可以超過門檻值的 Guardian 組合

不同之處:SSS 的 Share 是永久有效

前一篇用 SSS 將私鑰分片並分配 Share 給不同 Guardian 的方式有一個缺點是:Share 是永久有效的,除非使用者換一把私鑰。這表示雖然攻擊者駭進了其中一個 Guardian 並拿到一份 Share,雖然還不足以還原出完整私鑰,但攻擊者可以持續發動攻擊去拿到其他份 Share,直到他湊滿足夠的 Share。但在合約錢包裡如果 Owner 懷疑 Guardian 被駭,他可以直接將 Guardian 替換掉,被替換掉的 Guardian 將無法再對該合約錢包起任何效用。

不同之處:合約錢包更多彈性

在 SSS 中,門檻值 t 一但設定了就沒辦法改變,除非換一把私鑰。但在合約錢包中,使用者可以新增、移除 Guardian,也可以隨時改變門檻值 t。另外合約錢包也能加上例如時間鎖的機制(下面會介紹)。

比較表格

post image

可以結合 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 不會馬上生效
有了時間鎖,Guardian 更新 Owner 不會馬上生效
如果 Owner 即時發現,就可以取消 Recovery 並換掉 Guardian
如果 Owner 即時發現,就可以取消 Recovery 並換掉 Guardian

時間鎖能多一層保障,讓 Recovery 不會馬上生效、讓使用者有時間反應,但仍然無法免除對 Guardian 的信任需求。

如果 Owner 沒有發現,當時間鎖結束 Owner 就會被換掉,等於失去合約錢包控制權
如果 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 是壞人且使用者沒有在時間鎖結束前取消,錢包控制權依然會被拿走