为 CoinJoin 交易获取 Commitment

本文介绍了在使用 Joinmarket 进行 coinjoin 交易时,如何通过 commitment 机制来增强隐私性。Commitment 是一个哈希值,用于防止窥探,每次 coinjoin 请求都需要提供。文章还提供了关于如何正确生成和管理 commitment,以及在遇到问题时如何解决的实用指南,包括使用多个 UTXO、使用外部 commitment 和解读 debug 文件。

用于 Join 的 Commitment

为了缩短阅读时间,该做什么和不该做什么都用粗体表示,以便你可以集中精力。

发起 coinjoin 的 Commitment

为了减少被监视的可能性,我们现在要求每个 coinjoin 请求都附带一个“commitment”,这是一个基于离散对数等价证明 PoDLE 思想的哈希值。

当然,血腥的加密细节并不重要,重要的是对于你拥有的每个 utxo,如果 (a) 至少有 5 个区块那么旧,并且 (b) 包含至少为交易大小的 20% 的金额(“20%”由 joinmarket.cfg 中的 taker_utxo_amtpercent 控制 - 不要更改此项),你将被允许尝试 3 次(“3”由 joinmarket.cfg 中的 taker_utxo_retries 控制 - 不要更改此项)进行交易。 一旦你尝试了 3 次,你必须使用不同的 utxo(有些 Makers 可能会选择更宽松,但这将是通常的要求)。

Commitment utxo 的来源

通常它们将来自你的 spending mixdepth,这将不需要任何干预。 本页的主要目的是 (a) 尽可能地实现这一点,以及 (b) 告诉你如果出现问题该怎么办。

至少等待 5 个确认

如果年龄小于默认的 5 个确认,Commitment 将不会被接受,所以对于一个全新的钱包,在作为用户/taker 开始之前,至少等待 5 个区块

用多个 utxo 资助你的钱包。

为了提供帮助,当你资助你的 Joinmarket 钱包时(作为 Taker,即使用 sendpaymenttumbler 的交易发起者;对于 Maker 这并不重要),建议将币发送到多个(例如 3 个)地址。 在像 Bitcoin Core 或 Electrum 这样的钱包中(或者我假设还有很多其他的),这可以使用 sendtomanypaytomany 功能在 GUI 中完成; 你只需输入多个地址(可能每个地址支付相同的金额)。 如果你正在使用 Joinmarket sendpayment,你将需要在一个 mixdepth 的一个外部分支中选择几个接收地址。 不要对不同的 mixdepth 执行 sendtomany,因为这会将这些 mixdepth 链接在一起,这是 Joinmarket 避免的一个核心问题。 另外,不要将多个输出发送到同一地址——使用不同的地址。

举例来说,如果你发送到 3 个地址而不是 1 个地址,你将有 9 个 commiments 可用——实际上是 9 次尝试进行第一次交易,而不是将币发送到一个地址的 3 次尝试。

但是,不要将要花费的金额拆分为超过 5 份——因为 utxo 必须至少占总支付金额的 20%,所以在这种情况下,你可能会发现自己无法找到 commitment 的来源。 3 个等额大小的金额应该没问题。

在大多数情况下,这已经足够了。

寻找外部 Commitment

在你没有足够的剩余有效 commitment 的 utxo,或者你不准备等待 5 个区块的情况下,有可用的替代方案。 如果你进入 scripts 目录,你会发现一个工具 add-utxo.py。 运行 python add-utxo.py --help 以查看解释。 简而言之,你可以:

  • 从非 JM 钱包(如 Electrum 或 Core)一次添加一个外部 utxo,或从准备好的文件中添加 (-r)。
  • 从 Joinmarket 钱包中添加外部 utxo (-w)。
  • 删除现有的外部 utxo (-d)
  • 验证 utxo (-v, -o)

请注意,你添加的任何 utxo 都必须具有与当前钱包的 scriptPubKey 相同的类型(目前是 nested 或 native segwit)。 这也对应于你与之交互的订单簿的类型。

另请注意,“添加 utxo”并意味着花费它! 它只是意味着添加一个哈希值 commitment 和公钥,基本上。 任何比特币 utxo 都可以用作有效的 3 次使用Token,而无需花费它。

请注意,Makers 只有在 你的使用成功时(他们接受它并返回他们的 utxo 作为响应)才会看到此 utxo,这是如果你担心他们获得该知识,则不要使用这种“寻找外部”方法的原因。 此外,如果你从另一个非 JM 钱包中获取 utxo,你必须以 WIF 压缩格式将其私钥传递给脚本(它不能在钱包中签名,因为这不是标准的比特币 ECDSA 签名),以便创建 commitment- 在这里适用关于处理私钥的通常的强烈警告,因此 非常 小心地使用这种方法。

