code: func ReadTransaction(db ethdb.Reader, hash common.Hash) (*types.Transaction, common.Hash, uint64, uint64) {
  	blockNumber := ReadTxLookupEntry(db, hash)
  	if blockNumber == nil {
  		return nil, common.Hash{}, 0, 0
  	}
  	blockHash := ReadCanonicalHash(db, *blockNumber)
  	if blockHash == (common.Hash{}) {
  		return nil, common.Hash{}, 0, 0
  	}
  	body := ReadBody(db, blockHash, *blockNumber)
  	if body == nil {
  		log.Error("Transaction referenced missing", "number", blockNumber, "hash", blockHash)
  		return nil, common.Hash{}, 0, 0
  	}
  	for txIndex, tx := range body.Transactions {
  		if tx.Hash() == hash {
  			return tx, blockHash, *blockNumber, uint64(txIndex)
  		}
  	}
  	log.Error("Transaction not found", "number", blockNumber, "hash", blockHash, "txhash", hash)
  	return nil, common.Hash{}, 0, 0
  }
docs: // ReadTransaction retrieves a specific transaction from the database, along with
  // its added positional metadata.