Creación de una Política
Una política es un juego de reglas que puede bloquear solicitudes de firma. Las solicitudes de firma incluyen transacciones de blockchain y solicitudes para firmar datos, como los datos escritos por EIP-712. Cada regla almacenada tiene un ámbito, condiciones y una respuesta BLOCK. Las reglas activadas se aplican de forma acumulativa: si alguna regla aplicable coincide, se deniega la solicitud.
Si la evaluación de la política finaliza correctamente y ninguna regla aplicable devuelve una respuesta BLOCK, la solicitud puede continuar después de que UWaaS Wallet Manager (UWM) autentica el emisor de llamada, autoriza la cartera y la clave y valida la solicitud de firma.
Definir condiciones de regla
Una regla combina las condiciones con all, any y not. Puede anidar estos grupos para definir una restricción:
allcoincide cuando coincide cada condición secundaria.anycoincide cuando coincide al menos una condición secundaria.notcoincide cuando su condición secundaria no coincide.
Definición de grupos de criterios específicos en línea. Las referencias de condición con nombre no están soportadas para las reglas de firma de UWM.
Una hoja de condición especifica un hecho, un operador y un valor. Utilice path para seleccionar una propiedad anidada de un hecho. Los valores priority superiores se evalúan primero.
{
"fact": "to_address",
"operator": "in",
"value": ["<blocked-address>"]
}El operador in coincide cuando el hecho es igual a uno de los valores mostrados. Utilice all para combinar esta condición con una condición operation. Utilice any cuando una de varias condiciones pueda disparar la restricción.
Operadores
| Operador | Utilícelo cuando |
|---|---|
equal, notEqual |
Un hecho escalar debe ser igual o diferente de un valor del mismo tipo. |
in, notIn |
Un hecho escalar debe aparecer o no en una lista de valores. |
contains, doesNotContain |
Un hecho de matriz debe contener o no un valor. |
lessThan, lessThanEquals (lessThanInclusive)
|
Un hecho numérico debe ser menor o igual que un valor numérico. |
greaterThan, greaterThanEquals (greaterThanInclusive)
|
Un hecho numérico debe ser mayor o igual que un valor numérico. |
Las comparaciones ordenadas en amount, amount_atomic y native_value_atomic utilizan aritmética decimal exacta tanto en /evaluate como en /internal/v1/authorize.
Utilice cadenas decimales para cantidades atómicas y umbrales grandes. Por ejemplo:
{ "fact": "amount_atomic", "operator": "greaterThanEquals", "value": "1000000000000000000" }UWM proporciona amount_atomic en unidades base y no lo convierte en decimales de token. El hecho amount está soportado cuando lo proporciona un emisor de llamada de /evaluate; UWM no lo agrega a los hechos de firma.
Se aceptan números JSON decimales dentro del rango numérico seguro. Enviar valores numéricos más grandes como cadenas; se rechazan literales numéricos más grandes. Los nombres de operador greaterThanInclusive y lessThanInclusive permanecen soportados. Los operadores equal y notEqual comparan los valores por tipo. Otros hechos mantienen su comportamiento de comparación existente.
Decoradores de matriz
Agregue un prefijo a un operador con un decorador y dos puntos, como someFact:equal. Los decoradores cambian la forma en que el operador maneja las matrices o su resultado.
| Decorador | Usar cuando |
|---|---|
someFact |
Al menos un elemento de un hecho de matriz coincide. |
everyFact |
Cada elemento de un hecho de matriz coincide. |
someValue |
El hecho coincide con al menos un elemento de un valor de matriz. |
everyValue |
El hecho coincide con cada elemento de un valor de matriz. |
swap |
La comparación utiliza el valor como el hecho y el hecho como el valor. |
not |
El resultado del operador base se debe negar. |
Por ejemplo, someFact:equal puede coincidir con un ID de token en la matriz token_ids proporcionada para una llamada por lotes ERC-1155 descodificada:
{
"fact": "token_ids",
"operator": "someFact:equal",
"value": "42"
}Utilice el grupo de condiciones not para la lógica booleana y el decorador not: para negar un operador individual. Las prioridades de condición y regla establecen el orden de evaluación. No permiten que una regla sustituya a otra BLOCK coincidente.
Definición del ámbito de regla
Defina scopelevels y targets para especificar las solicitudes de firma que cubre una regla. Todos los ámbitos seleccionados deben coincidir. Los objetivos dentro de un ámbito son alternativas.
| Ámbito | Destino necesario | Utilícelo para |
|---|---|---|
global |
Ninguno; especificar por sí mismo. |
Restricción que se aplica a todas las solicitudes de firma. |
org |
targets.orgIds |
Restricción para una o varias organizaciones. |
wallet |
targets.walletIds |
Restricción para una o más carteras. |
instance |
targets.instanceIds |
Restricción para una o más instancias de red. |
asset |
targets.assetIds |
Reglas de ámbito de activos existentes que se conservan por compatibilidad. |
scopelevels: ["org",
"wallet"] necesita que coincidan tanto los destinos de organización como de cartera. Una regla de solo cartera no tiene un límite de organización implícito. Utilice los ID devueltos por UWM, no los nombres mostrados.Para restringir un método de contrato, coincida con contract_address y function_selector en las condiciones. Agregue el ámbito instance si el mismo método requiere diferentes restricciones en redes diferentes. El ámbito asset se conserva para las reglas existentes; estas condiciones no lo requieren.
Para targets.instanceIds, utilice el instanceId público que muestra la cartera de UWM o la API de red. Éste es el infra_instance_id registrado, no la clave de base de datos numérica o el ID de cadena. Actualice las reglas de ámbito de instancia antiguas que utilizan una clave de base de datos; UWM ahora solo envía el identificador de instancia pública.
Coincidencia de la solicitud de firma
Las condiciones solo pueden utilizar los hechos proporcionados para operation de la solicitud. El hecho operation está disponible para cada solicitud de firma.
operation |
Hechos adicionales |
|---|---|
native-transfer |
amount_atomic, to_address |
erc20-transfer |
amount_atomic, to_address, contract_address |
contract-deployment |
amount_atomic, init_code_hash |
contract-call |
contract_address, native_value_atomic, function_selector, calldata_hash |
eip712 |
primary_type, verifying_contract, typed_data |
UWM reconoce las llamadas canónicas ERC-20 transfer(address,uint256) con un valor nativo cero sin registro de token. UWM ya no lee capability.approved-token-contracts.
El perfil erc20-transfer también proporciona native_value_atomic ("0"), function_selector ("0xa9059cbb") y calldata_hash. Estos hechos permiten que las reglas contract-call existentes conserven todas sus restricciones.
Una operación erc20-transfer también es contract-call para las condiciones de operación. Ambos tipos de reglas pueden coincidir con la misma solicitud, y cualquier BLOCK coincidente lo rechaza. Este comportamiento se aplica a condiciones booleanas anidadas, equal, notEqual, in, notIn y en ambos puntos finales de evaluación. Otros hechos mantienen su semántica normal de igualdad.
La operación erc20-transfer coincide con los métodos transfer, no con transferFrom o ERC-1155. Incluya siempre el contract_address deseado en las reglas de token.
Las llamadas canónicas ERC-20 transferFrom, ERC-1155 safeTransferFrom y ERC-1155 safeBatchTransferFrom proporcionan datos adicionales de contract-call:
| Llamada | Hechos adicionales |
|---|---|
ERC-20 transferFrom |
owner_address, to_address, amount_atomic |
ERC-1155 safeTransferFrom |
owner_address, to_address, token_id, amount_atomic |
ERC-1155 safeBatchTransferFrom |
Matrices owner_address, to_address, paralelas token_ids y amounts
|
UWM solo decodifica llamadas con un diseño canónico ABI soportado. Otras llamadas conservan los hechos genéricos de contract-call.
owner_address es la dirección de origen en los datos de la llamada, no la cartera de firma. Un selector identifica el diseño de datos de llamada, no el comportamiento del contrato desplegado. ERC-20 y ERC-721 comparten el selector transferFrom, por lo que aplican condiciones de importe solo a un contrato conocido por implementar ERC-20. Las direcciones y los selectores se normalizan a minúsculas; utilice valores de condición en minúsculas. Para las llamadas por lotes, no realice importes totales para distintos ID de token.
amount_atomic y native_value_atomic son cadenas decimales en unidades base; el valor nativo está en wei. Los valores enteros EIP-712 también son cadenas decimales. Para EIP-712, typed_data contiene el dominio y el mensaje firmados. Un valor path es relativo a ese hecho: utilice $.message.value para el valor del mensaje y $.domain.chainId para el identificador de cadena firmado.
Las restricciones de red, organización y cartera pertenecen a los ámbitos wallet, org y instance. Los metadatos de firmante, gas y nonce no son hechos de condición. El destino de ámbito asset no agrega un hecho de condición asset.
Antes de activar una regla de firma
Utilice solo los hechos enumerados para la operación en Coincidir con la solicitud de firma. Incluya una condición operation cuando una regla utilice hechos específicos de la operación.
Al guardar una regla, no se confirma que UWM pueda evaluarla durante la firma. Por ejemplo, UWM no proporciona un hecho tier. Una regla que comprueba si tier es igual a gold puede hacer que la firma falle con un error genérico de 500.
Si la firma falla después de activar una regla, revise sus hechos, condiciones y ámbito. Corrija la regla o solicite a un administrador autorizado que la desactive si se trata de un marcador de posición no deseado. La desactivación de una restricción necesaria elimina su protección.
Antes de activar la regla en producción, actívela para el ámbito deseado en un contexto de prueba y verifique que las solicitudes de firma reales estén permitidas o bloqueadas según lo previsto cuando se envíen. El punto final /evaluate por sí solo no verifica el comportamiento durante la firma porque acepta hechos proporcionados por el usuario, que pueden ser diferentes de los proporcionados durante la firma.
Crear regla
Este ejemplo bloquea las transferencias nativas a una dirección para una organización. Sustituya los ID y la dirección de ejemplo por los valores de su entorno. La regla está desactivada y no bloqueará las solicitudes hasta que la active. Revise el ámbito y las condiciones antes de activar la regla.
{
"name": "block-restricted-native-recipient",
"description": "Block native transfers to the restricted recipient",
"category": "transaction-policy",
"enabled": false,
"scopelevels": ["org"],
"targets": {
"orgIds": ["<organization-id>"]
},
"conditions": {
"all": [
{
"fact": "operation",
"operator": "equal",
"value": "native-transfer",
"priority": 100
},
{
"fact": "to_address",
"operator": "equal",
"value": "0x3333333333333333333333333333333333333333",
"priority": 1
}
]
},
"response": {
"type": "BLOCK",
"params": {
"reason": "restricted-recipient"
}
}
}Ponga la condición operation en primer lugar y asígnela una prioridad más alta que los hechos específicos de la operación. Durante la firma de la autorización, la evaluación falla si lee un hecho faltante; la solicitud no se permite silenciosamente.
Los puntos finales de evaluación comprueban las reglas según los hechos que envíe. La firma en directo utiliza hechos de la solicitud validada de UWM y los destinos de ámbito de su cartera resuelta. Utilice la evaluación para inspeccionar una condición y, a continuación, confirme el resultado mediante el flujo de firma previsto.