Steem is immutable: Think twice before you post, you can't delete later on
Since a few weeks I've been exploring steem and am trying to figure out if it's really what it claims to be: A blockchain based, censure and tamper-resistant social platform. So this morning, while discovering the new Feed section, I see a post with the title "Removed This Post" and the content "Deleted" by our body @crypt0. This made me curious, if steem would fulfill my expectation of a immutable blockchain.
TLDR; What you post on steem can't ever be deleted again and everyone can dig it up with a little dedication. This is a real immutable blockchain backend. Be aware of this when posting!
Immutability in the blockchain context doesn't necessarily mean no edits possible, but...
Mutation of data in classic, non-blockchain data structures is done by replacing the old data with the new mutated data. So in the most simple, strait forward implementation this means the new data is stored where the old data used to be and the old data is therefore gone.
Blockchains however don't allow this. You can't go back and just change the content of block 3898845, since this would change the hash of that block and all blocks after that would need to be changed (rebuilt) as well and the miner won't allow this.
So the way edits actually work in blockchains is by appending and the interpretation of the appended data. When editing a post here on steem you are actually creating a new post with the edited content, but the same "permlink" (this seems to be the id) which will then end up in a new, current block.
In our example here with @crypt0's post, the edit was recorded in block 3899699. If you now ask your steem-node (or steemit.com) for this post, it will provide you the most recent version from block 3899699 and ignore the ones in the earlier blocks.
This means the original post is still and will always be in block 3898845, at least as long as there is one honest full node.
This is awesome and scary at the same time
Gone is the time with screen-caps of deleted stuff, where you never know if it's a actual screen-cap or just a photoshop to put words in some one's mouth. No need for uneddit.com or archive.org here (which btw. are also controlled by central entities for all I know), everything, the entire history of all posts, comments and votes is unalterable in the blockchain.
While this is great to keep users honest and accountable for there posts, it's scary when it comes to mistakes like accidentally revealing information that shouldn't be revealed.
If your not super popular and do this on facebook or twitter, chances are you manage to delete it before someone who cares notice. And if for example, you later on get more popular, nobody will be able to dig that information up. Sure, we have to assume FB and Twitter keep our deleted post somewhere in there storage, but the general public has no options to retrieve them.
Now with steem that's different. Anyone can dig up everything you ever posted on steem, so be aware of this!
Recovering deleted or altered posts
Now let's get in to the HOW original posts can be recovered. Fist off, it might be comforting for now, to know that it isn't super easy to access original posts after they have been edited, but I sure it's only a matter of time till we have more advanced blockexplorers that allow this or even dedicated sites to analyze post/comment history.
However, for now we need to run a steem-node our self and mess with JSON-RPC calls manually. Additionally from what I can tell there is no nice way to ask the steemd API for a specific version of a post. All you can do is ask for the post and you will get the latest version:
# curl http://steem-node.rain.core:8090 --data '{"jsonrpc": "2.0", "method": "call", "params": ["database_api", "get_content", ["crypt0","steemit-diary-my-one-month-emotional-steemit-rollercoaster-ride"]], "id": 3}'
Note: replace steem-node.rain.core with the address of your steem node or localhost if you running it on the same host.
{
"id": 3,
"result": {
"id": "2.8.504961",
"author": "crypt0",
"permlink": "steemit-diary-my-one-month-emotional-steemit-rollercoaster-ride",
"category": "steemit",
"parent_author": "",
"parent_permlink": "steemit",
"title": "Removed This Post",
"body": "Deleted",
"json_metadata": "{\"tags\":[\"steemit\",\"funny\",\"writing\",\"cryptocurrency\",\"introduceyourself\"]}",
"last_update": "2016-08-08T09:55:42",
"created": "2016-08-08T09:12:51",
"active": "2016-08-08T15:19:51",
...
Above you see a beautified version of the first few lines of the result. You see the edited content in the fields "title" and "body".
Since we can only retrieve the latest version with the "get_content" method, we need to use the "get_block" method which basically dumps all records of the block requested.
So how do we know which block we are looking for? We don't and please correct me if I missed something, the only indication I see is the timestamp in the "created" field. With that I started to shift through blocks and tried closing in on the block that was mined at 2016-08-08T09:12:51:
# curl http://steem-node.rain.core:8090 --data '{"jsonrpc": "2.0", "method": "call", "params": ["database_api", "get_block", [3924017]], "id": 3}'
Luckily the blocks timestamp is among the first field of the blocks JSON data:
{"id":3,"result":{"previous":"003be0304ea0f6a19829c7fa657ebb4b591d3f0b","timestamp":"2016-08-09T06:23:54","witness":"joseph","transaction_merkle_root":"9f0...
After I found the block with exact same timestamp that the post has in "created" I was first surprised, that the original post wasn't in it. But when thinking again it all made sense: the blocks timestame couldn't be known to the transaction (post) contained that block in it. So logically the creation time of the post references a block already mined when submitting the post.
So I found the original post I was looking for in the next block (not sure if it's allays the next block, could probably also be in the next few blocks):
# curl http://steem-node.rain.core:8090 --data '{"jsonrpc": "2.0", "method": "call", "params": ["database_api", "get_block", [3898844]], "id": 3}'
This has the same time as "created" of the post, but seems to be a empty block:
"result": {
"previous": "003b7ddbeb74a17c6cea9d7194bfdc3481d174c5",
"timestamp": "2016-08-08T09:12:51",
"witness": "blocktrades",
...
"transactions":[]}
Check the next block:
# curl http://steem-node.rain.core:8090 --data '{"jsonrpc": "2.0", "method": "call", "params": ["database_api", "get_block", [3898845]], "id": 3}'
And here we go, the next block has the original post we were looking for,.. check the field "title".
"result": {
"previous": "003b7ddcc100b1d0bab7ebfca2a672f115106364",
"timestamp": "2016-08-08T09:12:54",
"witness": "arhag",
"transaction_merkle_root": "6190cec1afdc7968236ca43729f3a62529883470",
"extensions": [],
"witness_signature": "2054a1615b02a6ebf044bc30424081aeb1fa318ab9584c383a635987b50b2b75d4672052fbda8d2dc85e10cc4ee6d716958ac095c6b2fae8049112b0991e922e6b",
"transactions": [{
"ref_block_num": 32166,
"ref_block_prefix": 1613566671,
"expiration": "2016-08-08T09:13:03",
"operations": [
["comment", {
"parent_author": "",
"parent_permlink": "steemit",
"author": "crypt0",
"permlink": "steemit-diary-my-one-month-emotional-steemit-rollercoaster-ride",
"title": "Steemit Diary: My One Month Emotional Steemit Rollercoaster Ride",
...
I, of course, cut right after the "title" filed and the next field would have been the "body" field with all the "deleted" content in it. But since this post is not about making the content that our body @crypt0 decided to remove easy accessible again to everyone, you go and do the leg work your self. I already did the monkey work of finding the block number for you. If you want to know that desperately whats in it, spin up your own steem node and challenge your self to get the original post out of the blockchain.
After all I like @crypt0 and the vids he is doing. Since I'm pretty sure he knows how blockchains work, I assume he just did this to get that specific post out of the spotlight and didn't expect it to be actually gone.
Conclusions
To be honest, what led me to invest about a hour in digging up the original post was not only my curiosity about how steem actually works and if I understood the implications of using a blockchain for social media correctly, it was as well the click-bait,.. or better dig-bait effect that the title "Removed This Post" had on me.
If I desperately would like to stop people from reading a specific post of mine, I would now, after reflecting upon my own reaction to this kind of title, leave the original title in place and just remove from the body of the post what ever I wanted to disappear or even refill the body with something boring, if I wanted everything gone. Changing the title to something boring might also help, but can also raise suspicions as the "permlink" (part of the URL) is created from the title when initially posting and can't be changed afterwards.
But all that is sort of shady and I personally would only go that route if I made a terrible mistake in a post that could haver severe real live consequences.
The way @crypt0 did it, to me looks more like a honest statement,.. I changed my mind and consider my post as deleted, dig it up if you have to, but I for my part retract this post.
In the end I enjoyed reading the post and digging for it,..but nothing negative or shocking in it as far as I can tell, not sure why he deleted it, but thats his decision. I actually liked it and therefore went upvoteing the empty post after I red the original ;)
@crypt0: If you think the block number makes it to easy, let me know and I remove it with a edit on my post,.. otherwise, keep up the good work!
This is a really helpful post. Thanks for taking the time to do this!
My general approach: "How should I know what I think, unless I have seen, what I have written". Does this mean I am screwed????
This is totally cool. I noticed one of these removed posts as well and wondered. -- Could you do a video walkthrough of this for the not so tech savy?
Thanks, I'm not sure if a video makes things easier here, it's all just typing commands and what I describe here assumes that you have your on steem node running, which would be the first step.
Since there currently, as far as I'm aware, are no binary releases, you will have to start by compiling steem https://steem.io/documentation/how-to-build/ .
When you have your steem-node running, I would recomend this documentation to get started with the api: https://github.com/steemit/steem/blob/master/doc/api-notes.md
I'm not sure what the long term plans are here, but at the moment steemd (the node you can run on your own) is not very user friendly, it seems like the focus is more in making the steemit.com website a good user expirience at the moment.
But if your main interest is in getting original posts, I think there soon will be web sites/blockexplorer that allow that, probably before building and running nodes gets any easier.
Thanks @m0se , I may check it out just to flex these finger muscles
Does that mean that you can't fix all the typos in this post? :D
Congratulations @m0se! You have received a personal award!
2 Years on Steemit
Click on the badge to view your Board of Honor.
Do not miss the last post from @steemitboard!
Participate in the SteemitBoard World Cup Contest!
Collect World Cup badges and win free SBD
Support the Gold Sponsors of the contest: @good-karma and @lukestokes
Congratulations @m0se! You received a personal award!
You can view your badges on your Steem Board and compare to others on the Steem Ranking
Vote for @Steemitboard as a witness to get one more award and increased upvotes!