在无需分叉的情况下模拟任何 SIGHASH 标志
我们开发了一种新颖的方法来模拟任何 SIGHASH 标志,只需在智能合约中编写逻辑即可。它不需要更改协议,因此比每次构思新用例时通过分叉添加硬编码标志更实用和灵活。
SIGHASH 标志
SIGHASH 标志决定交易的哪一部分由签名者签名。具体来说,它控制签名涵盖以下 10 项中的哪些项。
SigHash 原像格式
共有三个基本标志:SIGHASH_ALL、SIGHASH_NONE 和 SIGHASH_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。总的来说,它分为三个步骤:
- 使用 OP_PUSH_TX 获取当前的 sighash
- 根据新的标志语义修改/屏蔽 sighash
- 使用 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 步:第
10
行确保 sighash 用于使用 OP_PUSH_TX 的当前交易。 - 第 2 步:第
13-17
行将 sighash 的第2
、3
和4
项设置为全 0,即清空输入 UTXO。 - 第 3 步:第
20
行使用椭圆曲线库确保签名完全覆盖新的 sighash。相当于BTC上的 OP_CHECKSIGFROMSTACK 或 BCH上的 OP_DATASIGVERIFY/OP_CHECKDATASIG。
可扩展性
可以扩展相同的方法来模拟任何标志。例如,空白项目 2 和 3 等于 SIGHASH_ANYONECANPAY,空白项目 6 本质上是 SIGHASH_WITHOUT_PREV_VALUE。BSV 智能合约的表现力支持任意标记。
在无需分叉的情况下模拟任何 SIGHASH 标志相关推荐
- 如何在没有Springockito的情况下模拟Spring bean
我在Spring工作了几年. 但是我总是对XML配置变得多么混乱感到沮丧. 随着各种注释和Java配置可能性的出现,我开始喜欢使用Spring进行编程. 这就是为什么我强烈使用Java配置的原因. 我 ...
- R语言使用caret包构建GBM模型:在模型最优参数已知的情况下,拟合整个训练集,而无需进行任何重采样或参数调优
R语言使用caret包构建GBM模型:在模型最优参数已知的情况下,拟合整个训练集,而无需进行任何重采样或参数调优 目录 R语言使用caret包构建GBM模型:在模型最优参数已知的情况下,拟合整个训练集 ...
- python在材料模拟中的应用_材料模拟python_模拟-python模拟-在不妨碍实现的情况下修补方法...
此答案解决了Quuxplusone用户提供的赏金中提到的其他要求: 对于我的用例而言,重要的是它可以与MagicMock一起使用,即,它不需要我在构造Potato(在此示例中为spud)实例与调用sp ...
- python初学 数据分叉情况下的函数递归
对于python中的函数递归,其实用while和for循环可以等价的实现.平时较少用到,但是在某些特定情况下比较方便实现一些功能. 对于没有数据分叉的函数递归,比较简单.如: def cal(n):p ...
- 禁用服务器系统关机,关机 允许系统在无需登录 Windows 10 (的情况下) - Windows security | Microsoft Docs...
关机: 允许系统在未登录的情况下关闭 04/19/2017 本文内容 适用范围 Windows 10 介绍关闭:允许系统关闭而无需登录安全策略设置的最佳方案.位置.值.策略管理 和安全注意事项 . 参 ...
- 编写函数模拟掷骰子的游戏(两个骰子)。第一次掷的时候,如果点数之和为7或11则获胜;如果点数之和为2、3或12则落败;其他情况下的点数之和称为“目标”,游戏继续。在后续的投掷中,如果玩家再次掷出“目标
编写函数模拟掷骰子的游戏(两个骰子).第一次掷的时候,如果点数之和为7或11则获胜:如果点数之和为2.3或12则落败:其他情况下的点数之和称为"目标",游戏继续.在后续的投掷中,如 ...
- linux 磁盘延时,Linux:如何模拟硬盘延迟?我想在不使用CPU电源的情况下增加iowait值...
设备映射器"延迟"设备 查看设备映射器设备的"延迟"目标.这正是它存在的原因. 例 这是如何进行此操作的示例: 创建一个可以读取/写入的位置 [root@cen ...
- java模拟浏览器不关闭会话_JSP实现浏览器关闭cookies情况下的会话管理
通常,会话管理是通过服务器将 Session ID 作为一个 cookie 存储在用户的 Web 浏览器中来唯一标识每个用户会话.如果浏览器不支持 cookies,或者将浏览器设置为不接受 cooki ...
- AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。
AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). AJAX 不是新的编程语言,而是一种使用现有标准的新方法. AJAX 是与服 ...
最新文章
- phaser.min.js_如何使用Phaser 3,Express和Socket.IO构建多人纸牌游戏
- HTTP将死?又拍云布局HTTPS 护航网页安全加速
- 怎么通过media foundation将图像数据写入虚拟摄像头_不知道怎么挑手机?性价比神机绝对适合你...
- 【金三银四】启动mysql服务器
- c语言的单行注释范围,c语言中的注释,multi-line comment
- word手写字体以假乱真_轻松制作个人“电子版手写签名”
- php带参数跳转页面,如何带参数跳转php界面_后端开发
- java多线程-线程创建
- windows下手动安装pyinstaller(python2.7)
- Java自动化测试框架-11 - TestNG之annotation与并发测试篇 (详细教程)
- Hive 中日志的存放位置
- cartographer探秘第四章之代码解析(五) --- 后端优化 --- 闭环约束1 --- PrecomputationGrid2D
- mybatis mysql crud_mybatis实现CRUD操作(mysql数据库)(二)
- linux如何从 命令行 将普通文件打印到 pdf
- A3C的算法原理和算法流程
- Java继承中的覆盖
- chloe.mysql 源码_AceFx-基于Nfine的Chloe官网及后台源码
- 【Opencv实战】美颜模式,开启:美颜功能都这么强大了嘛?(群魔乱舞.jpg)
- 【Python】三维画图——matplotlib以及np.mgrid的使用
- 在面试中如何回答面试官的问题
热门文章
- 高考不是终点,看华老师如何面对人生抉择
- 创建第一个Flutter App项目
- 格式工厂 wav 比特率_Easy MP3 Converter Pro for mac(音频格式转换软件) 3.0.0
- 腾讯电竞:电竞产业已成风口 良性发展需要靠教育稳固根基
- php 根据url生成图片并保存
- Highlight出包含特定文本的单元格-search函数与条件格式的应用实例
- VMware安装CentOS7(零基础版附镜像)
- WSUS 重置引导指南(WSUS Reset Guide Line) WSUS针对性获取上级补丁数据
- 树莓派基于分类器的识别环保标志(三)分类器xml创建
- 索尼X90J和X95J区别 索尼X90J和X95J哪个好?