FunC tiene una empinada curva de aprendizaje y queremos ver más ejemplos de contratos fáciles y sencillos con amplios comentarios y documentación. Así que el objetivo principal es proporcionar un espacio lúdico de fácil acceso donde los desarrolladores puedan practicar y perfeccionar sus habilidades básicas de programación en FunC y tal vez recibir un premio en Toncoin. Tenga en cuenta que las mejores presentaciones se publicarán en GitHub.
Habrá 5 conceptos simples para implementar. Los conceptos se eligen para que sean fáciles de entender incluso para personas sin experiencia previa en FunC o en el desarrollo de contratos inteligentes.
Cada tarea se puntúa de 0 a 100 puntos dependiendo del número de pruebas superadas.
Cada ejecución del método get está limitada por 100 000 000 unidades de gas. Este límite es lo suficientemente alto como para descartar los bucles infinitos. Cualquier solución práctica, independientemente de lo optimizada que se encuentre, tendrá cabida.
El bot para recibir envíos es @toncontests_bot. El participante podrá enviar soluciones y recibir el resultado tras un breve retraso en la evaluación cualquier número de veces, pero no más de 5 veces por hora. La mejor solución enviada (con la mayor puntuación total entre las 5 tareas) se utilizará para determinar la clasificación final.
Los organizadores del concurso se reservan el derecho de publicar las soluciones de los participantes con nombres de usuario (decididos por los propios participantes) después del concurso.
El uso de gas no afectará a la clasificación. Las firmas de todas las funciones descritas en la tarea, las condiciones no deben ser modificadas.
Escriba el método que calcula el común divisor mayor de dos enteros mayores o iguales a 1 y menores que 1048576.
() recv_internal() { }(int) gcd(int a, int b) method_id { }
Escriba el método que fusiona dos hashmaps en uno. Cuando las claves de los hashmaps se cruzan - los valores del primer hashmap deben ser utilizados, mientras que los pares clave/valor descartados deben ser almacenados en un hashmap separado. El método debe devolver dos hashmaps (diccionario_fusionado, diccionario_descartado). Si alguno de los hashmaps resultantes está vacío, debe ser representado por un valor "nulo". La longitud de la clave del hashmap es de 256 bits. Cada hashmap tiene como máximo 256 elementos.
() recv_internal() { } (cell, cell) merge_hashmaps(cell dict1, cell dict2) method_id { }
Escriba el método que compruebe que la celda contiene un mensaje válido de acuerdo con repository Si el mensaje no es válido por cualquier razón - el método debería devolver (0, null), de lo contrario debería devolver (-1, [slice src, slice dest, int amount] ), donde src, dest y amount representan el origen del mensaje, el destino del mensaje y la cantidad adjunta de TON. Si alguno de esos valores no se presenta (o se presenta como slice addr_none) en la celda del mensaje - debe ser sustituido por null. Se garantiza que para todas las pruebas cualquier tipo de datos HashmapE en la estructura del mensaje es hashmaps vacío (tiene el constructor hme_empty).
() recv_internal() { } (int, tuple) validate_message(cell message) method_id { }
Escriba los métodos: a) para la serialización de la tupla de valores arbitrarios de diferentes tipos a la celda b) para la deserialización de la celda creada por el método anterior a la tupla original
El método serialize
recibe como entrada una tupla con un número arbitrario de elementos de 0 a 128 (tanto 0 como 128 elementos están permitidos) y da como resultado la celda. Los elementos de la tupla pueden ser null
, int
, cell
, slice
, tuple
(con las mismas limitaciones que la tupla original). Se garantiza que el nivel máximo de anidamiento de las tuplas es inferior a 4 y el número total de elementos inferior a 1024.
El método deserialize
obtiene una celda producida por el método serialize
y debe devolver la tupla de origen.
() recv_internal() { } (cell) serialize(tuple values) method_id { } (tuple) deserialize(cell serialized) method_id { }
Escriba el método que para cualquier MsgAddressInt válido con el constructor addr_std (revise el repository) devuelve el slice que contiene la dirección rebotada codificada en ASCII base64url (sin test-only flag), revise la documentation
() recv_internal() { } (slice) encode_address(slice Address) method_id { }
También hay bonificaciones más allá del fondo de premios básico, que se describen en el chat oficial del concurso.