如何在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.rhkb.cn/news/328810.html

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

相关文章

bcb6 lib编程

Library 新建 Library 新建Cpp File File1.cpp extern "C" __declspec(dllexport) int add(int a,int b) {return ab;}Build Project->Build Project1 使用 新建项目 Add New Project Unit1.cpp #pragma hdrstop#include "Unit1.h" //---------…

企业微信hook接口协议,ipad协议http,客户群发送任务,获取要发送的客户群列表

客户群发送任务&#xff0c;获取要发送的客户群列表 参数名必选类型说明uuid是String每个实例的唯一标识&#xff0c;根据uuid操作具体企业微信 请求示例 {"uuid": "1688853790599424","id":110129274704417637, //群发任务id"keywords…

分布式锁:场景和使用方法(通俗讲解)

这里写目录标题 通俗讲解分布式锁&#xff1a;场景和使用方法前言引入业务场景业务场景一出现业务场景二出现&#xff1a;业务场景三出现&#xff1a; 分布式锁的使用场景分布式锁的几种特性分布式锁的几种实现方式一、基于 Mysql 实现分布式锁二、基于单Redis节点的分布式锁三…

HarmonyOS ArkTS 实现类似Android中RadioButton得效果

在Android中如实现下图可以用radioGroup和RadioButton实现&#xff0c;但在ArkTs中radio不能实现自定义样式&#xff0c;所以用Tabs来实现这种效果&#xff0c;效果图如下&#xff1a; 一、效果图 二、实现横向布局的三个TabContent&#xff0c;代码如下 State currentIndex: n…

Xilinx RAM IP核的使用及注意事项

对于RAM IP核(Block Memory Generator核)的使用以及界面的配置介绍&#xff0c;文章RAM的使用介绍进行了较详细的说明&#xff0c;本文对RAM IP核使用中一些注意的地方加以说明。 文章目录 三种RAM的区别单端口RAM(Single-port RAM)简单双端口RAM(Simple Dual-port RAM)真双端…

商品服务:SPUSKU规格参数销售属性

1.Object划分 1.PO&#xff08;Persistant Object&#xff09;持久对象 PO就是对应数据库中某个表中的一条记录&#xff0c;多个记录可以用PO的集合。PO中应该不报含任何对数据库的操作 2.DO(Domain Object) 领域对象 就是从现实世界中抽象出来的有形或无形的业务实体。 3…

线程池的简单实现与应用

1.什么是线程池 线程池其实就是一种多线程处理形式&#xff0c;处理过程中可以将任务添加到队列中&#xff0c;然后在创建线程后自动启动这些任务。 线程池最大的好处就是减少每次启动、销毁线程的损耗。 2.线程池参数介绍 参数名称说明corePoolSize正式员工的数量.(正式员…

代码随想录——填充每个节点的下一个右侧节点指针 II(Leetcode117)

题目链接 层序遍历 /* // Definition for a Node. class Node {public int val;public Node left;public Node right;public Node next;public Node() {}public Node(int _val) {val _val;}public Node(int _val, Node _left, Node _right, Node _next) {val _val;left _l…

21【Aseprite 作图】画白菜

1 对着参考图画轮廓 2 缩小尺寸 变成这样 3 本来是红色的描边&#xff0c;可以通过油漆桶工具&#xff08;取消 “连续”&#xff09;&#xff0c;就把红色的轮廓线&#xff0c;变成黑色的 同时用吸管工具&#xff0c;吸取绿色和白色&#xff0c;用油漆桶填充颜色 4 加上阴影…

svn批量解锁

问题 svn对文件进行checkout之后&#xff0c;先进行lock&#xff0c;之后再去更改&#xff0c;最后进行Commit操作&#xff1b; 上述为我们通过svn管理代码的正常方式&#xff0c;但总会有其他现象发生&#xff1b; 如果我们非正常操作&#xff0c;批量锁所有的svn文件&#x…

Django Celery 的配置及使用---最详细教程

Django Celery 的配置及使用 Redis提供队列消息功能 一、安装redis 系统版本&#xff1a;Ubuntu 20.041、获取最新软件包 sudo apt update sudo apt install redis-server2、安装完成后&#xff0c;Redis服务器会自动启动。查看redis是否启动成功 sudo systemctl status …

uniapp + vue3 设置 axios proxy 代理,并重写路径

uniapp vue2 设置代理如下&#xff1a; 已生成的项目架构里面找到manifest.json文件&#xff0c;通过源码视图的方式打开文件&#xff0c;在文件中添加一下代码即可完成代理&#xff1a; "h5": {"devServer": {"disableHostCheck": true, //禁…

Milvus的系统架构

简介 Milvus的构建在许多知名的向量搜索库比如Faiss, HNSW, DiskANN, SCANN等之上的&#xff0c;它针对稠密向量数据集的相似搜索而设计&#xff0c;能支持百万、十亿甚至万亿级别的向量搜索。 Milvus支持数据分片&#xff0c;流式数据插入&#xff0c;动态schema&#xff0c…

离散型制造行业智能工厂标准解决方案(49页 PPT)

方案介绍&#xff1a; 该解决方案的核心功能模块包括生产计划与排程、质量控制与追溯、设备管理与维护、物料管理与仓储以及供应链协同等。通过智能算法和数据分析&#xff0c;实现对生产过程的精准控制和优化。同时&#xff0c;智能工厂还支持远程监控和预测性维护&#xff0…

15.计算机网络

1.物理层的互联设备 中继器 和 集线器 2.集线器可以看做特殊的多路中继器 集线器 不可以做到自动寻址的功能 3.数据链路层 网桥 和 交换机 4.交换机是多端口网桥 5.网络层 路由器 6.应用层 网关 7.广播域 网络层 可以形成多个广播域 冲突域 网络层数据链路层 可以形成多个冲突域…

三大平台直播视频下载保存方法

终于解决了视频号下载的问题&#xff0c;2024年5月15日亲测可用。 而且免费。 教程第二部分&#xff0c;有本地电脑无法下载的解决方案。 第一部分&#xff1a;使用教程&#xff08;正常&#xff09; 第1步&#xff1a;下载安装包 下载迅雷网盘搜索&#xff1a;大海福利合集…

STM32时钟系统和时钟树

目录 STM32时钟系统 认识时钟树 什么是时钟 认识时钟树(F407) 配置系统时钟 系统时钟配置步骤 外设时钟使能和失能 sys_stm32_clock_init函数(F4) 时钟配置一般步骤 System文件夹_时钟系统工作原理 System文件夹介绍 Sys文件介绍 Delay文件介绍 Systic工作原理 S…

vue2人力资源项目9权限管理

页面搭建 <template><div class"container"><div class"app-container"><el-button size"mini" type"primary">添加权限</el-button><el-table-column label"名称" /><el-table-co…

基于Pytorch深度学习神经网络MNIST手写数字识别系统源码(带界面和手写画板)

第一步&#xff1a;准备数据 mnist开源数据集 第二步&#xff1a;搭建模型 我们这里搭建了一个LeNet5网络 参考代码如下&#xff1a; import torch from torch import nnclass Reshape(nn.Module):def forward(self, x):return x.view(-1, 1, 28, 28)class LeNet5(nn.Modul…

二.使用PgAdmin连接Postgresql

二.使用PgAdmin连接Postgresql PostgreSQL是一种开源的对象关系型数据库管理系统(ORDBMS),它支持大部分SQL标准并提供了许多高级功能,例如事务、外键、视图、触发器等。PostgreSQL由PostgreSQL全球开发组维护和开发,它是一种高度可扩展的数据库系统,可以在各种操作系统…