Сколько биткойнов было переведено с одного кошелька на другой? - PullRequest
0 голосов
/ 13 июня 2019

Проблема проста: я хочу узнать, сколько BTC было переведено из кошелька A в кошелек B с таким количеством прыжков, сколько блоков в блокчейне.

Пример.

A transferred 1 BTC to C and 1 BTC to D.
C transferred 0.1 to B
D transferred 0.5 to E and 0.5 to F
E transferred 0.1 to B

Всего 0,2 BTC переведено из A в B

Я полагаю, я мог бы сделать это, используя bigquery на блокчейне.Проблема в том, что я не знаю, как создать такой рекурсивный запрос.Мои навыки SQL стремятся к нулю.

Причина благородна.У меня есть несколько адресов, которые использовались в схеме 1. Понци. У меня есть другой набор адресов, которые используются в ДРУГОЙ схеме, и я считаю, что это еще одно мошенническое (2) отмывание денег из схемы 1.

Я знаю, кто стоит за мошенничеством 2.

Если я докажу, что большое количество BTC с первого жульничества поступило в кошельки, связанные со вторым мошенничеством, это может быть убедительным свидетельством того, что они являютсято же самое.

Обратите внимание, что я сказал большое количество BTC.Я знаю, что некоторые из BTC могут случайно оказаться в кошельках схемы 2, но для большинства в конечном итоге это не совпадение.

Раскрытие информации: Я НЕ Получая какие-либо финансовые выгоды от этого, я лишь намерен раскрыть этот мошенник.

1 Ответ

0 голосов
/ 13 июня 2019

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

Sql Fiddle

DECLARE @T TABLE(ChainID INT, SourceID INT, TargetID INT, Amount INT)
INSERT @T VALUES
(1,100,300,1),
(2,900,800,1),
(1,100,400,1),
(2,800,700,1),
(1,300,200,1),
(1,400,500,1),
(2,700,600,1),
(1,500,600,1),
(1,500,200,1),
(2,600,500,1),
(2,500,400,1)

 DECLARE @ChainID INT = 2

 --Get the first source of a chain !If natural order, if there is a more suitable order field then use it!
 DECLARE @StartID INT = (SELECT SourceID FROM (SELECT SourceID,RN=ROW_NUMBER() OVER (ORDER BY ChainID) FROM @T WHERE ChainID = @ChainID ) AS X WHERE RN=1)

;WITH RecursiveWalk AS
(   
        --Anchor
    SELECT 
        SourceID, 
        TargetID = T.TargetID,
        LevelID = 1
    FROM 
        @T T
    WHERE 
        T.SourceID = @StartID AND ChainID = @ChainID

    UNION ALL

        --Recursive bit
    SELECT 
        T.SourceID, 
        TargetID = T.TargetID,
        LevelID = LevelID + 1 
    FROM 
        @T T 
        INNER JOIN RecursiveWalk RW ON T.SourceID = RW.TargetID
    WHERE
        ChainID=@ChainID
)

SELECT 
    SourceID,
    TargetID,
    LevelID
FROM 
    RecursiveWalk
...