diff --git a/hive/db/schema.py b/hive/db/schema.py index 4e0a29d3449a6102e7b09b5f9afa3e57b9593ee1..8eedc803d85fd9d300cd4bf4609e1de023d048f9 100644 --- a/hive/db/schema.py +++ b/hive/db/schema.py @@ -602,7 +602,8 @@ def setup(db): "condenser_get_names_by_reblogged.sql", "condenser_get_discussions_by_comments.sql", "condenser_get_account_reputations.sql", - "update_follow_count.sql" + "update_follow_count.sql", + "delete_reblog_feed_cache.sql" ] from os.path import dirname, realpath dir_path = dirname(realpath(__file__)) diff --git a/hive/db/sql_scripts/bridge_get_by_feed_with_reblog.sql b/hive/db/sql_scripts/bridge_get_by_feed_with_reblog.sql index 1448a9350cc6e4fbe18c1d0d95cbb7fe493875ed..4e113df14080a20f32640ca4256c012efcfb0d23 100644 --- a/hive/db/sql_scripts/bridge_get_by_feed_with_reblog.sql +++ b/hive/db/sql_scripts/bridge_get_by_feed_with_reblog.sql @@ -72,10 +72,10 @@ BEGIN WHERE hfc.block_num > __cutoff AND hf.state = 1 AND hf.follower = __account_id GROUP BY hfc.post_id HAVING __post_id = 0 OR MIN(hfc.created_at) <= __min_date - ORDER BY min_created DESC + ORDER BY min_created DESC, hfc.post_id DESC LIMIT _limit ) T ON hp.id = T.post_id - ORDER BY T.min_created DESC; + ORDER BY T.min_created DESC, T.post_id DESC; END $BODY$ ; diff --git a/hive/db/sql_scripts/delete_reblog_feed_cache.sql b/hive/db/sql_scripts/delete_reblog_feed_cache.sql new file mode 100644 index 0000000000000000000000000000000000000000..39ae1e1edd5969df65670e448428d70264b5a2c1 --- /dev/null +++ b/hive/db/sql_scripts/delete_reblog_feed_cache.sql @@ -0,0 +1,34 @@ + +DROP FUNCTION IF EXISTS delete_reblog_feed_cache(character varying,character varying,character varying) +; + +CREATE OR REPLACE FUNCTION delete_reblog_feed_cache( + in _author hive_accounts.name%TYPE, + in _permlink hive_permlink_data.permlink%TYPE, + in _account hive_accounts.name%TYPE) +RETURNS INTEGER +LANGUAGE plpgsql +AS +$function$ +DECLARE + __account_id INT; + __post_id INT; +BEGIN + + __account_id = find_account_id( _account, False ); + __post_id = find_comment_id( _author, _permlink, False ); + + IF __post_id = 0 THEN + RETURN 0; + END IF; + + DELETE FROM hive_reblogs + WHERE blogger_id = __account_id AND post_id = __post_id; + + DELETE FROM hive_feed_cache + WHERE account_id = __account_id AND post_id = __post_id; + + RETURN 1; +END +$function$ +; diff --git a/hive/db/sql_scripts/hive_post_operations.sql b/hive/db/sql_scripts/hive_post_operations.sql index 63a3d9d5b3ec7d039079ff8615f9d85c24a159fe..099380bbc3cbb403d4f5aca9f71556d1b6b0c860 100644 --- a/hive/db/sql_scripts/hive_post_operations.sql +++ b/hive/db/sql_scripts/hive_post_operations.sql @@ -150,26 +150,38 @@ CREATE OR REPLACE FUNCTION delete_hive_post( in _author hive_accounts.name%TYPE, in _permlink hive_permlink_data.permlink%TYPE, in _block_num hive_blocks.num%TYPE) -RETURNS TABLE (id hive_posts.id%TYPE, depth hive_posts.depth%TYPE) +RETURNS VOID LANGUAGE plpgsql AS $function$ +DECLARE + __post_id INT; BEGIN - RETURN QUERY UPDATE hive_posts AS hp - SET counter_deleted = - ( + + __post_id = find_comment_id( _author, _permlink, False ); + + IF __post_id = 0 THEN + RETURN; + END IF; + + UPDATE hive_posts + SET counter_deleted = + ( SELECT max( hps.counter_deleted ) + 1 FROM hive_posts hps INNER JOIN hive_accounts ha ON hps.author_id = ha.id INNER JOIN hive_permlink_data hpd ON hps.permlink_id = hpd.id WHERE ha.name = _author AND hpd.permlink = _permlink - ) - , block_num = _block_num - FROM hive_posts hp1 - INNER JOIN hive_accounts ha ON hp1.author_id = ha.id - INNER JOIN hive_permlink_data hpd ON hp1.permlink_id = hpd.id - WHERE hp.id = hp1.id AND ha.name = _author AND hpd.permlink = _permlink AND hp1.counter_deleted = 0 - RETURNING hp.id, hp.depth; + ) + ,block_num = _block_num + WHERE id = __post_id; + + DELETE FROM hive_reblogs + WHERE post_id = __post_id; + + DELETE FROM hive_feed_cache + WHERE post_id = __post_id; + END $function$ ; diff --git a/hive/indexer/feed_cache.py b/hive/indexer/feed_cache.py deleted file mode 100644 index 3dc4d3b32d33de0dbb2851a57fb77e5af64b8206..0000000000000000000000000000000000000000 --- a/hive/indexer/feed_cache.py +++ /dev/null @@ -1,29 +0,0 @@ -"""Maintains feed cache (blogs + reblogs)""" - -import logging -from hive.db.adapter import Db -from hive.indexer.db_adapter_holder import DbAdapterHolder - -log = logging.getLogger(__name__) - -DB = Db.instance() - -class FeedCache(DbAdapterHolder): - """Maintains `hive_feed_cache`, which merges posts and reports. - - The feed cache allows for efficient querying of posts + reblogs, - savings us from expensive queries. Effectively a materialized view. - """ - @classmethod - def delete(cls, post_id, account_id=None): - """Remove a post from feed cache. - - If `account_id` is specified, we remove a single entry (e.g. a - singular un-reblog). Otherwise, we remove all instances of the - post (e.g. a post was deleted; its entry and all reblogs need - to be removed. - """ - sql = "DELETE FROM hive_feed_cache WHERE post_id = :id" - if account_id: - sql = sql + " AND account_id = :account_id" - DB.query(sql, account_id=account_id, id=post_id) diff --git a/hive/indexer/posts.py b/hive/indexer/posts.py index 33ec87431464d23342551fcdd8c5aef9197403e1..96f535be9123278163ebb92ddbb302661329d8ee 100644 --- a/hive/indexer/posts.py +++ b/hive/indexer/posts.py @@ -10,7 +10,7 @@ from diff_match_patch import diff_match_patch from hive.db.adapter import Db from hive.db.db_state import DbState -from hive.indexer.feed_cache import FeedCache +from hive.indexer.reblog import Reblog from hive.indexer.community import Community from hive.indexer.notify import Notify from hive.indexer.post_data_cache import PostDataCache @@ -390,22 +390,8 @@ class Posts(DbAdapterHolder): @classmethod def delete(cls, op): """Marks a post record as being deleted.""" - - sql = """ - SELECT id, depth - FROM delete_hive_post((:author)::varchar, (:permlink)::varchar, (:block_num)::int); - """ - row = DB.query_row(sql, author=op['author'], permlink = op['permlink'], block_num=op['block_num']) - - result = dict(row) - pid = result['id'] - - depth = result['depth'] - - if depth == 0 and not DbState.is_initial_sync(): - # TODO: delete from hive_reblogs -- otherwise feed cache gets - # populated with deleted posts somwrimas - FeedCache.delete(pid) + sql = "SELECT delete_hive_post((:author)::varchar, (:permlink)::varchar, (:block_num)::int );" + DB.query_no_return(sql, author=op['author'], permlink = op['permlink'], block_num=op['block_num']) @classmethod def _verify_post_against_community(cls, op, community_id, is_valid, is_muted): diff --git a/hive/indexer/reblog.py b/hive/indexer/reblog.py index 983655926c9a1e5acc80448f41033a980de7a03b..f126b8024c686b2c72c70e55074a1193b42be872 100644 --- a/hive/indexer/reblog.py +++ b/hive/indexer/reblog.py @@ -2,59 +2,69 @@ import logging +from hive.db.adapter import Db from hive.db.db_state import DbState from hive.indexer.accounts import Accounts -from hive.indexer.feed_cache import FeedCache from hive.indexer.db_adapter_holder import DbAdapterHolder from hive.utils.normalize import escape_characters log = logging.getLogger(__name__) - -DELETE_SQL = """ - WITH processing_set AS ( - SELECT hp.id as post_id, ha.id as account_id - FROM hive_posts hp - INNER JOIN hive_accounts ha ON hp.author_id = ha.id - INNER JOIN hive_permlink_data hpd ON hp.permlink_id = hpd.id - WHERE ha.name = :a AND hpd.permlink = :permlink AND hp.depth = 0 AND hp.counter_deleted = 0 - ) - DELETE FROM hive_reblogs AS hr - WHERE hr.account = :a AND hr.post_id IN (SELECT ps.post_id FROM processing_set ps) - RETURNING hr.post_id, (SELECT ps.account_id FROM processing_set ps) AS account_id -""" +DB = Db.instance() class Reblog(DbAdapterHolder): """ Class for reblog operations """ - reblog_items_to_flush = [] + deleted_reblog_items = {} + reblog_items_to_flush = {} @classmethod - def reblog_op(cls, account, op_json, block_date, block_num): - """ Process reblog operation """ - if 'account' not in op_json or \ - 'author' not in op_json or \ - 'permlink' not in op_json: - return + def _validated_op(cls, actor, op, block_date, block_num): + if 'account' not in op or \ + 'author' not in op or \ + 'permlink' not in op: + return None + + if op['account'] != actor: + return None # impersonation - blogger = op_json['account'] - author = op_json['author'] - permlink = escape_characters(op_json['permlink']) + if not Accounts.exists(op['account']): + return None + if not Accounts.exists(op['author']): + return None - if blogger != account: - return # impersonation - if not all(map(Accounts.exists, [author, blogger])): + _delete = True if ('delete' in op and op['delete'] == 'delete') else False + + return dict(author = op['author'], + permlink = op['permlink'], + account = op['account'], + block_date = block_date, + block_num = block_num, + delete = _delete ) + + @classmethod + def reblog_op(cls, actor, op, block_date, block_num): + """ Process reblog operation """ + op = cls._validated_op(actor, op, block_date, block_num) + if not op: return - if 'delete' in op_json and op_json['delete'] == 'delete': - row = cls.db.query_row(DELETE_SQL, a=blogger, permlink=permlink) - if row is None: - log.debug("reblog: post not found: %s/%s", author, op_json['permlink']) - return - if not DbState.is_initial_sync(): - result = dict(row) - FeedCache.delete(result['post_id'], result['account_id']) + key = "{}/{}/{}".format(op['author'], op['permlink'], op['account']) + + if op['delete']: + cls.deleted_reblog_items[key] = {} + cls.delete( op['author'], op['permlink'], op['account'] ) else: - cls.reblog_items_to_flush.append((blogger, author, permlink, block_date, block_num)) + cls.reblog_items_to_flush[key] = { 'op': op } + + @classmethod + def delete(cls, author, permlink, account ): + """Remove a reblog from hive_reblogs + feed from hive_feed_cache. + """ + sql = "SELECT delete_reblog_feed_cache( (:author)::VARCHAR, (:permlink)::VARCHAR, (:account)::VARCHAR );" + status = DB.query_col(sql, author=author, permlink=permlink, account=account); + assert status is not None + if status == 0: + log.debug("reblog: post not found: %s/%s", author, permlink) @classmethod def flush(cls): @@ -74,7 +84,7 @@ class Reblog(DbAdapterHolder): INNER JOIN hive_accounts ha ON ha.name = t.author INNER JOIN hive_accounts ha_b ON ha_b.name = t.blogger INNER JOIN hive_permlink_data hpd ON hpd.permlink = t.permlink - INNER JOIN hive_posts hp ON hp.author_id = ha.id AND hp.permlink_id = hpd.id + INNER JOIN hive_posts hp ON hp.author_id = ha.id AND hp.permlink_id = hpd.id AND hp.counter_deleted = 0 ) AS data_source (blogger_id, post_id, created_at, block_num) ON CONFLICT ON CONSTRAINT hive_reblogs_ux1 DO NOTHING """ @@ -85,24 +95,27 @@ class Reblog(DbAdapterHolder): limit = 1000 count = 0 cls.beginTx() - for reblog_item in cls.reblog_items_to_flush: + for k, v in cls.reblog_items_to_flush.items(): + if k in cls.deleted_reblog_items: + continue + reblog_item = v['op'] if count < limit: - values.append("('{}', '{}', {}, '{}'::timestamp, {})".format(reblog_item[0], - reblog_item[1], - reblog_item[2], - reblog_item[3], - reblog_item[4])) + values.append("({}, {}, {}, '{}'::timestamp, {})".format(escape_characters(reblog_item['account']), + escape_characters(reblog_item['author']), + escape_characters(reblog_item['permlink']), + reblog_item['block_date'], + reblog_item['block_num'])) count = count + 1 else: values_str = ",".join(values) query = sql_prefix.format(values_str, values_str) cls.db.query(query) values.clear() - values.append("('{}', '{}', {}, '{}'::timestamp, {})".format(reblog_item[0], - reblog_item[1], - reblog_item[2], - reblog_item[3], - reblog_item[4])) + values.append("({}, {}, {}, '{}'::timestamp, {})".format(escape_characters(reblog_item['account']), + escape_characters(reblog_item['author']), + escape_characters(reblog_item['permlink']), + reblog_item['block_date'], + reblog_item['block_num'])) count = 1 if len(values) > 0: @@ -112,4 +125,6 @@ class Reblog(DbAdapterHolder): cls.commitTx() cls.reblog_items_to_flush.clear() + cls.deleted_reblog_items.clear(); + return item_count diff --git a/hive/server/condenser_api/objects.py b/hive/server/condenser_api/objects.py index 3d7c04a4562ad2955e131ac45a07bb96498f15d2..5ec38b8883b8fe1efcd5717336fc6bf757764801 100644 --- a/hive/server/condenser_api/objects.py +++ b/hive/server/condenser_api/objects.py @@ -44,15 +44,15 @@ def _condenser_post_object(row, truncate_body=0, get_content_additions=False): """Given a hive_posts row, create a legacy-style post object.""" paid = row['is_paidout'] - # condenser#3424 mitigation - if not row['category']: - row['category'] = 'undefined' - full_payout = row['pending_payout'] + row['payout']; post = {} post['author'] = row['author'] post['permlink'] = row['permlink'] - post['category'] = row['category'] + + if not row['category']: + post['category'] = 'undefined' # condenser#3424 mitigation + else: + post['category'] = row['category'] post['title'] = row['title'] post['body'] = row['body'][0:truncate_body] if truncate_body else row['body'] diff --git a/mock_data/block_data/reblog_op/flow.txt b/mock_data/block_data/reblog_op/flow.txt index 16a6c1d3a803e94ce1a4c056d2da3e55156882c7..9e6c0d69cc811521665e99546882c280c3f0f26f 100644 --- a/mock_data/block_data/reblog_op/flow.txt +++ b/mock_data/block_data/reblog_op/flow.txt @@ -1,4 +1,80 @@ ***block 4999999*** custom_json_operation("[\"reblog\",{\"account\":\"funny\",\"author\":\"steemit\",\"permlink\":\"firstpost\"}]") - very old post custom_json_operation("[\"reblog\",{\"account\":\"funny\",\"author\":\"steak\",\"permlink\":\"streak-test\"}]") - deleted post (should not be reblogged) -custom_json_operation("[\"reblog\",{\"account\":\"funny\",\"author\":\"dollarvigilante\",\"permlink\":\"another-billionaire-warns-of-catastrophic-depths-not-seen-in-5-000-years-and-emphasizes-gold\"}]") - fresh post \ No newline at end of file +custom_json_operation("[\"reblog\",{\"account\":\"funny\",\"author\":\"dollarvigilante\",\"permlink\":\"another-billionaire-warns-of-catastrophic-depths-not-seen-in-5-000-years-and-emphasizes-gold\"}]") - fresh post +account_create_operation( `test-reblog-01` ) +account_create_operation( `test-reblog-02` ) +account_create_operation( `test-reblog-03` ) +account_create_operation( `test-reblog-04` ) +account_create_operation( `test-reblog-05` ) +account_create_operation( `test-reblog-06` ) +comment_operation( `test-reblog-01`, `parrot-01`) +comment_operation( `test-reblog-02`, `parrot-02`) +comment_operation( `test-reblog-03`, `parrot-03`) +comment_operation( `test-reblog-04`, `parrot-04`) +comment_operation( `test-reblog-05`, `parrot-05`) +comment_operation( `test-reblog-06`, `parrot-06`) +***block 5000000*** +custom_json_operation("{\"account\":\"test-reblog-01\",\"author\":\"test-reblog-02\",\"permlink\":\"parrot-02\"}") +custom_json_operation("{\"account\":\"test-reblog-01\",\"author\":\"test-reblog-03\",\"permlink\":\"parrot-03\"}") +custom_json_operation("{\"account\":\"test-reblog-01\",\"author\":\"test-reblog-04\",\"permlink\":\"parrot-04\"}") +custom_json_operation("{\"delete\":\"delete\",\"account\":\"test-reblog-01\",\"author\":\"test-reblog-04\",\"permlink\":\"parrot-04\"}") +custom_json_operation("{\"delete\":\"delete\",\"account\":\"test-reblog-01\",\"author\":\"test-reblog-03\",\"permlink\":\"parrot-03\"}") +custom_json_operation("{\"delete\":\"delete\",\"account\":\"test-reblog-01\",\"author\":\"test-reblog-02\",\"permlink\":\"parrot-02\"}") + +***block 5000001*** +custom_json_operation("{\"account\":\"test-reblog-02\",\"author\":\"test-reblog-01\",\"permlink\":\"parrot-01\"}") +custom_json_operation("{\"account\":\"test-reblog-02\",\"author\":\"test-reblog-02\",\"permlink\":\"parrot-02\"}") +custom_json_operation("{\"account\":\"test-reblog-02\",\"author\":\"test-reblog-03\",\"permlink\":\"parrot-03\"}") +custom_json_operation("{\"account\":\"test-reblog-03\",\"author\":\"test-reblog-02\",\"permlink\":\"parrot-02\"}") +custom_json_operation("{\"account\":\"test-reblog-03\",\"author\":\"test-reblog-03\",\"permlink\":\"parrot-03\"}") +custom_json_operation("{\"account\":\"test-reblog-03\",\"author\":\"test-reblog-04\",\"permlink\":\"parrot-04\"}") +***block 5000002*** +custom_json_operation("{\"account\":\"test-reblog-04\",\"author\":\"test-reblog-04\",\"permlink\":\"parrot-04\"}") +custom_json_operation("{\"account\":\"test-reblog-05\",\"author\":\"test-reblog-05\",\"permlink\":\"parrot-05\"}") +custom_json_operation("{\"account\":\"test-reblog-06\",\"author\":\"test-reblog-06\",\"permlink\":\"parrot-06\"}") +custom_json_operation("{\"account\":\"test-reblog-06\",\"author\":\"test-reblog-05\",\"permlink\":\"parrot-05\"}") +custom_json_operation("{\"delete\":\"delete\",\"account\":\"test-reblog-04\",\"author\":\"test-reblog-04\",\"permlink\":\"parrot-04\"}") +custom_json_operation("{\"delete\":\"delete\",\"account\":\"test-reblog-06\",\"author\":\"test-reblog-06\",\"permlink\":\"parrot-06\"}") +***block 5000003*** +custom_json_operation("{\"delete\":\"delete\",\"account\":\"test-reblog-05\",\"author\":\"test-reblog-05\",\"permlink\":\"parrot-05\"}") +custom_json_operation("{\"delete\":\"delete\",\"account\":\"test-reblog-06\",\"author\":\"test-reblog-05\",\"permlink\":\"parrot-05\"}") +***block 5000004*** +custom_json_operation("{\"account\":\"test-reblog-04\",\"author\":\"test-reblog-04\",\"permlink\":\"parrot-04\"}") +custom_json_operation("{\"account\":\"test-reblog-05\",\"author\":\"test-reblog-05\",\"permlink\":\"parrot-05\"}") +custom_json_operation("{\"account\":\"test-reblog-06\",\"author\":\"test-reblog-06\",\"permlink\":\"parrot-06\"}") +custom_json_operation("{\"account\":\"test-reblog-06\",\"author\":\"test-reblog-05\",\"permlink\":\"parrot-05\"}") +delete_comment_operation(`test-reblog-04`, `parrot-04`) +delete_comment_operation(`test-reblog-05`, `parrot-05`) +***block 5000005*** +delete_comment_operation(`test-reblog-06`, `parrot-06`) +comment_operation( `test-reblog-01`, `monkey-01`) +comment_operation( `test-reblog-01`, `monkey-02`) +comment_operation( `test-reblog-01`, `monkey-03`) +comment_operation( `test-reblog-01`, `monkey-04`) +comment_operation( `test-reblog-01`, `monkey-05`) +custom_json_operation("{\"account\":\"test-reblog-01\",\"author\":\"test-reblog-01\",\"permlink\":\"monkey-01\"}") +delete_comment_operation(`test-reblog-01`, `monkey-01`) +***block 5000006*** +custom_json_operation("{\"account\":\"test-reblog-01\",\"author\":\"test-reblog-01\",\"permlink\":\"monkey-02\"}") +custom_json_operation("{\"account\":\"test-reblog-03\",\"author\":\"test-reblog-01\",\"permlink\":\"monkey-02\"}") +custom_json_operation("{\"account\":\"test-reblog-04\",\"author\":\"test-reblog-01\",\"permlink\":\"monkey-02\"}") +***block 5000007*** +delete_comment_operation(`test-reblog-01`, `monkey-02`) +custom_json_operation("{\"delete\":\"delete\",\"account\":\"test-reblog-03\",\"author\":\"test-reblog-04\",\"permlink\":\"parrot-04\"}") +custom_json_operation("{\"account\":\"test-reblog-01\",\"author\":\"test-reblog-01\",\"permlink\":\"monkey-03\"}") +custom_json_operation("{\"account\":\"test-reblog-02\",\"author\":\"test-reblog-01\",\"permlink\":\"monkey-03\"}") +custom_json_operation("{\"account\":\"test-reblog-03\",\"author\":\"test-reblog-01\",\"permlink\":\"monkey-03\"}") +custom_json_operation("{\"account\":\"test-reblog-04\",\"author\":\"test-reblog-01\",\"permlink\":\"monkey-03\"}") +custom_json_operation("{\"account\":\"test-reblog-05\",\"author\":\"test-reblog-01\",\"permlink\":\"monkey-03\"}") +custom_json_operation("{\"account\":\"test-reblog-05\",\"author\":\"test-reblog-01\",\"permlink\":\"monkey-04\"}") +custom_json_operation("{\"account\":\"test-reblog-05\",\"author\":\"test-reblog-01\",\"permlink\":\"monkey-05\"}") +***block 5000008*** +custom_json_operation("{\"delete\":\"delete\",\"account\":\"test-reblog-05\",\"author\":\"test-reblog-01\",\"permlink\":\"monkey-04\"}") +custom_json_operation("{\"account\":\"test-reblog-05\",\"author\":\"test-reblog-01\",\"permlink\":\"monkey-04\"}") +custom_json_operation("{\"delete\":\"delete\",\"account\":\"test-reblog-05\",\"author\":\"test-reblog-01\",\"permlink\":\"monkey-04\"}") +custom_json_operation("{\"delete\":\"delete\",\"account\":\"test-reblog-05\",\"author\":\"test-reblog-01\",\"permlink\":\"monkey-04\"}") +***block 5000009*** +delete_comment_operation(`test-reblog-01`, `monkey-04`) +***block 5000010*** +***block 5000011*** diff --git a/mock_data/block_data/reblog_op/mock_block_data_reblog.json b/mock_data/block_data/reblog_op/mock_block_data_reblog.json index 27f43c34d30aaf100fe75d168d148969dd9adfe6..24f07cc5b701c94829e79456576f6bf8281355f4 100644 --- a/mock_data/block_data/reblog_op/mock_block_data_reblog.json +++ b/mock_data/block_data/reblog_op/mock_block_data_reblog.json @@ -6,16 +6,867 @@ "transaction_merkle_root": "", "extensions": [], "witness_signature": "", - "transactions": [], + "transactions": [ + { + "ref_block_num": 100000, + "ref_block_prefix": 0, + "expiration": "2020-03-23T12:08:00", + "operations": [ + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "funny" + ], + "id": "follow", + "json": "[\"reblog\",{\"account\":\"funny\",\"author\":\"steemit\",\"permlink\":\"fi\nrst'%@post\"}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "funny" + ], + "id": "follow", + "json": "[\"reblog\",{\"account\":\"funny\",\"author\":\"steemit\",\"permlink\":\"firstpost\"}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "funny" + ], + "id": "follow", + "json": "[\"reblog\",{\"account\":\"funny\",\"author\":\"steak\",\"permlink\":\"streak-test\"}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "funny" + ], + "id": "follow", + "json": "[\"reblog\",{\"account\":\"funny\",\"author\":\"dollarvigilante\",\"permlink\":\"another-billionaire-warns-of-catastrophic-depths-not-seen-in-5-000-years-and-emphasizes-gold\"}]" + } + }, + { + "type": "account_create_operation", + "value": { + "creator": "test-safari", + "new_account_name": "test-reblog-01", + "owner": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "", + 1 + ] + ] + }, + "active": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "", + 1 + ] + ] + }, + "posting": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "", + 1 + ] + ] + }, + "memo_key": "", + "json_metadata": "", + "extensions": [] + } + }, + { + "type": "account_create_operation", + "value": { + "creator": "test-safari", + "new_account_name": "test-reblog-02", + "owner": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "", + 1 + ] + ] + }, + "active": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "", + 1 + ] + ] + }, + "posting": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "", + 1 + ] + ] + }, + "memo_key": "", + "json_metadata": "", + "extensions": [] + } + }, + { + "type": "account_create_operation", + "value": { + "creator": "test-safari", + "new_account_name": "test-reblog-03", + "owner": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "", + 1 + ] + ] + }, + "active": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "", + 1 + ] + ] + }, + "posting": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "", + 1 + ] + ] + }, + "memo_key": "", + "json_metadata": "", + "extensions": [] + } + }, + { + "type": "account_create_operation", + "value": { + "creator": "test-safari", + "new_account_name": "test-reblog-04", + "owner": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "", + 1 + ] + ] + }, + "active": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "", + 1 + ] + ] + }, + "posting": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "", + 1 + ] + ] + }, + "memo_key": "", + "json_metadata": "", + "extensions": [] + } + }, + { + "type": "account_create_operation", + "value": { + "creator": "test-safari", + "new_account_name": "test-reblog-05", + "owner": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "", + 1 + ] + ] + }, + "active": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "", + 1 + ] + ] + }, + "posting": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "", + 1 + ] + ] + }, + "memo_key": "", + "json_metadata": "", + "extensions": [] + } + }, + { + "type": "account_create_operation", + "value": { + "creator": "test-safari", + "new_account_name": "test-reblog-06", + "owner": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "", + 1 + ] + ] + }, + "active": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "", + 1 + ] + ] + }, + "posting": { + "weight_threshold": 1, + "account_auths": [], + "key_auths": [ + [ + "", + 1 + ] + ] + }, + "memo_key": "", + "json_metadata": "", + "extensions": [] + } + }, + { + "type": "comment_operation", + "value": { + "parent_author": "", + "parent_permlink": "", + "author": "test-reblog-01", + "permlink": "parrot-01", + "title": "I love parrots 01", + "body": "tell me about parrots 01", + "json_metadata": "{}" + } + }, + { + "type": "comment_operation", + "value": { + "parent_author": "", + "parent_permlink": "", + "author": "test-reblog-02", + "permlink": "parrot-02", + "title": "I love parrots 02", + "body": "tell me about parrots 02", + "json_metadata": "{}" + } + }, + { + "type": "comment_operation", + "value": { + "parent_author": "", + "parent_permlink": "", + "author": "test-reblog-03", + "permlink": "parrot-03", + "title": "I love parrots 03", + "body": "tell me about parrots 03", + "json_metadata": "{}" + } + }, + { + "type": "comment_operation", + "value": { + "parent_author": "", + "parent_permlink": "", + "author": "test-reblog-04", + "permlink": "parrot-04", + "title": "I love parrots 04", + "body": "tell me about parrot 04", + "json_metadata": "{}" + } + }, + { + "type": "comment_operation", + "value": { + "parent_author": "", + "parent_permlink": "", + "author": "test-reblog-05", + "permlink": "parrot-05", + "title": "I love parrots 05", + "body": "tell me about parrot 05", + "json_metadata": "{}" + } + }, + { + "type": "comment_operation", + "value": { + "parent_author": "", + "parent_permlink": "", + "author": "test-reblog-06", + "permlink": "parrot-06", + "title": "I love parrots 06", + "body": "tell me about parrot 06", + "json_metadata": "{}" + } + } + ], + "extensions": [], + "signatures": [ + "" + ] + } + ], "block_id": "004c4b3fc6a8735b4ab5433d59f4526e4a042644", "signing_key": "", "transaction_ids": [] }, - "5000000": { - "previous": "004c4b3fc6a8735b4ab5433d59f4526e4a042644", - "timestamp": "2016-09-15T19:47:21", + "5000000": { + "previous": "004c4b3fc6a8735b4ab5433d59f4526e4a042644", + "timestamp": "2016-09-15T19:47:21", + "witness": "initminer", + "transaction_merkle_root": "", + "extensions": [], + "witness_signature": "", + "transactions": [ + { + "ref_block_num": 100001, + "ref_block_prefix": 1, + "expiration": "2020-03-23T12:17:00", + "operations": [ + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "test-reblog-01" + ], + "id": "reblog", + "json": "{\"account\":\"test-reblog-01\",\"author\":\"test-reblog-02\",\"permlink\":\"parrot-02\"}" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "test-reblog-01" + ], + "id": "reblog", + "json": "{\"account\":\"test-reblog-01\",\"author\":\"test-reblog-03\",\"permlink\":\"parrot-03\"}" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "test-reblog-01" + ], + "id": "reblog", + "json": "{\"account\":\"test-reblog-01\",\"author\":\"test-reblog-04\",\"permlink\":\"parrot-04\"}" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "test-reblog-01" + ], + "id": "reblog", + "json": "{\"delete\":\"delete\",\"account\":\"test-reblog-01\",\"author\":\"test-reblog-04\",\"permlink\":\"parrot-04\"}" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "test-reblog-01" + ], + "id": "reblog", + "json": "{\"delete\":\"delete\",\"account\":\"test-reblog-01\",\"author\":\"test-reblog-03\",\"permlink\":\"parrot-03\"}" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "test-reblog-01" + ], + "id": "reblog", + "json": "{\"delete\":\"delete\",\"account\":\"test-reblog-01\",\"author\":\"test-reblog-02\",\"permlink\":\"parrot-02\"}" + } + } + ] + } + ], + "block_id": "004c4b40245ffb07380a393fb2b3d841b76cdaec", + "signing_key": "", + "transaction_ids": [] + }, + "5000001": { + "previous": "004c4b40245ffb07380a393fb2b3d841b76cdaec", + "timestamp": "2016-09-15T19:47:24", + "witness": "initminer", + "transaction_merkle_root": "", + "extensions": [], + "witness_signature": "", + "transactions": [ + { + "ref_block_num": 100001, + "ref_block_prefix": 1, + "expiration": "2020-03-23T12:17:00", + "operations": [ + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "test-reblog-02" + ], + "id": "reblog", + "json": "{\"account\":\"test-reblog-02\",\"author\":\"test-reblog-01\",\"permlink\":\"parrot-01\"}" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "test-reblog-02" + ], + "id": "reblog", + "json": "{\"account\":\"test-reblog-02\",\"author\":\"test-reblog-02\",\"permlink\":\"parrot-02\"}" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "test-reblog-02" + ], + "id": "reblog", + "json": "{\"account\":\"test-reblog-02\",\"author\":\"test-reblog-03\",\"permlink\":\"parrot-03\"}" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "test-reblog-03" + ], + "id": "reblog", + "json": "{\"account\":\"test-reblog-03\",\"author\":\"test-reblog-02\",\"permlink\":\"parrot-02\"}" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "test-reblog-03" + ], + "id": "reblog", + "json": "{\"account\":\"test-reblog-03\",\"author\":\"test-reblog-03\",\"permlink\":\"parrot-03\"}" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "test-reblog-03" + ], + "id": "reblog", + "json": "{\"account\":\"test-reblog-03\",\"author\":\"test-reblog-04\",\"permlink\":\"parrot-04\"}" + } + } + ] + } + ], + "block_id": "004c4b4100000000000000000000000000000000", + "signing_key": "", + "transaction_ids": [] + }, + "5000002": { + "previous": "004c4b4100000000000000000000000000000000", + "timestamp": "2016-09-15T19:47:27", + "witness": "initminer", + "transaction_merkle_root": "0000000000000000000000000000000000000000", + "extensions": [], + "witness_signature": "", + "transactions": [ + { + "ref_block_num": 100001, + "ref_block_prefix": 1, + "expiration": "2020-03-23T12:17:00", + "operations": [ + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "test-reblog-04" + ], + "id": "reblog", + "json": "{\"account\":\"test-reblog-04\",\"author\":\"test-reblog-04\",\"permlink\":\"parrot-04\"}" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "test-reblog-05" + ], + "id": "reblog", + "json": "{\"account\":\"test-reblog-05\",\"author\":\"test-reblog-05\",\"permlink\":\"parrot-05\"}" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "test-reblog-06" + ], + "id": "reblog", + "json": "{\"account\":\"test-reblog-06\",\"author\":\"test-reblog-06\",\"permlink\":\"parrot-06\"}" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "test-reblog-06" + ], + "id": "reblog", + "json": "{\"account\":\"test-reblog-06\",\"author\":\"test-reblog-06\",\"permlink\":\"parrot-06\"}" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "test-reblog-04" + ], + "id": "reblog", + "json": "{\"delete\":\"delete\",\"account\":\"test-reblog-04\",\"author\":\"test-reblog-04\",\"permlink\":\"parrot-04\"}" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "test-reblog-06" + ], + "id": "reblog", + "json": "{\"delete\":\"delete\",\"account\":\"test-reblog-06\",\"author\":\"test-reblog-06\",\"permlink\":\"parrot-06\"}" + } + } + ] + } + ], + "block_id": "004c4b4200000000000000000000000000000000", + "signing_key": "", + "transaction_ids": [] + }, + "5000003": { + "previous": "004c4b4200000000000000000000000000000000", + "timestamp": "2016-09-15T19:47:30", + "witness": "initminer", + "transaction_merkle_root": "0000000000000000000000000000000000000000", + "extensions": [], + "witness_signature": "", + "transactions": [ + { + "ref_block_num": 100001, + "ref_block_prefix": 1, + "expiration": "2020-03-23T12:17:00", + "operations": [ + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "test-reblog-05" + ], + "id": "reblog", + "json": "{\"delete\":\"delete\",\"account\":\"test-reblog-05\",\"author\":\"test-reblog-05\",\"permlink\":\"parrot-05\"}" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "test-reblog-06" + ], + "id": "reblog", + "json": "{\"delete\":\"delete\",\"account\":\"test-reblog-06\",\"author\":\"test-reblog-05\",\"permlink\":\"parrot-05\"}" + } + } + ] + } + ], + "block_id": "004c4b4300000000000000000000000000000000", + "signing_key": "", + "transaction_ids": [] + }, + "5000004": { + "previous": "004c4b4300000000000000000000000000000000", + "timestamp": "2016-09-15T19:47:33", + "witness": "initminer", + "transaction_merkle_root": "0000000000000000000000000000000000000000", + "extensions": [], + "witness_signature": "", + "transactions": [ + { + "ref_block_num": 100001, + "ref_block_prefix": 1, + "expiration": "2020-03-23T12:17:00", + "operations": [ + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "test-reblog-04" + ], + "id": "reblog", + "json": "{\"account\":\"test-reblog-04\",\"author\":\"test-reblog-04\",\"permlink\":\"parrot-04\"}" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "test-reblog-05" + ], + "id": "reblog", + "json": "{\"account\":\"test-reblog-05\",\"author\":\"test-reblog-05\",\"permlink\":\"parrot-05\"}" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "test-reblog-06" + ], + "id": "reblog", + "json": "{\"account\":\"test-reblog-06\",\"author\":\"test-reblog-06\",\"permlink\":\"parrot-06\"}" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "test-reblog-06" + ], + "id": "reblog", + "json": "{\"account\":\"test-reblog-06\",\"author\":\"test-reblog-05\",\"permlink\":\"parrot-05\"}" + } + }, + { + "type": "delete_comment_operation", + "value": { + "author": "test-reblog-04", + "permlink": "parrot-04" + } + }, + { + "type": "delete_comment_operation", + "value": { + "author": "test-reblog-05", + "permlink": "parrot-05" + } + } + ] + } + ], + "block_id": "004c4b4400000000000000000000000000000000", + "signing_key": "", + "transaction_ids": [] + }, + "5000005": { + "previous": "004c4b4400000000000000000000000000000000", + "timestamp": "2016-09-15T19:47:36", + "witness": "initminer", + "transaction_merkle_root": "0000000000000000000000000000000000000000", + "extensions": [], + "witness_signature": "", + "transactions": [ + { + "ref_block_num": 100001, + "ref_block_prefix": 1, + "expiration": "2020-03-23T12:17:00", + "operations": [ + { + "type": "delete_comment_operation", + "value": { + "author": "test-reblog-06", + "permlink": "parrot-06" + } + }, + { + "type": "comment_operation", + "value": { + "parent_author": "", + "parent_permlink": "", + "author": "test-reblog-01", + "permlink": "monkey-01", + "title": "I love monkeys 01", + "body": "tell me about monkeys 01", + "json_metadata": "{}" + } + }, + { + "type": "comment_operation", + "value": { + "parent_author": "", + "parent_permlink": "", + "author": "test-reblog-01", + "permlink": "monkey-02", + "title": "I love monkeys 02", + "body": "tell me about monkeys 02", + "json_metadata": "{}" + } + }, + { + "type": "comment_operation", + "value": { + "parent_author": "", + "parent_permlink": "", + "author": "test-reblog-01", + "permlink": "monkey-03", + "title": "I love monkeys 03", + "body": "tell me about monkeys 03", + "json_metadata": "{}" + } + }, + { + "type": "comment_operation", + "value": { + "parent_author": "", + "parent_permlink": "", + "author": "test-reblog-01", + "permlink": "monkey-04", + "title": "I love monkeys 04", + "body": "tell me about monkeys 04", + "json_metadata": "{}" + } + }, + { + "type": "comment_operation", + "value": { + "parent_author": "", + "parent_permlink": "", + "author": "test-reblog-01", + "permlink": "monkey-05", + "title": "I love monkeys 05", + "body": "tell me about monkeys 05", + "json_metadata": "{}" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "test-reblog-01" + ], + "id": "reblog", + "json": "{\"account\":\"test-reblog-01\",\"author\":\"test-reblog-01\",\"permlink\":\"monkey-01\"}" + } + }, + { + "type": "delete_comment_operation", + "value": { + "author": "test-reblog-01", + "permlink": "monkey-01" + } + } + ] + } + ], + "block_id": "004c4b4500000000000000000000000000000000", + "signing_key": "", + "transaction_ids": [] + }, + "5000006": { + "previous": "004c4b4500000000000000000000000000000000", + "timestamp": "2016-09-15T19:47:39", "witness": "initminer", - "transaction_merkle_root": "", + "transaction_merkle_root": "0000000000000000000000000000000000000000", "extensions": [], "witness_signature": "", "transactions": [ @@ -29,10 +880,10 @@ "value": { "required_auths": [], "required_posting_auths": [ - "funny" + "test-reblog-01" ], - "id": "follow", - "json": "[\"reblog\",{\"account\":\"funny\",\"author\":\"steemit\",\"permlink\":\"firstpost\"}]" + "id": "reblog", + "json": "{\"account\":\"test-reblog-01\",\"author\":\"test-reblog-01\",\"permlink\":\"monkey-02\"}" } }, { @@ -40,10 +891,10 @@ "value": { "required_auths": [], "required_posting_auths": [ - "funny" + "test-reblog-03" ], - "id": "follow", - "json": "[\"reblog\",{\"account\":\"funny\",\"author\":\"steak\",\"permlink\":\"streak-test\"}]" + "id": "reblog", + "json": "{\"account\":\"test-reblog-03\",\"author\":\"test-reblog-01\",\"permlink\":\"monkey-02\"}" } }, { @@ -51,87 +902,15 @@ "value": { "required_auths": [], "required_posting_auths": [ - "funny" + "test-reblog-04" ], - "id": "follow", - "json": "[\"reblog\",{\"account\":\"funny\",\"author\":\"dollarvigilante\",\"permlink\":\"another-billionaire-warns-of-catastrophic-depths-not-seen-in-5-000-years-and-emphasizes-gold\"}]" + "id": "reblog", + "json": "{\"account\":\"test-reblog-04\",\"author\":\"test-reblog-01\",\"permlink\":\"monkey-02\"}" } } ] } ], - "block_id": "004c4b40245ffb07380a393fb2b3d841b76cdaec", - "signing_key": "", - "transaction_ids": [] - }, - "5000001": { - "previous": "004c4b40245ffb07380a393fb2b3d841b76cdaec", - "timestamp": "2016-09-15T19:47:24", - "witness": "initminer", - "transaction_merkle_root": "", - "extensions": [], - "witness_signature": "", - "transactions": [], - "block_id": "004c4b4100000000000000000000000000000000", - "signing_key": "", - "transaction_ids": [] - }, - "5000002": { - "previous": "004c4b4100000000000000000000000000000000", - "timestamp": "2016-09-15T19:47:27", - "witness": "initminer", - "transaction_merkle_root": "0000000000000000000000000000000000000000", - "extensions": [], - "witness_signature": "", - "transactions": [], - "block_id": "004c4b4200000000000000000000000000000000", - "signing_key": "", - "transaction_ids": [] - }, - "5000003": { - "previous": "004c4b4200000000000000000000000000000000", - "timestamp": "2016-09-15T19:47:30", - "witness": "initminer", - "transaction_merkle_root": "0000000000000000000000000000000000000000", - "extensions": [], - "witness_signature": "", - "transactions": [], - "block_id": "004c4b4300000000000000000000000000000000", - "signing_key": "", - "transaction_ids": [] - }, - "5000004": { - "previous": "004c4b4300000000000000000000000000000000", - "timestamp": "2016-09-15T19:47:33", - "witness": "initminer", - "transaction_merkle_root": "0000000000000000000000000000000000000000", - "extensions": [], - "witness_signature": "", - "transactions": [], - "block_id": "004c4b4400000000000000000000000000000000", - "signing_key": "", - "transaction_ids": [] - }, - "5000005": { - "previous": "004c4b4400000000000000000000000000000000", - "timestamp": "2016-09-15T19:47:36", - "witness": "initminer", - "transaction_merkle_root": "0000000000000000000000000000000000000000", - "extensions": [], - "witness_signature": "", - "transactions": [], - "block_id": "004c4b4500000000000000000000000000000000", - "signing_key": "", - "transaction_ids": [] - }, - "5000006": { - "previous": "004c4b4500000000000000000000000000000000", - "timestamp": "2016-09-15T19:47:39", - "witness": "initminer", - "transaction_merkle_root": "0000000000000000000000000000000000000000", - "extensions": [], - "witness_signature": "", - "transactions": [], "block_id": "004c4b4600000000000000000000000000000000", "signing_key": "", "transaction_ids": [] @@ -143,7 +922,110 @@ "transaction_merkle_root": "0000000000000000000000000000000000000000", "extensions": [], "witness_signature": "", - "transactions": [], + "transactions": [ + { + "ref_block_num": 100001, + "ref_block_prefix": 1, + "expiration": "2020-03-23T12:17:00", + "operations": [ + { + "type": "delete_comment_operation", + "value": { + "author": "test-reblog-01", + "permlink": "monkey-02" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "test-reblog-03" + ], + "id": "reblog", + "json": "{\"delete\":\"delete\",\"account\":\"test-reblog-03\",\"author\":\"test-reblog-04\",\"permlink\":\"parrot-04\"}" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "test-reblog-01" + ], + "id": "reblog", + "json": "{\"account\":\"test-reblog-01\",\"author\":\"test-reblog-01\",\"permlink\":\"monkey-03\"}" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "test-reblog-02" + ], + "id": "reblog", + "json": "{\"account\":\"test-reblog-02\",\"author\":\"test-reblog-01\",\"permlink\":\"monkey-03\"}" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "test-reblog-03" + ], + "id": "reblog", + "json": "{\"account\":\"test-reblog-03\",\"author\":\"test-reblog-01\",\"permlink\":\"monkey-03\"}" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "test-reblog-04" + ], + "id": "reblog", + "json": "{\"account\":\"test-reblog-04\",\"author\":\"test-reblog-01\",\"permlink\":\"monkey-03\"}" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "test-reblog-05" + ], + "id": "reblog", + "json": "{\"account\":\"test-reblog-05\",\"author\":\"test-reblog-01\",\"permlink\":\"monkey-03\"}" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "test-reblog-05" + ], + "id": "reblog", + "json": "{\"account\":\"test-reblog-05\",\"author\":\"test-reblog-01\",\"permlink\":\"monkey-04\"}" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "test-reblog-05" + ], + "id": "reblog", + "json": "{\"account\":\"test-reblog-05\",\"author\":\"test-reblog-01\",\"permlink\":\"monkey-05\"}" + } + } + ] + } + ], "block_id": "004c4b4700000000000000000000000000000000", "signing_key": "", "transaction_ids": [] @@ -155,7 +1037,59 @@ "transaction_merkle_root": "0000000000000000000000000000000000000000", "extensions": [], "witness_signature": "", - "transactions": [], + "transactions": [ + { + "ref_block_num": 100001, + "ref_block_prefix": 1, + "expiration": "2020-03-23T12:17:00", + "operations": [ + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "test-reblog-05" + ], + "id": "reblog", + "json": "{\"delete\":\"delete\",\"account\":\"test-reblog-05\",\"author\":\"test-reblog-01\",\"permlink\":\"monkey-04\"}" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "test-reblog-05" + ], + "id": "reblog", + "json": "{\"account\":\"test-reblog-05\",\"author\":\"test-reblog-01\",\"permlink\":\"monkey-04\"}" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "test-reblog-05" + ], + "id": "reblog", + "json": "{\"delete\":\"delete\",\"account\":\"test-reblog-05\",\"author\":\"test-reblog-01\",\"permlink\":\"monkey-04\"}" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "test-reblog-05" + ], + "id": "reblog", + "json": "{\"delete\":\"delete\",\"account\":\"test-reblog-05\",\"author\":\"test-reblog-01\",\"permlink\":\"monkey-04\"}" + } + } + ] + } + ], "block_id": "004c4b4800000000000000000000000000000000", "signing_key": "", "transaction_ids": [] @@ -167,10 +1101,34 @@ "transaction_merkle_root": "0000000000000000000000000000000000000000", "extensions": [], "witness_signature": "", - "transactions": [], + "transactions": [ + { + "ref_block_num": 100001, + "ref_block_prefix": 1, + "expiration": "2020-03-23T12:17:00", + "operations": [ + { + "type": "delete_comment_operation", + "value": { + "author": "test-reblog-01", + "permlink": "monkey-04" + } + } + ] + } + ], "block_id": "004c4b4900000000000000000000000000000000", "signing_key": "", - "transaction_ids": [] + "transaction_ids": [ + { + "ref_block_num": 100001, + "ref_block_prefix": 1, + "expiration": "2020-03-23T12:17:00", + "operations": [ + ] + } + + ] }, "5000010": { "previous": "004c4b4900000000000000000000000000000000", @@ -179,7 +1137,15 @@ "transaction_merkle_root": "0000000000000000000000000000000000000000", "extensions": [], "witness_signature": "", - "transactions": [], + "transactions": [ + { + "ref_block_num": 100001, + "ref_block_prefix": 1, + "expiration": "2020-03-23T12:17:00", + "operations": [ + ] + } + ], "block_id": "004c4b4a00000000000000000000000000000000", "signing_key": "", "transaction_ids": [] @@ -191,7 +1157,15 @@ "transaction_merkle_root": "0000000000000000000000000000000000000000", "extensions": [], "witness_signature": "", - "transactions": [], + "transactions": [ + { + "ref_block_num": 100001, + "ref_block_prefix": 1, + "expiration": "2020-03-23T12:17:00", + "operations": [ + ] + } + ], "block_id": "004c4b4b00000000000000000000000000000000", "signing_key": "", "transaction_ids": [] @@ -268,4 +1242,4 @@ "signing_key": "", "transaction_ids": [] } -} \ No newline at end of file +} diff --git a/run_server_sync.sh b/run_server_sync.sh new file mode 100755 index 0000000000000000000000000000000000000000..b7fe66ea06744e5ab5c74c65861f29c9275eabdd --- /dev/null +++ b/run_server_sync.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +# RUNNER_HIVEMIND_SYNC_MAX_BLOCK=5000017 +# RUNNER_HIVED_URL='{"default" : "192.168.6.136:8091"}'' +# RUNNER_POSTGRES_APP_USER=user +# RUNNER_POSTGRES_APP_USER_PASSWORD=password +# RUNNER_POSTGRES_HOST=localhost +# RUNNER_POSTGRES_PORT=5432 +# HIVEMIND_DB_NAME=hivemind + +# ./run_server_sync.sh 5000017 '{"default" : "192.168.6.136:8091"}' mario_user mario_password localhost 5432 hivemind + +export RUNNER_HIVEMIND_SYNC_MAX_BLOCK=$1 +export RUNNER_HIVED_URL=$2 +export RUNNER_POSTGRES_APP_USER=$3 +export RUNNER_POSTGRES_APP_USER_PASSWORD=$4 +export RUNNER_POSTGRES_HOST=$5 +export RUNNER_POSTGRES_PORT=$6 +export HIVEMIND_DB_NAME=$7 + +HIVE_SYNC_PATH="./scripts/ci/hive-sync.sh" + +"$HIVE_SYNC_PATH" diff --git a/tests/tests_api b/tests/tests_api index c42a9d5fd7061916beb66c2306588afa7c7a70a1..395f7109b2544cd1ace33a6027a0078d65fb1722 160000 --- a/tests/tests_api +++ b/tests/tests_api @@ -1 +1 @@ -Subproject commit c42a9d5fd7061916beb66c2306588afa7c7a70a1 +Subproject commit 395f7109b2544cd1ace33a6027a0078d65fb1722