代理密钥
代理密钥的注册与管理,共三个操作。
代理是一个基于以太坊派生的密钥对,可以代表您对交易请求签名,而无需暴露您的主钱包。您只需注册一次代理的地址,并由所属钱包的签名授权。此后由代理密钥承担交易权限,钱包密钥则保持离线。
本部分的任何操作都不需要会话令牌。请求体中的 EIP-712 签名以带内方式授权注册,因此注册完全不需要凭证。两个管理操作(GET /agents、DELETE /agents/{address})使用您的 HMAC API 密钥进行身份验证。
POST /agents/register
请求体中的 EIP-712 签名。无需会话令牌,也无需 API 密钥。
GET /agents
hmacAuth
DELETE /agents/{address}
hmacAuth
以下所有示例的基础 URL:https://api.testnet.nexus.xyz/v1,即公共测试网基础 URL。
EIP-712 载荷
由将拥有该代理的钱包生成的类型化数据签名来授权注册。
Domain
{
"name": "Nexus Exchange",
"version": "1",
"chainId": "<testnet chain id>",
"salt": "<network salt, see below>"
}Type
RegisterAgent {
address agent
uint64 expiresAt
uint64 nonce
}需要注意的细节:
签名覆盖三个字段:
agent、expiresAt和nonce。所属的wallet不属于类型化数据。您在请求体中另外发送它,服务器会检查恢复出的签名者是否与之匹配。类型化数据的字段名使用 camelCase(
expiresAt),而 JSON 请求体使用 snake_case(expires_at)。签名时用 camelCase 名称,发送时用 snake_case 名称。如果让
expires_at由服务器端取默认值,您就没有可签名的值。请自行计算过期时间,对其签名,并显式发送。契约将签名域(domain)的
chainId写作占位符<testnet chain id>,并未固定取值。链 ID 以部署本身为准:请从该网关自己的GET /metadata读取(参见网络)。签名前请确认目标网关期望的值,因为签名域不匹配只会返回signer_mismatch,而不是说明性的错误。签名域还带有一个
salt:keccak256(<network>),其中<network>是您签名所针对网关的小写部署名称("mainnet"、"testnet"或"local")。这会将RegisterAgent签名限定在一个部署上。即使chainId恰好相同,同一签名在其他网络上也无效。请查询目标部署的 salt 值,而不要自行重新计算,因为错误的salt只会返回signer_mismatch,没有其他提示。
POST /agents/register
注册代理密钥。
为您的钱包注册一个新的代理密钥。代理是一个基于以太坊派生的密钥对,可以代表您对交易请求签名,而无需暴露您的主钱包。由将拥有该代理的钱包生成的 EIP-712 签名来授权注册。无需会话令牌。
EIP-712 签名域:{ name: 'Nexus Exchange', version: '1', chainId: <testnet chain id>, salt: <network salt> }。类型化数据类型:RegisterAgent { address agent, uint64 expiresAt, uint64 nonce }。
身份验证:无。请求通过其携带的 EIP-712 签名自行授权。
请求体
AgentRegistrationRequest,application/json,必填。
wallet
string
是
所属钱包地址(0x 前缀,20字节)
agent
string
是
从代理密钥对派生的代理以太坊地址(0x 前缀,20字节)
expires_at
integer (int64)
否
过期时间,Unix 毫秒。可选,默认为当前时间+30天。必须在 [now+1d, now+90d] 范围内。
nonce
integer (int64)
是
单调递增的 nonce。可以用当前 Unix 毫秒时间戳作为安全的起始值。
signature
string
是
用钱包私钥对 RegisterAgent{agent, expiresAt, nonce} 生成的 EIP-712 签名(0x 前缀)
label
string
否
可选的代理可读标签(例如 my-bot)
响应
200
代理已注册。契约为此响应提供了示例,但没有命名的 Schema。
agent_address
string
已注册的代理地址(0x 前缀)
expires_at
integer (int64)
实际生效的过期时间,Unix 毫秒。即您发送的值,若您省略则为服务器默认值
400
错误请求:bad_wallet、bad_agent、expiry_out_of_range(从当前起 [1 d, 90 d])或 invalid_json。
401
signature_invalid 或 signer_mismatch。EIP-712 签名未能恢复为所声明的钱包。
409
duplicate_agent。该代理地址已注册到此钱包。
示例
响应:
GET /agents
列出您的代理。
返回注册到已认证钱包下的所有未过期代理密钥。服务器会过滤掉已过期的代理,因此从该列表中消失的代理已到达其生命周期终点。这不是错误。
身份验证:hmacAuth(HMAC API 密钥)。
响应
200
代理记录数组。数组元素为 AgentInfo。
address
string
代理地址(0x 前缀)
expiresAt
integer (int64)
过期时间,Unix 毫秒
registeredAt
integer (int64)
注册时间,Unix 毫秒
label
string | null
可选标签
这里的响应字段名使用 camelCase,与使用 snake_case 的注册请求体不同。
401
需要 HMAC 身份验证。
示例
响应:
关于如何构造 X-Timestamp 和 X-Signature,请参见身份验证。
DELETE /agents/{address}
撤销代理。
立即撤销一个代理密钥。此调用返回后,服务器会拒绝由已撤销代理签名的任何在途请求。
身份验证:hmacAuth(HMAC API 密钥)。
参数
address
path
string
是
要撤销的代理地址(0x 前缀)
响应
200
代理已撤销。
401
需要 HMAC 身份验证。
404
未找到代理,或该代理不归您所有。所有权校验失败返回 404 而非 403,因此您无法借此探查其他钱包的代理。
示例
运维说明
有效期有上下限。代理必须在注册后1到90天之间过期,省略
expires_at则为30天。截至规范0.9.90,没有续期操作,因此请在旧代理失效前重新注册一个新代理。nonce 按钱包单调递增。使用当前 Unix 毫秒时间戳作为 nonce,无需跟踪状态即可满足该顺序要求。
撤销立即生效,并且适用于在途请求。
DELETE返回后,服务器会拒绝由已撤销代理签名的请求。注册在传输层不做身份验证。任何人都可以提交注册,但服务器只接受来自所声明钱包的有效 EIP-712 签名。请保管好钱包密钥,因为对
RegisterAgent的签名会授予最长90天的交易权限。
状态:测试网预览版。代理注册目前还无法在网关重启后保留,因此请将其视为可重新创建的,与 API 密钥一样。
最后更新于

