There were different proposals on how to assign farmers to shards for upcoming scalability design, but they all seemed complex and smelled like Proof of Stake to me. I think there is a more elegant and natural solution that depending on other requirements may or may not work out.
Background
Before farmer can participate in consensus, they need to plot some space. The unit of plotted space there is a sector, which internally contains some pieces. Each sector has an ID that is derived from public key hash and sector index and for each individual piece we derive a PoSpace seed from sector ID using piece offset and history size at the time of plotting (such that sectors will expire over time).
Proposal
We can extend PoSpace seed derivation with one (or maybe a few, like 5) shard IDs (where 0
is beacon chain) and during auditing effectively check against a few shard-specific challenges. This way during plotting process farmer commits to specific shards and can change them over time during normal replotting process or by wiping the whole thing and starting over committing to specific shards they want.
Farmers that have little bandwidth/compute can decide to plot for a single shard, those that have a lot of bandwidth/compute can decide to commit to many/all shards uniformly to have a chance to collect more transaction fees.
This is completely permissionless and doesn’t require any prior on-chain registration. Distribution of farmers between shards can be estimated by the frequency of solutions across different shards and we can even build some logic that will dynamically pick less crowded shards during replotting, etc.