Restrições e Melhores Práticas

Restrições de segurança e melhores práticas para escrever políticas eficazes

Por razões de segurança, as políticas são executadas em um ambiente restrito. Esta página documenta o que não é permitido e fornece melhores práticas para escrever políticas eficazes.

Limites de Política

As políticas são limitadas a 2.048 caracteres de comprimento. Isso incentiva regras concisas e focadas e garante tempos de avaliação rápidos.


Restrições a Nível de Plataforma

Os seguintes métodos RPC são bloqueados a nível de plataforma e não podem ser habilitados por nenhuma política:

CategoryMethods
Debug & Tracedebug_*, trace_*
Legacy Filterseth_newFilter, eth_newBlockFilter, eth_newPendingTransactionFilter, eth_getFilterChanges, eth_getFilterLogs, eth_uninstallFilter

Essas restrições se aplicam a todas as solicitações, independentemente da organização ou políticas de endpoint.


Limitações do eth_getLogs

O método eth_getLogs é restrito a consultas de bloco único apenas. Você deve especificar:

  • block_hash: Consultar logs de um hash de bloco específico
  • block_number: Consultar logs de um número de bloco específico (formato hex como 0x100 ou tags como latest)

Consultas de intervalo de blocos usando fromBlock e toBlock não são suportadas. Esta restrição se aplica a solicitações RPC e MCP.


Palavras-Chave Bloqueadas

Os seguintes padrões não são permitidos nas políticas:

PatternReason
import ...Cannot import external modules
package ...Cannot declare packages
default ...Cannot override default values
data.*Cannot reference external data

Políticas que tentarem usar esses padrões falharão na validação.


Funções Incorporadas Desabilitadas

Essas categorias de funções incorporadas estão desabilitadas e serão rejeitadas:

PatternError Message
http.send"http.send is disabled"
crypto.*"Crypto functions are disabled"
io.jwt.*"JWT functions are disabled"
yaml.*"YAML functions are disabled"
uuid.*"UUID functions are disabled"
glob.*"Glob functions are disabled"
semver.*"Semver functions are disabled"
json.schema*"JSON schema functions are disabled"
graphql.*"GraphQL functions are disabled"
net.cidr*"Net CIDR functions are disabled"
opa.runtime*"OPA runtime functions are disabled"
rego.metadata*"Rego metadata functions are disabled"

Políticas que usam funções incorporadas desabilitadas falharão na validação com uma mensagem de erro clara indicando qual função não é permitida.


Erros de Validação

Quando uma política falha na validação, você receberá erros como:

ErrorCause
"Import statements are not allowed"Policy contains import
"Package declarations are not allowed"Policy contains package
"Default statements are not allowed"Policy contains default
"Data references are not allowed"Policy contains data.

Quando a compilação falha devido a sintaxe Rego inválida, você receberá o número da linha e a mensagem de erro do compilador.


Melhores Práticas

Endereços em Minúsculas

Sempre use lower() para correspondência de endereços sem distinção entre maiúsculas e minúsculas:

# Good: Normalized comparison
deny if {
    lower(input.to_address) == "0xdead..."
}
 
# Bad: May miss matches due to case differences
deny if {
    input.to_address == "0xDead..."
}

Lidar com Campos Anuláveis

Alguns campos de entrada podem ser null. Lide com isso adequadamente:

# Good: Check for null before comparison
deny if {
    input.usd_value != null
    input.usd_value > 10000
}
 
# Alternative: Use type checking
deny if {
    is_number(input.usd_value)
    input.usd_value > 10000
}

Testar Completamente

Antes de implementar políticas em produção:

  1. Teste com várias combinações de entrada
  2. Verifique casos de permissão e negação
  3. Verifique casos extremos (valores null, arrays vazios)
  4. Valide contra dados de transações realistas

Documente Suas Regras

Use comentários para explicar lógica complexa:

# Block high-value transactions during off-hours
# Business hours are 9 AM - 5 PM UTC, Monday-Friday
deny if {
    [hour, _, _] := time.clock(time.now_ns())
    hour < 9
    input.usd_value > 1000
}

Use Nomes de Variáveis Significativos

Ao usar variáveis locais, escolha nomes descritivos:

# Good: Clear variable names
deny if {
    high_risk_threshold := 10000
    input.usd_value > high_risk_threshold
}
 
# Avoid: Cryptic names
deny if {
    x := 10000
    input.usd_value > x
}
Restrições e Melhores Práticas | 256 Blocks