# 以太坊分布式验证者规范

By [EthereumCN](https://paragraph.com/@ethereumcn-2) · 2022-04-18

---

来源：[github.com/ethereum](https://github.com/ethereum/distributed-validator-specs)

作者：[Aditya Asgaonkar](https://github.com/adiasg)

分布式验证者 (Distributed Validators, DV) 是一种将一个以太坊验证者的工作分配给一组分散节点的技术，以提高与在一个单一机器上运行一个验证者客户端相比的韧性 (安全性、活性，或两者兼有)。

引介
--

### 动因

#### 传统的验证者客户端设置

以太坊验证者通过用他们的质押私钥对消息签名 (例如区块或证明) 来参与[权益证明 (PoS) 协议](https://github.com/ethereum/consensus-specs)。质押私钥只能通过客户端软件来访问，客户端根据分配给验证者的职责安排消息的创建和签名。传统的验证者客户端设置会有一些风险：

*   质押私钥存在一个地方。如果一个攻击者获得了这个密钥，它可以创建冲突的消息，从而导致验证存款被罚没。
    
    *   不运行自己的验证者的质押者需要把他们的质押私钥交给运营商。为了保证他们质押私钥的安全，他们必须信任该运营商。
        
*   如果验证者客户端软件不能创建及时的消息以履行验证者职责，该验证者会遭受怠工惩罚 (inactivity)，余额会减少。
    
    *   这可能是由于软件崩溃、断网、硬件故障等原因造成的。
        
*   如果验证者客户端连接的信标节点出现故障，验证者可能跟在一个少数节点所在的分叉上，导致在 PoS 协议的其他部分显示是离线状态。
    

#### 分布式验证者协议

分布式验证者协议提供了一个解决方案，以减轻与传统的单个验证者设置相关的风险与担忧。此外，该协议还可以用来实现先进的质押设置，例如去中心化的质押池。

### 基本概念

**请注意**：请参考[词汇表](https://github.com/ethereum/distributed-validator-specs/blob/dev/glossary.md)，了解分布式验证者规范中引入的新术语的解释。（译者注：见文末）

分布式验证者背后的两个基本概念是：

*   **共识**：单个验证者的职责被分给几个共同验证者 (co-validator) ，他们必须协作，在对任何消息签名之前就如何投票达成一致。
    
*   **M-of-N 门限签名 (threshold signatures)**：验证者的质押私钥被分割为 N 个部分，每个共同验证者持有一个 share 。当至少有 M 个共同验证者对如何投票达成共识时，他们分别用各自的 share 来对消息签名，一个组合签名可以由这些 share 重构出来。
    

PoS 以太坊使用的是 BLS 签名方案，其中私钥可以使用 _M-of-N_ 秘密共享技术 (使用 Shamir's Secret Sharing 方案)，以实现 M-of-N 门限签名。

(译者注：Shamir's Secret Sharing 被用于以分布式的方式来保护秘密。秘密被分割为多个部分，这些部分被称为 share， 这些 share 可以用来重构原来的秘密。而通过 Shamir's Secret Sharing 解密需要一个最低数量的 share，被称为门限。)

通过把一个合适的 (偏重于安全性的) 共识算法和一个 M-of-N 门限签名方案组合起来，这个 DV 协议确保共识是得到密码学保证的，且至少有 M 个共同验证者对任何决定达成一致。

### 资源

#### 实现

以下是分布式验证者技术的现有实现 (但不一定是本规范的实现)。

*   `python-ssv`：Python 中分布式验证者协议实现的概念证明，与[以太坊客户端 Prysm](https://github.com/prysmaticlabs/prysm) 交互。
    
*   `ssv`：分布式验证者协议的 Go 实现，与[以太坊客户端 Prysm](https://github.com/prysmaticlabs/prysm) 交互。
    

#### 文档

*   [分布式验证者架构视频介绍](https://www.youtube.com/watch?v=awBX1SrXOhk)
    

### 总体架构

![General Architecture](https://storage.googleapis.com/papyrus_images/3a34892eafc5c43ecc94f1258171f0dbfd3b5ee701fb34d4471108bd587fc380.png)

General Architecture

本规范提出一种实现分布式验证者客户端 (Distributed Validator Client, DVC) 软件的方法，作为信标节点和一个远程签名者 ([Remote Signer](https://github.com/ConsenSys/web3signer), RS) 之间的中间件：

*   信标节点和远程签名者之间的所有通信都由 DVC 管理，以便它能提供额外的分布式验证者功能。
    
*   信标节点和远程签名者不知道 DVC 的存在，也就是说，它们以为彼此像往常一样相互连接。
    

### 假设

*   我们假设总共有 N 个节点，以及一个 M-of-N 门限签名方案。
    
    *   为了与拜占庭容错共识协议兼容，我们假设 `M = ceil(2 * N / 3)`。
        
*   本规范假设[某种基于领袖的、偏重安全性的共识协议](https://github.com/ethereum/distributed-validator-specs/blob/dev/src/dvspec/consensus.py)，让共同验证者选定相同的证明/区块进行签名。我们假设共识协议在 M 个正确节点下成功运行，且在 N 个总节点中不超过 `F = (N-1)/3` 个拜占庭节点和不超过 `N - M - F` 防失败节点 (fail-stop node)。(译者注：拜占庭节点指的是在网络里故意撒谎或误导其他节点的背叛节点。)
    
*   我们假设验证者客户端安全运行的通常前提条件包括最新的抗罚没数据库、正确的系统时钟等。
    
*   我们暂时不考虑对“正确”以太坊分叉的投票——这个功能将在未来的更新里加上。
    

### 理想的保证

*   安全性 (防止密钥被盗)：
    
    *   除非 N 个共同验证者中有多于 M 个验证者的安全受到影响，否则质押者私钥是安全的。
        
*   安全性 (防止罚没)：
    
    *   在异步网络的假设下，除非多于三分之一的共同验证者成了背叛者，否则验证者永远不会被罚没。
        
    *   在同步网络的假设下，除非多于三分之二的共同验证者成了背叛者，否则验证者永远不会被罚没。
        
*   **活性**：在部分同步的网络里，除非多于三分之一的共同验证者成了叛徒，否则协议最终都会产生一个新的证明/区块。
    

规范
--

关于规范的技术细节描述在 `src/dvspec/` : [https://github.com/ethereum/distributed-validator-specs/blob/dev/src/dvspec。](https://github.com/ethereum/distributed-validator-specs/blob/dev/src/dvspec%E3%80%82)

词汇表
===

### 以太坊概念

*   **验证者**：参与权益证明以太坊验证的公钥。在阶段 0，验证者预期会为信标链区块履行证明和区块提议的职责。
    
*   **验证者客户端 (Validator Client, VC)**：履行验证者职责的软件。VC 能访问验证者的私钥。
    
*   **远程签名者 (RS)**：负责以太坊私钥管理的软件，特别是用于对以太坊消息 (例如区块、证明等) 的签名。RS 运行一个服务器，用于接受传入的对该类消息签名的请求。
    

### 密码学概念

*   **私钥分片 (Key Share)**：作为门限签名方案一部分的单个密钥。
    
*   **签名分片 (Signature Share)**：对来自单个私钥 share 的一些数据的签名。多个这样的签名 share 需要组合起来生成一个完整的签名。
    

### 分布式验证者概念

*   **分布式验证者 (DV)**：一组参与者共同履行一个验证者的职责。验证者的私钥在多个参与者中是秘密共享的，因此在没有参与者的一定多数门限下，一个完整的签名是无法形成的。
    
*   **共同验证者 (Co-Validator)** ：参与 DV 协议成为一个特定验证者的 BLS 公钥门限验证者。
    
*   **分布式验证者客户端 (DVC)**：通过运行 DV 协议 (或者，作为多个共同验证者来参与，每个共同验证者身份与不同的验证者相关联）参与成为一个共同验证者的软件。DVC 能访问共同验证者的私钥，即所对应的验证者的秘密共享门限私钥。
    

### 实例

使用上述术语的实例说明：

*   公钥为 `0xa5c91...` 的以太坊验证者作为一个分布式验证者在运行。
    
*   有 4 个共同验证者参与到验证者 `0xa5c91...` 的分布式验证者中。
    
*   与 `0xa5c91...` 相关联的私钥在 4 个共同验证者中使用 3-of-4 的秘密共享方案来拆分，这样就建立了一个 3-of-4 的门限签名方案。
    
    *   更简单地说，`0xa5c91...` 的私钥被拆分为 4 份，每一份由共同验证者中一名来托管，这样必须至少有共同验证者中的三名合作才能从 `0xa5c91...` 产生一个签名。
        
*   每个共同验证者都在运行分布式验证者客户端软件来参与分布式验证者。
    

ECN的翻译工作旨在为中国以太坊社区传递优质资讯和学习资源，文章版权归原作者所有，转载须注明原文出处以及ethereum.cn，若需长期转载，请联系[eth@ecn.co](http://mailto:eth@ecn.co/)进行授权。

---

*Originally published on [EthereumCN](https://paragraph.com/@ethereumcn-2/bhpSlkSdlRLXwCXa5f6d)*
