创建策略

策略是一组可以阻止签名请求的规则。签名请求包括区块链交易和签名数据的请求,例如 EIP-712 类型的数据。每个存储规则都有一个作用域、条件和一个 BLOCK 响应。启用的规则将累积应用:如果任何适用的规则匹配,则请求将被拒绝。

如果策略评估成功完成,并且没有适用的规则返回 BLOCK 响应,则可以在 UWaaS Wallet Manager (UWM) 验证调用方、授权 wallet 和密钥并验证签名请求后继续请求。

有关 UWaaS Wallet Manager 的信息,请参见 Universal Wallet as a Service (UWaaS) 。有关 API 请求字段和操作,请参阅 Universal Wallet Manager API ,包括:

定义规则条件

规则将条件与 all、any 和 not 组合。可以嵌套以下组以定义限制:

  • 当每个子条件匹配时,all 匹配。
  • 当至少一个子条件匹配时,any 将匹配。
  • not 在其子条件不匹配时匹配。

内嵌定义条件组。UWM 签名规则不支持命名条件引用。

条件叶指定事实、运算符和值。使用 path 可从事实中选择嵌套属性。首先计算较高的 priority 值。

{
  "fact": "to_address",
  "operator": "in",
  "value": ["<blocked-address>"]
}

当事实等于列出的值之一时,in 运算符匹配。使用 all 将此条件与 operation 条件组合。当多个条件之一可以触发限制时,请使用 any。

运算符

运算符 在以下情况下使用
equal, notEqual 标量事实必须等于或不同于相同类型的值。
in, notIn 标量事实必须出现在或未出现在值列表中。
contains, doesNotContain 数组事实必须包含或不包含值。
lessThan, lessThanEquals (lessThanInclusive) 数字事实必须小于或等于数字值。
greaterThan, greaterThanEquals (greaterThanInclusive) 数字事实必须大于或等于数字值。

对 amount、amount_atomic 和 native_value_atomic 进行的排序比较在 /evaluate 和 /internal/v1/authorize 上使用精确的小数运算。

对原子数量和大阈值使用十进制字符串。例如:

{ "fact": "amount_atomic", "operator": "greaterThanEquals", "value": "1000000000000000000" }

UWM 以基本单位提供 amount_atomic,不将其转换为令牌小数。当由 /evaluate 的调用方提供时,支持 amount 事实;UWM 不会将其添加到签名事实中。

接受安全数字范围内的小数 JSON 数字。以字符串形式发送较大的数字值;拒绝较大的数字文字。仍支持 greaterThanInclusive 和 lessThanInclusive 运算符名称。equal 和 notEqual 运算符按类型比较值。其他事实保留了他们现有的比较行为。

数组装饰符

使用装饰符和冒号(例如 someFact:equal)为运算符添加前缀。装饰符更改运算符处理数组的方式或其结果。

修饰器 在以下情况下使用
someFact 数组事实中至少有一个项匹配。
everyFact 数组事实中的每一项都匹配。
someValue 事实与数组值中的至少一项匹配。
everyValue 事实与数组值中的每个项匹配。
swap 比较将值用作事实,将事实用作值。
not 基本运算符结果必须被否定。

例如,someFact:equal 可以匹配为解码的 ERC-1155 批处理调用提供的 token_ids 数组中的一个令牌 ID:

{
  "fact": "token_ids",
  "operator": "someFact:equal",
  "value": "42"
}

使用布尔逻辑的 not 条件组和 not: 装饰符来否定单个运算符。条件和规则优先级设置求值顺序。它们不允许一个规则覆盖另一个匹配的 BLOCK。

设置规则范围

设置 scopelevels 和 targets 以指定规则涵盖的签名请求。每个选定范围必须匹配。一个范围内的目标是替代方案。

范围 所需目标 使用对象
global 无;指定
scopelevels:
                    ["global"]
本身。
适用于每个签名请求的限制。
org targets.orgIds 一个或多个组织的限制。
wallet targets.walletIds 对一个或多个钱包的限制。
instance targets.instanceIds 一个或多个网络实例的限制。
asset targets.assetIds 现有的资产范围规则;为了兼容性而保留。
当规则依赖于多个维时,组合范围。例如:
scopelevels: ["org",
        "wallet"]
需要组织目标和 wallet 目标都匹配。仅 wallet 规则没有隐式组织边界。使用 UWM 返回的 ID,而不是显示名称。

