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 macromsg!
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 f32Multiply 8 176Divide 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?