Für Entwickler / Anwendungs-APIs

Anwendungs-APIs

Vier hauseigene Dienste stehen neben der Chain. Keiner davon ist die Chain, keiner ist versioniert, und jeder scheitert auf seine eigene Weise - wofür dieser Abschnitt da ist.

Was diese Dienste sind

Die Schnittstelle der Chain ist JSON-RPC. Alles auf diesen Seiten ist etwas, das eine Anwendung für sich selbst gebaut und dann erreichbar gelassen hat: ein Postgres-Index über den Log-Spool des Sequencers, ein Prozess, der einen Schlüssel hält, eine Spielschleife. Sie sind bequem, sie sind hauseigen, und sie sind nicht maßgeblich.

Ein Lesezugriff auf einen davon ist kein Lesezugriff auf die Chain

Jede Zahl hier ist durch einen Indexer, einen Cache oder beides gegangen. Ein angehaltener Indexer antwortet weiter mit seinem letzten Stand, und kein Feld der Antwort sagt das; die einzigen Routen, die es Ihnen sagen, sind die Health-Routen, und Sie müssen sie fragen. Wenn die Antwort über Geld entscheidet, lesen Sie die Chain.

A read-only view of what the Pepper indexer has derived from the chain's logs: constant-product pools, concentrated pools, swaps, liquidity events and positions. It reads Postgres rather than the chain, deliberately.

Stack
Python, standard-library ThreadingHTTPServer, psycopg pool of at most 8 connections, HTTP/1.1
Eingehängt
/api/ on the Pepper origin

The archive the node deliberately is not. Blocks, mini-blocks, transactions, receipts, logs, call traces, decoded transfers, accounts, tokens, NFTs and the name-service record, all from a Postgres index fed by the sequencer's own log spool.

Stack
Python, standard-library ThreadingHTTPServer, psycopg pool of at most 12 connections, plus live reads against the node
Eingehängt
/api/ on the explorer origin

The only first-party service that WRITES to the chain. It holds the faucet operator key and submits the drip on your behalf, which is why the page needs no wallet.

Stack
Python, standard-library SimpleHTTPRequestHandler serving a static site as well as the API, signing with eth-account
Eingehängt
its own origin; the home origin re-exposes two of its routes

A WebSocket server for the games, with a small HTTP surface beside it for health and for the figures the site's chrome draws. The socket is the interface; the HTTP routes are a snapshot of it.

Stack
Node, `ws` in noServer mode behind a plain http server, one event loop for eight game rooms
Eingehängt
/api/ and /ws/ on the arcade origin

Wo sie antworten

DienstBasis-URL
Explorer-APIhttps://explorer.picklechain.xyz/api/auch von den Seiten des Namensdienstes und des Werkzeugkastens unter /api/ eingehängt
Pepper-DEX-APIhttps://pepper.picklechain.xyz/api/nur gleiche Herkunft; ein Browser auf einer anderen Herkunft kann sie nicht aufrufen
Faucethttps://faucet.picklechain.xyzdie Heimat-Herkunft stellt POST /drip und GET /faucet-status erneut bereit
Arcadehttps://minigame.picklechain.xyz/api/und der Socket unter wss://minigame.picklechain.xyz/ws/<room>

Nicht einer dieser Dienste hat einen eigenen Hostnamen. Jeder ist ein /api/-Einhängepunkt auf der Herkunft eines Frontends, was die öffentliche Basis zu einer Tatsache von nginx macht statt zu einer des Dienstes: Ein Deployment, das eine Website verschiebt, verschiebt ihre API mit, und der Pfad darin bleibt derselbe. Auf einem Stack, den Sie selbst betreiben, antworten dieselben Dienste stattdessen auf Loopback, auf dem Port, den die Seite des jeweiligen Dienstes nennt.

Nirgends eine Versionierung

Es gibt bei keinem der vier ein /v1, keinen Versions-Header und keine Abkündigungsregel. Es gibt auch kein OpenAPI-Dokument und kein JSON Schema im Repository, ein Feld kann also zwischen zwei Deployments seine Form ändern, ohne dass sich etwas zum Vergleichen fände. Lesen Sie defensiv: Ignorieren Sie Schlüssel, die Sie nicht kennen, und scheitern Sie nicht an einem Schlüssel, der verschwunden ist.

Authentifizierung

