Relayer принимает ваш Groth16-proof и адрес получателя по HTTP, подписывает и публикует транзакцию вывода своим keypair-ом и платит SOL за gas. В обмен on-chain-программа перечисляет ему небольшую фиксированную комиссию (0,003 SOL на каждого получателя) из суммы вывода.
Так решается bootstrap-проблема. Действительно свежий кошелёк-получатель стартует с нулём SOL. Без relayer-а пользователю пришлось бы перечислить «на gas» немного SOL со своего исходного кошелька — и тем самым публично связать оба адреса on-chain и обнулить весь смысл использования SolMask. Relayer разрывает эту связь, потому что платит он сам.
Relayer-у мы доверяем только liveness, а не приватность. Он видит ваш proof и адрес получателя (иначе он не отправит транзакцию), но никогда не узнаёт, какой именно депозит ваш proof тратит, и не может цензурировать конкретную ноту, не цензурируя все выводы подряд. Кто не хочет полагаться на хостинговый relayer, может запустить свой — flow self-relay использует ту же инструкцию, указывая в качестве получателя комиссии собственный кошелёк пользователя.