# 索赔证明解释：第 1 部分 - 选举算法

By [Untitled](https://paragraph.com/@0x5ad5e73573bacec3095ba78d5d600e6d152e79e8) · 2023-02-20

---

2 月 8 日星期三，我们向全世界介绍了 VRRB。反响令人难以置信，许多人问我们索赔证明 (PoC) 是什么，它是如何工作的。首先，关于 PoC 的一些事情，它既是选举算法的名称，也是 VRRB 共识算法的名称，选举算法是其中不可或缺的一部分。

当我们将 PoC 称为选举时，我们通常会说“索赔证明选举”，我们将在这个由多个部分组成的系列文章中坚持这一点。第一篇文章是关于选举、它们在 VRRB 共识中的作用以及与其他选举算法相比的索赔证明的原因。

选举这个词来自古拉丁词eligere，意思是“挑选出来”或“选择”。选举的发生有各种各样的原因，从选择你的家人晚餐吃什么，你和你的朋友会去哪个酒吧，到选择治理组织的领导者。在共同运行和管理程序的计算机网络中进行的选举并没有什么不同。

选举在整个分布式和去中心化系统中被用作共识机制的一个组成部分，如果不是核心组成部分的话。选举也存在于其他区块链共识算法中。股权证明和工作证明只是领导人选举的形式。在这两种情况下，都会选择一个节点来提议交易块，然后其他节点会验证这些交易。

来自民选节点的拟议块可以被其他节点拒绝，也可以接受。在工作量证明的情况下，节点在本地决定它们是否将成为给定回合的领导者。然后节点使用简单多数来确定块是否已确认，每个节点检查每个事务的有效性以及块中的其他数据。

在以太坊权益证明下，“协议”选出提出区块的验证者，然后其他验证者对区块的有效性进行加权投票，包括区块中包含的所有交易，权重由区块的大小决定他们的股份。需要加权多数来确认给定的块。

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

索赔证明选举的工作方式不同，而不是依赖于“协议”，在 PoC 选举中，本地节点运行 PoC 选举算法并确定它是否已被选举，类似于在 PoW 网络中，节点执行“在当地工作”。然而，与 PoS 区块生成器选举一样，选举是随机的，而不是由给定节点的计算能力决定的。（更多关于 PoC、PoW 和 PoS 之间的差异，将在本系列的后续部分中介绍）。

有了这个高层次的概述，让我们深入研究一些组成部分，这样我们就可以回到这个概念，更好地理解这些选举是如何运作的。

索赔 什么是索赔？

claim 一词在英语中用作名词时，有许多可能有些相关的定义，但在与其使用方式相关的上下文中有一些关键差异。出于 VRRB PoC 选举的目的，我们在这里感兴趣的定义如下。

对某物的权利或所有权。

VRRB 网络中的每个共识参与节点都有一个声明。在 VRRB 网络中，声明到底是什么？它只是一个带有一些特定字段的自定义数据结构，允许网络的其余部分知道它确实有效。让我们看一下它在模块中的样子vrrb\_core/claim。

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

该声明被构建为structRust 编程语言中的自定义数据类型，它允许我们组合许多不同的类型，包括潜在的其他结构和自定义数据类型。VRRB Claim 结构非常简单。它有字段（为简洁起见，其中一些已被省略），其中大部分是标准数据类型，例如String和u128或bool类型。为了选举，重要的是字段hash，它是节点信息的嵌套 SHA256 哈希的十六进制字符串表示形式。节点信息被散列n次，其中n是 10( nonce+1)。

当一个节点加入网络时，它会向网络的其余部分提交它的声明，一旦声明在一个块中得到验证和确认，并因此保存到状态，声明就有资格参加采矿选举，如果它包括所需的最低要求给定节点的股份，有资格参加验证者法定人数选举。

现在声明已保存在网络状态中，网络中的其他节点可以在本地运行选举时包含它。对于矿工选举，总是只有 1 个获胜者。对于法定人数选举，根据验证者节点的数量，每个法定人数有 10 到 50 名获胜者。

那么当 a 节点运行选举时会发生什么？

    impl  Claim { 
          ... 
    
        pub  fn  get_pointer_sum (& self , block_seed: u64 ) ->  Option < u128 > { 
            
            // 将数字转换为十六进制字符串
            let  block_seed_hex = format! ( "{block_seed:x}" ); 
            
            // 初始化一个空向量以保存每个匹配字符的“指针” 
            // 值。
            让 mut指针= vec！[]; 
          
            // 遍历块种子字符串 block_seed_hex 中的所有字符
            。字符()。枚举（）。for_each (|(idx, c)| { 
                
                // 在散列中搜索相同的字符并检索//
                索引位置
                let  res = self .hash.find (c); // 如果有匹配项，则将其提升到索引的幂// 当前字符在块种子中的位置if let Some (n) = res { let n = n as u128 ; let n = n.checked_pow (idx as u32 ); // 如果没有整数溢出，将其推入我们之前初始化的向量中
                
                
                
                  
    
                      
                      
                    
                    
                    
                    如果 让 Some (n) = n {
                        指针。推（n）；
                    } 
    
                } else { 
    
                    // 如果没有找到匹配项，则提前返回，当前节点
                    // 有一个不符合本轮资格的声明
                    return  None
                 } 
            }); 
            
            // 将指针中的值相加
                let  pointer_sum : u128 = pointers. 迭代器（）。求和（）；
                一些(pointer_sum) 
        } 
    
        ... 
    }
    