Keiner der vier verlangt eine Authentifizierung, und was zählt, ist, was jeder von ihnen ohne eine tun kann.

  • Der Explorer, die DEX-API und die Arcade nehmen keine. Sie sind nur lesend und öffentlich. Der Explorer antwortet jedem POST mit 405; die DEX-API implementiert kein Verb außer GET.
  • Der Faucet nimmt ebenfalls keine, und er schreibt auf die Chain. Das ist der ganze Grund, warum seine Quote streng ist und reserviert wird, bevor irgendetwas signiert wird.

Der Arcade-Socket hat keine Authentifizierung, und der Prozess hält einen Schlüssel

Es gibt davor keine Authentifizierungsschicht, und es ist auch keine geplant: Der Proxy leitet das Upgrade weiter, und das war es. Was ihn schützt, ist, dass jede Dimension einer Verbindung begrenzt ist - Anzahl, Herkunft, Rahmengröße, Nachrichtenrate, gepufferte Bytes - und jeder Überlauf fallengelassen statt eingereiht wird. Nichts, was ein Client über diesen Socket sagt, autorisiert irgendetwas; die Contracts entscheiden, wer spielen darf.

Einen davon aus einem Browser aufrufen

CORS wird pro Dienst gesetzt, und sie sind sich uneinig; als Erstes ist also zu klären, ob eine Seite auf Ihrer Herkunft den gewünschten Dienst überhaupt aufrufen kann.

  • Die DEX-API sendet keinen CORS-Header und hat keinen OPTIONS-Handler. Ein herkunftsübergreifendes fetch aus einem Browser scheitert rundheraus, während dieselbe Anfrage von einem Server gelingt, und das ist die Art von Fehler, die dem Netzwerk angelastet wird. Legen Sie einen Proxy davor, oder rufen Sie sie aus einem Backend auf.
  • Der Explorer und der Faucet führen Allowlists. Ein Preflight von einer Herkunft, die nicht auf der Liste steht, wird mit 403 abgelehnt, was immerhin eine klare Antwort ist.
  • Die Arcade prüft die Origin beim Upgrade und lehnt vor dem Handshake mit 403 ab, der Socket öffnet also gar nicht erst, statt zu öffnen und dann zu schweigen.

Grenzen und Blättern

Nur der Explorer begrenzt die Anfragerate. Die drei anderen verlassen sich stattdessen auf eine Kappung, eine Quote oder eine Verbindungsobergrenze.

DienstGrenze
Pepper DEX API`limit` is clamped to 1..500 on every list route and defaults to 50. There is no request-rate limit in the service.
Explorer API300 requests per minute per client address, then 429. Request bodies are capped at 600,000 bytes. Live streams are capped at 32 concurrent.
FaucetQuota is reserved before the transaction is signed: 5 a day per address seen, 2 a day per funded address, 1000 a day in total. Request bodies are capped at 4096 bytes.
Arcade server256 sockets in total and 8 per source address, then the upgrade is refused 429. Inbound frames are 4 KiB at most and rate-limited per socket. A socket more than 512 KiB behind is cut.

Eine gekappte Liste ist still eine kurze Liste

Fragen Sie die DEX-API nach tausend Swaps, und Sie bekommen fünfhundert, mit einer 200 und nichts, was sagt, dass die Antwort beschnitten wurde. Fragen Sie den Explorer nach zweihundert Blöcken, und Sie bekommen hundert. Keiner der beiden Dienste gibt auf den meisten Listenrouten eine Gesamtzahl zurück, es gibt also kein Feld, mit dem Sie Ihre Seitenlänge vergleichen könnten - das einzige Signal, dass es mehr gibt, ist, dass Sie genau die Kappung bekommen haben.

Wo es Blättern gibt, ist es limit und offset, kein Cursor. Das heißt, dass eine Liste, die am Kopf wächst, zwischen zwei Seiten unter Ihnen verrutscht: Zeilen, die Sie schon gesehen haben, tauchen wieder auf, und Zeilen, die Sie noch nicht gesehen haben, können übersprungen werden. Für alles, was vollständig sein muss, blättern Sie über einen Schlüssel, den Sie kontrollieren - eine Blocknummer, einen Hash - statt über einen Offset.

Konventionen

