多签账户

为了保证Staking资产拥有权始终只受控于用户,不受第三方控制,Stafi设计了一个中间地址来完成此目标,没有任何一个人能拥有此地址的私钥。Stafi通过安全多方计算技术和门限多签技术实现中间地址的资产中立性,保证只有拥有rToken的用户发起赎回时才能执行签名。此中间地址并不会存在一个私钥,更不会存储在Stafi协议上,只有在需要签名的时候,通过多个SSV的私钥共同签名来形成。

大多数链都在底层账户结构上支持了多签。一个账户设置多个私钥,并可以为每个私钥分配权重,当签名的私钥的总权重满足临界值时,即可操作账户里的资产。但复用原链底层的多签功能,对于Stafi来说,既不方便,也不安全。

Stafi的多签账户需要做到签名人是可以轮换的。原链底层的多签功能,大多不支持轮换,或者需要一个超级私钥(owner),来操作轮换。

对于不支持轮换的情况,变通的办法是在轮替时,将当前账户里的资产,转移到一个由新的验证人小组控制的新的多签账户。然而这样做,会使得账户里的资产没法稳定的做Staking,也会白白付出很多交易费用。

对于需要一个超级owner来操作轮换的情况,Stafi更不能接受,因为owner私钥将是最大的安全隐患,既容易发生道德风险,也容易被黑客觊觎。

因而,Stafi的多签需要通过合约层来实现。通过合约来生成多签账户,该多签账户不存在一个owner私钥,而是由合约本身约定了一个公钥列表(也可以说是账户列表),使得该账户可以由列表中的公钥对应的私钥共同控制,合约同时也约定了,列表的一定多少比例的私钥签名,可以操作账户资产,多少比例的私钥签名,可以更新该列表。

控制多签账户的这些私钥背后对应的角色,即SSV

当M-of-N 个SSV签名的时候,即可对多签账户进行以下操作

①持有rToken在用户申请赎回时,操作转出多签账户的资产到用户提供的地址

②操作委托Staking和取消委托Staking.

在多签的具体实现方式上,根据不同的链会有不同的策略,因为在不同的链上编写多签合约,其方法有可能是完全不同的。Stafi需要因链制宜,选择不同的技术路线。当然,在用户端看来,在stafi上委托Staking不同的token,感觉上不会有任何不同。面对复杂性,封装复杂性是Stafi开发团队要做的事情,呈现给用户的永远是归一化的,认知简化的界面。

如上所述,多签账户是一个安全的中间账户,因为:

①免于单个SSV作恶或失职造成影响

单个SSV,无法控制多签账户的资产,另外系统有N-M/M的容错率,个别SSV不签名,不影响相关操作的执行。

②免于多个SSV串通作恶造成资产损失

多个SSV串通面临以下困难,串通是需要时间的,而SSV会定期轮换,且下一个任期(Era)当选的SSV是随机的,无法预测的,这使得串通很难完成。即便串通得逞,也会面临失去应得的奖励和严厉的惩罚威慑,令串通作恶是一种得不偿失的行为。

③ 免于黑客攻击造成资产损失

首先,单个多签账户中的资产量是有限的,不容易成为黑客攻击的目标,其次,多签账户不存在owner私钥,黑客不可能通过盗取一个私钥而成功窃取资产。黑客必须在一个SSV任期内,盗取小组内M个SSV私钥,这个几乎不可能实现。(为了提高安全度,Stafi还会要求SSV定期更换秘钥。)