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:
| Category | Methods |
|---|---|
| Debug & Trace | debug_*, trace_* |
| Legacy Filters | eth_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íficoblock_number: Consultar logs de um número de bloco específico (formato hex como0x100ou tags comolatest)
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:
| Pattern | Reason |
|---|---|
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:
| Pattern | Error 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:
| Error | Cause |
|---|---|
| "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:
- Teste com várias combinações de entrada
- Verifique casos de permissão e negação
- Verifique casos extremos (valores null, arrays vazios)
- 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
}