蓝色水光 1 / 3
← 返回首页NOTES / 论文阅读
论文阅读

读 Hawk:智能合约如何兼顾正确性与隐私?

用一场密封拍卖,梳理 Hawk 的角色、协议流程、零知识证明,以及隐私保证的边界。

1.为什么智能合约需要隐私?

普通智能合约能够让互不信任的人按公开规则交易。例如,拍卖合约可以自动判断谁获胜、收取付款、退回其他人的钱。

但执行规则往往需要读取输入,而链上的数据和执行过程是公开的。如果直接把出价交给链上合约,别人就能看到出价。

换一个钱包地址也没有解决这个问题:地址可能是假名,但地址对应的金额和交易记录仍然公开。

所以这里有两个不同要求:

  • 正确性:不能改规则、偷钱、算错结果。
  • 隐私性:不能让公众看到出价、交易金额等敏感信息。

Hawk 想把这两个要求结合起来,同时让程序员不必自己实现整套密码学协议。

2.用一场拍卖理解它

论文的主要例子是“密封的第二价格拍卖”:

每个人秘密提交出价,出价最高的人获胜,但只支付第二高的价格。

假设三个人分别出价:

参与者出价并冻结的资金最终分配
Alice10收回 3,获得拍卖品对应的获胜资格
Bob7收回 7
Carol4收回 4
卖家—收到 7

Alice 出价最高,但支付的是 Bob 的出价 7。

资金守恒:

10+7+4=3+7+4+7=2110+7+4=3+7+4+7=21

这里需要保证三件事:

  1. 别人不能先偷看 Alice 的出价,再调整自己的出价。
  2. manager 不能把 Bob 改成获胜者,或把付款金额改掉。
  3. manager 中途退出时,资金不能一直被锁住。

Hawk 的整个协议,就是围绕这三类问题设计的。

3.谁负责什么?

Hawk 有三类角色:

角色主要职责能看到什么
参与者提交输入、冻结资金、领取结算资金自己的秘密,以及协议允许获知的结果
manager读取私密输入、计算结果、生成证明参与者的私密输入
区块链验证证明、维护资金状态、执行超时规则承诺、密文、证明及公开信息

论文把合约分成两部分:

  • 私密部分 ϕpriv\phi_{\text{priv}}:读取私密数据和资金,计算钱怎么分。例如确定获胜者和支付价格。
  • 公开部分 ϕpub\phi_{\text{pub}}:处理公开规则。例如 manager 的公开保证金应该退还还是用于赔偿。

编译器把这些程序转成参与者、manager 和区块链分别执行的协议。

所以,Hawk 里的“合约”是一个完整的交互协议,范围比单独一段链上代码更大。

4.核心流程:freeze → compute → finalize

这三个词是你第一次阅读时最值得抓住的主线。

第一步:freeze——把输入和资金锁定

参与者先冻结自己的资金,并提交对金额和私密输入的承诺。

你可以把承诺理解为一个封好的信封:

  • 外面的人看不到里面的出价;
  • 提交者之后不能把里面的 10 换成 20。

密码学上,这分别叫隐藏性和绑定性。

同时,参与者提交零知识证明,证明自己确实拥有合法资金、冻结金额与承诺一致,而且没有重复花费。区块链验证这些条件,无需看到金额明文。

注意:这里锁住的是真实资金。仅仅提交一句“我承诺出价 10”,不能保证最后付得出钱。

第二步:compute——让 manager 获取已经锁定的输入

到了规定阶段,参与者把承诺对应的内容加密给 manager,并证明:

我现在提交的密文,装的是之前承诺的那份输入。

manager 解密后,就能计算拍卖结果。

这个顺序很重要:先固定出价,再向 manager 打开出价。 这样即使 manager 与某些参与者串通,他们也不能在看到诚实参与者的出价后,随意修改自己已经承诺的输入。

还有一个容易忽略的细节:论文让这些密文通过链上合约提交。虽然计算主要在链下完成,但链上需要留下可检查的记录,判断谁按时提交、谁退出了。