要限制合同方法,请在条件中匹配 contract_address 和 function_selector。如果同一方法要求对不同网络施加不同的限制,请添加 instance 范围。对于现有规则,asset 范围会保留;这些条件不需要。

对于 targets.instanceIds,使用 UWM 的 wallet 或网络 API 显示的公共 instanceId。这是已注册的 infra_instance_id,而不是数字数据库密钥或链 ID。更新使用数据库密钥的旧实例范围规则;UWM 现在仅发送公共实例标识符。

匹配签名请求

条件只能使用为请求的 operation 提供的事实。operation 事实适用于每个签名请求。

operation 其他事实
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 可识别具有零本机值的规范 ERC-20 transfer(address,uint256) 调用,而无需标记注册。UWM 不再读取 capability.approved-token-contracts。

erc20-transfer 配置文件还提供了 native_value_atomic ("0")、function_selector ("0xa9059cbb") 和 calldata_hash。这些事实允许现有的 contract-call 规则保留其全部限制。

erc20-transfer 操作也是用于操作条件的 contract-call。这两种规则类型可以匹配相同的请求,任何匹配的 BLOCK 都会拒绝该请求。此行为适用于两个评估端点上的 equal、notEqual、in、notIn 和嵌套布尔条件。其他事实保留了它们正常的平等语义。

erc20-transfer 操作与 transfer(而不是 transferFrom 或 ERC-1155 方法)匹配。始终在标记规则中包括预期的 contract_address。

Canonical ERC-20 transferFrom、ERC-1155 safeTransferFrom 和 ERC-1155 safeBatchTransferFrom 调用提供了额外的 contract-call 事实:

调用 其他事实
ERC-20 transferFrom owner_address, to_address, amount_atomic
ERC-1155 safeTransferFrom owner_address, to_address, token_id, amount_atomic
ERC-1155 safeBatchTransferFrom owner_address、to_address、并行 token_ids 和 amounts 数组

UWM 仅解码具有受支持规范 ABI 布局的调用。其他调用保留通用 contract-call 事实。

owner_address 是调用数据中的源地址,而不是签名 wallet。选择器标识调用数据布局,而不是部署的合同的行为。ERC-20 和 ERC-721 共享 transferFrom 选择器,因此仅对已知的实施 ERC-20 的合同应用金额条件。地址和选择器将规范化为小写;使用小写条件值。对于批调用,请不要为不同的令牌 ID 合计金额。

amount_atomic 和 native_value_atomic 是以基本单位表示的十进制字符串;本机值采用 Wei。EIP-712 整数值也是十进制字符串。对于 EIP-712,typed_data 包含签名域和消息。path 相对于此事实:将 $.message.value 用于消息值,将 $.domain.chainId 用于已签名链 ID。

Wallet、组织和网络限制属于 wallet、org 和 instance 范围。Signer、gas 和 nonce 元数据不是条件事实。asset 范围目标不添加 asset 条件事实。

启用签名规则之前

仅使用“匹配签名请求”下为操作列出的事实。当规则使用特定于操作的事实时,请包括 operation 条件。

保存规则不会确认 UWM 在签名期间可以对其进行评估。例如,UWM 不提供 tier 事实。检查 tier 是否等于 gold 的规则会导致签名失败,并显示一般的 500 错误。

如果在启用规则后签名失败,请查看其事实、条件和范围。更正规则,如果是意外占位符,请授权管理员禁用该规则。禁用必需的限制会解除其保护。

在生产环境中启用规则之前,请在测试上下文中为预期范围启用该规则,并验证在提交实际签名请求时是否允许或按预期阻止这些请求。/evaluate 端点本身不会在签名期间验证行为,因为它接受用户提供的事实,这可能与签名期间提供的事实不同。

创建一个规则

此示例阻止本地传输到一个组织的地址。将示例 ID 和地址替换为环境的值。规则已禁用,在您启用之前不会阻止请求。请先复核范围和条件,然后再启用规则。

{
  "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"
    }
  }
}

将 operation 条件放在首位,并为其分配高于特定于操作的事实的优先级。在签名授权期间,如果评估读取缺少的事实,则评估将失败;不允许无提示地执行请求。

评估端点根据您提交的事实检查规则。实时签名使用 UWM 已验证的请求和已解析钱包中的范围目标中的事实。使用评估来检查条件,然后通过预期的签名流确认结果。