Sign in

The admission demonstration. Sign in to this site with a PCOC you made, through groundinglab’s Admission Gate.

The floor

This gate's settings are groundinglab's admission policy (gl-admit-v12), not part of the specification: a testing pace of at least 0.1 legs/s (one leg every 10 s on average), at least 6 of 16 waypoints anchored, and no tip-versus-last-beacon submission deadline. A check that could not read Bitcoin's record is retried every 10 minutes. Other gates can set their own. Why we chose these numbers.

Why?

Checking is cheap for the gate. Making is not cheap for a crowd: each PCOC is a fresh hike. How that holds at scale is an open question, set out in What does a PCOC cost at scale?.

For developers

What happens when you press Continue

  1. Mint. This page draws a 32-byte nonce and sets exp to the page clock, in whole seconds, plus 120. It shows them as one link, both as the QR and as the code to paste.
  2. Scan. The PCOC app reads the link and shows https://groundinglab.io, the origin it is signing for. Install the demo APK from Demo if the phone does not have the app yet.
  3. Sign. The app chooses its PCOC and signs the challenge.
  4. POST. The phone posts one JSON object, once, to POST https://admission.groundinglab.io/v1/sign-in. It does not post the scanned link.
  5. Check. The Gate checks the object's recorded making against the public index and applies its admission policy. It measures the recorded making; it doesn't see what the maker spent. It publishes every decision in its public log.
  6. Poll. This page reads GET /v1/sign-in/result/ with the nonce and shows the progress.
  7. Result. When the phone has submitted, Welcome opens and you are signed in. The thorough check finishes in the background. If it does not finish, or the gate rejects or revokes the key, that sign-in is cleared. A refusal before submit shows a short reason here.

On the wire

link   https://groundinglab.io/sign-in/?v=1&nonce=…&exp=…
       (v stays 1; nonce and exp in that order; no other parameter; the link does not name the door)
POST   https://admission.groundinglab.io/v1/sign-in
       { origin, nonce, exp, object, object_b64, signature }
GET    /v1/sign-in/result/{nonce}

New code, and expiry, draw another nonce. The full wire is in Sign-in wire.

Gate https://admission.groundinglab.io

The line by the code says what the gate decided. The result below keeps the gate's outcome token from section 15.1 of the SPEC. A consumed pending result (submitted) stores a short browser session, for five minutes, and opens /welcome/. That sign-in stands only if thorough accepts. If the result is still pending when the gate's catch budget (about 22 seconds) runs out, or the result is rejected or revoke, the session is cleared. accepted replaces that session with the thorough one. A later refusal clears it, including a ban already in the public log for that key. The Gate does not create that session. Sign out is on that page and clears only the session. An unfinished wait before the phone submits stays progress. A token this page does not know is a refusal, not an unfinished wait.

Progress

    Result

    This page has no session.

    The code appears after you press the button.

    
            

    The Admission Gate, on your own service

    The Gate is a component you can run yourself: services/admission-gate. It verifies a presented PCOC and applies your policy. You set the floor.

    The Gate is evaluator-only and client-agnostic. It answers the sign-in POST and publishes its log. It never calls your site back. Your site owns the challenge, the session and polling for the result.

    Its use is screening: refusing bulk synthetic sign-ups and floods cheaply, before they reach your service, without a list or an issuer. To add a button like this one, or run a gate, see Technical and integrating PCOC.

    New to this? Step-by-step guides

    Make a PCOC on a computer with the desktop guide. Sign in from the phone with the phone guide.