Documentación de SolanaDesarrollo de programas

Limitaciones

El desarrollo de programas en la blockchain de Solana tiene algunas limitaciones inherentes asociadas. A continuación se muestra una lista de limitaciones comunes que puedes encontrar.

Bibliotecas de Rust

Dado que los programas onchain basados en Rust deben ser deterministas mientras se ejecutan en un entorno de un solo hilo con recursos limitados, tienen algunas restricciones en varias bibliotecas.

Los programas de Rust on-chain admiten la mayoría de libstd, libcore y liballoc de Rust, así como muchos crates de terceros.

Existen algunas limitaciones ya que estos programas se ejecutan en un entorno de un solo hilo con recursos limitados, además de ser deterministas:

  • Sin acceso a
    • rand
    • std::fs
    • std::net
    • std::future
    • std::process
    • std::sync
    • std::task
    • std::thread
    • std::time
  • Acceso limitado a:
    • std::hash
    • std::os
  • Bincode es extremadamente costoso en términos computacionales, tanto en ciclos como en profundidad de llamadas y debe evitarse
  • El formateo de cadenas de texto debe evitarse ya que también es costoso computacionalmente.
  • No hay soporte para println!, print!, usa el macro msg! en su lugar.
  • El runtime impone un límite en el número de instrucciones que un programa puede ejecutar durante el procesamiento de una instrucción. Consulta presupuesto de cómputo para más información.

Presupuesto de cómputo

Para prevenir el abuso de los recursos computacionales de la blockchain, a cada transacción se le asigna un presupuesto de cómputo. Exceder este presupuesto de cómputo resultará en el fallo de la transacción.

Consulta la documentación sobre restricciones computacionales para detalles más específicos.

Profundidad de la pila de llamadas - error CallDepthExceeded

Los programas de Solana están diseñados para ejecutarse rápidamente, y para facilitar esto, la pila de llamadas del programa está limitada a una profundidad máxima de 64 frames.

Cuando un programa excede el límite de profundidad permitido para la pila de llamadas, recibirá el error CallDepthExceeded.

Profundidad de llamada CPI - error CallDepth

Las invocaciones entre programas (Cross Program Invocation) permiten a los programas invocar a otros programas directamente, pero la profundidad está actualmente limitada a 4.

Cuando un programa excede la profundidad permitida de invocación entre programas, recibirá un error CallDepth

Soporte para tipos float de Rust

Los programas admiten un subconjunto limitado de operaciones float de Rust. Si un programa intenta usar una operación float que no está soportada, el runtime reportará un error de símbolo no resuelto.

Las operaciones con float se realizan mediante bibliotecas de software, específicamente las funciones incorporadas de float de LLVM. Debido a la emulación por software, consumen más unidades de cómputo que las operaciones con enteros. En general, se recomiendan operaciones de punto fijo cuando sea posible.

Las pruebas de matemáticas de la Solana Program Library informarán sobre el rendimiento de algunas operaciones matemáticas. Para ejecutar la prueba, sincroniza el repositorio y ejecuta:

cargo test-sbf -- --nocapture --test-threads=1

Los resultados recientes muestran que las operaciones con float requieren más instrucciones en comparación con sus equivalentes en enteros. Las implementaciones de punto fijo pueden variar pero también serán menos que sus equivalentes en float:

u64 f32
Multiply 8 176
Divide 9 219

Datos estáticos escribibles

Los objetos compartidos de los programas no admiten datos compartidos escribibles. Los programas se comparten entre múltiples ejecuciones paralelas utilizando el mismo código y datos compartidos de solo lectura. Esto significa que los desarrolladores no deben incluir variables estáticas escribibles o globales en los programas. En el futuro, se podría añadir un mecanismo de copia en escritura para admitir datos escribibles.

División con signo

El conjunto de instrucciones SBF no admite división con signo.

Is this page helpful?

Tabla de Contenidos

Editar Página