Поля ввода
Полный справочник всех данных, доступных в решениях политик
Каждое решение политики имеет доступ к данным запроса через объект input. На этой странице документируются все доступные поля, которые вы можете использовать в своих политиках.
Сеть
Эти поля идентифицируют блокчейн-сеть и вызываемый RPC-метод, позволяя создавать специфичные для цепи политики или ограничивать определенные операции.
input.chain
| Type | Example Values |
|---|---|
| string | "ethereum", "polygon", "arbitrum", "optimism", "base" |
Идентификатор блокчейн-сети для запроса. Используйте это поле для ограничения доступа к конкретным цепям, применения различных политик для каждой сети или полной блокировки определенных цепей.
Пример
# Only allow transactions on Polygon and Base
allowed_chains := {"polygon", "base"}
deny if {
not input.chain in allowed_chains
}
# Apply stricter limits on Ethereum mainnet
deny if {
input.chain == "ethereum"
input.usd_value > 1000
}input.rpc_method
| Type | Example Values |
|---|---|
| string | "eth_sendTransaction", "eth_call", "eth_getBalance" |
Имя метода JSON-RPC из запроса. Используйте это для разрешения или блокировки конкретных операций. Например, вы можете разрешить операции чтения (eth_call, eth_getBalance), ограничивая операции записи (eth_sendTransaction).
Обратите внимание, что некоторые методы ограничены на уровне платформы и не могут быть включены через политику.
Пример
# Only allow read-only methods
allowed_methods := {
"eth_call",
"eth_getBalance",
"eth_getTransactionCount",
"eth_getCode",
"eth_getLogs"
}
deny if {
not input.rpc_method in allowed_methods
}
# Block signing methods
deny if {
input.rpc_method in {"eth_sign", "personal_sign", "eth_signTypedData"}
}Происхождение запроса
Эти поля предоставляют информацию о местоположении источника запроса, обеспечивая геоконтроль доступа и соответствие региональным нормам.
input.source_ip
| Type | Example Values |
|---|---|
| string | "192.168.1.1", "2001:db8::1" |
IP-адрес клиента, выполняющего запрос. Используйте это для списков разрешений/блокировок на основе IP или для реализации ограничения скорости на основе источника.
Разрешение IP
По умолчанию 256 Blocks использует IP-адрес подключающегося клиента. Если ваши запросы проксируются через вашу собственную инфраструктуру, вы можете передать исходный IP клиента через заголовок X-Forwarded-For - 256 Blocks будет использовать первый IP-адрес из этого заголовка.
Это полезно когда:
- Запросы проксируются через ваши бэкенд-серверы
- Вам нужно передать реальный IP-адрес конечного пользователя
- Тестирование политик с различными IP-адресами в разработке
Пример
# Block specific IP addresses
blocked_ips := {"192.168.1.100", "10.0.0.50"}
deny if {
input.source_ip in blocked_ips
}
# Only allow requests from known infrastructure
allowed_ips := {"203.0.113.10", "203.0.113.11"}
deny if {
not input.source_ip in allowed_ips
}input.source_country
| Type | Example Values |
|---|---|
| string | "US", "GB", "DE", "UNKNOWN", "PRIVATE", "LOCALHOST" |
Двухбуквенный код страны ISO 3166-1 alpha-2, полученный из source_ip. Используйте это для географических ограничений, соответствия нормативным требованиям или региональных политик.
Сопоставления стран обновляются ежедневно. Точность обычно составляет 95%+ для публичных IP-адресов.
Специальные значения
Для непубличных IP-адресов возвращаются следующие значения вместо кодов стран:
| Value | Description |
|---|---|
"PRIVATE" | Диапазоны частных IP (10.x.x.x, 172.16-31.x.x, 192.168.x.x) |
"LOCALHOST" | Адреса обратной петли (127.x.x.x) |
"LINK_LOCAL" | Локальные адреса канала (169.254.x.x) |
"MULTICAST" | Адреса многоадресной рассылки (224.x.x.x - 239.x.x.x) |
"RESERVED" | Зарезервированные адреса (240.x.x.x+) |
"UNKNOWN" | Сбой поиска или неподдерживаемый тип адреса |
Пример
# Block sanctioned countries
blocked_countries := {"KP", "IR", "CU", "SY", "RU"}
deny if {
input.source_country in blocked_countries
}
# Only allow requests from specific regions
allowed_countries := {"US", "CA", "GB", "DE", "FR"}
deny if {
not input.source_country in allowed_countries
input.source_country != "PRIVATE" # Allow internal/development traffic
}Параметры транзакции
Эти поля извлекаются из параметров JSON-RPC запроса. Все адреса нормализованы в нижний регистр с префиксом 0x для согласованного сравнения.
input.from_address
| Type | Example Value |
|---|---|
| string (nullable) | "0x742d35cc6634c0532925a3b844bc9e7595f..." |
Адрес кошелька отправителя. Это идентифицирует, кто инициирует транзакцию или запрос подписи. Используйте это поле для реализации списков разрешений/блокировок для конкретных кошельков или для применения различных правил политики в зависимости от отправителя.
Источник по методу RPC
| Method | Parameter Location |
|---|---|
eth_sendTransaction | params[0].from |
eth_call | params[0].from |
eth_sign | params[0] |
personal_sign | params[1] |
eth_signTypedData | params[0] |
Пример
# Only allow transactions from approved wallets
allowed_senders := {
"0x742d35cc6634c0532925a3b844bc9e7595f...",
"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606..."
}
deny if {
not input.from_address in allowed_senders
}input.to_address
| Type | Example Value |
|---|---|
| string (nullable) | "0x742d35cc6634c0532925a3b844bc9e7595f..." |
Адрес получателя или назначения транзакции. Это может быть адрес кошелька для простых переводов или адрес контракта для взаимодействия с контрактами. Значение равно null при развертывании нового контракта (транзакции создания контракта не имеют получателя).
Источник по методу RPC
| Method | Parameter Location |
|---|---|
eth_sendTransaction | params[0].to |
eth_call | params[0].to |
eth_getBalance | params[0] |
eth_getTransactionCount | params[0] |
Пример
# Block transactions to known malicious addresses
blocked_addresses := {
"0x000000000000000000000000000000000000dead",
"0x1234567890abcdef..."
}
deny if {
input.to_address in blocked_addresses
}input.contract_addresses
| Type | Example Value |
|---|---|
| array of strings | ["0x742d35cc...", "0xa0b86991..."] |
Массив адресов смарт-контрактов, участвующих в запросе. Это особенно полезно для контроля того, с какими контрактами могут взаимодействовать ваши пользователи. Массив может содержать несколько адресов для методов типа eth_getLogs, которые могут запрашивать несколько контрактов.
Источник по методу RPC
| Method | Parameter Location | Notes |
|---|---|---|
eth_sendTransaction | params[0].to | Только если присутствует поле data или input |
eth_call | params[0].to | При вызове контракта |
eth_getCode | params[0] | Адрес целевого контракта |
eth_getStorageAt | params[0] | Адрес целевого контракта |
eth_getLogs | params[0].address | Может быть одним адресом или массивом |
Пример
# Only allow interactions with approved contracts (e.g., USDT and USDC)
approved_contracts := {
"0xdac17f958d2ee523a2206206994597c13d831ec7",
"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"
}
deny if {
some addr in input.contract_addresses
not addr in approved_contracts
}input.value_wei
| Type | Example Value |
|---|---|
| string (nullable) | "0xde0b6b3a7640000" (1 ETH in hex) |
Значение переводимого нативного токена, выраженное в wei в виде шестнадцатеричной строки. Wei - наименьшая единица ETH (1 ETH = 10^18 wei). Это необработанное значение в сети - для политик на основе USD используйте вместо этого input.usd_value.
Источник по методу RPC
| Method | Parameter Location |
|---|---|
eth_sendTransaction | params[0].value |
eth_call | params[0].value |
Пример
# Block transactions transferring more than 10 ETH (in wei)
# 10 ETH = 10 * 10^18 wei = 0x8ac7230489e80000
deny if {
input.value_wei != null
to_number(input.value_wei) > 10000000000000000000
}
# Block zero-value transactions to specific contracts
deny if {
input.value_wei == "0x0"
some addr in input.contract_addresses
addr == "0x..."
}input.gas_limit
| Type | Example Value |
|---|---|
| string (nullable) | "0x5208" (21000 in hex) |
Максимальное количество единиц газа, которое транзакция может потребить, в виде шестнадцатеричной строки. Простой перевод ETH использует 21 000 газа, в то время как взаимодействие с контрактами обычно требует больше.
Источник по методу RPC
| Method | Parameter Location |
|---|---|
eth_sendTransaction | params[0].gas |
eth_call | params[0].gas |
Пример
# Block transactions with excessive gas limits (potential spam/abuse)
# 1,000,000 gas = 0xf4240
deny if {
input.gas_limit != null
to_number(input.gas_limit) > 1000000
}
# Don't sponsor high-gas transactions
denyGasSponsor if {
input.gas_limit != null
to_number(input.gas_limit) > 500000
}input.gas_price
| Type | Example Value |
|---|---|
| string (nullable) | "0x3b9aca00" (1 gwei in hex) |
Цена газа для устаревших (до EIP-1559) транзакций, выраженная в wei в виде шестнадцатеричной строки. Это поле равно null для транзакций EIP-1559, которые вместо этого используют max_fee_per_gas.
Источник по методу RPC
| Method | Parameter Location |
|---|---|
eth_sendTransaction | params[0].gasPrice |
eth_call | params[0].gasPrice |
Пример
# Block legacy transactions with extremely high gas prices
# 500 gwei = 500 * 10^9 = 0x746a528800
deny if {
input.gas_price != null
to_number(input.gas_price) > 500000000000
}
# Don't sponsor legacy transactions (prefer EIP-1559)
denyGasSponsor if {
input.gas_price != null
input.max_fee_per_gas == null
}input.max_fee_per_gas
| Type | Example Value |
|---|---|
| string (nullable) | "0x77359400" (2 gwei in hex) |
Максимальная общая плата за единицу газа для транзакций EIP-1559, в виде шестнадцатеричной строки. Это абсолютный максимум, который отправитель готов заплатить (базовая плата + плата за приоритет). Присутствует только для типов транзакций EIP-1559.
Источник по методу RPC
| Method | Parameter Location |
|---|---|
eth_sendTransaction | params[0].maxFeePerGas |
Пример
# Block transactions willing to pay excessive gas fees
# 1000 gwei = 1000 * 10^9 = 0xe8d4a51000
deny if {
input.max_fee_per_gas != null
to_number(input.max_fee_per_gas) > 1000000000000
}
# Only sponsor transactions with reasonable max fees
# 50 gwei = 50 * 10^9 = 0xba43b7400
denyGasSponsor if {
input.max_fee_per_gas != null
to_number(input.max_fee_per_gas) > 50000000000
}input.max_priority_fee_per_gas
| Type | Example Value |
|---|---|
| string (nullable) | "0x3b9aca00" (1 gwei in hex) |
Максимальная плата за приоритет (чаевые) за единицу газа для транзакций EIP-1559, в виде шестнадцатеричной строки. Это часть, которая идет производителю блока в качестве стимула. Присутствует только для типов транзакций EIP-1559.
Источник по методу RPC
| Method | Parameter Location |
|---|---|
eth_sendTransaction | params[0].maxPriorityFeePerGas |
Пример
# Block transactions with excessive priority fees (potential MEV manipulation)
# 10 gwei = 10 * 10^9 = 0x2540be400
deny if {
input.max_priority_fee_per_gas != null
to_number(input.max_priority_fee_per_gas) > 10000000000
}
# Require reasonable priority fees for sponsored transactions
# 2 gwei = 2 * 10^9 = 0x77359400
denyGasSponsor if {
input.max_priority_fee_per_gas != null
to_number(input.max_priority_fee_per_gas) > 2000000000
}Обогащенные данные
Эти поля вычисляются 256 Blocks для предоставления дополнительного контекста помимо того, что есть в необработанном запросе.
input.usd_value
| Type | Example Value |
|---|---|
| number (nullable) | 1500.50 |
Эквивалент в USD значения нативного токена транзакции (value_wei), рассчитанный с использованием текущих рыночных цен. Это наиболее распространенное поле для реализации лимитов расходов и управления спонсорством.
Цены получаются каждую минуту из надежных источников цен (таких как Chainlink). Значение может быть null, если транзакция не имеет значения (например, чистый вызов контракта).
Пример
# Block transactions over $10,000
deny if {
input.usd_value > 10000
}
# Don't sponsor transactions over $100
denyGasSponsor if {
input.usd_value > 100
}
# Handle null values safely
deny if {
input.usd_value != null
input.usd_value > 50000
}Необработанные данные
Для продвинутых случаев использования, где структурированные поля выше не предоставляют то, что вам нужно.
input.raw_params
| Type | Example Value |
|---|---|
| array | [{"from": "0x...", "to": "0x...", "value": "0x...", "data": "0x..."}] |
Полный, неизмененный массив params JSON-RPC из исходного запроса. Используйте это, когда вам нужно получить доступ к полям, которые не представлены через структурированные свойства ввода, такие как:
- Данные вызова контракта (поле
data) для обнаружения сигнатуры функции - Списки доступа для транзакций EIP-2930
- Пользовательские или нестандартные поля
Пример
# Block ERC-20 transfer function calls
# Function signature: transfer(address,uint256) = 0xa9059cbb
deny if {
params := input.raw_params[0]
params.data != null
startswith(params.data, "0xa9059cbb")
}
# Block ERC-20 approve function (0x095ea7b3)
deny if {
params := input.raw_params[0]
params.data != null
startswith(params.data, "0x095ea7b3")
}