区块链投票系统概述

Posted lingjueXu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了区块链投票系统概述相关的知识,希望对你有一定的参考价值。

文章目录

前言

最近接到项目要做区块链投票系统,集中调研了下相关的知识,做这里做下简要的记录。区块链电子投票系统拆开看是两个问题:

  1. 什么是电子投票系统?
  2. 区块链能给电子投票系统带来什么?

什么是电子投票系统?

先来看第一个问题,什么是电子投票系统?根据维基百科-电子投票的定义:

电子投票,是一种投票设备,使用者直接按钮,就可以投票给自己所支持的候选人。
 
电子投票技术可以包括穿孔卡,光学扫描投票系统和专用投票亭(包括独立的直接记录电子投票系统或DRE)。它还可以涉及通过电话,私人计算机网络或互联网传送选票和投票。

以上可以看出,从投票地点的限制可以将电子投票分为两种:

  1. 在指定地点(比如投票站)通过指定设备进行投票
  2. 在任意地点通过互联网传送选票和投票

传统投票流程

可能有同学会问,为什么投票地点的限制要单独拿出来讲,这个很重要吗?先来看传统投票的过程。

传统投票都是在票站进行,主要分以下几个步骤

  1. 选民来到票站,首先进行身份验证并登记
  2. 领取选票,进入一个不受监控的隔间,打开信封,填写选票,并装回信封
  3. 将封好的选票投入一个透明的票箱
  4. 投票结束后,将票箱中选票进行充分混合,开始计票

传统投票的安全性

通常认为,投票过程有四个重要的安全要求,只有这些要求都被满足时,才能保证投票的安全:合法性、抗审查、秘密性、抗胁迫。可以总结为以下主要特征:

  • 秘密性(Confidentiality):除投票者自身外,其他人都不能知道他选票的内容。
  • 合法性(Eligibility):只有合法的投票者才能进行投票。
  • 唯一性(Uniqueness):每个合法的投票者只能投一票。
  • 公平性(Fairness):投票完成之前,任何人不能获知投票的结果,包括中间结果。
  • 无收据性(Receipt-Freeness):投票者不能向第三方证明自己选票的内容。
  • 匿名性(Anonymity):除投票者自身外,任何人都不能将某张选票与某个投票者
  • 可验证性(Verifiability):可以验证投票结果的正确性。
    联系起来。

对照上一节传统的投票流程:

  • 票站入口处的身份验证和验票时的有效性验证,保证了选票的合法性、唯一性
  • 选票的纸质存档保障了可验证性
  • 领取选票、填写、封口都在独立的、无监控不可拍照的隔间中进行,保障了匿名性
  • 开票前的票箱会被有意混淆,打乱其中选票顺序,保障了不能根据身份验证的顺序推导出投票的内容
  • 投票后无收据,无拍照,保障了抗胁迫性(无法向他人证明自己的投票内容)

电子投票的安全性

前面提到电子投票分两种,在指定地点(票站)投票和通过互联网投票。

  • 在指定地点投票与传统投票的区别只是取消了纸质投票,票站依然保留,选民只要在一个投票机上填写选票即可。但因为无纸质存档,安全性会变得更有挑战。美国和俄罗斯前几年都发生过大选投票系统被攻击的案例。同时如何向广大并无技术背景的选民证明系统的可靠性也是一大难题。
  • 互联网投票会让事情变得更加复杂。脱离了票站这个安全的物理环境,通过无收据性来保障无贿选和抗胁迫变得没有意义,选民可以通过设备录屏等方式变相取得投票的收据,胁迫投票也就变得可以实现。

所以为什么投票地点的限制要单独拿出来讲,因为这个真的有点无解。

电子投票做了些啥?

虽然有个目前无解的bug,但还是看下目前电子投票系统都做出来了些啥。需要了解以下知识:

  • 公钥密码
  • 同态加密(支持加法同态的 Paillier 算法)
  • 门限同态加密
  • 相同指数证明
  • 盲签名
  • 混合网络
  • 零知识证明
  • 单向散列函数
  • 数字证书

同时在传统投票系统的基础上,还对电子投票系统提出了新的要求:

  • 广义可验证性(Universal Verifiability):任何人都可以验证投票结果的正确性,
    包括非参与者。

概念不逐个展开写了,后面有空再补,大家感兴趣可以查一下。电子投票雏形源于Chaum于1981年提出的公钥密码体制,通过密码技术和计算机网络完成投票。1985年Cohen等提出了同态加密技术方案,构造电子投票,主要解决了匿名性和广义可验证性问题。同态加密技术成了构造电子投票的主要工具之一。Fujioka在1992年提出了著名的FOO92方案,引入了盲签名技术,解决电子投票的匿名性问题。无收据性概念是1995年Benaloh等人提出,用来解决买卖选票或者强迫投票等对投票活动有较大威胁的问题。Cramer使用门限同态加密、相同指数证明等技术试图构造一个同时满足广义可验证性和无收据性的方案,但是这个方案最终被证明并不满足无收据性。Lee在 Cramer 的方案基础上引入一个可信第三方作为验证者,使得改进后的方案满足无收据性,但是这个方案中的无收据性完全依赖于对可信第三方的高度信任。为了降低对可信第三方的信任依赖,研究者们设计了一些新的改进方案,利用多个实体共同参与相互监督的办法来分割权力。

