eVote 将选举添加到邮件列表

作者:Marilyn Davis

一个用于保存投票的专用数据库服务器,结合会议系统,可以为真正的非等级民主制度创造媒介(参见“理想民主制度侧边栏”)。管理投票系统的工作将由用户和软件分担,而不是系统管理员。当解决问题的正确架构出现在我脑海中时,我不再仅仅是电子民主的倡导者;我构建了它。

理想的民主制度包括讨论和投票

专用的投票服务器 Clerk 使用 C++ 编写,为投票者提供了许多功能。任何人都可以发起投票,用户可以在投票开放期间更改他们的投票。投票也可以是公开的,允许所有参与者查看彼此的投票;私有的;或 if_voted 类型的,允许我们知道谁投了票,但不知道他们如何投票。支持多种投票类型:是/否、数字和分组。通过扩展现有类,可以轻松增强该软件以添加新功能和投票类型。Clerk 动态维护数据,无需管理员的帮助。正如面向对象架构所承诺的那样,每增加一项新功能,代码都变得更加健壮。

投票

投票是动态的。当用户关闭她的投票并将其从会议中删除,并且当软件空闲时,投票会被折叠,将其他项目的存储字节向上滚动,并为新的投票腾出空间。项目对象重新计算它们在投票中的新位置,并且一切都设置为继续进行,而无需管理员的任何干预。

Clerk 与投票者的沟通

Clerk 的 main() 函数是一个无限循环,它监视来自 eVote 客户端(即具有实时投票用户的用户界面进程)的进程间通信消息传递工具上的传入消息。Clerk 有一个永久消息队列,用于接收来自用户的传入请求,它由 InQ 类的单个实例管理。每个 eVote 进程都有自己的临时消息队列,用于接收来自 Clerk 的消息。这些是 OutQ 类的实例化。

共享内存

虽然关于投票的统计信息和投票者请求的个人信息通过 OutQ 对象进行通信,但另一种进程间通信工具——共享内存——用于传输慢速移动的数据。投票项目列表及其属性存储在共享内存中,以便当前在同一会议中活跃的所有 eVote 客户端都可以看到它们。投票项目的属性可能包括:公开、私有或 if_voted(用户可以看到其他投票者是否已投票,但看不到他如何投票);是/否或数字;可见或隐藏(统计信息仅在投票结束后才可用);单选或分组;以及标题。

会议的 ItemList 对象负责维护共享内存。当为会议创建新投票时,如果不断增长的投票项目列表需要新的共享内存块,则会向所有活跃的 eVote 客户端发送消息。这种动态通知功能使投票者能够实时进行会议。

数据文件

Clerk 为每个会议或电子邮件列表保留三个数据文件,以及一个列出所有电子邮件地址和相应数字 ID 的总体数据文件。对于示例电子邮件列表,BallotBox 对象保留一个 sample.dat 文件,其中包含按投票者数字 ID 键控的当前投票。BallotBox 还保留 sample.bnf,其中包含指向 sample.dat 的哈希值和一些方便的统计信息。ItemList 对象维护一个 sample.inf 文件,该文件存储项目到投票的当前映射。

eVote(用户界面)将请愿书的签名和评论保存在平面文件中,每个请愿书一个文件。

用户界面

目前,Clerk 有两个用户界面,并欢迎更多。Clerk 的第一个用户界面是一个简单的基于文本的 Telnet 界面,专为会议系统和 BBS 设计。

互联网的爆炸式增长削弱了人们对会议系统的热情。电子邮件作为主要的通信形式兴起,电子邮件列表成为社区讨论的媒介。因此,构建了电子邮件用户界面,以允许电子邮件社区做出正式决策,同时仍然使用流行的 Mailman 邮件列表软件。

电子邮件界面

eVote 的电子邮件列表界面提供三个级别的参与

  1. 投票者:用户可以投票和更改他们的投票;他们还拥有与投票管理员和列表所有者相同的查询数据权限。

  2. 用户/管理员:任何用户都可以发起投票。在正常情况下,只有启动投票的用户才能关闭或从数据中删除它。

  3. 列表所有者:某些命令受密码保护。这些命令提供覆盖权限,因此所有者可以关闭/删除任何投票、更改投票权限或将参与者的投票移动到新的电子邮件地址。列表的所有者还保留与没有 eVote 的列表的所有者相同的责任和权力。

五个可执行文件

电子邮件设施的总体架构如图 1 所示。eVote 是五个协同工作的程序:eVote_Clerk(Clerk)、eVote_insert(电子邮件列表用户界面)、eVote_mail(邮件管理员实用程序界面)、eVote_petition(请愿书签名者的界面)和 eVote(用于控制 Clerk 的命令中心)。

eVote Adds Elections to Mailing Lists

图 1. eVote 的邮件界面

eVote_Clerk 在计算机后台持续运行,建立新投票、删除旧项目、接受、统计、存储和报告投票和统计信息。eVote_Clerk 没有直接的用户界面。它由 eVote 可执行文件启动、控制和停止。

