BCH恢复禁用的脚本操作码[草案]

区块链技术巴比特2018-02-18 11:34:02  阅读 -评论 1  阅读原文

Version 0.1, 2018-01-19 – 草案供讨论

BCH恢复禁用的脚本操作码[草案]

讨论草案

为了讨论这个草案,附加说明包含在标题草案的标题中。这些打算从这个文件的finalalized版本被删除。

可选规则由RULE OPTION表示,其中预期将在工作组内达成共识之后采用所呈现的选项。

引言

本文档描述了重新激活几个脚本操作码的建议要求。 2011年,在OP_LSHIFT和OP_RETURN中发现了两个严重的错误,提示禁用这些和另外13个操作码。 以下的禁用操作码列表按类别细分。

拼接操作

BCH恢复禁用的脚本操作码[草案]

按位逻辑

BCH恢复禁用的脚本操作码[草案]

算术

BCH恢复禁用的脚本操作码[草案]

建议操作码重新启用

建议在分阶段过程中重新引入这些操作码(或等效功能)。第一阶段是在五月硬叉中启用一个有限的子集。

拼接操作:OP_CAT, OP_SPLIT
按位逻辑:OP_AND, OP_OR, OP_XOR
算术:OP_DIV, OP_MOD

New:

- x OP_BIN2NUM -> n – 将二进制数组“x”转换为有效(规范)数字元素

- n m OP_NUM2BIN -> out – 将数值“n”转换为长度为“m”的字节数组

提出了一个新的操作OP_SPLIT,作为OP_SUBSTR,OP_LEFT和OP_RIGHT的替代。所有三种操作都可以用OP_SPLIT,OP_SWAP和OP_DROP的不同组合来模拟。

在按位操作下进一步讨论这些新操作的目的。

脚本数据类型

应该注意的是,在脚本操作中,堆栈中的数据值被解释为二进制字符串(即字节数组)或数字。 除非特别声明为解释为数字,否则堆栈上的所有数据都被解释为一个字节数组。

数字类型有特定的限制:

使用的编码是带有明确的符号位(最后一个字节的最高位)的小端。 它们的长度不能超过4个字节。 它们必须使用尽可能最短的字节长度进行编码(没有零填充)3:规则3有一个例外:如果有多于一个字节并且第二个最重要字节的最高有效位被设置, 与符号位冲突。 在这种情况下,左边允许单个0×00或0×80字节。 负零不被允许。

新提出的opcode x OP_BIN2NUM - > out可以用来在需要时将二进制数组转换为规范的数字。

新提出的操作码x OP_NUM2BIN可用于将数字转换为长度为n的零填充二进制数组,同时保留符号位。

Endian符号

为了便于阅读,本文档中使用了十六进制字符串,其中使用了大端符号。即:0×0100表示十进制256而不是十进制1。

风险和哲学方法

一般而言,采取的方法是尽可能地限制边缘案例的极简主义方法。 在可能的情况下,与现有的操作码结合使用的原始操作码可能被组合,以产生比一组更复杂的操作码更优选的更复杂的操作。 导致模糊或未定义行为的输入条件应该快速失败。

应针对以下风险状况检查每个操作代码并明确定义缓解行为:

- 操作数字节长度不匹配。在通常预期两个操作数具有匹配的字节长度的情况下,应当定义所产生的行为。

- 带符号的整数是否有符号整数是允许的操作数并且是否需要特殊处理。

- 堆栈大小的影响。元素的数量和元素的总大小。

- 溢出。在操作结果超出MAX_SCRIPT_ELEMENT_SIZE的实例中定义的行为

- 空字节向量操作数。是否允许空字节向量表示为零。

- 空字节向量输出。 请注意,输出一个空字节数组的操作已经有效地将false推送到堆栈上。 如果这是脚本中的最后一个操作,或者如果条件操作符紧跟在脚本之后,则作者必须考虑这种可能性。 对于许多现有的操作码而言,这是现在的情况,所以继续允许这种行为是一致的。

定义

- 堆栈内存使用 – 堆栈元素大小的总和 – 显示对内存使用的影响

- 操作数顺序 – 按照惯例,其中指定了多个操作数,最上面的堆栈项是最后一个操作数。例如x1 x2 OP_CAT – > x2是顶层堆栈项,x1是顶层的下一个堆栈项

