¿Es realmente inmutable un contrato?
Casi todo proyecto dice que su contrato no se puede cambiar. La afirmación es inusualmente fácil de verificar, y por eso conviene verificarla en lugar de creerla. Lleva unos minutos y no exige herramientas especiales.
Qué tiene que significar la palabra
Inmutable significa una sola cosa: el código que hoy se ejecuta en una dirección es el que se ejecutará allí mañana, y nadie puede sustituirlo. Ni el equipo, ni una votación, ni un guardián, ni una emergencia. Si existe alguna vía por la que el código ejecutado cambie, el contrato es actualizable —que es una opción de diseño legítima, pero distinta, y debería describirse con esas palabras—.
La pregunta nunca es «¿pueden cambiarlo?» en abstracto. Es: ¿qué mecanismo concreto usarían y existe ese mecanismo en esta dirección?
Los cuatro sitios donde suele fallar
- Un proxy. La dirección con la que usted interactúa no contiene lógica; reenvía cada llamada a otra dirección que guarda. Cambie la dirección guardada y el comportamiento cambia por completo mientras la dirección que le dieron sigue igual. Es, con diferencia, la excepción más común.
- Un propietario con poderes. La lógica está fija, pero unas funciones privilegiadas permiten a un propietario cambiar comisiones, pausar transferencias, acuñar o mover fondos. El código no cambió; lo que hace cambió igualmente.
- Un módulo o un registro. El núcleo está fijo, pero lee sus parámetros —o delega parte de su trabajo— en otro contrato que no lo está. La parte mutable simplemente se ha mudado una dirección más allá.
- Una pausa sin final. Una parada de emergencia sin caducidad automática y sin obligación de levantarla es, en la práctica, el poder de terminar el protocolo. No cambia nada del código y lo cambia todo respecto a lo que usted puede hacer.
Cómo comprobarlo, por orden
- ¿Está verificado el código fuente? En el explorador de bloques, la dirección debe mostrar código fuente verificado que corresponda al bytecode desplegado. Si no lo muestra, todo lo de abajo es incomprobable y puede detenerse aquí.
- ¿Es un proxy? Los exploradores suelen decirlo abiertamente. Si no, busque una ranura de implementación, un fallback que delega o una función de actualización. Un proxy no es un defecto, pero traslada la pregunta a quién puede invocar la actualización.
- ¿Qué funciones privilegiadas hay? Lea la lista de funciones con modificador de acceso. Pregunte de cada una: ¿qué es lo peor que puede hacerle a quien tiene este token?
- ¿Quién posee las direcciones privilegiadas? Un propietario que sea una cartera multifirma con retardo es un riesgo distinto de una sola clave. Y ambos son distintos de un propietario fijado en una dirección que nadie controla.
- ¿Hay valores fijados solo en el despliegue? Los valores establecidos al desplegar y nunca vueltos a escribir son la forma más fuerte de inmutabilidad, y se reconocen como tales en el código.
Cinco pasos, y a cada uno responden el explorador y el código fuente. Al final no ha creído la palabra de nadie y puede decir con precisión qué podría cambiar y qué no.
Qué no le da la inmutabilidad
Conviene ser claro con los límites, porque a veces la palabra se usa como si lo zanjara todo. Un contrato inmutable puede contener igualmente un error, y la inmutabilidad significa que ese error tampoco podrá parchearse. No dice nada de la calidad del código, nada de los activos de los que el contrato depende y nada de si la economía funciona.
Lo que sí le da es un objeto fijo que evaluar. Lo que concluya hoy sobre el código seguirá siendo cierto mañana. Eso vale mucho y no es lo mismo que seguridad.
Common questions
¿Un contrato actualizable es mala señal?
Por sí solo no. La actualizabilidad permite a un equipo corregir un defecto, cosa que la inmutabilidad no permite. Lo que importa es si se declara con claridad y quién la controla. La mala señal es un contrato actualizable descrito como inmutable.
¿Renunciar a la propiedad hace inmutable un contrato?
Elimina los poderes del propietario, que es parte del asunto. Pero si el contrato está detrás de un proxy con un administrador aparte, renunciar a la propiedad en la lógica no cambia nada respecto a quién puede sustituir esa lógica.
¿Puede una votación cambiar un contrato inmutable?
Solo si el contrato contiene un mecanismo que lo permita. Gobernar los parámetros que el contrato somete a voto no es lo mismo que gobernar el código, y la diferencia debería enunciarse en ambas direcciones.
Dónde se sitúa este proyecto
Assetrix se despliega como un contrato inmutable, sin vía de actualización y sin proxy, y nada de esta sección le pide aceptarlo por confianza: la comprobación de arriba se le aplica exactamente igual que a cualquier otro, una vez desplegado el contrato y verificado su código fuente.
Existen dos roles y sus poderes están enumerados, no descritos: un guardián nombra y destituye al operador; el operador fija la comisión del protocolo dentro de un techo fijado en el código, anuncia monedas para votación y puede levantar la bandera de pérdida de reserva con confirmación de los titulares. Ninguno puede alterar el precio de acuñación, la escalera de crecimiento ni las reglas del respaldo, introducir una comisión por rescatar una posición, admitir una moneda contra una votación, ni detener la devolución de fondos. Esto último son propiedades del contrato, fuera del alcance de cualquier rol y de cualquier votación.