Skälet till att de flesta platsbaserade kryptoidéer från 2020 dog i det tysta är att de litade på GPS. GPS är en utsänd signal som vilken mottagare som helst kan lyssna på, och en mottagare kan fås att ljuga om vad den hörde. Verktyg för det kostar ungefär trettio dollar på Amazon och har gjort det sedan 2015. Varje protokoll som betalar en plånbok för att stå på en koordinat, och verifierar det med enbart GPS, förlorar pengar till falska plånböcker som står i soffor. Det är varken en svår attack eller en smart.
Proof of location är lagret som löser det. Uttrycket används oftare än det definieras, så låt oss börja med en definition. Proof of location är ett påstående, som kan verifieras av någon som inte var närvarande, om att en viss enhet var på en viss koordinat inom ett visst tidsfönster. Det är ett påstående om närvaro, inte om koordinaten. Den skillnaden är där det mesta av ingenjörsarbetet finns.
Hotmodellen. Vi försvarar oss inte mot en stat; det extremfallet kommer i slutet. Vi försvarar oss mot den genomsnittlige angriparen med en telefon, en laptop och en eftermiddag. Den angriparen kan förfalska GPS med ett färdigt verktyg, köra appen i en emulator och skapa en plånbok med en kodrad. Varje enskild kontroll kan besegras av den angriparen. Målet är att kostnaden för att besegra dem alla tillsammans ska vara högre än belöningen vid dropen.
Den här texten beskriver vad Seek gör i dag, i klartext, och vad som är på väg. Den är medvetet kortare på marknadsföringen och längre på mekaniken.
Lager ett, vid fångsten: enhetsattestering. Varje fångstbegäran har ett signerat intyg från operativsystemet. På iOS är det Apple App Attest, på Android Google Play Integrity. Seek verifierar båda på serversidan. Attesteringen säger tre saker i en signatur: det här är en riktig enhet, appens binärfil har inte manipulerats, och anroparen har en nyckel som skapats på den här enheten för vårt paket. En rootad telefon misslyckas. En emulator misslyckas. En ompaketerad app som hoppade över platskontrollen misslyckas. Attestering bevisar inte var telefonen är; den bevisar att telefonen inte ljuger om att vara en telefon. Det är det som gör de andra signalerna värda att läsa.
Lager två, vid fångsten: avstånd med marginal. Klienten låter dig bara trycka på fångstknappen när du är inom spawnens insamlingsradie. Servern kontrollerar oberoende koordinaterna du skickade mot spawnens koordinater och godtar upp till sjuttiofem meters avstånd. Skillnaden mellan knappens radie och serverns radie är avsiktlig. GPS-brus på en telefon som lutar mot en vägg kan glida några meter av skäl som inte är ditt fel, och att neka fångster inom det bruset känns godtyckligt. Bortom sjuttiofem meter nekas begäran direkt, utan bedömning och utan överklagande i det lagret.
Lager två, fortsättning: hastighetsgränser och tak per spawn. Två insamlingsbegäranden med mindre än fem sekunders mellanrum får en 429 från en spärr som bygger på Postgres och som överlever mellan serverlösa isolat. En enskild spawn godtar högst två försök från samma konto, där det andra försöket är värt 65 procent av det första. Taken finns inte för att upptäcka bedrägerier; de finns så att en bot som redan besegrat de andra lagren inte kan utvinna mer från endpointen än en människa hinner spela.
Lager tre, vid fångsten: miljösignaler, registrerade men inte upprätthållna. Varje fångst har också flaggor: om begäran kom från en simulator, om Android rapporterade att positionen kom från en falsk platsleverantör, och den rapporterade GPS-noggrannheten i meter. De registreras och används aldrig för att neka själva fångsten. En klient som ljuger om dem är precis den klient du inte vill ska fatta beslutet, så beslutet fattas någon annanstans. De spelar roll i lager fyra.
Lager fyra, vid utbetalningen: bedrägerispärren. Uttag går via en serverfunktion som läser kontots fångster de senaste nittio dagarna. Om någon av dem kom från en simulator, eller Android rapporterade en falsk leverantör, eller kontot gjorde två lyckade fångster med mindre än tio sekunders mellanrum, eller kontot förflyttade sig mellan två fångstkoordinater snabbare än en människa kan resa, eller ett annat konto har gjort uttag från samma enhetsfingeravtryck, skickas uttaget till manuell granskning i stället för att godkännas automatiskt. Användaren får inte veta vilken tråd som löste ut, och kontot fortsätter spela som vanligt. Upptäckten är ett affärsbeslut om utbetalningar, inte ett straff.
Skälet till att dela upp fångst och utbetalning är att de försvarar olika saker. Fångstlagret försvarar spelet. Om fångsten var bedräglig blir den spelvaluta som aldrig lämnar appen, vilket inte kostar något. Utbetalningslagret försvarar riktiga pengar. Varje dollar som lämnar systemet går igenom granskningen av de nittio dagar som ledde fram till saldot, och en enda misstänkt signal i det fönstret räcker för att lämna beslutet till en människa. De två lagren tillsammans innebär att en ärlig spelare aldrig märker friktion i fångstögonblicket, och att en angripare som smugglade igenom en dålig fångst aldrig ser pengarna.
Lager fem, vid fångsten: rörelsespår. Varje telefon har en accelerometer och ett gyroskop på samma chip som pratar med GPS. Seek registrerar nu ett kort fönster av rörelse under sekunderna före en fångst, räknar ut en liten uppsättning statistik (variation i magnitud, rotationsaktivitet, antal stillastående bildrutor) och skickar sammanfattningen med insamlingsbegäran. En telefon som gick till en spawn har en rörelsesignatur som skiljer sig från en telefon som ligger på ett skrivbord med en GPS-simulator igång. Signaturen upprätthålls inte i fångstlagret i dag, av samma skäl som miljöflaggorna inte gör det: en patchad klient kan ljuga. Den går in i bedrägerispärren för nittio dagar tillsammans med signalerna om simulator och falsk leverantör, och ett platt rörelsespår i registret är ytterligare en tråd som lämnar ett uttag till manuell granskning.
Ett genomräknat exempel. En testare kör en GPS-förfalskare, sätter koordinaten till en Seek-drop på andra sidan stan och trycker på fånga. Avståndskontrollen går igenom eftersom den förfalskade koordinaten stämmer. Attesteringen går igenom eftersom appen är omodifierad. Fångsten registreras. Två timmar senare gör samma testare tre fångster till, varav en från en annan koordinat tio kilometer bort. Rörelsespåret på alla fyra är platt (telefonen rörde sig aldrig), och kontrollen av omöjlig förflyttning löser ut på de två koordinaterna som inte kunde nås till fots på två timmar. Kontot fortsätter spela, fortsätter samla och vet inte om att något är fel. När testaren begär en utbetalning hamnar den på ett granskningsbord med flaggan för omöjlig förflyttning och det platta rörelsespåret bifogade. Granskaren nekar. Testarens fyrtio dollar i insamlat saldo blir aldrig värda något utanför appen.
Den ekonomiska ramen. Det som spelar roll är inte att det är omöjligt att förfalska själva fångsten; det är att utbetalningsspärren läser tillbaka genom allt kontot gjorde för att nå saldot. En drop värd två euro som skyddas av attestering och avstånd är billig att attackera en gång och meningslös att attackera upprepade gånger, eftersom uttagskontrollen fångar mönstret innan mönstret blir pengar. En drop värd tiotusen euro behöver en starkare ram i fångstlagret, och det är vad roadmapen nedan handlar om.
Vad som finns på roadmapen. Beacon-reserv för drops inomhus är nästa kontroll som kommer. För en spawn placerad inne i en byggnad där GPS är meningslös låter en liten Bluetooth-beacon registrerad för dropen appen bevisa närvaro utan att alls förlita sig på satellitpositionen. Upprätthållande av attestering är det andra spåret: i dag loggas begäranden utan attestering men godtas fortfarande, så att vi kan mäta andelen felaktiga nekanden mot legitima enheter innan vi slår om brytaren och nekar dem direkt. Båda kommer som små, tråkiga och verifierbara tillägg till samma mönster för fångst och utbetalning som redan används.
Vad som fortfarande inte fungerar bra. GPS inomhus slår fel med tio till femton meter i ett köpcentrum, och ingen smarthet på serversidan löser det; en beacon är det verkliga svaret, och därför finns den på roadmapen. Latens under en sekund finns inte och kommer förmodligen inte att finnas, eftersom bedrägerispärren läser historik snarare än en enda begäran. Wearables har färre sensorer än telefoner, så en design för proof of location anpassad för telefoner går inte att föra över rakt av till glasögon. Och en stat med en lastbil full av radioutrustning kan besegra vilken verifierare för mobiltelefoner som helst i dag; varje protokoll som påstår något annat är inte ärligt mot dig. Det tänker inte vårt vara.
Designprincipen värd att säga högt. En verifierare bör vara ärlig om vad den kan och inte kan bevisa. Att presentera en sannolikhetspoäng som ett absolut ja eller nej är värre än att presentera ett absolut ja eller nej utifrån strikta regler, eftersom en poäng skapar ett reglage, och varje reglage skjuts mot att godta fler anspråk när engagemangsmålen släpar efter. Vårt fångstlager har inget reglage. Det klarar kontrollerna eller inte. Bedrägerilagret har ett reglage, och det reglaget ligger hos en människa, inte i koden.
Det här är delen under Seek som gör förankrade tillgångar och platsverifierade airdrops värda att göra. En publicist placerar en token värd riktiga pengar på en koordinat eftersom den som till slut får den var på den koordinaten med en attesterad enhet, och eftersom utbetalningsspärren läser tillbaka genom kontots historik innan pengarna rör sig. Whitepapret har den fullständiga specifikationen. Den här texten är versionen i klartext av vad som händer inne i appen.
Kort sagt. Närvaro är inte en koordinat. En enda signal bevisar inte närvaro. Seek verifierar närvaro i två lager: attestering, avstånd och ett rörelsespår i fångstögonblicket, och en bedrägerispärr för nittio dagar i utbetalningsögonblicket. Det som fortfarande är öppet, beacon-reserv för drops inomhus, stänger det sista koordinatfallet som GPS ensam inte klarar. Det är vad proof of location faktiskt är inne i Seek i dag, och det är därför lagret betyder mer än någon av de mer iögonfallande sakerna det möjliggör.


