The DAO y el caso del robo de los 50 millones de dólares en Ethereum

Uno de los ataques más famosos a un contrato inteligente de Ethereum fue el proyecto "The DAO". DAO significa Organización Autónoma Descentralizada y representa un contrato inteligente que gobierna las operaciones de una organización. Fue un nuevo y emocionante proyecto destinado a democratizar cómo se financian los proyectos ethereum. Actuó como un vehículo de inversión para buscar y financiar propuestas, dirigidas por los votos de los inversores. 

The DAO construido como  'Smart Contracts' se regía por su código. El código  de este programa es el que marcaba las normas de todo lo que se puede hacer o dejar de hacer. Las 11.000 personas que metieron su dinero en 'The DAO' aceptaban el código fuente abierto del programa como las normas a cumplir, sin que ninguno de ellos se diera cuenta de que había un error en él.

Sin embargo hubo alguien que sí se dio cuenta de ese error, el cual permitía extraer Ethers sin el permiso de los demás. Era un error de programación del que nadie se había dado cuenta, ni siquiera sus creadores.

Lisk busca ofrecer en sus proyectos estabilidad y seguridad

Lo hace mientras permite que las cadenas laterales tengan mayor flexibilidad. Los desarrolladores tienen el control total para crear su propia red blockchain como una cadena lateral mientras el equipo de Lisk mantiene la cadena principal (mainchain) y está protegida por sus 101 delegados. Si alguna vez hay un error en ese otro blockchain, la cadena principal no se vería afectada.

Las sidechains son ledgers o blockchains independientes que se vinculan al blockchain principal sin afectar al rendimiento y la velocidad de la cadena principal.

Proyecto Lisk DAO 

Un grupo de personas dentro de la comunidad del Centro Lisk Utrecht (LCU), asumió el desafío de comenzar un viaje en la construcción de una plataforma DAO (DAO = Organización Autónoma Descentralizada). La ambición de este grupo es realizar una plataforma DAO que contendrá varios bloques de construcción para el gobierno y los procesos operativos de las comunidades. Esta plataforma y sus componentes básicos se basan en Lisk, una cadena de bloques o tecnología de libro mayor distribuido (DLT). La plataforma LCU DAO ofrecerá una plataforma confiable que puede llevar a las comunidades a los siguientes niveles en términos de inclusión, apropiación por parte de los miembros, el uso de la sabiduría colectiva y el equilibrio de poderes e intereses. 

Mecanismo de votación

Seis miembros de la comunidad de LCU acaban de completar una prueba de concepto (PoC), de su primer componente básico de DAO: un mecanismo de votación básico de un miembro y un voto (1m1v). Este mecanismo de votación es uno de los medios para apoyar a las comunidades, que han comenzado un DAO en la plataforma LCO DAO, en su toma de decisiones.

Los seis miembros de la comunidad que participaron en LCU DAO PoC son: Jurre Machielsen, Raphael Cornelis, Sander Mandemaker, Marc Buma, Xinrong Ding y Peter Nobels.

El 'mecanismo de votación 1m1v' contiene los componentes básicos de un proceso de votación: 

  • 🔴 Crear un DAO que incluye una libreta de direcciones para registrar miembros

  • 🔴 Comenzar una votación

  • 🔴 Emitir votos

  • 🔴 Visualizar el progreso

  • 🔴 Capturando resultados 

Programa de constructores Lisk

El proyecto fue financiado por el Programa Lisk Builders . Los resultados del proyecto serán donados a la comunidad de Lisk. 

Recursos

En adelante, elaboramos este sistema de votación y nuestros próximos pasos hacia una plataforma LCU DAO desarrollada.

Caso de uso 'mecanismo de votación 1m1v' - descripción funcional 

Situación actual 

Votar es una valiosa herramienta de gobernanza, brinda a los miembros de una comunidad la posibilidad de ejercer influencia y también recopila información sobre puntos de vista. Sin embargo, las votaciones consumen tiempo y energía de los votantes y un comité de votación. Esto a menudo resulta en una asistencia pobre de los votantes e incluso en votos inválidos.  

