在无需分叉的情况下模拟任何 SIGHASH 标志

news2024/11/20 8:28:36

我们开发了一种新颖的方法来模拟任何 SIGHASH 标志,只需在智能合约中编写逻辑即可。它不需要更改协议,因此比每次构思新用例时通过分叉添加硬编码标志更实用和灵活。

SIGHASH 标志

SIGHASH 标志决定交易的哪一部分由签名者签名。具体来说,它控制签名涵盖以下 10 项中的哪些项。

在这里插入图片描述

SigHash 原像格式

共有三个基本标志:SIGHASH_ALLSIGHASH_NONESIGHASH_SINGLE。还有一个修饰符标志 SIGHASH_ANYONECANPAY,产生六种组合。

在这里插入图片描述

不同 sighash 组合

已经有人提议添加更多标志,以自定义签署交易的各个部分,这在现有标志下是不可能的。下面列出了一个例子:

/** Signature hash types/flags */
enum
{
    // Input Specific
    SIGHASH_WITHOUT_PREV_SCRIPTPUBKEY     = 0x01,
    SIGHASH_WITHOUT_PREV_VALUE            = 0x02,
    SIGHASH_WITHOUT_INPUT_TXID            = 0x04,
    SIGHASH_WITHOUT_INPUT_INDEX           = 0x08,
    SIGHASH_WITHOUT_INPUT_SEQUENCE        = 0x10,

    // Output Specific
    SIGHASH_WITHOUT_OUTPUT_SCRIPTPUBKEY   = 0x20,
    SIGHASH_WITHOUT_OUTPUT_VALUE          = 0x40,

    // Whether to serialize the other (other than self) inputs/outputs
    SIGHASH_WITHOUT_INPUTS                = 0x010000,
    SIGHASH_WITHOUT_OUTPUTS               = 0x020000,

    // Whether to serialize this input/output at all (these take priority over SIGHASH_WITHOUT_INPUTS and SIGHASH_WITHOUT_OUTPUTS)
    SIGHASH_WITHOUT_INPUT_SELF            = 0x040000,
    SIGHASH_WITHOUT_OUTPUT_SELF           = 0x080000,

    // Transaction specific fields
    SIGHASH_WITHOUT_TX_VERSION            = 0x100000,
    SIGHASH_WITHOUT_TX_LOCKTIME           = 0x200000,

    // Sign value not derived from transaction
    // (Whenever nHashType is negative, the script signature is for the value on the stack, e.g. stacktop(-3))
    SIGHASH_SIGN_STACK_ELEMENT            = 0x10000000,
};
提议的标识

然而,它们中的每一个都必须在节点软件中进行硬编码,因此需要一个潜在的有争议的分支。

模拟任何 SIGHASH 标志

我们提供了一个框架来模拟任意 SIGHASH 标志。新的 SIGHASH 标志可以简单地以智能合约的形式添加,因此根本不需要升级 BSV。总的来说,它分为三个步骤:

  1. 使用 OP_PUSH_TX 获取当前的 sighash
  2. 根据新的标志语义修改/屏蔽 sighash
  3. 使用 ECDSA 签名算法根据新的 sighash 检查签名。

例如,我们实现了 SIGHASH_ANYPREVOUT

SIGHASH_ANYPREVOUT

BIP-118 中的 SIGHASH_ANYPREVOUT(以前称为 SIGHASH_NOINPUT)从签名中排除了 UTXO 的标识符。
用它签名的交易不链接到特定的 UTXO,因此可以花费任何 UTXO,只要满足有正确的签名或其它满足其它花费条件。

这可以用于,例如,当用户想要授权第三方应用程序花费她的硬币时。她可以使用 SIGHASH_ANYPREVOUT 进行预签名,并且应用程序可以在她不在时一次又一次地重复使用签名。

以下合约检查输入签名(即 Sig sig)是否未涵盖正在花费的 UTXO,等同于使用 SIGHASH_ANYPREVOUT 进行签名。

import "ec.scrypt";

