El sistema de gobierno de Compound funciona con el token COMP , que se distribuye a los usuarios del protocolo.
Los titulares de tokens COMP reciben poder de voto de 1 a 1 sobre la cantidad de COMP mantenida; Este poder de voto se puede delegar a cualquier dirección, y luego se puede utilizar para votar propuestas.
Hay dos métodos por los cuales un usuario puede delegar sus derechos de voto o emitir votos en las propuestas: llamando directamente a las funciones relevantes ( delegado , castVote ); o utilizando la funcionalidad de firma ( delegateBySig , castVotebySig ).
Un beneficio clave para los usuarios de la funcionalidad de firma es que pueden crear un delegado firmado o una transacción de votación de forma gratuita, y que un tercero de confianza gaste ETH en tarifas de gas y lo escriba en la cadena de bloques para ellos. En esta guía, nos centraremos en ejemplos de código en torno a este tipo de funcionalidad.
Delegado por firma
Mediante el uso de una firma de «datos estructurados mecanografiados» EIP-712 , los titulares de tokens COMP pueden delegar sus derechos de voto a cualquier dirección de Ethereum.
El método delegateBySig del contrato inteligente COMP está disponible para usuarios que tienen una transacción de delegación firmada.
Un caso de uso para estas firmas podría ser que un delegado desee reclutar a titulares de COMP para delegar sus votos en el delegado y permitirles hacerlo con muy poca fricción.
El delegado puede crear una página web donde los usuarios firman una transacción delegateBySig utilizando MetaMask y su clave privada, que luego se publicará en el servidor web del delegado.
Más tarde, el delegado puede agrupar las firmas en una sola transacción de Ethereum y recabar oficialmente los derechos de voto de sus electores mediante la ejecución del método delegateBySig .
Voto emitido por firma
Con el mismo tipo de firma que delegateBySig , los usuarios pueden permitir que un tercero envíe un voto en su nombre en cualquier propuesta de gobernanza compuesta .
El método castVoteBySig del contrato inteligente del gobernador está disponible para cualquier persona que tenga una transacción de voto firmada.
El tercero en este escenario, que envía la transacción firmada del titular del COMP, podría ser el mismo que en el ejemplo delegateBySig , sin embargo, el poder de voto que tienen es para una sola propuesta, en lugar de indefinidamente.
El firmante aún tiene el poder de votar en su propio nombre en la propuesta si el tercero aún no ha publicado la transacción firmada que se le entregó.
Delegar por firma en un sitio web3
Con este ejemplo de código , cualquiera puede crear una página web simple que permita a los usuarios delegar sus derechos de voto, mediante firma, a otra dirección. Asumiremos que todos los usuarios que visitan esta página están utilizando MetaMask para utilizar la funcionalidad Web3.
Cuando un usuario visita la página, puede ver su dirección de billetera Web3 seleccionada y su dirección de delegado de gobierno compuesto actual. Pueden completar la dirección del tercero al que desean delegar sus derechos de voto. En la práctica, esta dirección puede estar codificada en la página web.
A continuación, el usuario hará clic en «Crear firma de delegación», lo que activará la aprobación de MetaMask de los datos que se firmarán. La documentación de MetaMask tiene una descripción detallada de los datos de firma .
Aquí está el controlador de eventos que se ejecuta cuando el usuario hace clic en el botón.
https://medium.com/media/770c36cd959a588dc7e3bf82683a2be6
El código utiliza el método eth_signTypedData_v4 , que se implementa dentro de MetaMask. Esto se utiliza para crear firmas de datos estructurados mecanografiados , que se describen en la especificación EIP-712. Para crear una firma válida, el método necesita 3 parámetros.
- La dirección de Ethereum del delegado.
- El nonce de la cuenta firmante del contrato inteligente COMP.
- El tiempo de vencimiento de la transacción, en segundos desde la época de Unix.
El método de firma de datos estructurados mecanografiados acepta la dirección del firmante junto con una cadena JSON. La especificación EIP-712 define los tipos, estructura y dominio que componen los datos que se van a firmar. Esto se implementa en un método simple, que se llama en el controlador de eventos de clic de botón.
El delegado, el nonce, el vencimiento y la firma pueden ser utilizados por cualquier dirección de Ethereum para publicar la transacción del delegado. Estos son los parámetros del método delegateBySig en el contrato COMP. La firma debe dividirse en 3 parámetros, conocidos como v , r y s .
El ejemplo completo de código de página web para delegar con una firma EIP-712 está disponible en el repositorio de ejemplos de gobierno de GitHub .
Voto emitido por firma en un sitio web3
Al igual que en el ejemplo Delegado por firma, se puede crear una página web para que los usuarios creen una firma de voto. Si un usuario desea regalar su «boleta» a un tercero, ese usuario debe firmar transacciones separadas «a favor» y «en contra», y el tercero puede elegir qué transacción publicar.
El objeto de datos estructurados para crear firmas de voto es ligeramente diferente de una firma de delegado. En este caso, el usuario necesita una definición de «balota».
Al hacer clic en «Crear firmas de voto», el usuario firmará una transacción «a favor» y una «en contra». Similar al método delegateBySig , los votos se pueden emitir pasando 2 parámetros al método castVoteBySig .
- El ID único de la propuesta de gobernanza compuesta (entero de incremento automático).
- Un valor booleano del soporte de la propuesta por parte del usuario (verdadero o falso).
Además, el usuario debe pasar la firma, que debe dividirse en 3 parámetros, conocidos como v , r y s (implementado en la sección anterior).
El ejemplo completo de código de página web para emitir un voto con una firma EIP-712 está disponible en el repositorio de ejemplos de gobierno de GitHub .
Lote y publique firmas con un script o un contrato inteligente
Una vez que un usuario ha recopilado transacciones firmadas para la gobernanza de Compuestos, debe publicar esas transacciones en la cadena de bloques Ethereum. El código para implementar esto podría ser útil para intercambios y aplicaciones de billetera que administran muchas claves privadas para muchos usuarios diferentes.
Se puede publicar una colección de transacciones firmadas en la cadena de bloques de una vez utilizando JSON RPC o un contrato inteligente. Este ejemplo usa solo Web3.js en un script Node.js. El script creará y publicará por lotes las firmas de delegación para una colección de claves privadas.
Gas utilizado: 454740
El objeto web3.BatchRequest agrupa las transacciones delegateBySig y las publica en blockchain. El ejemplo completo de Node.js está disponible en el repositorio de ejemplos de gobierno de GitHub . Para obtener más información sobre el procesamiento por lotes de Web3.js, consulte la documentación .
La misma funcionalidad se puede implementar con un contrato inteligente Solidity. En comparación, este método utiliza marginalmente menos gas que el enfoque por lotes Web3.
Gas utilizado: 306046
El ejemplo completo de Solidity está disponible en el repositorio GitHub de ejemplos de gobierno que se completa con un script JSON RPC, así como un script de implementación para el contrato inteligente.
Gracias por leer y asegúrese de suscribirse al Boletín Compuesto . Siéntase libre de comentar sobre esta publicación, o póngase en contacto en la sala #desarrollo del servidor muy activo de Compound Discord .