paint-brush
Transacciones orientadas a activos de Radix: hacer que las transacciones sean significativaspor@RadixDLT
9,892 lecturas
9,892 lecturas

Transacciones orientadas a activos de Radix: hacer que las transacciones sean significativas

por Radix Publishing12m2023/06/28
Read on Terminal Reader

Demasiado Largo; Para Leer

La arquitectura de contrato inteligente de Radix ofrece todo en la plataforma para todo. Las transacciones de Radix contienen un "manifiesto" de instrucciones orientadas a activos que hacen que las transacciones sean comprensibles, componibles e increíblemente poderosas. El diseño de las transacciones de Radix partió de esos primeros principios de expectativa y control intuitivos del usuario.
featured image - Transacciones orientadas a activos de Radix: hacer que las transacciones sean significativas
Radix Publishing HackerNoon profile picture


En el artículo anterior , hablamos sobre cómo el concepto de las transacciones de blockchain actuales hace que sea imposible abordar varios problemas graves que enfrentan los usuarios y desarrolladores de DeFi, problemas que bloquean el potencial principal de DeFi y Web3.


El diseño de la mayoría de las plataformas de contratos inteligentes L-1 limita las transacciones a ser simplemente un mensaje enviado a un contrato inteligente de caja negra, y esa limitación significa que las transacciones simplemente no pueden ser lo suficientemente flexibles, poderosas o transparentes .


La única forma de solucionar realmente el problema es redefinir lo que significa una transacción en una cadena de bloques, y eso es exactamente lo que ha hecho Radix. Transacciones Radix (en la red de Babylon que incluye Capacidad única de contrato inteligente de Radix ) contienen un "manifiesto" de instrucciones orientadas a activos que hacen que las transacciones sean comprensibles, componibles e increíblemente poderosas.


Hablemos sobre qué es una transacción Radix y algunas de las cosas increíbles que hacen posibles para los usuarios y desarrolladores.

Redefiniendo una “Transacción”

Olvidando la tecnología por un momento, ¿cuál debería ser idealmente una transacción?


¿Qué debe contener para que sea lo suficientemente flexible como para hacer todo lo que hace que Web3 y DeFi sean emocionantes y también comprensibles y seguros para los usuarios?


Como punto de partida, veamos una transacción del mundo real que hace algo útil y ya es muy comprensible para cualquiera. Tome el ejemplo del uso de la versión del mundo real de un DEX: un quiosco de cambio de divisas.


Imagina que soy el cliente y me acerco a un mostrador de cambio en el aeropuerto para cambiar divisas. Podría describir la transacción de esta manera:


  • Saco 20 USD de mi billetera y los pongo en el mostrador.

  • Le informo al cajero de cambio que me gustaría cambiar esos 20 USD por GBP .

  • El cajero toma mis USD , toca su computadora por un momento y pone 16.08 GBP en el mostrador.

  • Estoy satisfecho con el tipo de cambio que obtuve, tomo la GBP y la guardo en mi billetera.


En este escenario típico del mundo real, aunque no tengo el control de cómo el intercambio hace negocios internamente, tengo el control total de lo que me importa: sacar activos de mi billetera, dar activos al intercambio con instrucciones para lo que quiero. quiero, aceptando (o rechazando) lo que me devuelven y volviendo a poner activos en mi billetera.


Ese conocimiento y control de lo que me importa es una expectativa natural y obvia cada vez que estoy interactuando con alguien y mis activos están involucrados. Controlo qué activos salen de mi billetera, especifico a quién se los doy y qué quiero, y puedo ver qué me regresa y aprobar. Eso es fundamentalmente lo que significa para mí la palabra "transacción" en el mundo real. ¿No sería bueno que las transacciones de blockchain funcionaran así?


En Radix, lo hacen. El diseño de las transacciones de Radix partió de esos primeros principios de expectativa y control intuitivos del usuario y modeló transacciones en la red de Radix de la misma manera.

