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

通过多签合约实现多个用户可访问的安全账户。多签(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.mzph.cn/news/838668.shtml

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

相关文章

智慧教育平台:选课系统的Spring Boot实现

作者介绍&#xff1a;✌️大厂全栈码农|毕设实战开发&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 &#x1f345;获取源码联系方式请查看文末&#x1f345; 推荐订阅精彩专栏 &#x1f447;&#x1f3fb; 避免错过下次更新 Springboot项目精选实战案例 更多项目…

Verilog基础语法——条件语句if-else与case

Verilog基础语法——条件语句case、if-else 写在前面一、if-else语句二、case语句2.1 case语句2.2 casez语句2.3 casex语句 写在后面 写在前面 在Verilog语法中&#xff0c;常用的条件语句有if-else语句和case语句&#xff0c;用于判断条件是否为真&#xff0c;并执行判断条件后…

第 N 个泰波那契数

题目链接 第 N 个泰波那契数 题目描述 注意点 0 < n < 37答案保证是一个 32 位整数 解答思路 动态规划根据前三个数字推出新的泰波那契数 代码 class Solution {public int tribonacci(int n) {if (n 0) {return 0;}if (n 1 || n 2) {return 1;}int x 0;int x…

JSON格式化输出html——数组+对象+JSON字符串+汉字——基础积累——@pgrabovets/json-view

昨天写了一篇关于JSON格式化输出到页面上——数组对象JSON字符串汉字——基础积累的文章&#xff0c;效果是可以实现的 但是如果要实现右侧部分的展开/折叠&#xff0c;则可以使用到下面的插件了pgrabovets/json-view github链接&#xff1a;https://github.com/pgrabovets/j…

软考笔记随记

原码:(0正1负) 原码是最直观的编码方式,符号位用0表示正数,用1表示负数,其余位表示数值的大小。 例如,+7的原码为00000111,-7的原码为10000111。 原码虽然直观,但直接用于加减运算会导致计算复杂,且0有两种表示(+0和-0),不唯一。 反码: 反码是在原码的基础上得…

如何在VS Code中安装插件并进行中文化。

相关文章推荐: 如何下载和安装Visual Studio Code&#xff08;VSCode&#xff09; 在使用Visual Studio Code&#xff08;简称VS Code&#xff09;进行开发时&#xff0c;安装插件可以极大地提升开发效率和使用体验。而将VS Code插件界面进行中文化&#xff0c;则能更好地满足中…

十四、Redis Cluster集群

Redis Cluster是Redis提供的一个分布式解决方案&#xff0c;在3.0推出。Redis Cluster可以自动将数据分片分布到不同的master节点上&#xff0c;同时提供了高可用的支持&#xff0c;当某个master节点挂了之后&#xff0c;整个集群还是可以正常工作。1、为什么要用Redis Cluster…

rocketmq的流程

生产过程 消费过程 存储 在RocketMQ中&#xff0c;一个Broker的所有Topic的消息都会被写入到同一个CommitLog文件中。 每个队列&#xff08;Queue&#xff09;都有对应的ConsumeQueue文件。 ConsumeQueue每个记录定长&#xff0c;20字节&#xff0c;消息在commitlog中的偏移量…

外贸客户采集软件有哪些?

外贸客户采集软件可以帮助企业收集潜在客户的信息&#xff0c;以便进行市场分析和客户开发。以下是一些常用的外贸客户采集软件&#xff1a; 易谷歌地图数据采集大师&#xff1a;基于谷歌地图数据采集的软件&#xff0c;能够采集任意国家、地区的企业地址、电话号码、邮件地址等…

SpringCloud 2023.0.1

本文介绍如何使用 springboot3及cloud2023 进行微服务模块化开发 采用父-module 模块开发 父工程 demo-java pom.xml <!--配置 springboot的依赖的版本号, 方便 module 进行继承--><dependencyManagement><dependencies><!--增加 springboot的依赖--&g…

浅谈-数据分析之道--数据思维的培养

第一篇数据思维 数据分析中最重要的是数据思维&#xff0c;对于业务场景中常见的问题&#xff0c;只要有分析问题的思路和方法&#xff0c;无论用什么工具都可以得到结果。 数据思维是数据分析师分析问题的思路和角度。 第一章&#xff0c;什么是数据思维 什么是数据治理&a…

适合建站的香港服务器有哪些,企业和个人建站的

香港服务器适合外贸建站、个人和企业建站&#xff0c;尤其是中小企业官网非常适合放在香港服务器上&#xff0c;因为香港服务器在国内外的访问速度都很快&#xff0c;也就意味着全球客户都能访问到你的网站。 对于很多新手小白来说不知道怎么才能买到靠谱稳定的香港服务器&…

mysql主从热备+keepalived 部署mysql高可用主备模式

目录 1、环境准备 2、分别在主服务器和备用服务器上安装keepalived 3、修改keepalived服务的配置文件 3.1 修改主服务器上的keepalive服务的配置文件 3.2 修改备用服务器上的keepalive服务配置文件 4、编写mysql监控脚本放到主服务器上 5、在主服务器和备用服务器上查看…

水泡传感器内部结构

水泡传感器内部结构&#xff1a; 水泡传感器放大电路 电路是基于1.6V做的TIA I2V&#xff0c; 也就是输出部分基于1.6V做电压的增加或减少。

Milvus 快速入门

引言 在本篇文章中&#xff0c;我们将介绍 Milvus 的基本概念&#xff0c;并通过一个简单的示例展示如何在 Milvus 中创建集合、插入向量和执行搜索。最后&#xff0c;我们将概览 Milvus 提供的 API。 一、基本概念 1.1 集合 (Collection) 在 Milvus 中&#xff0c;集合类似…

如何组织 Vue 项目

介绍 在启动 Vue 项目时&#xff0c;思考项目结构至关重要。主要考虑因素是预期项目的规模。在本篇博文中&#xff0c;我将探讨适用于不同规模 Vue 项目的各种结构。这个考虑与康威定律相吻合&#xff1a; “设计系统的组织受限于产生这些组织沟通结构的设计。” - 梅尔康威 基…

C语言之指针初阶

目录 前言 一、内存与地址的关系 二、指针变量 三、野指针 四、const 五、传值调用与传址调用 总结 前言 本文主要介绍C语言指针的一些基础知识&#xff0c;为后面深入理解指针打下基础&#xff0c;因此本文内容主要包括内存与地址的关系&#xff0c;指针的基本语法&…

WebRTC实时音视频通话之语音通话设计与实践

一、背景 在移动互联网流量时代&#xff0c;很多业务场景都有音视频通信的需求&#xff0c;比如IM场景&#xff0c;除了文字交流还需要音视频通话进行实时交互。为了帮助58、赶集、安居客等业务线更好的为用户提供服务&#xff0c;节约沟通成本&#xff0c;提升效率&#xff0…

【Linux】19. 习题②

2022-11-12_Linux环境变量 1. 分页存储(了解) 一个分页存储管理系统中&#xff0c;地址长度为 32 位&#xff0c;其中页号占 8 位&#xff0c;则页表长度是__。 A.2的8次方 B.2的16次方 C.2的24次方 D.2的32次方 【答案解析】A 页号即页表项的序号&#xff0c;总共占8个二进制…

STM32的FLASH学习笔记

不同型号的 STM32&#xff0c;其 FLASH 容量也有所不同&#xff0c;最小的只有 16K 字节&#xff0c;最大的则达到了1024K 字节。大容量产品的闪存模块组织如图所示&#xff1a; STM32 的闪存模块由&#xff1a;主存储器、信息块和闪存存储器接口寄存器等 3 部分组成。 ​ ①主…