第三步:finalize——用证明完成结算

manager 计算完后,构造新的私密资金输出,并提交零知识证明。

证明需要把几件事联系起来:

  • 用的是此前锁定的输入;
  • 执行的是规定的私密合约;
  • 输出资金按计算结果分配;
  • 输入和输出满足资金守恒;
  • 输出承诺、密文等构造正确。

区块链验证通过后,才接受结算。

因此,manager 虽然知道秘密,却不能随意改账。

5.零知识证明到底证明了什么?

初学时可以先记住:

零知识证明让你证明“某个条件成立”,而不公开满足这个条件所需的秘密。

在 Hawk 的拍卖中,manager 要证明的大意是:

存在一组与链上承诺一致的秘密出价;按照约定的拍卖程序计算,得到的就是我提交的结算结果。

链上看到承诺、公开输出和证明;秘密出价是证明使用的隐藏材料,常称为 witness(见证)。

Hawk 使用 zk-SNARK 来实现高效证明验证。对这篇论文而言,最重要的直觉是:

生成证明比较贵,但链上验证比较便宜,因此大量工作可以放到链下。

也别把“证明正确”理解成“合约规则一定合理”。如果程序员写错拍卖规则,证明仍可能证明它被忠实执行。证明保证的是执行与指定程序一致。

6.隐私究竟对谁成立?

这是阅读 Hawk 时必须分清的地方。

对象隐私保证的边界
链上公众私密输入和私密资金分配受到密码学保护,但公开输出及协议暴露的信息仍然可见
其他参与者输入固定前,不能提前获知诚实参与者的秘密输入;结束后的隐私还依赖 manager 不泄露
manager基本方案中能看到参与者的输入

例如,拍卖程序中的 out.winner 是公开输出,所以公众可以知道谁获胜。私密合约不意味着它的所有结果都隐藏。

论文称 manager 为“最小信任的 manager”,意思是把信任范围缩小:

  • 对保密,仍需相信 manager 不泄露输入。
  • 对结算正确性,依靠证明约束 manager。
  • 对中途退出,依靠链上超时和保证金机制处理。

论文也讨论了用可信硬件或多方计算实现 manager 的可能性,但基本方案的隐私信任不能忽略。

7.为什么还需要区块链和保证金?

因为密码学证明不能强迫一个人继续参与。

manager 可以收到出价后关机,既不计算,也不提交证明。解决这个问题需要明确的截止时间和资金规则。

论文设置了三个时间点:

  • T1T_1:停止接受资金冻结和出价承诺。
  • T2T_2:参与者必须完成向 manager 打开输入;未完成的输入按协议规定处理,例如按零出价处理。
  • T3T_3:manager 必须完成结算;否则参与者可以取回被冻结的私密资金。

在拍卖例子中,manager 还预先缴纳公开保证金。如果它超时,保证金分给参与者作为赔偿。

这里的 financial fairness(金融公平性),主要是用退款、惩罚和赔偿处理退出行为。它不保证拍卖一定完成,也不保证赔偿覆盖每个人现实中的全部损失。 具体激励规则还要由合约设计。

8.这篇论文的贡献应该怎么记?

我建议记住三个层面:

  1. 系统架构:把私密计算、可编程资金分配和链上结算结合起来。
  2. 编译器:把高层合约转成密码学协议,同时加入承诺、加密和资金守恒等约束。
  3. 安全模型:形式化描述区块链上的公开状态、时间、消息排序和资金行为,再分析协议安全。

论文标题里的 “Blockchain Model of Cryptography” 对应第三点。它把区块链视为一个在假设下保证正确性和可用性、但不提供隐私的公共执行环境。

这些保证依赖底层区块链及密码学假设。原型还存在可信设置、参与人数上限、私密程序不支持动态长度循环等限制。第一次阅读先知道这些边界即可,不必立即钻进实现细节。

✳ 记录于 cidernwork