Skip to content
I

ICDF2C22 - Shedding Light on Monopoly

Shedding Light on Monopoly: Temporal Analysis of Drug Trades

DOLEJŠKA Daniel, VESELÝ Vladimír, PLUSKAL Jan and KOUTENSKÝ Michal. Shedding Light on Monopoly: Temporal Analysis of Drug Trades. In: 13th EAI International Conference, ICDF2C 2022, Boston, MA, November 16-18, 2022, Proceedings. Lecture Notes of the Institute for Computer Sciences, Social Informatics and Telecommunications Engineering. Boston, MA, US: Springer Nature Switzerland AG, 2022, pp. 151-168. ISBN 978-3-031-36573-7. ISSN 1867-8211. Available from: link.springer.com

Dark marketplaces pioneered a new way to monetise illicit goods. A unique combination of technologies (such as overlay networks, end-to-end encryption, and cryptocurrencies) guarantees anonymity for dark marketplace users (including operators, vendors, and buyers).

We have developed a tool for monitoring and investigating dark marketplaces (namely, collecting and processing evidence directly from their websites), which we used for real-time detection of various illicit activities.

This paper presents a well-described and structured dataset that contains high-frequency web-scraped information from Monopoly Market (one of the most popular dark marketplaces in 2021). The evaluation demonstrates how high-resolution temporal analysis can reveal mission-critical information about the frequency of trades, vendor activities, and the drug market.

Graphs & Queries

This section presents queries used to generate graphs and analytics presented in the article.

Website Page Visits per Day

stat_counts-by_day

Click to show SQL
SELECT date.day,
       COALESCE(counts.count, 0) as scrape_count
FROM (
    SELECT t.day::date
    FROM generate_series(timestamp '2021-02-25', timestamp '2021-12-31', interval '1 day') AS t(day)
) date
LEFT JOIN (
    SELECT DATE(stats.created_at) AS day, COUNT(*) as count
    FROM product__stats stats
    GROUP BY 1
) counts ON date.day = counts.day;

Advertised product count by the number of advertising vendors

vendor-product-counts

Click to show SQL
SELECT vi.name AS "Vendor Name",
       count(vi.id) AS "Product Count"
FROM product__items pi
INNER JOIN vendor__items vi on pi.vendor_id = vi.id
GROUP BY 1;

Registered vendor count weekly

vendor_count_over_time

Click to show SQL
SELECT dates.day AS "First Day of Week",
       COUNT(DISTINCT vi.id) AS "Vendor Count"
FROM (
    SELECT t.day::date
    FROM generate_series('2021-04-05', '2021-12-28', interval '1 week') AS t(day)
) dates
LEFT JOIN vendor__items vi ON vi.created_at < dates.day
GROUP BY 1
ORDER BY 1;

Origin country product sales

country_of_origin-sales-1

Click to show SQL
SELECT product_origins.value AS "Country of Origin",
       SUM(sales_delta) AS "Product Sales"
FROM product__stats s
LEFT JOIN (
    SELECT pm.product_id,
           pm.value
    FROM product__meta pm
    WHERE pm.name = 'origin'
    GROUP BY 1, 2
) product_origins ON product_origins.product_id = s.product_id
GROUP BY 1
ORDER BY 1;

Cumulative sales per category

cumulative_sales_per_category

Click to show SQL
SELECT time_bucket('12h', ps.created_at) AT TIME ZONE 'UTC' AS timeslot,
       pc2.name AS "Category Name",
       SUM(SUM(sales_delta)) OVER (PARTITION BY pc2.name ORDER BY time_bucket('12h', ps.created_at) AT TIME ZONE 'UTC') AS "Sales",
       SUM(SUM(sales_delta)) OVER (ORDER BY time_bucket('12h', ps.created_at) AT TIME ZONE 'UTC') AS "Sales Total"
FROM product__stats ps
INNER JOIN product__items pi on pi.id = ps.product_id
INNER JOIN product__categories pc on pc.id = pi.category_id
INNER JOIN product__categories pc2 ON pc2.id = pc.parent_id
WHERE ps.created_at BETWEEN '2021-03-01' AND '2021-12-28'
GROUP BY 1, 2
ORDER BY 1, 2;

Counts of detected individual product purchases over time

purchases-time_heatmap

Click to show SQL
SELECT time_bucket('15 minutes', created_at) AT TIME ZONE 'UTC' AS timeslot,
       SUM(sales_delta) as sales
FROM product__stats
WHERE created_at >= '2021-08-12 22:12:08'
  AND created_at <= '2021-09-22 20:58:40'
GROUP BY 1
ORDER BY 1;