# Steem Developer Portal

### RB: Reblogging Post

To reblog (‘resteem’) a post, we can use a custom json operation that is handled by the follow plugin.

Full, runnable src of Reblogging Post can be downloaded as part of the RB tutorials repository.

For this operation, we will use `custom_json` and a properly formed id and payload so that `follow_plugin` will pick up the reblog data and display the selected post in the feed of the account doing the reblog.

### Sections

1. Making the api call - broadcasting the operation
   1. Example api call - make the call in code
   2. Example api call using script - using our tutorial script
   3. Example Output - output from a successful call
   4. Example Error - error output from a unsuccessful call
2. Custom JSON Fields - understanding the result
3. To Run - Running the example.

### Making the api call

To broadcast the operation, we can use a `Radiator::Transaction` instance:

    tx = Radiator::Transaction.new

    tx.process(true)

Passing `true` to `Radiator::Transaction#process` will broadcast the operations queued in the `operations` array of the transaction.

#### Example api call

If we want to reblog, we need to form the `json` properly, for example:

    data = [
      :reblog, {
        account: reblogger,
        author: author,
        permlink: permlink
      }
    ]

    tx.operations << {
      type: :custom_json,
      id: 'follow',
      required_auths: [],
      required_posting_auths: [reblogger],
      json: data.to_json
    }

#### Example api call using script

And to do the same with our tutorial script:

    ruby reblogging_post.rb https://steemit.com/@inertia/kinda-spooky

#### Example Output

From the example we get the following output from our script:

    {
      "jsonrpc": "2.0",
      "result": {
        "id": "0aa41e06b2612315d32cadeb671eb1201f266dd7",
        "block_num": 24063620,
        "trx_num": 19,
        "expired": false
      },
      "id": 3
    }

The response we get after broadcasting the transaction gives us the transaction id (`0aa41e0...`), block number (`24063620`), and the transaction number of that block (`19`).

### Example Error

If a post has already been reblogged by the account, we will get back an error:

    {
      "jsonrpc": "2.0",
      "error": {
        "code": -32000,
        "message": "Assert Exception:blog_itr == blog_comment_idx.end(): Account has already reblogged this post",
        "data": {
          "code": 10,
          "name": "assert_exception",
          "message": "Assert Exception",
          "stack": [
            {
              "context": {
                "level": "error",
                "file": "follow_evaluators.cpp",
                "line": 143,
                "method": "do_apply",
                "hostname": "",
                "timestamp": "2018-07-10T21:33:11"
              },
              "format": "blog_itr == blog_comment_idx.end(): Account has already reblogged this post",
              "data": {
              }
            },
            {
              "context": {
                "level": "warn",
                "file": "follow_evaluators.cpp",
                "line": 216,
                "method": "do_apply",
                "hostname": "",
                "timestamp": "2018-07-10T21:33:11"
              },
              "format": "",
              "data": {
                "o": {
                  "account": "social",
                  "author": "inertia",
                  "permlink": "kinda-spooky"
                }
              }
            },
            {
              "context": {
                "level": "warn",
                "file": "generic_custom_operation_interpreter.hpp",
                "line": 195,
                "method": "apply",
                "hostname": "",
                "timestamp": "2018-07-10T21:33:11"
              },
              "format": "",
              "data": {
                "outer_o": {
                  "required_auths": [

                  ],
                  "required_posting_auths": [
                    "social"
                  ],
                  "id": "follow",
                  "json": "[\"reblog\",{\"account\":\"social\",\"author\":\"inertia\",\"permlink\":\"kinda-spooky\"}]"
                }
              }
            },
            {
              "context": {
                "level": "warn",
                "file": "database.cpp",
                "line": 3221,
                "method": "_apply_transaction",
                "hostname": "",
                "timestamp": "2018-07-10T21:33:11"
              },
              "format": "",
              "data": {
                "op": {
                  "type": "custom_json_operation",
                  "value": {
                    "required_auths": [

                    ],
                    "required_posting_auths": [
                      "social"
                    ],
                    "id": "follow",
                    "json": "[\"reblog\",{\"account\":\"social\",\"author\":\"inertia\",\"permlink\":\"kinda-spooky\"}]"
                  }
                }
              }
            },
            {
              "context": {
                "level": "warn",
                "file": "database.cpp",
                "line": 3227,
                "method": "_apply_transaction",
                "hostname": "",
                "timestamp": "2018-07-10T21:33:11"
              },
              "format": "",
              "data": {
                "trx": {
                  "ref_block_num": 12404,
                  "ref_block_prefix": 1445149887,
                  "expiration": "2018-07-10T21:43:09",
                  "operations": [
                    {
                      "type": "custom_json_operation",
                      "value": {
                        "required_auths": [

                        ],
                        "required_posting_auths": [
                          "social"
                        ],
                        "id": "follow",
                        "json": "[\"reblog\",{\"account\":\"social\",\"author\":\"inertia\",\"permlink\":\"kinda-spooky\"}]"
                      }
                    }
                  ],
                  "extensions": [

                  ],
                  "signatures": [
                    "1c063e22868f107dbafaa0452d86cfe19894f2f7fc3ea46b5c73dc7906edcd88244548f001c1d128aa07f862819e80e2f46b6cd74c6769d1d48ef4ad1f147b4dab"
                  ]
                }
              }
            },
            {
              "context": {
                "level": "warn",
                "file": "database.cpp",
                "line": 788,
                "method": "push_transaction",
                "hostname": "",
                "timestamp": "2018-07-10T21:33:11"
              },
              "format": "",
              "data": {
                "trx": {
                  "ref_block_num": 12404,
                  "ref_block_prefix": 1445149887,
                  "expiration": "2018-07-10T21:43:09",
                  "operations": [
                    {
                      "type": "custom_json_operation",
                      "value": {
                        "required_auths": [

                        ],
                        "required_posting_auths": [
                          "social"
                        ],
                        "id": "follow",
                        "json": "[\"reblog\",{\"account\":\"social\",\"author\":\"inertia\",\"permlink\":\"kinda-spooky\"}]"
                      }
                    }
                  ],
                  "extensions": [

                  ],
                  "signatures": [
                    "1c063e22868f107dbafaa0452d86cfe19894f2f7fc3ea46b5c73dc7906edcd88244548f001c1d128aa07f862819e80e2f46b6cd74c6769d1d48ef4ad1f147b4dab"
                  ]
                }
              }
            }
          ]
        }
      },
      "id": 3
    }

This indicates that the operation was not included in the blockchain because it was already reblogged in the past.

### Custom JSON Fields

Broadcasting a `custom_json` operation will require the following fields:

- `id` - set to `follow` to indicate that this operation is handled by the `follow_plugin`
- `required_auths` - leave this as an empty JSON Array, we only need the posting authority
- `required_posting_auths` - JSON Array containing the account name with the posting authority
- `json` - the actual payload of the operation, containing a JSON Array:
  - First element - `reblog`
  - Second element - JSON Object containing:
    - `account` - account that is doing the reblog op
    - `author` - author of the post being reblogged
    - `permlink` - permlink of the post being reblogged

### To Run

First, set up your workstation using the steps provided in Getting Started. Then you can create and execute the script (or clone from this repository):

- `<url>`

    git clone git@github.com:steemit/devportal-tutorials-rb.git
    cd devportal-tutorials-rb/tutorials/14_reblogging_post
    bundle install
    ruby reblogging_post.rb <url>