本技能系统性介绍 Orderly Network 的 API 认证机制,围绕两层认证结构展开:第一层为钱包签名认证,第二层为 Ed25519 API 请求认证。
一、用途 适用于以下场景:设置新的 Orderly 账户与 API 密钥(EVM 或 Solana);构建服务端交易机器人;实现直接 API 调用;理解两层认证流程;排查签名问题。
二、前置条件 需要 Web3 钱包(EVM 可用 MetaMask、WalletConnect;Solana 可用 Phantom、Solflare);一个 Broker ID(例如 woofi_dex 或自有 ID);Node.js 18 及以上版本(用于编程调用);以及理解 EIP-712 结构化数据签名(EVM)或 Ed25519 消息签名(Solana)与 Ed25519 密码学。
三、两层认证结构 第一层为钱包认证,涉及账户注册、API 密钥管理(添加/移除密钥)以及特权操作(提现、管理),EVM 使用 EIP-712 结构化数据签名,Solana 使用 Ed25519 消息签名。第二层为 API 认证(Ed25519),涉及交易操作(下单/撤单)、读取账户数据(持仓、余额)以及 WebSocket 连接,由本地生成的 Ed25519 密钥对签名。
典型流程为:用户连接钱包 → 钱包签名 EIP-712 消息注册账户 → 生成 Account ID → 用户生成 Ed25519 密钥对 → 钱包签名 EIP-712 消息授权该 Ed25519 密钥 → 后续所有 API 调用使用该 Ed25519 密钥。
四、环境配置 主网 API 基础地址为 https://api.orderly.org,WebSocket 地址为 wss://ws.orderly.org/ws/stream。测试网 API 基础地址为 https://testnet-api.orderly.org,WebSocket 地址为 wss://testnet-ws.orderly.org/ws/stream。这些 API 基础地址对 EVM 与 Solana 钱包均适用,Orderly 的 API 是跨链的,同一组端点同时处理两条链。
不要硬编码 chain ID,应按 Broker 动态获取:请求 https://api.orderly.org/v1/public/chain_info?broker_id=${BROKER_ID},返回的 data.chains 包含支持的 chain_id,用于配置 EIP-712 域名。
五、EIP-712 域名配置 Orderly 根据操作类型使用两种不同的 EIP-712 域名。离链域名用于账户注册与 API 密钥管理,主网与测试网 verifyingContract 均为 0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC。链上域名用于提现、内部转账与结算 PnL,主网 verifyingContract 为 0x6F7a338F2aA472838dEFD3283eB360d4Dff5D203,测试网为 0x1826B75e2ef249173FC735149AE4B8e9ea10abff。需要注意,链上 verifyingContract 是 Orderly L2 上的 Ledger 合约,对所有链是单一合约(并非每链一个);各支持的 EVM 链上存在用于充值的 Vault 合约,但 Ledger 是链上操作的权威来源。域名对象包含 name(Orderly)、version(1)、chainId(所连接链 ID)与 verifyingContract。
六、EVM 认证流程
- 检查已有账户:请求 /v1/get_account?broker_id=${BROKER_ID}&user_address=${walletAddress},若 data.success 为 true 则账户已存在,否则继续注册。
- 获取注册 nonce:请求 /v1/registration_nonce,nonce 有效期 2 分钟。
- 签名注册消息:使用 Registration 类型(字段 brokerId、chainId、timestamp、registrationNonce),通过 eth_signTypedData_v4 以 OFFCHAIN_DOMAIN 签名。
- 提交注册:POST /v1/register_account,携带 message、signature、userAddress,返回 result.data.account_id,需保存该 Account ID 供后续 API 认证使用。
七、API 密钥(Orderly Key)管理 生成 Ed25519 密钥对:使用 @noble/ed25519 的 utils.randomPrivateKey() 生成 32 字节私钥,getPublicKeyAsync 派生公钥,公钥以 base58 编码,格式为 ed25519:<base58 公钥>;私钥转 hex 后需安全存储、绝不分享。
添加密钥:使用 AddOrderlyKey 类型(字段 brokerId、chainId、orderlyKey、scope、timestamp、expiration),以 OFFCHAIN_DOMAIN 签名,然后 POST /v1/orderly_key 提交。
密钥权限范围分为:read(读取持仓、订单、余额)、trading(下单、撤单、改单)、asset(充值、提现、内部转账),可逗号分隔组合,如 'read,trading,asset'。
移除密钥:POST /v1/client/remove_orderly_key,需使用另一个有效密钥进行 Ed25519 认证,请求体中指定待移除的 orderly_key。
八、Solana 钱包认证 Solana 钱包使用原生 Ed25519 消息签名(而非 EIP-712)进行账户操作。与 EVM 的差异:签名方式为普通消息签名而非结构化数据;密钥类型为原生 Ed25519;账户查询需带 chain_type=SOL 参数;消息格式为通过适配器生成原始字节;签名为 Ed25519 签名。
账户查询:请求 /v1/get_account?address=${solanaAddress}&broker_id=${BROKER_ID}&chain_type=SOL,返回 data.data.account_id(其格式与 EVM 不同,不是 keccak256 哈希)。
消息签名使用 Orderly 提供的 Solana 适配器 DefaultSolanaWalletAdapter(来自 @orderly.network/default-solana-adapter),结合 @solana/web3.js 与 bs58 使用,链 ID 主网为 900900900、测试网为 901901901。
注册流程:获取 /v1/registration_nonce → 通过适配器 generateRegisterMessage 生成消息并签名 → POST /v1/register_account,携带 message、signature、userAddress 与 chainType: 'SOL'。
密钥管理:与 EVM 相同,本地生成 Ed25519 密钥对;通过适配器 generateAddKeyMessage 生成添加密钥消息(参数 brokerId、orderlyKey、scope、timestamp、expiration)并签名;POST /v1/orderly_key,携带 chainType: 'SOL'。
九、提现与结算签名 提现需在 EVM 与 Solana 上均进行钱包签名:先请求 /v1/withdraw_nonce 获取 withdraw_nonce;通过适配器 generateWithdrawMessage 生成消息(参数 brokerId、receiver、token、amount、timestamp、nonce);签名后 POST /v1/withdraw_request,携带 message、signature、userAddress 与 verifyingContract(主网 0x6F7a338F2aA472838dEFD3283eB360d4Dff5D203,测试网 0x1826B75e2ef249173FC735149AE4B8e9ea10abff)。
结算 PnL 签名:请求 /v1/settle_nonce 获取 settle_nonce,再生成 settle 消息并进行签名。
十、限制与说明 资料仅覆盖认证流程本身,未提供该技能的计费方式、价格、性能指标或具体运行环境要求之外的信息;主网/测试网之外的部署平台、适配器完整 API、错误码与调试细节暂未提供。