Let’s think about when we use cash to pay for a coffee… what do I do? first, I open my wallet to get a $5 bill to pay for the coffee, then I realize I’m poor so I have no money in my wallet, then in a desperate move I check my pockets and I find an old bill (thank God ), I take the bill from my pocket, the cashier double-checks the bill (with all reasons), accepts it, and keeps the bill.
What did we do? Interact with each other, and if we want to emulate that, wouldn’t it be nice if could “establish the communication” with the cashier in the safest way possible?
Interactivity… well, what can I say about interactivity that hasn’t been said before? I personally have a mixed feeling when it comes to the Interactivity discussion… but if we agree on that one of the Grin’s purposes is to serve as digital cash, interactivity is actually a core characteristic of all transactions based on cash. So, for the sake of this experiment I’m going to assume that Grin is like Cash and then I’m going to (re)imagine the flow from a Receiver perspective.
How should receiving grin look like?
Grin uses Tor to establish a communication between Sender and Receiver, something like: Channel?Tunnel? Avenue? Route? Canal?
I will discard the word “Channel” since it can be confused with Payment Channels, which allow users to make multiple transactions without commiting all of the transactions to the blockchain. I personally like: Route, because we can say something like this then:
Grin uses Addresses to encrypt the transaction information and to establish a secure route via the Tor network, where Sender and Receiver can anonymously communicate with each other.
And let’s be honest, that’s a really cool feature! With that in mind I can make the next assumptions:
- Addresses could be disposable.
- Reusing an address should be the exception, not the rule.
- Sometimes I would like to be able to run several “listeners” or “encrypted routes” or addresses at the same time.
It doesn’t make sense not to generate a new address every time I receive some grin, but I get if you don’t want to. We could even generate a new one after every send, but it would be a big mess. We want to provide users with flexibility without making things confusing.
Now we can think in these terms: Disposable addresses and Reusable addresses.
Disposable means that I can not use that address anymore after completing the receiving process because it is a one-time use address. Reusable means that I can use this address at any moment. For example, If I’m mining in two different pools, I can create two addresses, one for one pool and another one for another pool and I could start an encrypted route for each address at the same time.
But, we also want, one, to keep the compatibility for current users, and second, we want to keep things simple for those who don’t care about these things. In this case we can have a Default address, this address is always listening by default, and then it can be replaced manually by a new one.
“Ok, David, but what about the Dust?” you might ask; Jameson Lopp recently wrote an article explaining the Bitcoin Dust Attack, I will cite him for the sake of giving context.
What Is Dust?
Bitcoin dust refers to UTXOs with tiny values that are so small that they are economically unspendable. That is, it costs more (in transaction fees) to spend than the value of the UTXOs. It’s possible to end up with dust in your wallet due to poor UTXO management. It’s also possible to receive dust deposits that you did not request. This is because you can’t stop someone from sending funds to a valid bitcoin address and every bitcoin address that has ever received funds is publicly viewable on the blockchain.
He also said that “while it’s technically possible it’s incredibly unlikely.”, I also believe that but anyways we can solve this in Grin by:
- Manually deactivating a listener and generating a new address.
- Disabling the “auto finalize” behavior.
- Rejecting transactions below an amount.
This can be also solved in a non-interactive scheme, but the point that I would like to make is that it can also be easily solved with the interactivity.
Do we want wallets to automatically generate a hierarchical tree-like structure of private/public key pairs? Probably, yes.
Do we need on-chain bookkeeping? I’m not sure what pains we are solving with that.
Do we want all enabled addresses to be listening automatically? I don’t think so.
Do we want any of our wallet to be automatically on? I’m not sure, maybe I just want to transact off-line.
I feel it worth experimenting with this. I think about this as an opt-in feature, people are not forced to make use of these capabilities but they could at any moment.
Screens
Initially the screen could look like this
One could manage the have extra addresses like this.