Related to ticket 526 : Transaction Links

The user in ticket 526 has 3 concerns that we can address:

Concern one Inconsistent Links for the Same Transaction. Right now, different block explorers use different URLs for the exact same transaction. Sample Transaction ID: 9b21c4345492472dbb33cfb51a8e4cd03a5df2e2

Block Explorer Transaction URL Schema Example Link (Clickable)
HiveHub https://hivehub.dev/tx/{transaction_id} https://hivehub.dev/tx/9b21c4345492472dbb33cfb51a8e4cd03a5df2e2
Hivescan https://hivescan.info/transaction/{transaction_id} https://hivescan.info/transaction/9b21c4345492472dbb33cfb51a8e4cd03a5df2e2
PeakD https://peakd.com/tx/{transaction_id} https://peakd.com/tx/9b21c4345492472dbb33cfb51a8e4cd03a5df2e2
Ecency https://ecency.com/tx/{transaction_id} https://ecency.com/tx/9b21c4345492472dbb33cfb51a8e4cd03a5df2e2
Hiveblocks https://hiveblocks.com/tx/{transaction_id} https://hiveblocks.com/tx/9b21c4345492472dbb33cfb51a8e4cd03a5df2e2
BlockTrades https://blocktrades.us/transaction/{transaction_id} https://blocktrades.us/transaction/9b21c4345492472dbb33cfb51a8e4cd03a5df2e2

Solution: Change /transaction/ into /tx/ and all the links pointing to it in the explorer


Concern Two: Can't Link to a Specific Action Inside a Transaction. A single Hive transaction can contain multiple actions (e.g., you post a comment and upvote it at the same time). He wants a way to link directly to the second action (the upvote), not just the whole transaction.

Example https://hivescan.info/block/99671431 : If the user clicks on the transaction comment options >> he is redirected to the transaction page >> and needs to fetch again among records the specific transaction he selected.

Solution: :

  1. On the operations table, we can make the whole record clickable
  2. We can stop propagation for any other links in the record table
  3. Highlight the specific transaction the user clicked on inside the transaction page

Concern three: https://hivehub.dev/b/99670897 click on a virtual operation >> producer reward https://hivehub.dev/tx/99672087/0000000000000000000000000000000000000000/1

Observe how a virtual operation has a specific record

The Explanation: Receipts vs. Automatic Memos

Think about a transaction on the blockchain this way:

  1. A Regular Transaction (comment, vote, transfer): This is like a receipt you get from a store. You, the user, initiated the action. The receipt has a unique ID (transaction_id) that confirms you completed the transaction. It's a direct record of your action.

  2. A Virtual Operation (producer_reward, interest): This is like an automatic memo the store's accounting system prints for its own records after a day of business. The memo might say, "Total interest paid to savings accounts: $50.00". You, the user, did not create this memo directly. It was automatically generated by the system's rules.

These "automatic memos" are what we call Virtual Operations (or "vops").

The Key Technical Difference:

  • A regular transaction has its own unique transaction_id.
  • A virtual operation does not have a transaction_id. It's not an independent event; it's a consequence or a scheduled action of the blockchain's rules.

The Linking Problem: How can you create a web link to something that has no unique ID? You can't use the standard .../tx/{id} format because there is no ID to put there.

This is why most explorers can't link to them. The only way to find a producer_reward is to:

  1. Go to the block it was included in.
  2. Manually scroll through the list of operations in that block until you find it.

Solution :

Since every virtual operation happens inside a specific block, we create a new way to link to them using the Block Number and the operation's position within that block.

The format is: .../block/{block_number}#vop_in_block=N

  • .../block/{block_number}: This part tells the explorer which block to load.
  • #vop_in_block=N: This is the deep-link command. It tells the webpage's JavaScript, "After you load the block, find the Nth virtual operation in the list and scroll me directly to it"
  • { "op": { "type": "comment_payout_update_operation", "value": { "author": "jfang003", "permlink": "my-hive-goals-for-2025-week-37-2ym" } }, "block": 99670471, "trx_id": null, ** "op_pos": 166,** ======> This is what we can use "op_type_id": 61, "timestamp": "2025-09-23T04:50:39", "virtual_op": true, "operation_id": "428081413321961021", "trx_in_block": -1 },

This creates a unique, shareable address for every single virtual operation on the blockchain.

Edited by Dima Rifai