Restricciones y Mejores Prácticas
Restricciones de seguridad y mejores prácticas para escribir políticas efectivas
Por razones de seguridad, las políticas se ejecutan en un entorno restringido. Esta página documenta lo que no está permitido y proporciona mejores prácticas para escribir políticas efectivas.
Límites de Política
Las políticas están limitadas a 2,048 caracteres de longitud. Esto fomenta reglas concisas y enfocadas, y asegura tiempos de evaluación rápidos.
Restricciones a Nivel de Plataforma
Los siguientes métodos RPC están bloqueados a nivel de plataforma y no pueden ser habilitados por ninguna política:
| Category | Methods |
|---|---|
| Debug & Trace | debug_*, trace_* |
| Legacy Filters | eth_newFilter, eth_newBlockFilter, eth_newPendingTransactionFilter, eth_getFilterChanges, eth_getFilterLogs, eth_uninstallFilter |
Estas restricciones se aplican a todas las solicitudes independientemente de la organización o las políticas del endpoint.
Limitaciones de eth_getLogs
El método eth_getLogs está restringido a consultas de bloque único solamente. Debe especificar:
block_hash: Consultar logs de un hash de bloque específicoblock_number: Consultar logs de un número de bloque específico (formato hex como0x100o etiquetas comolatest)
Las consultas de rango de bloques usando fromBlock y toBlock no están soportadas. Esta restricción aplica tanto a solicitudes RPC como MCP.
Palabras Clave Bloqueadas
Los siguientes patrones no están permitidos en las políticas:
| Pattern | Reason |
|---|---|
import ... | Cannot import external modules |
package ... | Cannot declare packages |
default ... | Cannot override default values |
data.* | Cannot reference external data |
Las políticas que intenten usar estos patrones fallarán en la validación.
Funciones Incorporadas Deshabilitadas
Estas categorías de funciones incorporadas están deshabilitadas y serán rechazadas:
| 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" |
Las políticas que usen funciones incorporadas deshabilitadas fallarán en la validación con un mensaje de error claro que indica qué función no está permitida.
Errores de Validación
Cuando una política falla en la validación, recibirás errores 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. |
Cuando la compilación falla debido a sintaxis Rego inválida, recibirás el número de línea y el mensaje de error del compilador.
Mejores Prácticas
Direcciones en Minúsculas
Siempre usa lower() para la coincidencia de direcciones sin distinción de mayú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..."
}Manejar Campos Anulables
Algunos campos de entrada pueden ser null. Manéjalos con cuidado:
# 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
}Probar Exhaustivamente
Antes de implementar políticas en producción:
- Prueba con varias combinaciones de entrada
- Verifica casos de permitir y denegar
- Comprueba casos límite (valores null, arrays vacíos)
- Valida contra datos de transacciones realistas
Documenta Tus Reglas
Usa comentarios para explicar la lógica compleja:
# 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
}Usa Nombres de Variables Significativos
Cuando uses variables locales, elige nombres descriptivos:
# 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
}