在 Rust 中，a`struct`可以在所谓的`impl`块中实现方法。您在上面的代码块中看到的是在结构`get_pointer_sum`上实现的方法`Claim`。该方法采用无符号整数，最多 64 位（下一个块种子的最大大小）。64 位数字首先转换为十六进制字符串。然后将字符串的长度（字符数）保存在单独的变量中，以便稍后在方法中进行验证。然后初始化一个空向量来保存数据。

然后，迭代十六进制块种子字符串中的字符，并且对于每个字符，在结构`hash`的字段中搜索相同的字符`Claim`。如果找到匹配项，则将散列中字符的索引位置提升为字符在中的索引位置的幂，并将`block_seed`结果保存到我们之前初始化的那个向量中。

如果任何字符_不_匹配，即并非种子中的所有字符也在声明散列中，则声明不符合当前选举的资格。该节点将不得不等到下一轮。

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

如果它们匹配，我们还有一些工作要做。接下来我们对向量中的所有值求和，然后返回求和值。这是计算对单个节点进行选举所需的值的过程。

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

然后对符合当前选举条件的每个节点重复此过程（用于矿工选举的挖掘节点、用于仲裁选举的验证节点、用于解决冲突的提议者）。虽然这看起来工作量很大，但由于区块种子的最大长度较短（16 个字符）和声明哈希的固定长度较短（64 个字符），所以速度相当快。如果需要，该算法可以同时运行在网络中的每个声明上，以进一步优化速度。

要阅读索赔证明选择的更详细技术说明，请查看[VRRB 白皮书](https://www.vrrb.io/whitepaper)。

待续
--

关于作者 CAIA 的 Andrew N. Smith 是 VRRB Labs, Inc. 的创始人，并且是两次创始人、强大的激励者和领导者。在他的第一家初创公司中，Andrew 作为唯一的工程师和数据科学家花了 5 年的时间构建了机器学习和深度学习模型的完整堆栈。Andrew 开始研究 VRRB，发明了索赔证明并一手构建了 VRRB 原型。Andrew 对 VRRB 的愿景是不仅提供更好、更去中心化、安全和稳定的区块链、加密货币和智能合约平台，而且通过为开发者提供最全球灵活、可扩展、可组合的智能合约平台。

关于 VRRB Labs, Inc. VRRB Labs 是一家开发创新区块链协议 VRRB 的开发公司。VRRB 是一种快速、可扩展的第 1 层，建立在一种称为索赔证明的新型共识机制之上。VRRB 旨在通过将“构建、运输、运行”DevOps 引入 Web3 及其隔离的、可组合的智能合约容器，以及一个 unikernel VM，使开发人员能够使用他们选择的语言进行构建，从而使开发人员体验顺畅。

---

*Originally published on [Untitled](https://paragraph.com/@0x5ad5e73573bacec3095ba78d5d600e6d152e79e8/1)*
