Záhada Bitcoinů v pohybu: z peněženek Nuclea odcházely i v noci po dealerově zatčení

9. 6. 2025
Doba čtení: 7 minut

Sdílet

Autor: Depositphotos
Na dalších 9 let pak tyto adresy usnuly, než se znovu probudily v kanceláři znalce Jiřího Bergera den před darem Blažkovu ministerstvu.

V kauze darované miliardy v Bitcoinech, která vedla k pádu ministra spravedlnosti Pavla Blažka, se jen pozvolna objevují nové poznatky umožňující postupně pochopit pozadí kryptoměnové aféry v časových a věcných souvislostech. V předchozích dvou analýzách bitcoinového blockchainu jsme si ukázali, že miliardy v nejznámější kryptoměně se daly do pohybu už den před samotným darem Ministerstvu spravedlnosti a také okamžitě poté, co notář osvědčující průběh daru kancelář znalce Jiřího Bergera opustil.

Celkově se tak v oba dny „roztočilo“ 1511,19895438 BTC (tedy 3,431 mld. Kč) z adres spojovaných s tržištěm Nucleus Market. Když od nich odečteme 468,468 BTC darovaných Blažkovu úřadu, zůstává tu 1042,730 BTC, ke kterým Jiřikovský získal navrácením výpočetní techniky zcela nezpochybnitelně přístup. Také víme, že 100 BTC (227,068 mil. Kč) z této částky se přes adresu 3c6cd33b71 někdo pokusil opakovaně rozměňovat, a to i na konci května, kdy už kauza naplno rezonovala v médiích. A další kryptoaktiva skončila po částech akumulována na několika peněženkách, kde s nimi od té doby zatím nikdo nehnul.

Hlavní otazníky dále visí nad rolí znalce Bergera, především den před realizací daru ministerstvu, a také nad celkovým bohatstvím, ke kterému Jiřikovský získal opětovný přístup. Na jednu stranu nová zjištění posilují pochybnosti, že by Jiřikovský byl jediným, kdo ovládal všechny adresy tržiště Nucleus, a tedy, že celých 5366 BTC, které na začátku března byly na adresách spojovaných s Nucleem, měl Jiřikovský takříkajíc pod palcem. 

Na stranu druhou, jak si na závěr ukážeme, s největší pravděpodobností musel po navrácení části zabavené techniky ovládat mnohem více adres, než kolik nakonec uvolnilo své bohatství. Viděl znalec Berger na úložky ve vyšším úhrnu, než nakonec ukázal screenshot předaný notáři? A co mohlo být účelem transakcí, které se odehrály před vlastním darem? Na to budeme hledat odpovědi.

Související analýzy:

Bitcoiny z ministerské kauzy někdo až do konce května opakovaně rozměňoval Přečtěte si také:

Bitcoiny z ministerské kauzy někdo až do konce května opakovaně rozměňoval

Spící peněženka z bitcoinové kauzy obživla jen na dva dny. Miliardy z ní mizely před darem i po něm Přečtěte si také:

Spící peněženka z bitcoinové kauzy obživla jen na dva dny. Miliardy z ní mizely před darem i po něm

Účetní knihy, co nikdo neskartuje

Dnešní blockchainovou analytiku nasměrujeme devět let nazpátek, dávno předtím, než bitcoinová kauza propukla. A znovu si tím naplno potvrdíme jako zcela lichý předpoklad, že by kryptoměny měly být pro zastření podezřelých transakcí vhodné. Zatímco v reálném světě by účetnictví spolu se všemi doklady bylo po tak dlouhé době s vysokou pravděpodobností už dávno zcela skartované a nedohledatelné, u kryptoaktiv se neztratí nic. Jednou provždy jsou v blockchainu uloženy všechny proběhlé transakce.

Jiná věc je jejich anonymita. Až do března, kdy byla transakce „propálena“ notářským zápisem o daru ministerstvu a daly se tím zdrojové adresy celé transakce ztotožnit s adresami patřícími k Nucleu, nebyl důvod Jiřikovského s tímto darknetovým tržištěm spojovat. To se však změnilo v okamžiku, kdy vyšlo najevo, že 6 let spící peněženky Nuclea Jiřikovský ovládá.

Napřed ale trocha teorie. Bitcoin, ač jeho základní principy jsou dané a neměnné, se v jednom ohledu vyvíjí. Změnou procházejí kryptografické techniky používané pro tvorbu (či odvození) bitcoinových adres (peněženek). Jako jedny z prvních se používaly P2PKH adresy, začínající číslicí „1“, dnes jsou označovány jako Legacy. Zcela výhradně je používalo i tržiště Nucleus.

