Summary. Livepeer’s payment protocol already contains the machinery to let a
sender authorise other addresses to sign its tickets. It is present in the codebase
and switched off. Turning it on would let a gateway’s funds be held by a Safe or
any contract account, while a hot key does the per-second signing.
The symmetry, which is the whole argument.
LIP-118 established that an address can act on behalf of another — reward
calling delegated, bounded, revocable on chain. The orchestrator side of the
network got materially safer, because the key that performs the frequent action
stopped having to be the key that holds the stake.
The gateway side never got the same treatment. A gateway must keep a key online
to sign tickets many times a minute, and today that key is the sender — so the
key that has to be online is also the key holding the deposit and the reserve.
Remote signing helps and is worth doing. A signing machine that handles no media
has a far smaller attack surface. But it changes where the key runs, not what the
key controls. The online key still commands the balance. That is a property of the
protocol, not of anyone’s deployment, and it is the part that can be fixed here.
So: the same principle LIP-118 established, applied to the other half of the
protocol.
What already exists in the code. In pm/sigverifier.go there is an
ApprovedSigVerifier — it recovers the address from a ticket signature and, if it
does not match the sender, asks the broker whether that address is an approved
signer for the sender. The entire type is commented out. The live
DefaultSigVerifier does a plain ECDSA recover and requires the recovered address
to equal the sender. The Broker interface declares no ApproveSigners, and the
deployed TicketBroker ABI has no such function.
The design anticipated this. It was never finished.
What it unlocks.
Custody. A gateway’s deposit and reserve held by a Safe. Compromise of a
signing key then costs the tickets it can sign before removal — not the balance.
Rotation. A signer replaced by a transaction, rather than by moving funds to a new
sender and rebuilding the channel.
More than one operator. Several approved signers for one sender, so a gateway
survives an operator being unavailable without anybody sharing a key.
Collectives. A Safe with two or more owners funding a gateway that neither owner
individually controls — two people sharing a broadcast’s cost, a venue and a
producer splitting a bill, a group funding a public service. Today every Livepeer
payment channel is owned by exactly one private key on one machine. That is a limit
on who can participate, not only on how safely.
There is a working precedent next door. Swarm’s Volume Registry separates
owner, payer and chunk signer as distinct on-chain roles: one party pays
for storage, a different party writes to it, neither can do the other’s job. I have
that running — a Safe owns and funds storage that a separate operator key writes to.
The shape is proven; Livepeer is missing only the approved-signer half.
Scope, as far as I can tell. Restoring ApprovedSigVerifier is roughly forty
lines that already exist. The contract side needs an approved-signer registry and
the Broker interface extended to read it. I am not close enough to the contracts
to estimate that half honestly, and would rather be corrected than guess.
A design question I cannot answer. Should approval be per-sender-per-signer, or
should a sender nominate a contract that decides? The second is more flexible and
much more to review.
What I can contribute. I run a gateway that pays orchestrators directly from one
key, and I have the Safe-and-delegated-writer half working on the storage side. I am
happy to test, to write the client half, or to be told this is the wrong shape and
why.