Bitcoin Staking 交易规范

本文档详细介绍了 Babylon 比特币质押协议的交易规范,定义了质押、解绑、罚没和提现四种核心交易类型。通过对比特币 Taproot 脚本路径的深入设计,阐述了如何利用时间锁和协调员委员会多签机制来实现比特币的去中心化质押与安全保障。

Bitcoin 质押交易规范

目录

  1. 介绍
  2. 预备知识
    1. 构建模块
    2. 利益相关者
  3. BTC 质押协议交易
    1. Staking 输出
    2. Unbonding 输出
    3. Slashing 退款输出

1. 介绍

Babylon BTC Staking 协议将 Bitcoin 转变为一种质押资产,旨在将该资产及其持有者引入 Bitcoin Supercharged Networks (BSN) 生态系统和 Babylon Genesis 链(第一个 BSN)。

Bitcoin 持有者可以通过在 Bitcoin 网络上使用特殊的交易锁定其 BTC 来进行质押。一旦锁定,该 Bitcoin 将为选定的受保护 BSN 提供经济安全性,从而为质押者开启新的机会,例如赚取质押收益。

本文档规定了 BTC 质押协议中涉及的交易结构。这些交易必须符合定义的格式,并提交特定的 Taproot 脚本。这些脚本中的值受 Babylon Genesis 链定义的参数以及质押者的选择所管辖。

⚡ 有关检索 Babylon Genesis 参数和注册有效质押交易的信息,请参考 注册 Bitcoin 质押文档

2. 预备知识

2.1. 构建模块

Bitcoin 质押协议交易规范在很大程度上基于 Bitcoin 的 Taproot 升级,该升级引入了 Schnorr 签名

2.2. 利益相关者

Bitcoin 质押协议涉及以下利益相关者:

  • Bitcoin 质押者: Bitcoin 质押者是 Bitcoin 质押创建后的控制者和受益人。质押者通过其 Bitcoin 公钥(在质押脚本中引用为 <StakerPk>)进行标识。

    ⚡ 质押者公钥不需要与质押交易的 UTXO 出资者匹配。出资 UTXO 可以源自任何来源,包括多重签名、MPC 或阈值控制的账户。

  • Finality Provider: Bitcoin 质押支持委托质押,允许将质押的投票权分配给 Finality Provider。Finality Provider 通过其 EOTS 公钥(<FinalityProviderPk>)进行标识,并参与特定 BSN 的最终性投票轮次。选择 Finality Provider 也隐式地确定了他们所保护的 BSN,因为每个 Provider 只能保护一个 BSN。Bitcoin 质押者通过在质押脚本中包含其 EOTS 密钥来指定他们选择的 Finality Provider。

    ⚠️ 目前,只能选择一个保护 Babylon Genesis 链的 Finality Provider。未来的协议版本将支持更多的 BSN,并允许 BTC 质押者委托给保护这些网络的 Provider。

  • Covenant 委员会: Covenant 委员会(由其成员的 Bitcoin 公钥 CovenantPk1..CovenantPkN 标识)的作用是保护 BSN 免受来自 BTC 质押者和 Finality Provider 的攻击。它通过表现为一个与 BTC 质押者共同签署 BTC 交易的 M-out-of-N 多重签名来实现这一点。通过共同签名,Covenant 委员会在质押的 Bitcoin 上强制执行花费规则,使其只能以符合协议的方式被花费。共同签名发布在 Babylon Genesis 链上,是质押激活的先决条件。Covenant 委员会无法采取不利于质押者的行动,除非拒绝其质押请求。
  • Babylon Genesis 链: Babylon Genesis 链是第一个 BSN,并充当 BTC 质押协议的控制层。所有 Bitcoin 质押和 Finality Provider 都必须在 Babylon Genesis 链上注册。它还负责将质押相关数据传播到其他 BSN。

⚠️ 质押脚本不得包含重复的密钥。StakerPkFinalityProviderPk 和每个 CovenantPk 的公钥在单个质押中必须是唯一的。

3. BTC 质押协议交易