V roce 2017 se začaly zavádět SegWit adresy (P2SH), díky nimž se oddělily podpisy od ostatních dat převodu. To pomohlo zoptimalizovat prostor v bloku a umožnilo v jednom vytěženém bloku zpracovat větší množství transakcí, a tím pádem došlo i ke zlevnění transakčních poplatků. Tyto adresy začínají číslicí „3“.

Na nativním SegWit protokolu jsou pak postaveny Bech32 adresy. Začínají prefixem „bc1“, lépe se v nich detekují chyby (překlepy) a díky úspoře na datovou náročnost zápisu slibují nejefektivnější využití prostoru v bloku a tím i nejnižší transakční náklady.

Nejnovější jsou takzvané Taproot adresy (P2TR), které se teprve rozšiřují. Poznáte je podle prefixu „bc1p“ a vedle snížení nákladů a zvýšení bezpečnosti jim do vínku byla dána schopnost vytvářet inteligentní kontrakty (smart contracts).

Hierarchicky deterministické (HD) peněženky, které umožňují vytvářet adresy odvozené od základního seedu, se používají od roku 2012, kdy s nimi přišel standard BIP-32. Tento mechanismus značně usnadnil správu klíčů v peněženkách a ovládání více adres najednou. Hlavně však umožnil zálohovat celé peněženky jedním seedem a bezpečně generovat nové adresy bez nutnosti zálohovat každý klíč zvlášť.

I adresy typu Legacy tak mohly být HD. Bohužel z adresy samotné bez znalosti dalších parametrů nelze poznat, jestli byla vytvořena HD funkcemi. Jsou ale důvody se domnívat, že u Nuclea nikoliv. Protože v opačném případě by Jiřikovskému stačilo si před lety poznamenat 24 anglických slov a nemusel se nyní složitě domáhat navrácení zabavené techniky, aby se ke všem prostředkům dostal.

Že přinejmenším k některým adresám Nuclea musel mít přístup (i) někdo jiný, než Jiřikovský, lze dokázat tím, že podle zjištění serveru Seznam Zprávy proběhla 12. dubna 2016 u Jiřikovského v pořadí druhá domovní prohlídka a detektivové NCOZ ho týž den zatýkají. Avšak na adresách Nuclea probíhá řada transakcí i den poté, 13. dubna. V době, kdy si policie odnesla zabavenou veškerou techniku a Jiřikovského má pod zámkem, pobíhá na svobodě někdo, kdo celou noc převádí Bitcoiny jinam. Ovšem od té doby (od 07:31 hod.) všechny adresy spí, a to až do letošního března.

Pohyby na peněženkách Nucleus Marketu po Jiřikovského zatčení

 Pohyby na peněženkách Nuclea po Jiřikovského zatčení

Autor: Screenshot, Martin Drtina

Někdo odlišný od Jiřikovského tedy musel mít přístup k technice s uloženými bitcoinovými klíči, aby v noci po jeho zatčení narychlo zařídil převod části pohádkového bohatství jinam. Anebo to ještě může mít jiné vysvětlení. Mohlo se jednat o automaticky uvolňované prostředky prodejcům darknetového tržiště, které jsou zadrženy do chvíle, kdy kupující potvrdí, že zboží obdržel. Provizi si pak odečte i samo tržiště. To by znamenalo, že NCOZ nedokázala u Jiřikovského zabavit při domovních prohlídkách stroje obsluhující Nucleus Market, který se také poroučel až po dealerově zatčení. Současně by to znamenalo, že na nich jsou uloženy soukromé klíče umožňující odesílat z peněženek Nuclea Bitcoiny i bez Jiřikovského přičinění. 

Pak také víme, že odsouzenému překupníkovi nebyly vráceny všechny zabavené počítače, i když o jejich vrácení stál. A znalec Berger, kterého si pro realizaci miliardového daru ministerstvu vybral Jiřikovského advokát Kárim Titz, si měl vymínit, že od policie převezme vrácenou techniku zapečetěnou a že ji bude prozkoumávat izolovaně, odpojenou od sítě.

Příliš nápadná konsolidace

Časovou představu, kdy se tak mělo dít, nemáme. Víme však s jistotou, že nejpozději 6. března ve 13:25 hodin tato technika k síti připojena byla, protože na dvě adresy: 055adaf7db a 22c116503b jejím prostřednictvím den před samotným darem justici odchází dohromady 1094 BTC. Množství adres na vstupu každé z deseti transakcí ukazuje na to, že jde o konsolidační převod.  Ve všech případech jde o převod na adresy nového typu Bech32, klidně může jít o hardwarovou peněženku.

Konsolidační převody na bitcoinových peněženkách

 Konsolidační převody

Autor: Screenshot, Martin Drtina

