Transfer Contract就是一个协调入口。它接收不同格式的payload——有Moonlight格式的,有Phoenix格式的。合约不关心你从哪来,只关心payload里带了什么字段,然后把它路由到对应的验证逻辑里。Moonlight的验证直接读公开账户状态,Phoenix的验证跑ZK proof。两边验证通过之后,再把结果写入同一套全局状态树。我琢磨了好一阵才想明白这一步的关键:如果你把两套账本的状态树合成一棵,那么从公开账户转一笔钱到隐私note,本质上只是一次payload的转换,不需要跨链桥,不需要复杂的同步协议。状态更新是原子性的,要么全部成功,要么全部回滚。
第一天就卡壳。./dusk-node跑起来,ZK证明生成到87%必崩,终端吐一句"witness construction failed",内存从4G顶到12G,风扇跟楼下夜宵摊抽油烟机似的。重装五次程序、重下三次快照,都没用。最后翻GitHub示例,一行注释小得差点漏过去:"key expects BigInt, string will break witness construction."改完传参方式,重启,8秒证明生成。