Single-Server PIR with Sublinear Online Time via Invertible PRFs
Key Innovation: Plinko achieves O(1) hint updates after database changes using
invertible PRFs (iPRFs). The client can find all affected hints in constant time without scanning.
1. Protocol Overview
Plinko is a Private Information Retrieval (PIR) scheme that allows a client to query a database
without revealing which entry they're accessing.
Key Components
Component
Purpose
Complexity
HintInit
Offline preprocessing - stream database to compute hints
O(n)
Query/Answer
Single query round trip
O(n/w)
UpdateHint
Update hints after database change
O(1)
Parameters
n = database size (bits)
w = block size
c = n/w (number of blocks)
lambda = security parameter
2. PMNS: Pseudorandom Multinomial Sampler
Named after the Plinko game! Simulates throwing n balls into m bins using a binary tree.
At each peg, the ball bounces left or right based on a PRF-derived probability.
Key Property: Both forward (ball -> bin) and inverse (bin -> balls)
operations run in O(log m) time by traversing the binary tree of pegs.
Balls Dropped
0
Last Bin
-
Distribution
-
Rows: 8
Algorithm: trace_ball (Forward)
deftrace_ball(x, n, m):
low, high = 0, m - 1# bin range
ball_count = n
while low < high: # descend tree
mid = (low + high) // 2
p = (mid - low + 1) / (high - low + 1) # left probability
Backup Hints (T): (B_j, l_j, r_j) - subset of c/2 blocks + two parities
Database Stream
Regular Hints (lambda*w slots)
Backup Hints (q slots)
HintInit Algorithm
# Generate keys and initialize hints
for i in1..c:
K[i] = iF.Gen(1^lambda)
for j in1..lambda*w:
H[j] = (random_subset(c/2+1), 0)
for j in1..q:
T[j] = (random_subset(c/2), 0, 0)
# Stream database entries
for i in0..n:
d = stream(D[i])
(block, offset) = (i / w, i mod w)
for j iniF.F^-1(K[block], offset): # O(1) hints!
if j < lambda*w:
if block in H[j].P:
H[j].parity ^= d
else:
if block in T[j].B:
T[j].parity_in ^= d
else:
T[j].parity_out ^= d
6. Complexity Summary
Operation
Time
Communication
Notes
HintInit
O(n)
O(n)
One-time offline, streaming
Query (client)
O(1)
O(c) = O(n/w)
Find hint via iPRF^-1
Answer (server)
O(n/w)
O(B)
Compute parities
UpdateHint
O(1)
O(log n)
iPRF^-1 finds affected hints
Client Storage
O(lambda*w + q) hints
Plus c iPRF keys
Why O(1) Updates Matter: Previous PIR schemes required O(n) or O(sqrt(n))
time to update hints after database changes. Plinko's iPRF inversion finds all O(1) affected
hints directly, making it practical for dynamic databases like Ethereum state.