- 空字节数组 – 在整个文档中,OP_0用作空字节数组的简便表示。虽然这是一个推送数据操作代码,但它的效果是推空字节数组到堆栈。

拼接操作

OP_CAT

Opcode (decimal): 126 Opcode (hex): 0x7e

连接两个操作数。

x1 x2 OP_CAT → out

例如:

Ox11 0x2233 OP_CAT -> 0x112233

这个操作会失败如果:

0 <= len(out)<= MAX_SCRIPT_ELEMENT_SIZE – 操作无法输出违反元素大小约束的元素

请注意,零长度操作数的连接是有效的

成功执行的影响:

- 堆栈内存使用是不变的

- 堆栈上的元素数量减少一个

输出长度的限制可以防止内存耗尽攻击,导致操作对堆栈大小的影响比现有的OP_DUP操作符小。

单元测试:

a b OP_DIV - > failure 其中! isnum(a)或 !isnum(b) – 两个操作数都必须是有效的数字 0 OP_DIV - > failure – 除以正零(所有大小),负零(所有大小),OP_0 a b OP_DIV - > out 其中a <0的结果必须是负数或任何形式的零。 检查不同长度1..4的操作数的有效结果

OP_MOD

Opcode (decimal): 151 Opcode (hex): 0x97

返回除以b后的余数。输出将使用所需的最少字节数来表示。

a b OP_MOD → out where a and b are interpreted as numbers

这个操作会失败如果:

- !isnum(a)|| !isnum(b) – 两个操作数都不是有效的数字
- b == 0 - b是负数或等于任何类型的零

成功执行的影响:

- 堆栈内存使用减少(删除一个元素)
- 堆栈上的元素数量减少一个

单元测试:

a b OP_MOD - > failure其中!isnum(a)或!isnum(b) - 两个操作数都必须是有效的数字 a 0 OP_MOD -> failure – 除以正零(所有大小),负零(所有大小),OP_0 a b OP_MOD -> failure其中 a < 0, b < 0 – 两个操作数都必须是正数 检查不同长度1..4的操作数的有效结果 新操作

草案讨论

为了便于按位逻辑的“操作数必须等长”规则。 需要额外的操作员为脚本作者提供填充操作数的合理方式。 填充字节数组和填充数字之间必须有明确的区别。

结束草案讨论

OP_BIN2NUM

OP_BIN2NUM取代OP_LEFT并使用它的操作码

Opcode (decimal): 128 Opcode (hex): 0x80

另见OP_NUM2BIN

例如:

0x0000000002 OP_BIN2NUM -> 0x02 0x800005 OP_BIN2NUM -> 0x85

这个操作会失败,如果:

- 数字值超出可接受的数值范围(当前大小限制为4个字节)

OP_NUM2BIN

OP_NUM2BIN取代OP_RIGHT并使用它的操作码

Opcode (decimal): 129 Opcode (hex): 0x81

将数字值转换为特定大小的二进制数组,考虑符号位。

n m OP_NUM2BIN -> x where m and n are interpreted as numbers

另见OP_BIN2NUM。

例如:

0x02 4 OP_NUM2BIN -> 0x00000002 0x85 4 OP_NUM2BIN -> 0x80000005

这个操作会失败,如果:

n或m不是有效的数字值 m <len(n)。 n是一个有效的数值,因此它已经以最小的表示 m> MAX_SCRIPT_ELEMENT_SIZE – 结果太大 参考实现

TODO

参考

[1] https://en.bitcoin.it/wiki/Script#Opcodes

引用

原文:https://github.com/shadders/uahf-spec/blob/reenable-op-codes/reenable-op-codes.md

