# 聊聊“面向Vitalik创业”的项目
Nocturne
和晦涩的隐私地址技术

By [Jason chen](https://paragraph.com/@jason-chen) · 2023-10-30

---

聊聊“面向Vitalik创业”的项目Nocturne和晦涩的隐私地址技术，前天Nocturne刚官宣融资600万美金且拿到了Vitalik投资，为什么我叫它面向Vitalik创业呢，因为该项目主打的技术是隐私地址，而今年1月20号Vitalik就曾在自己的博客中专门发文探讨隐私地址的可行性，我当时在第二天也针对这篇文章进行了拆解分析，大家可以翻一下进行温习回顾。

Nocturne的推特账号第一次发文是今年的5月份，即在Vitalik探讨隐私地址5个月后，然后又过了5个月拿到了Vitalik的投资，所以还是挺成功的一次面向Vitalik创业的案例

那单独聊聊隐私地址这个事吧，到底是做什么的，如何实现，效果怎么样。

隐私地址的核心就是实现Token转移过程中的匿名性，也就是tornado cash之前实现的效果，匿名转账是一个Crypto永恒的话题，也是非常刚性的需求，我接下来会尽可能通俗且详细的讲解隐私地址是如何实现的，又和tornado cash有何区别。

但首先要明确隐私地址绝对不是新概念，而是存在很久并且已经有不少项目和衍生协议产生，门罗币其实差不多也是这样的原理，但Vitalik是其在以太坊生态理论化的重要推动者。

在22年8月的以太坊研究者论坛中，Nerolation提出了能否将ZK和ERC721结合实现匿名发送和接收NFT，Vitalik回复说你想的太麻烦了，也许用一种更简单的方式实现，并暂时叫它ERC721S，原帖链接如下：

[

ERC721 Extension for zk-SNARKs
------------------------------

Hi community, I've recently been working on this draft that describes zk-SNARK compatible ERC-721 tokens: https://github.com/Nerolation/EIP-ERC721-zk-SNARK-Extension Basically every ERC-721 token gets stored on a Stealth Address that constists of the hash h of a user's address a, the token ID tid and a secret s of the user, such that stealthAddressBytes = h(a,tid,s).

https://ethresear.ch

![](https://storage.googleapis.com/papyrus_images/ec5c5091f327fc5bba77649a771a3043bbcf2e031d786512fb3d08ee7a883eaa.png)

](https://ethresear.ch/t/erc721-extension-for-zk-snarks/13237)

然后紧接着Nerolation和Vitalik就提了一个EIP5564，将其彻底推进标准化

[

ERC-5564: Stealth Addresses
---------------------------

Private, non-interactive transactions

https://eips.ethereum.org



](https://eips.ethereum.org/EIPS/eip-5564)

但其实在更早之前就已经有一个项目将隐私地址产品化了，至少从成熟度来说达到了可用状态，但是我不清楚为什么没有得到Vitalik的青睐...反而是一年后才姗姗来迟的Nocturne被宠幸了

隐私地址的原理简单来说就是为每一次交易都生成一个一次性的新地址，付款人将钱转到新地址，且新地址只能由收款人进行控制，用完即抛，手动操作就相当于A生成了一个新地址，然后将该地址的私钥告诉B，A再往里面转10U，因为只有B知道这个地址的私钥，所以B则可用控制这个地址并将10U打入交易所，所以从公开的链上只能看到A往一个空地址转了10U，然后这个地址又将10U转入交易所，但至于具体是谁把10U转入交易所则没人知道。

但以上过程是依赖很多人工操作，且涉及到私钥的传递，不光麻烦风险也很高，那有没有什么办法可以将这个流程给产品化呢，思路就是在于怎么样能够自动实现“A生成一个只有B才能控制的地址”过程。

这个就是隐私地址所要完成的任务，这里面也用到了ZK的思想。

回到刚才的例子，举个例子，A想给B转10U，A已经知道了B的公开地址，但A又不想让别人知道A-B之间的交易链路，于是A生成一对临时私匙和公钥，并将该临时私匙和B的公开地址结合后生成一个隐私地址，然后A将10U转入隐私地址。

从链上来看这时候A往一个新地址中转入了10U，这时候出现了两个问题，首先B如何知道这个新的隐私地址是A为B创建的？也许A还给C、D、E等其他人也发了10U呢，其次即使B知道该隐私地址就是A为他创建的，那B又该如何拿到这新地址的10U或者说如何控制该新地址呢？

刚说到A用来生成隐私地址的时候会先生成一对临时私匙和公钥，其中临时私匙+B公开地址=隐私地址，而B私钥+临时公钥也等于隐私地址，所以A在发送10U到隐私地址时也会同时将临时公钥发布在链上，B则去扫描公钥注册表，对于每个新发现的临时公钥B都会将他的私钥结合起来生成一个隐私地址，如果里面恰好有钱则说明是A给他的。

然后再用B自己的私钥就可以计算出该隐私地址的私钥，从而用隐私地址的私钥控制隐私地址进行下一步转账交易。

从链上来看的效果则是A往一个新地址转了10U，然后10U转移到了交易所，但到底是谁操纵新地址进行转移则在链上体现不出来，新地址就像是一个提线木偶被后面的一双手进行控制。

以上就是隐私地址的原理，到现在Nocturne的测试网和主网都没有上线，且无roadmap，所以到底Nocturne是否能够做到tornado cash的效果还是要再观察。

---

*Originally published on [Jason chen](https://paragraph.com/@jason-chen/vitalik-nocturne)*
