Composer permissioned-key in dettaglio
Dettaglio tecnico del composer AllOf/AnyOf/MessageFilter/ClobPairIdFilter/SubaccountFilter usato per registrare le trading key Botely on-chain.
L'albero composer
dYdX v4 usa un sistema 'authenticator' generico dal modulo accountplus. Un authenticator è un albero di composer (AND/OR logici) sopra predicati foglia (signature check, message-type filter, subaccount filter, market filter). Quando una transazione è firmata da una key authenticator-holding, la chain valuta l'albero contro il contenuto della transazione — e accetta solo se l'albero ritorna true.
L'albero che registriamo è esattamente: AllOf [ SignatureVerification(trading-key-pubkey), AnyOf [MessageFilter('/dydxprotocol.clob.MsgPlaceOrder'), MessageFilter('/dydxprotocol.clob.MsgCancelOrder'), MessageFilter('/dydxprotocol.clob.MsgBatchCancel')], SubaccountFilter('0'), AnyOf [ClobPairIdFilter(ETH-USD-id), ClobPairIdFilter(SOL-USD-id), ClobPairIdFilter(BNB-USD-id)] ].
Formato di encoding on the wire
Il composer è serializzato come albero JSON base64-encoded. L'AllOf esterno è un nodo 'composer' — il suo campo `config` è la base64 di un array JSON di figli. Ogni filter foglia ha un campo `config` che è base64 di: una public key (SignatureVerification), un message type URL (MessageFilter), un subaccount number come ASCII (SubaccountFilter), o un clob_pair_id come ASCII (ClobPairIdFilter).
Mismatch di encoding falliscono safe: la chain rifiuta un authenticator che non riesce a decodificare. Abbiamo verificato l'encoding byte-for-byte contro il tool CLI pubblicato da dYdX — stessi byte, stesso effetto on-chain.
Cosa fa ciascun filter
SignatureVerification: controlla che la parte pubblica della trading-key matchi ciò che è stato firmato. È questo a rendere la key delegata — la chain matcha la signing key contro la whitelist di key ammesse dell'authenticator.
MessageFilter: controlla che i message types della transazione siano dentro la lista AnyOf. Tutto il resto (transfer, withdraw, governance, ecc.) è rifiutato.
SubaccountFilter: controlla che il subaccount number nel body del messaggio sia uguale al valore del filter (qui '0').
ClobPairIdFilter: per gli ordini, controlla che il clob_pair_id nel body equivalga al valore del filter (qui uno tra ETH/SOL/BNB).
Perché AllOf in cima
Ogni condizione dell'authenticator deve valere. Se avessimo usato OR, una transazione che passa anche un solo filter avrebbe successo — vanificando la restrizione. Con AllOf, ogni filter ha veto.
I gruppi AnyOf interni sono per le parti disgiuntive 'uno di questi va bene' (uno dei 3 message types, uno dei 3 mercati). Effetto combinato: sono permesse solo 9 (3 × 3) combinazioni: place/cancel/batch-cancel × ETH/SOL/BNB, tutte sul subaccount 0.