如果区块链也能保密会怎样?

特约作者 Mr. Haysberg 解释 Midnight 如何利用零知识证明在不泄露私密数据的情况下验证交易。

By SongMarketCap

Midnight News - 如果区块链也能保密会怎样?

想象一下你的银行账户是这样的:你曾经进行的每一笔支付、收到的每一笔工资、每一次结余,都对任何接入互联网的人可见。

你的邻居。你的老板。想抢劫你的陌生人。

这正是当今大多数区块链的运作方式。

11月4日,@MidnightNtwrk 发了一句我觉得点明方向的话:你不必再在公开与私密之间二选一了。还有第三种选择。

这篇文章用通俗的话解释这种选择。你是加密新手也能看懂。你在构建应用的话,每一节里也都有更深入的一层供你参考。

问题:两个糟糕的选择

多年里,区块链只给了你两种选择。

  • 公共链:任何人都能检查一切是否公平。对建立信任很有利。但你的整段金融生活将被永久公开展示。

  • 私有系统:你的数据被隐藏。但你就必须信任系统的运营方,而且丢失了最初让区块链有用的开放性。

选开放还是选隐私。这就是过去的取舍。

第三种选择

Midnight 将问题一分为二。

网络本身保持公开。任何人都可以验证,其代币 NIGHT 也保持公开。你的个人数据留在你的设备上,永远不会被发布到链上。

链上接收的不是你的数据,而是一份证明:一小段数学证明,在不展示内部内容的情况下表明“规则已被遵守”。

应用决定可以向谁、透露哪些内容。银行、审计方、合作伙伴。只提供所需的信息。

一个简单的比喻:在门口给保安证明你已年满18岁,但不透露你的姓名、住址或准确生日。

对进阶读者:这份证明是零知识证明。共识与 NIGHT 运行在公共账本上,而应用状态可以拆分为公共与私密两部分,只有关于私密部分的证明会触达链上。

Elegantna autorska kartica za Midnight News

Compact:背后的语言

要构建这样的应用,开发者需要一种方式来标注“这一部分是公开的,那一部分是私密的”。在 Midnight 上,这个工具是一种名为 Compact 的编程语言。我在 Private by Default Ep. 4 中做过深入介绍。

对所有人来说,重要的是:

  • 它看起来很像 TypeScript,这是全球最流行的语言之一,因此开发者不必从零开始。

  • 你不需要是密码学家。你只需标注哪些是私密哪些是公开,工具会处理繁重的数学。

  • 它是开源的,任何人都可以审查。

对进阶读者:Compact 具有强且静态的类型系统并有界,因此合约不会无限循环。公开版本位于 github.com/midnightntwrk/compact。

Midnight 应用如何运作:餐厅类比

每个 Compact 合约有三部分。最容易的比喻是餐厅。

  • 橱窗(ledger)。街上每个人都能看到的东西。公开信息,存储在链上。

  • 秘方(witnesses)。锁在厨房里。留在你设备上的私密信息。

  • 厨房规则(circuits)。把原料变成菜肴的流程。在 Midnight 中,这些规则会变成证明,因此顾客无需看到配方也能相信菜是按规矩做的。

Midnight 自家的开发者一句话概括:逻辑是公开的,数据是私密的,结果可供任何人验证。

默认即私密

这是我最喜欢的部分。在 Compact 中,除非你另行选择,否则一切默认为私密。

如果开发者想让某条信息公开,必须有意明确声明。如果忘了,程序将拒绝编译并指出会泄露数据的确切位置。

对进阶读者:这是通过 disclose() 完成的。任何来自 witness 或电路参数的值,如果要流入公共账本状态、作为导出电路的返回值、或传递给其他合约,都必须用 disclose() 包裹,否则编译器会拒绝。Midnight 的文档打趣地称之为 Witness Protection Program。

隐私就像安全带。公开是一个有意识的选择。

为什么隐私其实就是安全

11月5日,Midnight Foundation 的 CTO Sebastien Guillemot(@SebastienGllmt)发表了一篇博客,核心观点很明确:在区块链上,隐私不是奢侈品。它就是安全。

想想完全公开的链会把什么交到犯罪分子手里:

  • 最富有的钱包清单。

  • 他们想要针对的任何人的完整历史。

  • 发动钓鱼信息的线索,因为他们知道你做过什么,那些信息看起来会更像真的。

如果没人看得到你的余额,没人能因此把你当目标。

Midnight 如何隐藏你的钱

你也许会想:把余额打乱就行了。并不那么简单。如果每次都用同样的方法打乱数字 1000,攻击者可以预先把常见数字都打乱一遍,然后直接比对。

所以 Midnight 采用了更聪明的方法。

你的资金被拆分为多张独立的票据,像钱包里的纸币,而不是一个总额。每张票据都会和其金额、代币类型、所有者的密钥以及一个巨大的随机秘密一起被封装。这个封装叫作 note commitment。

对旁观者而言,每个封装都像随机噪声。面值 1 个代币的票据和面值一百万的票据看起来一样。

对进阶读者:该承诺是对数值、代币类型、所有者密钥以及一个大的随机 nonce 的哈希,因此相同面值会产生许多唯一的承诺,预计算攻击会失败。

[NEWSBREAK]

在不暴露任何信息的情况下花费

如果一切都被隐藏,网络如何阻止某人一钱多花?有两种工具:

  • 所有权证明。你在花费时证明自己拥有一张有效票据,但不透露是哪一张、里面有多少、你是谁。

  • 一次性标记,称为 nullifier。每张票据都有一个。你花费时,这个标记会被公布。网络检查它此前从未被使用过,这样同一张票据就无法被花两次。而且没人能把这个标记追溯到原始票据。

想象音乐节的腕带在入口被打孔。工作人员知道它被用过,但不知道你是谁。

Viewing keys:有用但要妥善保管

Midnight 也有 viewing keys。

viewing key 允许你查看流入的资金。它不会显示你的支出或总余额,也无法动用你的资金。

但仍应像密码一样对待,只与信任的应用共享。

精简版

  • 一个人人可验证的公共网络。

  • 你的数据留在你自己手中。

  • 链上看到的是封装、证明和标记,而不是你的余额或历史。

  • 开发者精确决定公私界线,工具会阻止他们意外泄露。

既非公开,也非私密。这是第三种选择。

特约作者 · Mr. Haysberg(Vision & Vibe,@visionandvibehq)

收听:Private by Default Ep. 4,关于 Compact

在 YouTube 上观看