-
Notifications
You must be signed in to change notification settings - Fork 22
BIT-0018: Distributed subnet ownership #31
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: main
Are you sure you want to change the base?
Conversation
|
||
The separation of profit and governance shares provides maximum flexibility for subnet ownership structures. This allows for scenarios where: | ||
|
||
- **Investors** can receive economic benefits without governance control |
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.
Investors and Contributors differ - Investors provide capital while Contributors provide work. It'd be good to distinguish those clearly so that we have the language to talk about it later.
- **Vote buying**: Locked shares prevent vote trading | ||
- **Sybil attacks**: Share-based voting requires economic stake | ||
- **Governance capture**: Minimum thresholds and voting strategies provide protection | ||
- **Time-based attacks**: Expiry blocks prevent indefinite proposals |
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.
Can't someone time new proposal additions to happen as soon as the previous one is terminated, blocking the ability of the governance body to raise proposals?
This can be potentially addressed by making it so that the closing block pseudo-randomly (based on last valid drand seed?) assigns a preferred voter with share-weighted probability that they are going to be selected to prevent sybil attack where a small shareholder will fracture themselves into a thousand pieces to increase their chances of being selected.
After the previous proposal is terminated, the preferred proposer would have a few blocks during which only they could submit a new proposal.
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.
Simplified Solution to Governance Attack Prevention
I propose simplifying the solution to this problem. Since proposals already require >10% of voting shares to be created, we can assume an attacker holds <50% of total shares (otherwise, they could simply block any proposal, resulting in complete governance failure).
Mechanism:
Release all voters' shares immediately after proposal execution
Delay the unlock of the proposer's shares for X blocks
This prevents attackers from continuously blocking governance decisions
Attack Limitations:
An attacker could execute at most 4 consecutive proposals by distributing their shares across 4 separate accounts, each holding the minimum 10% threshold required for proposal creation.
Timing Considerations:
The unlock delay must be shorter than the proposal expiry time, ensuring that even delayed proposers can participate in subsequent votes.
This approach maintains voting accessibility while creating a natural cooldown period that prevents malicious actors from monopolizing the governance process.
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.
but it prevents the small holders from triggering a vote. If no holder has at least 10%, no voting can happen.
|
||
**Process**: | ||
|
||
1. Owner cut accumulates until `DistributedSubnetProfitInterval` (e.g., every 1000 blocks) |
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.
lets not introduce a new being, but use the subnet superblock (one epoch block in 20 tempos)
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.
@ppolewicz I think it has been discussed that there is no concept of "superblock"
|
||
**Process**: | ||
|
||
1. Alice calls `transfer_profit_shares(distributed_subnet_id, 100, david_hotkey)` |
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.
Alice signs it with her coldkey
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.
@ppolewicz that is implied because almost all extrinsic are signed with coldkey but you think it needs be more explicit?
|
||
- **Creation**: Requires minimum governance shares (configurable using `NewProposalMinShares`, default 10%) | ||
- **Active**: Only one proposal can be active at a time | ||
- **Locked Shares**: Proposer's governance shares are locked during proposal |
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.
this document needs to be revised by an AI to remove multiple mentions of the exact same thing, I'm pretty sure this one appears at least 3 times
```rust | ||
pub enum VotingStrategy { | ||
ShareProportionMoreThan(Percent), // e.g., X% of total shares | ||
MembersProportionMoreThan(Percent), // e.g., X% of voting members |
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.
not in v1. Voting shares percentage only is good enough to start.
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 would even say that MembersProportionMoreThan does not make any sense, as a voter could quite easily sybil attack this vote.
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.
💯
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.
@vstam1 @ppolewicz That's right, I will remove it entirely and only have it support % of shares
- The sum of all profit shares must not exceed 1000 (100%) | ||
- The sum of all governance shares must not exceed 1000 (100%) |
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.
how about u64?
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.
@ppolewicz I don't think using u64 shares split is needed? Do we have a use case for this?
I got the impression that owning at least 0.1% of share is enough for most use case?
|
||
#### Proposal Execution | ||
|
||
When a proposal reaches the required threshold, it is executed automatically and immediately with the permission of the subnet owner. The execution happens as soon as the threshold is reached, without requiring manual intervention. |
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.
When a proposal reaches the required threshold, it is executed automatically and immediately with the permission of the subnet owner. The execution happens as soon as the threshold is reached, without requiring manual intervention. | |
When a proposal reaches the required threshold, it is executed automatically and immediately. The execution happens as soon as the threshold is reached, without requiring manual intervention. |
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.
@ppolewicz After thinking about it, that could cause issue when a proposal is executed at a time not allowed, for example, an hyperparameter in the last 10 blocks of a tempo. Letting the proposal creator finalizes
the proposal avoid this kind of issue. Also avoid us having to schedule the proposal execution that could fails.
I think the division between Governance shares and Profit shares should be emphasized more in the document |
I like the general approach of this BIT. A couple of remarks:
|
|
I'm all for making it a hook inside another pallet that handles the distribution. What I was thinking about is the concept you describe with
I would by default stake the distributed tokens from the share holder's coldkey to the subnet owner's hotkey. After distribution they can of course still change the hotkey they stake to using the normal staking operations. You can of course also choose to distribute the tokens to some share holder's hotkey, meaning that the share holders have to supply a hotkey by default. If we go the first route, it means each share holder could just have 1 key, that both owns the profit shares and the governance shares.
👍
51% would keep is simple, however having the flexibility to require a different percentage per proposal has its advantages. I would go over the potential governance calls that can be voted on, and look if they have large differences in importance. We might be able to compare it to normal laws vs the constitution. I think for example you need a 2/3 majority in the US to change the constitution, while you need >50% to change normal laws. This is something that can be discussed in the dev calls. |
The profits will be accumulated during the coinbase, and there is only 1 write, when you update the
I'm not sure to understand the difference between Also not sure about the last part where we provide only 1 key, user can provide only hotkey and we could infers the coldkey but allowing both makes it possible to split further if they want, like I want one of my coldkey to handle the governance and I want a hotkey linked to some other coldkey to handle the profits.
I feel like this would be kind of cumbersome to manages on our side in the long term by having to update this on every new extrinsic. Having at least 51% gives flexibility, if they want to create proposal with 2/3, that is their business. |
The current Bittensor subnet ownership model creates significant limitations by registering ownership to a single on-chain entity. It offers no native mechanism to distribute ownership rights or rewards, hindering collaborative governance and investor participation.
This PR introduces Distributed Subnet Ownership, a protocol-level solution that allows both economic and governance rights to be fractionalized into on-chain shares. This enables multiple stakeholders to co-own and manage a subnet directly on-chain.
A native implementation provides a standardized, secure, and efficient framework, which is preferable to bespoke smart contract solutions. By integrating this functionality into the protocol, we can strengthen decentralization, improve transparency, and lower coordination costs for subnet operators, contributors, and investors.