There’s a lot of words here and I’m not sure I understand, so I’m just gonna say things:
Reverse resolution {addr}.addr.reverse is just address → name.
I see no purpose in having anything more complicated than this, so I’m against the current subdomain → resolver = PR → PR.setName() setup simply for gas and complexity.
For example, do we really need this? raffy.51050ec063d393217b436747617ad1c2285aeeee.addr.reverse
Note: I think there’s value in having EoA-claimable nodes in the registry, but they’re massive overkill for what reverse names do for 99.99999% of use-cases.
The fact that contracts aren’t widely named in 2024 is also odd to me.
A much simpler registry would just store reverse-key (node or address) → resolver address outside of the ENS tree — aka 1 slot on-chain. This registry would only be editable through DAO approved registrars using different proving mechanisms. These should be trustless and irrevocable.
*.addr.reverse (or *.reverse) can be wildcard, and it consults this simplified registry, and forwards the request to the resolver set for that address.
-
There should be a simple storage contract
L(literal) that storesreverse-key→name (string)and any EOA who wants string-based on-chain names can use that. -
There should be another contract
W(wrapper) that has a mapreverse-key→nodewhich converts your reverse address namehash to a wrapped namehash, and then just callsnames(), eliminating the need to store a name because it’s already stored on-chain. -
If you want a different proving mechanism, deploy another contract (eg. signature, contract ownership, etc.). For example, why can’t contracts just be asked for their own primary? For example, if a contract sets their
reverse-key→F(contract forward),Fcan be a contract that simply callsC.primaryName()when it’s asked toF.resolve(C.addr.reverse, name()). -
If you set your
reverse-key→custom resolver, then that contract can do whatever, and go off-chain.
If we’re considering using CCIP for reverse resolution, which requires client changes, we should use a solution like this, as it gives maximum control to the owner and minimizes gas.
Some examples:
-
If I have 100 EoAs, I should be able to deploy a contract
Qthat answersresolve(*.reverse.addr, name())for any of those 100 addresses, and responds"raffy.eth". And then for each of those 100 EoAs, setreverse key→Q. I should also be able to provide some kind of delegated signature, so I can do this in 1 transaction. -
If I deploy a new contract, I should be able implement a function
primaryName() returns (string)that is my primary name. During the constructor, I claim that name by finding that registrar by name, and then calling claim() on it. That should cost almost nothing (eg. setresolver key→F(forwarding contract above). -
For virtual names of basename B, EoAs should be able to set
reverse-key→Band then that wildcard contract (likely off-chain) can provide the primary.
Additionally, name(node) could be generalized to name(node, chain).
A related idea from Expanding Beyond Mainnet was having a special coinType which indicates universal EVM deployment address (maybe 0x8000003c, evm bit + 60).