[IMAGE: https://files.peakd.com/file/peakd-hive/howo/hP4fZF55-social_hive_revolution_dark.jpg]
Hello,
First of all if you haven't already, please check out my proposal for blockchain development on hivedao: https://hivedao.com/proposals/97
This the kind of posts that I want to do now and then on chain to gather some feedback and ideas about features and ongoing hive core work.
So here's some history on RC delegations, it's a feature that was worked on over a few years by the steemit team, and was supposed to ship with the smt hard fork, I figured this was a very important feature to have asap and we shouldn't wait on smts to have it. The problem is that the code is quite different between the SMT branch (where smts are done) and the main branch (the one that powers the chain right now).
When the steemit team said "SMT development change almost every element of the chain" they weren't kidding. So the challenge was to extract the code and then adapt it to work without the rest of the SMT code. Which can be quite tricky as I had to dig up some changes that were made back in 2018.
Then I realized that there was some bugs, so I set out to fix them and finally I got a working proof of concept.
FYI: it won't go live for hf24 because we don't want such a big change in hf24 and also there's some discussions to be had and potentially modifications to be done depending on your feedback.
Here's currently how RC delegations work:
Pools
Each account got an RC pool in his account, anyone can delegate to any account pool, that RC won't be usable by the account, it's just a pool he can delegate RC from. (he can delegate to himself if he wishes).
RC slots
There is a notion of delegation slots, each account got 3 slots from which they can receive delegations. meaning they can receive rc from at most from 3 pools, also, each slot can only receive from a specific pool. If you are not "whitelisted" you can't delegate to an user.
By default:
Slot 1 is set to the account creator of the account, and only the account creator can change that slot
Slot 2 is set to the recovery account, and only the recovery account or a top witness can change that slot
Slot 3 is set to null, and the account can change that slot.
it may seem a bit odd how the user don't "own" 2/3 of his slots, but it's designed in order to offload the complexity (setting up slots etc) to power users (witnesses/account creators/recovery partners) instead of putting that burden on the user.
Most of the use cases for rc delegations are linked to account creation anyways, and that use case is handled by default, then there's games or other operation intensive applications and those could have a button to "ask for rc delegation" that would make the user set his personal slot to the game and then the app would delegate to it.
It's worth noting that if you change your slot, you lose your previous delegation on that slot.
Oversubscription
Pool work on an oversubscription model: (thanks @vandeberg for the explainer)
Let's say Alice delegates 100 RC to an RC Pool.
That pool can then delegates 30 RC to Bob, Carol, Dave, and Eugene.
There is a total of 120 RC delegated, but only 100 RC in the pool.
Is that a problem? No.The implementation allows each of the out delegations to use up to the delegation's worth of RC, but that is charged to the pool.
If Bob uses all 30 RC and no one else does, Bob will no longer have access to RC from the pool until his regenerates, even though to pool still has 70 RC available. However, if Bob, Carol, and Dave all use 30 RC, then Eugene will only be able to use 10 RC before he cannot access any more.
Although he has RC still available from the delegation, because the pool ran out of RC, Eugene does not have any to use.
This is useful for this use case: Large stake holder making many small delegations, such as Steemit delegating to new users via the faucet (back when that was a thing). Users will consume their RC, but because not all users are retained, this can be significantly over subscribed.
Another real life example:
- Alice delegates 50 rc to her pool
- Bob changes it slot 3 to Alice
- Alice delegates 30 RC from it's pool to Bob (Bob can now use the RC)
- Alice tries to delegate to Eve, but since she didn't set a slot to Alice, Alice cannot delegate RC to it
FAQ:
Will this affect the current hive power delegations ?
No it will stay the same
If I delegate hive power to someone then RC, which one is used ?
The RC used is in priority the account's own rc (hive power + delegated hive power), then if that's not enough, delegated RC is used.
It it possible to have to have multiple users contribute to the same pool ?
Yes.
How many pools can one account contribute to ?
40
To be clear an account can contribute to 40 pools, which will then be used to delegate RC to as many accounts as they want (way more than 40).
Let's say the same thing but with a soup analogy:
A user can contribute to 40 different pots, but each one of those pots can be used to feed as many people as he wants.
Does delegated RC regenerate like normal RC ?
Yes
Is it possible to Delegate from one pool to another ?
No
Feedback wanted
Now, question is, what do you think of that implementation ? Are there things you would change ? I am open to coding any changes. But keep in mind there are performance and complexity considerations to take into account (for instance that's why we don't have like 50 slots per account).
Some early feedback include allowing users to change all their slots if they want to, because a lot of slot 1 (account creator slot) would be blocked and never used since they are linked to the @steem account (including mine).
Questions ? Ask them below !
And again, please consider voting on my core development proposal here https://hivedao.com/proposals/97
It's overall a step in the right direction, but when I'd first heard of RC Pools I guess I was envisioning something a bit more automated and elegant. I'd imagine RC Pools tied to certain transaction types as opposed to individual user accounts, if such a thing is even possible.
I know that most (all?) posts contain some form of metadata that defines where the activity originated, as far as application, front end, tool, etc. I don't know if that's also true of voting activities. I feel that RC Pools should be tied to that information, instead of linked between each individual user account, which seems to still be a nightmare when scaling to tens and hundreds of thousands of users or more.
As an example, if Bob is posting his daily Actifit update, the system first draws from his own personal RC as is the case in what you describe above, if his balance is insufficient, it then draws from the Actifit RC Pool instead. Then Bob swings over to PeakD and makes a comment on a piece of art he really likes in the OnChain Art community. This RC cost is then auto picked up by either PeakD or OnChain Art. As a new user, Bob's experience is seamless, no requests need to be made for RC delegations, and the RC costs are being levied on the applications he's actually using. Otherwise, Bob may sign up through eSteem, get an RC delegation, discover SplinterLands, and spend his allotment of eSteem's RC on playing SplinterLands.
In the sort of system I describe, the three pools would essentially be relegated to different hierarchies of user, application, and community... quite possibly in that order of fallback. Applications and communities would ideally be able to set their own "rate limiting," blacklist certain users, etc. to control spamming and abuse of their RC. Applications could feasibly set a limit on both individual users and communities. In the example given above, PeakD may allow only 1% of their RC pool to be used toward any one community, ensuring a single popular community can't drain all their resources and harm the user experience. Then it's the responsibility of the community to power up HIVE and backstop with their own RC Pool to keep their members active and happy.
Communities are already tied to a singular account at creation that could serve as the RC Pool, Applications would have to have an account designated as their RC resource.
Whew. Hope that made some sort of logical sense.
Summation: Users should individually delegate into RC Pools of communities and applications that they want to support, but expenditure of RC Pools should be tied to transactions, not users, thereby removing the need to manage individual delegations across potentially millions of accounts. The minimal RC amount that all accounts are credited with at creation should be enough to ensure any new account can still make limited needed wallet transactions and other behaviors, while the heavy lifting of content creation and interactivity is automated on the backend and charged to the services being utilized.
Without a doubt the biggest problem is that a system like I'm describing is ground up different than what's already in the works!
As long as pools can set automated rules on how their resources are allocated, I don't see the spam factor being problematic. Limiting accounts to (x) transactions or (x) RC per day would be sensible. It's a shame that transaction tracking isn't more robust, but it would certainly take a power user to tag their posts in such a way as to just siphon some RCs off an unrelated application. If you do consider that a serious concern, then that just speaks to the issue that primary front end applications are going to bear the brunt of RC costs, even when not used directly on their platform.
My main concerns are that it be pretty much seamless for new users to acquire an RC delegation, they shouldn't have to hunt for a frontend, application or user to provide it, request it, and wait for approval, and that applications can effectively manage their RC delegations. The pool as a "slush fund" of sorts with an attached ruleset is simpler than direct management of potentially millions of outgoing delegations, even if employing scripts and bots to help manage the task.
Side question:
>Another real life example:
Alice delegates 50 rc to her pool
Bob changes it slot 3 to Alice
Alice delegates 30 RC from it's pool to Bob (Bob can now use the RC)
Alice tries to delegate to Eve, but since she didn't set a slot to Alice, Alice cannot delegate RC to it
In this example, are you able to differentiate in advance whether you're delegating to a user directly or their pool?
>Each account got an RC pool in his account, anyone can delegate to any account pool, that RC won't be usable by the account, it's just a pool he can delegate RC from. (he can delegate to himself if he wishes).
For instance, even without Eve setting a slot for Alice to delegate RC to, can't Alice delegate to Eve's pool without Eve's consent, and then Eve can simply route it to herself?
What's the purpose of the extra "whitelisting" step? I'm not seeing the benefit for the added complexity. We don't force people to accept a Hive Power delegation which is more impactful as it conveys RC and voting power in tandem, so why the extra limitation on RC alone?
If I'm understanding the system correctly, my suggestion for the current slot allocations would be to change #2 to the user account directly, and have their personal RC pool potentially feed into that with no approval or as seamlessly as possible, such that when Alice tries to delegate to Eve, Eve will see the benefits immediately without the complexity of needing to reassign a slot.
I know I'm a little late to the party, but I'm wondering why this very complex system is necessary. I think a much simpler system would suffice for the majority of use-cases.
I can see why the current system doesn't suffice. If you delegate HP, you delegate RC and voting power. This is a way of saying that you approve the actions of the user you delegated to. A large account creator can't check all actions of all their created accounts, so they can't trust them with their voting power. They do want to give the users enough ability to interact with the blockchain so they can start earning their power. That's where RC delegation comes in.
A probably much simpler way of implementing RC delegation would be to make it similar to HP delegations. You delegate a portion of your max RC to a single user. That user can use that RC to interact with the blockchain. Most required code can probably be reused from the HP delegation codebase. 1
This simplistic version indeed doesn't cover all use-cases that RC pools cover. As a dapp who provides accounts, you can't use community delegations to proxy to your new users. There's also no 'oversubscription', so the max RC delegated to the dapp users will be a lot lower, possibly low enough to run out. 2
On the other hand, this simpler system would allow every user to support any other user they want to support, without them spending an 'RC slot'. I have a mere 78 HP at the time of writing. That's not much voting power, but I never get below 80% RC. If I encounter a new user who brings great value to the blockchain, I am not in the position to delegate HP, but I would be willing to delegate some RC to them.
I believe that if we make it easy enough to delegate RC to others, there will be much less pressure on the account creator to provide the required kickstart RC. Instead, the community will be able to take care of most of it. The only problem that remains is blockchain games. Those systems usually don't promote new players to write posts and earn rewards before playing. That would require too much effort, so a dapp delegation is required. But I highly doubt that this single use-case justifies the complexity of this system.
Conclusion: I think this system is implemented to ease the life of large, singular entities, onboarding massive amounts of users while being irrelevant for small-medium accounts with sufficient RC. I believe that if we build a system that empowers everyone, small to large, to help out brand new users who make quality content, we can solve most problems those singular entities have while increasing decentralization, and decreasing complexity.
1 I can't say with certainty that this is a simpler system to implement. I only assume it is because of its similarities to HP delegation. Please tell me if I'm wrong here.
2 It is likely that I miss some use-cases. Some of them are not covered by the simpler system.