Getting Subscriptions back up
TLDR: See the heading “Suggestion 2” - I have given a lot of options here to show that I’ve tried to think through this issue thoroughly and I think this Suggestion 2 - Independent Install Canister that the NNS can occasionally, rarely veto an upgrade, is the most secure, least complex and invasive solution.
See: NNS Controlled Subscription Utility
See: Regarding NNS controlling application canisters
I apologize for it taking so long for me to get back to this issue, but as I’m back to the point where I’d like to get the subscription canister back online so that people can use it, I’d like to attempt to find a solution to the default REJECT votes on NNS-controlled canisters that are not “protocol level” issue. As the conversation unfolds, I would like to highlight several points and potential solutions that might help us move forward.
1. Understanding DFINITY’s Position
The dilemma DFINITY faces was made clear by Diego back when this was announced:
-
If DFINITY Abstains on NNS canister install/upgrade proposals, a malicious canister could repeatedly submit code-upgrade proposals that remain unresolved until their expiration and effectively stall (or at least slow down) the network’s emergency capabilities needed for upgrading the NNS.
-
If DFINITY Auto-Accepts, then malicious code could inadvertently be installed under the NNS’s authority—a risk that would undermine trust in the network’s governance.
Because of these threats, DFINITY has decided to vote REJECT on canister upgrades unless they have personally reviewed and audited the code. However, DFINITY also emphasizes that they have limited resources and cannot feasibly audit every piece of code that might be proposed.…I’ll add the following that I’ve discovered through some conversations with folks at DFINITY…
-
If enough people don’t care about your canister and don’t govern it properly by following someone malicious, stupid, or ill-informed, or just disinterested or just not-voting, then the integrity of the NNS is brought down by successful attacks on NNS controlled Assets. This is bad for the network.
2. Why an SNS Isn’t Always a Viable Alternative
Some might suggest that developers should simply use the SNS to launch and govern their canisters rather than relying on the NNS. However, there are several reasons why an SNS may not be ideal for utilities or “protocol support” canisters:
- Lack of a Sustainable Revenue Model
- An SNS is effectively its own DAO with a governance token. If that canister’s functionality does not generate meaningful fees or other revenue streams to support the DAO, the token’s value could stagnate near zero.
- In a scenario where the token has little real-world utility or demand (e.g., “governance only” with minimal user fees), it will be difficult to attract external interest or sustain development.
- Limited Liquidity and Risk of DAO Capture
- With low liquidity in the governance token, a small group of opportunistic investors or even a single whale could accumulate controlling stakes cheaply.
- This creates a risk of governance capture—where a few participants can outvote everyone else and effectively control the canister’s code. We’ve seen precursors of these dynamics in early SNS projects like SNS-1 → Dragginz where one investor bought up more than 50% of the tokens.
- Overhead
- Even though the SNS can provide some decentralization, it also introduces “governance overhead,” more upgrade complexity, and the lingering question of whether enough participants will engage in (and pay attention to) its proposals. I believe it takes on the order of thousands of dollars a year to keep an SNS up and running with cycles at the moment.
- Overkill for Simple “Protocol Support” Utilities
- If a canister is meant to be a small, lightweight protocol utility, spinning up a new token-based DAO can be disproportionate overhead.
- It fragments community attention and adds another token to the ecosystem—even when there is no real need for a separate token economy.
It is a great solution for some things, but likely not for things like RPC canisters, subscription canister, etc.
- Takeover
- We’re already seeing some weakness in SNS governance as more and more are being taken over by 51% attacks. These operate as intended, I suppose, but it exposes the fact that securing DAOs has a time vector to it and if you don’t keep interest/value above a threshold forever, your DAO is exposed.
3. Potential Considered Solutions & Directions
Despite DFINITY’s valid concerns, there may be ways to preserve the security guarantees of the NNS while allowing developers beyond DFINITY to build “protocol support” canisters that the community can trust provided we get some clear answers on options from DFINITY. Below are some alternative approaches:
3(a). Use a Different Mechanism to Avoid Blocking the NNS
-
Abstain via an Alternative Installer
Instead of having the NNS directly install or upgrade user-submitted code, we could deploy a minimal “installer” canister that checks for a passed proposal on the NNS. The NNS would only vote on a) a “motion proposal” or b) “Install Code” proposal that targets a “blackhole” canister (i.e., a canister that always traps).
- With a) a standard motion proposal is submitted with some kind of json config in the body (instead of using the InstallCode proposal type). The alternative install canister can treat this purely as a signaling mechanism. If the motion passes, an entirely separate minimal installer executes the upgrade.
- With b) the upgrade call from the NNS itself would fail immediately (so it can’t stall the NNS), and the “installer” canister—when it sees the proposal pass—installs the code on the NNSs behalf. The Protocol Support canister would need to set this alt-installer as the sole controller.
- Both a and b would prevent the stalling scenario and remove the impetus for DFINITY to “auto-reject” allowing them to abstain and let the NNS non-followers decide.
- Another pro is that since DFINITY won’t vote on these, NNS users will either be forced to vote or update their following to ensure that they cast their vote and get their rewards. This could drive decentralization of the motion proposal topic
- A con here is that if only a small subset vote on these than anyone controlling a significant amount of VP could attack your canister. This is likely more of an issue currently than it will be in the future.
- Of course, we should consider the trade-off of extra governance proposals (voting fatigue), but this is hopefully addressed via liquid democracy and following. Community feedback is key here
3(b). Clarify the Definition (and Treatment) of “Protocol-Level Canisters”
If the community wants certain canisters (e.g., subscription utilities, exchange-rate feeders, EVM RPC canisters, etc.) to be recognized as “protocol-level” (or “protocol-support”) canisters, then:
- We could define a governance path that marks certain user proposals as “Protocol Support.”
- Those canisters could then go through a more formal review pipeline, perhaps with a community-led or third-party audit funded by a DAO or grants.
- On completion, the community (including DFINITY) could recognize them as “protocol-level,” making them eligible for simpler or faster upgrade approvals under a documented process.
However, even if such a “protocol-support” classification exists, we still face the resource constraint: DFINITY cannot audit everything. This is where the community, independent auditors, or a dedicated code-review DAO might step in. Given that DFINITY currently moves a significant portion of the vote on things like they would have a virtual veto, but in the spirit of cooperation, I think it would be viable to separate high value initiatives worth funding out of the foundation at their discretion.
I feel like at some point entities other than DFINITY have to be able to provide protocol support canisters or we just won’t scale and we’ll have a hard time being taken seriously as we discuss our open protocol.
3(c). Define Requirements for “Sufficiently Audited” Code
Right now, no one knows what threshold of review would convince DFINITY to move from “auto-reject” or “heavy skepticism” to “abstain” or “accept.” Defining these criteria is crucial:
- Security Checklists or “Must-Have” Audits
We could create a standardized security or audit checklist—tailored for Motoko and Rust. - Community-Approved Auditors
DFINITY (and the community) could recognize a panel of known auditors who maintain some track record of thorough code review in ICP-specific contexts.
If we had these requirements in writing, teams like ours (and future teams) could plan ahead for how to bring a canister up to standard.
3(d). Decentralizing the Voting Base
Another long-term path is to reduce the effective veto power that one large (or small group of large) voter(s) have over these canister upgrades. This is obviously an uphill battle: many neurons simply follow DFINITY, and re-routing them all to a broader set of delegates might take significant community organizing. Still, if the community wants more “yes” votes on user-proposed, high-value canisters, we need to improve the distribution of voting power and reduce reliance on single-entity follow.
3(e). Collect a group of interested parties and use Orbit to do multi-sig for upgrades
Unfortunately, this seems like the most likely immediate solution. The problem is, specifically with the subscription canister, I don’t know if I trust any small cabal of people with the 30 years worth of monthly payments from thousands of accounts. I know as an individual that I do not want to be personally responsible for that, probably not for 1/5th of that responsibility.
Broadly spreading the responsibility across all NNS voters with DFINITY abstaining and having the ability to step in with an upgrade veto during a 4 day vote if someone rings the alarm bells seems much more secure to me when we start talking about this kind of value.
4. Inheriting Security from the NNS vs. Creating an SNS
We would gain a lot by being able to rely on the NNS’s security guarantees, especially for canisters that govern significant value or hold sensitive logic (like subscription management). The SNS is often recommended as an alternative, but see section 2 above.
What I mean by “inheriting security”: Most eth L2s have an escape hatch that they put in. For example, on Optimism, when you withdraw your ETH back to the main chain, you have to wait 7 days. During that period anyone can contest the withdrawal and the withdrawer must provide a witness or will lose their ETH. I believe there may be another process through, which you can always withdraw your ETH even if the L2 is malfunctioning. Through this process Optimism is said to ‘Inherit the security of Ethereum’. I’d like a process by which we can do that on the IC such that our canisters can inherit the NNS’s security of at-stake ICP.
In a sense, we have this security since the NNS can install any canister if it wants to(see the taggr incident) but we have no practical mechanism to do so since DFINITY has closed the door.
Suggestion
Suggestion 1:
I’d suggest that abstaining from 1B above would be both the least complex and the easiest to roll back if we end up in a situation where the NNS is overwhelmed with proposals. @Lorimer would be able to use this as a solution to his Neuron management proposals as well. This at least gets my canister up and running and ‘controlled’ by the NNS the way I’d like and solves the NNS upgrade problem.
The only con that I see is that DFINITY stands to lose some maturity by abstaining.
Maturity Solution: Create a “Community Motion” topic that gets 0 credits toward maturity and that most of the community can ignore. This would put a burden on the person running the system to try to attempt to get more than 3% of the NNS to actually care, else they’ll never be able to pass anything.
Further Enhancement: I could also imagine an additional parameter to this topic that would allow a per community flag and thus people could follow on a per community basis…but this starts to gain complexity and I’d like to get the canister back up and running in weeks and not months.
These items would likely be very susceptible to the “overthrow” attack where someone with more VP than the small interested community could attack the canister.
Suggestion 2 ← This is what we will pursue unless there is significant push back:
Instead of asking for permission for upgrades, we will set up an upgrade canister that forces a 4-day window for pending upgrades and make this the controller of the canisters we want to be ‘public utility’ canisters. At any point during this window, a user may submit a veto motion proposal to the NNS. This is just any standard Motion Proposal but it has a payload that our install canister will look for. By filing this motion proposal with the install canister you can put the upgrade in limbo until the motion passes or fails.
Public Utility Canisters will self-govern which controllers can invoke an upgrade(as they already do), so not just anyone can trigger an upgrade. You, as the controller can manage this however you want and set up whatever transparent process you want. For example, “For upgrades we will post code 3 days before submitting an upgrade request; the NNS then has 4 days to file a Veto if they don’t like it.” All the NNS can do is veto that upgrade by someone staking some ICP into a motion to veto proposal(no extra work for the NNS team).
This lets non-SNSs define a process for upgrades that work for their applications and yet gives the full backing of the NNS when we need it. Someone wanting to block an upgrade will need to stake ICP, create the veto upgrade proposal, and make their case. If the NNS disagrees and rejects the motion, then they lose their ICP.
The pros
- The happy path will never bug the NNS. As long as upgraders stick to their word, publish their code, and act in good faith, and the community doesn’t go sideways, the should be no veto proposals and no votes.
- Pretty high on the permissionless scale.
- Significantly removes the incentive for someone to threaten my life or livelihood in exchange for ripping people off.
The cons
- handling of emergency upgrades to deal with bugs or stuck canisters. Plan B would be to beg the NNS taggr style to be more proactive. This would put some burden back on DFINITY.
- If the managing group goes so malicious(a blatent rug pull, refusal to post upgrade code as open source) that we reach some kind of stalemate where they keep trying to upgrade and the public (or some anon with too much time and/or money to burn) keeps trying to veto and winning it could get a bit chatty. I’ll have to think through how we might handle this without NNS intervention, but we can consider the happy path in the meantime.
- Dfinity may for some reason decide to always auto veto. I’d expect some significant justification as to why and I hope we can pursue this option with DFINITY at least abstaining.
- The owners of the controller of the public utility canister will still have some upgrade control and thus some amount of trust and ability to ‘pull a fast one’ if not enough people are paying attention. They are going to have to use something like orbit or a multisig toolkit to make the class to do the upgrade and this can be more tedious than one would want an more responsibility than one would want with a bunch of capital on the line(although the ultimate backstop of the NNS protecting me from being held at gunpoint or threat of financial terrorism and being forced to rob people blind is actually a huge relief)
Clarifying Questions For DFINITY
So a couple of direct questions:
- DFINITY: Please let us know if one, both, or neither of these pathways are acceptable at the moment
A) Would DFINITY at least commit to abstaining to install veto proposals for publicly declared utility canisters that commit to open-sourced upgrades.
or
B) The Install Code proposal to a blackholed instant trap canister - Alternative Installer
or
C) Motion proposals with json in the body - Alternative Installer
If none of the above is acceptable
- DFINITY: Please let us know if one, both, or neither of these pathways are acceptable at the moment
a) Please consider defining public guidelines for what an independent team must do for an audit or security checklist for DFINITY to move from “default reject” to “abstain” or “approve.” Without those guidelines, it’s hard to make forward progress.
or
b) Please consider allowing motion proposals to allow the NNS to designate certain projects as Protocol Support and advise on a budget that you all would make available for reviewing/auditing canisters or grants for trusted third parties that at least allow DFINITY to move to abstain.
Action Items for Others
- Community: Please let your voice be heard on this subject.
- Community: When and how do we start the push for more distributed voting authority on the NNS? This is not a short-term fix, but a necessary piece of the puzzle if we want to allow more third-party “protocol-level” canisters under NNS control in the future.
Thank you for putting up with this wall of text. We’re all trying to solve the same challenge: letting the Internet Computer evolve safely and permissionlessly—yet without letting malicious proposals hijack the NNS or degrade trust. The good news is: we have several alternative paths. I look forward to hearing more ideas and moving the discussion into tangible next steps.