声明:链世界登载此文仅出于分享区块链知识,并不意味着赞同其观点或证实其描述。文章内容仅供参考,不构成投资建议。投资者据此操作,风险自担。此文如侵犯到您的合法权益,请联系我们100@7234.cn

    参与讨论 (1 人参与讨论)

    相关推荐

    区块链投资趋势报告:巨头入场布局行业趋于成熟

    区块链投资趋势报告:巨头入场布局行业趋于成熟

    来自:https://mp.weixin.qq.com/s?__biz=MzI4NzIxOTY1NA==&amp;mid=2650632639&amp;idx=1&amp;sn=e6d1c29731d992a80410aaee82ec3ea6&amp;chksm=f3d8db16c4af520097e4a64a71b1d4743ac326b9f027

    重新发明货币

    重新发明货币

    一、货币的演化过程 先简单回顾一下人类货币的演化过程,大概有以下阶段: a. 1.0版本:自然货币(贝壳、牲口、金银……) 这个阶段,货币基于一般等价物的稀有性或者实用性,货币不可能出现人为操纵的超发。 b. 2.0版本:早期纸币、银票到本位纸币 当贸易量越来越大,实物货币太不方便了,而且大家发现其实并不在意货币本身有什么价值,在意的只是这么多的货币能不能交换到足够的物品,于是纸币这种信用货

    从比特币交易看欧洲央行虚拟货币分类

    从比特币交易看欧洲央行虚拟货币分类

      互联网对传统社会的颠覆从未停止,在其完成对信息流、商流、物流、资金流的初步改造之后,或将以虚拟货币的形式打破现有货币体系   4月18日,在中国极客张沈鹏创办的比特币交易平台(42BTC.com)上,比特币对人民币的平均交易价为576元。当天,该平台完成了100个比特币的交易量。仅仅过去一周,4月25日上午,比特币对人民币的平均交易价已达到906元。据42BTC网站统计:在过去的32个月

    欧洲央行-比特币报告

    3.1 比特币 3.1.1 基本特征          比特币可能是最成功的,也可能是最有争议的虚拟货币方案,由日本程序员中本聪(译者注:事实上,中本聪是不是日本人,甚至是不是单个人无从考证)在2009年设计并实现。该计划基于一个类似于BitTorrent的P2P网络。BitTorrent是互联网上著名的共享文件协议,应用在电影,游戏和音乐领域。比特币在全球层面上运作,可用于各类货币交易(虚

    彻底玩转比特币地址和私匙

    彻底玩转比特币地址和私匙

    比特币地址和私匙是所有比特币初学者面对的一大难题,再加上那一串超长的字符串,让人更是摸不到头脑。 现在编者以问答的形式,带你一步步的揭开比特币地址和私匙的面纱。 还不知道什么是比特币地址和私匙的同学请点这里 问题一、比特币钱包由什么组成? 答 我们知道,比特币地址和私匙组成了比特币钱包,而私匙则决定了比特币地址上比特币的归属。 地址和私匙 问题二、如果只记得私匙我们还能还原比特币地址么? 答

    用GO语言实现比特币算法

    用GO语言实现比特币算法

    本节的这个例子展示一点点高精度数学包math/big、一点点散列包hash、一点点加密包crypto,还有一点点测试包testing的知识。这里不介绍bitcoin协议和算法——尽管它们很有趣,而是试图指出,Go对多种操作系统的支持,是实现这种跨平台应用的理想语言。 位钱(bitcoin)是一种使用加密手段制作的分布式电子货币。它最初于1998年由Wei Dai提出,并由中本聪(Satoshi

    详解比特币的找零机制

    详解比特币的找零机制

    比特币的找零机制一直让人有些迷惑,明明只向一个地址发送了比特币为什么 blockchain 上面的显示的有时是1个地址对多个地址,有时是多个地址对1个地址,有时又显示多个地址对多个地址? 为什么比特币资深用户要提醒大家当比特币钱包交易100次以上时再次交易后要重新备份钱包,恢复以前的钱包备份有可能会遭遇损失? 是的,这一切都是因为比特币的找零(Change)机制。本文参考 Bitcoin的维

    玩转比特币客户端之一:C盘转移和加速下载

    玩转比特币客户端之一:C盘转移和加速下载

    C盘空间不足?交易数据下载速度太慢?别着急,乐享比特币教你轻松玩转比特币官方客户端。 所有新人开始接触比特币时做的第一件事情大多数是安装比特币的官方客户端。 安全起见大家最好直接访问官方发布渠道sourceforge的地址进行下载:http://sourceforge.net/projects/bitcoin/files/Bitcoin/ 该网页列出了各版本的官方比特币客户端,目前

    麦妖榜
    更新日期 2019-06-15
    排名用户贡献值
    1BitettFan23989
    2等待的宿命23809
    3六叶树20309
    4区块大康18606
    5天下无双16192
    6linjm122715906
    7牛市来了15758
    8lizhen00215064
    9让时间淡忘14475
    10冷风大q11188
    返回顶部 ↑