修复负债证明协议中的隐私漏洞

摘要:我们研究了加密货币领域的资产证明和负债证明计划的状态,在这些系统中,交易所公布了一份用户余额的列表,这些余额加起来就是交易所的总负债。然后,用户能够验证他们的余额是否包括在列表中,以作为证明交易所拥有偿付能力的保证。我们看了 Coinfloor 令人印象深刻的系统,其中包括每月的证明。然而,我们讨论了该领域大型交易所的低采用率,这可能部分是由与此类协议相关的隐私问题所驱动的,这可能会揭示不利于用户利益的信息,如账户余额和这些余额如何随时间变化。我们提出了一个新的负债证明方案,它缓解了许多相关隐私问题。关键的创新之处在于,用户账户余额在负债清单中被分成多块,分割的比例由随机数生成器决定,因此关于参与平台上账户余额分布的信息将不再被泄露。

概览

在传统金融中,潜在客户在评估接受存款的金融机构的偿付能力时可用的工具之一是第三方审计。同样的程序,第三方审计和财务报表的公布,当然也可以在加密货币领域发生。然而,还有其他更强大的工具可用,最有名的是负债证明和储备金证明。结合起来,这两个证明可以成为偿付能力的证明,至少对于一个特定的代币来说是这样。

储备金证明 > 负债证明 ⇒ 偿付能力

在加密货币领域,非托管交易所或去中心化交易所正变得越来越流行,在这个没有托管风险的领域,假设没有关键的错误,偿付能力通常不是问题。然而,中心化托管交易所仍然很受欢迎,因为它们比非托管系统有几个优势,如更低的延迟,更高的容量,以及在执行前维护委托隐私方面等卓越特性。

在这份报告中,BitMEX Research 与 BitMEX 钱包团队合作,提出了新的负债证明提案。我们的方案建立在 Greg Maxwell 的负债证明方案的基础上,该方案涉及构建 Merkle 树,每个叶子代表用户的余额,通过向树构建添加新机制来改善用户隐私。

资产证明

在加密货币领域,实施资产证明系统比负债证明系统更简单。对于资产证明,中心化平台需要做的是定期公布交易所声称控制的所有比特币地址的完整列表。然后,任何第三方都可以拿着这个列表,在特定的区块高度上把与区块链上这些地址相关的所有比特币加起来。因此,从本质上讲,证明一个交易所的加密货币资产所需要的只是公布一个地址列表。在此基础上的改进是公布或披露这些地址是如何从一组公钥中衍生出来的,例如为交易所控制下的每个地址兑换脚本或衍生路径。

上述系统并不完美。交易所有可能在拥有与某一特定地址相关的私钥上撒谎。然而,如果交易所展示了用所有这些密钥定期签署信息或交易的能力,那么第三方就可能对资产证明有高度的保证。例如,BitMEX 交易所就是这种情况。BitMEX 使用相同的三个公钥来生成其所有的地址,并每天进行提款。

交易所当然可以将一些资产排除在名单之外。然而,资产价值证明可以被认为是一个交易所控制下的资产的最低价值,只要资产大于负债,就可以认为该交易所具有偿付能力。

负债证明

与资产证明相比,负债证明是一个更具挑战性的概念。交易所可以像资产证明一样,公布某个特定时间点的所有负债清单。这个列表理论上可以包括账户余额和每个债权人的名字(下面会详细说明为什么出于隐私原因这并不可行)。然而,交易所总是可以从清单中排除某些负债,从而使公司看起来有偿付能力,而实际上它处于无偿付能力的状态。为了缓解这个问题,有一种想法是,每个债权人都可以通过公开的负债清单来查看他们是否被包括在内。如果任何一个债权人声称他们不在名单上,公众就有可能认为该交易所是欺诈性的。当然还有一个问题,那就是并非所有的债权人都会查看该名单。然而,这个系统可能是相当强大的,在这个意义上,与完全不进行这一过程的平台相比,用户可以对执行这一过程的交易所的偿付能力有更大的信心。

