如何在Sui智能合约中验证是否为多签地址

news2024/11/23 7:50:53

通过多签合约实现多个用户可访问的安全账户。多签(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>[];

它获取pksweights向量的长度,并检查它们是否相等。如果不相等,则以错误代码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);

它遍历pksweights向量,并将每对元素附加到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、 thresholdexpected_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函数,用于检查发送者是否与从提供的pksweightsthreshold派生的多签地址相同。

check_if_sender_is_multisig_address接受四个参数:pksweightsthresholdctx。前三个参数定义了多签地址方案,最后一个参数提供了交易信息。

pks参数是一个字节向量,表示签署者的公钥

weights参数是一个字节向量,表示每个签署者的权重

threshold参数是一个16位无符号整数,表示从多签地址执行交易所需的最小权重和

ctxTxContext的一个可变引用,包含当前交易的信息,如发送者

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|英文电报群|中文电报群

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1680943.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Leetcode---1.两数之和 (详解加哈希表解释和使用)

文章目录 题目 [两数之和](https://leetcode.cn/problems/two-sum/)方法一&#xff1a;暴力枚举代码方法二&#xff1a;哈希表代码 哈希表哈希表的基本概念哈希函数&#xff08;Hash Function&#xff09;&#xff1a;冲突&#xff08;Collision&#xff09;&#xff1a;链地址…

mysql 查询---多表设计

部分数据 1distinct去重 select distinct job from tb_emp;select * from tb_emp where id in (1,2,3); select * from tb_emp where id between 1 and 5; select * from tb_emp where name like __; #下划线匹配单个字符, %匹配任意多个字符select min(entrydate) from tb_e…

JUnit5参数化用例(三)

JUnit5枚举参数的参数化&#xff1a; 使用枚举类作为测试数据枚举参数参数化注解EnumSource必须与ParameterizedTest结合使用 枚举参数化注解 -简单使用&#xff1a; 需要添加EnumSource注解测试方法传入枚举类作为参数 在执行前&#xff0c;我们需了解enum枚举的使用方式&…

LLama3大模型本地部署 仅需6步完成对话模型本地安装部署。附送可视化ui安装、自定义模型目录,修改模型保存地址,第三方微调模型、中文模型下载地址

本篇分为三部分 一&#xff1a;6步完成llama3大模型本地部署 二&#xff1a;8步完成llama3可视化对话界面安装 三&#xff1a;重设模型文件路径 四&#xff1a;微调模型、中文模型下载资源分享 一、LLama3 大模型本地部署安装 首先去mata官网下载ollama客户端 Ollama 选择合适…

线程池 ThreadPool

一般情况下我们都使用Thread类创建线程&#xff0c;因为通过Thread对象可以对线程进行灵活 的控制。但过多创建线程和销毁线程&#xff0c;会消耗掉大量的内存和CPU资源&#xff0c; 假如某段时间内突然爆发了100个短小的线程&#xff0c;创建和销毁这些线程就会消耗很多时间&a…

如何使用一段传输线表示电感和电容

文中部分图片来自于《complete Wireless design》 如何使用一段传输线来表示电感和电容&#xff0c;本文将就此内容展开&#xff1a;

Redis-如何保证与Mysql数据一致性

文章目录 Redis与Mysql数据一致性的情况有哪些&#xff1f;Redis与Mysql数据保持一致性的方案&#xff1f;同步双写机制删除缓存重新加载机制延迟双删机制利用MQ保持数据一致性 本篇小结 更多相关内容可查看 Redis与Mysql数据一致性的情况有哪些&#xff1f; Redis和MySQL是两…

vue3 自定义组件

在项目中&#xff0c;我们会遇到一些没有现成的组件&#xff0c;那这个时候我们就需要自己去写一个满足我们需求的组件。 比如&#xff0c;我需要一个上下排布&#xff0c;上面显示标题&#xff0c;下面显示内容的组件。封装完成后方便复用。 1、布局组件 我定义一个上下结构的…

Git使用(4):分支管理

一、新建分支 首先选择Git -> Branches... 然后选择 New Branch&#xff0c;输入新分支名称&#xff0c;例如dev。 可以看到右下角显示已经切换到新建的dev分支了。 push到远程仓库&#xff0c;可以看到新添加的分支。 二、切换分支与合并分支 为了演示合并分支&#xff0c…

Linux(七) 动静态库

目录 一、动静态库的概念 二、静态库的打包与使用 2.1 静态库的打包 2.2 静态库的使用 三、动态库的打包与使用 3.1 动态库的打包 3.2 动态库的使用 3.3 运行动态库的四种方法 四、总makefile 一、动静态库的概念 静态库&#xff1a; Linux下&#xff0c;以.a为后缀的…

Python——IO编程

IO在计算机中指Input/Output&#xff0c;也就是输入和输出。由于程序和运行时数据是在内存中驻留&#xff0c;由CPU这个超快的计算核心来执行&#xff0c;涉及到数据交换的地方&#xff0c;通常是磁盘、网络等&#xff0c;就需要IO接口。 比如你打开浏览器&#xff0c;访问新浪…

蓝桥杯 EDA 组 历届国赛真题解析

一、2021年国赛真题 1.1 CN3767 太阳能充电电路 CN3767 是具有太阳能电池最大功率点跟踪功能的 4A&#xff0c;12V 铅酸电池充电管理集成电路。 最大功率点应指的是电池板的输出电压&#xff0c;跟踪电压其做保护。当然 CN3767 也可以直接使用直流充电&#xff0c;具体可以阅读…

污水处理环保设备厂商怎么选

在选择污水处理环保设备厂商时&#xff0c;需要综合考虑多个因素来确保选取的供应商能够提供高质量的设备和服务。以下是一些主要的考虑因素&#xff1a; 企业资质和认证&#xff1a;首先检查供应商是否拥有相关的资质证书和行业认证&#xff0c;例如ISO 9001质量管理体系认证、…

0基础安装 composer

解决&#xff1a; composer 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 php composer.phar可以运行 安装环境&#xff1a;系统w11 官网地址&#xff1a;Composer 1.安装composer 1.1打开命令行窗口 在命令行窗口里&#xff0c;右键是粘贴&#xff0…

Java | Leetcode Java题解之第92题反转链表II

题目&#xff1a; 题解&#xff1a; class Solution {public ListNode reverseBetween(ListNode head, int left, int right) {// 设置 dummyNode 是这一类问题的一般做法ListNode dummyNode new ListNode(-1);dummyNode.next head;ListNode pre dummyNode;for (int i 0; …

【数组的度】leetcode,python

一种很菜的做法&#xff08;暴力&#xff09;&#xff0c;for循环&#xff08;样例能过一大半呢&#xff0c;复杂度的话。。。&#xff09; class Solution:def findShortestSubArray(self, nums: List[int]) -> int:nlen(nums)if n1:return nmx1#出现次数最多的计算for i …

Google:站长移除无效网址

当您的网址不需要呈现在Google站长中时&#xff0c;您可以在站长工具中移除网址 操作步骤&#xff1a;登录Google站长&#xff0c;绑定网站完成后&#xff0c;点击左侧删除 >> 输入网址 如果遇到一些网址&#xff0c;可以找寻网址间的规律&#xff0c;比如说&#xff0…

【oracle】图片转为字节、base64编码等形式批量插入oracle数据库并查询

1.熟悉、梳理、总结下Oracle相关知识体系 2.欢迎批评指正&#xff0c;跪谢一键三连&#xff01; 资源下载&#xff1a; oci.dll、oraocci11.dll、oraociei11.dll3个资源文件资源下载&#xff1a; Instant Client Setup.exe资源下载&#xff1a; oci.dll、oraocci11.dll、oraoc…

java代码混淆工具ProGuard混淆插件

java代码混淆工具ProGuard混淆插件 介绍 ProGuard是一个纯java编写的混淆工具&#xff0c;有客户端跟jar包两种使用方式。可以将程序打包为jar&#xff0c;然后用工具进行混淆&#xff0c;也可以在maven中导入ProGuard的插件&#xff0c;对代码进行混淆。 大家都知道 java代…

【SQL】SQL常见面试题总结(1)

目录 1、检索数据1.1、从 Customers 表中检索所有的 ID1.2、检索并列出已订购产品的清单1.2、检索所有列 2、排序检索数据2.1、检索顾客名称并且排序2.2、对顾客 ID 和日期排序2.3、按照数量和价格排序2.4、检查 SQL 语句 3、过滤数据3.1、返回固定价格的产品3.2、返回产品并且…