¿Por qué debería funcionar de manera diferente?

La votación es fácil de organizar y participar, ofrece enormes beneficios en términos de una mayor participación de los miembros y proporciona un conocimiento compartido sobre los puntos de vista. Los sistemas digitales pueden ofrecer a los usuarios herramientas de votación tan fáciles de usar . En combinación con DLT, que proporciona un protocolo 'si esto es eso' y datos inmutables, se garantiza la seguridad, transparencia y confianza necesarias. Como esta solución está reduciendo el umbral de participación al tiempo que cubre los requisitos de seguridad y transparencia al mismo tiempo, es probable que aumente la asistencia de los votantes. Incluso desde el sofá es posible votar. Como resultado, los miembros tomarán más posesión de su comunidad.   

Un mecanismo de votación básico de 1m1v

Un mecanismo de votación básico de 1m1v significa que ofrece una funcionalidad simple y opera dentro de algunas limitaciones. En nuestro PoC se aplican las siguientes reglas:

  • 🔴 Cada miembro en la libreta de direcciones es elegible para votar.

    🔴 El mecanismo de votación no hace distinción entre diferentes tipos de miembros y diferentes tipos de apuestas. Por lo tanto, cada miembro de la libreta de direcciones puede participar en cada votación. 

  • 🔴 La autenticación digitalizada y la gestión de identidad no están incluidas.

    🔴 Cualquiera tiene la posibilidad de crear una cuenta en la plataforma DAO. Dado que la obtención de la membresía se determina mediante votación, los miembros existentes generalmente desean conocer la identidad del miembro candidato ya que solo las personas conocidas participaron en el PoC, este requisito se cumplió 'físicamente'. 

  • 🔴 Los votos / votantes no tienen peso de voto.

    🔴 Cada votante puede emitir un solo voto y cada voto tiene el mismo peso (= uno).

  • 🔴  Solo si / no-voto es posible.

  • 🔴 Para ser elegible para votar, un miembro debe figurar en la libreta de direcciones en el momento en que comienza la votación.

    🔴 Los miembros que se agregan a la libreta de direcciones, porque se les otorga una membresía durante la votación, no pueden participar en esas votaciones. 

  • 🔴 No es posible retirar un voto.

  • 🔴 La votación no se puede programar.

    🔴 La votación comienza después de que el remitente la inicia.

  • 🔴 Los tokens de utilidad se utilizan para las tarifas de transacción necesarias para emitir votos en la cadena de bloques. Cada par de claves pública / privada permite a su propietario emitir un voto. Nota: se necesitan tokens para transacciones en la cadena de bloques subyacente. Estos tokens son una tarifa para los nodos que ejecutan el protocolo, ejecutan las transacciones personalizadas (= contratos inteligentes) y almacenan los datos. Estos nodos mantienen la aplicación segura. 

  • 🔴 No hay curaduría de remitentes, sujetos o especificaciones.

  • 🔴 Cada miembro de la comunidad puede elegir un tema para votar, puede especificar una propuesta y también comenzar a votar.

  • 🔴 La duración de la votación es fija y es la misma duración para cada votación.

  • 🔴 El quórum y el índice de votación son fijos y son los mismos para cada votación.

  • 🔴 Todos los votos necesitan un mínimo de 51% de votos afirmativos para ser aprobados (proporción de votación), y todos los miembros tienen que votar para que una votación sea válida (por lo que el quórum se fija en 100%).

 


Ratio: el 51% de los votos debe ser un sí. La flecha roja muestra la línea del 51% y se mueve cuando se emiten más votos. 



Quórum: el 30% de los miembros dentro de un DAO debe emitir un voto, o la votación será inválida. La flecha negra apunta a una línea estática. 

Si bien la funcionalidad y las restricciones mencionadas anteriormente pueden no satisfacer las necesidades específicas de todas las comunidades, ofrecen un punto de partida claro para nuestro PoC y nuestro camino a seguir. 


¿Cómo funciona el mecanismo de votación 1m1v?

