# 深度解析匿名网络赛道

By [Arc_Yuzhi](https://paragraph.com/@arc-yuzhi) · 2023-09-26

---

概述：什么是匿名网络
==========

“你是谁，你从哪里来，你要到哪里去”，被称为人生终极哲学问题。类似地，在互联网中，我们也可以同样的发问：“一条消息的内容是什么，它从哪里来，会到哪里去？”

在我们仔细的探究这个问题之前，不妨先将网络分为两类：一种是能够解答这个问题的网络，一种是不能解答这个问题的网络。

对于前者，我们称之为非匿名网络，即消息的内容和传播路径或多或少会泄漏；对于后者，被称为匿名网络，亦是本文的主角。匿名网络的设计主旨是在隐藏消息的知识的前提下，仍可以精确的转达消息，在这个过程中，即便是路由器本身，也无法知道这些消息的知识。

本文将会介绍匿名网络的发展历史，然后会介绍匿名网络的原理；最后会介绍web3时代的一个典型匿名网络项目nym，以一窥web3时代的技术是如何解决其痛点。

匿名简史：从一本小说说起
============

技术和思想相生相伴。

从思潮的角度来看，就不得不介绍一本赛博朋克的殿堂级小说: 《True Names》，中文名《真名实姓》。在小说中，一旦黑客暴露了其在现实世界中的真实身份，那么即便他有再强的技术，也将形同虚设，如同被破了命门的巫师一般。这本书在当时吸引了诸多密码朋克，其中之一便是大名鼎鼎的Timothy. May（《加密无政府主义者宣言》的作者），他专门为这本小说写了一个书评，名为《True **Nyms** and Crypto Anarchy》。在标题中，作者特地使用Nym一词来对应Names，突出其“假名”之意；在书中，更是梳理、畅想了一系列捍卫隐私的技术，可以说是90年代加密技术的百科全书，包括非对称加密、数字货币、匿名重邮器、智能合约、数据避风港、虚拟社区、信誉系统、数据避风港等十来项技术；其中一些技术在如今得到了长足发展，另一些技术还未走入大众的视野，但都是加密世界中不可缺失的一环。书中，对匿名重邮器进行了大篇幅的描述，而它便是我们的主角——匿名网络。顺便说一句，如果你问我什么是web3，我可能会回答你：从来没有什么web3，所谓web3，早在互联网泄漏隐私的那一刻起，便诞生了。

从技术上来看，则不得不提到David Chaum。此人既是匿名网络的发明者，同时也是盲签名、Ecash的发明者，足见其对加密领域的贡献。David Chaum最初提出了DC网络的设想，这是一个简洁的匿名网络，可以在逻辑上保证消息的匿名性，尽管不具备实际的工程性，算是一个有趣的思维实验。1981年，他提出了论文《匿名消息网络》，则详细阐述了基于非对称加密和匿名重邮器来实现消息加密和路由转发的方法，这是后续几乎所有匿名网络的原型。90年代，美国海军开发了Tor，成为了暗网的主流方案之一，但是这些网络的运行本质不依赖于激励，而是依赖于志愿者的热情等非经济因素，因此其可持续性便需要打个问号。在区块链和加密货币时代，这便不再是问题，诞生了Nym等项目，这些基础设施在继承了匿名网络的同时，通过引入区块链、merkle tree等技术，解决了节点的激励问题，使得构建出分布式、可持续的生态成为可能。

**早期的思想实验：DC网络**
================

DC网(dinner cyphergraph net)由David chaum在20世纪80年代初提出，主要是设想了一种匿名发布消息的方法。假设现在有Alice、Bob、Carol三位玩家，该网络可以做到，其中某一位玩家发布一条消息，但是没有任何人知道这一条消息是谁发的。

从整体来看，在一个DC网络中，存在若干个节点。每两个节点之间预先共享一个秘密，视作一条边，构成一个强连通图。这些秘密值和消息本身没有关系，仅用来保护消息的匿名性。

当某个节点要发布消息的时候，所有节点计算自己所有边上元素的异或，要发布消息的节点则在自己计算结果的基础之上，异或自己的消息值。最后，所有的元素将自己的结果共享出来进行异或，最后得到的就是消息本身。下图阐述了该网络的原理：

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

我们可以理解消息的正确性，因为显然，在上述的过程中，每个秘密都会被异或两次，所以会被消去，最终只剩下消息本身。

这个算法也可以保证匿名性，最精髓的原因在于一个节点试图发送消息的时候，它的邻居无法判断消息是否由其所发，因为它的邻居并不知道发送者的另一半秘密是什么。这里给一个极简单的例子：

Alice需要放以最简单的1bit数据发送为例，假设每两位玩家之间共享的秘密都是0，而Alice欲发送的消息是1。

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

在这个场景下，每位玩家将两位隔壁玩家的秘密进行异或，其中Alice还将自己的消息附上去，形成如下数据：

    玩家	    Xor过程        Xor结果
    Alice	    0   ^ 0 ^ 1    1
    Bob	    0 ^ 0          0
    Carol	    0 ^ 0          0
    

这一结果，三方都可以看得到，但是Bob和Carol却无法确定，是怎样的场景，能够产生这一结果。

如以Bob的视角来看，有这两种可能性，消息既可能是Alice发的，也可能是Carol发的：

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

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

真的是很精妙的设计啊。但是，作为一个思维实验，DC网络不具备大规模组网的可行性，比如如何保证两两节点之间共享秘密？如何保证同时只有一个玩家发布消息？这些都是问题。

**经典设计：匿名消息网络**
===============

匿名消息网络，一种点对点的加密网络，具备匿名特征，收件人乃至中间人都不知道发件人是谁。

基本原理
----

在匿名网络中，发送方和接收方之间需要一组路由，称为匿名重邮器（Anonymous Remailer）。路由网络的工作原理如下：

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

从原理来看，发送方先选择一条加密链路，利用非对称加密，把消息按照线路的反向顺序，逐个加密，然后丢给链路中的第一个加密节点，即橘色节点。橘色节点将其解密，发现里面的内容是“请将该消息转发给绿色节点”，依此类推，直到接收方将最后一层消息进行解密，得到原文。

举个例子，Alice想通过Bob、Carol把消息MSG丢给Danny，那么Alice先将消息按照Danny的公钥加密:

    msgToDanny = encrypt(MSG, pubKeyDanny)
    

然后，开始构造给Carol的消息，它包括这个给Danny的密文，外加一条指示：请转发Danny!

    msgToCarol = encrypt([msgToDanny,Danny],  pubKeyCarol)
    

类似地，构造给Bob和Alice的消息：

    msgToBob = encrypt([msgToCarol,Carol],  pubKeyBob)
    msgToAlice = encrypt([msgToBob,Bob],  pubKeyAlice)
    

最后，交给Alice后，Alice解密msgToAlice，得到内部的密文，并转给Bob；Bob再转给Carol，如此递归地，最终达到Danny。这个过程有点像剥洋葱，每个路由器都会剥下一层洋葱皮。

在这样的网络下，显然可以实现两个特性：

*   隐藏消息的内容。对于任何一个中间人来说，消息本身是加密的，在没有私钥的情况下，是无法获知消息内容的，无论是攻击者，还是匿名重邮器本身。
    
*   隐藏消息的路径。对于任何一个中间人来说，由于加密的特性，没有人知道消息来自谁，到哪里去。以Carol为例，他仅仅知道有一条密文从Bob过来进来，至于真正的源头是哪，最终目标是哪、除非破解了这个密钥，或者使用特殊的分析手段（后文会讲解），否则无从得知。
    

匿名重邮器的类型
--------

尽管上述的算法比较完美了，打造一个完善的匿名网络仍需应对一些挑战，主要包括：能否让消息安全的回复到原点，能否应对常用的攻击手段。根据这个分类，可粗分为4类：

根据匿名重邮器的

**伪匿名：**

remailer作为中转方，将发送方的真实姓名替换为假名，再发给接收方。当接收方回复邮件的时候，remailer将假名替换为真名，再转发给发送方。由于必须信任中转方，中转方知道匿名，且缺乏足够的消息保护手段，因此是伪匿名。

**type 1(cypherpunk remailer)：**

发送端选择一条链路，将信息加密处理，remailer接收解密、去除敏感信息，然后可路由给其他remailer，直到最终接收方接收到。只允许单向传输消息。

**type 2（mixmaster remailer）：**

发送端选择一条链路，将信息加密处理，remailer接收解密、去除敏感信息、进行延迟、分块处理等混淆，然后可路由给其他remailer，直到最终接收方接收到。只允许单向传输消息。

**type 3（mixminion remailer）：**

发送端选择一条链路，将信息加密处理，remailer接收解密、脱敏、进行延迟、分块处理等混淆，然后可路由给其他remailer，直到最终接收方接收到，接收方基于消息附带的导航信息，可以在不知道发送端真实地址的情况下回复信息。

消息的回复
-----

假设Alice希望Danny看到消息后，能够回复自己消息，那么协议应该如何修改呢？思路也是类似的。

假设Alice希望Danny将消息按照Bob→Carol的顺序来返回，那么基本的思想是在消息中除了消息内容本身，再添加一条“洋葱化”的指引信息。Danny用自己的私钥解密Carol转发的报文后，可以看到两样信息：

*   消息内容本身。
    
*   Alice的公钥。
    
*   指引信息。包含两部分内容：
    
    *   指令：将下述指引信息转给Bob
        
    *   下级指引信息（该内容对Danny而言是不可知的，因为已被Bob的公钥加密过了）
        

于是，Danny按照下述格式构造响应报文：

*   回复消息内容，并用Alice的公钥加密。
    
*   下级指引信息
    

当Bob收到Danny投递的消息时

*   用Alice公钥加过密的响应内容。
    
*   指引信息。如果Bob用自己的私钥解密，就相当于剥去了一层洋葱皮，得到：
    
    *   指令：将下述指引信息转发给Carol
        
    *   下级指引信息（该内容对Bob而言是不可知的，因为已被Carol的公钥加密过了）
        

类似地，Carol收到Bob的消息后，得到

*   用Alice公钥加过密的响应内容。
    
*   指引信息。如果Carol用自己的私钥解密，就相当于剥去了一层洋葱皮，得到：
    
    *   指令：将下述指引信息转发给Alice
        
    *   下级指引信息（该内容对Alice而言是不可知的，因为已被Alice的公钥加密过了）
        

最后Alice解密消息后，就得到了响应本身。上述就是消息回复的大致过程。从Alice的角度而言，发送消息给Danny时，需要预先设想好回复路线，然后再将回复路线封装在消息中，沿途的节点将一层层解开下一个转发目标，如此实现消息的回复。

攻击手法及应对
-------

仍存在一些破解的方法，打造一个完善的匿名网络仍需应对这些攻击手法。

**消息篡改**

消息可能会被篡改，显然我们需要使用签名和验签机制。

**线路分析**

假设系统中没有任何流量。此时发送端给接收端发送了一条消息，这条消息不管内容是什么、如何加密，最终到达了接收方，那么监听人就可以判断出发送方和接收方之间存在联络。这种方式需要用延迟路由的方式解决，即积累一批消息后再转发，使得攻击者无从判断是谁转发给谁。

**大小分析**

假设现在系统中存在很多条消息，如果发送方的消息不管怎么加密，但是大小不变的话，监听人可以分析该大小的数据段最终达到哪个节点，从而判断出谁和谁存在联络。因此，需要按照体积相同的大小来发送报文，消息大于该体积则切割，小于该体积则补0.

**重复分析**

攻击者可以拦截一条发送端发出的消息后重放等方式，使得一条特定的消息被重复投放，如果在某个接收人除观察到一条和先前重复的信息，因此判断出发送人和该节点存在联络。因此，需要确保每一次转发，都对消息做一次随机化处理或者去重。

**撞库攻击**

攻击者可对消息的原文进行暴力猜测，和密文进行对比。需要在加密时引入随机数防止撞库。

为了应对这些攻击，通常采用这些机制：

*   Batch & Shufle：积累一批消息后乱序处理转发，否则如果耿直的先进先出，攻击者一眼就看出哪里到哪里了，特别是网络中流量稀少的情况下。
    
*   delay：每一条消息进行延迟处理
    
*   切片：将消息切割、填补为大小相等的片段（有点像MTU过程），否则攻击者一看，某人发了超大的一条消息，一直追踪这条最大的消息就能知道最终到达哪里。
    
*   去重：将重复的消息处理，否则攻击者可以通过重放，就锁定目标
    
*   随机数：每一次加密其实都渗入了随机数，一方面防止撞库，一方面防止出现相同的消息片段被记录。
    

你身边的匿名网络：Tor网络
==============

Tor网络（洋葱网络）是一个半中心化的网络，6000+节点，日活800W+用户。是目前最大规模的匿名网络。

Tor网络的运行依赖于洋葱路由协议（onion routing protocal），发送者选择一条加密链路，依照它们的公钥对消息加密多次并投递，加密链路中的节点每次移掉一层加密并转发给下一个节点，最后转发给接收者。

Tor虽然是最活跃、规模最大的网络，但仍然存在一些问题。

第一，中心化问题。Tor的节点是去中心化的，但是一些关键信息仍然以中心化的方式记录在权威服务器上，比如洋葱目录（Tor Directory）管理所有的路由节点。

第二，激励问题。洋葱网络的节点是由志愿者运行的，志愿者并没有任何奖励可拿。这是因为当时并没有发现比较好的评估节点服务质量的方式。

Web3时代的匿名网络：Nym
===============

[Nym](https://nymtech.net/)是2019年成立的项目，CEO为麻省理工的计算机科学家[harry halpin](http://connection.mit.edu/harry-halpin), 2022年2月中旬完成公募轮。

系统结构
----

系统中的参与者包括：

*   终端用户（End User）：使用nym代币购买带宽，然后与网络中其他用户、服务进行加密通信。
    
*   服务提供者（Service Provider）：可以看作加密网络的dapp，基于加密通信实现一些业务。
    
*   网关（Gateway）：终端用户、服务提供者会直接连接到网关，网关会将消息接入到路由网络中。网关提供了准入控制（例如是否购买了带宽服务）、消息离线存储两大功能
    
*   混合节点（Mix Nodes）：混合节点可以组成**路由网络**，对消息包进行路由和混淆处理。为了评估节点的服务状态，还引入了proof of mix方式来评估其信誉，后文会详解。
    
*   验证者（Validator Nodes）：组成了**区块链网络**。区块链网络主要功能包括时钟服务器、随机数信标、记账、激励等。用户购买服务等信息都会记录在这里。区块链采用proof of stake模型进行共识，根据官网，直接复用了cosmos的链。注意，nym其实一个双层网络模型。
    

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

整体流程
----

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

1）  用户通过区块链，质押nym代币到nympool，以获取“带宽凭证”（bandwitdth credential）和“服务凭证”(service credential)。其中带宽凭证表示用户可使用的带宽额度，比如多少个字节等。服务凭证是对应dapp的使用凭证，表示特定服务的使用额度等。

2）  用户向网关出示带宽凭证，网关会向区块链验证这个带宽凭证是否处于未使用的状态，并验证带宽凭证中的购买证明。

3）  用户接入网关。首先网关会在区块链账本上将凭证设置为已使用的状态，然后会和用户之间协商一个对称密钥，用于和用户之间进行加密通信。

4）  用户请求加密路由。网关借助路由网络，对消息多次加密，然后路由网络将消息转发给接收者。

5）  用户使用dapp服务。如果第三方服务是付费的，那么服务方提供服务时需要检测用户提供的服务凭证。

6）  服务方结账。服务完成后，服务方需要在区块链上将服务凭证标记为已使用，防止双花。

7）资金分配。每过一段时间，nympool里的资金就会被奖励给网关、混合节点、验证者。

接下来我们会对整个系统做一个详尽的拆解。

详解
--

### **mix网络：epoched + layered**

节点可质押代币后可注册成为混合节点 mix node，然后stakeholder还可以加钱给mix node担保。这些mix nodes将组网。网络的拓扑不是一成不变的，每一轮（epoch）都要重新打乱之前的网络结构，这是出于安全性考虑，这样打乱对手方节点在物理上调整自己的位置，以连成一串来破解流量。这种攻击手法是指，比如我怀疑张三有一条偏好的加密链路，因此我把这条加密链路上的主机都攻陷了，这样

整体的过程如下：

1）  每一个轮开始时，区块链网络会基于块高等信息生成一个信标x，作为这一轮随机操作的种子。

2）  在这一周期，信标x会生成一组伪随机数，基于这组伪随机数，来在所有的mixnodes中，按权益比例选择出一组mix nodes进行组网。“根据权益比例来选出一组节点”，在区块链领域中是这是一个简单而常见的算法，选择的过程类似于往天上扔豆子，豆子落下来，哪个碗大就选哪个，论文中没有说用什么方式i，猜测fts(follow the satoshi)就是一种比较经典的算法，被ouroborous等区块链所使用，可参考附录。

3）被选中的节点，会被分为多层。

*   每个节点i生成一个随机数yi。
    
    *   mixnode先利用私钥si和信标x，基于VRF函数生成可验证随机数： VRF(x, si) -> yi,πi
        
    *   mixnode发布（yi,πi）到链上，这样任何人都可用链上记录的mixnode公钥ki来验证yi的正确性。
        
*   随机数yi对层数取模，所得就是所在层。
    

4）当消息进行路由的时候，转发会按层与层之间进行，每一层会选择一个节点负责消息的路由，并转发给下一层的某个节点。

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

这个设计具有足够的安全性。因为一个恶意攻击者想要破坏一条链路，首先要把每一层都至少占上一个节点。即使如此，恶意节点还必须能够刚好占有一条链路，此概率按L指数级下降，比如三层网络，每一层对手方占据50%节点，则一条链路被选中的概率是0.5^3，即12.5%概率，意味着每100个消息中仅有12.5会被破解。

### **混淆手法：sphinx**

作为一个mix网络，最关键的功能就是对流量进行混淆。在David Chaum定义的网络中，混淆基于批量和重排序，这个对于性能来讲具有较大的延迟。在Nym中，采用了sphinx协议混淆。它的包格式如下：

*   数据头：包含了每一次路由延迟多少的信息。也需要加密。
    
*   数据体：包含了层式加密的密文。
    

它的格式如下图：

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

sphinx协议采用下述方式进行混淆流量：

*   delay：每个节点处理时，根据数据包中的延迟时间进行延迟，达到混淆的效果。
    

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

\*

*   填充：不同的数据包大小不一样，因此很容易被观察出，因此还会对数据包填充，保证各个数据包大小的一致。
    
*   去重：重复的sphinx包必须去重，防止重放攻击
    
*   Cover traffic：放大量随机消息混淆视听，防止被观察者观察出哪两个节点之间存在长期的联系。
    

### **凭证机制：Coconut**

在先前，我们发现一个很重要的概念，“凭证”。比如，我们以凭证的形式，来包裹了对带宽的购买证明。对流量的购买证明，本身一个merkle path甚至几个签名就能解决的事情，为什么还要使用凭证呢？

这里使用了一种技术：可验证凭证。凭证是一个[w3c协议](https://www.w3.org/TR/vc-data-model/#dfn-verifiable-credentials)，它可以填入业务所需要的密码学证明，来证明一些断言，比如你拥有驾照，你拥有多少资产等。因此，使用这一框架，服务提供者可以要求用户提供各式各样的证明，是一种具有良好扩展性的设计。

在凭证中，包括三个角色：

*   凭证发放者Credential Issuer
    
*   凭证持有者Credential Holder
    
*   凭证验证者Credential Verifier
    

通常的工作流程中，由凭证发放者来发放凭证给持有者，然后交给Verifier（这里借用W3C did的图）

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

在Nym中，基于Coconut凭证技术，提出了自己的一套匿名凭证机制，它支持两个特性：

*   选择性披露：只披露凭证上的特定属性，比如我要证明我的姓名是什么，我只要出示我的姓名和相关的merkle path就可以了，不需要把整个凭证拿给别人看；再比如证明我的年龄大于18岁，我要出示相关零知识证明就可以了，而不用披露具体年龄。
    
*   不可追踪性：两个操作，无法被关联到同一个人身上，好比知乎上两个匿名帖子，你无法确定是不是同一个人发的。而放在凭证领域，是指任何关于凭证的操作，都无法被关联到同一个人。例如一个Issuer发放了一张凭证，Verifier来校验，即使它们合谋，也无法得知是不是对应的同一个。再比如，同一份凭证，一个Verifier验证两次，Verifier也不知道这两份凭证是不是同一个凭证。关于Coconut凭证，我还没有来得及阅读相关论文，所以在这里我也就不班门弄斧了。
    
*   可组合性：每个凭证还可以切分，比如我支付100刀给某个服务，某个观察者可以根据100这个数目，猜测出它要使用哪个服务。nym的凭证允许把凭证切割，比如切为两个50刀的凭证，以达到混淆效果。
    

一个凭证的内容包括如下字段：

*   Epoch：所属运行周期
    
*   Attribute Type：凭证类型，比如Bandwidth Credential
    
*   Attribue Value：凭证内容，比如100m
    
*   Secret Key：用户自己的随机数。如果多个凭证具有同一个secret，说明这些都是同一个人签发的，以支持可组合性。
    
*   Sectret Number：是这个凭证的唯一id
    

此外，凭证还要包含相关的证明。

了解了凭证的概念后，我们再来看一下凭证在nym中是怎么生成的。图例是一个身份证明的场景：

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

而对于带宽凭证，也是类似的：

1）用户先给nympool质押资金

2）用户生成相关证明（论文中没有描述，但我个人理解是merkle proof，或者是个合约中可查找的key），然后包在credential里

3）验证者节点验证凭证，对它进行签名。达到指定签名后就完成了验证，这个凭证得到验证。

5）用户可以对凭证进行随机化处理（参考coconut）

6）网关对凭证进行验证，主要是对签名进行校验。然后在链上标记为“已使用”。

### **信誉系统：PoM(Proof of mix)**

Nym网络需要每一个混合节点的工作进行“绩效评估”，从而得出每一个节点的服务质量，并以此为依据进行经济激励。在Tor时代，曾尝试对所有的包进行分析，但这样不具备工程实施的可能性。

Nym提出的方法，是一种采样的思路。Nym会向网络渗入一种特殊的采样包；由于加密每个混合节点由于无法区分出自己当前处理的包到底是常规的包还是采样包，也就没有办法“面向指标工作”，因而不得不认真处理每一个包。这好比，你在职场上，并不知道哪个需求是老板提的，因此不得不好好处理每个需求……

#### **采样包生成**

对于每一个随机数，Nym会采用可验证随机数。网络中的混合节点和普通用户都可以在epoch开始前提前大量生成采样包，其生成的方式如下：

1）  在epoch开始前，验证者区块链网络在epoch开始前，生成信标x

2）  采样生成器使用私钥和信标来得到随机数种子，和相关证明

3）  随机数种子确定性地生成sphinx包，包括延迟、路由路径等，均由这个随机数种子生成。

#### **采样包路由**

当混合节点在处理数据包的时候，把每次遇到的数据包的标签（类似于哈希值）都存在本地；这些标签将形成merkle tree，混合节点将在epoch结束时将把merkle root添加到链上。

#### **采样包揭示**

在epoch的时候，所有发过采样包的节点，都把自己的可验证随机数发布到区块链网络，任何人都可以在本地重现这些sphinx包。

接下来，每个混合节点查看哪些sphinx包要经过自己，然后把对应路由包的merkle proof提交给区块链。

问：发布sphinx，但不揭示，会如何？

答：那就不是采样包，对系统无影响

问：混合节点要是不提供sphinx包的merkle proof，会如何？

答：那就意味着丢包，扣钱。所以混合节点有动力去主动提交自己所有的merkle proof。

#### **服务质量评估**

现在我们知道了哪些包是采样包，并且经过了哪些路径，并且在哪里丢掉了，因此我们就拥有了评估的依据。在评估的时候，nym不会仅仅说某个节点没有提供merkle proof就认为是它的错，因为一个节点没有提供一个数据包，既有可能是自己把包丢弃了，也可能是上一个路由节点没有发送成功。因此nym必须从全盘的角度进行考虑。

nym在构建sphinx采样包的时候，会充分遍历网络中所有可能的路由组合，这样再来评估谁掉链子比较多，以此进行相对公平的评估。

### **经济模型**

#### **激励来源**

首先，nym的代币是通缩型代币，总量是固定的；但是随着特定事件的出现，将进行token的释放。

*   对于验证者，记账将得到奖励
    
*   对于网关，放行用户的带宽凭证，将得到奖励
    
*   对于混合节点，路由数据将获得奖励
    

这里主要说对于混合节点如何进行奖励。对混合网络的激励，主要源于两个部分：

*   mixmining：这是写在genisis中的初始token池，随季度释放，用以奖励混合节点。
    
*   手续费：用户使用系统前需要在nym中存入资产获取相关凭证，每次购买将扣除一部分手续费。
    

初始，mixmining将是激励的主要来源，后面随着用户越来越多，手续费将成为激励的主要来源。如果minminening耗光的话，需求突然下跌，有可能就没人支付这些节点了，整个网络就会衰退，因此手续费还会存一部分到应急池里，应对这类危机，使得即使需求暴跌，节点也有收入可赚。

#### **分配规则**

系统的目标是通过激励机制，达成一种均衡：

*   质押平均：每个节点的delegated stake（总共质押的资产，含自己和他人的）是一样的
    
*   收益平均：每个节点得到的激励是一样
    
*   信任均等：给节点的质押token，等于在社区中对他们的信任
    
*   善行有赏：路由的数量和质量越好，收益就越高
    
*   恶行有惩：
    
    *   underperform：节点低效服务，将被惩罚
        
    *   女巫攻击：一人分饰多节点，将被惩罚
        

整体来看，一个epoch结束后，总的分配额R由mixmining和积累的手续费构成。这些分配额将会用于奖励给各个节点，其中服务的流量、服务质量越高（上文PoM），分配的额度就越多；节点的收益，又会基于比例和一些调配参数，分配给节点运营者和它的担保人。

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

接下来我们具体看一下系统的分配规则。在开始之前，先定义几个符号：

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

因此，每个节点分配到的收益为：

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

其中σi= min{σi , 1/k} and λi = min{λi , 1/k}.

*   先把a设为0，公式看的更清楚，会发现基本上根据服务的质量PF和数目wi来分配
    
*   存在一个质押比例σi，但它是1/k的时候，同样力度的服务，收益将最大，少质押和多质押都将损失，比如σi超过1/k的话，并不会产生多余的收益。这个机制鼓励各个节点实现质押均摊，从而也使得收益均摊。
    
*   a越大，那么一个人想玩女巫攻击的话损失就越大，因为把资金拆分给各个节点所得总收益，比之于聚拢在一个节点上，差异越多
    

确定了每个节点的收益Ri后，来看下每个运营者分到的收益。在此之前，我们继续定义几个符号：

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

运营者的分配规则如下。在收益Ri中，路由过的这些包，路由它们产生的“过路费” PP(wi)都归运营者。剩下的收益中，节点还会根据PMi这个比例，再分走一份；最后，再剩余的比例中，再按自己质押的比例取走一份。

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

这里面有一个有趣的设定：PP(x)和PMi都是节点自己制定的，它们会发布到区块链上。Nym相信自由定价能带来均衡。比如PP或PMi设置的过高，导致运营者占有的分红越大，那么相应地，Stakers持有的就越少；Stakers就倾向于改为质押其他节点，从而降低了该运营者被选中的概率，以及Ri中的质押比例，从而产生损失。

最后，运营者剩下的部分，归Stakers，并按质押比例分配。

结语
==

本文回顾了匿名网络的发展和现状，如果您有任何问题，欢迎一起来探讨。

---

*Originally published on [Arc_Yuzhi](https://paragraph.com/@arc-yuzhi/6tsZToSLQ52XaNYyCRgM)*
