We've had a couple of posts already about the reward pool share of the bid bots and paid voting services. Previous analyses gave a reward pool share varying between 25 to 30% of the total daily vote values. The approach is rather straight forward: query all votes from the blockchain or a database, build a list of all voting bots and check which fraction of votes was done by them. What's not included in this number is the number and value of votes sold via sell-your-vote services like @smartmarket and @minnowbooster. I'm not aware of published numbers on the number and volume of votes with services like these.
Getting the numbers for sell-your-vote services is hard, because regular user accounts are used to vote. The vote seller receives a share of the bid in return. There may be some accounts that basically sell all their votes that way, but a lot of them use this as a side incoming when their VP would be idle. These accounts also do manual/other votes, a simple account list doesn't work there, not even talking about getting this list in the first place. Looking into transfer history was suggested a couple of times already. Whoever tried that knows that this is a big mess to dig through. Invalid bids, refunds, and most importantly: user balances managed on smartsteem.com and minnowbooster.com. There's not necessarily a blockchain transaction, neither for the bid, nor for the vote seller payment.
However, there's a way: The signatures of blockchain vote transactions can reveal who initiated the vote on behalf of the users. As a positive side effect: the same method also reveals autovotes via steemauto or steemdunk. The downside is: this approach is much more compute intensive and therefore slower than the bot list approach. Analyzing larger time ranges is costly.
- Scope of the analysis and tools
- Transaction signature 101
- Most frequent vote signers
- Share of sell-your-vote, bid bots and autovotes by value
Scope of the analysis and tools
All data was queried directly from the blockchain using batched appbase calls with beem and saved in a local MongoDB database for further processing. All query and processing scripts are done with python.
The analysis covers all votes done on Aug. 23rd 2018, one full day. The reason for the small time range is the amount of post processing required to get the results.
All scripts to generate these results are in my GitHub.
Transaction signature 101
Every interaction with the blockchain is cryptographically signed. Private keys are used to sign all your votes, comments, transfers, etc.. If you click the upvote button on steemit.com, your browser assembles a data block containing (among others) your account name, the post you want to vote for as well as the upvote percentage. This data is serialized and signed with your private posting key. The resulting signature is appended to the data block and sent to a Steem node. The Steem node can now verify that this transaction is actually signed with your private key based on your public key. It obviously only includes transactions into the blockchain where these signatures are valid and the signer is allowed to sign that kind of transactions.
However, there's more: authorized accounts. If you authorize an account to post in your name, that account is allowed to sign transactions in your name, with it's own private key. This means, based on the signature appended to each blockchain transaction we can check which key was used to sign a transaction. The public key of the signer can be extracted from the signature.
Coming back to the original topic: If you sign up with smartsteem or minnowbooster to sell your vote, you authorize @smartsteem or @minnowbooster to post/vote in your name - with their key!
If you sign up with SteemAuto or SteemDunk, you authorize @steemauto or @steemdunk to post/vote in your name - with their key!
By extracting the public keys of the signers from the signatures on the vote operations, we can determine if the vote was signed from the account's own private key, or any authorized app.
In order to get this information, full transactions are required. The signatures and the transaction raw data is not available from SteemSQL. This has to be retrieved directly from the blockchain. Batched appbase calls help to speed this up, but it's still magnitudes slower than querying SteemSQL.
Once the transactions are available, the public key of the signer can be extracted with beem's
Signed_Transaction class. This takes a couple of 10ms per transaction on my machine. There are ~700k votes per day, so that's going into hours of computing time per day even in the optimal case. I failed to speed it up with parallel threads or processes (GIL or my incompetence?), but there may be room for improvement...
Now we have the signer's public key, the voter, the voted post and the voting percentage - what's missing is the vote value. In order to get that, we need a
get_content lookup for each and every post and comment being voted on that day (around 60k). Luckily, there are again batched appbase calls available to get 1000 posts at once per call, but it still takes time...
Most frequent vote signers
These are the top 10 vote signers on the given day from a total of 695k votes from 51k distinct voters:
This list is led by steemauto with 268k votes! This means that more than 40% of all votes (by number) on that day were done by steemauto. That's quite a lot, but I'm actually not really surprised. I would have expected even a higher number there, but this is not the only auto-vote service. Smartsteem is second with around 46k votes or 6.5% (by number). The third entry, @steemconnect, contains the votes done by users via several of the dDapps, including busy.org, dtube, dlive, and others. It may also include auto-votes. So these are at least partly "manual", partly auto-votes. Unfortunately, the same key is used for all these dApps, so we can't distinguish votes from different dApps there. @steemdunk is another auto-voter with around 10k votes. @upvotebank is a vote-for-a-vote service. @minnowbooster is ranked 9th by the number of votes here.
A couple of other auto-voters like @steemvoter cannot be shown here, because they use the posting key directly. These votes cannot be distinguished from manual votes on steemit.com by the signature.
Share of sell-your-vote, bid bots and autovotes by value
The number of votes is only one aspect, more relevant is the value of the votes. The following table includes the relative share of the vote signers by vote value, namely the sum of rshares in relation to all vote rshares of that day:
|Signer||Relative Vote count||Relative vote value|
|Smartsteem vote sellers||6.58%||3.82%|
|Minnowbooster vote sellers||0.21%||1.44%|
This tables shows the share of bid-bots and paid voting services in the first line. This share was determined from a list of known bots. If a vote from @smartsteem is signed by @smartsteem, this is contained in the "Bots" line. If a vote from a vote seller is signed by @smartsteem, this vote is contained in the "SmartSteem" line.
The overall share by value of the paid voting services for that given day is at 28.2%. Past analysis have shown values between 25 and 30%, so this didn't change very much since then. @smartsteem's sell-your-vote operations make up 3.8% of all votes by value and @minnowbooster adds another 1.4%. This means, that another around 5% of all votes by value on top of the 25-30% of the bot votes are sold votes. There's an interesting difference between MinnowBooster and SmartSteem in the ration between the relative share by count and value: 6.5% of votes by SmartSteem make up 3.8% of the value, while 0.2% of the MinnowBooster votes make up 1.4% of the value. This means that the MinnowBooster vote sellers in average make larger votes than the SmartSteem vote sellers.
The value of the auto-voters on the other hand are small compared to their relative number. SteemAuto makes more than 41% of all votes by number, but those generate "only" 6.8% of the total vote value. The auto-votes are in average much smaller than the sold votes. This not very surprising, given the SP distribution across active accounts.
- The votes from bid-bots and paid voting services sum up to 28.17% of all votes by value for that day. This is consistent with my previous analysis giving values between 25 and 30%, however with fluctuations across days.
- Sell-your-vote operations currently make up around 5% of the total vote value per day, on top of the 25-30% done by bid-bots and paid voting services.
- Two of the auto-votes together make up more than 42% of all votes on that day by number. With several other auto-vote services using the posting key directly, or contained in the SteemConnect line, the real number is very likely to be much higher.
In general, the data set is comparably small due to the complex post processing. There's certainly room for improvement on the processing speed, which would immediately improve the value of the results. This is the first estimation on the vote selling business that I'm aware of. If there are others, please leave a comment.
I had absolutely no idea which order of magnitude to expect for the vote selling part when starting this analysis. Is around 5% much?
as pointed out by @therealwolf in the comments below, Smartsteem also signs a "solid number" of votes from vote sellers with the Steemconnect key. This means that an unknown fraction of the 4.21% of votes by value, currently assigned to Steemconnect, are actually also paid votes from Smartsteem vote sellers. This makes vote selling a share of something between around 5-9% of all votes by value on that day, on top of the 28.17% directly done from bid-bots. Thanks for this remark!