Babylon BTC Staking

Babylon 的质押交易本质就是一笔BTC的交易,不过这笔交易是基于Taproot 的 Script 的交易

Taproot

Taproot是比特币网络的一次重大升级。这一升级在2021年11月激活,旨在提升比特币隐私性,提高交易效率,并扩展比特币的智能合约功能。 下面是Taproot升级的主要特性: 提升隐私性:不论是复杂的智能合约还是简单的比特币转账,所有这些操作在链上看起来一样。这降低了区分不同交易类型的可能性,提高了隐私性。 优化存储和带宽:通过另一种公钥和签名的方式(Schnorr签名),Taproot升级可以有效减小交易的数据量,这就降低了存储和网络传输的负担。 扩展智能合约功能:Taproot包含了对Merkle抽象语法树(MAST)的实现,这使得比特币能够创建更复杂的智能合约,而且不同于现有的支付到脚本哈希(P2SH)交易,MAST允许用户按需选择性的公开部分脚本,提高了隐私性和效率。 改进灵活性:Taproot的设计让未来的升级更具灵活性,容易添加新的功能。

Babylon BTC 质押的锁定脚本

下面主要描述Taproot通过MAST构建一笔包含多脚本的交易,以Babylon BTC 质押交易为例 当前Babylon 质押所使用到的锁定脚本

TimeLockScript

OP_CHECKSIGVERIFY OP_CHECKSEQUENCEVERIFY

SingleSigScript

OP_CHECKSIGVERIFY

MulSigScript

OP_CHECKSIGADD … OP_CHECKSIGADD threshold OP_GREATERTHANOREQUAL OP_VERIFY

Babylon质押交易的三个锁定路径

TimeLockPathScript:当达到指定的锁定高度以后,staker 可以花费此输出 使用TImeLockScriptUnboundingPathScript:staker 主动解质押,script 包含两个锁定脚本

unbondingPathScript := aggregateScripts(

stakerSigScript,

covenantMultisigScript,

)

stakerSigScript:staker 的单签名锁定脚本

covenantMultisigScript:convenant 委员会的多签

SlashingPathScript: 罚没的脚本,由Babylon 节点监控,自动发起;该脚本包含三个锁定脚本

slashingPathScript := aggregateScripts(

stakerSigScript,

fpSigScript,

covenantMultisigScript,

)

stakerSigScript:BTC 质押者的单签脚本

fpSigScript:finality provider 的多签脚本,staker 可以质押到多个finality provider,多签阈值是 1

covenantMultisigScript: convenant 委员会的多签,阈值从babylon节点获取

由于质押交易是需要通过Script Path(非 Key Path)来解锁,所以Key 就可以取任意值,BIP341 文档中给的值为

0x50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0

Babylon 也默认使用该值作为internal pubkey

MAST 构建脚本的方式

构建 三个锁定脚本全为叶子节点,从叶子节点开始,逐渐构建二叉树如下:

实际的交易输出地址为:

outputkey = txscript.ComputeTaprootOutputKey(internal_pubkey,S[:]) address = btcutil.NewAddressTaproot(schnorr.SerializePubKey(outputKey), net) 输出脚本为: pkScript = txscript.PayToAddrScript(taprootAddress) output为: output = wire.NewTxOut(int64(stakingAmount), taprootPkScript)

花费 以A = TimeLockScript 路径验证,则需要提供 3 个witness

staker sigTimeLockScriptControlBlock ControlBlock 需要包含一下内容

验证时需要满足通过 ControlBlock + TimeLockScript + internal_pubkey 能够重新计算出 outputkey 比较outputkey 与从 output 地址中获取的 outputkey 是否一致,若不一致则验证失败,交易失败 如一直,则将TimeLockScript 作为验证脚本,将staker sig 压入栈中,根据TimeLockScript验证栈中信息,直至验证完成。

注:当前交易构建的方式就满足了隐私性,通过交易的输出output并不能识别出任何有效信息,包括脚本信息,所以此种情况下也必须完全记录所有脚本的情况,忘记构建时的脚本就意味着该输出无法被花费

文章来源

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。