Skip to content

/v1/pipeline/transactions/status always returns 404 #5527

@nvzhu

Description

@nvzhu

Bug Report: /v1/pipeline/transactions/status always returns 404

Environment

  • Branch: i23
  • Commit: 4bb50ebc3 (rm trash)
  • Network: 2-peer localnet (also reproduced on 4-peer)
  • Date: 2026-01-16

Summary

The endpoint /v1/pipeline/transactions/status returns HTTP 404 for ALL transactions - both queued and committed. This breaks SDK polling flow for transaction confirmation.

Steps to Reproduce

# 1. Deploy fresh localnet
cd /path/to/iroha
target/debug/kagami localnet --out-dir /tmp/localnet --peers 2 --seed Iroha --sample-asset \
  --base-api-port 8080 --base-p2p-port 33337 --bind-host 127.0.0.1 --public-host 127.0.0.1
cd /tmp/localnet && IROHAD_BIN=/path/to/iroha/target/debug/irohad ./start.sh
sleep 15

# 2. Submit a transaction
CLI=/path/to/iroha/target/debug/iroha
CFG=/tmp/localnet/client.toml
$CLI --config $CFG asset mint --id "rose#wonderland#ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland" --quantity 100

# 3. Get transaction hash from Torii logs
TX_HASH=$(grep "enqueuing tx=" /tmp/localnet/peer0.log | tail -1 | sed 's/.*tx=//')
echo "Hash: $TX_HASH"

# 4. Check pipeline status - returns 404
curl -v "http://127.0.0.1:8080/v1/pipeline/transactions/status?hash=$TX_HASH"

Expected Behavior

For a queued transaction:

{"kind":"Queued","content":{"hash":"...","status":{"kind":"Queued"}}}

For a committed transaction:

{"kind":"Applied","content":{"hash":"...","status":{"kind":"Applied"},"block_height":69}}

Actual Behavior

Always returns:

HTTP/1.1 404 Not Found

Test Results

Test Condition Result
1 Queued tx (immediately after submit) 404
2 Committed tx (Torii hash) 404
3 Committed tx (Explorer hash) 404
4 Multiple attempts over 15 seconds All 404
5 All hashes from explorer All 404

Additional Finding: Hash Mismatch

The same transaction shows different hashes in different places:

Same transaction (verified by matching created_at and signature):

  • Torii logs: 7ce9ede526a1fb91f5434d42b776aa6aec71d43d243a9e05548fee702af2dd8d
  • Explorer API: 10cd8d4611f56c7703e30906a5caf4b7cb6eb8325f87cf8e68c2102058f84edb

Root cause:

  • Explorer uses tx.hash_as_entrypoint() at explorer.rs:724
  • Torii/SDK uses SignedTransaction::hash()

These produce different hashes because hash_as_entrypoint() wraps the transaction in TransactionEntrypoint::External(...) before hashing.

Code Analysis

In lib.rs:10072-10096, pipeline_status_from_state():

fn pipeline_status_from_state(app: &AppState, hash: &HashOf<SignedTransaction>) -> Option<PipelineStatusEntry> {
    let height = app.state.view().transactions().get(hash)?;  // <- Returns None
    // ...
}

The function also checks the queue at line 10126-10137:

if app.queue.all_transactions(&view).any(|tx| tx.as_ref().hash() == hash) {
    // Should return Queued status
}

But neither path returns a result.

Impact

  • IrohaSwift SDK submitAndWait() times out
  • IrohaJS waitForTransactionStatus() fails
  • Android SDK transaction confirmation broken
  • Any client polling for transaction status cannot confirm transactions

Suggested Investigation

  1. Why does state.view().transactions().get(hash) return None for committed transactions?
  2. Why does queue.all_transactions() not find queued transactions?
  3. Should explorer and pipeline status use the same hash function?

Logs

Torii accepts and enqueues the transaction:

2026-01-15T20:11:05.625983Z INFO iroha_torii::routing: transaction accepted by Torii; enqueuing tx=7ce9ede526a1fb91f5434d42b776aa6aec71d43d243a9e05548fee702af2dd8d

Later shows it's already in blockchain:

2026-01-15T20:11:14.956167Z WARN iroha_core::queue: dropping transaction during queue pop (check_tx) tx=7ce9ede526a1fb91f5434d42b776aa6aec71d43d243a9e05548fee702af2dd8d e=InBlockchain

Transaction is committed successfully (visible in explorer with different hash).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions