系列 · 练习之道
可验证公平的数字占卜:承诺—揭示密码学如何让电子起卦自证清白
掷三枚实体铜钱,公平性不证自明:钱离了你的手,剩下的交给重力,无人——包括你自己——挑选结果。数字起卦的难处在这里:无论它的随机数生成器实际上多么诚实,你看不见它。一个应用原则上可以在你显得焦虑时端出温和的卦,在你兴致平平时端出戏剧性的卦来留住你——而这一切看上去与偶然毫无分别。
对多数软件,这只是个质量问题;对一件冥思法器,这是根基问题。一卦值得省思,前提是这个符号确实是落到你头上的——而不是被任何人的算法按"你该听什么"替你挑出来的。所以六门法器不请求信任,而是采用密码学里的承诺—揭示协议,让每一次起卦的任何操纵都在事后可以被查出。
核心思路:先封缄,后行事
承诺—揭示的结构如同一只火漆封缄的信封。事情开始之前,一方先写下自己的那份内容,封好,把封缄的信封交给对方;等对方行动完毕,才启封。封缄证明内容早已固定;时序证明它不可能是看了对方的行动之后才写的。
密码学的封缄物是哈希函数——这里用 SHA-256。它把任意输入变成一段定长指纹,对我们要紧的性质有两条:其一,单向——看到指纹,推不出输入;其二,实践上无碰撞——没人能造出第二个输入对上同一指纹。因此,公布一个秘密值的哈希,等于把自己锁定在这个秘密上,同时对它一字不泄。
协议逐步走一遍
在六门起卦时,事情按这个次序发生:
一、服务器承诺
仪式开始前,服务器生成一个随机值,称为服务器种子,并把它的 SHA-256 哈希——承诺哈希——先行发给你;种子本身保密。此刻,服务器对这一卦的全部贡献已经锁死:日后种子若有一字之改,哈希便对不上,而哈希在你手里。
二、你注入熵
你逐次点击掷币,每次交互的精确时机——毫秒级——连同设备熵,汇成客户端种子。这一步的意义有两重。在仪式上,它让这一卦确属于你:你的手、你的此刻、你不可复现的节奏参与塑造了结果,正如实体铜钱一样。在密码学上,它堵住最后的漏洞:服务器无法预知你的点击时机,也就不可能预先挑一个能把你引向特定结果的种子。
三、结果由确定性运算导出
铜钱的值由一次 HMAC(带密钥的哈希)算出,输入是服务器种子、客户端种子与本次占问的唯一编号:
result = HMAC-SHA256(server_seed, client_seed + cast_id)
输出的字节按一条固定、公开的规则映射为一整卦的十八个钱面:六掷,每掷三枚,和数为 6、7、8 或 9,与实体三钱法分毫不差。此步之中不存在任何"选择":两个种子与占问编号一经给定,卦象完全确定——而两个种子,没有任何一方能够独自控制。
四、服务器揭示
爻既已成,服务器公开服务器种子。至此你手中齐备:掷前的承诺哈希、掷后揭示的种子、你自己的客户端种子,以及结果。
亲手验一卦
验证只问两个问题,皆可机械核对:
服务器守约了吗? 对揭示的服务器种子做一次 SHA-256,与掷前收到的承诺哈希比对。相符,即证明种子在你触屏之前已经固定。
结果确由种子导出吗? 用揭示的种子、你的客户端种子与占问编号重算 HMAC,按公开规则映射,与你收到的爻比对。
写成一页明文,验证长这样:
已知:
承诺哈希 = 9f2c41...a8 (掷前收到)
服务器种子 = 71e0bd...3c (掷后揭示)
客户端种子 = 448a19...e5 (来自你的交互)
占问编号 = c_0192xyz
核对一: SHA256(服务器种子) -> 9f2c41...a8 相符
核对二: HMAC-SHA256(服务器种子,
客户端种子 + 占问编号) -> 映射爻值: 7 8 9 8 8 7
记录爻值 : 7 8 9 8 8 7 相符
每一卦都永久保存这组三元组,平台的验真页会替你复算两项核对——但要点恰恰是你不需要我们的页面:任何语言、任何机器上的任何一个 SHA-256 实现,都会得出同一个答案。字节映射的完整规范,关于页有链接。
这对数字仪式为何要紧
工程之下有一个安静的义理。占卜传统向来看重随机时刻的完整性——蓍草默数,铜钱当众落地。随机性是仪式的担保:符号来自你意图之外,而这正是它能作镜子的原因——它照见的是你未曾选择去看的东西。至于一掷如何化为省思——本卦、变爻、之卦——可看变爻指南。
一个可以被引导的数字卦,哪怕出于善意,也会以最坏的方式——无形地——毁掉这份担保。承诺—揭示把骰子重新放回众目之下。它同时也在防平台自己:日后任何产品压力都无法悄悄让卦"更抓人",因为每一卦都是可审计的记录,任何偏离都会以哈希失配的形式浮出水面。
这一切并不使卦变得灵验——本来也无人许诺灵验。密码学不能让一卦为真;它能做到的,是让这一掷干净——在你的问题与你的答案之间,可证明地无人插手——于是你在卦里读出的一切,都出自你的省思,而非他人的经营。
掷一卦,然后查它
理解承诺—揭示的最好方式,是先跑一遍再审一遍。带一个真实的问题去六门起卦页,掷前记下承诺哈希,读毕打开验真面板,看两项核对逐一通过。前后一分钟,此后每一次数字起卦的质地都会不同:不是信任,而是比信任更好的东西——不再需要信任。