11 · DAO y gobernanza
Nivel: Avanzado · ⏱️ Duración estimada: 150 min · Fuente: OpenZeppelin Governor y Compound Governance ⬅️ Currículo · 📚 Bibliografía 🧭 ⬅️ Anterior: 10 · Oráculos, almacenamiento e indexación · 📚 Índice · ➡️ Siguiente: 12 · Escalabilidad y capas 2 📖 Glosario de términos · 🌱 ¿Nuevo en esto? Empieza aquí
🎯 Objetivos
- Describir el ciclo de vida de una propuesta: creación, votación, quorum, cola en timelock y ejecución.
- Explicar la delegación y los snapshots de poder de voto y por qué se mide en un bloque pasado.
- Comparar el voto on-chain con el off-chain (Snapshot) y sus implicaciones de coste y confianza.
- Diseñar una DAO donde una propuesta crítica exija votación, demora y ejecución verificable.
- Identificar amenazas de gobernanza, como el flash-loan governance o la captura por delegados, y sus mitigaciones.
📚 Resultados de aprendizaje
Al finalizar, el estudiante podrá:
- Explicar cómo un snapshot de poder de voto impide comprar votos justo antes de la votación.
- Configurar un Governor de OpenZeppelin con quorum, periodo de votación y
TimelockController. - Justificar el uso de un timelock como demora entre la aprobación y la ejecución.
- Analizar un ataque de flash-loan governance y las defensas que lo neutralizan.
- Diseñar un mecanismo de emergencia acotado, transparente y con límites explícitos.
- Distinguir el voto on-chain del off-chain según coste, participación y verificabilidad.
🗺️ Temas
| # | Tema | Por qué importa |
|---|---|---|
| 1 | Propuestas y ciclo de vida | Estructuran cómo la comunidad decide y ejecuta cambios. |
| 2 | Delegación de voto | Permite a titulares delegar su poder sin transferir tokens. |
| 3 | Snapshots de poder | Fijan el poder en un bloque pasado para evitar compra de última hora. |
| 4 | Quorum y participación | Sin participación mínima, una minoría decide por todos. |
| 5 | Timelock y ejecución | La demora da tiempo a reaccionar ante una propuesta maliciosa. |
| 6 | On-chain vs. off-chain | Snapshot abarata el voto pero traslada la confianza fuera de la cadena. |
| 7 | Tesorería multisig | Un Safe con múltiples firmantes protege los fondos de la DAO. |
| 8 | Amenazas de gobernanza | Flash loans, captura y baja participación erosionan la legitimidad. |
🧠 Modelo mental
Una DAO bien diseñada se parece a un parlamento con reglas de procedimiento: no basta con que una mayoría levante la mano una vez. Hay un registro de quién tiene derecho a voto en cierto momento (el snapshot), un debate con quorum, y un periodo obligatorio entre la aprobación y la entrada en vigor de la ley. Ese retraso no es burocracia inútil: es la ventana en la que la comunidad puede leer la letra pequeña y, si detecta un abuso, retirar sus fondos o reaccionar antes de que el cambio se aplique.
El límite de la analogía: en un parlamento tradicional el poder de voto no se puede alquilar por diez segundos, pero en cadena sí. Un atacante puede pedir prestado un capital enorme vía flash loan, votar y devolverlo en la misma transacción. Por eso el snapshot de poder en un bloque anterior y el timelock no son adornos, sino defensas centrales: separan el momento en que se mide el poder del momento en que se vota, y el momento en que se decide del momento en que se ejecuta.
🧩 Esquema visual
El ciclo de vida de una propuesta en un Governor de OpenZeppelin impone etapas obligatorias entre la creación y la ejecución.
stateDiagram-v2
[*] --> Pending
Pending --> Active: abre el periodo de voto
Pending --> Canceled: el proponente la retira
Active --> Succeeded: logra quorum y apoyo suficiente
Active --> Defeated: sin quorum o con rechazo
Succeeded --> Queued: entra en cola del timelock
Queued --> Executed: cumple la demora y se ejecuta
Queued --> Canceled: se detecta un abuso y se cancela
Executed --> [*]
Defeated --> [*]
Canceled --> [*]
La arquitectura separa quién mide el poder de voto, quién decide y quién ejecuta: solo el timelock es dueño de los contratos administrados.
flowchart LR
T["Token con ERC-20Votes"] --> D["Delegación y checkpoints"]
D --> G["Contrato Governor"]
G --> TL["TimelockController"]
TL --> TS["Tesorería de la DAO"]
TL --> PC["Parámetros del protocolo"]
TL --> UP["Actualizaciones de contratos"]
📖 Conceptos y definiciones
- Propuesta: conjunto de acciones que la DAO somete a votación y, si se aprueba, ejecuta de forma verificable.
- Delegación: acto de asignar el poder de voto de los propios tokens a una dirección, sin transferir la propiedad.
- Snapshot de poder: registro del poder de voto en un bloque pasado, base de ERC-20Votes y los checkpoints de ERC-6372.
- Quorum: participación mínima requerida para que una votación sea válida.
- Timelock: contrato que impone una demora obligatoria entre la aprobación y la ejecución; en OpenZeppelin es
TimelockController. - Voto off-chain: señalización de voto fuera de la cadena, como en Snapshot, que ahorra gas pero no ejecuta por sí misma.
- Tesorería multisig: fondo gobernado por varias firmas, típicamente con un Safe, para evitar un único punto de control.
- Flash-loan governance: ataque que toma poder de voto prestado por instantes para forzar una decisión.
- ERC-6372: estándar de reloj que permite a un Governor usar bloques o marcas de tiempo para sus checkpoints.
🔬 Profundización
Anatomía de un ataque de gobernanza: Beanstalk (2022)
En abril de 2022, el protocolo Beanstalk perdió unos 182 M USD en el mayor ataque de gobernanza con préstamo relámpago registrado. El atacante había creado una propuesta maliciosa días antes (disfrazada, con ironía, de donación benéfica) y luego, en una sola transacción, pidió prestados cientos de millones de dólares en stablecoins vía flash loan, los depositó para obtener la supermayoría de poder de voto, ejecutó la propuesta mediante un mecanismo de emergency commit que no exigía demora, transfirió la tesorería a su propia dirección y devolvió el préstamo. Beneficio neto para el atacante: alrededor de 76 M USD.
El ataque funcionó porque fallaron a la vez las tres defensas canónicas:
- Snapshot de voto en bloque pasado: si el poder se mide con
getPastVotesen un bloque anterior a la propuesta, los tokens prestados dentro de la misma transacción valen cero votos. - Timelock obligatorio: una demora entre aprobación y ejecución impide que voto y ejecución convivan en una transacción, y da a la comunidad tiempo de auditar la propuesta y reaccionar.
- Quorum y umbral de propuesta: elevan el capital que hay que reunir y hacen que el ataque sea visible antes de consumarse.
Ninguna defensa aislada basta: el snapshot sin timelock deja pasar propuestas maliciosas votadas con poder legítimo comprado barato, y el timelock sin snapshot solo retrasa el saqueo.
Parámetros de diseño de un Governor
| Parámetro | Qué protege | Trade-off al subirlo |
|---|---|---|
| Voting delay (entre propuesta e inicio de votación) | Da tiempo a delegar, informarse y detectar propuestas hostiles | Retrasa decisiones urgentes legítimas |
| Voting period (duración de la votación) | Participación real en distintas zonas horarias y contextos | Alarga todo el ciclo; más exposición a campañas de compra de votos |
| Proposal threshold (poder mínimo para proponer) | Filtra spam y propuestas triviales de atacantes sin capital | Concentra la iniciativa en ballenas y grandes delegados |
| Quorum (participación mínima) | Impide que una minoría diminuta decida por todos | Con apatía alta, ningún cambio legítimo alcanza el umbral |
| Timelock delay (demora antes de ejecutar) | Ventana de reacción y salida ante una propuesta aprobada maliciosa | Ralentiza correcciones de emergencia; exige un mecanismo de guardián acotado |
No existen valores universales: un protocolo con tesorería enorme y comunidad madura tolera ciclos largos; uno joven que necesita iterar rápido suele empezar con parámetros bajos y endurecerlos a medida que crece el valor en juego.
veTokens y delegación líquida
El modelo vote-escrowed (veToken), popularizado por Curve con veCRV, ataca dos males crónicos: el capital mercenario que vota hoy y se va mañana, y la apatía del votante pequeño. El titular bloquea sus tokens por un plazo elegido (hasta 4 años en Curve) y recibe poder de voto proporcional al monto y al tiempo restante de bloqueo, que decae linealmente: quien más se compromete a largo plazo, más pesa. La delegación líquida (el patrón de ERC-20Votes) resuelve el otro flanco: permite ceder el poder de voto a delegados activos sin transferir la propiedad, elevando la participación efectiva.
Las críticas también son serias: el bloqueo prolongado ilíquido concentra el poder en quienes pueden permitirse inmovilizar capital años; alrededor de los veTokens surgieron mercados de sobornos de voto (bribes) y capas como Convex que re-concentran el poder que el diseño quería dispersar; y la delegación líquida tiende a oligarquías de delegados profesionales con baja rendición de cuentas. La lección de diseño: ningún mecanismo de tokenomics sustituye a una comunidad que vigila la concentración de poder — solo cambia dónde hay que mirar.
Un ataque de gobernanza, y por qué cada defensa existe
Las piezas de un Governor (snapshot, quorum, timelock) parecen burocracia hasta que se ve el ataque que cada una impide. Sigamos uno completo.
El objetivo: una DAO con una tesorería de 50 millones y un token de gobernanza que cotiza en mercado.
Sin ninguna defensa, el ataque cuesta una transacción:
1. Flash loan de 20 millones ← sin colateral, se devuelve al final
2. Comprar tokens de gobernanza
3. Crear la propuesta "transferir la tesorería a esta dirección"
4. Votar a favor con los tokens recién comprados
5. Ejecutar
6. Vender los tokens, devolver el préstamo
Todo en un bloque. Y ahora, dónde se rompe la cadena según qué defensa esté puesta:
| Defensa | En qué paso muerde | Qué impide exactamente |
|---|---|---|
Snapshot en bloque pasado (getPastVotes) |
4 | Los tokens comprados en el paso 2 tienen cero poder de voto: el peso se leyó de un bloque anterior a la compra. Mata el ataque entero |
| Retraso de votación | 3→4 | Entre crear la propuesta y poder votar pasan bloques, así que ninguna operación atómica los abarca |
| Periodo de votación (días) | 4 | Sostener un préstamo relámpago durante días es imposible por definición |
| Quorum | 4 | Obliga a movilizar una fracción real del suministro, no solo mayoría de los que votaron |
| Timelock | 5 | Aunque todo lo anterior fallara, la ejecución se retrasa: da tiempo a ver la propuesta y salir |
Lo importante: el snapshot solo por sí mismo ya cierra este ataque. Las demás no son redundancia inútil: cada una cubre un camino distinto (compra progresiva, colusión de delegados, propuesta maliciosa disfrazada). Un diseño con snapshot pero sin timelock es vulnerable a un ataque más lento y más difícil de detectar.
La consecuencia práctica que sorprende: con ERC20Votes, tener tokens no da poder de voto. Hay que delegar explícitamente, aunque sea a uno mismo. Es la causa número uno de participación baja en DAOs recién lanzadas, y no es un bug: es lo que permite que el snapshot funcione.
💡 En una frase: cada pieza de un Governor existe porque alguien ya ejecutó el ataque que impide. El snapshot es la que hace inviable comprar la votación en el último segundo.
🎓 Si ya dominas esto — donde la gobernanza se rompe de verdad
- El voto ponderado por tokens es plutocracia con pasos extra. Quien más capital tiene, más decide. La votación cuadrática mitiga la concentración pero es vulnerable a Sybil sin identidad, lo que traslada el problema a "cómo pruebas que eres una persona" — que no está resuelto.
- La apatía es el estado por defecto y es racional. Votar cuesta tiempo y gas; el efecto de un voto pequeño es nulo. Por eso la delegación es la solución de facto, y por eso los delegados profesionales concentran poder de forma silenciosa: revisa la distribución del voto delegado, no solo la del token.
- La ejecución en varias cadenas rompe la atomicidad de la decisión. Una propuesta aprobada en L1 que debe aplicarse en varias L2 puede quedar a medias si un mensaje falla. Hay que diseñar la reversión antes que la ejecución.
- El timelock protege y expone a la vez. La ventana que da a los usuarios para salir se la da también a un atacante para preparar la explotación de un cambio que ya conoce. La duración correcta equilibra ambas cosas; copiarla de otro protocolo sin ese análisis es copiar su modelo de amenazas.
- ERC-6372 permite anclar los checkpoints al tiempo en vez de al número de bloque. Es lo correcto en L2 con tiempos de bloque variables, donde "dentro de 40 320 bloques" puede significar cualquier cosa.
🧪 Laboratorio guiado
🧪 Estas prácticas están catalogadas y resueltas paso a paso en el catálogo de laboratorios.
Abre los contratos de gobernanza y timelock del módulo, ubicados en
labs/08-protocols, y revisa cómo se enlaza el Governor con elTimelockController.Ejecuta la suite de pruebas con trazas para seguir una propuesta desde su creación hasta su ejecución.
forge test -vv
En las trazas, localiza el snapshot de poder de voto y comprueba que corresponde a un bloque anterior al inicio de la votación.
Sigue el paso por el timelock e identifica la demora obligatoria entre la aprobación y la ejecución.
📝 Reto verificable
Diseña e implementa una DAO en la que una propuesta crítica requiera votación con quorum, una demora en TimelockController y una ejecución verificable, más un mecanismo de emergencia acotado y transparente.
Criterio de aceptación: forge test -vv pasa en verde; una prueba demuestra que una propuesta no puede ejecutarse antes de cumplir la demora del timelock; otra prueba demuestra que el poder de voto se mide por snapshot en un bloque pasado; y el mecanismo de emergencia tiene límites explícitos y deja rastro on-chain.
⚠️ Errores frecuentes
| Síntoma | Causa y cómo comprobarlo |
|---|---|
| Alguien aprueba una propuesta con tokens prestados | Falta de snapshot en bloque pasado; verifica que el poder se lea con getPastVotes. |
| Una propuesta se ejecuta al instante | No hay timelock entre aprobación y ejecución; comprueba la demora en TimelockController. |
| Casi nadie vota y una minoría decide | Quorum demasiado bajo o apatía; revisa el umbral y los incentivos de participación. |
| El poder de voto no aparece | Titular no delegó, ni siquiera a sí mismo; recuerda que ERC-20Votes exige delegación explícita. |
| Un delegado concentra el control | Captura por delegación; monitoriza la distribución del poder delegado. |
| El "botón de emergencia" hace demasiado | Mecanismo sin límites; acótalo, hazlo transparente y auditable. |
🛡️ Seguridad y ética
- Trabaja en local o testnet; nunca uses fondos ni claves reales al desplegar contratos de gobernanza.
- Mide el poder de voto por snapshot en un bloque pasado para neutralizar la compra o el préstamo temporal de poder.
- Impón un timelock entre aprobación y ejecución para dar a la comunidad tiempo de reaccionar.
- Diseña cualquier mecanismo de emergencia con alcance mínimo, transparencia total y rastro on-chain.
- Vigila la concentración de poder delegado y la baja participación, que erosionan la legitimidad de la DAO.
🔗 Referencias
- OpenZeppelin, Governance — https://docs.openzeppelin.com/contracts/governance
- Compound, Governance — https://docs.compound.finance/governance/
- Snapshot, Documentación — https://docs.snapshot.org/
- Voshmgir, Token Economy — https://tokeneconomy.co/
- Fuente primaria: OpenZeppelin Governor y Compound Governor Bravo (documentación enlazada arriba) — https://docs.openzeppelin.com/contracts/governance
✅ Criterio de dominio
- Entregas una DAO cuyas pruebas demuestran snapshot de poder y demora obligatoria en el timelock.
- Explicas sin apoyo cómo un flash loan podría atacar la gobernanza y qué lo impide.
- Justificas la elección entre voto on-chain y off-chain para un caso concreto.
🧭 Navegación
⬅️ Módulo 10 · Oráculos, almacenamiento e indexación · 📚 Índice del currículo · ➡️ Módulo 12 · Escalabilidad y capas 2
🧠 Autoevaluación del módulo
Responde sin volver atrás. Cada opción incorrecta corresponde a un error frecuente documentado en este mismo módulo: si fallas, la explicación te dice qué releer.