Bitcoin 质押协议定义了四种关键交易类型:

  • Staking 交易: Staking 交易是一种将特定数量的 BTC 锁定到 Babylon 认可的质押脚本中的 Bitcoin 交易。它标志着 BTC 质押生命周期的开始。有效 Staking 交易的要求是:
    • 它可以包含任意数量的输入。
    • 它可以包含任意数量的输出,要求其中至少有一个输出——被称为 Staking 输出——是提交到 Bitcoin 质押脚本的 Taproot 输出。
  • Unbonding 交易: Unbonding 交易是一种 Bitcoin 交易,使质押者能够在他们最初作为质押交易一部分承诺的质押时间锁到期之前,按需解质押其 Bitcoin。有效 Unbonding 交易的要求是:
    • 它包含恰好一个输入,该输入指向锁定待按需解质押 Bitcoin 的 Staking 输出。
    • 它包含恰好一个输出——被称为 Unbonding 输出——这是一个提交到 Bitcoin 质押 Unbonding 脚本的 Taproot 输出。
    • Unbonding 交易的 Bitcoin 手续费必须等于 Babylon Genesis 参数中指定的 Unbonding 交易手续费。
  • Slashing 交易: Slashing 交易用于在 BTC 质押者委托的 Finality Provider 发生双重签名时惩罚质押者。有效 Slashing 交易的要求是:
    • 它必须有恰好一个输入指向 Staking 输出或 Unbonding 输出。
    • 它必须有恰好两个输出:
    • 第一个将罚没比例的资金发送到 Babylon Genesis 链参数中指定的销毁地址,以及
    • 第二个将剩余资金发送到一个 Taproot 输出——被称为 Slashing 退款输出——该输出在资金可由质押者赎回之前将其锁定在一个短时间锁中。
    • Bitcoin Slashing 交易的手续费必须大于或等于 Babylon Genesis 参数中为 Slashing 交易指定的最小手续费。
  • Withdrawal 交易: Withdrawal 交易是一种 Bitcoin 交易,用于从与 Bitcoin 质押脚本(Staking、Unbonding 或 Slashing)关联的时间锁脚本中提取已解锁的 Bitcoin。有效 Withdrawal 交易的唯一要求是其输入之一是 Staking、Unbonding 或 Slashing 输出。

下图显示了上述交易如何创建和花费不同的 Bitcoin 输出:

stateDiagram-v2
    active: Staking 输出
    unbonding: Unbonding 输出
    state stake_slashing <<fork>>
    state unbonding_slashing <<fork>>
    burn_staking: 销毁地址输出
    change_staking: 找零输出
    burn_unbonding: 销毁地址输出
    change_unbonding: 找零输出

    [*] --> active: Staking 交易

    active --> unbonding: Unbonding 交易

    unbonding --> [*]: Unbonding Withdrawal 交易

    unbonding --> unbonding_slashing: Slashing 交易
    unbonding_slashing --> burn_unbonding
    unbonding_slashing --> change_unbonding
    change_unbonding --> [*]: Withdrawal 交易

    active --> [*]: Staking Withdrawal 交易

    active --> stake_slashing: Slashing 交易

    stake_slashing --> burn_staking
    stake_slashing --> change_staking
    change_staking --> [*]: Withdrawal 交易

3.1. Staking 输出

Staking 输出是一个只能通过脚本花费路径进行花费的 Taproot 输出。关键花费路径通过使用“Nothing Up My Sleeve”(NUMS)点作为内部密钥而被禁用。使用的 NUMS 点是 BIP341 中定义的:

H = lift_x(0x50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0)

该点是通过对 secp256k1 基点 G 的标准未压缩编码作为 X 坐标进行哈希处理而得出的。

Staking 输出可以通过以下三条脚本路径之一进行花费:

  1. 时间锁路径: 此路径将质押者的 Bitcoin 锁定预定数量的 Bitcoin 区块。
    <StakerPK> OP_CHECKSIGVERIFY  <TimelockBlocks> OP_CHECKSEQUENCEVERIFY

    字段

    • <StakerPK> 是 BTC 质押者的公钥。
    • <TimelockBlocks> 定义了资金承诺保持锁定状态的 Bitcoin 区块数量。此持续时间从 Staking 交易在 Bitcoin 区块中确认后开始。 要求:
      • 时间锁必须低于 65535
      • 时间锁应在 Babylon Genesis 参数中定义的 Bitcoin 质押交易时间锁范围内。
  2. Unbonding 路径: 此路径允许质押者在时间锁到期之前按需解锁其 Bitcoin。

    <StakerPk> OP_CHECKSIGVERIFY
    <CovenantPk1> OP_CHECKSIG <CovenantPk2> OP_CHECKSIGADD ... <CovenantPkN> OP_CHECKSIGADD
    <CovenantThreshold> OP_NUMEQUAL

    字段

    • StakerPK 是 BTC 质押者的公钥。
    • CovenantPk1..CovenantPkN 是按字典顺序排序的 Covenant 委员会公钥,如 Babylon Genesis 参数中所定义。
    • CovenantThreshold 是一个 Babylon 参数,指定需要多少个 Covenant 委员会成员签名。它在 Babylon Genesis 参数中定义。

    此路径通过要求 Covenant 委员会法定人数的签名,防止在没有符合协议的 Unbonding 情况下立即提现。

  3. Slashing 路径: 此路径用于在质押委托给的 Finality Provider 被证明发生双重签名时,罚没质押资金。

    <StakerPk> OP_CHECKSIGVERIFY
    <FinalityProviderPk> OP_CHECKSIGVERIFY
    <CovenantPk1> OP_CHECKSIG <CovenantPk2> OP_CHECKSIGADD ... <CovenantPkN> OP_CHECKSIGADD
    <CovenantThreshold> OP_NUMEQUAL

    字段

    • StakerPK 是 BTC 质押者的公钥。
    • FinalityProviderPk 是质押委托给的 Finality Provider 的公钥。

      ⚡ 目前,仅支持单个 Finality Provider。一旦启用多重质押,脚本将被修改以容纳更多 Finality Provider。

    • CovenantPk1..CovenantPkN 是按字典顺序排序的 Covenant 委员会公钥,如 Babylon Genesis 参数中所定义。
    • CovenantThreshold 是一个 Babylon 参数,指定需要多少个 Covenant 委员会成员签名。它在 Babylon Genesis 参数中定义。

    此路径只能在 BTC 质押者、Finality Provider 和 Covenant 委员会的协作下执行。质押者需要提交一份花费 Slashing 路径的预签名,以便其质押被接受。需要 Covenant 签名是为了防止不符合协议的提现。有关注册质押程序的更多详细信息,请参阅 注册 Bitcoin 质押文档