Instanciar un DAO

Antes de que un proceso de votación pueda comenzar, se debe instanciar un DAO. Esto lo realiza un miembro fundador. Para poder instanciar un DAO, este miembro fundador debe crear una cuenta en la cadena Lisk DAO. Al iniciar el proceso de creación de instancias, se crea una libreta de direcciones con el DAO como la primera entidad. El iniciador puede incluir a otras personas, que tienen una cuenta adecuada, con una sola acción como miembros fundadores de la libreta de direcciones.
Nota: en la libreta de direcciones no hay distinción entre miembros fundadores y otros miembros. Los miembros fundadores son las personas que se incluyen en la libreta de direcciones como parte del proceso de creación de instancias. 

Votaciones   

El PoC reconoce dos tipos de votos: votos para membresía y votos para propuestas. Ambas votaciones están respaldadas por el mismo mecanismo de votación de 1m1v. 

Comenzar una elección de votación para membresía

Para que una persona obtenga la membresía de la comunidad, los miembros actuales tienen que votar su solicitud de membresía. El primer paso para el miembro candidato es crear una cuenta en la cadena DAO de Lisk. El siguiente paso es comenzar un proceso de votación para la membresía. Esto debe hacerlo un miembro actual de DAO. 

Comenzar una elección de votación para una propuesta

Cualquier miembro de DAO puede hacer una propuesta sobre la cual los miembros de la comunidad pueden votar. Ingresar una propuesta en el DAO iniciará un proceso de votación.  

1m1v mecanismo de votación

Una solicitud de membresía o una propuesta abre una ventana de votación. Durante esta ventana de votación, todos los miembros elegibles pueden emitir sus votos. Un votante es elegible para participar en una votación específica cuando estaba en la libreta de direcciones en el momento en que comenzaron las elecciones. Cada miembro de la comunidad puede decidir apoyar una solicitud de membresía o una propuesta con un voto de sí, o alternativamente rechazarla con un voto de no. Durante la ventana de votación, los resultados intermedios son visibles para todos los miembros: cuántos miembros emitieron su voto (participación de votantes), la proporción entre sí y no (proporción de votos), si la cantidad de votos se cumple para una votación elección para ser válida (quórum) y cuántos miembros aún pueden votar (reserva). La ventana de votación se cierra después de un período fijo. Después del cierre de la elección de votación, no se pueden emitir más votos. 

Proceso de votación - paso a paso

Entonces, el proceso de votación (flujo feliz), para una propuesta, tiene los siguientes pasos lógicos:

 Hacer una propuesta

Por un miembro de la comunidad, con el apoyo del servicio de software 'Hacer una propuesta' 

 Leer nuevas propuesta por el servicio de software 'Organizar una votación para las propuestas' 

 Procedimiento de votación abierta para propuesta

Por el servicio de software Organizar una votación para propuesta (s)

 Actualizar el estado de la propuesta Votación abierta

Por el servicio de software ' Organizar una votación para las propuestas' 

  Alertar nuevo procedimiento de votación.

Por el servicio de software  'Votar por propuesta (s)' 

 6  Identifique y señale a los votantes elegible

mediante el servicio de software 'Votación de propuestas' 

 Mostrar nuevas propuestas a los votantes elegible

Por el servicio de software 'Votar por propuesta (s)' 

 Emitir un voto

Por los votantes elegibles, con el apoyo del servicio de software 'Votar por propuesta (s)' 

 Publicar votos emitido

Por el servicio de software 'Votar por propuesta (s)

 10 Leer voto

Por el servicio de software 'Organizar una votación para las propuestas' (parte 2)

 11 Actualizar estado Votación cerrada

Por el servicio de software 'Organizar una votación para la (s)'  propuesta (s)' (parte 2)

 12 Lea el resultado general de la votación

Por el servicio de software 'Establecer propuesta de apoyo comunitario' 

 13 Estado de actualización 'Propuesta aceptada'

Por el servicio de software 'Establecer propuesta de soporte comunitario' 

