Orçamento de computação

Resumo

Padrão de 200 mil CUs por instrução, máximo de 1,4 milhão por transação. Use as instruções SetComputeUnitLimit e SetComputeUnitPrice para otimizar. A taxa de prioridade é baseada nas CUs solicitadas, não no uso real.

Limite de unidades de computação

Cada instrução recebe um padrão de 200.000 CUs, e cada transação tem um limite de 1.400.000 CUs. Quando nenhuma instrução SetComputeUnitLimit explícita está presente, o padrão é calculado com base no tipo de instrução:

Default CU limit calculation
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)
  • Instruções nativas (System Program, Stake, Vote, etc. que ainda não foram migradas para SBF): cada uma recebe MAX_BUILTIN_ALLOCATION_COMPUTE_UNIT_LIMIT = 3.000 CUs (conforme SIMD-0170).
  • Instruções não nativas (programas SBF implementados pelo utilizador): cada uma recebe DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT = 200.000 CUs.
  • Nativas em migração que concluíram a migração para SBF (controladas por feature flag): tratadas como não nativas (200.000 CUs cada).

O resultado é limitado a MAX_COMPUTE_UNIT_LIMIT (1.400.000).

Pode substituir este padrão incluindo uma instrução SetComputeUnitLimit na sua transação.

Para determinar o limite de CU apropriado:

  1. Simule a transação para medir o consumo de CU.
  2. Adicione uma margem de segurança de 10% ao valor simulado.

A taxa de prioridade é determinada pelo limite de unidades de computação solicitado na transação, não pelo número real de unidades de computação utilizadas. Se definir um limite de unidades de computação demasiado elevado ou utilizar o valor padrão, paga por unidades de computação não utilizadas.

Instruções de orçamento de computação

O Programa de Orçamento de Computação (ComputeBudget111111111111111111111111111111) possui quatro instruções.

VarianteDiscriminadorParâmetroTipoDescrição
RequestHeapFrame1bytesu32Tamanho de heap solicitado em bytes para cada programa na transação
SetComputeUnitLimit2unitsu32CUs máximas que a transação pode consumir
SetComputeUnitPrice3micro_lamportsu64Preço de CU em micro-lamports
SetLoadedAccountsDataSizeLimit4bytesu32Total máximo de bytes de dados de conta que a transação pode carregar

Fonte: enum ComputeBudgetInstruction

Restrições e condições de erro

As seguintes regras aplicam-se ao processar instruções de orçamento de computação:

  • Uma por tipo: apenas uma de cada variante de instrução é permitida por transação. Incluir duplicatas causa um erro DuplicateInstruction (a transação inteira falha).
  • RequestHeapFrame: o valor deve estar entre MIN_HEAP_FRAME_BYTES (32 KiB) e MAX_HEAP_FRAME_BYTES (256 KiB), e deve ser um múltiplo de 1.024. Caso contrário, a transação falha com InvalidInstructionData. O tamanho do heap aplica-se a cada programa invocado na transação (incluindo CPIs).
  • SetComputeUnitLimit: qualquer valor u32 é aceite. O limite efetivo é limitado a MAX_COMPUTE_UNIT_LIMIT (1.400.000).
  • SetComputeUnitPrice: qualquer valor u64 é aceite (0 a u64::MAX).
  • SetLoadedAccountsDataSizeLimit: o valor deve ser maior que 0 (NonZeroU32). Um valor de 0 causa InvalidLoadedAccountsDataSizeLimit. O limite efetivo é limitado a MAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES (64 MiB).
  • Dados não reconhecidos: qualquer instrução enviada ao Programa de Orçamento de Computação que não seja desserializada para uma variante conhecida falha com InvalidInstructionData.

O modelo de custo do agendador abaixo descreve a estimativa de custo pré-execução interna do validator. A maioria dos programadores só precisa das instruções de orçamento de computação acima.

Modelo de custo do agendador

O agendador do validator usa um modelo de custo para estimar o uso de recursos da transação antes da execução. Estas estimativas de custo pré-execução determinam se uma transação cabe na capacidade restante do bloco. São separadas da medição de CU que ocorre durante a execução.

O custo total do agendador é a soma de cinco componentes (UsageCostDetails::sum):

Scheduler cost formula
total_cost = signature_cost
+ write_lock_cost
+ data_bytes_cost
+ programs_execution_cost
+ loaded_accounts_data_size_cost

Componentes de custo

ComponenteDescrição
Custo de assinaturaCusto por assinatura para cada tipo de assinatura
Custo de bloqueio de escritaPor conta gravável
Custo de instruction dataBaseado no total de bytes de instruction data
Custo de execução de programasLimite de CU do orçamento de computação ou padrão
Custo de dados de contas carregadasBaseado no tamanho total dos dados de contas carregadas

Todos os valores estão em unidades de computação.

Constantes de custo do agendador

Custo de transação de voto

As transações de voto usam um custo estático de 3.428 CUs independentemente do seu conteúdo real.

Limites de bloco

O agendador impõe limites por bloco. Se adicionar uma transação exceder qualquer limite, ela não é incluída no bloco.

SIMD-0286 propõe aumentar MAX_BLOCK_UNITS para 100.000.000.

Constantes de orçamento de execução

As seguintes constantes de execution_budget.rs definem limites de tempo de execução durante a execução de transações:

ConstanteValorDescrição
MAX_COMPUTE_UNIT_LIMIT1.400.000Limite máximo de CU por transação
DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT200.000CUs padrão por instrução não integrada
MAX_BUILTIN_ALLOCATION_COMPUTE_UNIT_LIMIT3.000CUs padrão por instrução integrada (SIMD-0170)
DEFAULT_HEAP_COST8 CUsCusto por página de heap de 32 KiB
DEFAULT_INVOCATION_COST1.000 CUsCusto de uma invocação CPI
INVOKE_UNITS_COST_SIMD_0339946 CUsCusto de invocação CPI com SIMD-0339
MIN_HEAP_FRAME_BYTES32.768Tamanho mínimo de heap (32 KiB)
MAX_HEAP_FRAME_BYTES262.144Tamanho máximo de heap (256 KiB)
MAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES67.108.864Dados de conta carregados máximos por transação (64 MiB)
MAX_INSTRUCTION_STACK_DEPTH5Profundidade máxima da pilha de instruções (nível superior + CPIs)
MAX_INSTRUCTION_STACK_DEPTH_SIMD_02689Profundidade máxima da pilha de instruções (nível superior + CPIs) com SIMD-0268
MAX_CALL_DEPTH64Profundidade máxima de chamada SBF-para-SBF dentro de um programa
STACK_FRAME_SIZE4.096 bytesTamanho de um frame de pilha SBF

Is this page helpful?

Gerenciado por

© 2026 Fundação Solana.
Todos os direitos reservados.
Conecte-se
  • Blog