Skip to content

Conversation

l0r1s
Copy link
Collaborator

@l0r1s l0r1s commented Sep 24, 2025

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.

@l0r1s l0r1s changed the title Distributed subnet ownership BIT-0018: Distributed subnet ownership Sep 24, 2025

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
Copy link
Collaborator

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
Copy link
Collaborator

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.

Copy link

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.

Copy link
Collaborator

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)
Copy link
Collaborator

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)

Copy link
Collaborator Author

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)`
Copy link
Collaborator

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

**Process**:

1. Alice creates proposal (40% shares, above 10% minimum)
2. Bob votes No (35% shares), Charlie votes No (25% shares)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

after Bob votes no, the proposal should be terminated already


- **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
Copy link
Collaborator

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
Copy link
Collaborator

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.

Copy link

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.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💯

Copy link
Collaborator Author

@l0r1s l0r1s Oct 6, 2025

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

Comment on lines +58 to +59
- The sum of all profit shares must not exceed 1000 (100%)
- The sum of all governance shares must not exceed 1000 (100%)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

how about u64?

Copy link
Collaborator Author

@l0r1s l0r1s Oct 6, 2025

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 of having at least 0.1% of share is enough for most use case?


- The sum of all profit shares must not exceed 1000 (100%)
- The sum of all governance shares must not exceed 1000 (100%)
- If the sum of shares is less than 1000, the remaining shares are automatically assigned to the subnet owner
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
- If the sum of shares is less than 1000, the remaining shares are automatically assigned to the subnet owner

that's very confusing, can we remove it?


#### 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.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
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.

@ppolewicz
Copy link
Collaborator

I think the division between Governance shares and Profit shares should be emphasized more in the document

@vstam1
Copy link

vstam1 commented Sep 26, 2025

I like the general approach of this BIT. A couple of remarks:

  • I think you could directly split the owner share over the share holders during the distribute_dividends_and_incentives function. Shares are already being paid out to 256 UIDs, and with a max of 50 share holders, it would only increase the run logic by 20%.
  • I think both the profit shares and the governance shares should go to a coldkey. The profit shares will probably stake from the share holder's coldkey to the owners hotkey as the alpha always needs to be stakes to a hotkey from a coldkey.
  • As I also mentioned above, I think you should remove the MembersProportionMoreThan voting strategy as it opens up for sybil attacks where share holder splits it share over multiple accounts.
  • I do not completely understand how ShareProportionMoreThan share value is chosen? Can a proposer just chose the share proportion? Or is it based on the call that you try to execute? So for example hyperparam change X needs at least 70% while Y needs only 50%?

@l0r1s
Copy link
Collaborator Author

l0r1s commented Oct 6, 2025

@vstam1

  1. It doesn't change much to have the distribution done in distribute_dividends_and_incentives or in the hook given you still have 50 keys to iterate over to split the owner cut but doing it like the way described make it more flexible and loosely coupled which is a long term goal of splitting the logic to declutter the coinbase.

  2. I'm not sure to understand, the alpha distributed needs to go to some hotkey and we don't want to take a default hotkey associated with the coldkey provided?

  3. Taken into account, will be removed entirely.

  4. That is something to determine but I thought it would allow more flexibility on a per proposal basis depending on what needs to be voted on? Or maybe just having 51% is fine for all?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants