作者: Desig Labs 编译:Cointime Lu Tian
Sui平台上的多重签名钱包为共享资产控制带来了独特的方法,因为它们需要至少两个加密密钥才能开启。传统上,这种用例可以追溯到保险箱,客户和银行各持有一把物理钥匙,双方钥匙共同解锁保险箱。
在Desig Labs中,我们为希望集成此技术的开发者提供了多重签名SDK,并开发了能够管理个人和组织共享账户的多重签名、多链钱包。
尽管与保险箱相似,但这种钱包的用途更为广泛。用户可以将其配置为需要任意数量的加密密钥(即签名)才能解锁。更有意义的是,这种多重签名钱包可以拥有比解锁所需的授权签名更多的签名。例如,设想一个由40人组成的委员会,每个人都拥有一个授权密钥,但仅需10个密钥即可访问钱包中的数字资产。
在Sui平台上,这个钱包能够支持任何类型的数字资产。以托管为例。一方可能同意从另一方购买实物。买家可以将付款存入双方都持有密钥的多重签名钱包中。买家收到物品后,可以使用钥匙解锁钱包,随后卖家则可以解锁并提取资金。
这个示例可以防止欺诈行为,因为即使卖家没有发货,他们也无法在买家使用其密钥之前提取资金。如果购买过程中出现分歧,双方在解决问题之前,资金将无法动用。
除了共享账户的应用场景外,多重签名钱包还提供了更高的透明度。所有交易规则、签名者以及实际交易都在区块链上公开展示,实现了完整的可见性和责任追踪。这种透明度使得跟踪和审计交易更加便捷,对于需要遵循监管要求的组织和机构而言至关重要。
多重签名的创新
尽管传统的多重签名钱包已经存在了一段时间,但研究人员依然开发了更新、更复杂的解决方案,以满足对高级安全功能日益增长的需求。正如前文所述,数字多重签名钱包的早期实例需要多个密钥来授权交易,并可能存在许多不同的配置。
- 账户抽象化
新的ERC-4337标准允许智能合约在多重签名钱包中保存资金,而无需智能合约参与交易。以太坊区块链的贡献者开发了这项技术,以减少创建传统数字钱包的阻力,并支持现代银行应用程序中常见的交易类型。用户无需助记词,还可以设置自动和重复付款。
这项技术为交易提供了更大的灵活性和控制力,使得那些希望在保持高安全性的同时享受智能合约优势的人们更加青睐该方案。
- 门限签名方案与多方计算
技术结合提升安全性针对我们的多重签名钱包,我们采用了一套被称为门限签名方案(TSS)和多方计算(MPC)的技术。尽管这些技术并非全新,但它们为多重签名钱包提供了极佳的应用场景。
TSS的核心思路并非创建多个加密密钥,而是将私钥分割成多个部分并分发给多个参与方。当各个部分提交时,它们将组成一个完整的主密钥。在链上,这个密钥的功能类似于单一密钥钱包签名。
MPC作为TSS的补充,为存储密钥份额提供了安全的方法。MPC是一个节点网络,用于在不泄露各方私有数据的情况下计算函数。这种技术组合确保任何一方都无法访问完整的私钥,从而增加了攻击者破坏系统的难度。
在Sui平台上应用TSS
Sui支持在n个多重签名交易中的k个生效,其中k为阈值,n为所有参与方的总权重。最大参与人数必须小于等于10。
- 示例工作流程
以下示例展示了在Sui命令行界面中生成用于多重签名交易的密钥的过程。
步骤1:将密钥添加至Sui密钥库
以下命令将为每个支持的密钥方案生成Sui地址和密钥,随后将它们添加至sui.keystore,并列出密钥。
返回的内容类似于下面的示例,但会显示实际的地址和密钥。
步骤2:创建多重签名地址
输入公钥列表及其相应的权重,如下所示,以创建一个多重签名地址。
$SUI_BINARY keytool multi-sig-address --pks $PK_1 $PK_2 $PK_3 --weights 1 2 3 --threshold 3
MultiSig address: $MULTISIG_ADDR
返回的响应类似于以下内容
步骤3:向多重签名地址发送对象
下面的代码片段遵循Sui文档的指导,使用默认URL从本地网络请求Gas。
curl --location --request POST '<http://127.0.0.1:9123/gas>' --header 'Content-Type: application/json' --data-raw "{ \\"FixedAmountRequest\\": { \\"recipient\\": \\"$MULTISIG_ADDR\\" } }"
返回的内容类似于下面的示例
{"transferred_gas_objects":[{"amount":200000,"id":"$OBJECT_ID", ...}]}
步骤4:序列化交易
此步骤展示如何使用属于多重签名地址的对象并序列化待签名的交易。请注意,$TX_BYTES可以是任何序列化交易数据,其中发送方为多重签名地址。仅需使用--serialize-output标志输出Base64编码的交易字节。
$SUI_BINARY client transfer --to $MULTISIG_ADDR --object-id $OBJECT_ID --gas-budget 1000 --serialize-output
Raw tx_bytes to execute: $TX_BYTES
步骤5:用两个密钥签署交易
使用以下代码示例,利用sui.keystore中的两个密钥对交易进行签名。您可以使用其他工具对交易进行签名,只需确保使用标志||
对交易进行序列化即可。
步骤6:将各个签名组合成多重签名地址
以下示例展示了如何组合两个签名。
$SUI_BINARY keytool multi-sig-combine-partial-sig --pks $PK_1 $PK_2 $PK_3 --weights 1 2 3 --threshold 3 --sigs $SIG_1 $SIG_2
MultiSig address: $MULTISIG_ADDRESS # Informational
MultiSig parsed: $HUMAN_READABLE_STRUCT # Informational
MultiSig serialized: $SERIALIZED_MULTISIG
步骤7:使用多重签名地址执行交易
本示例使用多重签名地址来执行交易。
$SUI_BINARY client execute-signed-tx --tx-bytes $TX_BYTES --signatures $SERIALIZED_MULTISIG
基于MPC的多重签名
在SUI平台上的应用MPC方法用于存储上一节中生成的各种密钥份额。在我们的MPC实现中,我们采用了一种名为Shamir秘密共享(SSS)的算法,它能够在一组人员之间共享秘密,但仅当达到一定阈值的人数时,才能恢复这个秘密。
SSS允许从特定数量的份额中以数学方式推导出整个秘密(在我们的案例中是一个密钥)。例如,一把密钥被分成20份,可能需要至少10份才能获取整个密钥。如果黑客成功窃取了该密钥的五个份额,他们将无法推导出完整的密钥。
这项功能在分布式系统(如区块链)中非常有效。环境本身强制数据完整性,并建立在共享资源的原则之上。
将SSS集成到TSS-MPC中带来了许多优势。首先,没有可能被黑客攻击或丢失的中央密码。由于密钥的一部分分布在多人之间,因此需要对其中很大一部分人进行黑客攻击才能获取整个密钥。同样,如果该组中的一些人丢失了密钥的一部分,只要剩余的份额足够,仍然可以推导出完整的密钥。从社群的角度来看,这项技术需要达到法定人数的同意才能使用密钥,从而防止任何一个人或少于阈值的人获取密钥。
TSS-MPC的复杂性意味着实施需要一定的专业知识,并且它比简单方案使用更多的计算资源。后者与网络问题相结合,可能会导致用户在最初生成密钥时出现延迟。协调大型团队之间的密钥共享也会带来问题,通常需要良好、清晰的沟通。
在SUI平台上构建基于TSS-MPC的多重签名通过我们的TSS-MPC实现和以下代码示例,我们希望使开发者能够轻松地将多重签名技术添加到他们的项目中。首先,您需要使用Yarn包管理器安装@desig/web3。在命令行界面中,输入yarn add @desig/web3
。
示例1:以下代码示例展示了如何快速创建多重签名、生成解锁操作提案以及在获得足够密钥持有者同意的情况下执行最终的解锁交易。
示例2:下面的示例代码详细描述了使用多重签名完成SUI转账的完整流程。
第一步:创建多重签名
第二步 :生成SUI转账提案
第三步:执行SUI转账
共享安全
在Desig Labs,我们开发的多重签名技术为共享资产提供了安全性和关键解决方案,无论是临时性的(如托管服务)还是永久性的(如团队金库)。Sui的去中心化特性使其成为共享控制多重签名钱包的理想补充环境。
请查阅我们的多重签名文档,并使用上述代码示例将其集成到您的项目中。如果您有任何问题,请随时联系我们。
我们期待看到各种项目为我们的多重签名安全性找到广泛应用。
所有评论