通过多签合约实现多个用户可访问的安全账户。多签(multi-sig)钱包和账户通过允许多个用户在预定义条件下访问共享资产,或让单个用户实施额外的安全措施,从而增强密钥管理。例如,多签钱包可以用于管理去中心化自治组织(DAO)的资金,需要一定比例的成员同意才能执行交易,或者为寻求额外保护的个人提供,将访问权限分布在多个设备或位置。
Sui原生多签钱包有多种应用。它们可以用于创建互动游戏元素或需要集体用户操作才能访问的商业平台。建立用户法定人数或其他访问条件,确保数字资产不会被任何单个密钥/成员未经授权使用。
本文将详细介绍Sui Move多签智能合约如何验证Sui地址是否为多签,并支持多种密钥组合,如2-of-3或任何M-of-N。将多签功能直接集成到智能合约中,而不是通过SDK,形成了明显的优势。这种方法使开发人员可以在合约逻辑内精确控制访问和授权,允许他们在允许执行功能之前规定特定条件,如指定地址子集的签名。如此详细的控制通过防止未经授权的合约或资产转移来增强安全性。
将多签直接融入智能合约对于创建具有适应性治理模型的安全和有韧性的应用至关重要。这为去中心化网络内的信任和合作奠定了基础。
链上多签至关重要,因为它在去中心化操作中提供了透明性和可验证性。它确保只有在满足各利益相关方一致同意的条件时,才能执行诸如智能合约功能之类的操作。例如,知道智能合约功能的调用者是否为多签地址,可以实现细化的约束。如果交易由5个成员中的3个签署,则最多可以转移1000个币;相反,如果只有5个成员中的1个签署,则交易限额可以设为100个币。根据共识水平设置交易阈值的灵活性在安全性和功能性之间提供了平衡,使得链上多签成为区块链领域集体资产管理和决策的不可或缺的功能。
创建和使用Move中的多签检查合约
多签地址是一种特殊类型的地址,需要多个签名才能授权交易。多签检查智能合约从一组公钥、权重和阈值中派生出多签地址,并将其与预期地址进行比较。
多签地址需要多个签名才能授权交易。它们通常用于通过在多方之间分配控制权来增强资金的安全性。例如,2-of-3多签地址需要三名签署者中的至少两名批准交易。多签地址还可以用于治理、托管或备份目的。
多签智能合约执行以下三项功能:
- 派生多签地址
- 验证多签地址
- 检查发送者是否为多签地址
派生多签地址
多签模块定义了 derive_multisig_address_quiet函数,它接收三个参数:pks、weights和threshold。
- pks参数是一个字节向量,表示签署者的公钥
- weights参数是一个字节向量,表示每个签署者的权重
- threshold参数是一个16位无符号整数,表示从多签地址执行交易所需的最小权重之和
该函数返回一个地址,即派生出的多签地址。
public fun derive_multisig_address_quiet(
pks: vector<vector<u8>>,
weights: vector<u8>,
threshold: u16,
): address {
该函数执行以下步骤:
定义一个类型为8位无符号整数的变量multiSigFlag,并将其赋值为0x03,这是多签地址的标志。
let multiSigFlag = 0x03;
它创建一个空的字节向量hash_data,用于存储将要哈希的数据。
let hash_data = vector<u8>[];
它获取pks和weights向量的长度,并检查它们是否相等。如果不相等,则以错误代码ELengthsOfPksAndWeightsAreNotEqual中止执行。
let pks_len = pgs.length();
let weights_len = weights.length();
assert!(pks_len == weights_len, ELengthsOfPksAndWeightsAreNotEqual);
它初始化一个16位无符号整数类型的变量sum,并将其赋值为0。然后遍历weights向量,并将每个元素的值相加到sum中。接着检查threshold是否为正且不大于sum。如果不符合条件,则以错误代码 EThresholdIsPositiveAndNotGreaterThanTheSumOfWeights中止执行。
let mut sum = 0;
let mut i = 0;
while (i < weights_len) {
let w = weights[i] as u16;
sum = sum + w;
i = i + 1;
};
assert!(threshold > 0 && threshold <= sum, EThresholdIsPositiveAndNotGreaterThanTheSumOfWeights);
它将添加到hash_data向量。然后使用bcs::to_bytes函数序列化阈值,并将结果附加到hash_data向量。
它将multiSigFlag推送到hash_data向量中。然后,使用bcs::to_bytes函数对阈值进行序列化,并将结果附加到hash_data向量中。
hash_data.push_back(multiSigFlag);
let threshold_bytes: vector<u8> = bcs::to_bytes(&threshold);
hash_data.append(threshold_bytes);
它遍历pks和weights向量,并将每对元素附加到hash_data向量。
let mut i = 0;
while (i < pks_len) {
hash_data.append(pks[i]);
hash_data.push_back(weights[i]);
i = i + 1;
};
它使用blake2b256函数对hash_data向量进行哈希,并使用 address::from_bytes函数将结果转换为地址。然后将地址赋值给变量ms_address并返回。
let ms_address = address::from_bytes(blake2b256(&hash_data));
ms_address
}
最终,它派生出一个多签地址并返回该多签地址。
验证多签地址
多签模块还定义了check_multisig_address_eq函数,用于检查创建的多签地址是否与预期地址匹配。正如我们上面提到的,多签地址是一种特殊类型的地址,需要多个签名才能授权交易。多签地址由一组公钥、权重和阈值定义。
函数check_multisig_address_eq接受四个参数:pks、 weights、 threshold和expected_address。前面三个参数与我们在之前的函数 derive_multisig_address_quiet中使用的参数相同。最后一个参数 expected_address是我们希望与多签地址进行比较的地址值。
public entry fun check_multisig_address_eq(
pks: vector<vector<u8>>,
weights: vector<u8>,
threshold: u16,
expected_address: address,
): bool {
该函数首先调用derive_multisig_address_quiet函数,从给定的公钥、权重和阈值创建一个多签地址。此函数使用基于哈希的算法将公钥和阈值组合成一个16字节的值,然后将其转换为一个地址。
let ms_address = derive_multisig_address_quiet(pks, weights, threshold);
然后,该函数将多签地址与预期地址进行比较,如果地址相等,则返回true,否则返回false。
return (ms_address == expected_address)
函数check_multisig_address_eq可用于验证多签地址是否正确并与预期值匹配。这对于测试、调试或审计非常有用。例如,可以使用此函数检查多签地址是否与签署者一致同意的公钥和阈值一致。
检查发送者的多签地址
最后,多签模块还定义了check_if_sender_is_multisig_address函数,用于检查发送者是否与从提供的pks、weights和threshold派生的多签地址相同。
check_if_sender_is_multisig_address接受四个参数:pks、weights、threshold和ctx。前三个参数定义了多签地址方案,最后一个参数提供了交易信息。
- pks参数是一个字节向量,表示签署者的公钥
- weights参数是一个字节向量,表示每个签署者的权重
- threshold参数是一个16位无符号整数,表示从多签地址执行交易所需的最小权重和
- ctx是TxContext的一个可变引用,包含当前交易的信息,如发送者
public fun check_if_sender_is_multisig_address(
pks: vector<vector<u8>>,
weights: vector<u8>,
threshold: u16,
ctx: &mut TxContext
): bool {
check_if_sender_is_multisig_address函数调用 check_multisig_address_eq函数,将多签地址与发送者地址进行比较。
check_multisig_address_eq(pks, weights, threshold, ctx.sender())
}
如果发送者地址与多签地址方案匹配,check_multisig_address_eq函数返回true,否则返回false。
开始使用多签功能
多签地址在需要增强安全性、责任制或多个方协作的场景中非常有用。考虑到Sui上存储的宝贵数字资产,多签地址可以帮助保护这些资产的安全。
本文描述的智能合约可以帮助您开始构建设计用于协作和联合托管资产的应用程序。作为进一步的资源,您可以在GitHub上查看该项目的源代码和文档。
关于 Sui Network
Sui是基于第一原理重新设计和构建而成的L1公有链,旨在为创作者和开发者提供能够承载Web3中下一个十亿用户的开发平台。Sui上的应用基于Move智能合约语言,并具有水平可扩展性,让开发者能够快速且低成本支持广泛的应用开发。获取更多信息:https://linktr.ee/sui_apac
官网|英文Twitter|中文Twitter|Discord|英文电报群|中文电报群