Motivation and Background
I think there is a benefit to separate out some of the concepts that are currently coupled with upvotes and downvotes (aka flags) on Steem platforms. The first concept (and the only thing the Steem blockchain cares about) behind upvotes and downvotes is about adjusting the payout of rewards. But users (and the Steem platform UIs that serve the users) also care about the implications of the upvotes and downvotes and what message they convey, which is the second concept currently mixed in with upvotes/downvotes. An upvote may (or may not) be used by the user to convey approval of some content. A downvote (or flag) may be used by a user to signal that some content is bad for the platform (e.g. plagiarism or a scam); or maybe there is nothing bad about it and they even like the content but they just think it is over-rewarded (which is a legitimate use of the downvote on this platform that shouldn't be overly shamed and is in fact necessary for the platform to work well).
The Steem blockchain allows custom messages to be added in any transaction using the
custom_json_operation. If a useful standard is formed around what I am calling "reactions", then different Steem clients can use and read the
custom_json_operation appropriately to provide a meaningful way of allowing users to express their opinions regarding the contents of posts/comments on Steem which can be conveniently aggregated, displayed, and made useful to users of the platform in ways that an unstructured (yet incredibly flexible) comment could not.
Furthermore, some users may have so little Steem Power or voting power that their votes may not count enough (in terms of rewarding the author or rewarding them as curators) to justify the expense of tracking it as part of the consensus state of the blockchain. However, every user with a registered Steem account deserves the ability to broadcast their opinion about any content regardless of how much voting power they have (granted if they have extremely little Steem Power they may be highly rate-limited especially if they are transacting a lot). Reactions make it possible for these users to always share their opinions (just as if they were upvoting) whether or not they have enough voting power to actually affect the reward payout.
My proposal (which is not hardforking change) is that the steemd node continues tracking the consensus state dealing with rewards, but middleware software will also track the state associated with reactions (which accounts are part of the set for each particular reaction type for each post/comment). A standard utilizing
custom_json_operation would allow the user to modify (add / remove / replace) the state of the reactions they associate with a particular post/comment. Multiple reactions from a single account for a particular post/comment would be acceptable (although the UI could put further sensible restrictions on it). Typically the clients would bundle the
custom_json_operationthat sets the initial reaction by the user along with the upvote/downvote that actually modifies rewards into the same transaction. But the operations could be separated out, and this would make sense, for example, when adjusting the reaction without wanting to change the voting weight (to not reset the curation rewards) or maybe changing the voting weight without desiring to change the reactions (to avoid unnecessarily bloating the transaction size).
I won't be going into any technical details of how this standard should be implemented at the blockchain
custom_json_operation level. This is mostly a high-level proposal that tries to explain what sort of reactions could be made available and what the UX of this reaction feature might be like. It shouldn't be too difficult to come up with some technical standard for how this should be implemented once/if there is a consensus around a need for such a feature and how it would work at a higher level.
UI/UX in Steem clients
I am interested to hear ideas from the community about how the UI/UX for this feature could work. I have some initial thoughts about it. First, I would want to separate out in the UI the some of the reactions (things that would typically be accompanied by an upvote or at least would typically not come with downvotes) from the very negative reactions (things associated with a flag such as marking a post/comment plagiarism, fraud, spam, or hate speech).
Clicking on the flag icon would open up a UI similar to what we have now, however: the bullet points would be checkboxes; "Fraud or Plagiarism" would be separated into their own separate items; "Hate Speech or Internet Trolling" would be separated into their own separate items; the "Disagreement on rewards" item would be removed; and, an "Illegal" item would be added. Disagreement on rewards is a legitimate reason to downvote, but it would be taken out of this UI to not associate it with the more menacing notion of "flagging". There would be a message in this UI that downvoting because of excessive rewards is not considered flagging and can be done through a different interface accessible by clicking on the potential payout dropdown. The user clicks on any of the negative reactions ("Plagiarism", "Fraud", "Hate Speech", "Trolling", "Spam", "Illegal") that apply (at least one must be selected), selects the negative voting weight and then clicks the flag button. They can later go back to the UI and adjust any of the selections (if they change the voting weight there will be a warning that it will cost them their voting power again) including entirely removing their flags.
Clicking on the potential payout dropdown would expose an interface (in addition to what already exists) to adjust rewards via downvote without expressing a reaction (this is also where one would go to adjust or remove a previously submitted reaction-neutral downvote). Reaction-neutral downvotes are taken to imply that the user simply thought the rewards were too high (not that the content is necessarily somehow bad). In fact, it could be possible to provide a positive reaction along with a downvote to, for example, express approval of the content while still reducing the too-high rewards; a possible UI to allow this rarer sort of action would be to first use another UI (to be discussed shortly) to submit a reaction without any upvote, and then use the UI in pending payout dropdown to add a downvote (which would not affect the already existing state of reactions). After payout of a post/comment, this downvote UI is no longer accessible in the past payout dropdown; in fact, I think it should not be even possible to submit upvotes/downvotes to the blockchain on paid out posts/comments and instead only reactions (via
custom_json_operation) should be used after payout.
The remainder of the reactions (not all positive) are provided via icon buttons (one for each reaction). Each could have a number next to it representing the number of accounts who currently hold that reaction with respect to the given post/comment. The icon would be highlighted in some way if the logged in user currently holds that reaction with respect to the given post/comment. Clicking on any of the icons open a pop-up window overlaid perfectly over the icons so that it seems like none of the icons had moved in the overlay window. This window would allow toggling any of the icons and making other adjustments regarding upvote weight (if any upvote operation is to be submitted at all) before clicking the "Submit" button to publish the changes in a single transaction; or the user could click the "Cancel" button or simply click away from the overlay pop-up window to reject any of the pending changes. When clicking on any of the icons after having already at least one reaction currently associated for the given post/comment, it would simply open the overlay pop-up window without making any pending changes; from there the user could then toggle any reaction icons or make other changes. When clicking on any of the icons with no existing reaction associated with the given post/comment, it would not only open the pop-up window but it would also set it up with a pending change of adding the reaction associated with the icon that was clicked; again no changes get submitted to the blockchain unless the "Submit" button.
Assuming the post has not yet paid out, the overlay pop-up window would also have a (possibly greyed out) voting weight slider along with a checkbox that says "Do not modify existing voting weight". If the user already has a downvote on the post/comment, then the voting weight slider (which would be greyed out) would be representing a negative voting weight and the checkbox would be checked but would not be allowed to be unchecked (trying to uncheck it would warn the user that they first need to remove their downvote from the pending payout dropdown). If the user does not have a downvote on the post/comment, then the voting weight slider (which would represent positive voting weight) could possibly be greyed out and the checkbox checked, but the user could uncheck it if they wanted to which would enable the voting weight slider (if the user rechecks the checkbox, it would move the voting weight of the slider back to what it is supposed to be and would again grey out the voting weight slider). If the user previously voted on the post/comment but has now removed the vote or never before voted on the post/comment, then the voting weight slider will be initially set to 0%. If the voting weight slider is enabled (not greyed out) there would be a warning label underneath it that estimates how much voting power would be used up if the user was to submit a change with the selected voting weight and furthermore, unless they had not voted on the post/comment before, there would be warning that they are not eligible for any curation rewards.
When clicking on a reaction icon for the first time for a particular post/comment, the voting weight slider may or may not start enabled (as in not greyed out and with the "Do not modify existing voting weight" checkbox left unchecked). If it starts greyed out, then it will be set at the 0% weight. If it starts enabled, then the weight will be set to whatever the previous weight setting was for an upvote on similar content type (post or comment). When initiating the overlay pop-up window by clicking on one of the positive reaction icons, the voting weight slider starts enabled. When initiating the overlay pop-up window by clicking on one of the negative reaction icons (currently in this proposal there is only one negative reaction icon which is the Disapproval thumbs down icon), the voting weight sliders starts greyed out. Notice that even when clicking on the negative reaction icons, the pop-up UI does not provide a way to downvote (that is left in the separate UIs for flagging and reducing payouts from the pending payout dropdown); this is to promote the idea that just because you disagree with a post it doesn't mean that you should reduce their payout or harm their reputation.
Types of positive reactions
(Represented with current up arrowhead symbol)
What it implies:
I believe this post deserves to be rewarded more, but I am not claiming any additional value judgment on the content of the post.
(This is how all upvotes that are not attached to other reactions via
custom_json_operation should be represented. However, it should be possible to represent this generic upvote reaction using
custom_json_operation alone as well, in case the user does not have enough voting power to submit a valid upvote to the blockchain.)
(Represented with a thumbs up emoji or U+1F44D)
What it implies:
I agree with / support the content of this post.
(Represented by the crying face emoji or U+1F622)
What it implies:
The content of this post emotionally affected me and I extend sympathy where appropriate.
(Represented by the thinking face emoji or U+1F914)
What it implies:
I explicitly do not claim to agree with all of the contents of this post (though I may or may not agree with parts of it). However, I found the contents interesting and worthwhile to read, and I think it is worth bringing more attention to it if nothing else so that it can facilitate meaningful discussion.
(Better symbols to represent this concept are appreciated.)
(Represented by the grinning face with smiling eyes emoji or U+1F604)
What it implies:
I found the content of this post to be humorous.
Types of negative reactions
(Represented with a thumbs down emoji or U+1F44E)
What it implies:
I disagree with / do not support the content of this post. (This is the reaction to use if you personally do not like what a poster is saying but it is not appropriate to "flag" them.)
Various reasons for flagging
(All represented by the same flag symbol but different reactions are supported at
custom_json_operation level to express the reasons behind the flag.)
Plagiarism: Passing off other people's work as if it is their own or including other people's work in their post/comment without giving proper attribution.
Fraud: Can include scams, identity theft, and fake news (as in provably false statements about the objective world seemingly made with the intent to deceive people).
Hate Speech: This one can get complicated fast. First read this: https://en.wikipedia.org/wiki/Hate_speech. Like all the other reasons for flagging, community standards will form to decide what is and isn't acceptable ground for flagging something as hate speech.
Trolling: This one can also be tricky. Some helpful reading material here: https://en.wikipedia.org/wiki/Internet_troll. This should probably just be used when a user is pretty clearly harassing another user (or multiple users).
Spam: Content that seems to just be taking up space on the blockchain and cannot conceivably be providing value to anyone, other than possibly just the author. Also includes posts with clearly mis-categorized tags or abused mentions with the intention to increase visibility of their post (also appropriate for authors who refuse to tag their posts with not-safe-for-work content as nsfw).
Illegal: Content includes things believed to be against laws that would force most Steem client operators to act to be in compliance with the laws in their jurisdiction. Most commonly would involve copyright infringement though other types of illegal activity are also covered under this label.
Other reactions to consider?
I think it is important to not have too many reactions since that can bloat the UI and distract users. But having sufficient nuance is important to really extract a lot of value from this feature. So there is a trade-off to be had. At one extreme end of the trade-off is extreme nuance, which is unnecessary since that is already handled by comments which can convey anything natural language allows (but comes with the disadvantage of being unstructured and difficult to aggregate, analyze, and display in convenient ways). At the other extreme is just sticking with our existing system of a generic upvote. The lists of reactions I provided in the above sub-sections are just an initial suggestion, and I would like to start a discussion of which reactions (both positive and negative) Steemians would actually like to see and use. But I would like to also quickly discuss what we can learn from other social media platforms like Facebook, and why I chose to leave off some possible reactions in this trade-off.
Facebook has six reactions: Like, Love, Haha, Wow, Sad, and Angry. Sympathy and Funny are basically identical replacements to Sad and Haha, respectively. Facebook's original reaction was only Like. This was a poorly named reaction to begin with in my opinion, but I guess they have to stick with it for legacy reasons. I think using a generic upvote on Steem to represent rewarding a post (without an explicit reason given) makes more sense than a "Like". With this proposal however, if you do actually in addition support the content of a post, you would be able to use the Approval reaction (which does use the thumbs up icon like Facebook's Like).
To me, starting off with a generic upvote (rather than a Like) and then adding an explicit Approval in addition makes it unnecessary to have a reaction equivalent to Love as well. But maybe I am way off-base with this and maybe there is strong demand for a Love-like reaction for situations where a generic upvote (and maybe clarifying comment) is not sufficient. I am aware that Love is the most popular reaction on Facebook after Like (though Like is still at least an order of magnitude more popular than Love), but I again attribute this to the fact that Facebook started off with Like as its only option originally, and so users may now feel the need to use Love as a way to differentiate their reactions from the generic Like. That said, I do concede there are situations where someone may wish to differentiate their positive reaction from a generic upvote, but the Approval reaction is not appropriate since the Approval reaction has to do with agreement of a particular message or action conveyed in the post while the situation being discussed may instead call for a reaction dealing with affection with respect to another person. So maybe some kind of Affection reaction (with heart emoji ❤) would be desirable eventually.
Finally, the reactions I proposed above do not include something similar to Facebook's Wow and Angry reactions. I am not convinced those are really that helpful. There are lots of situations involving sharing news of events where people may be tempted to react with anger where I think it is more appropriate to redirect that passion to a more positive reaction like Sympathy; and if they really want to rant that is what comments can be used for. Also, at least according to one study, Angry is the least popular Facebook reaction (although to be fair Sad is not far behind as the second least popular). And as for Wow, I just don't see that being a common enough reaction to justify its own reaction option, unlike Funny/Haha. Now to be fair, according to that same study mentioned earlier, Wow is more popular than Sad, but I really think it is necessary to have a Sympathy reaction to deal with those awkward situations where you want to support someone describing a bad experience but not give an impression that you are happy about what happened to them.