Bankhaus

Hidden recipient

Get paid without the chain knowing it was you.

Until now the chain could not read how much you were paid, but it could see that you were paid. This fixes that. You publish one public address once. From then on, every payment to you lands in a brand-new account that nobody can link to you: the chain only sees money going to an address it has never seen before. Your key is the only one that can tell which of those accounts are yours, read them, and spend them.

  • A fresh account for every payment, made by the payer from your public address and a random number
  • Nobody else can tell those accounts are yours: not the payer's other payments, not the chain, not an observer
  • You find them by scanning with your key, then spend from them like any other account
how it works · in one screen

1 bob, once publishes a public address

2 gwen pays makes a brand-new account from it and a random number

pays that account, sealed, as usual

3 the chain sees gwen paid an address with no past

cannot tell it is bob's

4 bob, later scans with his key, finds it, reads it, spends it

under the hood: a shared secret from bob's public address and gwen's random number gives both a fresh account and a fresh view key

no name on chainfresh account per paymentonly your key finds them

Try one

Pay bob without naming him.

bob published his public address once. Each payment to him lands in a brand-new account: the ledger shows an address it has never seen, and no name. Then switch to bob's side: his key finds the accounts that are his and reads them. gwen's key finds none.

  • A fresh account for every payment, nothing on the ledger links it to bob
  • bob finds his accounts by scanning with his key
  • Anyone else scanning finds nothing
what the chain sees

Pay bob, hidden and the ledger rows appear here: an announcement with an ephemeral point and a one-byte tag, then a transfer to an address with no handle.

Who learns what

01

The chain

That gwen paid some address, and four curve points. Not who got it, not how much. Five payments to bob look like payments to five strangers.

02

The recipient

Everything: which accounts are theirs, what each holds, and the keys to spend from them. Spending from one of them is a normal sealed transfer.

03

The payer

The address they paid and the figure. They can write a letter for it like any other transfer; the letter names the address, never bob.

On chain

PosteRestante.setMeta(spendX, spendParity, viewX, viewParity)      // once
PosteRestante.announce(oneTime, ephemeralX, parity, viewTag, pkX, pkY)
  → ConfidentialToken.registerFor(oneTime, pk)   // only the counter may
ConfidentialToken.confidentialTransfer(oneTime, Δs, Δr, proof)       // as usual

// a real owner's register() always replaces a key that came through the counter

From the terminal or an agent

bankhaus poste publish                 # your public address, from your view key
bankhaus send bob 80 --poste           # pay bob under a fresh account
bankhaus collect                       # find what is yours, read it, get the keys
send_poste · collect_poste             # the same two in bankhaus-mcp

One honest limit: when you spend from one of these accounts, the chain links it to wherever the money goes next. Spend to payees directly, or over several paths; sweeping everything to your main handle undoes the point.