// a template to implement any new SIGHASH flags
contract UniversalSigHash {
    PubKey pubKey;

    // sig is with SIGHASH flag SIGHASH_NOINPUT
    public function checkSigHashNoInput(Sig sig, SigHashPreimage sighash) {
        // get sighash preimage using SIGHASH_ALL
        require(Tx.checkPreimage(sighash));

        /* reconstruct the new sighash being signed */
        bytes sighash1 = sighash[: 4];
        // set item 2, 3, and 4 to 0
        bytes blankedSighash2to3 = b'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000';
        bytes sighash5to10 = sighash[104 : ];
        bytes sighashNew = sighash1 + blankedSighash2to3 + sighash5to10;

        // check signature against the new sighash using elliptic curve library
        require(EC.verifySig(sighashNew, sig, this.pubKey));
    }
}
UniversalSighash 合约
  1. 第 1 步:第 10 行确保 sighash 用于使用 OP_PUSH_TX 的当前交易。
  2. 第 2 步:第 13-17 行将 sighash 的第 234 项设置为全 0,即清空输入 UTXO。
  3. 第 3 步:第 20 行使用椭圆曲线库确保签名完全覆盖新的 sighash。相当于BTC上的 OP_CHECKSIGFROMSTACK 或 BCH上的 OP_DATASIGVERIFY/OP_CHECKDATASIG。

可扩展性

可以扩展相同的方法来模拟任何标志。例如,空白项目 2 和 3 等于 SIGHASH_ANYONECANPAY,空白项目 6 本质上是 SIGHASH_WITHOUT_PREV_VALUE。BSV 智能合约的表现力支持任意标记。

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

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

相关文章

Redis分布式锁那点事

锁超时问题 在redis分布式锁中,如果线程A加锁成功了,但是由于业务功能耗时时间很长,超过了设置的超时时间,这时候redis会自动释放线程A加的锁。通常我们加锁的目的是:为了防止访问临界资源时,出现数据异常…

【Python学习记录】Numpy广播机制(broadcast)

✨ 博客主页:小小马车夫的主页 ✨ 所属专栏:Python学习记录 文章目录一、什么是Numpy广播机制二、Numpy广播应用三、Numpy广播规则一、什么是Numpy广播机制 在Numpy、tensorflow、pytorch中数组有一种广播机制(broadcast), 就是针对两个不同形状的数组进…

【Linux】Linux调试器-gdb使用及git命令行

大家好我是沐曦希💕 文章目录一.预备知识1.背景2.Linux默认行为3.debug和release区别二.使用三.使用git命令行一.预备知识 1.背景 程序的发布方式有两种,debug模式和release模式Linux gcc/g出来的二进制程序,默认是release模式要使用gdb调试…

前端vue面试题(持续更新中)

Watch中的deep:true是如何实现的 当用户指定了 watch 中的deep属性为 true 时,如果当前监控的值是数组类型。会对对象中的每一项进行求值,此时会将当前 watcher存入到对应属性的依赖中,这样数组中对象发生变化时也会通知数据更新 源码相关 g…

Android 10.0 Launcher3双层(抽屉)高斯模糊(毛玻璃)背景功能的实现

1.概述 在进行定制开发的功能需求方面,Launcher3的需求也挺多的,单双层抽屉高斯模糊毛玻璃背景功能也是一个需求功能,最近按照功能需求来开发 双层抽屉高斯模糊毛玻璃效果背景的功能 效果图如图: 2. Launcher3双层(抽屉)高斯模糊(毛玻璃)背景功能的实现的核心代码 package…

基于Python logging 实现日志功能模块(即拿即用)

基于Python实现日志功能模块 在项目开发过程,日志文件是十分重要的,尤其对于程序员后期排查软件问题、发现问题bug及使用记录等更是非常重要。 本文使用部分软件版本如下: PyCharm 2019.3 Python 3.7.3 logging 0.5.1.2 logging logging 模块中包含为应用程序和库实现灵…

科研试剂2702973-69-9,endo BCN-PEG12-COOH,endo BCN-PEG12-acid

(本品应密封避光,储存于阴凉,干燥,通风处,取用一定要干燥,避免频繁的溶解和冻干) ●外观以及性质: endo BCN-PEG12-acid为浅黄色油状,带有 PEG 臂的试剂会增加化合物的亲…

论文投稿指南——中文核心期刊推荐(机械、仪表工业2)

【前言】 🚀 想发论文怎么办?手把手教你论文如何投稿!那么,首先要搞懂投稿目标——论文期刊 🎄 在期刊论文的分布中,存在一种普遍现象:即对于某一特定的学科或专业来说,少数期刊所含…

