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:

CategoryMethods
Debug & Tracedebug_*, trace_*
Legacy Filterseth_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ífico
  • block_number: Consultar logs de un número de bloque específico (formato hex como 0x100 o etiquetas como latest)

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:

PatternReason
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:

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"

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:

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.

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:

  1. Prueba con varias combinaciones de entrada
  2. Verifica casos de permitir y denegar
  3. Comprueba casos límite (valores null, arrays vacíos)
  4. 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
}
Restricciones y Mejores Prácticas | 256 Blocks