总结一下就是大家想了许许多多密码学相关的算法来解决电子投票系统中需要的匿名性、广义可验证性、无收据性等问题。但是最终绕不过一个可信的第三方,为了解决这个问题,大家甚至想到了将第三方拆成了第三方们,提高了作弊的门槛。

区块链能给电子投票带来什么?

我理解区块链有三个主要技术:

  • p2p(peer to peer)
  • 链式结构
  • 共识算法

对应三个主要特点

  • 去中心化
  • 数据不可篡改
  • 数据公开可查

前面提到了电子投票系统的广义可验证性,可信的第三方,大家想到了啥?解决这个问题,妥妥的是区块链的强项呀!好,那接下来我们看区块链能给电子投票带来什么。

区块链天然适合用来做电子投票的公告板,所有数据上链为其带来广义可验证性以及不可篡改性。如果配合同态加密以及零知识证明算法等密码学技术,可以实现匿名的投票系统。下图展示了一种基于区块链匿名投票的详细流程,主要用到了RSA盲签名、Paillier算法,图中所有上传,指的是上传数据到区块链(摘自《基于区块链的匿名投票系统研究》,详细算法可参考原文3.3节,作者陈萍,2020)

我们的选择

看过以上的区块链投票方案后,结合国内的监管要求以及实际情况,我们决定不做完整意义上的区块链投票应用。从以下两个方面说明:

  • 强监管
    国家在大力发展区块链的同时,要求区块链应用可管可控(区块链技术可提高数据可信性和安全性),无论是腾讯的至信链,还是阿里的蚂蚁链,都不存在严格意义上的公链,都无法让用户通过个人钱包直接对链发起操作,都要通过企业或者开发者作为第三方中转进行上链操作,所以是伪去中心化,但是因为腾讯或阿里作为区块链技术提供方,分隔了第三方对链的直接操作,且用阿里或腾讯的信用作为背书,保障了可管可控模式下的不可篡改。

  • 无必要
    我们的投票应用主要用于小区业主进行表决,事项没必要做到无回执和完全匿名,可验证和可追溯是更重要的。无回执反而让用户觉得很奇怪,为什么我投了却看不到结果,教育成本会比较高。而且脱离了无保护的物理空间,无回执性变得没什么意义,录屏投票就可以变成新的取得回执手段。

  • 追溯门槛高
    向一个完全没有计算机和密码学基础的人解释如何在区块链上追溯和验证投票的正确性,基本上不可能。反而不如一个蚂蚁链发的可信存证证书来的实在,用户只要知道我的信息存证了,有证书、可验证。系统能做到能向监管机构证明,支持审计就可以了。

所以结合国内的区块链监管环境,我们选择用蚂蚁的可信存证链服务,虽然不是严格意义上的区块链投票,但是信息国内司法认可,用户对证书感知强烈,信息链上加密、不可篡改。

下图是我们的投票存证流程示例:

通过以上流程,做到了决议内容、投票人员、投票内容、投票结果全部上链存证。上链文件内容可通过文件原文和存证Hash到支付宝平台做验证,示例如下:

验证示例

遗留问题

  1. 国内在以太坊链上建应用合法吗?

以太坊开发完整去中心化应用 —— 区块链投票系统

第一节 课程概述

本课程面向初学者,内容涵盖以太坊开发相关的基本概念,并将手把手地教大家如何构建一个 基于以太坊的完整去中心化应用 —— 区块链投票系统。

 
技术分享图片
ethereum logo

通过本课程的学习,你将掌握:

  • 以太坊区块链的基本知识

  • 开发和部署以太坊合约所需的软件环境

  • 使用高级语言(solidity)编写以太坊合约

  • 使用NodeJS编译、部署合约并与之交互

  • 使用Truffle框架开发分布式应用

  • 使用控制台或网页与合约进行交互

前序知识要求

为了顺利完成本课程,最好对以下技术已经有一些基本了解:

  • 一种面向对象的开发语言,例如:Python,Ruby,Java...

  • 前端开发语言:HTML/CSS/JavaScript

  • Linxu命令行的使用

  • 数据库的基本概念

课程的所有代码均已在Ubuntu(Trusty、Xenial)和 macOS 上测试过。

第二节 课程简介