上述方法显然对用户隐私特别不利,因为公众会知道每个用户的姓名和账户余额历史。在这篇论文发表之前,有两种方法可以相互配合使用,以改善用户隐私。这两个想法最初是由 Greg Maxwell 在 2014 年左右描述的。

  1. 混淆公布的余额和用户身份之间的联系 - 用户的账户名称可以从列表中排除;相反,列表中可以包含一个用户名称/电子邮件的哈希值,并为每个用户分配一个 nonce。这样一来,单个用户可以确保他们被包括在列表中,而他们的名字不会被透露给公众。
  2. 局部公布用户余额 - 完整的负债清单没有被公布,相反,负债都被安排成 Merkle 树结构中的叶子,交易所的总负债在 Merkle 树的顶端,Merkle 树顶端的哈希值被公布。然后,每个用户都会被显示出从他们的账户余额到 Merkle 树的根部所需的最小信息。因此,每个用户可以有高度的信心,他们的余额包括在总数中,同时只了解其他用户的最小细节。

我们在下面提供了一个简单的 Merkle 树作为例子,一个只有四个账户的交易所。如果您是 001 号账户的持有人,那么只需要红色区域内的信息,以确保您的 200 聪(satoshi)的余额被包括在 1400 聪的交易所负债余额中。

图 1 – 负债证明的例子

只向不同的账户持有人披露树的不同部分的做法可能不是特别有力。例如,第三方,如媒体组织或监管机构,在负债方面几乎得不到保证。除此之外,如果有足够多的账户持有人公布他们所知道的树的部分(例如可能是一个拥有多个账户的实体试图了解树的结构),那么无论如何树的细节可能逐渐进入公共领域。同时,如果有足够的隐私技术被用来混淆树叶和个人债权人之间的联系,那么不向公众披露完整的树可能会带来有限的隐私利益。因此,在我们看来,交易所公布整棵树可能是必要和有效的。有人可能会说,这使得 Merkle 树结构毫无意义,交易所应该使用列表方式,然而,如果交易所希望在某个时候停止公布完整的列表,采用树状结构提供了灵活性。

负债证明的现状

据我们所知,位于英国的现货比特币交易所 Coinfloor 是唯一一个公布完整的偿付能力证明的交易所。Coinfloor 每个月都会公布一份完整的资产证明和负债证明。该交易所在一个有两列的表格中公布了所有用户账户余额的简单列表。第一列是分配给每个用户的随机字符串的哈希值,与时间戳的变位形式共轭。第二列是以聪为单位的用户余额。在 Coinfloor 做完这个过程后,他们会从负债证明表中提取一个哈希值,并在比特币交易的 OP_Return 字段中加入这个哈希值,这个哈希值花费的比特币数量要比负债中包含的多。因此,这就像一个资产证明方案,证明了 Coinfloor 的偿付能力。人们可以在这里看到这样一个比特币交易的例子。

Kraken 是另一个试验过负债证明协议的交易所。然而,据我们所知,他们所开发的方案目前并不活跃。人们也可以阅读 Nic Carter 最近的一篇文章,其中包括对各种加密货币交易所采用储备证明方案的总结。在我们看来,Coinfloor 拥有目前部署的最强大的系统。

隐私问题

Coinfloor 系统看起来相当强大,可能提供了一个人们所希望的关于 Coinfloor 平台的偿付能力的良好保证。它并不完美,至少从用户隐私的角度来看。Coinfloor 也有潜在的商业考虑。该公司每月都会公布其所有客户账户余额的确切分布。正如下面的图 2 和图 3 所示,行业分析师或竞争对手可以获得有关 Coinfloor 客户的有用信息,并可能以不利于 Coinfloor 利益的方式使用这些信息。

图 2 – Coinfloor 用户账户按账户余额分布情况(2021 年 4 月)

来源: Coinfloor,BitMEX Research

图 3 – Coinfloor 比特币托管的账户余额(2021 年 4 月)

来源: Coinfloor,BitMEX Research

