Resumen
Por defecto 200K CUs por instrucción, 1.4M máximo por transacción. Usa las
instrucciones SetComputeUnitLimit y SetComputeUnitPrice para optimizar. La
tarifa de prioridad se basa en las CUs solicitadas, no en el uso real.
Límite de unidades de cómputo
A cada instrucción se le asigna
por defecto 200,000 CUs,
y cada transacción tiene un límite de
1,400,000 CUs.
Cuando no hay una instrucción SetComputeUnitLimit explícita, el
valor por defecto se calcula
según el tipo de instrucción:
default_cu_limit = (num_non_migratable_builtin_instructions * 3,000)+ (num_not_migrated_builtin_instructions * 3,000)+ (num_non_builtin_instructions * 200,000)+ (num_migrated_builtin_instructions * 200,000)
- Instrucciones integradas (System Program, Stake, Vote, etc. que no han
sido migradas a SBF): cada una asignada
MAX_BUILTIN_ALLOCATION_COMPUTE_UNIT_LIMIT= 3,000 CUs (según SIMD-0170). - Instrucciones no integradas (programas SBF desplegados por el usuario):
cada una asignada
DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT= 200,000 CUs. - Integradas en migración que han completado la migración a SBF (controladas por feature gate): tratadas como no integradas (200,000 CUs cada una).
El resultado se limita a MAX_COMPUTE_UNIT_LIMIT (1,400,000).
Puedes anular este valor por defecto incluyendo una instrucción
SetComputeUnitLimit
en tu transacción.
Para determinar el límite de CU apropiado:
- Simula la transacción para medir el consumo de CU.
- Añade un margen de seguridad del 10% al valor simulado.
La tarifa de prioridad se determina por el límite de unidades de cómputo solicitado en la transacción, no por el número real de unidades de cómputo utilizadas. Si estableces un límite de unidades de cómputo demasiado alto o usas la cantidad por defecto, pagas por unidades de cómputo no utilizadas.
Instrucciones de presupuesto de cómputo
El
Programa de presupuesto de cómputo
(ComputeBudget111111111111111111111111111111) tiene cuatro instrucciones.
| Variante | Discriminador | Parámetro | Tipo | Descripción |
|---|---|---|---|---|
RequestHeapFrame | 1 | bytes | u32 | Tamaño de heap solicitado en bytes para cada programa en la transacción |
SetComputeUnitLimit | 2 | units | u32 | CUs máximas que la transacción puede consumir |
SetComputeUnitPrice | 3 | micro_lamports | u64 | Precio de CU en micro-lamports |
SetLoadedAccountsDataSizeLimit | 4 | bytes | u32 | Bytes totales máximos de datos de cuenta que la transacción puede cargar |
Fuente: enum ComputeBudgetInstruction
Restricciones y condiciones de error
Las siguientes reglas se aplican al procesar instrucciones de presupuesto de cómputo:
- Una por tipo: solo se permite una de cada variante de instrucción por
transacción. Incluir duplicados causa un error
DuplicateInstruction(la transacción completa falla). RequestHeapFrame: el valor debe estar entreMIN_HEAP_FRAME_BYTES(32 KiB) yMAX_HEAP_FRAME_BYTES(256 KiB), y debe ser un múltiplo de 1024. De lo contrario, la transacción falla conInvalidInstructionData. El tamaño del heap se aplica a cada programa invocado en la transacción (incluyendo CPIs).SetComputeUnitLimit: se acepta cualquier valoru32. El límite efectivo se limita aMAX_COMPUTE_UNIT_LIMIT(1 400 000).SetComputeUnitPrice: se acepta cualquier valoru64(0 au64::MAX).SetLoadedAccountsDataSizeLimit: el valor debe ser mayor que 0 (NonZeroU32). Un valor de 0 causaInvalidLoadedAccountsDataSizeLimit. El límite efectivo se limita aMAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES(64 MiB).- Datos no reconocidos: cualquier instrucción enviada al programa de
presupuesto de cómputo que no se deserialice a una variante conocida falla con
InvalidInstructionData.
El modelo de costos del planificador que se describe a continuación describe la estimación de costos previa a la ejecución interna del validador. La mayoría de los desarrolladores solo necesitan las instrucciones de presupuesto de cómputo anteriores.
Modelo de costos del planificador
El planificador del validador utiliza un modelo de costos para estimar el uso de recursos de la transacción antes de la ejecución. Estas estimaciones de costos previas a la ejecución determinan si una transacción cabe dentro de la capacidad restante del bloque. Son independientes de la medición de CU que ocurre durante la ejecución.
El costo total del planificador es la suma de cinco componentes
(UsageCostDetails::sum):
total_cost = signature_cost+ write_lock_cost+ data_bytes_cost+ programs_execution_cost+ loaded_accounts_data_size_cost
Componentes de costo
| Componente | Descripción |
|---|---|
| Costo de firma | Costo por firma para cada tipo de firma |
| Costo de bloqueo de escritura | Por cuenta escribible |
| Costo de instruction data | Basado en el total de bytes de instruction data |
| Costo de ejecución de programas | Límite de CU del presupuesto de cómputo o predeterminado |
| Costo de datos de cuentas cargadas | Basado en el tamaño total de datos de cuentas cargadas |
Todos los valores están en unidades de cómputo.
Constantes de costo del planificador
| Constante | Valor |
|---|---|
COMPUTE_UNIT_TO_US_RATIO | 30 |
SIGNATURE_COST | 720 CUs |
SECP256K1_VERIFY_COST | 6,690 CUs |
ED25519_VERIFY_COST | 2,280 CUs |
ED25519_VERIFY_STRICT_COST | 2,400 CUs |
SECP256R1_VERIFY_COST | 4,800 CUs |
WRITE_LOCK_UNITS | 300 CUs |
INSTRUCTION_DATA_BYTES_COST | 4 |
Costo de transacción de voto
Las transacciones de voto utilizan un costo estático de 3,428 CUs independientemente de su contenido real.
Límites de bloque
El planificador aplica límites por bloque. Si agregar una transacción excediera cualquier límite, no se incluye en el bloque.
| Límite | Valor |
|---|---|
MAX_BLOCK_UNITS | 60,000,000 |
MAX_WRITABLE_ACCOUNT_UNITS | 12,000,000 |
MAX_VOTE_UNITS | 36,000,000 |
MAX_BLOCK_ACCOUNTS_DATA_SIZE_DELTA | 100 MB |
SIMD-0286
propone aumentar MAX_BLOCK_UNITS a 100,000,000.
Constantes de presupuesto de ejecución
Las siguientes constantes de
execution_budget.rs
definen los límites de tiempo de ejecución durante la ejecución de
transacciones:
| Constante | Valor | Descripción |
|---|---|---|
MAX_COMPUTE_UNIT_LIMIT | 1,400,000 | Límite máximo de CU por transacción |
DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT | 200,000 | CU predeterminadas por instrucción no integrada |
MAX_BUILTIN_ALLOCATION_COMPUTE_UNIT_LIMIT | 3,000 | CU predeterminadas por instrucción integrada (SIMD-0170) |
DEFAULT_HEAP_COST | 8 CU | Coste por página de heap de 32 KiB |
DEFAULT_INVOCATION_COST | 1,000 CU | Coste de una invocación CPI |
INVOKE_UNITS_COST_SIMD_0339 | 946 CU | Coste de invocación CPI con SIMD-0339 |
MIN_HEAP_FRAME_BYTES | 32,768 | Tamaño mínimo de heap (32 KiB) |
MAX_HEAP_FRAME_BYTES | 262,144 | Tamaño máximo de heap (256 KiB) |
MAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES | 67,108,864 | Datos de cuenta cargados máximos por transacción (64 MiB) |
MAX_INSTRUCTION_STACK_DEPTH | 5 | Profundidad máxima de pila de instrucciones (nivel superior + CPI) |
MAX_INSTRUCTION_STACK_DEPTH_SIMD_0268 | 9 | Profundidad máxima de pila de instrucciones (nivel superior + CPI) con SIMD-0268 |
MAX_CALL_DEPTH | 64 | Profundidad máxima de llamada SBF a SBF dentro de un programa |
STACK_FRAME_SIZE | 4,096 bytes | Tamaño de un marco de pila SBF |
Is this page helpful?