Ограничения и Лучшие Практики

Ограничения безопасности и лучшие практики для написания эффективных политик

По соображениям безопасности политики выполняются в ограниченной среде. На этой странице описано, что не разрешено, и приведены лучшие практики для написания эффективных политик.

Ограничения Политик

Политики ограничены 2,048 символами в длину. Это способствует созданию кратких, сфокусированных правил и обеспечивает быстрое время оценки.


Ограничения на Уровне Платформы

Следующие методы RPC заблокированы на уровне платформы и не могут быть включены какой-либо политикой:

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

Эти ограничения применяются ко всем запросам независимо от организации или политик конечных точек.


Ограничения eth_getLogs

Метод eth_getLogs ограничен запросами к одному блоку. Вы должны указать одно из:

  • block_hash: Запрос логов из конкретного хеша блока
  • block_number: Запрос логов из конкретного номера блока (формат hex, например 0x100, или теги, например latest)

Запросы диапазона блоков с использованием fromBlock и toBlock не поддерживаются. Это ограничение применяется к запросам RPC и MCP.


Заблокированные Ключевые Слова

Следующие шаблоны не разрешены в политиках:

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

Политики, пытающиеся использовать эти шаблоны, не пройдут проверку.


Отключенные Встроенные Функции

Эти категории встроенных функций отключены и будут отклонены:

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"

Политики, использующие отключенные встроенные функции, не пройдут проверку с четким сообщением об ошибке, указывающим, какая функция не разрешена.


Ошибки Проверки

Когда политика не проходит проверку, вы получите такие ошибки:

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.

Когда компиляция не удается из-за неверного синтаксиса Rego, вы получите номер строки и сообщение об ошибке от компилятора.


Лучшие Практики

Адреса в Нижнем Регистре

Всегда используйте lower() для сопоставления адресов без учета регистра:

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

Обработка Nullable Полей

Некоторые входные поля могут быть null. Обрабатывайте это корректно:

# 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
}

Тщательное Тестирование

Перед развертыванием политик в производственной среде:

  1. Протестируйте с различными комбинациями входных данных
  2. Проверьте случаи разрешения и запрета
  3. Проверьте граничные случаи (null значения, пустые массивы)
  4. Проверьте на реалистичных данных транзакций

Документируйте Ваши Правила

Используйте комментарии для объяснения сложной логики:

# 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
}

Используйте Осмысленные Имена Переменных

При использовании локальных переменных выбирайте описательные имена:

# 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
}
Ограничения и Лучшие Практики | 256 Blocks