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 = (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:
- Simule a transação para medir o consumo de CU.
- 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.
| Variante | Discriminador | Parâmetro | Tipo | Descrição |
|---|---|---|---|---|
RequestHeapFrame | 1 | bytes | u32 | Tamanho de heap solicitado em bytes para cada programa na transação |
SetComputeUnitLimit | 2 | units | u32 | CUs máximas que a transação pode consumir |
SetComputeUnitPrice | 3 | micro_lamports | u64 | Preço de CU em micro-lamports |
SetLoadedAccountsDataSizeLimit | 4 | bytes | u32 | Total 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 entreMIN_HEAP_FRAME_BYTES(32 KiB) eMAX_HEAP_FRAME_BYTES(256 KiB), e deve ser um múltiplo de 1.024. Caso contrário, a transação falha comInvalidInstructionData. O tamanho do heap aplica-se a cada programa invocado na transação (incluindo CPIs).SetComputeUnitLimit: qualquer valoru32é aceite. O limite efetivo é limitado aMAX_COMPUTE_UNIT_LIMIT(1.400.000).SetComputeUnitPrice: qualquer valoru64é aceite (0 au64::MAX).SetLoadedAccountsDataSizeLimit: o valor deve ser maior que 0 (NonZeroU32). Um valor de 0 causaInvalidLoadedAccountsDataSizeLimit. O limite efetivo é limitado aMAX_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):
total_cost = signature_cost+ write_lock_cost+ data_bytes_cost+ programs_execution_cost+ loaded_accounts_data_size_cost
Componentes de custo
| Componente | Descrição |
|---|---|
| Custo de assinatura | Custo por assinatura para cada tipo de assinatura |
| Custo de bloqueio de escrita | Por conta gravável |
| Custo de instruction data | Baseado no total de bytes de instruction data |
| Custo de execução de programas | Limite de CU do orçamento de computação ou padrão |
| Custo de dados de contas carregadas | Baseado no tamanho total dos dados de contas carregadas |
Todos os valores estão em unidades de computação.
Constantes de custo do agendador
| 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 |
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.
| Limite | 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
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:
| Constante | Valor | Descrição |
|---|---|---|
MAX_COMPUTE_UNIT_LIMIT | 1.400.000 | Limite máximo de CU por transação |
DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT | 200.000 | CUs padrão por instrução não integrada |
MAX_BUILTIN_ALLOCATION_COMPUTE_UNIT_LIMIT | 3.000 | CUs padrão por instrução integrada (SIMD-0170) |
DEFAULT_HEAP_COST | 8 CUs | Custo por página de heap de 32 KiB |
DEFAULT_INVOCATION_COST | 1.000 CUs | Custo de uma invocação CPI |
INVOKE_UNITS_COST_SIMD_0339 | 946 CUs | Custo de invocação CPI com SIMD-0339 |
MIN_HEAP_FRAME_BYTES | 32.768 | Tamanho mínimo de heap (32 KiB) |
MAX_HEAP_FRAME_BYTES | 262.144 | Tamanho máximo de heap (256 KiB) |
MAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES | 67.108.864 | Dados de conta carregados máximos por transação (64 MiB) |
MAX_INSTRUCTION_STACK_DEPTH | 5 | Profundidade máxima da pilha de instruções (nível superior + CPIs) |
MAX_INSTRUCTION_STACK_DEPTH_SIMD_0268 | 9 | Profundidade máxima da pilha de instruções (nível superior + CPIs) com SIMD-0268 |
MAX_CALL_DEPTH | 64 | Profundidade máxima de chamada SBF-para-SBF dentro de um programa |
STACK_FRAME_SIZE | 4.096 bytes | Tamanho de um frame de pilha SBF |
Is this page helpful?