Nuestros sistemas actuales, basados en la democracia representativa, afrontan numerosos problemas. De hecho, son disfuncionales en el sentido de que no cumplen el objetivo fundamental de la democracia, que es garantizar que prevalezca la voluntad de la mayoría.
El siguiente diagrama es familiar para todos:
Al seleccionar estratégicamente los distritos electorales, puede suceder que un partido gane aunque sólo una minoría de los votantes lo haya apoyado. Pero éste es sólo uno de los muchos problemas. Participar en política requiere mucho dinero, lo que hace que el sistema político sea vulnerable a la influencia financiera. Los sistemas que creemos democráticos en realidad sirven a los intereses privados y a las corporaciones, no a los votantes (véase Captura del Estado ).
La solución sería que la gente participara en la toma de decisiones de una manera mucho más directa, a través de la democracia directa o la democracia líquida. Por supuesto, en la realidad, no es factible organizar referendos en papel sobre cada tema, ya que este tipo de votación requiere una gran cantidad de recursos. Pero ¿no es posible resolver esto de manera digital, a bajo costo, al tiempo que se garantiza el anonimato y la seguridad de la votación en papel? Comencé a buscar una respuesta a esta pregunta hace unos dos años. Así fue como encontré los mezcladores de monedas y la tecnología a prueba de conocimiento cero.
La esencia de los mezcladores de monedas es hacer que las transacciones de blockchain sean imposibles de rastrear. Un mezclador de este tipo funciona como un gran pool. Los usuarios depositan sus monedas en un lado y las retiran en el otro. La clave es que no sabemos quién retira qué moneda en el otro lado, al tiempo que garantizamos que todos solo puedan retirar la misma cantidad que depositaron. Este es exactamente el tipo de sistema necesario para la votación anónima. Todos reciben una papeleta en la que pueden emitir su voto. No sabemos quién emitió qué voto, pero podemos estar seguros de que cada persona emite solo un voto.
Entonces, me sumergí en el código fuente de uno de los mezcladores de monedas más populares, Tornado Cash, para entender cómo funciona. También se escribió un artículo sobre esto. Una vez que entendí completamente la funcionalidad, separé las características principales y creé una biblioteca llamada zk-merkle-tree , que cualquiera puede usar para realizar votaciones anónimas. También se desarrolló una aplicación de votación de prueba de concepto , que permite a cualquiera construir su propio sistema. El sistema está basado en blockchain, lo que lo hace seguro, pero al mismo tiempo, también lo hace muy difícil de usar. Si construimos sobre una blockchain existente, surgen costos de transacción como la implementación de contratos inteligentes y problemas similares, mientras que operar nuestra propia blockchain es un desafío aún mayor. Quería una solución que no tuviera blockchain y que fuera fácil de configurar en unos minutos. Así nació zkDemocracy .
zkDemocracy es un sistema tradicional basado en NodeJS y MySQL que se puede configurar en tan solo unos minutos. Puede funcionar en modo independiente, donde zkDemocracy funciona como capa de backend completa, o como un servicio integrado en un sistema más grande.
La primera pregunta que surge con un sistema de este tipo es: ¿cómo se puede garantizar la seguridad a nivel de blockchain en una base de datos MySQL?
La cadena de bloques es ideal porque es una solución de solo anexión donde no es posible realizar modificaciones, lo que ayuda a filtrar la mayoría de los tipos de fraude. En realidad, la única forma de hacer trampa es que alguien vote en nombre de otros, o que vote alguien que no esté autorizado para hacerlo. Estas posibilidades se pueden evitar con una identificación adecuada de los votantes. Si esto se garantiza, el fraude se vuelve teóricamente imposible. Por lo tanto, si podemos establecer un sistema de solo anexión sobre MySQL, podemos proporcionar el mismo nivel de seguridad que ofrece la cadena de bloques.
La solución de zkDemocracy al problema es que cada fila insertada en las tablas de la base de datos se asocia con un "hash de punto de control". Se trata de un hash keccak256, que se compone de los datos de los campos y del hash de punto de control de la fila anterior. De manera similar a una cadena de bloques, los hashes de punto de control están encadenados, por lo que si se cambia algo en la base de datos, el hash de punto de control de cada fila posterior a la modificada también cambiará.
Cuando alguien se registra como votante o emite un voto, el sistema proporciona un recibo certificado y firmado digitalmente que confirma que la transacción se ha completado. Este recibo también contiene el hash del punto de control. Dado que tanto la lista de miembros como la lista de votos son totalmente públicas después de la votación, cualquiera puede verificar si se han producido cambios y, en caso afirmativo, puede utilizar el recibo firmado digitalmente proporcionado por el servidor para demostrarlo.
La lista actual de votantes registrados y el hash del punto de control más reciente se pueden recuperar del sistema en cualquier momento, lo que hace que cualquier fraude sea demostrable al instante. Además, existe la opción de escribir el hash del punto de control en la cadena de bloques a intervalos regulares (por ejemplo, cada 10 minutos), lo que garantiza aún más que la base de datos no se pueda alterar después de que el hash se haya escrito en la cadena de bloques. Esta solución proporciona seguridad completa a nivel de cadena de bloques, ya que cualquier intento de manipular los datos requeriría también modificar el hash en la cadena de bloques.
Está claro que con la solución anterior, se puede lograr el mismo nivel de seguridad proporcionado por la cadena de bloques mientras se utilizan tecnologías familiares (como los clústeres MySQL) para operar el sistema.
Utilicé la biblioteca Semaphore para generar y verificar pruebas de conocimiento cero. Funciona de manera similar a zk-merkle-tree, pero ha sido auditada y tiene una base de desarrolladores más grande.
zkDemocracy tiene dos elementos fundamentales: grupo y votación. Un grupo es un conjunto de votantes, como los votantes de un distrito electoral específico, los accionistas de una empresa, etc. De manera similar, la votación representa un evento de votación, que podría ser una elección presidencial, un referéndum, la toma de decisiones corporativas, etc. Múltiples grupos pueden participar en un solo evento de votación; por ejemplo, en un referéndum, todos los distritos electorales participan en la votación y los resultados se agregan. De la misma manera, un grupo puede participar en múltiples eventos de votación. Por lo tanto, si se establecen los grupos para los distritos electorales, se pueden realizar múltiples referendos con estos grupos. En otras palabras, los grupos y las votaciones tienen una relación nm.
Veamos ahora cómo funcionaría un referéndum si se construyera según el sistema zkDemocracy.
El primer paso es identificar a las personas con derecho a voto. En un sistema de votación en papel, esto se hace proporcionando a cada distrito electoral una lista de votantes con derecho a voto para ese distrito. Cuando alguien se presenta a votar, su nombre se elimina de la lista, lo que garantiza que solo pueda votar una vez.
En el caso de la votación digital o en línea, este proceso es mucho más sencillo. Si el Estado proporciona algún tipo de identificación digital, la verificación puede ser totalmente automática. El votante presenta un compromiso único, que queda registrado con su nombre en la base de datos. Esta es la mitad de la prueba de conocimiento cero. La lista de votantes y los compromisos es pública, protegida por un hash de punto de control, y se puede solicitar una lista certificada y firmada digitalmente en cualquier momento. Por lo tanto, si el sistema de identificación es seguro, el fraude en esta etapa se vuelve teóricamente imposible.
Si no se presenta un documento de identificación digital, se requiere la identificación manual. Esto se puede hacer en persona o incluso a través de un sistema de videoconferencia (aunque la identificación en línea tiene sus riesgos debido a la tecnología avanzada de falsificación profunda). La identificación puede ser realizada por una sola persona, pero es más segura si la realizan varias personas seleccionadas al azar. Se proporciona seguridad adicional si se realiza una grabación en video de la identificación y se almacena durante un tiempo limitado. Durante este período, una organización independiente puede realizar controles aleatorios de las grabaciones para minimizar aún más la posibilidad de fraude. Este sistema de identificación es tan seguro como el que se utiliza actualmente en la votación en papel, o incluso más seguro.
Una vez completado el registro, el proceso se vuelve muy sencillo, ya que el votante puede participar en tantas votaciones como desee. Gracias al hash de punto de control y a la lista de votantes de acceso público, se garantiza que solo las personas que reúnen los requisitos puedan votar. La base de datos completa de cada evento de votación también es pública y está protegida por un hash de punto de control. Cualquiera puede verificar, mediante pruebas de conocimiento cero, si un voto determinado proviene de un votante válido, y cada votante puede comprobar en cualquier momento si su propio voto está registrado correctamente en la base de datos. Los votantes pueden demostrar fácilmente cualquier fraude utilizando el recibo firmado digitalmente que proporciona el sistema.
Está claro que con el sistema zkDemocracy es posible garantizar que las bases de datos sean públicas y accesibles para todos y que la consistencia de la base de datos sea demostrable, manteniendo al mismo tiempo el anonimato de los votantes.
El sistema está disponible en GitHub en la siguiente URL: https://github.com/TheBojda/zkdemocracy
También tengo pensado escribir otro artículo específicamente para desarrolladores. Mientras tanto, en GitHub se puede encontrar documentación detallada para desarrolladores y un código de muestra para utilizar el sistema.
Mi objetivo con este desarrollo es demostrar que existen las condiciones tecnológicas para mejorar nuestros sistemas democráticos. De nosotros depende cómo podemos aprovechar estas oportunidades...