# 谨慎日志合约的链下票务

By [BitSafe中文](https://paragraph.com/@bitsafe) · 2024-02-04

---

原文链接:

[https://conduition.io/scriptless/ticketed-dlc/](https://conduition.io/scriptless/ticketed-dlc/)

2024-01-04

我假设读者已经熟悉了一系列比特币技术。我在这里提出的协议基于以下内容：

*   [比特币闪电网络](https://lightning.network/)
    
*   [谨慎日志合约 (DLC)](https://www.dlc.wiki/)
    
*   使用MuSig等技术进行公钥聚合
    
*   [适配器签名](https://conduition.io/scriptless/adaptorsigs/)
    

**问题**

一群玩家想要一起参与一个 DLC。使用传统的 DLC，所有玩家都将把他们的买入资金存入链上的多重签名合约中，并预先签署一堆合约执行交易 (CET)，这些交易根据某些 Oracle 的结果向他们支付不同的金额并签字。一旦 Oracle 签名被发布，正确的 CET 就可以被解锁并发布，从而支付获胜者。

这对于少量玩家投注大量资金非常有效。首次公开的 DLC 演示之一是[对 2020 年美国总统选举结果的 2 人投注](https://www.coindesk.com/tech/2020/09/15/discreet-log-contracts-are-bringing-private-scriptless-smart-contracts-to-bitcoin/)。

[https://www.coindesk.com/tech/2020/09/15/discreet-log-contracts-are-bringing-private-scriptless-smart-contracts-to-bitcoin/](https://www.coindesk.com/tech/2020/09/15/discreet-log-contracts-are-bringing-private-scriptless-smart-contracts-to-bitcoin/)

如果 DLC 买入成本很小且玩家数量很大（例如彩票或公共投注池），这种方法就不太实用。随着玩家数量的增加，链上交易的成本也会增加。由于买入成本较小，玩家会按比例放弃更多资金来支付链上挖矿费用。

链上 DLC 根本无法扩展到大型多人合约。

**解决方案**

我创建了一个协议，在这个协议中，一个拥有足够自由资本的单一市场制造者可以无需信任地承担DLC的整体价值，并通过比特币闪电网络向玩家收取购买成本。如果获胜玩家合作，获胜者的奖金也可以通过闪电网络发放。最佳情况会导致发布三个链上交易，这与正常的 P2TR 交易没有区别。无论有多少玩家买入，或者最终有多少玩家支付，链上足迹都是相同的。

这个概念最初是针对可证明公平的彩票。[我在这里发表了一篇关于该用例的更详细的博客文章](https://conduition.io/scriptless/lottery/)。

[https://conduition.io/scriptless/lottery/](https://conduition.io/scriptless/lottery/)

在那篇文章的最后，我简要说明了如何将该策略推广到简单的彩票之外的任意 DLC。在这里，我将详细说明如何将此方法普遍应用于任何DLC，而不仅仅是彩票。

**概念**

假设有一组拥有公钥的玩家。

假设某个区块延迟可以合理地挖掘交易，例如 144 个区块。

DLC 的结果将由预言机签名，预言机承诺使用随机数对一组结果消息中的一个进行签名。如果消息被签名，就会解锁该点，即预言机的公钥。不失一般性，我们还可以支持多个预言机。

我们假设某个做市商拥有足够的资金来支付整个 DLC 的前期成本。玩家将通过闪电网络上的 HTLC 或 PTLC 向链外支付做市商，甚至使用原子交换技术进行跨链支付，从而购买进入 DLC 的门票。票据只是一个密钥或原像，它让玩家有机会（取决于预言机）索取做市商承诺的一些链上资本。

做市商本身可以是 DLC 的参赛者，也可以是一个独立的旁观者，寻求通过租赁链上资本为他人服务来获利。

**例子**

下面是一个有票证 DLC 的示例，其中有 3 名玩家（Alice、Bob 和 Carol）以及未参与该 DLC 的做市商。我们假设预言机签署了两个可能的消息之一，这决定了合约的结果。如果结果签署，则Alice和Bob平分Carol的奖金。如果结果被签署，那么Bob和Carol将以其他方式分享从Alice那里获得的奖金。

\*我在本例中使用 PTLC，但[如果只有 HTLC 可用，则可以使用非常相似的方法。](https://conduition.io/scriptless/ticketed-dlc/#HTLCs-instead-of-PTLCs)

![](https://storage.googleapis.com/papyrus_images/0a6dcc7f4c2b8afb2c387b827eb446ac6119fadaabe4ffa4d6cfd9d2c1fc561f.png)

1.  做市商设置（但不签名） ，将 DLC 的全部价值存入 4-of-4多重签名地址。该合约的控制权由做市商和三个参与者共享，但链上资金来源由做市商负责。
    
2.  做市商创建未签名的交易来创建 3 阶段合约。
    
    *   第一阶段从结果交易开始，并且每个可能的结果都有一个。每个人都会根据结果来控制一组特定的获胜者。
        
    *   做市商创建了两个互斥的交易：
        
        *   它将 DLC价值分成每个获胜者的单独支出。它有一个相对的时间锁.
            
        *   时间锁定后支付给做市商的唯一控制权.
            
    *   对于每个从 DLC 结果中获得金钱的玩家（“获胜者”），我们将一个输出添加。
        
    *   每个产出都会支付给获胜玩家和做市商共同拥有的 2-of-2 托管合约。
        
    *   做市商利用中的每个输出进行支出，建立两个互斥的交易：
        
        *   玩家在相对时间锁后的区块的唯一控制。
            
        *   时间锁定后支付给做市商的唯一控制权.
            
3.  做市商将这些未签名的交易发送给玩家，玩家回复部分签名。玩家对签约没有任何异议，因为玩家还没有向 DLC 投入任何资金；现阶段做市商正在用自己的资金到处玩耍。
    
4.  做市商在每个区块上创建适配器签名，并与该点（预言机的结果锁定点）锁定。
    
5.  做市商生成一组秘密门票 -每个玩家一张。每张票都有一个公共点 ，其中是 secp256k1 基点。
    
6.  做市商在每个锁定点上创建适配器签名，以便玩家需要解密门票（支付给玩家的 TX）。他还在每个潜在获奖者的门票上创建了一组适配器签名。例如，如果 Alice 和 Bob 是结果 1 的获胜者，则可以使用Alice或Bob 的票证秘密进行发布。
    
7.  做市商将所有交易的加密签名发送给玩家。
    
8.  玩家验证并确认适配器签名。
    
9.  所有玩家都通过单独的闪电发票向做市商支付少量费用。这可以防止玩家发送垃圾邮件并激励做市商。请参阅[讨论部分](https://conduition.io/scriptless/ticketed-dlc/#Discussion)以获取更多信息。
    
10.  做市商签署并发布。
    
11.  一旦被确认，每个玩家都有动力去了解加密的票证秘密。通过学习，玩家可以在链上强制执行，从支付给他们的任何 DLC 结果中领取奖金。做市商可以使用链外点时间锁定合约将每张门票秘密出售给玩家。第 9 步中的较早费用的价格可以选择性地计入票价中。
    
12.  一旦所有门票都被购买，并且结果签名由预言机发布，那么做市商有多种选择来与每个获胜玩家结算链上合同：
    

a.  （强制，链上）如果做市商不合作，获胜玩家只需等待相对锁定时间并按顺序播放它们。他们只有拥有票证秘密才能做到这一点。

b.  （单一获胜者合作，链上）如果获胜者希望在链上收到 DLC 奖金，她可以与做市商合作签署一个没有相对锁定时间的版本，并将其广播。两者甚至可以安排[CoinSwap](https://bitcoinops.org/en/topics/coinswap/) ，其中获胜者从做市商拥有的完全不相关的 UTXO 中获得支付。

c.  （单个获胜者合作，链下）每个获胜者都可以在没有锁定时间的情况下通过适配器签署结算交易，将输出退还给做市商，然后将适配器密钥出售给做市商以获得链外支付 - 有效出售做市商收回自己链上资本的权利。这样的结算 TX 将取代 ，后者被锁定直到至少得到确认。

d.  （所有获胜者合作，链下） 【最优】如果每个DLC获胜者都按照上述方式与做市商合作，他们都可以同意现在的全部产出属于做市商，因此共同签署新的交易退款所有（整个 DLC 价值）直接转给做市商，没有锁定时间。这将取代将链上足迹减少到恒定的复杂性，无论涉及多少获胜者。如果一些获胜者希望在链上接收支付，他们可以遵循相同的流程，只不过他们使用链上（或跨链）PTLC/HTLC 将其适配器秘密出售给做市商。

**讨论**

假设玩家可以从预言机中学习（谨慎日志），那么他们可以独立解密并发布，无需做市商的配合。然而，这本身对玩家来说并没有什么用处，因为做市商将在区块的相对锁定时间到期后将钱返还给自己。

如果玩家也知道他们的彩票，他们可以解密并发布，然后独立领取奖金（在结果下）。这就是门票有价值且值得购买的原因。

没有什么会强迫玩家买票。玩家可以假装感兴趣，但实际上不会购买门票。以这种方式弃权的玩家将迫使做市商承担其在 DLC 中的地位，从而产生交易对手风险。

如果做市商不愿意让自己面临任何交易对手风险，他们可以使用[HODL 发票](https://voltage.cloud/blog/lightning-network-faq/understanding-hold-invoices-on-the-lightning-network/)来接受费用和门票付款，只有在所有玩家都拥有有效的 PTLC/HTLC 门票报价时才会透露门票秘密。如果玩家支付了初始费用但没有购买彩票，那么做市商可以将这笔费用作为浪费玩家时间并无故锁定资金的补偿。

**好处**

*   DLC 参赛者之间没有链上关联。
    
*   最小的链上足迹（一个 TXO 输入，一个 TXO 退出）是可以实现的。
    
*   做市商不信任资金托管。
    
*   做市商可以通过收取费用来激励。
    
*   如果使用 PTLC，合约的幸福路径完全由主根密钥支出组成（非常适合可替代性）。
    
*   如果使用 HTLC，该协议现在可以通过 LN 执行，不需要新的 BOLT、操作码或叹息类型。
    

**用例**

*   彩票
    
*   多人游戏（轮盘赌、投注池、扑克）
    
*   众筹
    

**HTLC 代替 PTLC**

为了支持当今可用的经典闪电 HTLC，我们只需重新表述协议，使票证秘密是原像，并且 .我们不是在每个 上使用适配器签名，而是使用 HTLC 脚本或Tapscript树来阻碍相关输出，如下所示：

<market\_maker && P\_j> OR <P\_j && preimage(T\_j) && delay(delta)> OR <market\_maker && delay(2\*delta)>

< market\_maker && P\_j > 或< P\_j && 原像( T\_j ) && 延迟(delta)> 或< market\_maker && 延迟(2\*delta)>

给获奖者的链下支付同样可以轻松转换为 HTLC。

---

*Originally published on [BitSafe中文](https://paragraph.com/@bitsafe/WiNHdqoNf0ZFyttS5y5x)*