Hacer que las transacciones sean significativas

Lo más importante para mí sobre la transacción del mundo real anterior es que es una descripción directa de los movimientos de activos entre mi billetera y el intercambio. Para que las transacciones de Radix funcionen así, el diseño de la plataforma debe comenzar con los activos. Y, afortunadamente, una de las características definitorias del diseño de la plataforma Radix (desde el Máquina virtual Radix Engine hacia Lenguaje de contrato inteligente de Scrypto ) es que la red tiene una comprensión nativa de los activos y el comportamiento de los activos .


Esta arquitectura "orientada a activos" le da a todo en la plataforma un comportamiento intuitivo cuando se trata de propiedad digital. Los tokens y los NFT no son saldos en contratos inteligentes; actúan como objetos físicos que se mueven de un lugar a otro. Las cuentas de usuario no son solo pares de llaves; son contenedores de activos donde el usuario tiene la facultad de retirar o administrar las reglas sobre qué tipo de depósitos aceptará. Los contratos inteligentes no se limitan a aceptar mensajes; pueden aceptar "cubos" de activos como insumos, como empujar dinero a través del mostrador de cambio.


Estas capacidades de la plataforma brindan las herramientas necesarias para reformular la definición de transacciones en Radix para que funcionen de manera intuitiva y predecible, similar a las transacciones del mundo real.


Las transacciones de Radix son un "manifiesto" de instrucciones que describen directamente los movimientos de activos entre cuentas y componentes (la forma de contrato inteligente de Radix).


Aquí hay un manifiesto de transacción real (sin direcciones, para mayor claridad) que describe un comercio como nuestro ejemplo de intercambio del mundo real:



Tenga en cuenta que no está mirando un resumen, ¡ así es como se ve el contenido de una transacción Radix real! De manera similar a cómo un usuario describiría una transacción del mundo real, el manifiesto describe la transacción en términos de los movimientos de activos que le importan al usuario.


Esto es lo que sucede en las 4 instrucciones de este manifiesto:


  1. Le digo a una de mis cuentas que retire 20 tokens de USD. (Espero que los tokens de 20 USD se devuelvan a algo llamado "superficie de trabajo de transacciones", que se puede considerar como el mostrador de cambio. Es solo un lugar temporal para que los activos se asienten cuando se mueven durante una transacción).
  2. Barro esos 20 USD de la encimera y los meto en un “cubo”. (Los cubos son solo contenedores de activos que puedo pasar a otras cosas).
  3. Paso directamente el cubo de USD al método de "comercio" del componente de intercambio. (Espero que el intercambio calcule el tipo de cambio y devuelva algunos tokens GBP a la mesa de trabajo).
  4. Meto el contenido de la encimera en mi cartera.


Firmo esta transacción, que es la forma en que mi cuenta sabe que puedo retirar los tokens de 20 USD, y la envío a la red.


Al igual que en el escenario del mundo real, si bien es posible que no tenga el control del funcionamiento interno del intercambio, sí tengo control directo sobre lo que me importa: los tokens que entran y salen de mis cuentas y con qué quiero interactuar.


Esto ya es una gran mejora con respecto a una transacción que solo envía un mensaje a un contrato inteligente. Pero falta algo…

Poner al usuario en control

En el ejemplo del mundo real, me aseguré de obtener 16,08 GBP (tal vez según el tipo de cambio actual y las tarifas esperadas) por mis 20 USD antes de aceptar la transacción. ¿No debería esperar poder hacer lo mismo con una transacción de Radix antes de firmarla y enviarla?


De hecho, yo (con la ayuda de mi software de billetera) puedo hacer lo mismo agregando una instrucción al manifiesto de transacción. Es la penúltima instrucción "ASSERT_WORKTOP_CONTAINS_BY_AMOUNT" aquí:



La instrucción en el manifiesto es "afirmar" que la encimera contiene al menos 16,08 tokens GBP antes de que vuelva a realizar el depósito en mi cuenta. Esto significa que cuando la red procesa esta transacción, si esa afirmación no es cierta (por ejemplo, si el intercambio solo devolvió 15 GBP o devolvió el tipo de token incorrecto), la red rechazará la transacción. Todo el asunto no sucederá porque no obtuve lo que esperaba.


Esto funciona porque los manifiestos de transacción son atómicos . Esa es solo una forma elegante de decir que todo en el manifiesto de la transacción debe ejecutarse correctamente sin problemas o, de lo contrario, nada sucederá.


Esto es increíblemente poderoso. Al igual que el intercambio del mundo real, no tengo que preocuparme en absoluto por la lógica del intercambio interno. Obtengo protección contra cosas como el desliz o estar al frente de un resultado que no quería de una manera que está totalmente bajo mi control sin depender de la lógica del contrato inteligente.


Radix Wallet puede agregar directamente mis expectativas como usuario al manifiesto de transacciones por mí, y la red garantizará que se respeten todas esas expectativas; de lo contrario, mis fondos nunca saldrán de mi bolsillo.

Arreglando la experiencia del usuario de transacciones

Tener transacciones estructuradas de esta manera también es exactamente lo que se necesita para permitir que Radix Wallet brinde a los usuarios el tipo de UX que las transacciones de activos Web3 necesitan para estar listas para la corriente principal.


Para ver lo que eso significa, así es como nuestra transacción de intercambio se presentaría al usuario en Radix Wallet:



Esta vista no fue creada por la dApp de Exchange. Esta es la billetera Radix en sí misma que resume de manera segura lo que me importa al leer directamente el contenido de la transacción en sí . Y si observa nuevamente el manifiesto de transacción anterior, probablemente pueda ver cómo Radix Wallet puede traducirlo automáticamente en la interfaz de usuario de resumen para el usuario:


  • RETIRO: los retiros de las cuentas se muestran directamente y la billetera puede ver qué cuentas son propiedad del usuario de la billetera.
  • Uso de dApps: otros componentes que están involucrados en la transacción se enumeran como dApps comprensibles para el usuario. (Para saber cómo Radix Wallet hace esto, eche un vistazo a Radix's Sistema de definición de dApp que permite a un desarrollador asociar componentes con una descripción clara en el libro mayor de su dApp).
  • DEPÓSITO: Los depósitos a las cuentas del usuario también se muestran directamente. Cualquier depósito que no tenga una cantidad específica en el manifiesto de la transacción se "estima" a través de una ejecución preliminar de la transacción, y se agrega automáticamente una "garantía" (la instrucción "afirmar" que describimos anteriormente) de acuerdo con las preferencias del usuario.
  • TARIFA DE TRANSACCIÓN: Y, por supuesto, la billetera muestra la tarifa de transacción requerida (más sobre eso a continuación).


El resultado es un resumen de la transacción que es significativo y relevante para el usuario, se garantiza que es preciso y es totalmente confiable . El usuario sabe exactamente lo que sucederá con sus cuentas y activos si firma, como es de esperar. Cuando cada parte de la pila está diseñada para trabajar en conjunto para habilitar un producto con capacidad estándar, no tiene que renunciar a una buena experiencia de usuario para descentralizarse.

Autenticación clara y flexible

Hablemos de otra herramienta en la caja de herramientas de transacciones de Radix.


La máquina virtual Radix Engine incluye un potente sistema de autenticación incorporado para componentes que utilizan "insignias". Al igual que una tarjeta de membresía en su billetera, las insignias son activos que posee y que puede "presentar" como prueba en una transacción. Los componentes pueden verificar que haya presentado una prueba determinada como requisito previo para hacer algo.


Presentar una prueba de una credencial es solo otra instrucción en el manifiesto de transacción que solicita esa prueba de la cuenta que posee la credencial. Es como sacar una tarjeta de membresía de mi billetera real para mostrársela a alguien.


Esto significa que, una vez más, Radix Wallet puede mostrar al usuario exactamente lo que está pasando. Imagine que nuestro dApp de intercambio necesita ver una prueba de que tengo una insignia que indica que he completado algunos controles KYC de un tercero. El resultado es una transacción que se presenta así:



Una vez más, recibo una presentación clara de que se está entregando una insignia determinada y puedo decidir si me siento cómodo con ella antes de firmar.

Componibilidad atómica bajo demanda y sin código

Ahora hablemos de la flexibilidad y el poder de las transacciones de Radix. Uno de los superpoderes del manifiesto de transacciones es la capacidad de "componer" varias dApps en una sola transacción atómica, sin código de contrato inteligente.


Imagínese que quiero tomar un préstamo de un contrato inteligente de dApp de préstamo, luego usar ese préstamo para realizar una determinada operación desde un contrato inteligente DEX. Es posible que desee asegurarme de que solo obtendré el préstamo si, de hecho, puedo realizar esa operación.


En otras redes, solo tiene una opción: escribir e implementar un contrato inteligente especial al que pueda llamar que cuece en esta lógica. Después de que se implemente, ese contrato inteligente recibirá su solicitud en una transacción, llamará al contrato inteligente de préstamo, intentará llamar a DEX (suponiendo que haya recibido los fondos del préstamo) y asegúrese de verificar que el intercambio de DEX se haya realizado correctamente. Este es un proceso de varios pasos que requiere experiencia en contratos inteligentes, toma tiempo, tiene un solo propósito y, a menudo, es absolutamente costoso en tarifas de red.


En Radix, es solo un manifiesto de transacción de algunas instrucciones:


  • Llame al componente de préstamo para sacar el préstamo
  • Ponga los tokens prestados en un balde y páselos al DEX
  • Afirma que el DEX devolvió lo que esperabas (la transacción falla si esto no es cierto)
  • Deposita los resultados en tu cuenta


Puede crear este manifiesto de transacción simple, a pedido, en una interfaz web simple. Sin código de contrato inteligente o implementación anticipada, sin controles elaborados sobre los resultados del contrato inteligente; simplemente describa cómo desea que los activos se muevan entre su cuenta y los componentes de dApp y envíelos.


Esto abre un sinfín de nuevas posibilidades. Segmentos completos de DeFi dApps que ayudan a los usuarios a encontrar las mejores rutas para los intercambios pueden construirse simplemente como interfaces de sitios web, por parte de desarrolladores que nunca tocan el código de contrato inteligente. Se pueden unir combinaciones altamente complejas de protocolos financieros en tiempo real para aprovechar oportunidades efímeras. Y al usar barandillas de "afirmación" en las transacciones, se pueden colocar límites claros y directos en el resultado final que se desea sin preocuparse por el funcionamiento interno de los componentes que se están llamando.

Tarifas de red pagadas por dApp

Aquí hay otra característica importante de las transacciones de Radix para desarrolladores. A muchos desarrolladores de dApp les gustaría considerar las tarifas de la red como un costo de infraestructura que asumen para sus usuarios, para que los usuarios nunca tengan que pensar en ellos. Por ejemplo: tal vez sus usuarios solo quieran realizar transacciones en USDC y nunca tocar ETH, o tal vez solo quieran ofrecer esto como un beneficio invisible para los usuarios, como un comerciante que paga la tarifa de transacción de Visa cuando utiliza la tarjeta de débito de un cliente.


Las transacciones actuales hacen que esto sea imposible: el firmante debe ser el pagador de la tarifa. En Radix, el pago de tarifas es mucho más flexible; cualquier cosa puede pagarlo en el curso de la transacción.


De hecho, estaba haciendo un poco de trampa cuando les mostré los manifiestos de transacción anteriormente. En el caso típico en el que el usuario paga la tarifa de transacción, hay una instrucción de manifiesto adicional en una de las cuentas del usuario para "bloquear" la tarifa de red para la transacción. Pero no se requiere que el usuario bloquee esa tarifa si algo más está dispuesto a bloquear esa tarifa en el curso de la transacción.


Por ejemplo: imagine que soy un usuario conocido y registrado en una dApp de intercambio y les gustaría pagar las tarifas de la red por mí cuando uso su sistema. Me emiten un activo de credencial de usuario que tengo en una de mis cuentas que representa mi registro. Ahora, en las transacciones, puedo presentar esa insignia al componente de intercambio (tal como vimos anteriormente con la insignia KYC), y el intercambio puede verificar esa prueba y luego bloquear la tarifa por la transacción. Si lo hace, mi Radix Wallet ve que no se requiere bloqueo de tarifa adicional, y es como si la tarifa de la red fuera mágicamente cero.

Una nota final sobre fragmentación

Para aquellos a quienes les gusta profundizar en la tecnología, hay otro maravilloso beneficio del modelo de transacción de Radix: se fragmenta bien.


De cara a la actualización de la red de Xi'an cuando el protocolo de consenso Cerberus paralelizado masivamente de Radix ( recientemente revisado por pares ) se desplegará para ofrecer una escalabilidad ilimitada, es crucial que el modelo de transacción encaje.


Para permitir el paralelismo masivo, Cerberus confía en poder separar el estado de cuentas y componentes a través de un número prácticamente ilimitado de fragmentos (o "subprocesos" podría ser un término más descriptivo), al tiempo que puede saber específicamente cuáles de esos fragmentos se deben reunir para obtener consenso para cada transacción .


En la superficie, esto podría sonar algo parecido a Cardano, que fragmenta su estado en bits de estado llamados "eUTXO". Entonces, las transacciones de Cardano (similares a Bitcoin) incluyen una especificación directa de qué eUTXO se utilizarán para crear el resultado de una transacción determinada. El problema con esto es que crea controversia . Un contrato inteligente dado (como, por ejemplo, un DEX) puede tener un conjunto de tokens con los que muchas personas intentan interactuar al mismo tiempo. Si las transacciones eligen tokens eUTXO individuales para usar dentro de ese grupo, es casi seguro que los clientes a menudo elegirán los mismos eUTXO y, por lo tanto, provocarán que muchas transacciones fallen, aunque haya muchos tokens en el grupo para satisfacer los deseos de todos.


En cambio, en Radix, la lista de instrucciones en un manifiesto de transacción es una expresión de intención . No necesito especificar las piezas individuales de estado que se utilizarán; Solo tengo que especificar con qué cuentas y componentes quiero interactuar, como naturalmente quiero hacer de todos modos.


Luego, cuando la red Radix realmente procesa la transacción, esa intención se puede traducir de manera determinista en una definición de qué estado debe actualizarse y, a su vez, qué fragmentos deben estar involucrados en el consenso. Eso significa que dos transacciones que interactúan con el mismo contrato inteligente no crearán automáticamente una carrera en la que solo una pueda tener éxito. 10 personas pueden enviar una transacción de manera confiable para retirar 5 tokens de un grupo de 50 al mismo tiempo, y todos pasarán uno tras otro sin problemas.

La línea de fondo

Al redefinir cómo funcionan todas las transacciones en Radix, haciendo uso de las capacidades nativas orientadas a los activos de Radix, se desvanecen múltiples problemas de desarrolladores y usuarios. Este tipo de solución no se puede parchear en una red existente: todas las suposiciones sobre cómo funcionan los contratos inteligentes, los activos y las transacciones ya están integradas en su protocolo y el diseño de la máquina virtual.


La nueva forma de transacciones de Radix se presenta junto con la capacidad de contrato inteligente de Scrypto y la nueva Cartera Radix en la red principal de Radix en su lanzamiento "Babylon".