Ovšem stejně konsolidační (vždy se 675 transakcemi na vstupu) jsou převody jednotlivých částí daru na stát. Z účtů přináležejících tržišti Nucleus je vzato vždy 675 vstupů v takové kombinaci, aby součty na nich vždy daly požadovanou finální hodnotu, dvakrát po 100 a jednou po 40 BTC. Tato podstatná okolnost vede k závěru, že příkazce musel mít na výběr z mnohem většího množství adres, než kolik jich nakonec k transakcím algoritmus peněženky použil. Takto odevzdaly svou hodnotu jen ty jednotlivé adresy, které v součtu uspokojily přesnou částku převodu. A pokaždé jich bylo právě 675.

CIF25 SE debata

Pokud víme, že před znalcem nikdo policií vrácenou techniku Jiřikovského k dispozici neměl a nemohl tak s obsahem na discích manipulovat, je zřejmé, že den před darem se konsolidační transakce odehrávaly za znalcovy účasti. Dávalo by smysl, kdyby se tento pokusil konsolidovat zůstatek všech Legacy adres, ke kterým měl v tu chvíli přístup, na jednu či několik modernějších adres a z té pak na další den příslušné procento dle darovací smlouvy převést. Ale to se nestalo. I dar státu se skládá ze stovek různých vstupů nakombinovaných tak, aby pokaždé odevzdaly tu správnou hodnotu. 

To posiluje pochybnosti, zda na discích bylo opravdu jen 1561 BTC zachycených na screenshotu otevřené peněženky. Tím, že celá bitcoinová operace den předem a následně po realizaci daru se odehrávala bez účasti notáře, že nevíme, kdy byl pořízen screenshot později předaný notáři, ani co přesně je na něm, zůstává tato část příběhu miliardového bitcoinového daru zahalena tajemstvím. K jeho odhalení nepřispívá ani to, že znalec Berger s médii od počátku komunikovat odmítá, a to s odkazem na povinnou mlčenlivost.

SatoshiLabs začne ještě letos prodávat nový Trezor s bezdrátovou konektivitou Přečtěte si také:

SatoshiLabs začne ještě letos prodávat nový Trezor s bezdrátovou konektivitou

  • Chcete mít Lupu bez bannerů?
  • Chcete dostávat speciální týdenní newsletter o zákulisí českého internetu?
  • Chcete mít k dispozici strojové přepisy podcastů?
  • Chcete získat slevu 1 000 Kč na jednu z našich konferencí?

Staňte se naším podporovatelem

Autor článku

Redaktor serveru Lupa.cz se zaměřením na telekomunikace, média, IT a právo. Dříve šéfredaktor Právního rádce a mluvčí Českého telekomunikačního úřadu.

