比特币上的有状态多重签名

无需链下通信

介绍

随着区块链和加密货币空间的发展,越来越需要增强安全措施来保护数字资产。 应对这一挑战的突出解决方案之一是多重签名(多重签名)钱包。 这些钱包在执行交易之前需要多方签名,从而提供额外的安全层来防止未经授权的访问和欺诈。

图片来源CoinDesk

图片来源CoinDesk

传统的多重签名钱包需要各方进行带外(链下)通信以收集所有签名。 我们引入了一种智能合约,可以直接在区块链上收集签名。 智能合约会跟踪这些签名,一旦达到设定的阈值,就可以解锁资金。 例如,当多重签名组中的各方彼此不认识时,这可能很有用。

传统多重签名钱包

多重签名钱包通常需要 M-of-N 签名(来自一组 N 个参与者的 M 个签名)来授权交易。 这些钱包在管理数字资产方面越来越受欢迎,特别是在以下场景中:

  1. 联名账户,需要多个家庭成员或商业伙伴批准交易。
  2. 托管服务,中立的第三方持有资金直到满足预定条件。
  3. 安全存储,一个用户持有多个密钥以防止未经授权的访问。

传统的多重签名钱包需要在各方之间交换部分签名的交易,然后才能将它们提交到链上。

链上签名收集

在接下来的步骤中,我们已经开发了一个允许链上签名收集的多重签名智能合约。

  1. 智能合约部署在区块链上,指定最小签名数 M 和授权签名者列表 N。 它有一个状态:到目前为止收集的签名列表,初始化为零。
  2. 每当使用新签名调用合约时,如果它是有效的和新的,它就会被添加到状态中。
  3. 一旦达到阈值 M,智能合约就会支付到预定义的目标地址。

下面是用 sCrypt 编写的完整代码。

export type Owner = {pubKey: PubKeyvalidated: boolean
}export class StatefulMultiSig extends SmartContract {// N of M signatures required.static readonly N = 2static readonly M = 3// Payment destination once signature threshold is reached.@prop()dest: PubKeyHash// Public keys of the owners along with boolean flags, that// indicate if their sig was already validated.@prop(true)owners: FixedArray<Owner, typeof StatefulMultiSig.M>constructor(dest: PubKeyHash,owners: FixedArray<Owner, typeof StatefulMultiSig.M>) {super(...arguments)this.dest = destthis.owners = owners}@method(SigHash.ANYONECANPAY_SINGLE)public pay() {// Check if threshold was reached.let nValid = 0nfor (let i = 0; i < StatefulMultiSig.M; i++) {if (this.owners[i].validated) {nValid += 1n}}assert(nValid >= BigInt(StatefulMultiSig.N),'Not enough valid signatures.')// Make sure balance in the contract does not change.const amount: bigint = this.ctx.utxo.value// Pay destination addressconst output: ByteString = Utils.buildPublicKeyHashOutput(this.dest,amount)// Verify unlocking tx has this output.assert(this.ctx.hashOutputs == hash256(output), 'hashOutputs mismatch')}@method(SigHash.ANYONECANPAY_SINGLE)public add(sig: Sig, pubKeyIdx: bigint) {let added = falsefor (let i = 0; i < StatefulMultiSig.M; i++) {if (BigInt(i) == pubKeyIdx) {const owner = this.owners[i]const valid = this.checkSig(sig, owner.pubKey)if (valid && !owner.validated) {// Toggle flag.this.owners[i].validated = trueadded = true}}}// Make sure at least one new valid sig was added.assert(added, 'No new valid signature was provided.')// Make sure balance in the contract does not change.const amount: bigint = this.ctx.utxo.value// Output containing the latest state.const output: ByteString = this.buildStateOutput(amount)// Verify unlocking tx has this single output.assert(this.ctx.hashOutputs == hash256(output), 'hashOutputs mismatch')}
}

合约源代码

该合约有两个公共方法:

它有两个公共方法:

  • add ——此方法将有效签名及其所属公钥的索引作为输入。 它首先检查此签名的有效性,如果有效则设置一个标志。
  • pay — 此方法检查是否已达到签名阈值,例如 在此特定示例中,阈值是三分之二。 如果是这样,它确保下一个输出将锁定资金支付到存储在 dest 变量中的地址。

完整的代码和测试可以在我们的样板存库中找到。


引用

扩展 UTXO 模型中的原生自定义令牌:https://iohk.io/en/research/library/papers/native-custom-tokens-in-the-extended-utxo-model/

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

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