Commitment 存储,以及如果出现问题该怎么办。

你已经使用的 commitment(只是哈希值)存储在文件 ~/.joinmarket/cmtdata/commitments.jsonused 部分中 - 不要删除此文件。 尽管你不需要读取此文件,但它代表了你对已使用的 commitment 的记忆,因此如果你丢失了该记录,你的 Taker 脚本会发现自己花费大量时间重试 Joinmarket“网络”已知的已使用的 commitment,因此将被拒绝。 这只是一个不便之处,但可能会非常烦人。 你根据前一节寻找的任何外部 commitment 也将添加到此处,并在用完后自动删除。 你可以使用前面提到的 scripts/add-utxo.py 脚本添加/删除 external 部分的内容(有关选项的简要概述,请参阅上一节)。

如果在 sendpayment.py 的运行中无法找到 commitment 的来源(在 tumbler 中它只是等待),无论是在 spending mixdepth 中,还是如上所述的外部,都会创建一个文件 commitments_debug.txt,它将准确显示已尝试了哪些 utxo 以及它们失败的原因 - 并根据每个 utxo 的状态提供简要说明。 本页末尾显示了一个示例文件。

其他小工具

添加了 wallet-tool.py 的一个额外方法:showutxos——这将漂亮地打印任何 Joinmarket 钱包中所有可用的 utxo。 这仅对 Maker 和 Taker 都运行并希望考虑将 utxo 从一个 mixdepth/钱包转移到另一个的人有用(使用 scripts/add-utxo.py-w 选项)。

类似地,sendtomany 函数在 cd scripts; python sendtomany.py --help 中可用; 阅读帮助以获取详细信息,但它与其听起来一样简单,专门为你要指定的每个目标地址创建大小相等的输出; 它需要一个 utxo 及其私钥作为输入。 在广播之前会提示你,因此你可以检查其有效性。

commitments_debug.txt 示例:

THIS IS A TEMPORARY FILE FOR DEBUGGING; IT CAN BE SAFELY DELETED ANY TIME.
***
1: Utxos that passed age and size limits, but have been used too many times (see taker_utxo_retries in the config):
dba822a36ad524b775af63db4e25b3558c75ac90d8566a74b2d08b9f63adff97:1
cde0608bf5426c7ed705d87553718e8c74fa75b9428f14e0759f9e95b03d25f2:1
2: Utxos that have less than 5 confirmations:
None
3: Utxos that were not at least 20% of the size of the coinjoin amount 499948833
8ddaee775825a6f89f48e17b47177d3858044cdc633ced09c7c84cc75f609522:0
***
Utxos that appeared in item 1 cannot be used again.
Utxos only in item 2 can be used by waiting for more confirmations, (set by the value of taker_utxo_age).
Utxos only in item 3 are not big enough for this coinjoin transaction, set by the value of taker_utxo_amtpercent.
If you cannot source a utxo from your spending mixdepth according to these rules, use the tool add-utxo.py to source a utxo from another mixdepth or a utxo external to your joinmarket wallet. Read the help with 'python add-utxo.py --help'

***
For reference, here are the utxos in your wallet:

mixdepth 1:
    dba822a36ad524b775af63db4e25b3558c75ac90d8566a74b2d08b9f63adff97:1 - path: m/84'/1'/1'/1/1, address: bcrt1qwdf43llnn8t7h38vxsqswadyelh4trz3ne6syu, value: 200000000
    cde0608bf5426c7ed705d87553718e8c74fa75b9428f14e0759f9e95b03d25f2:1 - path: m/84'/1'/1'/1/0, address: bcrt1ql6akvae73rf433d7ga0muqcrh4y0nuxer5zczd, value: 200000000
    8ddaee775825a6f89f48e17b47177d3858044cdc633ced09c7c84cc75f609522:0 - path: m/84'/1'/1'/1/3, address: bcrt1ql0z4wcjapmrkehgtcjc8c0gvv59hls30h0qhwq, value: 99988990
mixdepth 0:
    57fcec6f770e3b2ac35e9cb17b1ee88ae5b0dc84b941f7418b04a4edecc46d7f:1 - path: m/84'/1'/0'/1/0, address: bcrt1qctllzvz5jcyfa08q0psfyx6p2luss8llldh06u, value: 200000000
    8ddaee775825a6f89f48e17b47177d3858044cdc633ced09c7c84cc75f609522:4 - path: m/84'/1'/0'/0/4, address: bcrt1qv5utq4crzwpq4gw3mvfmaw7q63ukpjf3098f6k, value: 100000000
  • 原文链接: github.com/JoinMarket-Or...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

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