Votaciones - Lecciones aprendidas 

No solo construimos un mecanismo de votación de 1m1v, también realizamos algunas votaciones. Algunas de las ideas obtenidas se enumeran a continuación:

  • 🔴 La interfaz de usuario (UI) es importante.

    🔴 Una IU debe abordar las siguientes preguntas: ¿Cuál es el significado de toda la información que se muestra? ¿Por qué estoy votando? ¿Qué votaciones están abiertas, cuáles están cerradas? Cual es el resultado? 

  • 🔴 La participación electoral no ocurre por sí sola.

    🔴 La participación electoral y, por lo tanto, la participación de los miembros en la comunidad se puede mejorar eligiendo un día estándar para que comiencen y terminen las votaciones, haciendo campaña, eligiendo solo temas relevantes y limitando la cantidad de votaciones.

  • 🔴 Experimentar con mecanismos de votación.

    🔴 La primera versión de un mecanismo de votación probablemente no será la última. La aplicación de un mecanismo de votación proporciona al usuario una experiencia valiosa y, a su vez, ayudará a mejorar los mecanismos y procesos de votación. Incluso prevemos el surgimiento de la disciplina de la ingeniería de decisiones que se ocupa de la pregunta: "¿qué proceso y qué mecanismo es el más adecuado para un problema específico de toma de decisiones?"           

Detalles técnicos

Esto proporciona una visión general de los diferentes marcos utilizados, las transacciones personalizadas creadas y nuestra experiencia con el SDK de Lisk. 

Componentes de la PoC
  • 🔴 Back-end: transacciones personalizadas de trabajo que pueden ejecutarse en una cadena de bloques.

  • 🔴 Una API HTTP extendida que conecta el back-end y el front-end.

  • 🔴 Front-end: un panel de control front-end de ReactJS para crear y administrar DAO y votos (interactuar con transacciones).

Transacciones : 

Esta Prueba de concepto utiliza siete transacciones personalizadas diferentes que se enumeran a continuación:

  • createAddressBook : para crear una libreta de direcciones (DAO) con 2 a 10 miembros fundadores.
  • BaseProposal : La BaseProposal para comenzar a votar (esta es la transacción a la que deben extenderse todos los tipos de propuesta).
  • BaseVote : la transacción baseVote brinda una funcionalidad básica de votación y verifica todos los tipos de voto extendido.
  • SimpleProposal : una propuesta simple extendida de BaseProposal con 1 campo adicional para la pregunta de esta propuesta.
  • AddMemberProposal : Ampliación de BaseProposal con 1 campo de activo adicional para la clave pública del nuevo miembro de DAO que se votará.
  • SimpleVote : Extiende baseVote sin funcionalidad adicional (este voto se puede usar para ambos tipos de propuestas disponibles en este PoC).
  • JoinAddressBook : cuando se pasa una propuesta de agregar miembro, esta transacción permite que el miembro se una al DAO.

 


Crea una cuenta 

Todos pueden crear una cuenta en la plataforma LCU DAO utilizando una transacción de faucet. Esta transacción de faucet se puede encontrar en https://github.com/Moosty/lisk-sprinkler , lo que hace esta transacción es que la transacción puede ser enviada por un nuevo usuario y esa cuenta obtiene 100 tokens en su cuenta para usar para realizar transacciones en La cadena de bloques.

Crear personal DAO Lisk

Se crea un DAO único con miembros fundadores especificados. 

¿Como funciona?

Cada DAO único es una cuenta separada en la cadena de bloques. Al transmitir la transacción CreateAddressBook, se creará una nueva cuenta con una clave pública única generada utilizando los datos únicos de la transacción. En la cuenta de la libreta de direcciones se almacenan los siguientes activos:

  • nombre: (nombre único para un DAO).
  • escriba: "ADDRESSBOOK" para poder identificar las cuentas de la libreta de direcciones.
  • nonce: en qué nonce está la libreta de direcciones (el nonce es igual a n-propuestas) comenzando con 0.
  • direcciones: una matriz de objetos miembros. Este conjunto contiene la clave pública y el nonce en el que ingresaron a la libreta de direcciones.
  • descripción: una descripción de texto más larga de la libreta de direcciones.

