#dusk $DUSK @Dusk 盯着Dusk的文档看了快四十分钟,我一直在反复想一个问题:Moonlight和Phoenix这两套东西到底怎么收场
Moonlight走公开账户路线。余额、转账的发送方、接收方和金额都写在链上,谁都能看。这玩意适合交易所充值、机构对账这种必须透明的场景。Phoenix完全是另一套逻辑,资产变成加密的note,藏在Merkle树里。你花掉一笔钱的时候不暴露具体是哪张note,而是扔一个nullifier加一个ZKP证明。网络能验证你有钱、没双花,但看不到金额和发送方。需要审计的时候可以通过viewing key选择性披露
我在月初写SEPA转账的笔记时碰过类似的问题,两个银行系统之间对账,状态不一致有多头疼,我当时被折腾到半夜两点。区块链要是也搞两套孤立账本,那还不如传统金融
当时有点烦躁,感觉文档里对这个问题交代得不够清楚。我翻到Rusk模块的合约架构部分,头两段看完没什么感觉,无非是描述Moonlight和Phoenix各自的数据结构。直到翻到第四段,看到Transfer Contract的接口定义里用了枚举类型payload,我才品出它的设计意图
Transfer Contract就是一个协调入口。它接收不同格式的payload——有Moonlight格式的,有Phoenix格式的。合约不关心你从哪来,只关心payload里带了什么字段,然后把它路由到对应的验证逻辑里。Moonlight的验证直接读公开账户状态,Phoenix的验证跑ZK proof。两边验证通过之后,再把结果写入同一套全局状态树。我琢磨了好一阵才想明白这一步的关键:如果你把两套账本的状态树合成一棵,那么从公开账户转一笔钱到隐私note,本质上只是一次payload的转换,不需要跨链桥,不需要复杂的同步协议。状态更新是原子性的,要么全部成功,要么全部回滚。
Moonlight走公开账户路线。余额、转账的发送方、接收方和金额都写在链上,谁都能看。这玩意适合交易所充值、机构对账这种必须透明的场景。Phoenix完全是另一套逻辑,资产变成加密的note,藏在Merkle树里。你花掉一笔钱的时候不暴露具体是哪张note,而是扔一个nullifier加一个ZKP证明。网络能验证你有钱、没双花,但看不到金额和发送方。需要审计的时候可以通过viewing key选择性披露
我在月初写SEPA转账的笔记时碰过类似的问题,两个银行系统之间对账,状态不一致有多头疼,我当时被折腾到半夜两点。区块链要是也搞两套孤立账本,那还不如传统金融
当时有点烦躁,感觉文档里对这个问题交代得不够清楚。我翻到Rusk模块的合约架构部分,头两段看完没什么感觉,无非是描述Moonlight和Phoenix各自的数据结构。直到翻到第四段,看到Transfer Contract的接口定义里用了枚举类型payload,我才品出它的设计意图
Transfer Contract就是一个协调入口。它接收不同格式的payload——有Moonlight格式的,有Phoenix格式的。合约不关心你从哪来,只关心payload里带了什么字段,然后把它路由到对应的验证逻辑里。Moonlight的验证直接读公开账户状态,Phoenix的验证跑ZK proof。两边验证通过之后,再把结果写入同一套全局状态树。我琢磨了好一阵才想明白这一步的关键:如果你把两套账本的状态树合成一棵,那么从公开账户转一笔钱到隐私note,本质上只是一次payload的转换,不需要跨链桥,不需要复杂的同步协议。状态更新是原子性的,要么全部成功,要么全部回滚。
