本文档描述了将单个 Taproot Asset 发送到熟悉的 bech32m
地址的方法,以及将该地址映射到有效的 Taproot Asset 脚本树的方法,该脚本树可以包含在广播事务中以完成转移。一旦交易被广播,接收者可以使用已确认交易的先前输出点在他们选择的 Universe 中查找完整的资产证明。
fork 自 bitcoin/bips
bip-tap
在此仓库中搜索
/
复制路径
BlameMore 文件操作
BlameMore 文件操作
和
bip-tap-addr+vm: describe non-interactive sends, split commitment cle…
打开提交详情
2023年10月16日
4dde2f1 · 2023年10月16日
打开提交详情
182 行 (149 loc) · 9.42 KB
/
顶部
预览
代码
Blame
182 行 (149 loc) · 9.42 KB
复制原始文件
下载原始文件
大纲
编辑和原始操作
BIP: ???
Layer: Applications
Title: Taproot Asset On Chain Addresses
Author: Olaoluwa Osuntokun <laolu32@gmail.com>
Comments-Summary: No comments yet.
Comments-URI: https://git
Status: Draft
Type: Standards Track
Created: 2021-12-10
License: BSD-2-Clause
## 目录<br>固定链接:目录<br>- 摘要<br>- 版权<br>- 动机<br>- 规范 <br> - 编码地址<br> - 解码并发送到地址<br> - 非交互式全额发送<br> - 花费收到的资产<br>- 测试向量<br>- 参考实现 |
本文档描述了一种将单资产 Taproot Asset 发送到一个熟知的 bech32m
地址的方法,以及一种将该地址映射到有效的 Taproot Asset 脚本树的方法,该脚本树可以包含在广播事务中以完成转移。
一旦交易被广播,接收者可以使用已确认交易的先前输出点在其选择的 Universe 中查找完整的资产证明。
本文档基于 2-clause BSD 许可。
Taproot Asset 协议需要一种简单的方法来允许用户在链上相互发送资产,而无需多轮交互来交换和验证证明。通过使用现有的 bech32m
地址序列化标准,这些地址看起来很独特,同时基于字符集编码也足够熟悉。所描述的地址格式还解决了一些可能的误用,例如防止发送错误的资产(基于地址)以及其他保护措施。
Taproot Asset 由其 asset_genesis
以及作为转移必须满足的谓词的 asset_script_key
唯一确定。这些值,以及在创建持有 Taproot Asset 的 Bitcoin 输出时使用的内部 Taproot 密钥,被编码到一个地址中。
令人类可读前缀(如 BIP 173 中指定的)为:
tapbc
用于 mainnettaptb
用于 testnettaprt
用于 regtesttaptb
用于公共 signettapsb
用于 simnet我们将此值称为 taproot_asset_hrp
给定 32 字节的 asset_id
,33 字节的压缩 asset_script_key
和 33 字节的压缩内部公钥,以及 8 字节的要发送的金额,地址编码为:
bech32m(hrp=taproot_asset_hrp, addr_tlv_payload)
其中 addr_tlv_payload
是由以下类型组成的 TLV 负载:
taproot_asset_version
)
u8
: version
]asset_id
)
32*byte
: asset_id
]asset_key_family
)
33*byte
: family_key
]asset_script_key
)
33*byte
: script_key
]internal_key
)
33*byte
: taproot_internal_key
]taproot_sibling_preimage
)
...*byte
: tapscript_preimage
]amt
)
BigSize
: amt_to_send
]proof_courier_addr
)
...*byte
: proof_courier_addr
]受到 Lightning 的 BOLT 规范的启发,我们同样采用了"it's OK to be odd"的语义。这使得接收者可以向调用者指定某些必须知道的信息,以便正确完成转移。
当前版本中指定的唯一奇数键是 asset_key_family
类型和 asset_type
字段。对于不允许持续重新发行的资产,asset_key_family
字段并非总是必需的。类似地,如果未指定 asset_type
字段,则可以假定正在发送普通资产。
proof_courier_addr
是一个强制性的 URI (RFC 3986),指示在将证明从发送者发送到接收者时要使用的证明快递服务。Scheme(协议)指示要使用的快递传输类型,当前有效的值是 hashmail://
用于基于 Hashmail 的快递服务,以及 universerpc://
用于通过 universe 服务器进行基于 gRPC 的传输。
给定一个有效的 Taproot Asset 地址,将内容分解为引用的 asset_id
,asset_script_key
和 internal_key
。在相应的 Universe 中使用 asset_id
查找完整的 asset_genesis
。
根据默认的 Asset Leaf Format 构造一个新的空白 Taproot Asset 叶子,并显式设置以下值(其他所有值均为其默认值/零值):
taproot_asset_version
: 0
asset_genesis
: asset_genesis
amt
: amt_to_send
asset_script_version
: 0
asset_script_key
: asset_script_key
asset_key_family
: asset_key_family
使用叶子版本 0x0c
创建一个有效的 tapscript 根,唯一的叶子是上面指定的序列化 TLV blob。
按照 BIP 341 中的规定,使用包含的密钥作为内部密钥来创建顶层 taproot 公钥脚本,作为 segwit v1 witness 程序。
在构建了目标 taproot 公钥脚本之后,通过执行以下步骤将资产发送给接收者:
asset_id
并且精确地 amt
单位的资产的输入。asset_id
的 S-A
单位,其中 S
是输入金额,A
是在编码的 Taproot Asset 地址中指定的金额。split_commitment
,它 commitment 到新创建的接收者的资产叶子的事务中的位置(由 sha256(output_index || asset_id || asset_script_key)
键控)。发送者在序列化叶子以包含在资产树中时会省略此 split commitment,否则树在接收者端是不可预测的。在 bip-tap-vm 的输入映射包含证明验证期间,这有一个对应的规则。split_commitment
的可选辅助值。将资产发送到地址本质上是一个非交互式过程,因为除了首先交换地址外,发送者和接收者之间没有主动通信。
由于上述要求,即创建用于发送到地址的资产叶子必须具有 split_commitment
,因此如果没有任何找零返回给发送者(资产输出被转移到地址完全消耗)则存在一个特殊情况: 必须为 split 根资产(split 的 root_asset
)创建一个值为 0 的特殊_墓碑_输出,该输出持有转移见证。split 根资产输出的 script_key
应该是众所周知的 NUMS 点(使用字符串“taproot-assets”和传统的“哈希和递增”方法来生成该点),以证明该输出不能进一步花费。当 UTXO 进一步花费时,可以从树中修剪这样的墓碑输出。有关交互式和非交互式发送以及墓碑输出的更多详细信息,请参见 bip-tap-psbt。
为了花费(或仅确认收到)收到的资产,接收者应:
split_commitment
包含证明。编码地址 的测试向量可以在这里找到:
测试向量由 Taproot Assets GitHub 仓库中的单元测试 自动生成。
github.com/lightninglabs/taproot-assets/tree/main/address
- 原文链接: github.com/Roasbeef/bips...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!