草庐IT

区块链投票系统概述

lingjueXu 2023-04-12 原文

文章目录

前言

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

  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. 国内在以太坊链上建应用合法吗?

有关区块链投票系统概述的更多相关文章

  1. 电脑0x0000001A蓝屏错误怎么U盘重装系统教学 - 2

      电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。  准备工作:  1、U盘一个(尽量使用8G以上的U盘)。  2、一台正常联网可使用的电脑。  3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。  4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。  U盘启动盘制作步骤:  注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注

  2. 区块链之加解密算法&数字证书 - 2

    目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非

  3. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  4. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  5. 阿里云RDS——产品系列概述 - 2

    基础版云数据库RDS的产品系列包括基础版、高可用版、集群版、三节点企业版,本文介绍基础版实例的相关信息。RDS基础版实例也称为单机版实例,只有单个数据库节点,计算与存储分离,性价比超高。说明RDS基础版实例只有一个数据库节点,没有备节点作为热备份,因此当该节点意外宕机或者执行重启实例、变更配置、版本升级等任务时,会出现较长时间的不可用。如果业务对数据库的可用性要求较高,不建议使用基础版实例,可选择其他系列(如高可用版),部分基础版实例也支持升级为高可用版。基础版与高可用版的对比拓扑图如下所示。优势 性能由于不提供备节点,主节点不会因为实时的数据库复制而产生额外的性能开销,因此基础版的性能相对于

  6. ruby - 在没有基准或时间的情况下用 Ruby 测量用户时间或系统时间 - 2

    因为我现在正在做一些时间测量,我想知道是否可以在不使用Benchmark类或命令行实用程序time的情况下测量用户时间或系统时间。使用Time类只显示挂钟时间,而不显示系统和用户时间,但是我正在寻找具有相同灵active的解决方案,例如time=TimeUtility.now#somecodeuser,system,real=TimeUtility.now-time原因是我有点不喜欢Benchmark,因为它不能只返回数字(编辑:我错了-它可以。请参阅下面的答案。)。当然,我可以解析输出,但感觉不对。*NIX系统的time实用程序也应该可以解决我的问题,但我想知道是否已经在Ruby中实

  7. ruby - 以毫秒为单位获取当前系统时间 - 2

    在Ruby中,以毫秒为单位获取自纪元(1970)以来的当前系统时间的正确方法是什么?我试过了Time.now.to_i,好像不是我想要的结果。我需要结果显示毫秒并且使用long类型,而不是float或double。 最佳答案 (Time.now.to_f*1000).to_iTime.now.to_f显示包含十进制数字的时间。要获得毫秒数,只需将时间乘以1000。 关于ruby-以毫秒为单位获取当前系统时间,我们在StackOverflow上找到一个类似的问题:

  8. ruby-on-rails - 如何构建复杂的 Rails 系统 - 2

    关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭8年前。Improvethisquestion我们有以下(以及更多)系统,我们将数据从一个应用推送/拉取到另一个:托管CRM(InsideSales.com)Asterisk电话系统(内部)横幅广告系统(openx,我们托管)潜在客户生成系统(自行开发)电子商务商店(spree,我们托管)工作板(本土)一些工作网站抓取+入站工作提要电子邮件传送系统(如Mailchimp,自主开发)事件管理系统(如eventbrite,自主开发)仪表板系统(大量图表和

  9. ruby-on-rails - Rails 3,在RAILS_ROOT上方显示来自本地文件系统的jpg图片 - 2

    我正在尝试找出一种方法来显示来自不在RAILS_ROOT下(在RedHat或Ubuntu环境中)的已安装文件系统的图像。我不想使用符号链接(symboliclink),因为这个应用程序实际上是通过Tomcat部署的,而当我关闭Tomcat时,Tomcat会尝试跟随符号链接(symboliclink)并删除挂载中的所有图像。由于这些文件的数量和大小,将图像放在public/images下也不是一种选择。我查看了send_file,但它只会显示一张图片。我需要在一个格式良好的页面中显示6个请求的图像。由于膨胀,我宁愿不使用Base64编码,但我不知道如何将图像数据与呈现的页面一起传递下去。

  10. ruby - 我可以从 Ruby 中的系统调用中获得连续输出吗? - 2

    当您在Ruby脚本中使用系统调用时,您可以像这样获得该命令的输出:output=`ls`putsoutput这就是thisquestion是关于。但是有没有办法显示系统调用的连续输出?例如,如果您运行此安全复制命令,以通过SSH从服务器获取文件:scpuser@someserver:remoteFile/some/local/folder/...它显示随着下载进度的连续输出。但是这个:output=`scpuser@someserver:remoteFile/some/local/folder/`putsoutput...不捕获该输出。如何从我的Ruby脚本中显示正在进行的下载进度?

随机推荐