相关文章

Vue diff 算法探秘:如何实现快速渲染

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

微软Azure AI新增Phi、Jais等,40种新大模型

微软在官方宣布在Azure AI云开发平台中&#xff0c;新增了Falcon、Phi、Jais、Code Llama、CLIP、Whisper V3、Stable Diffusion等40个新模型&#xff0c;涵盖文本、图像、代码、语音等内容生成。 开发人员只需要通过API或SDK就能快速将模型集成在应用程序中&#xff0c;同时支…

docker (简介、dcoker详细安装步骤、容器常用命令)一站打包- day01

一、 为什么出现 Docker是基于Go语言实现的云开源项目。 Docker的主要目标是“Build&#xff0c;Ship and Run Any App,Anywhere”&#xff0c;也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理&#xff0c;使用户的APP&#xff08;可以是一个WEB应用或数据库应…

InstructDiffusion-多种视觉任务统一框架

论文:《InstructDiffusion: A Generalist Modeling Interface for Vision Tasks》 github&#xff1a;https://github.com/cientgu/InstructDiffusion InstructPix2Pix&#xff1a;参考 文章目录 摘要引言算法视觉任务统一引导训练集重构统一框架 实验训练集关键点检测分割图像…

推荐6款交互设计软件,助你事半功倍!

交互软件可以帮助设计师从“可用性”和“用户体验”的角度优化他们的作品。如果设计师想创建一个令人满意的交互设计作品&#xff0c;一个方便的交互设计软件是必不可少的。当然&#xff0c;交互软件只是我们实现目标的一种手段。根据设计师的个人喜好和方便&#xff0c;选择易…

TS版LangChain实战:基于文档的增强检索(RAG) | 京东云技术团队

LangChain LangChain是一个以 LLM &#xff08;大语言模型&#xff09;模型为核心的开发框架&#xff0c;LangChain的主要特性&#xff1a; 可以连接多种数据源&#xff0c;比如网页链接、本地PDF文件、向量数据库等允许语言模型与其环境交互封装了Model I/O&#xff08;输入…

Wangeditor工具栏配置

包下载 pnpm add wangeditor/editor pnpm add wangeditor/editor-for-vue import wangeditor/editor/dist/css/style.css // 引入 css import { Editor, Toolbar } from wangeditor/editor-for-vue import { DomEditor } from wangeditor/editor <Toolbar style"border…

免费好用的伪原创工具推荐,都是国内的人工智能AI

在当今数字化信息爆炸的时代&#xff0c;创作者们为了在激烈的竞争中脱颖而出&#xff0c;常常需要花费大量时间来创作独特的内容。然而&#xff0c;有时候时间并不是每个人都拥有充足的资源。于是&#xff0c;一些免费智能伪原创工具成为了许多创作者的利器&#xff0c;能够在…

Docker基本操作---镜像与容器操作

Docker基本操作---镜像与容器操作 1. 操作镜像1.1 查看镜像1.2 删除镜像1.2.1 删除镜像1.2.2 强制删除镜像1.2.3 删除所有镜像 1.3 启动镜像1.4 常见错误1.4.1 image is being used by stopped container e3b9df6dc6ae 2 操作容器2.1 新建启动容器2.2 查看正在运行的容器2.3 退…

修改二进制程序的rpath和interpreter, 实现“高版本gcc编译出的程序在低版本glibc机器上运行“实验记录

编译环境&#xff1a; ubuntu20.04 gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0 g (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0 运行环境&#xff1a; centos7.9 gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44) g (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44) 验证源文件 main.cpp: #inc…

智慧工地信息化管理系统源码带APP

需求痛点&#xff1a;建筑行业是一个安全事故多发的行业。目前&#xff0c;工程建设规模不断扩大&#xff0c;工艺流程纷繁复杂&#xff0c;如何搞好现场施工现场管理&#xff0c;控制事故发生频率&#xff0c;一直是施工企业、政府管理部门关注的焦点。利用现代科技&#xff0…

仿美团外卖源码/在线外卖平台源码PHP/支持多商户+多样化配送费+本土外卖+支持第三方配送

源码简介&#xff1a; 进云仿美团外卖源码&#xff0c;作为外卖平台源码&#xff0c;它不仅支持多商户、多样化配送费、本土外卖&#xff0c;还支持第三方配送。 进云仿美团外卖源码是一个进云源生插件&#xff0c;支持多商户多样化配送费模式本土外卖平台支持第三方配送&…