Creare un criterio
Un criterio è un set di regole in grado di bloccare le richieste di firma. Le richieste di firma includono transazioni blockchain e richieste di firma dei dati, come i dati digitati EIP-712. Ogni regola memorizzata ha un ambito, condizioni e una risposta BLOCK. Le regole abilitate si applicano cumulativamente: se una regola applicabile corrisponde, la richiesta viene rifiutata.
Se la valutazione dei criteri viene completata correttamente e nessuna regola applicabile restituisce una risposta BLOCK, la richiesta può continuare dopo che UWaaS Wallet Manager (UWM) ha autenticato il chiamante, autorizzato il wallet e la chiave e convalidato la richiesta di firma.
Definisci condizioni regola
Una regola combina le condizioni con all, any e not. È possibile nidificare questi gruppi per definire una restrizione:
allcorrisponde a ogni condizione figlio.anycorrisponde quando almeno una condizione figlio corrisponde.notcorrisponde quando la relativa condizione figlio non corrisponde.
Definire i gruppi di condizioni in linea. I riferimenti alle condizioni denominate non sono supportati per le regole di firma UWM.
Una foglia condizione specifica un fact, un operatore e un valore. Utilizzare path per selezionare una proprietà nidificata da un fact. Vengono valutati prima i valori priority più alti.
{
"fact": "to_address",
"operator": "in",
"value": ["<blocked-address>"]
}L'operatore in corrisponde quando il fact è uguale a uno dei valori elencati. Utilizzare all per combinare questa condizione con una condizione operation. Utilizzare any quando una delle diverse condizioni può attivare la limitazione.
Operatori
| Operatore | Utilizzalo quando |
|---|---|
equal, notEqual |
Un fatto scalare deve essere uguale o diverso da un valore dello stesso tipo. |
in, notIn |
Un dato fact scalare deve essere visualizzato o meno in un elenco di valori. |
contains, doesNotContain |
Un fact array deve contenere o non contenere un valore. |
lessThan, lessThanEquals (lessThanInclusive)
|
Un fact numerico deve essere minore o minore o uguale a un valore numerico. |
greaterThan, greaterThanEquals (greaterThanInclusive)
|
Un fact numerico deve essere maggiore o maggiore o uguale a un valore numerico. |
I confronti ordinati in amount, amount_atomic e native_value_atomic utilizzano l'aritmetica decimale esatta sia in /evaluate che in /internal/v1/authorize.
Utilizzare stringhe decimali per quantità atomiche e soglie grandi. Ad esempio:
{ "fact": "amount_atomic", "operator": "greaterThanEquals", "value": "1000000000000000000" }UWM fornisce amount_atomic in unità di base e non lo converte in decimali token. Il fact amount è supportato quando fornito da un chiamante di /evaluate; UWM non lo aggiunge ai fact di firma.
Sono accettati numeri JSON decimali compresi nell'intervallo numerico sicuro. Invia valori numerici più grandi come stringhe; i valori numerici più grandi vengono rifiutati. I nomi degli operatori greaterThanInclusive e lessThanInclusive rimangono supportati. Gli operatori equal e notEqual confrontano i valori per tipo. Altri fatti mantengono il loro comportamento di confronto esistente.
Array Decorator
Definire il prefisso di un operatore con un decoratore e due punti, ad esempio someFact:equal. I decoratori cambiano il modo in cui l'operatore gestisce gli array o i relativi risultati.
| Decorator | Utilizzalo quando |
|---|---|
someFact |
Almeno un elemento in un fact array corrisponde. |
everyFact |
Ogni elemento in un fact array corrisponde. |
someValue |
Il fact corrisponde ad almeno un elemento in un valore di array. |
everyValue |
Il fact corrisponde a ogni elemento in un valore di array. |
swap |
Il confronto utilizza il valore come fact e il fact come valore. |
not |
Il risultato dell'operatore di base deve essere negativo. |
Ad esempio, someFact:equal può corrispondere a un ID token nell'array token_ids fornito per una chiamata batch ERC-1155 decodificata:
{
"fact": "token_ids",
"operator": "someFact:equal",
"value": "42"
}Utilizzare il gruppo di condizioni not per la logica booleana e il decoratore not: per negare un singolo operatore. La condizione e le priorità della regola impostano l'ordine di valutazione. Non consentono a una regola di sostituire un'altra BLOCK corrispondente.
Imposta ambito regola
Impostare scopelevels e targets per specificare le richieste di firma coperte da una regola. Ogni ambito selezionato deve corrispondere. Gli obiettivi all'interno di un ambito sono alternative.
| Ambito | Destinazione richiesta | Utilizzalo per |
|---|---|---|
global |
Nessuno; specificare di se stesso. |
Limitazione applicabile a ogni richiesta di firma. |
org |
targets.orgIds |
Limitazione per una o più organizzazioni. |
wallet |
targets.walletIds |
Limitazione per uno o più portafogli. |
instance |
targets.instanceIds |
Limitazione per una o più istanze di rete. |
asset |
targets.assetIds |
Regole esistenti con ambito asset; mantenute per compatibilità. |
scopelevels: ["org",
"wallet"] richiede la corrispondenza sia dell'organizzazione che delle destinazioni wallet. Una regola solo wallet non dispone di un limite di organizzazione implicito. Utilizzare gli ID restituiti da UWM, non i nomi visualizzati.Per limitare un metodo di contratto, confrontare contract_address e function_selector nelle condizioni. Aggiungere l'ambito instance se lo stesso metodo richiede restrizioni diverse su reti diverse. L'ambito asset viene mantenuto per le regole esistenti; queste condizioni non lo richiedono.
Per targets.instanceIds, utilizzare il file instanceId pubblico visualizzato dal wallet o dall'API di rete di UWM. Si tratta del file infra_instance_id registrato, non della chiave di database numerica o dell'ID catena. Aggiorna le regole con ambito di istanza precedente che utilizzano una chiave di database; UWM ora invia solo l'identificativo di istanza pubblica.
Corrispondenza richiesta di firma
Le condizioni possono utilizzare solo i fatti forniti per operation della richiesta. Il fatto operation è disponibile per ogni richiesta di firma.
operation |
Dati aggiuntivi |
|---|---|
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 riconosce le chiamate canoniche ERC-20 transfer(address,uint256) con zero valore nativo senza registrazione del token. UWM non legge più capability.approved-token-contracts.
Il profilo erc20-transfer fornisce anche native_value_atomic ("0"), function_selector ("0xa9059cbb") e calldata_hash. Questi fatti consentono alle regole contract-call esistenti di mantenere le loro restrizioni complete.
Un'operazione erc20-transfer è anche contract-call per le condizioni dell'operazione. Entrambi i tipi di regola possono corrispondere alla stessa richiesta e qualsiasi BLOCK corrispondente la nega. Questo comportamento si applica alle condizioni booleane nidificate equal, notEqual, in, notIn in entrambi gli endpoint di valutazione. Altri fatti mantengono la loro semantica di uguaglianza normale.
L'operazione erc20-transfer corrisponde ai metodi transfer, non transferFrom o ERC-1155. Includere sempre il file contract_address nelle regole del token.
Le chiamate Canonical ERC-20 transferFrom, ERC-1155 safeTransferFrom e ERC-1155 safeBatchTransferFrom forniscono ulteriori informazioni su contract-call:
| Chiamata | Dati aggiuntivi |
|---|---|
ERC-20 transferFrom |
owner_address, to_address, amount_atomic |
ERC-1155 safeTransferFrom |
owner_address, to_address, token_id, amount_atomic |
ERC-1155 safeBatchTransferFrom |
array owner_address, to_address, token_ids e amounts paralleli
|
UWM decodifica solo le chiamate con un layout ABI canonico supportato. Altre chiamate conservano i fact generici contract-call.
owner_address è l'indirizzo di origine nei dati della chiamata, non il wallet di firma. Un selettore identifica il layout dei dati di chiamata, non il comportamento del contratto distribuito. ERC-20 e ERC-721 condividono il selettore transferFrom, quindi applicano condizioni di importo solo a un contratto noto per implementare ERC-20. Gli indirizzi e i selettori vengono normalizzati in minuscolo; utilizzare valori di condizione minuscoli. Per le chiamate batch, non calcolare gli importi totali per ID token diversi.
amount_atomic e native_value_atomic sono stringhe decimali in unità di base; il valore nativo è in wei. Anche i valori interi EIP-712 sono stringhe decimali. Per EIP-712, typed_data contiene il dominio e il messaggio firmati. Un valore path è relativo a tale fatto: utilizzare $.message.value per il valore del messaggio e $.domain.chainId per l'ID catena firmato.
Le restrizioni di wallet, organizzazione e rete appartengono agli ambiti wallet, org e instance. I metadati Signer, Gas e Nonce non sono fatti condizionali. La destinazione dell'ambito asset non aggiunge un fact condizione asset.
Prima di abilitare una regola di firma
Utilizzare solo i dati fact elencati per l'operazione in Corrispondenza richiesta di firma. Includere una condizione operation quando una regola utilizza fact specifici delle operazioni.
Il salvataggio di una regola non conferma che UWM possa valutarla durante la firma. Ad esempio, UWM non fornisce un fact tier. Una regola che controlla se tier è uguale a gold può causare la mancata firma con un errore generico 500.
Se la firma non riesce dopo aver abilitato una regola, esaminarne i fact, le condizioni e l'ambito. Correggere la regola o chiedere a un amministratore autorizzato di disabilitarla se si tratta di un segnaposto non previsto. La disabilitazione di una restrizione obbligatoria ne elimina la protezione.
Prima di abilitare la regola in produzione, abilitarla per l'ambito previsto in un contesto di test e verificare che le richieste di firma effettive siano consentite o bloccate come previsto al momento della sottomissione. L'endpoint /evaluate da solo non verifica il funzionamento durante la firma perché accetta i fact forniti dall'utente, che possono essere diversi da quelli forniti durante la firma.
Crea regola
In questo esempio vengono bloccati i trasferimenti nativi in un unico indirizzo per un'organizzazione. Sostituire gli ID e l'indirizzo di esempio con i valori dell'ambiente in uso. La regola è disabilitata e non bloccherà le richieste finché non viene abilitata. Esaminare l'ambito e le condizioni prima di abilitare la regola.
{
"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"
}
}
}Inserire prima la condizione operation e assegnarla a una priorità più alta rispetto ai fact specifici dell'operazione. Durante la firma dell'autorizzazione, la valutazione non riesce se legge un fatto mancante; la richiesta non è consentita in silenzio.
Le regole di controllo degli endpoint di valutazione rispetto ai fact sottomessi. La firma in tempo reale utilizza i fact della richiesta convalidata di UWM e gli obiettivi di ambito dal wallet risolto. Utilizzare la valutazione per ispezionare una condizione, quindi confermare il risultato mediante il flusso di firma previsto.