Los Share Protected Runtime Execution Enclaves -Enclaves de Ejecución de Tiempo de Ejecución Protegidos Compartidos- (SPREE), a veces denominados “agujeros de gusano de confianza”, son fragmentos de lógica comparables a los módulos de tiempo de ejecución en Substrate, pero que viven en la Relay Chain de Polkadot y pueden ser optado por parachains.
En resumen, SPREE se describe con las siguientes propiedades y funciones:
- Las parachains pueden optar por fragmentos lógicos especiales en tiempo de ejecución (como los contratos inteligentes).
- Estos fragmentos tienen su propio almacenamiento y su propio punto final XCM.
- Todas las instancias a través de parachains tienen una lógica idéntica.
- Se ejecuta junto a la lógica de la parachain.
- Protegido: el almacenamiento no puede ser alterado por la lógica de las parachains; los mensajes no pueden ser falsificados desde ellas por las parachains.
Origen #
El 28 de marzo de 2019 u/Tawaren, un miembro de la comunidad Polkadot, hizo un post en r/dot llamado “SmartProtocols Idea” y expuso una propuesta de Protocolos Inteligentes. La idea central del post era que XCMP tenía una complicación en cuanto a que era difícil verificar y probar que el código se ejecutaba en una parachain sin confianza. Una solución era instalar los SmartProtocols en la Relay Chain que serían blobs aislados de código con su propio almacenamiento por instancia que sólo podría ser cambiado a través de una interfaz con cada parachain. Los SmartProtocols son los precursores de SPREE.
¿Qué es un módulo SPREE? #
Los módulos SPREE son fragmentos de lógica (en términos concretos son blobs de código WebAssembly) que se suben a Polkadot a través de un mecanismo de gobernanza o por parachains. Una vez que el blob es subido a Polkadot, todas las demás parachains pueden decidir optar por la lógica. El módulo SPREE mantendría su propio almacenamiento independiente de la parachain, pero sería invocable a través de una interfaz con la parachain. Las parachains enviarán mensajes al módulo SPREE de forma sincrónica.
Los módulos SPREE son importantes para la arquitectura general de XCMP porque dan una garantía al código que se ejecutará en las parachains de destino. Aunque XCMP garantiza la entrega de un mensaje, no garantiza qué código se ejecutará, es decir, cómo interpretará el mensaje la parachain receptora. Mientras que XCMP logra el paso de mensajes sin confianza, SPREE es la interpretación sin confianza del mensaje y una parte clave de la utilidad de XCMP.
Los módulos SPREE son como las recetas de los libros de cocina. Por ejemplo, si damos una orden a un cocinero para que haga un suflé, y confiamos decentemente en la capacidad del cocinero, tenemos una vaga idea de lo que se hará, pero ninguna certeza real de cómo se hará. Sin embargo, supongamos que un cocinero tiene en su estantería el “Manual del Fabricante de Suflés” y se comprometió a hacer suflés sólo con este libro. Ahora también podemos consultar el mismo libro que tiene el cocinero, y tenemos un conocimiento preciso de lo que ocurrirá cuando le digamos al cocinero que haga un suflé. En este ejemplo, “hacer un suflé” era el mensaje en XCMP y el libro de cocina era el módulo SPREE.
En concreto, los módulos SPREE podrían ser útiles para diversas funcionalidades en Polkadot. Un caso de uso sugerido de los módulos SPREE es para un intercambio descentralizado sin confianza que se ofrece como funcionalidad a cualquier parachain sin ningún esfuerzo adicional de los desarrolladores de parachain. Uno puede imaginar que esto funciona teniendo un módulo SPREE que expone la interfaz para el aumento y disminución de los saldos de varios activos basados en un identificador único.
¿Por qué? #
El envío de mensajes a través de parachains en XCMP sólo asegura que el mensaje será entregado, pero no especifica el código que será ejecutado, o cómo el mensaje será interpretado por la parachain receptora. Habría formas de evitar esto, como solicitar un recibo verificable de la ejecución de la parachain receptora, pero en el caso desnudo, habría que confiar en la otra parachain. Tener código compartido que existe en apéndices a los que la parachain puede optar resuelve la necesidad de confianza y hace que la ejecución de los apéndices sea completamente libre de confianza.
SPREE sería útil para asegurar que la misma lógica se comparte entre parachains en los módulos de SPREE. Un caso de uso especialmente relevante giraría en torno al uso de las transferencias de tokens entre parachains en las que es importante que las parachains emisoras y receptoras se pongan de acuerdo sobre cómo cambiar el suministro total de tokens y una interfaz básica.
Ejemplo #

El diagrama anterior es una simplificación del sistema Polkadot.
En este diagrama, vemos que el código Wasm para el módulo “X” de SPREE se cargó en la Relay Chain de Polkadot. Los dos cilindros “A” y “B” representan dos parachains distintas que han optado por este módulo SPREE creando dos instancias distintas del mismo con sus propios puntos finales XCMP “A.X” y “B.X”.
En el ejemplo, suponemos que este módulo SPREE “X” contiene la funcionalidad para aumentar o disminuir el saldo de un activo concreto que es exclusivo de este módulo.
Al iniciar una transacción en A.X para disminuir un saldo particular en 1, un mensaje sobre XCMP puede ser enviado sin confianza a B.X para aumentar un saldo en 1.
Los collators (compiladores o recolectores), representados como el triángulo verde, son responsables de transmitir este mensaje desde la parachain A a la parachain B, así como de mantener el almacenamiento de cada instancia particular de A.X y B.X para sus respectivas parachains. Proporcionan pruebas de transiciones de estado válidas a los validadores de la Relay Chain representados como diamantes azules.
Los validadores pueden validar las transiciones de estado correctas de los módulos SPREE A.X y B.X si se les proporciona la raíz de estado anterior de las instancias del módulo SPREE, los datos del mensaje XCMP entre las instancias y la siguiente raíz de estado de la instancia. Realizan esta validación contrastándola con la función validate
proporcionada por la API del módulo SPREE. Se espera que los Collators sean capaces de proporcionar esta información para el progreso de sus parachains.