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

SIGHASH 标志

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

SigHash 原像格式

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

不同 sighash 组合

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

/** Signature hash types/flags */
enum
{// Input SpecificSIGHASH_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 SpecificSIGHASH_WITHOUT_OUTPUT_SCRIPTPUBKEY   = 0x20,SIGHASH_WITHOUT_OUTPUT_VALUE          = 0x40,// Whether to serialize the other (other than self) inputs/outputsSIGHASH_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 fieldsSIGHASH_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_NOINPUTpublic function checkSigHashNoInput(Sig sig, SigHashPreimage sighash) {// get sighash preimage using SIGHASH_ALLrequire(Tx.checkPreimage(sighash));/* reconstruct the new sighash being signed */bytes sighash1 = sighash[: 4];// set item 2, 3, and 4 to 0bytes blankedSighash2to3 = b'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000';bytes sighash5to10 = sighash[104 : ];bytes sighashNew = sighash1 + blankedSighash2to3 + sighash5to10;// check signature against the new sighash using elliptic curve libraryrequire(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 智能合约的表现力支持任意标记。

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

  1. 如何在没有Springockito的情况下模拟Spring bean

    我在Spring工作了几年. 但是我总是对XML配置变得多么混乱感到沮丧. 随着各种注释和Java配置可能性的出现,我开始喜欢使用Spring进行编程. 这就是为什么我强烈使用Java配置的原因. 我 ...

  2. R语言使用caret包构建GBM模型:在模型最优参数已知的情况下,拟合整个训练集,而无需进行任何重采样或参数调优

    R语言使用caret包构建GBM模型:在模型最优参数已知的情况下,拟合整个训练集,而无需进行任何重采样或参数调优 目录 R语言使用caret包构建GBM模型:在模型最优参数已知的情况下,拟合整个训练集 ...

  3. python在材料模拟中的应用_材料模拟python_模拟-python模拟-在不妨碍实现的情况下修补方法...

    此答案解决了Quuxplusone用户提供的赏金中提到的其他要求: 对于我的用例而言,重要的是它可以与MagicMock一起使用,即,它不需要我在构造Potato(在此示例中为spud)实例与调用sp ...

  4. python初学 数据分叉情况下的函数递归

    对于python中的函数递归,其实用while和for循环可以等价的实现.平时较少用到,但是在某些特定情况下比较方便实现一些功能. 对于没有数据分叉的函数递归,比较简单.如: def cal(n):p ...

  5. 禁用服务器系统关机,关机 允许系统在无需登录 Windows 10 (的情况下) - Windows security | Microsoft Docs...

    关机: 允许系统在未登录的情况下关闭 04/19/2017 本文内容 适用范围 Windows 10 介绍关闭:允许系统关闭而无需登录安全策略设置的最佳方案.位置.值.策略管理 和安全注意事项 . 参 ...

  6. 编写函数模拟掷骰子的游戏(两个骰子)。第一次掷的时候,如果点数之和为7或11则获胜;如果点数之和为2、3或12则落败;其他情况下的点数之和称为“目标”,游戏继续。在后续的投掷中,如果玩家再次掷出“目标

    编写函数模拟掷骰子的游戏(两个骰子).第一次掷的时候,如果点数之和为7或11则获胜:如果点数之和为2.3或12则落败:其他情况下的点数之和称为"目标",游戏继续.在后续的投掷中,如 ...

  7. linux 磁盘延时,Linux:如何模拟硬盘延迟?我想在不使用CPU电源的情况下增加iowait值...

    设备映射器"延迟"设备 查看设备映射器设备的"延迟"目标.这正是它存在的原因. 例 这是如何进行此操作的示例: 创建一个可以读取/写入的位置 [root@cen ...

  8. java模拟浏览器不关闭会话_JSP实现浏览器关闭cookies情况下的会话管理

    通常,会话管理是通过服务器将 Session ID 作为一个 cookie 存储在用户的 Web 浏览器中来唯一标识每个用户会话.如果浏览器不支持 cookies,或者将浏览器设置为不接受 cooki ...

  9. AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。

    AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). AJAX 不是新的编程语言,而是一种使用现有标准的新方法. AJAX 是与服 ...

最新文章

  1. phaser.min.js_如何使用Phaser 3,Express和Socket.IO构建多人纸牌游戏
  2. HTTP将死?又拍云布局HTTPS 护航网页安全加速
  3. 怎么通过media foundation将图像数据写入虚拟摄像头_不知道怎么挑手机?性价比神机绝对适合你...
  4. 【金三银四】启动mysql服务器
  5. c语言的单行注释范围,c语言中的注释,multi-line comment
  6. word手写字体以假乱真_轻松制作个人“电子版手写签名”
  7. php带参数跳转页面,如何带参数跳转php界面_后端开发
  8. java多线程-线程创建
  9. windows下手动安装pyinstaller(python2.7)
  10. Java自动化测试框架-11 - TestNG之annotation与并发测试篇 (详细教程)
  11. Hive 中日志的存放位置
  12. cartographer探秘第四章之代码解析(五) --- 后端优化 --- 闭环约束1 --- PrecomputationGrid2D
  13. mybatis mysql crud_mybatis实现CRUD操作(mysql数据库)(二)
  14. linux如何从 命令行 将普通文件打印到 pdf
  15. A3C的算法原理和算法流程
  16. Java继承中的覆盖
  17. chloe.mysql 源码_AceFx-基于Nfine的Chloe官网及后台源码
  18. 【Opencv实战】美颜模式,开启:美颜功能都这么强大了嘛?(群魔乱舞.jpg)
  19. 【Python】三维画图——matplotlib以及np.mgrid的使用
  20. 在面试中如何回答面试官的问题

热门文章

  1. 高考不是终点,看华老师如何面对人生抉择
  2. 创建第一个Flutter App项目
  3. 格式工厂 wav 比特率_Easy MP3 Converter Pro for mac(音频格式转换软件) 3.0.0
  4. 腾讯电竞:电竞产业已成风口 良性发展需要靠教育稳固根基
  5. php 根据url生成图片并保存
  6. Highlight出包含特定文本的单元格-search函数与条件格式的应用实例
  7. VMware安装CentOS7(零基础版附镜像)
  8. WSUS 重置引导指南(WSUS Reset Guide Line) WSUS针对性获取上级补丁数据
  9. 树莓派基于分类器的识别环保标志(三)分类器xml创建
  10. 索尼X90J和X95J区别 索尼X90J和X95J哪个好?