'; document.getElementById('preroll-iframe').onload = function () { setupIframe(); } prerollContainer = document.getElementsByClassName('preroll-container-iframe')[0]; } function setupIframe() { prerollDocument = document.getElementById('preroll-iframe').contentWindow.document; let el = prerollDocument.createElement('style'); prerollDocument.head.appendChild(el); el.innerText = "#adContainer>div:nth-of-type(1),#adContainer>div:nth-of-type(1) > iframe { width: 99% !important;height: 99% !important;max-width: 100%;}#videoContent,body{ width:100vw;height:100vh}body{ font-family:'Helvetica Neue',Arial,sans-serif}#videoContent{ overflow:hidden;background:#000}#adMuteBtn{ width:35px;height:35px;border:0;background:0 0;display:none;position:absolute;fill:rgba(230,230,230,1);bottom:20px;right:25px}"; videoContent = prerollDocument.getElementById('contentElement'); videoContent.style.display = 'none'; videoContent.volume = 1; videoContent.muted = false; const playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(function () { console.log('PREROLL sound allowed'); // setUpIMA(true); videoContent.volume = 1; videoContent.muted = false; setUpIMA(); }).catch(function () { console.log('PREROLL sound forbidden'); videoContent.volume = 0; videoContent.muted = true; setUpIMA(); }); } } function setupDimensions() { prerollWidth = Math.min(iinfoPrerollPosition.offsetWidth, 480); prerollHeight = Math.min(iinfoPrerollPosition.offsetHeight, 320); } function setUpIMA() { google.ima.settings.setDisableCustomPlaybackForIOS10Plus(true); google.ima.settings.setLocale('cs'); google.ima.settings.setNumRedirects(10); // Create the ad display container. createAdDisplayContainer(); // Create ads loader. adsLoader = new google.ima.AdsLoader(adDisplayContainer); // Listen and respond to ads loaded and error events. adsLoader.addEventListener( google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, onAdsManagerLoaded, false); adsLoader.addEventListener( google.ima.AdErrorEvent.Type.AD_ERROR, onAdError, false); // An event listener to tell the SDK that our content video // is completed so the SDK can play any post-roll ads. const contentEndedListener = function () { adsLoader.contentComplete(); }; videoContent.onended = contentEndedListener; // Request video ads. const adsRequest = new google.ima.AdsRequest(); adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex]; console.log('Preroll advert: ' + iinfoVastUrls[iinfoVastUrlIndex]); videoContent.muted = false; videoContent.volume = 1; // Specify the linear and nonlinear slot sizes. This helps the SDK to // select the correct creative if multiple are returned. // adsRequest.linearAdSlotWidth = prerollWidth; // adsRequest.linearAdSlotHeight = prerollHeight; adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; adsLoader.requestAds(adsRequest); } function createAdDisplayContainer() { // We assume the adContainer is the DOM id of the element that will house // the ads. prerollDocument.getElementById('videoContent').style.display = 'none'; adDisplayContainer = new google.ima.AdDisplayContainer( prerollDocument.getElementById('adContainer'), videoContent); } function unmutePrerollAdvert() { adVolume = !adVolume; if (adVolume) { adsManager.setVolume(0.3); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } else { adsManager.setVolume(0); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } } function onAdsManagerLoaded(adsManagerLoadedEvent) { // Get the ads manager. const adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true; adsRenderingSettings.loadVideoTimeout = 12000; // videoContent should be set to the content video element. adsManager = adsManagerLoadedEvent.getAdsManager(videoContent, adsRenderingSettings); // Add listeners to the required events. adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, onContentPauseRequested); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, onContentResumeRequested); adsManager.addEventListener( google.ima.AdEvent.Type.ALL_ADS_COMPLETED, onAdEvent); // Listen to any additional events, if necessary. adsManager.addEventListener(google.ima.AdEvent.Type.LOADED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.STARTED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.COMPLETE, onAdEvent); playAds(); } function playAds() { // Initialize the container. Must be done through a user action on mobile // devices. videoContent.load(); adDisplayContainer.initialize(); // setupDimensions(); try { // Initialize the ads manager. Ad rules playlist will start at this time. adsManager.init(1920, 1080, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will // start at this time; the call will be ignored for ad rules. adsManager.start(); // window.addEventListener('resize', function (event) { // if (adsManager) { // setupDimensions(); // adsManager.resize(prerollWidth, prerollHeight, google.ima.ViewMode.NORMAL); // } // }); } catch (adError) { // An error may be thrown if there was a problem with the VAST response. // videoContent.play(); } } function onAdEvent(adEvent) { const ad = adEvent.getAd(); console.log('Preroll event: ' + adEvent.type); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: if (!ad.isLinear()) { videoContent.play(); } prerollDocument.getElementById('adContainer').style.width = '100%'; prerollDocument.getElementById('adContainer').style.maxWidth = '640px'; prerollDocument.getElementById('adContainer').style.height = '360px'; break; case google.ima.AdEvent.Type.STARTED: window.addEventListener('scroll', onActiveView); if (ad.isLinear()) { intervalTimer = setInterval( function () { // Example: const remainingTime = adsManager.getRemainingTime(); // adsManager.pause(); }, 300); // every 300ms } prerollDocument.getElementById('adMuteBtn').style.display = 'block'; break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: if (ad.isLinear()) { clearInterval(intervalTimer); } if (prerollLastError === 303) { playYtVideo(); } break; case google.ima.AdEvent.Type.COMPLETE: if (ad.isLinear()) { clearInterval(intervalTimer); } playYtVideo(); break; } } function onAdError(adErrorEvent) { console.log(adErrorEvent.getError()); prerollLastError = adErrorEvent.getError().getErrorCode(); if (!loadNext()) { playYtVideo(); } } function loadNext() { iinfoVastUrlIndex++; if (iinfoVastUrlIndex < iinfoVastUrls.length) { iinfoPrerollPosition.remove(); playPrerollAd(); } else { return false; } adVolume = 1; return true; } function onContentPauseRequested() { videoContent.pause(); } function onContentResumeRequested() { videoContent.play(); } function onActiveView() { if (prerollContainer) { const containerOffset = prerollContainer.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) { if (prerollPaused) { adsManager.resume(); prerollPaused = false; } return true; } else { if (!prerollPaused) { adsManager.pause(); prerollPaused = true; } } } return false; } function playYtVideo() { iinfoPrerollPosition.remove(); youtubeIframe.style.display = 'block'; youtubeIframe.src += '&autoplay=1&mute=1'; } }
Upozorníme vás na články, které by vám neměly uniknout (maximálně 2x týdně).