多种可能性:eVote 的投票类型

eVote_insert 可执行文件是电子邮件界面,它与流行的开源电子邮件列表服务器 Mailman 协调工作。Mailman 提供讨论媒介;eVote 提供投票工具。这种合作关系在邮件传输代理 (MTA) 的别名文件中配置。例外情况:如果 MTA 是 Exim 并且列表服务器是 Mailman,则 Exim 的配置文件处理列表以及与 eVote 的合作。

站点管理员可以使用 eVote_mail 来同步 Clerk 的订阅者列表与 Mailman 的列表。站点管理员可以使用此程序阻止来自特定地址的投票或从所有列表中删除地址。同样,此程序可以删除等待确认的过时消息。

eVote 的电子邮件界面中存在两个功能:电子邮件列表中的投票和请愿书支持。请愿书功能允许任何人参与,而电子邮件列表功能仅允许电子邮件列表上的地址参与。请愿书由请愿书列表的成员协作管理,请愿书列表是任何名称以单词“petition”开头的列表,例如 petitiona、petitionb 等。在请愿书列表中发起的投票可以选择对非成员开放。

eVote 可执行文件是 eVote 的命令中心,可以使用各种参数调用。根据参数的不同,eVote 将启动、停止或检查 Clerk,检查和同步数据,或刷新或重启日志。

eVote/Clerk 如何与 Mailman 集成

Mailman 可以由任何 MTA(如 sendmail、Exim 或 Postfix)调用。通常, направленное 到电子邮件列表地址的邮件通过管道传输到 Mailman 的包装程序,以控制进程的权限并限制通过管道执行的程序。然后,包装程序调用 Mailman 的 post 脚本,将邮件广播到列表的地址。

名为 sample 的常规 Mailman 列表的别名条目可能如下所示

sample:         "|/home/mailman/bin/wrapper post
sample"
sample-admin:   "|/home/mailman/bin/wrapper mailowner
sample"
sample-request: "|/home/mailman/bin/wrapper mailcmd
sample"
sample-owner:   sample-admin

mailcmd 程序需要几行新代码来告诉它,每当有人成功订阅或取消订阅列表时,都向 eVote 发送电子邮件通知。

要广播给列表成员的邮件通过 sample: 别名通过管道传输到 Mailman 的 post 程序。

eVote Adds Elections to Mailing Lists

图 2. 没有 eVote 的 Mailman

通过在管道中插入 eVote_insert 来启用电子投票

sample: "|/home/mailman/bin/wrapper
eVote_insert post sample"

包装程序的 C 源代码进行了一些修改,以便它允许 eVote_insert 运行。现在,eVote 可以首先查看所有进入列表广播地址的邮件。如果传入消息中的第一个单词是 eVote,则 eVote_insert 拦截该消息以进行投票处理。否则,它将消息发送到 post(图 3)。

eVote Adds Elections to Mailing Lists

图 3. eVote 检查邮件

请愿书列表的设置方式与其他 eVote 列表完全相同。如前所述,eVote 将它们识别为特殊的,因为它们的名称以“petition”开头。这些列表旨在用于协作管理请愿书。请愿书列表的成员可以讨论和投票,并且他们也有权为全世界发起请愿签名。这些请愿书可以包括 eVote 的任何投票类型,并且它们总是邀请签名者发表评论。

请愿书工具还有一个额外的别名用于接收签名

eVote: "|/home/mailman/mail/wrapper eVote_petition"
eVote Adds Elections to Mailing Lists

图 4. 请愿书工具

一个 eVote_petition 别名处理该设施中所有请愿书列表的签名。

选举的两项增强功能

就目前而言,eVote/Clerk 系统并非为总统选举而设计,也不适用于总统选举。然而,通过两项重大增强功能,它可能成为最安全和准确的解决方案。所需的增强功能是

  1. 一个网络层,以便联网的 Clerk 管理分布式数据。该网络还将促进对其他 Clerk 的数据和计算进行检查。例如,如果投票者使用一个 Clerk 投票并收到来自该 Clerk 的收据,稍后,投票者从另一个随机选择的 Clerk 收到第二张收据,则此过程将确保所有 Clerk 的完整性。

  2. 一个安全加密层,以便只有软件和投票者才能看到该投票者的投票。

通过这些增强功能,Clerk 可以提供比通用数据库服务器更高的安全性,因为 Clerk 可以冗余地和地理上地将投票分发到许多运行 GNU 系统的小型计算机上。此外,各个管理员的责任和权力都极小,并且每个管理员都受到 Clerk 网络的监视。最后,Clerk 让投票者参与促进不仅是重新计票和冗余检查,还有重新投票。有了这样一个系统,我们就可以自信地进入我们的电子民主时代。

Marilyn Davis (marilyn@deliberate.com) 在很久以前获得了理论射电天文学博士学位。现在她在加利福尼亚州森尼维尔的 UCSC Extension 做服务员并教授 Python、C 和 GNU 开发工具。

电子邮件:marilyn@deliberate.com

加载 Disqus 评论