You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The gateway sends alice.42 to the contracts. DotnsPopController._reserveLite strips the dot and stores alice42. Everyone else keeps the dot: People Chain stores alice.42, the pallet keys LiteLabelOwner by alice.42, and dotli and the host expect alice.42. The contracts are the only place that drops it, so the host has to rebuild the dot and guess whether a name is a person or a subname.
We want the contracts to keep the dot: store, mint, and show the name as alice.42.
#273 does this by changing what counts as a valid name. It treats alice.42 as the subname alice under 42, stops anyone registering an ordinary name that ends in two digits (for example longnamebob01), reserves every two-digit name to governance, and needs a fresh deployment. That changes the public names everyone uses to fix a PoP display problem. This issue proposes a smaller change that leaves public names alone.
Proposal
alice.42 means two different things. To PoP it is one person: they picked alice, the gateway added 42, and nobody owns 42. To dotns names it looks like a subname, alice under 42, the same shape as shop under google in shop.google. You cannot tell which one it is just by reading the string.
Provenance is the missing piece, and it belongs to the issuer. The PoP controller minted the name, so it is the one that knows the name is a person. It exposes a permanent isPopIssued(label), where label is the bare name without the TLD, for example alice.42, set once at mint and never cleared. Keying on the label, not the node, means a reader that holds only the string can ask directly, without first deciding how to hash the dot, which is the very thing it is trying to learn. Ownership and transfer rules live in the registrar, not the controller, so a name later becoming transferable does not change whether the controller issued it. That is why the signal is a query to the issuer and not the soulbound flag, which is a transfer rule and could change.
Mint alice.42 as one whole label, hashing the full string, not as alice under 42. Its id can then never clash with a real subname, and because ordinary names cannot contain a dot, only the PoP gateway can ever create a dotted name. This exclusivity rests on the subname path keeping its no-dot rule: DotnsRegistry.setSubnodeOwner and setSubnodeResolver already require isSingleLabel, which rejects dots, so a subname label can never equal a dotted name. That check must not be loosened.
dotli, the host, and the subname path ask the controller when they read a name. Issued by the gateway: show and resolve it whole, as the person alice.42. Not issued: the dot is a subname separator, as in shop.google. The host drops the code that rebuilds the dot today.
Every place the contracts recompute a name's id from its text (reverse resolver, cold-path settlement, lens) uses the dotted text, so the id always matches.
The two digits mean the "parent" 42 is a two-character name, which is already governance-only, so nothing new needs reserving.
No change to what counts as a valid public name, and no redeployment of the public path. The only new state is a single per-name flag on the PoP controller.
Acceptance criteria
A lite name reserved through the gateway is stored, minted, and shown as stem.NN, including one stashed on the cold path and settled later.
Only a canonical stem, one dot, and exactly two digits is accepted as a lite label on the gateway path.
Ordinary names are unaffected: a flat name ending in two digits, such as longnamebob01, is still registrable.
No two-digit second-level name is reserved beyond what governance already reserves.
The PoP controller exposes a permanent isPopIssued(label), keyed by the bare label without the TLD (for example alice.42), set at mint and never cleared, and it is the only signal used to tell a person from a subname. It stays correct if a name later becomes transferable, because provenance lives with the issuer, not with the transfer rule.
dotli, the host, and the subname path read a gateway-issued dotted name as a whole name, and the host no longer rebuilds the dot.
A subname whose label contains a dot is rejected (setSubnodeOwner and setSubnodeResolver revert InvalidLabel), so the dotted-label space stays exclusive to the PoP path and no subname node can equal a PoP node. Tested both ways: a dotted subname label reverts, and a subname built under a governance-owned two-digit name lands on its own node, not the person's.
Every place the contracts recompute an id from a name uses the dotted text, and reverse resolution round-trips.
Component
Proof of Personhood
Priority
P0
Summary
The gateway sends
alice.42to the contracts.DotnsPopController._reserveLitestrips the dot and storesalice42. Everyone else keeps the dot: People Chain storesalice.42, the pallet keysLiteLabelOwnerbyalice.42, and dotli and the host expectalice.42. The contracts are the only place that drops it, so the host has to rebuild the dot and guess whether a name is a person or a subname.We want the contracts to keep the dot: store, mint, and show the name as
alice.42.#273 does this by changing what counts as a valid name. It treats
alice.42as the subnamealiceunder42, stops anyone registering an ordinary name that ends in two digits (for examplelongnamebob01), reserves every two-digit name to governance, and needs a fresh deployment. That changes the public names everyone uses to fix a PoP display problem. This issue proposes a smaller change that leaves public names alone.Proposal
alice.42means two different things. To PoP it is one person: they pickedalice, the gateway added42, and nobody owns42. To dotns names it looks like a subname,aliceunder42, the same shape asshopundergoogleinshop.google. You cannot tell which one it is just by reading the string.Provenance is the missing piece, and it belongs to the issuer. The PoP controller minted the name, so it is the one that knows the name is a person. It exposes a permanent
isPopIssued(label), wherelabelis the bare name without the TLD, for examplealice.42, set once at mint and never cleared. Keying on the label, not the node, means a reader that holds only the string can ask directly, without first deciding how to hash the dot, which is the very thing it is trying to learn. Ownership and transfer rules live in the registrar, not the controller, so a name later becoming transferable does not change whether the controller issued it. That is why the signal is a query to the issuer and not the soulbound flag, which is a transfer rule and could change.alice.42as one whole label, hashing the full string, not asaliceunder42. Its id can then never clash with a real subname, and because ordinary names cannot contain a dot, only the PoP gateway can ever create a dotted name. This exclusivity rests on the subname path keeping its no-dot rule:DotnsRegistry.setSubnodeOwnerandsetSubnodeResolveralready requireisSingleLabel, which rejects dots, so a subname label can never equal a dotted name. That check must not be loosened.alice.42. Not issued: the dot is a subname separator, as inshop.google. The host drops the code that rebuilds the dot today.42is a two-character name, which is already governance-only, so nothing new needs reserving.No change to what counts as a valid public name, and no redeployment of the public path. The only new state is a single per-name flag on the PoP controller.
Acceptance criteria
stem.NN, including one stashed on the cold path and settled later.longnamebob01, is still registrable.isPopIssued(label), keyed by the bare label without the TLD (for examplealice.42), set at mint and never cleared, and it is the only signal used to tell a person from a subname. It stays correct if a name later becomes transferable, because provenance lives with the issuer, not with the transfer rule.setSubnodeOwnerandsetSubnodeResolverrevertInvalidLabel), so the dotted-label space stays exclusive to the PoP path and no subname node can equal a PoP node. Tested both ways: a dotted subname label reverts, and a subname built under a governance-owned two-digit name lands on its own node, not the person's.