分析师也可以利用这些信息来推断出更多关于 Coinfloor 个人客户的细节。例如,公众可以看到所有的账户余额,如果账户余额没有变化(例如休眠账户),就有可能将这些账户联系在一起。例如,Coinfloor 在 2021 年 4 月的偿付能力报告中包括一个余额为 49,456,707 聪的账户。2021 年 3 月的偿付能力报告也包含一个余额为 49,456,707 聪的账户。因此,人们可以合理地相信,在 Coinfloor 存在一个余额为 49,456,707 聪的账户,该账户至少有一个月没有使用。

Coinfloor 系统看起来很强大,很有效,Coinfloor 在这方面的行为应该受到赞扬,我们在这里指出的弱点是相当小的。在现实中,很可能 Coinfloor 的管理层并不特别关注他们所透露的潜在的商业敏感信息,而且 Coinfloor 的用户也不特别在意这个。然而,如果像 Binance、Coinbase 或 FTX 这样的大型交易所进行这一过程,不难想象,加密货币对冲基金和行业分析师每月都会仔细研究这些数据,做出对交易所或其存款客户并不总是特别有帮助的推断。在我们看来,这些隐私问题正在阻止主要交易所采用此类负债证明方案。

隐私问题的拟议解决方案

BitMEX 钱包团队和研究团队已经开发了一个方案来缓解上述的一些担忧。其核心思想是,个人账户余额被随机分割到多个叶子中。每个用户的余额至少被分割一次,因此至少进入两个叶子。在每个快照点,也许是每个月,为每个用户生成一个 0 到 1 之间的随机实数。然后,用户的余额根据这个分数被分割,例如,如果一个用户的余额是 200 聪,而数字 0.400 被选中,余额将被分割成两块,第一块是 80 聪,第二块是 120 聪。这种分割策略发生在列表中,直到达到足够的填充量,导致每个用户的余额有两个或多个分割。为了验证你的余额,你需要在树的多片叶子(或列表中的多个条目)中找到它,然后将它们相加,以检查它是否与你的预期账户总余额相符。新建议方案的主要细节总结如下。

为每个用户生成一个随机的账户 nonce,并向每个用户披露。这个账户的 nonce在账户的整个生命周期内是静态的。用户应保持其私密性以确保其账户余额的隐私。

账户 nonce 的示例: 8h9n09il7sdftg74r1

除了账户 nonce,还有一个子 nonce,它根据比特币区块的高度而变化。这与Coinfloor 的 SHA1 哈希值的工作方式类似,它有一个时间戳作为哈希函数的输入,因此在每个负债证明快照中都会改变。

子 nonce = Sha256 (账户 nonce, 比特币区块高度)
子 nonce 示例:sha256(8h9n09il7sdftg74r1,680359)=3d70334e74430e0dc4b4e4c8a4152a604a6183428247cf151daa991eb89e9a41

然后还有一个哈希值要计算,这个哈希值将包括在 Merkle 树中,可以向公众披露。

Hash(账户 ID, 子 nonce, 以聪为单位的叶子余额, 叶子的坐标)
sha256(001,3d70334e74430e0dc4b4e4c8a4152a604a6183428247cf151daa991eb89e9a41,80,2)=4bf681c36300cbf94cbcd0456ede75826ed90c51497821fd732adba76b22fe51

图 4 说明了可以用这个方案和这个例子发布的 Merkle 树。每张快照的叶子的位置都会被洗牌。树上的每片叶子都以纯文本显示负债余额,加起来就是树顶的总负债。同时,每片叶子的哈希值与相邻的叶子共轭并再次哈希,以便在树上移动。每个哈希都包括哈希值和下面分支的余额作为输入。

图 4 - 具有改进的隐私特征的负债证明方案的例子

图 4 中的账户余额与图 1 相同,只是每个账户被分成了两个叶子,叶子的位置也会被洗牌。例如,001 号账户被分成两个叶子,叶子索引二的余额为 80 聪,叶子索引四的余额为 120 聪。这两片叶子加起来的总余额为 200 聪,这在图 1 中是可见的。子节点由交易所提供给账户持有人 001。客户端现在可以在两个叶子中看到他们的账户余额,通过在整个树的底部搜索,寻找交叉的地方。

