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: :
- On the operations table, we can make the whole record clickable
- We can stop propagation for any other links in the record table
- 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:
-
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. -
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:
- Go to the block it was included in.
- 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.