Combustível, taxas e depósitos

Combustível

Toda operação custa combustível. Uma transação reserva um máximo (max_fuel); se a execução precisar de mais, a chamada falha e tudo é revertido. Os preços são calibrados para que cerca de 20 ns de CPU num servidor de 2 vCPUs correspondam a uma unidade de combustível, o que mantém um bloco cheio (50 000 000 de combustível na mainnet, por padrão) em cerca de um segundo no pior caso.

OperaçãoCombustível
Instrução · expressão2 · 1
A cada 32 bytes de valores lidos, copiados ou combinados1
Chamada de função20
Leitura do armazenamento250
Escrita ou remoção no armazenamento400 + 4 por byte de chave e valor
send · emit · destroy300 · 100 + 1 por byte · 1 000
sha256, blake360 + 20 a cada 64 bytes
verify_ed255193 500 + 1 a cada 64 bytes
ring_verify5 000 + 10 000 por chave
Publicação: compilar5 por byte de código-fonte
Chamada: carregar o contrato100 + 1 a cada 100 bytes de código compilado

Mudanças na versão 2 da linguagem

OperaçãoVersão 1Versão 2
Copiar um valor (ler uma local, uma constante)1 a cada 32 bytes1 a cada 32 bytes + 4 por alocação (cada text, bytes ou lista dentro dele)
Decodificar um valor lido do armazenamentoincluído na leitura+ 1 a cada 32 bytes + 6 por alocação
xs[i] e len(xs) numa lista localcopia a lista inteiralê sem copiar
Chamada a outro contrato700 + 1 a cada 32 bytes de argumentos + carga (100 + 1 a cada 100 bytes de código)
mul_div, isqrt, pow30
code_hash, is_contract, is_final250
Verificação de transição de enum1 por nível verificado

Código da versão 1 compilado como versão 2 produz os mesmos resultados, armazenamento e eventos; o combustível só pode mudar onde há cópias de listas ou valores grandes. Os motivos estão em Segurança.

Taxas

A taxa mínima de uma transação é

taxa = (base_fee + ⌈bytes × fee_per_kb ÷ 1000⌉ + ⌈max_fuel × fee_per_kfuel ÷ 1000⌉) × congestionamento

com os parâmetros padrão da The Coin base_fee = 1 000, fee_per_kb = 10 000 e fee_per_kfuel = 1 000 motes. O multiplicador de congestionamento começa em 1× e se ajusta com o uso dos blocos; a parte acima de 1× é queimada. As prioridades da carteira low | normal | high | urgent pagam 1×, 1,25×, ≥ 2× e ≥ 4× o mínimo. Os parâmetros são definidos pela governança, então confira os valores atuais da rede antes de depender de números exatos.

  • Você paga pelo combustível que reserva. A carteira reserva o combustível medido × 1,3 + 5 000.
  • Uma transação que falha paga a taxa; todos os seus efeitos são revertidos.
  • Views chamadas pela API são gratuitas e não criam transações.

O tccl run e o playground mostram uma estimativa com os parâmetros padrão, por exemplo:

estimated on-chain cost (default parameters): fee 9247 motes for max_fuel 6497 and ~175 bytes · storage deposit +0 motes

Depósitos de armazenamento

O estado de um contrato é garantido por um depósito reembolsável:

  • O tamanho de um contrato é o código compilado mais cada entrada de armazenamento (chave + valor).
  • Depósito exigido = ⌈tamanho ÷ 1 000⌉ × storage_deposit_per_kb (padrão 100 000 motes, 0,001 TCN por kB iniciado).
  • Uma publicação ou chamada que faz o estado crescer paga o depósito que falta, até o max_deposit da transação (padrão da carteira: 1 TCN).
  • Uma chamada que faz o estado encolher recebe depósito × liberado ÷ tamanho antigo de volta. Gravar um valor padrão apaga uma entrada, então limpar dados é recompensado.
  • destroy(to) paga o depósito inteiro e o saldo a to.

O simulador mostra depósitos como estimativas e não os desconta dos saldos fictícios.

Desempenho medido

A TCCL é um interpretador que percorre a árvore do programa, escrito em Rust. Rust traz segurança de memória e desempenho previsível; não executa contratos em velocidade nativa. O que importa para a rede é que o combustível acompanhe o tempo de CPU.

Medido com cargo test -p tccl --release --test perf -- --ignored --nocapture num Intel Xeon E5-1620 v2 @ 3,70 GHz (o armazenamento em memória do simulador é mais rápido que o disco de um nó, então as linhas de armazenamento são otimistas):

CargaLinguagemns por combustívelPico de memóriaBloco de 50 M
Laço aritmético1 · 216,4 · 17,6< 0,1 MB0,8 s · 0,9 s
Escritas em map1 · 21,4 · 1,20,4 MB0,1 s
Cadeia de BLAKE31 · 25,0 · 4,7< 0,1 MB0,2 s
Construir records213,8< 0,1 MB0,7 s
Copiar uma lista de 4 000 textos (adversarial)1 · 22 109 · 12,20,3 MB105 s · 0,6 s
Decodificar uma lista gravada (adversarial)1 · 21 656 · 21,10,4 MB83 s · 1,1 s
Manter listas locais grandes (adversarial)1 · 210,1 · 6,465,6 MB · 16,8 MB (limite)0,5 s · 0,3 s

Seus números vão ser diferentes; rode tccl bench para uma verificação rápida na sua máquina.

Melhore esta página no GitHub