混洗和拆分这两种隐私技术的综合影响,确保交易所和用户的许多隐私特性得到保留。不再可能看到所有账户余额的分布,也不可能跟踪任何用户在一段时间内的余额。

下面的假想图,图 5,显示了 BitMEX 交易所在登录平台时向用户透露的必要信息。

图 5 - BitMEX 交易所平台向用户披露必要的负债证明信息的图示

如何开展新的负债证明程序

假设交易所公布了完整的 Merkle 树,用户可以通过以下方式验证他们的负债是否包括在总数中。

  1. 通过互联网下载整个 Merkle 树,这可能是几百兆的数据。
  2. 下载一个提供的软件包,可以扫描整个 Merkle 树的叶子
  3. 登录平台后,从交易所获得用户账户 ID 和最新的子 nonce
  4. 本地的,已安装的软件将扫描 Merkle 树的所有叶子,执行哈希函数并寻找每个叶子中的交叉点。哈希函数的输入是提供账户 ID 和子 nonce,以及叶子索引和余额。叶子索引和余额可以从树本身推断出来,叶子索引是由树中的位置知道的,余额已经在每个叶子中以纯文本提供。
  5. 一旦所有的交叉都被识别,用户就会被告知哪些叶子包含他们的余额。这些可以被总结出来,以确保它们与用户的预期和他们在快照点的账户余额相匹配。然后,用户可以合理地确定他们的余额被包括在负债清单中。

Merkle 树中的字段摘要

下表包括所有的字段,这些字段是对哈希的输入,输出的字符串显示在 Merkle 树的叶子里。该表解释了为什么有必要包括每个字段。

项目为什么是必要的?
子 nounce子 nonce 是必要的,因为它使用户能够向公众或第三方透露信息,以证明他们的余额包含在一个特定的快照中,而不透露整个账户余额历史(和未来的余额)。账户的 nonce 可以保密。
叶子索引叶子索引(Leaf Index) 是一个必要的字段,因为它可以防止同一Merkle 树中的叶子之间发生交叉。这种交叉会证明这两个叶子属于同一个账户持有人(因为子节点会匹配),因此有可能向公众透露过多关于用户余额的信息。
余额包括余额是必要的,以确保哈希值被加起来,这些值在树上流动。这使得个人能够相互比较根部哈希值,只要哈希值匹配,他们就知道他们有相同的 Merkle 树,保证了相同的余额。

四种类型的保证

使用这些负债证明方案,基本上有四种类型的保证,利益相关者可以用来评估交易所。

  1. 检查 Merkle 树和负债清单,以确保它与总负债余额相加,并且这一数额低于储备金。
  2. 核实自己的余额是否包括在公共负债清单中
  3. 验证其他用户的余额是否包括在负债清单中,方法是直接从其他用户那里获得子 nonce 和账户 ID,或者如果他们选择向公众提供这些信息的话。
  4. 观察一下,没有其他信誉良好的账户持有人声称他们的负债不在负债清单中(一个敌对的实体总是可以声称这一点,我们不确定有一个完美的方法来防止这一点。

总结

我们描述了一个新的负债证明提案,它将用户余额分成多个块,并将这些块作为 Merkle 树的叶子随机洗牌。该建议包括其他字段以防止交叉,以及一个每次快照都会改变的 nonce。当这些创新结合在一起时,允许用户对交易所的偿付能力有更高程度的信心,而没有任何重大的隐私泄漏。这个新方案的缺点是复杂,但是采用这个方案的交易所应该承担复杂的负担,应该有可能提供一套工具,让用户以合理的低程度的努力自己进行这个过程。

迄今为止,偿付能力证明计划的采用率一直很低。这种低采用率似乎是由缺乏消费者需求和潜在的隐私问题所驱动。我们认为该建议主要解决了与后者相关的问题。至于前者,这可能仍然是一个问题。