⚡ Unbonding 路径和 Slashing 路径之间的关键区别

主要区别在于 Slashing 路径中存在 <FinalityProviderPk>,这具有以下影响:

  • 为了使质押请求生效,BTC 质押者必须在质押请求中包含一个有效的(未签名的)Unbonding 交易。只有当 Babylon Genesis 链收到由 Covenant 委员会签署的 CovenantThreshold 个签名时,它才会生效。由于 Unbonding 路径不包括 <FinalityProviderPk>,质押者可以随时退出,而无需 Finality Provider 的同意。
  • 相比之下,Slashing 路径确实包含 <FinalityProviderPk>,并且需要质押者和 Covenant 模拟委员会的 CovenantThreshold 共同预签署的 Slashing 交易才能生效。这确保了需要 Finality Provider 的配合来防止罚没,但执行罚没时不需要其配合。如果 Finality Provider 行为不当,其密钥将被暴露,并可用于执行罚没。

3.2. Unbonding 输出

Unbonding 输出是一个只能通过脚本花费路径进行花费的 Taproot 输出。关键花费路径通过使用“Nothing Up My Sleeve”(NUMS)点作为内部密钥而被禁用。使用的 NUMS 点是 BIP341 中定义的:

H = lift_x(0x50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0)

该点是通过对 secp256k1 基点 G 的标准未压缩编码作为 X 坐标进行哈希处理而得出的。

Unbonding 输出可以通过以下两条脚本路径之一进行花费:

  1. 时间锁路径: 此路径将质押者的 Bitcoin 锁定预定数量的 Bitcoin 区块。
    <StakerPK> OP_CHECKSIGVERIFY  <TimelockBlocks> OP_CHECKSEQUENCEVERIFY

    字段

    • <StakerPK> 是 BTC 质押者的公钥。
    • <TimelockBlocks> 定义了 Unbonding 时间。它必须等于 Babylon Genesis 参数中为 Unbonding 定义的值。
  2. Slashing 路径: 此路径用于在质押处于 Unbonding 期间,当质押委托给的 Finality Provider 被证明发生双重签名时,罚没质押资金。
    <StakerPk> OP_CHECKSIGVERIFY
    <FinalityProviderPk> OP_CHECKSIGVERIFY
    <CovenantPk1> OP_CHECKSIG <CovenantPk2> OP_CHECKSIGADD ... <CovenantPkN> OP_CHECKSIGADD
    <CovenantThreshold> OP_NUMEQUAL

    字段

    • StakerPK 是 BTC 质押者的公钥。
    • FinalityProviderPk 是质押委托给的 Finality Provider 的公钥。

      ⚡ 目前,仅支持单个 Finality Provider。一旦启用多重质押,脚本将被修改以容纳更多 Finality Provider。

    • CovenantPk1..CovenantPkN 是按字典顺序排序的 Covenant 委员会公钥,如 Babylon Genesis 参数中所定义。
    • CovenantThreshold 是一个 Babylon 参数,指定需要多少个 Covenant 委员会成员签名。它在 Babylon Genesis 参数中定义。

⚡ Unbonding 输出中的 Slashing 路径

Unbonding 输出中 Slashing 路径的存在确保了在 Unbonding 期间,如果 BTC 质押者委托的 Finality Provider 发生双重签名,该质押者仍可能被罚没。

3.3. Slashing 退款输出

Slashing 退款输出在发生罚没的情况下,将质押资金的非罚没部分退还给质押者。它是一个提交到以下时间锁脚本的输出:

<StakerPK> OP_CHECKSIGVERIFY  <TimelockBlocks> OP_CHECKSEQUENCEVERIFY`

字段

  • <StakerPK> 是 BTC 质押者公钥。
  • <TimelockBlocks> 定义了资金在可访问之前保持锁定状态的时间。设置此时间锁是为了确保 Slashing 路径不会被恶意用于比 Unbonding 时间更快地检索剩余资金。它必须等于 Babylon Genesis 参数中定义的 Unbonding 时间值。
  • 原文链接: github.com/babylonlabs-i...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
babylonlabs-io
babylonlabs-io
江湖只有他的大名,没有他的介绍。