开源项目如何自我治理:Apache STeVe v3 背后的故事

来源: ASF博客
作者: ASF
发布时间: 2026/5/13 00:11:00
原文链接: https://news.apache.org/foundation/entry/how-open-source-governs-itself-the-story-behind-apache-steve-v3


Apache STeVe 并非内部 IT 工具。它是一个标准的 Apache 项目——由社区主导、开放开发,治理方式与所有 Apache 项目相同。这一区别至关重要。这意味着代码是公开的,决策在邮件列表中做出,任何希望贡献的人都有途径参与。原则上,参与投票的人也可以帮助构建它。

对于 v3 版本,我们在现代基础上重建了整个技术栈。该应用程序运行在 asfquart 上——ASF 基础设施团队对 Python 的 Quart 异步 Web 框架的扩展,现已在 PyPI 上可用——UI 部分由 Bootstrap 处理,STV(单一可转移投票,Single Transferable Vote)董事会选举界面由 SortableJS 驱动。模板基于 EZT 构建,这是一个我大约 25 年前编写的轻量级模板系统,同样托管在 PyPI 上。它简洁、快速,旨在让人感觉像是人们真正想使用的软件。

让投票保持私密的部分,即使对我们也是如此

以下是我认为最有趣的部分,我想你也会感兴趣。

STeVe 中的每一张选票在写入数据库之前都会被加密。每次选举使用一系列密钥:一个与选举本身相关的盐值,另一个为每个投票者、每个议题生成。这些盐值和相关数据由 Argon2 生成,这是一种内存硬密钥派生算法,旨在抵抗暴力破解攻击,而 Fernet 生成对称加密密钥。投票记录本身不包含任何姓名、选择,也不包含人与选票之间没有关联。

为了统计结果,系统必须逆向工作:生成所有可能的解密密钥(对于有 800 名投票者和 50 个议题的完整选举,最多可达 40,000 个),尝试每一个,并收集实际存在的选票。在典型硬件上,这个过程需要 15 到 60 分钟。

这是有意为之。使 Argon2 抵抗拥有大型机器的攻击者的特性——它可以消耗大量内存、并行性和时间——也使得我们自己的计票过程变慢。我们不是在对抗这种权衡;而是在利用它。随着硬件速度的提升,我们可以调整参数以保持难度恒定。隐私保证不会随时间而降低。

计票完成后,结果会以人类可读和 JSON 两种格式报告结果。还有一个单独的“whatif”工具输出,用于模拟替代结果,例如“如果只有八个董事会席位会怎样?”或“如果某个特定候选人不参选会怎样?”,以便社区从各个角度审视结果。

最终的系统确保没有人——无论是运行计票的基础设施团队、ASF 董事会,还是我——能够查看到某个特定成员在某个特定议题上的投票方式。数学强制执行隐私,而非政策。

为什么这对 ASF 之外也至关重要

为组织提供可信的数字投票是一个真正困难的问题,不仅仅对基金会而言。任何依赖成员投票的组织(例如专业学会、标准机构、开源联盟、工会、合作社)都面临同样的困境:如何在保护个人投票者隐私的同时验证过程是公平的?

大多数组织通过供应商信任和程序控制相结合来解决这个问题。我们则用密码学和开源代码来解决。STeVe v3 设计为可自托管,这意味着你的数据永远不会离开你的环境——你的选举数据永远不会通过任何第三方平台,并且在不运行完整计票过程的情况下,选票在静态状态下仍然不可读。一个被攻陷的服务器需要极其大量的工作才能查看任何人的投票方式,远远超出任何实际收益。完整实现代码在 GitHub 上。任何人都可以阅读、审计、运行或分叉它。

接下来会发生什么——以及你的角色

我们在真实选举之前用一次完整的模拟选举测试了 STeVe v3。成员对虚构的候选人进行投票,这些候选人有随机生成的提名声明,结果被统计,边缘情况被发现并修复。这就是 Apache 之道:尽早发布,开放迭代,相信社区能找到你遗漏的东西。

真实选举 运行顺利。

如果你是一名开发者,对其中任何内容感兴趣——异步 Python 框架、密码学设计、STV 计票算法——Apache STeVe 是一个活跃的项目,正在寻找贡献者的项目。你不必是寻找贡献者的项目。你不必是 ASF 成员才能参与。你只需要出现。

问题列表在 GitHub 上:https://github.com/apache/steve/issues邮件列表 是开放的。加入我们吧。