Pull to refresh

Деанонимизация транзакций датасета Elliptic

Reading time 4 min
Views 4K

Всем привет, меня зовут Александр, и я data scientist в компании Clain. Мы занимаемся анализом блокчейн транзакций на предмет их аффилированности к преступным действиям, таким, как обналичка, кражи, финансирование терроризма и подобное.


Регуляторки по криптовалютам ужесточаются с каждым годом, и сейчас компании обязаны соответствовать политикам AML \ KYC. Примерно этим же занимается компания Elliptic, которая в начале августа 2019 года опубликовала размеченный датасет из 200к биткойн транзакций.


Основная цель их публикации – дать криптосообществу реальные данные, чтобы тестировать новые подходы выявления сомнительных транзакций, используя как набор стандартных атрибутов (число входов и выходов, переводимые суммы, отчисления майнерам и т.д.), так и топологию графа, построенного на этих транзакциях. Датасет является анонимизированным и имеет 167 атрибутов. Все они имеют нулевое среднее и единичную дисперсию кроме первого, который является айдишником, и второго – характеризует время от 1 до 49, что соответствует компонентам графа транзакций.


По данным файла elliptic_txs_edgelist.csv можно построить направленный граф и посчитать входящую и исходящую степень каждой транзакции txId. Это позволяет примерно (так как граф вырезан из целого блокчейна и часть связей потеряны) оценить количество адресов отправителей и получателей для каждой транзакции. В табличке elliptic_txs_features.csv проименуем колонки в виде V1 — V167 и сразу заменим V1 на txId, V2 на elliptic_time. Часть атрибутов лучше остальных коррелируют с величиной входящей и исходящей степени графа: cor(out-degree,V16) = 0.689, cor(out-degree,V7) = 0.680, cor(in-degree,V6) = 0.589, cor(in-degree,V8) = 0.582. Посмотрим на эти переменные.


image
Scatterplot смещенной переменной V6 и входящей степени графа из elliptic_txs_edgelist


По графику видно, что для каждого значения in-degree существует верхний предел значений V6, кроме того, если отсортировать V6 и найти разницу между близкими значениями, то она будет меняться как целое число умноженное на константу:


image
Уникальные значения изменения отсортированного V6 (diff_V6), встречаемая частота (Freq) значений diff_V6 и отношение diff_V6 к минимальному значению из diff_V6.


В таблице изменений V6 можно видеть что 0.075038 встречается намного чаще остальных значений и вероятно связано с изменением величины in-degree на 1. С учетом того, что минимальное количество входов в транзакцию равно 1 (если это не coinbase транзакция), запишем:


inputs_count_V6 = (V6 — min(V6)) / min(diff_V6) + 1.


После схожего анализа для V7, V8, V16:


  • inputs_count_V6 = 13.3266685112665 * V6 + 2.62544842444139,
  • inputs_unique_count_V8 = 11.9243179897452 * V8 + 2.34747189219164,
  • outputs_count_V7 = 50.3777694891647 * V7 + 4.21030186142152,
  • outputs_unique_count_V16 = 49.3957564403755 * V16 + 4.121809499973.

Здесь inputs_count_V6 – полное количество входов в транзакцию, inputs_unique_count_V8 – количество уникальных входов в транзакцию, outputs_count_V7 – количество выходов из транзакции, outputs_unique_count_V16 – количество уникальных выходов.


Может возникнуть вопрос – почему для inputs_count сопоставлено V6, а не V8? Ответ прост, всегда inputs_count >= inputs_unique_count, и подставив значения V6 и V8 из elliptic_txs_features.csv в указанные формулы, можно убедиться, что неравенство (13.3266685112665 V6 + 2.62544842444139) >= (11.9243179897452 V8 + 2.34747189219164) выполняется так же всегда, что позволяет корректно соотнести между собой V6, V8, inputs_count и inputs_unique_count. То же самое для outputs_count и outputs_unique_count.


После того как нашли число входов и выходов, а также число уникальных входов и уникальных выходов, можно найти транзакции, у которых комбинации указанных чисел встречаются только один раз за всю историю биткойна (до момента публикации датасета Elliptic). Это позволяет найти уникальные транзакции и примерное время для каждого значения elliptic_time:


image
Дата найденных уникальных транзакций для каждого elliptic_time.


По графику выше видно, что дата линейно зависит от elliptic_time:
approx_time = 1450468509.80488 + 1155672.19512195 * elliptic_time.
Тут approx_time – примерный unixtime для каждого elliptic_time. И так как elliptic_time меняется от 1 до 49, дата approx_time меняется от 2016-01-01 до 2017-10-04, с шагом 1155672.19512195 / 3600 / 24 = 13.37584 дней.


С учетом временных ограничений на возможные транзакции и комбинаций уникального количества входов и выходов можно найти 189 транзакций, которые подходят под данные условия и встречаются во всем блокчейне биткойна только 1 раз. Например транзакция с 1 входом и 13107 выходами существует только одна – dd9f6bbf80ab36b722ca95d93268667a3ea6938288e0d4cf0e7d2e28a7a91ab3.


Теперь можно найти другие характеристики транзакций, такие, как fee, а также суммарный входной (total_in_value) и выходной (total_out_value) объем в сатоши. Поиск корреляций и линейная регрессия помогают это сделать быстро, приведу только конечные формулы:


  • fee_V4 = 81341.4537626213 + 386323.710952989 * V4,
  • total_out_value_V3 = 2742460603.92287 + 15853961614.9796 * V3.

Искомую величину total_in_value найдем из равенства:
total_in_value = total_out_value + fee.


Суммарная найденная информация позволяет идентифицировать 92.9% всех транзакций датасета Elliptic. Другую часть можно раскрыть, если использовать граф транзакций из elliptic_txs_edgelist.csv, сравнив его с графом, построенным на множестве подходящих транзакций с их связями, записанными в блокчейне, это добавляет еще 6.6%.


Таким образом легко раскрываются 99.5% всех анонимных транзакций, оставшиеся 0.5% также можно идентифицировать, но время, потраченное на их деанонимизацию, вероятно, будет сопоставимо с потраченным временем на уже раскрытую часть транзакций. Деанонимизированный датасет можно посмотреть здесь. А тут исходные данные Elliptic .

Tags:
Hubs:
+9
Comments 4
Comments Comments 4

Articles