KonventionValue
VersioningNone of them is versionedno /v1, no version header, no deprecation policy. A field can change shape between two deployments. Read defensively and pin nothing.
SchemaThere is no OpenAPI documentand no JSON Schema anywhere in the repository. Every shape documented here was read out of a route handler, which is why each record names the line.
Errors{"error": "..."}a human-readable string, occasionally with a second key. There are no error codes and no stable error strings - match on the HTTP status, never on the message.
Cachingcache-control: no-storeon every route of all four services, without exception. Nothing here is safe to cache, and nothing offers you an ETag to revalidate against.
Content typeJSONwith two exceptions: the explorer's logo route returns raw image bytes, and its live route is an event stream.
Unitsnot uniformtoken amounts and wei are DECIMAL STRINGS, not numbers, because they do not survive a double. Mini-block timestamps are in MICROSECONDS. Concentrated-pool swap amounts are SIGNED.

Beträge sind Strings, und manche davon sind vorzeichenbehaftet

Token-Beträge, Wei und Guthaben kommen durchgehend als dezimale STRINGS zurück, weil sie ein Double nicht überleben. Parsen Sie sie mit einem Big-Integer-Typ. Auf den Routen der konzentrierten Pools sind die Beträge zudem vorzeichenbehaftet - ein Bein jedes Swaps ist negativ, und das sagt, in welche Richtung der Handel ging -, eine Summe ohne Absolutwerte rechnet also einen ganzen Markt auf null.

javascript
// The shape of a careful call against any of these: a timeout, a status check
// before the body, and a big-integer parse of anything that looks like money.
const res = await fetch(`${BASE}/pools`, { signal: AbortSignal.timeout(5000) });
if (!res.ok) throw new Error(`pools: ${res.status}`);          // never the message
const { pools } = await res.json();                              // an object, not an array
const reserve0 = BigInt(pools[0].reserve0);                      // a decimal string

Wenn einer ausfällt

Jeder der vier scheitert anders, und nur einer dieser Fehlschläge sieht von außen wie ein Fehlschlag aus.

  • Die DEX-API antwortet 503 index not ready, wenn die Datenbank nicht erreichbar ist oder der Indexer nie gelaufen ist, die Tabellen also nicht existieren. Das ist der ehrliche Fall. Der unehrliche ist ein Indexer, der ANGEHALTEN hat: Jede Route antwortet weiter mit dem Stand, den sie erreicht hat, und nur lagBlocks auf /health sagt es.
  • Der Explorer liefert den Index weiter aus, wenn der Node nicht erreichbar ist, und die Teile einer Antwort, die einen Live-Lesezugriff brauchen - ein Guthaben, ein Eintrag im Namensdienst, das ausstehende Guthaben des Gebühren-Routers -, kommen als null oder gar nicht zurück, statt einen Fehler zu melden. Das Feld indexLag auf /stats ist die Zahl, die es zu beobachten gilt.
  • Der Faucet antwortet 502, wenn der Node nicht antwortet, und es wurde nichts signiert. Eine 503 heißt, ihm fehlen die Mittel, oder der Drip hat revertet.
  • Die /ready der Arcade antwortet 503, wenn ihr Socket zum Node unten ist, oder wenn der letzte Mini-Block, den sie ANGEWANDT hat, älter als fünf Sekunden ist. Stattdessen die Ankunft zu messen ließ einen verklemmten Prozess mit 200 antworten, während sich nichts bewegte.
Wiederholen Sie die Statusabfrage, nicht den Schreibvorgang

Nur der Faucet schreibt, und eine 502 von ihm heißt, dass nichts eingereicht wurde - diese eine ist gefahrlos zu wiederholen. Eine 503, nachdem die Transaktion hinausgegangen ist, ist es nicht: Der Drip kann gelandet sein, und die Reservierung der Quote wurde bereits zurückgerollt, fragen Sie also die Chain nach der Quittung, statt erneut zu senden.

Was anderswo dokumentiert ist

  • The node. Chain state, transactions, logs and subscriptions are JSON-RPC and are documented in this reference's own RPC pages, not here.
  • Contracts. What the pools, the faucet and the games actually do on chain - their functions, their events and their revert reasons - is the contract reference.
  • Prices. Several answers here carry a dollar figure or a price snapshot. Those fields come from a layer this page does not own; read its own reference for what the number means, how old it is and when it is absent.