在本课程中,我们将会构建一个去中心化的(Decentralized)投票应用。利用这个投票应用, 用户可以在不可信(trustless)的分布环境中对特定候选人投票,每次投票都会被记录在区块 链上:

 
技术分享图片
 
所谓去中心化应用(DApp:Dcentralized Application),就是一个不存在中心服务器 的应用。在网络中成百上千的电脑上,都可以运行该应用的副本,这使得它几乎不可能 出现宕机的情况。

基于区块链的投票是完全去中心化的,因此无须任何中心化机构的存在。

第三节 开发迭代

本课程将涵盖应用开发的整个过程,我们将通过三次迭代来渐进地引入区块链应用 开发所涉及的相关概念、语言和工具:

 
技术分享图片
voting dapp iteration
  • Vanilla:在第一个迭代周期,我们不借助任何开发框架,而仅仅使用NodeJS来进行应用开发, 这有助于我们更好地理解区块链应用的核心理念。

  • Truffle:在第二个迭代周期,我们将使用最流行的去中心化应用开发框架Truffle进行开发。 使用开发框架有助于我们提高开发效率。

  • Token:在第三个迭代周期,我们将为投票应用引入代币(Token) —— 现在大家都改口 称之为通证了 —— 都是ICO惹的祸。代币是公链上不可或缺的激励机制,也是区块链 应用区别于传统的中心化应用的另一个显著特征。

为什么选择投票应用作为课程项目?

之所以选择投票作为我们的第一个区块链应用,是因为集体决策 —— 尤其是投票机制 —— 是以太坊的 一个核心的价值主张。

另一个原因在于,投票是很多复杂的去中心化应用的基础构件,所以我们选择了投票应用作为学习区块链 应用开发的第一个项目。

第四节 初识区块链

如果你熟悉关系型数据库,就应该知道一张数据表里可以包含很多行数据记录。例如,下面的数据表中 包含了6条交易记录:

 
技术分享图片
 

本质上,区块链首先就是一个分布式(Distributed)数据库,这个数据库维护了一个不断增长的记录列表。 现在,让我们对数据进行批量(batch)存储,比如每批 100 行,并将各存储批次连接起来,是不是就像一条链?

 
技术分享图片
 

在区块链里,多个数据记录组成的批次就被称为块(block),块里的每一行数据记录就被称为交易(transaction):

 
技术分享图片
basic blockchain

最开始的那个块,通常被称为创世块(genesis block),它不指向任何其他块。

不可篡改性

区块链的一个显著特点是,数据一旦写入链中,就不可篡改重写。

在传统的关系型数据库中,你可以很容易地更新一条数据记录。但是,在区块链中,一旦数据写入就无法 再更新了 —— 因此,区块链是一直增长的。

那么,区块链是如何实现数据的不可篡改特性?

这首先得益于哈希(Hash)函数 —— 如果你还没接触过哈希函数,不妨将它视为一个数字指纹的计算函数: 输入任意长度的内容,输出定长的码流(指纹)。哈希函数的一个重要特性就是,输入的任何一点微小变化,都会 导致输出的改变。因此可以将哈希值作为内容的指纹来使用。 你可以点击这里进一步了解哈希函数。

由于区块链里的每个块都存储有前一个块内容的哈希值,因此如果有任何块的内容被篡改,被篡改的块之后 所有块的哈希值也会随之改变,这样我们就很容易检测出区块链的各块是否被篡改了。

去中心化的挑战

一旦完全去中心化,在网络上就会存在大量的区块链副本(即:全节点),很多事情都会变得比之前中心化 应用环境复杂的多,例如:

  • 如何保证所有副本都已同步到最新状态?

  • 如何保证所有交易都被广播到所有运行和维护区块链副本的节点计算机上?

  • 如何防止恶意参与者篡改区块链

  • ......

在接下来的课程中,通过与经典的C/S架构的对比,我们将逐步理解去中心化应用的核心思路, 并掌握如何构建以太坊上的去中心化应用。

第五节 C/S架构以服务器为中心

理解去中心化应用架构的最好方法,就是将它与熟悉的Client/Server架构进行对比。如果你是一个web开发者, 应该对下图很了解,这是一个典型的Client/Server架构:

 
技术分享图片
 

一个典型web应用的服务端通常由 Java,Ruby,Python 等等语言实现。前端代码由 HTML/CSS/JavaScript 实现。 然后将整个应用托管在云端,比如 AWS、Google Cloud Platform、Heroku....,或者放在你租用的一个VPS 主机上。

用户通过客户端(Client)与 web 应用(Server)进行交互。典型的客户端包括浏览器、命令行工具(curlwget等)、 或者是API访问代码。注意在这种架构中,总是存在一个(或一组)中心化的 web 服务器,所有的客户端都需要 与这一(组)服务器进行交互。当一个客户端向服务器发出请求时,服务器处理该请求,与数据库/缓存进行交互, 读/写/更新数据库,然后向客户端返回响应。