Solo se necesita el nombre, la descripción y una matriz de direcciones en la transacción para crear un nuevo DAO.

Cuando se crea una libreta de direcciones, cualquier miembro de esa libreta de direcciones puede crear una propuesta de votación utilizando uno de los 2 tipos. Al enviar una propuesta, se crea una nueva cuenta en blockchain en la que se registran los votos. Los siguientes activos se almacenan en una cuenta de propuesta como se detalla a continuación:

  • 🔴 Tipo: "SIMPLE" o "ADD_MEMBER" en este momento.

  • 🔴 Nonce: ¿a qué libreta de direcciones pertenece esta propuesta?

  • 🔴 Inicio: la hora de inicio, la marca de tiempo de blockchain desde el momento en que se aceptó la transacción propuesta.

  • 🔴 Votos: una matriz de objetos de voto que contiene el miembro y su valor de voto (en este PoC 0 = no, 1 = sí).

  • 🔴 Estado: el estado de votación actual 1 está activo, 0 está hecho; Esto sucede al unirse o cuando el último votante permitido vota.

  • 🔴 AddressBook: la clave pública de la libreta de direcciones a la que pertenece esta propuesta.

  • 🔴 Opciones: un objeto que contiene opciones que se pueden usar en tipos de voto personalizados. 

El campo de activos de opciones de una propuesta es diferente para propuestas simples y agregar miembros. Las propuestas simples tienen una cadena de opción llamada 'propuesta' y las propuestas para agregar miembros tienen un campo de opción llamado 'miembro', que contiene la clave pública del asunto de la propuesta.

Cuando se crea una propuesta / votación, todos los miembros actuales de DAO con un nonce menor o igual al nonce de la propuesta pueden votar una vez sobre la propuesta enviando una transacción SimpleVote que contiene la clave pública de la propuesta, la clave pública de la libreta de direcciones y el voto que desea hacer 0 o 1 (0 = no, 1 = sí). La votación está abierta durante 24 horas, en este momento se aceptan los votos de los miembros. Después de que se cierra la votación, se realiza la propuesta simple, en la interfaz los cálculos se realizan para "aprobar", "rechazar" o "invalidar" la votación. Los miembros pueden ver los resultados. 

Después de que un miembro adicional vote, la transacción JoinAddressBook está permitida para que el nuevo miembro se una a la libreta de direcciones. Esta transacción actualiza la cuenta de la libreta de direcciones al agregar la clave pública a la lista de miembros, con la anulación de la próxima nueva votación para permitirle votar sobre las propuestas creadas a partir de ese momento. Una transacción JoinAddressBook contiene la clave pública de la libreta de direcciones y la clave pública de la propuesta, con esta información la cadena de bloques puede determinar si la transacción debe ser aceptada o rechazada.

La transacción BaseProposal debe ser la extensión de cada transacción de propuesta personalizada. Además de las comprobaciones de validación / error, la transacción BaseProposal configura la cuenta de votación para usted.

const { propuesta , errores } = aguarde esto . applyProposalAsset ( tienda ) ;
errores . mapa ( err => {
erra . empujar ( err ) ;
} ) ;
propuesta . publicKey = this . getProposalPublicKey ( ) ;
propuesta . activo = {
... propuesta . activo ,
opciones : propuesta . activo . opciones || { } ,
votos : [ ] ,
estado : propuesta . activo . estado || 1 ,
AddressBook : esto . activo . AddressBook ,
nonce : libreta de direcciones . activo . nonce ,
inicio : tienda . cadena . lastBlockHeader . marca de tiempo ,
}
AddressBook . activo = {
... libreta de direcciones . activo ,
nonce : libreta de direcciones . activo . nonce + 1 ,
} ;
tienda . cuenta . conjunto ( addressBook . address , addressBook ) ;
tienda . cuenta . conjunto ( propuesta . dirección , propuesta ) ;
ver en brutoBaseProposal.ts alojado con ❤ por GitHub

