Proof of Location

Proof of Location records witness-attested evidence for a location claim: operators time a network round trip to the device and sign what they measured, and a commitment to a coarse cell of the claim is recorded on Ethereum Sepolia testnet.

What is proof of location?

Location claims are easy to fake. GPS coordinates are self-reported by the device, and GPS itself can be spoofed with commodity hardware. Any workflow that pays, credits, or authorizes based on "I was there" needs evidence from someone other than the device.

Proof of location systems make a claim checkable: parties other than the device measure something about it, such as network timing, sign what they measured, and package that evidence so a third party can check it later. How strong the evidence is depends on what is measured and who the witnesses are.

Privacy comes from keeping the claim coarse. What goes on-chain is a commitment and a geohash cell of about 5 km with its time, not a trajectory, and the commitment does not name the user. The cell and time are public and permanent, so get informed consent before submitting.

Diagram: a phone submits a location claim. Offline Protocol's backend commits a coarse geohash cell to a contract on Ethereum Sepolia testnet, a witness operator times a network round trip to the phone and signs an EIP-191 attestation, and the app's backend verifies that attestation.

A claim, witnessed and checked: the backend records a commitment to a coarse cell and a time on Ethereum Sepolia testnet, a witness operator times a round trip to the phone and signs what it measured, and your backend verifies that attestation against its own policy.

How Offline Protocol implements it

Your app submits a claim with the user's OfflineID session, and witness operators measure and sign:

Round-trip witnesses

A witness operator measures the network round-trip time to the device and compares the distance it implies with the distance from its own location to the claim.

EIP-191 signed attestations

Each operator signs its own attestation binding the chain, contract, task, result, and time, and your backend verifies the signer and freshness.

A coarse claim on-chain

Only a commitment, a coarse geohash cell of about 5 km, and the task time are recorded, under a random ID per claim, so claims do not group by user.

Stated limits

It is evidence, not a zero-knowledge proof or proof of presence. Timing makes some false claims implausible; it does not prevent spoofing.

Testnet today: Offline Protocol controls the submitting key and the operator list, the default list has one witness, and slashing is not implemented. Read the Proof of Location docs.

What a result means, and what it does not

A Proof of Location result is narrower than a coordinate. A witness operator measures the round-trip time between itself and the device and compares the distance that timing implies with the distance from its own location to the claimed one. The implemented rule accepts a claim when the two distances differ by less than 20 km, or when the round trip is between 0.8 and 1.5 times the theoretical minimum for the claimed distance.

That makes some claims implausible, such as answering from another continent, but it does not prevent spoofing: a client can add delay, and the witness trusts the claim fields the client sends. A signature authenticates the witness's statement, not the truth of the location. It is not a zero-knowledge proof and not proof that a person was physically present. The claim is submitted with the user's OfflineID session.

Disclosure stays narrow: the chain records a commitment and a coarse cell with its time, and no service stores the submitted coordinates. For workflows like chain-of-custody in logistics, treat a result as one signal alongside your own checks.

Verifying a result

Offline Protocol's backend commits a geohash of the claim to an EigenLayer AVS contract on Ethereum Sepolia testnet. Each witness operator responds on-chain and returns its own EIP-191 attestation over a WebSocket. No step aggregates them into a final proof.

Your backend verifies each attestation against an approved signer, the expected chain and contract deployment, the task, and a freshness window. An API 200 or an indexer row is not a location proof.

Use it to evaluate location-evidence workflows, such as rewards for being at a place, region-scoped access, or presence at events, and not as the only control for attendance, payments, compliance, or geographic access. The architecture and security boundaries pages in the docs carry the details.

Trust boundaries today

Speed of light
Round-trip time is bounded by the speed of light, so a device claiming one city while answering from another can produce timing that does not fit. Adding delay can still make a farther claim fit.
Tolerance
The acceptance rule allows 20 km of difference, or a round trip of 0.8 to 1.5 times the theoretical minimum, so timing narrows a claim rather than pinning it.
Operators
Offline Protocol controls the submitting key and the operator list. The default list has one witness, and correlated or colluding witnesses are not independent evidence.
Slashing
Slashing is not implemented in the service workflow, and the contract upgrade that restricts task creation to the backend is pending.
Public data
The geohash, a cell of about 5 km, and each task's time are public and permanent on Ethereum Sepolia. Get informed consent before submitting.

Where it applies

Aid and field data
Location evidence for aid distribution and field data collection, alongside your own checks.
Autonomous missions
Witness-signed records for autonomous missions, as one signal next to onboard logs.
Sites
Evidence for attendance workflows at real-world events, not the only check.
What it builds on
OfflineID sign-in, and the @offline-protocol/pol package or the raw API.

Proof of Location FAQ

How does Proof of Location work?

Your app submits a location claim through @offline-protocol/pol with the user's OfflineID session. Offline Protocol's backend commits a coarse geohash of the claim to an EigenLayer AVS contract on Ethereum Sepolia testnet, and each witness operator times a network round trip to the device, compares it with the claimed distance, responds on-chain, and returns a signed attestation your backend can verify.

Is it a zero-knowledge proof or proof of presence?

No. It is witness-attested location evidence. It is not a zero-knowledge proof, a decentralized consensus result, or proof that a person is physically present. Use it to evaluate location-evidence workflows, not as the only control for attendance, payments, compliance, or geographic access.

How is this different from GPS alone?

A GPS fix is self-reported. A witness attestation adds a measurement signed with a key the claimant does not control: the round trip has to fit the claimed distance, so claims the speed of light rules out fail. It does not prevent spoofing. A client can add delay to make a farther claim fit, and the witness trusts the claim fields the client sends.

Can witnesses collude to fake a location?

Nothing in the current service prevents it. Offline Protocol controls the operator list, the default list has one witness, slashing is not implemented, and correlated or colluding witnesses do not provide independent evidence. Decide which signers, and how many attestations, a workflow requires.

What does the verifier learn?

A commitment and a coarse geohash cell of about 5 km with its time, recorded publicly and permanently on Ethereum Sepolia testnet. The coordinates go to the backend and the witness for the check, and no service stores them. No trajectory is submitted.

Is this available today?

Yes, on Ethereum Sepolia testnet, not mainnet. Enable Proof of Location for an app in the developer portal and install @offline-protocol/pol from npm. Every plan includes verifications, 250 on Free, 2,500 on Pro, and 10,000 on Scale, and each additional verification is $0.03.

What keeps witnesses honest?

Signatures and a public record, not slashing. Each operator signs its own result and responds on-chain, so its statements are attributable, and the commitment is public on Ethereum Sepolia. Offline Protocol decides which operators clients are routed to. Slashing is not implemented in the service workflow.

What does my backend check?

Each operator's EIP-191 attestation against an approved signer, the expected chain and contract deployment, the task, and a freshness window, matched to the claim's commitment and transaction. An API 200, an indexer row, or an unverified WebSocket payload is not a location proof. Read the security boundaries in the docs.

Test location evidence with a coarse public record. Witness-signed, on Sepolia testnet.