-
Notifications
You must be signed in to change notification settings - Fork 445
docs(antisquat): design document for anti-squatting system #5074
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Conversation
This design document proposes p/gnoland/antisquat, a pluggable library to prevent username squatting through: - Rate limiting (3 registrations per address per 30 days) - Protected names (DAO-managed reserved names list) - Length-based pricing (shorter names cost more) - Vickrey sealed-bid auction for premium names (Phase 2) Addresses gnolang#2727
🛠 PR Checks Summary🔴 Changes to 'docs' folder must be reviewed/authored by at least one devrel and one tech-staff Manual Checks (for Reviewers):
Read More🤖 This bot helps streamline PR reviews by verifying automated checks and providing guidance for contributors and reviewers. ✅ Automated Checks (for Contributors):🟢 Maintainers must be able to edit this pull request (more info) ☑️ Contributor Actions:
☑️ Reviewer Actions:
📚 Resources:Debug
|
notJoon
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think the current design is in a complete form. The rationale for why this structure was chosen is missing, and from an operational perspective, the content still appears to be lacking. I believe we can only discuss the overall design validity after these areas have been addressed in the document.
| {4, 4, 10_000_000_000}, // 10 GNOT | ||
| {5, 5, 5_000_000_000}, // 5 GNOT | ||
| {6, 7, 2_000_000_000}, // 2 GNOT | ||
| {8, -1, 1_000_000_000}, // 1 GNOT (default) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
1 gnot is 1,000,000 ugnot. This pricing policy has been set incorrectly. please refer to this link
| Timestamp time.Time | ||
| } | ||
|
|
||
| func (rl *rateLimiter) CanRegister(addr address, now time.Time) bool { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
CanRegister iterates through the entire record every time, and since the cost increases as the record length per address grows, this does not appear to be an efficient implementation.
| Timestamp: now, | ||
| }) | ||
| // Prune expired records | ||
| rl.pruneOldRecords(history, now) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It appears that the prune logic only runs when RecordRegistration is called. If there are accounts that are called infrequently, old records may continue to accumulate.
if those accounts are no longer doing anything new, it probably doesn't matter much. Is there a specific reason for designing the state management this way?
| systemNames := []string{ | ||
| "gno", "gnoland", "gnolang", "admin", "root", "system", | ||
| "official", "support", "api", "www", | ||
| } | ||
| for _, name := range systemNames { | ||
| addProtectedInternal(name, CategorySystem, "system reserved") | ||
| } | ||
|
|
||
| govNames := []string{"dao", "govdao", "governance", "voting", "treasury"} | ||
| for _, name := range govNames { | ||
| addProtectedInternal(name, CategoryGovernance, "governance reserved") | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
systemName and govNames are fixed right after the deployment. Is there a way to update it if there are new names that need to be protected later?
| - **Front-running prevention:** Bids hidden until reveal | ||
| - **Commitment binding:** Hash includes bidder address | ||
| - **Deposit requirement:** Must lock funds >= bid | ||
| - **Griefing mitigation:** Non-revealers just lose opportunity |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
we could consider economic penalties such as partial deposit burning, rather than losing opportunity. How about adding this as an open question as well?
| req := antisquat.RegistrationRequest{ | ||
| Name: username, | ||
| Caller: runtime.PreviousRealm().Address(), | ||
| Payment: banker.OriginSend().AmountOf("ugnot"), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
it seems that the flow involves receiving a payment first, then checking whether the amount is sufficient in Validate.
I don't see any details in the documentation about who owns and handles the fees. Is there a direction or policy you have in mind for this?
Addresses reviewer feedback from @notJoon requesting: - Design Rationale section explaining WHY this approach was chosen - Operational Considerations covering deployment, monitoring, failure scenarios Changes: - Section 4: Design Rationale (multi-layer approach, ENS pricing model, Vickrey auction, pluggable design, GovDAO integration) - Section 15: Operational Considerations (deployment strategy, monitoring, failure scenarios, upgrade path, performance, incident response) - Renumbered all subsequent sections
Summary
Design document for
p/gnoland/antisquat, a pluggable anti-squatting library for gno.land namespaces.Addresses #2727
Proposed Mechanisms
Key Design Decisions
p/) - Can be imported by any realm, not justr/sys/usersDocument Contents
Open Questions (feedback welcome)
p/gnoland/protectednames?Looking forward to feedback before starting implementation.
Related: #2827, #3020