ElasticSearch集群部署系统参数配置调优

内存基本要求 参考书籍:[Elasticsearch: 权威指南]节选https://www.elastic.co/guide/cn/elasticsearch/guide/current/hardware.html 进程数和文件句柄数配置 使用命令查看: vi /etc/security/limits.conf如果没配置,在文件的后面加上配置 * soft n…

burst buffer技术初探

burst buffer是超算中一种作业加速技术,主要解决全球气候模拟预测建模、流体力学分析、磁性融合、天体物理学、生物分子模拟中浪涌型I/O的情况,burst buffer作为前端计算和后端存储之间的缓冲区,它弥合了计算节点的处理速度与存储系统的I/O带…

Nature:重磅,找到终结新冠的药了,关闭ACE2受体,防止所有变体

新冠病毒,通常通过呼吸道感染人类,并造成呼吸系统和人体各个器官的损伤。自2019年底首次爆发至今,新型冠状病毒仍在全球肆虐,对世界经济、社会造成极大的负面影响。随着新冠病毒的大规模流行,新的病毒突变株不断出现&a…

智能座舱开启「万物交互」新革命,隐形冠军们如何突围?

伴随智能座舱在市场端逐步深入消费者心智,从显示、语音到视觉交互,各细分赛道都在蓬勃发展。 高工智能汽车研究院监测数据显示,2022年1-10月,智能座舱前装搭载量同比增长58.06%%,高阶智能座舱同比增长137.61%&#xf…

老大难的 Java ClassLoader 再不理解就老了

ClassLoader 是 Java 届最为神秘的技术之一,无数人被它伤透了脑筋,摸不清门道究竟在哪里。网上的文章也是一篇又一篇,经过本人的亲自鉴定,绝大部分内容都是在误导别人。本文我带读者彻底吃透 ClassLoader,以后其它的相…

【网络编程】servlet和session

一、servlet 问题一:两个不同客户端请求同一个 servlet,是创建了两个一模一样的 servlet,然后用完之后全部销毁呢,还是只要一个 servlet,tomcat 开启时创建,关闭时销毁? 结论:当 Tomcat 接收…

后端存储实战课——海量数据篇

海量数据导致存储系统慢 拆,将一大坨数据拆分成 N 个小坨,学名「分片」。 归档历史数据 将大量的不常用的历史数据移到另外一张历史表中,大概流程: 批量删除大量数据 不能一次性直接删除,需要分批删除(…

SpringBoot【创建与使用】

SpringBoot【创建与使用】🍎一.SpringBoot是什么🍒1.1 SpringBoot的优点🍎二.SpringBoot的创建🍒2.1 使⽤ Idea 中央源创建🍉2.1.1 下载插件🍉2.1.2 创建项目🍉2.1.3 项目的加载🍉2.…

倪健中:全球元宇宙与中国文化精神 | 钱学森诞辰111周年系列活动开幕仪式

编者按: 倪健中会长出席纪念“中国元宇宙之父”钱学森诞辰111周年线上开幕式并发表了云致辞。 在致辞中,倪会长高度崇敬和赞扬钱学森对中国元宇宙事业做出的伟大贡献。我们因钱老的伟大思想,在探索元宇宙与中国传统文化哲学的融合进程中&…

【Kafka从成神到升仙系列 五】面试官问我 Kafka 生产者的网络架构,我直接开始从源码背起.......

👏作者简介:大家好,我是爱敲代码的小黄,独角兽企业的Java开发工程师,CSDN博客专家,Java领域新星创作者📕系列专栏:Java设计模式、数据结构和算法、Kafka从入门到成神、Kafka从成神到…

Spring 6 源码编译和高效阅读源码技巧分享

一. 前言 Spring Boot 3 RELEASE版本于 2022年11月24日 正式发布,相信已经有不少同学开始准备新版本的学习了,不过目前还不建议在实际项目中做升级,毕竟还有很多框架和中间件没出适配版本。此次Spring Boot里程碑的升级也要求了最低JDK 17 和…

风靡互联网关键词 Web3.0 | 区块链 | 元宇宙……

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! Web web是互联网的总称,全称为World Wide Web,缩写WWW ,即全球广域网,也称为万维网,它是一种基于超文本和H…