该 BIP 提议在 Merklized Script Version 0 中引入一个新的操作码 OP_PUSHTXDATA
,允许智能合约访问交易的各种数据,如输入索引、交易费用、版本号、锁定时间以及输入输出的详细信息。这为实现更复杂的 covenant 和 vault 机制提供了基础。
forked from bitcoin/bips
vault
搜索此仓库
/
复制路径
BlameMore 文件操作
BlameMore 文件操作
更新 BIP114 并添加与 Merklized Script Version 0 相关的 BIP
2017年9月8日
ce4a698 · 2017年9月8日
打开提交详情
144 行 (122 loc) · 4.89 KB
/
顶部
预览
代码
Blame
144 行 (122 loc) · 4.89 KB
复制原始文件
下载原始文件
目录
编辑和原始操作
BIP: ZZZ
Layer: Consensus (soft fork)
Title: OP_PUSHTXDATA
Author: Johnson Lau <jl2012@xbt.hk>
Comments-Summary: No comments yet.
Comments-URI: https://github.com/bitcoin/bips/wiki/Comments:BIP-0ZZZ
Status: Draft
Type: Standards Track
Created: 2017-07-19
License: BSD-3-Clause
CC0-1.0
## 目录<br>Permalink: 目录<br>- 摘要<br>- 动机<br>- 规范<br>- 原理<br>- 示例<br>- 向后兼容性<br>- 部署<br>- 参考实现<br>- 致谢<br>- 参考文献<br>- 版权 |
此 BIP 在 Merklized Script Version 0 中定义了一个新的操作 OP_PUSHTXDATA
。
Covenant: 输出必须遵循预先指定的模式
Vault: 需要一个额外的步骤来花费深度冷存储
微调的交易签名,例如“费用必须至少为每重量单位 100 satoshis”,“输出数量不得大于输入数量”,“仅签署 2 个输出”,“输出 X 和 Y 的值不得相同”
(待完成)
以下规范适用于 MSV0
的 scriptKeyCode
,以及 MSV0
和 P2WPKV0
的 scriptWitCode
。
定义了一个新的操作 OP_PUSHTXDATA
,其值为 0xbb
。 顶部堆栈项 必须 是一个从 0 到 15 的 CScriptNum
,否则评估失败。 该值确定要推送的 TXDATA
的类型。 如果 TXDATA
类型小于 10,则从堆栈中删除它,并将单个值返回到堆栈顶部。 所有返回的值都是 CScriptNum
。
TXDATA 类型 |
名称 | 返回到堆栈的值 |
---|---|---|
0 | TXDATA_THIS_VIN_INDEX |
当前输入的索引 |
1 | TXDATA_VIN_SIZE |
交易中的输入数量 |
2 | TXDATA_VOUT_SIZE |
交易中的输出数量 |
3 | TXDATA_THIS_VIN_VALUE |
当前输入的值(以 satoshi 为单位) |
4 | TXDATA_FEE |
交易支付的费用(以 satoshi 为单位) |
5 | TXDATA_VERSION |
交易 nVersion 转换为无符号整数 |
6 | TXDATA_LOCKTIME |
交易 nLockTime |
7 | TXDATA_BASE_SIZE |
没有见证序列化的交易大小(以字节为单位) |
8 | TXDATA_TOTAL_SIZE |
带有见证序列化的交易大小(以字节为单位) |
9 | TXDATA_WEIGHT |
交易权重 |
如果 TXDATA
类型大于或等于 10,则第二个最高的堆栈项是一个 CScriptNum
,用于确定 index
。 如果 index
值小于 -1,脚本 必须 失败。 如果 index
值为 -1,则将其评估为当前输入的索引。 删除顶部两个堆栈项,并根据 TXDATA
类型和 index
将一个或多个项返回到堆栈。 如果指定的输入或输出不存在,脚本 必须 失败。
TXDATA 类型 |
名称 | 第一个返回值 | 第二个返回值 | 第三个返回值 |
---|---|---|---|---|
10 | TXDATA_VIN_PREVOUT |
指定输入的 prevout 哈希 |
指定输入的 prevout 索引 |
|
11 | TXDATA_VIN_SEQUENCE |
指定输入的 nSequence 值 |
||
12 | TXDATA_VIN |
指定输入的 prevout 哈希 |
指定输入的 prevout 索引 |
指定输入的 nSequence 值 |
13 | TXDATA_VOUT_VALUE |
指定输出的值 | ||
14 | TXDATA_VOUT_SCRIPTPUBKEY |
指定输出的 scriptPubKey |
||
15 | TXDATA_VOUT |
指定输出的值(以 satoshi 为单位) | 指定输出的 scriptPubKey |
例如,如果类型是 TXDATA_VIN
,则从堆栈中删除 2 个项目,并将 3 个项目返回到堆栈,其中 nSequence
作为最终的顶部堆栈值。
prevout
索引,nSequence
和输出值作为 <code>CScriptNum
返回。
prevout
哈希作为 32 字节的小端值返回,具有与交易序列化中使用的相同字节序列。
scriptPubKey
作为实际脚本返回。 例如,如果 scriptPubKey
是 P2WSH
,则返回的向量大小为 34 字节(0x0020{32 bytes hash}
)。 如果 scriptPubKey
的大小大于 520 字节,则脚本 必须 失败。
作为软分叉,旧软件将继续运行而无需修改。 但是,未升级的节点会将 MSV0
和 P2WPKV0
程序视为任何人都可以花费的脚本。
具体细节待定。
https://github.com/jl2012/bitcoin/commits/vault
本文档根据 BSD 3-clause 和 Creative Commons CC0 1.0 Universal 双重许可。
- 原文链接: github.com/jl2012/bips/b...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!