Este es el segundo artículo de nuestra serie sobre canales de pago en la purple abierta de Telegram. En la primera parte, presentamos la purple, detallamos nuestra experiencia en torneos y explicamos cómo funciona sincrónicamente y sin problemas. Como la próxima adición a la serie, este artículo detalla cómo desarrollamos un canal de pago de purple simultáneo durante el concurso TON en septiembre. Aquí, solo hablaremos sobre Fift (el propósito del lenguaje de programación common de TON) y FunC (el lenguaje de programación de TON para escribir contratos inteligentes).
El documento TON blanco proporciona información más detallada sobre los canales de pago, pero mientras tanto los explicaremos nuevamente. -cadena utilizando activos en cadena. En nuestro caso - GRAM. Es imposible para una parte engañar a otros fuera de la cadena, y las transacciones se realizan más rápido que la implementación de las transacciones de cadena de bloques de la capa uno, ya que solo se utilizan dispositivos de usuario para completarlas. sin tener que escribir en la cadena de bloques. Hay dos operaciones principales: depósito y retiro. La eliminación es la más difícil de implementar.
Para realizar una eliminación adecuada, los usuarios deben proporcionar la información más reciente sobre el estado de su canal. El estado consta de los pasos y la firma digital de cada participante, lo que significa que no es posible proporcionar un estado correcto de los datos que aún no hayan sido aprobados por ambas partes. Fift y compilarlo en un archivo .boc (bolsa de celdas). Al hacerlo, muchas células se asocian entre sí. Los GRAM deben enviarse a la dirección recibida durante la operación de ejecución del script. Una vez que los GRAM estén en la dirección, envíe el archivo .boc a la purple y envíe el contrato.
Para crear una función de llamada, escriba una secuencia de comandos que envíe un mensaje externo al contrato inteligente enviado.
Por lo common, cualquier cosa en el TON es una celda con alguna referencia. Una bolsa de celdas es una estructura de datos diseñada por el equipo de Telegram. Este es un modelo de actor. Hay más detalles en el documento técnico de TON: "todo es una bolsa de células". Construye una celda que interactuará con otra celda cuando se implemente.
Cada canal de pago entre pares es un único contrato inteligente. Veamos los segmentos de un contrato inteligente.
Relacionado: Qué esperar de la purple abierta de Telegram: una perspectiva del desarrollador
Componente de implementación
Se utiliza un script Fift serializado para implementar un contrato. Se guarda en un archivo .boc y se envía a la purple a través de TON Cli, el cliente ligero de la purple.
La última celda de la pila es el resultado de ejecutar el script Fift anterior.
Los segmentos comunes de un script de implementación de Fift incluyen (pero no se limitan a):
- Código de contrato inteligente como una sola celda (típicamente escrito en FunC, luego compilado en código Fift ASM e incluido en básico . Quinto archivo usando path-to-compiled-asm.fif ).
- Almacenamiento inicial de contratos inteligentes (ver más abajo).
- Nueva dirección de contrato inteligente (el hash del estado inicial del contrato inteligente que también incluye la celda de código de contrato inteligente y el almacenamiento de celda inicial). .
- Una celda de mensaje externo para el inicio, serializada en bytes y empaquetada en el archivo 05] .boc que consta de todos los datos de los puntos 1-Four y algunos adicionales que aún carecen de documentación.
Cuando se compiló .boc sería necesario enviar una cierta cantidad de GRAM a la dirección del contrato inteligente. El archivo .boc debe enviarse a la purple para iniciar un contrato inteligente. El valor de GRAM depende del tamaño y la cantidad de cálculos de mensajes de celda de contrato externo (no solo su código). Los precios del fuel flamable se deducen del steadiness del contrato inteligente. Este monto es el mínimo requerido para pagar el fuel durante el despliegue.
Una representación de almacenamiento:
- seqno 32 bits
- contract_status Four bits
- first_user_pubkey. Clave pública de primera parte 256 bits
- second_user_pubkey. Clave pública de la segunda parte 256 bits
- time_to_send. Tiempo para ser enviado después del primer estado actual presentado 32 piezas (válido hasta 2038)
- depositSum. Suma depositada de dos participantes hasta 121 bits
- state_num 64 bits . El volumen precise de estados que ocurrieron
Una celda contiene hasta 1023 bits y cuatro referencias a otras celdas. Pudimos ajustar todo el almacenamiento en una celda sin una sola referencia. Nuestro almacenamiento puede contener un máximo de 765 piezas. ] 0x2 - Depósito de usuario 1
0x3 - Depósito de usuario 2
0x4 - Depósito bloqueado. Es posible asignar un estado a contratos inteligentes
0x5 - El usuario 1 dio el estado
0x6 - El usuario 2 dio el estado
0x7 - Canal cerrado
Depósito
La función de depósito recibe un mensaje de una billetera easy (transferencia) con una carga útil adicional en el cuerpo.
Depósito GRAM al canal:
- El usuario genera un envío adicional al cuerpo con un mensaje (por ejemplo, 1 bit) y su firma en un archivo .fif separado.
- La carga útil del cuerpo se compiló en un archivo .boc .
- La carga útil del cuerpo se carga desde el archivo .boc en un archivo .fif como una transferencia de "cuerpo" de referencia (el "19459005] .fif es responsable de transferencia de GRAM de la billetera).
- La función recv_external se llamó con argumentos (la cantidad de depósito y anuncio de ropa de destino del canal) cuando se compiló .fif se envió el archivo a la purple.
- Se ejecutó la función send_raw_message . Se estableció GRAM y se enviaron paraguas corporales adicionales a una dirección de destino del canal P2P.
- Se llama a la función recv_internal del contrato inteligente de canal P2P. Los contratos de canal reciben los GRAM.
Se puede llamar a la función de depósito si el estado del contrato inteligente de canal P2P es 0x1 o 0x2 o 0x3 .
Verificaciones del código FunC. el estado:
Código FunC responsable de cambiar estado del tracto:
Reembolsos
Se pueden devolver los fondos si una contraparte no hace un depósito a tiempo.
Para hacer eso, un usuario debe proporcionar su dirección y firma a través de un mensaje externo. Los fondos serán reembolsados si la firma dada pertenece a la clave pública 1 o la clave pública 2 (personas que realizan un depósito) y el estado del contrato es 0x2 o 0x3 .
Código FunC responsable de validar una solicitud de reembolso:
Cada persona debe proporcionar un estado de salida, esta firma de estado y una firma de mensaje corporal (canal P2P anterior con ambos participantes).
La firma del mensaje del cuerpo se almacena en el corte principal, el estado se almacena en una referencia separada, y las firmas de estado se almacenan como referencias de "firma" para evitar el desbordamiento de la celda.
Pasos de eliminación:
-
Examinar la firma del mensaje cuerpo e identificar al participante.
Verifique que este sea el turno del participante o que hayan pasado 24 horas desde que se ingresó el último estado. Escriba el turno del participante precise ( 0x5 o 0x6 ) al estado del contrato .
Un ejemplo de un mensaje de cuerpo de firma correcto para el propietario de first_user_pubkey :
Entonces tenemos que demostrar que el inteligente la dirección del contrato escrita al estado es la dirección actual del contrato:
A continuación, debemos verificar las firmas bajo el estado:
Posteriormente, hay dos afirmaciones:
- El valor depositado del almacenamiento debe ser igual a la suma del saldo whole de los participantes. [19659016] El nuevo número de estado ingresado debe ser mayor o igual que el anterior.
En el caso de new_state_num necesitamos almacenar new_state_num con new time_to_send igual a now () + 8640 (24 horas desde la hora precise), y también escriba el estado actual del contrato (0x5 si el primer participante llama, de lo contrario 0x6 ).
En otros casos, si new_state_num == state_num necesitamos ingresar dos referencias adicionales a la referencia de "firma" incluyen la dirección de cada participante y la firma bajo su dirección.
Si las firmas son correctas, los GRAM se eliminan de una dirección y se colocan en la dirección del propietario -ari.
Cada vez que se produce una llamada exitosa, tenemos que conservar todos los datos de almacenamiento, incluso si no cambian.
Problemas no resueltos
El usuario usó el contrato y los participantes aceptaron las comisiones. El acuerdo con las comisiones en nuestro caso llegó fuera de cadena.
Todavía no hemos descubierto cómo calcular la comisión whole, teniendo en cuenta el hecho de que los jugadores pueden escribir un estado no relacionado y registrar los estados reales a partir de entonces. Tenga en cuenta que tenemos que pagar una tarifa del contrato inteligente del canal P2P cada vez que llamamos con éxito a la función recv_internal o recv_external .
Como ya se mencionó, necesitamos agregar un valor GRAM a una dirección de contrato inteligente futura no especificada para comenzar.
El último día de la competencia, los desarrolladores de TON se comprometieron con la biblioteca stdlib.fc con una nueva función que permitió la adquisición del saldo actual de los contratos inteligentes.
Sugerencias para posibles ¡la solución a este problema es bienvenida!
Conclusión
FunC and Fift permite a cualquier desarrollador acceder al mundo de la ingeniería de software program de bajo nivel, abriendo nuevas oportunidades y características para para desarrolladores de blockchain que ya están acostumbrados a Ethereum o cualquier plataforma de plataforma de ct inteligente. Es importante que TON sea una blockchain fragmentada, por lo que implementar contratos inteligentes aquí es difícil. Por ejemplo, los contratos de Ethereum se ejecutan al mismo tiempo y sin la necesidad de manejar situaciones como esperar una respuesta de otro contrato. Nuestra solución es más difícil de implementar que Solidity, pero siempre tiene compensaciones. Hemos desarrollado un contrato inteligente avanzado con TON, y la forma en que se maneja el equipo de TON es muy impresionante. Esperamos ver muchas bibliotecas y herramientas que ayudarán a distribuir y construir contratos FunC.
Disfrutamos mucho de todas las tareas y deseamos tener más tiempo para implementarlas. Sin embargo, ganamos dos premios del Concurso TON: primer lugar para la mejor sincronización de canales de pago, así como el tercer lugar para el mejor canal de pago asincrónico.
Compartiremos nuestro propio comentario private en la tercera parte.
Las opiniones, opiniones y opiniones expresadas aquí son las de los autores y no necesariamente reflejan o representan las opiniones y opiniones del Cointelegraph.
Este artículo es coautor de Nick Kozlov y Kirill Kuznetsov .
Nick Kozlov es el CTO y cofundador de Button Pockets, desarrollador e investigador de software program, así como uno de los ganadores en el concurso TON.
Kirill Kuznetsov fue el cofundador de Button Pockets, así como uno de los ganadores del concurso en TON.
Entradas relacionadas