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 可以花费此输出
使用TImeLockScript - UnboundingPathScript: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 sig
- TimeLockScript
- ControlBlock
ControlBlock 需要包含一下内容
验证时需要满足通过 ControlBlock + TimeLockScript + internal_pubkey 能够重新计算出 outputkey
比较outputkey 与从 output 地址中获取的 outputkey 是否一致,若不一致则验证失败,交易失败
如一直,则将TimeLockScript 作为验证脚本,将staker sig 压入栈中,根据TimeLockScript验证栈中信息,直至验证完成。
注:当前交易构建的方式就满足了隐私性,通过交易的输出output并不能识别出任何有效信息,包括脚本信息,所以此种情况下也必须完全记录所有脚本的情况,忘记构建时的脚本就意味着该输出无法被花费