En una transacción de propuesta personalizada, solo necesita extender esta transacción de plantilla y requiere un constructor y el método applyProposalAsset (). Para la transacción AddMemberProposal personalizada , solo se requieren agregar estos cheques y activos de propuesta:

public async applyProposalAsset ( store : StateStore ) : Promise < ApplyProposal > {
errores const : TransactionError [] = [ ];
propuesta const = espera tienda . cuenta . getOrDefault ( this . getProposalAddress ( ) ) como ProposalAccount ;
const addressBook = espera tienda . cuenta . getOrDefault ( getAddressFromPublicKey ( this . asset . addressBook ) ) como AddressBookAccount ;
const proposedMember = Await tienda . cuenta . getOrDefault ( getAddressFromPublicKey ( this . asset . options . member ) ) como Account ;
if ( ! this . asset . options . member ) {
errores . empujar (
nuevo TransactionError (
'' .asset.options.member` debería contener la propuesta '. ,
esta . id ,
'.asset.options.member' ,
indefinido ,
) ,
) ;
}
if ( addressBook . asset . direcciones . find ( m => m === this . asset . options . member ) ) {
errores . empujar (
nuevo TransactionError (
'' .asset.options.member` ya está en esta libreta de direcciones '. ,
esta . id ,
'.asset.options.member' ,
esta . activo . opciones . miembro ,
) ,
) ;
}
si ( proposedMember . PublicKey === indefinido ) {
errores . empujar (
nuevo TransactionError (
'' .asset.options.member` no se encuentra en la cadena de bloques '. ,
esta . id ,
'.asset.options.member' ,
esta . activo . opciones . miembro ,
'extraviado'
) ,
) ;
}
propuesta . activo = {
... propuesta . activo ,
tipo : "ADD_MEMBER" ,
opciones : {
miembro : esto . activo . opciones . miembro ? esta . activo . opciones . miembro : "" ,
} ,
}
volver { propuesta , errores } ;
}

Hoja de ruta

Preparado para el futuro

Con la plataforma DAO prevista en mente, el mecanismo de votación de 1m1v está integrado en una aplicación front-end lista para el futuro . Este front end tiene una vista de miembro y una vista DAO. La vista de miembro muestra los DAO en los que participa un miembro, los DAO a los que un individuo puede unirse y las actividades de este individuo en sus DAO. La vista DAO muestra todas sus propuestas y todos sus miembros. 

La parte blockchain del back-end se ha creado con el SDK (Kit de desarrollo de software) de Lisk. Esta parte de la aplicación contiene transacciones personalizadas flexibles y las transacciones de plantilla BaseProposal y BaseVote. Las transacciones personalizadas son el equivalente Lisk de los contratos inteligentes. Las plantillas son patrones reutilizables. 

Próximos pasos 

Con nuestra prueba de concepto, dominamos la tecnología, aprendimos cómo diseñar y usar un mecanismo de votación, y cómo la votación puede fortalecer una comunidad. Nuestro próximo paso será convertir nuestro PoC en un componente de construcción DAO viable y adorable aprovechado para el uso en la vida real. Los siguientes pasos se darán cuenta de los próximos bloques de construcción, como otros mecanismos de votación y mecanismos de incentivos / recompensas. La campaña también se puede incluir en los procesos de votación, ya que esto mejorará el intercambio de puntos de vista y la participación en la comunidad. Después de todo, la votación es solo el punto final de la toma de decisiones y el comienzo de un proceso de dirección.  

Si se siente inspirado y desea crear su propia aplicación de blockchain de prueba de concepto, consulte el programa Lisk Builders. Puede encontrar más información sobre el programa y el procedimiento de solicitud en la página web de Lisk para el  programa Lisk Builders .


Fuente: blog de Lisk, lcu-dao.moosty.


The DAO y el caso del robo de los 50 millones de dólares en Ethereum Uno de los ataques más famosos a un contrato inteligente de Ethereum fu...