撰文:金色财经0xjs
2023年10月19日,闪电网络开发商Lightning Labs宣布Taproot Assets协议上线。Taproot Assets协议支持在比特币和闪电网络上发行资产。
什么是Taproot Assets协议?Taproot Assets协议如何发行、转移资产?本文带你一文读懂。
根据Taproot Assets协议BIP,Taproot Assets协议是一种构建在比特币上的Taproot原生资产(Taproot-native asset )层。Taproot资产可以在比特币链上表示任意资产,而不会导致比特币网络膨胀。该协议的设计使得与Taproot资产交互的交易与常规比特币交易没有区别。
Taproot资产使用嵌套资产脚本树(nested asset script tree,这是一个merkle-sum Sparse Merkle Tree或MS-SMT)。其扩展了基础Taproot脚本树,该脚本树将有效见证人作为结构化元数据提交,从而可以证明资产在交易图中的移动。Taproot资产转移的证明可以使用密封证明(hermetic proof )进行验证,或者使用外部维护的Universe进行验证。Universe是一个索引链上资产发行+转移的MS-SMT。
Taproot Assets支持通过闪电网络通道(基于BOLT协议套件)进行链外单跳和多跳传输,后者使用Taproot Assets独特的嵌入式资产脚本系统来体现。一系列链上和链下Merkle证明促进了链上Taproot资产传输的轻客户端验证,可以通过将信任关系委托给活动的Universe实例来压缩这些证明。
Taproot是BIP 341中定义的一种新交易类型,自2021年11月起在比特币主网上线。 Taproot交易与传统比特币交易的主要区别在于,控制脚本包含在称为“tapScript分支”的树结构中,该结构是私下承诺参与交易。如果使用KeySpend路径来移动比特币,则不需要透露这些脚本。
虽然传统交易需要公开整个脚本,但Taproot交易可以使用密钥来避免公开脚本,如果密钥花费路径不可行,则仅在区块链上公开脚本的执行部分。所有其他脚本路径都可以保持私有,或者有选择地在链外公开。
这使得创建更复杂的脚本成为可能,而无需增加在keySpend路径中向区块链提交额外数据的成本,以及对修剪后的脚本数据进行有效验证。在Taproot Assets的背景下,它允许人们将任意数据可证明地附加到交易中,而无需在链上泄露这些数据。
将包含此类任意数据的交易称为承诺。一旦交易被包含在区块中,我们就已经承诺了该数据,并且不能再更改或修改它。
为了承诺数据,人们使用称为“Taptweak”的技巧来调整Taproot支出密钥的公钥。它允许人们有选择地暴露数据而不泄露私钥,或者在不泄露承诺的情况下花费输出。
该技术在Taproot交易中用于提交到Taproot脚本树,并且可用于提交任何任意数据。
Q= P+H(P|c)G
Q = 最终的Taproot公钥;P = 内部公钥;H(P|c) =内部公钥和承诺的哈希值
要使用我们的私钥签署交易,需要使用与公钥和承诺相同的哈希值 H(P|c) 来调整私钥。
Sparse Merkle Tree是一种可以证明Merkle树中不存在特定数据的数据结构。SMT是经过验证的键值存储,这意味着叶的键或位置和叶的内容相互绑定。
为了实现此属性,对叶子的内容进行哈希处理并创建默克尔树,其中叶子的位置对应于哈希摘要的位图(bitmap)。这必然需要一棵 256 层和 2^256 个叶子的树。树的生成是高效的——尽管尺寸明显很大——因为绝大多数分支包含空叶子并且可以用零哈希来表示。
构造一个Sparse Merkle Tree
例如,我们可以使用虚构的哈希函数sha002构造一棵Sparse Merkle Tree,其结果为 0 到 3 之间的数字。我们生成一棵具有 4 个叶子的Sparse Merkle Tree:0、1、2 和 3。只有叶子 2 是已填充,所有其他叶子都是空的。为了找到叶子 2(用二进制写为 10),我们在第一个分支 (1) 处向右移动,然后在第二个分支 (0) 处向左移动。
识别Sparse Merkle Tree中的叶子
为了验证叶子 2,我们现在只需要揭示该叶子的值,加上叶子 3 的哈希值和分支 0 的哈希值。
在Sparse Merkle Tree中,当以二进制形式表示时,每个叶子都可以通过映射来描述为自身的指南。地图就是Sparse Merkle Tree本身,指南由在每个岔路口左转还是右转的指示来表示。例如,2^4 大型 Sparke Merkle 树中的第 9 个叶子用二进制表示为 1001,这意味着我们通过左转、右转、右转、最后左转来找到合适的叶子。
这个属性对于构造和重构Sparse Merkle Tree非常有用,因为它准确地描述了我们必须重构Sparse Merkle Tree的哪些部分。更重要的是,现在可以通过每个叶子中的数据在树中的位置来描述它们。
使用稀Sparse Merkle Tree,我们可以将数据与公钥关联起来,并以一种易于验证的方式证明我们已经删除了这些数据,而无需透露整个树。
在Sparse Merkle Tree中插入一个item
由于每个项目都有其预定位置,因此树的根哈希不依赖于项目插入的顺序。
Merkle sum树是Merkle树的一种,每个叶子都包含数值,每个节点还包含其下面的值的总和。Merkle 求sum树的根部是树中总值的总和。
Merkle Sum 树可以通过承诺与叶子相关的数量来有效验证守恒(非膨胀)。
Taproot Assets结合使用上述概念来发行比特币原生资产。Sparse Merkle树和Merkle sum树组合成Sparse Merkle sum树。
Sparse Merkle sum树的根被添加到Taproot Tapscript中,并一起创建Taproot地址。
Taproot Assets发行者没有自己的区块链,而是将Sparse Merkle sum树存储在链下,并向资产持有者发出证明。此类资产的所有者可以独立验证他们的帐户是否包含在树中,是否填充了适当的金额以及相应的Taproot交易是否存在并在比特币区块链上得到确认。
要发行Taproot Assets ,必须首先创建它的标识符。资产ID大小为32 字节,它是通过对三个元素进行哈希处理而生成的:用于铸造资产的出点、铸造者选择的资产标签(例如品牌名称的哈希值)以及与资产相关的元信息 -例如链接、图像或文档。
asset_id = sha256(genesis_outpoint || asset_tag || asset_meta)
资产脚本可以有输入和输出,类似于比特币交易。新创建的资产不包含任何Taproot资产输入,而资产转移则包含。
资产脚本的输出定义了新创建的资产将发行给谁。更准确地说,这是通过Sparse Merkle sum树来完成的,其中每个账户都由一个 256位密钥标识,并且与该密钥对应的每个叶子都包含有关该账户持有金额的信息。
可以在一笔交易中发行多个资产,但每个资产都有自己的资产脚本,并在其中包含Sparse Merkle 树。资产可以是唯一的,也可以是非唯一的。
每个叶子都包含一个 TLV(类型、长度、值)blob,类似于闪电网络中使用的 TLV。它包含版本、资产 ID、金额等信息,以及与该资产之前传输相关的数据(例如签名)。
一旦我们生成了Sparse Merkle sum树和资产脚本,我们就可以调整我们的内部公钥并获取合约的地址并完成交易。
一旦我们发布此交易并在比特币区块链上确认,我们就不可逆转地创建了该资产。对于观察者来说,该交易看起来就像任何其他标准Taproot交易一样。
资产发行者现在可以有选择地披露创建了哪些资产以及分配给了谁。最重要的是,发行者可以通过揭示特定的资产证明来向接收者证明资产已转移给他们,其中包含资产脚本以及以接收者帐户为密钥的Sparse Merkle sum树的路径。
接收者可以验证部分Sparse Merkle sum树以重新创建脚本,调整发行者的公钥并验证创世交易是否存在于区块链上,而部分 Merkle 树为他们提供了对发行给他们的资产的保证,以及已发行资产总数。
Taproot资产可以在链上转移,也可以用于打开闪电网络通道。本文这里仅讨论链上交易。
Taproot Assets并未规定个人账户持有人之间的具体交互方式,但可以是特定于应用程序的。发行人可以灵活地定义其资产或打算如何限制这些资产。
资产根承诺承诺树内持有的所有资产及其总和。asset_id是全局唯一的,因为它取决于其创世输出的标识符。总根可以包含多个asset_id,其资金保存是通过验证asset_tree_root来提供的。
asset_tree_root = sha256(asset_id || left_hash || right_hash || sum_value)
Taproot资产地址是资产ID、资产脚本哈希、Sparse Merkle sum树的内部密钥和金额的bech32m编码标识符,前缀为Taproot资产或taptb1(testnet)。
bech32(hrp=TapHrp, asset_id || asset_script_hash || internal_key || amt)
发行人或资产持有者可以使用 Taproot 资产地址中的信息来创建或修改Sparse Merkle sum树。此地址格式还可用于请求该地址所持有金额的具体证明。
要转移Taproot资产,接收者将其地址传达给当前持有者,当前持有者可以发起转移。目前,账户持有人和发行人之间的确切互动尚未严格定义。它可以由每个应用程序甚至资产发行者来指定。
资金发送者需要生成反映新余额的新Sparse Merkle sum树。这是通过减少某些叶子的余额并增加其他叶子的余额来完成的。Sparse Merkle sum树保证在此类交易中不会创建新资产,并且之前对资产的索取权将被完全放弃。
识别账户
创建资产需要一次链上Taproot交易,其中可以铸造多少资产或可以有多少帐户可以持有这些资产没有限制。如上所述,要转移资产,需要重新组织Merkle树并发布新的链上交易。在这笔链上交易中反映多少内部Taproot Assets交易是没有限制的。
使用这种方法,资金被分配给帐户持有者,以Sparse Merkle sum树中的叶子表示,但进行此类内部转移的能力仅限于内部Taproot私钥的所有者。
Universe是一项为资产持有者提供资产信息以及证明的服务。它类似于比特币区块浏览器,展示了Taproot Assets交易数据,该数据与Taproot Assets客户端一起存储在链下。主要区别在于,由于大多数与Taproot Assets相关的信息都是链下的,因此更容易隐藏。
Universe可以由资产发行人自己运行,也可以由发行人指定。也可以想象,社区运营的Uniserve会汇总资产持有者提交的信息。
例如,给定一个已知的资产 ID,Universe可以提供有关其创世输出的信息,以及当前的元信息,例如文档、资产脚本或流通中的总代币。服务还可能了解多资产(Multiverse)或仅了解单个输出(Pocket Universe)。
Universe 在 Taproot 资产协议中没有任何特权。它生成针对比特币区块链进行验证的交易数据。敌对Universe只能避免返回客户请求的数据。Taproot Assets 交易数据不绑定到 Universe。Universe 提供的数据可用性产品是由那些希望对其Taproot资产进行快速、廉价验证的实体所推动的。
如上所述,资产可以在资产的Sparse Merkle树内部转移,或者可以发送到另一个Taproot密钥持有者。这称为资产分割。
在资产分割中,发送者首先需要更新自己的Taproot输出的Sparse Merkle sum树,调整余额并重新计算 Merkle 根。在合并的情况下,根和也会改变。
此外,还将有第二个Sparse Merkle sum树致力于新的Taproot输出。第二个 Merkle 树是由资产的接收者计算的,其行为与上例中的发行者类似,不同之处在于这些资产不是从无到有,而是从之前的输出中分离出来,例如资产的创世输出。
资产证明
为了能够验证资产分割是否已经发生,新universe的运营者需要证明
资产是在交易零 (t0) 时创建的
资产在 t0 时存在于原始 Merkle 树的叶子上
该叶子的余额在 t1 时设置为零
资产在 t1 时存在于新 Merkle 树的叶子上
一旦资产被分割,资产所有者就可以像发行人一样进行内部交易。分割之前的每个证明始终需要包含发行证明以进行出处验证。
资产证明随着每笔新的链上交易线性增长。每笔资产交易都需要审计回溯至其创世输出。仅当其引用的输出未在区块链上花费时,资产证明才有效。
一旦资产的输出被花费而没有提交到新的Sparse Merkle sum树,资产就会被视为无效。
这对于第三方观察者来说并不明显,在某些情况下,最好将输出花费到新的空Merkle树上,以证明资产已被销毁、失效或“烧毁”。
来源:金色财经