这是我们熟悉的中心化架构。在下一节,我们将会看到基于区块链的去中心化架构的一些显著区别。

第六节 去中心化架构——彼此平等的节点

下图给出了基于以太坊的去中心化应用架构:

 
技术分享图片
 

你应该已经注意到,每个客户端(浏览器)都是与各自的节点应用实例进行交互,而不是向 一个中心化的服务器请求服务。

在一个理想的去中心化环境中,每个想要跟DApp交互的人,都需要在他们的计算机或手机上面运行 一个的完整区块链节点 —— 简言之,每个人都运行一个全节点。这意味着,在能够真正使用一个 去中心化应用之前,用户不得不下载整个区块链。

不过我们并非生活在一个乌托邦里,期待每个用户都先运行一个全节点,然后再使用你的应用是不现实的。 但是去中心化背后的核心思想,就是不依赖于中心化的服务器。所以,区块链社区已经出现了 一些解决方案,例如提供公共区块链节点的Infura, 以及浏览器插件Metamask等。通过这些方案, 你就不需要花费大量的硬盘、内存和时间去下载并运行完整的区块链节点,同时也可以利用去中心化 的优点。我们将会以后的课程中对这些解决方案分别进行评测。

第七节 以太坊——世界计算机

以太坊是一种区块链的实现。在以太坊网络中,众多的节点彼此连接,构成了以太坊网络:

 
技术分享图片
ethereum

以太坊节点软件提供两个核心功能:数据存储、合约代码执行。

在每个以太坊全节点中,都保存有完整的区块链数据。以太坊不仅将交易数据保存在链上,编译后 的合约代码同样也保存在链上。

以太坊全节点中,同时还提供了一个虚拟机来执行合约代码。

交易数据

以太坊中每笔交易都存储在区块链上。当你部署合约时,一次部署就是一笔交易。当你为候选者投票时,一次投票 又是另一笔交易。所有的这些交易都是公开的,每个人都可以看到并进行验证。这个数据永远也无法篡改。

为了确保网络中的所有节点都有着同一份数据拷贝,并且没有向数据库中写入任何无效数据,以太坊 目前使用工作量证明 (POW:Proof Of Work)算法来保证网络安全,即通过矿工挖矿(Mining)来达成共识(Consensus)—— 将数据同步到所有节点。

工作量证明不是达成共识的唯一算法,挖矿也不是区块链的唯一选择。现在,我们只需要了解,共识是指各节点 的数据实现了一致,POW只是众多用于建立共识的算法中的一种,这种算法需要通过矿工的挖矿来实现非可信环境下的 可信交易。共识是目的,POW是手段。

合约代码

以太坊不仅仅在链上存储交易数据,它还可以在链上存储合约代码。

在数据库层面,区块链的作用就是存储交易数据。那么给候选者投票、或者检索投票结果的逻辑放在哪儿呢? 在以太坊的世界里,你可以使用Solidity语言来编写业务逻辑/应用代码(也就是合约:Contract), 然后将合约代码编译为以太坊字节码,并将字节码部署到区块链上:

 
技术分享图片

编写合约代码也可以使用其他的语言,不过 Solidity是到目前为止最流行的选择。

以太坊虚拟机

以太坊区块链不仅存储数据和代码,每个节点中还包含一个虚拟机(EVM:Ethereum Virtual Machine)来执行 合约代码 —— 听起来就像计算机操作系统。

事实上,这一点是以太坊区别于比特币(Bitcoin)的最核心的一点:虚拟机的存在使区块链迈入了2.0 时代,也让区块链第一次成为应用开发者友好的平台。

JS开发库

为了便于构建基于web的DApp,以太坊还提供了一个非常方便的JavaScript库web3.js,它封装了以太坊节点的API 协议,从而让开发者可以轻松地连接到区块链节点而不必编写繁琐的RPC协议包。所以,我们可以在常用的JS框架 (比如 reactjs、angularjs 等)中直接引入该库来构建去中心化应用:

 
技术分享图片
 
 
技术分享图片
 

我的微信:

 
技术分享图片
 

PC端课程地址:

http://xc.hubwiz.com/course/5a952991adb3847553d205d1?affid=cnblog1

以上是关于区块链投票系统概述的主要内容,如果未能解决你的问题,请参考以下文章

以太坊开发完整去中心化应用 —— 区块链投票系统

以太坊 DApp 开发入门实战! 用Node.js和truffle框架搭建——区块链投票系统!

基于区块链的投票系统的设计与实现

俄罗斯在Waves区块链上试行联邦投票

免费下载全套最新04区块链投票系统视频教程+教学资料+学习课件+源代码+软件开发工具

基于区块链的投票系统的设计与实现之环境的搭建