This content was deleted by the author. You can see it from Blockchain History logs.

IPFS - #2 - Merkle DAGs an einem Beispiel nachvollziehen

https://i.imgur.com/p2mvn9r.png

Ich habe in meinem letzten Beitrag IPFS - Das System verstehen einen Überblick über das Schema geben. Dabei war für mich der Begriff "Merkle DAGs" neu. Die Theorie habe ich beim letzten mal geklärt. Heute möchte ich mit euch schauen, wie das in der Praxis aussieht.


Wir starten mit einer Testdatei "super_testbild.jpg" mit ca. 2,6MB.

 Verzeichnis von E:\tmp\ipfs\go-ipfs_v0.4.13_windows-amd64\go-ipfs\test_content

12.02.2018  12:07    <DIR>          .
12.02.2018  12:07    <DIR>          ..
12.02.2018  10:45         2.666.661 super_testbild.jpg

Wir adden die Datei ins IPFS Netzwerk:

E:\tmp\ipfs\go-ipfs_v0.4.13_windows-amd64\go-ipfs>ipfs.exe add test_content\super_testbild.jpg
 2.54 MB / 2.54 MB [============================================================================================================================================] 100.00% 0s
 added QmNTv6SgoLnRtqXJ6WN6HS9VPZGQMAYS21cbhoH9aDYRXj super_testbild.jpg

Dadurch erhalten wir den Hash QmNTv6SgoLnRtqXJ6WN6HS9VPZGQMAYS21cbhoH9aDYRXj

Jetzt schauen wir mal, was mit unserer Datei im IPFS passiert:

ipfs ls : list, Zeigt alle Teile und deren Größe.
ipfs object links : Zeigt ebenfalls alle Links des Objektes an. Würde den gleichen Output liefern.

E:\tmp\ipfs\go-ipfs_v0.4.13_windows-amd64\go-ipfs>ipfs ls -v QmNTv6SgoLnRtqXJ6WN6HS9VPZGQMAYS21cbhoH9aDYRXj
Hash                                           Size   Name
QmeFdcvrTbtWovyCBfHQuvxmuarjoYfBh3oa5DHibkU7tU 262158
Qmd55Udt99hNPDA5F2XbTtQJP2EK7Wp125mzEFRvmcfpz1 262158
QmYVWMkpBhV5vchj2cJoqsuXX2MWmb9Ywavc5J1Q3DC7tq 262158
QmdaAxVzzwnK8m1EpYi46Efjri16omUMHKV3evm4agkyPk 262158
QmNnTFtYt9fuPfMYB7bVDXDy4UTd8xxDm41kjvEqVJWGaT 262158
QmS1b7j6YbTWktzK6Ly2Ak1vmbM5EhwvZTAzXVc76CHr11 262158
QmRABaJE2j7MxKTkoasYKYXVHbkznic1Wo9EiPh6nGFeog 262158
Qmf4qXc9eVch83g8FcrMG6GVfSh3AxcFQzdfujmxBnCVjK 262158
QmQ2RGtmKQ473y1FGGZm3yCtiJ5pp7FGCW46PVfVfLpEfp 262158
QmQrb76m1mYbwV9Qwgw1exkADbBEBTLke1ETMgiZXNdxzt 262158
QmSw84fUPaQx5s5QyMHzAw8YnrkoqCoCn4fY3nMnYMVRLd 45235

Es fällt auf, dass unsere "Datei" in Blöcke zu je 256KB (262158/1024) geteilt.

Um es etwas zu veranschaulichen, habe ich das mal als Grafik abgebildet:
MerkleDAG1

In den untergeordneten Hashes sind jetzt entweder weitere Verweise und die Daten enthalten.

Ich definiere an der Stelle unseren QmNTv6SgoLnRtqXJ6WN6HS9VPZGQMAYS21cbhoH9aDYRXj als Startblock und alle anderen als untergeordnete Blöcke.

Wenn meine "Datei" im IPFS noch weitere untergeordnete Blöcke hätte, also eine weitere Subebene existieren würde, könnte ich weiter mit ipfs object links danach suchen.
Als Test mach ich das mal und wir schauen ob es weitere Verweise gibt. Wir starten mit dem ersten untergeordneten Block QmeFdcvrTbtWovyCBfHQuvxmuarjoYfBh3oa5DHibkU7tU

ipfs object links -v QmeFdcvrTbtWovyCBfHQuvxmuarjoYfBh3oa5DHibkU7tU
Hash Size Name
ipfs object links -v Qmd55Udt99hNPDA5F2XbTtQJP2EK7Wp125mzEFRvmcfpz1
Hash Size Name
ipfs object links -v QmYVWMkpBhV5vchj2cJoqsuXX2MWmb9Ywavc5J1Q3DC7tq
Hash Size Name
ipfs object links -v QmdaAxVzzwnK8m1EpYi46Efjri16omUMHKV3evm4agkyPk
Hash Size Name
ipfs object links -v QmNnTFtYt9fuPfMYB7bVDXDy4UTd8xxDm41kjvEqVJWGaT
Hash Size Name
ipfs object links -v QmS1b7j6YbTWktzK6Ly2Ak1vmbM5EhwvZTAzXVc76CHr11
Hash Size Name
ipfs object links -v QmRABaJE2j7MxKTkoasYKYXVHbkznic1Wo9EiPh6nGFeog
Hash Size Name
ipfs object links -v Qmf4qXc9eVch83g8FcrMG6GVfSh3AxcFQzdfujmxBnCVjK
Hash Size Name
ipfs object links -v QmQ2RGtmKQ473y1FGGZm3yCtiJ5pp7FGCW46PVfVfLpEfp
Hash Size Name
ipfs object links -v QmQrb76m1mYbwV9Qwgw1exkADbBEBTLke1ETMgiZXNdxzt
Hash Size Name
ipfs object links -v QmSw84fUPaQx5s5QyMHzAw8YnrkoqCoCn4fY3nMnYMVRLd
Hash Size Name

Keiner unserer untergeordneten Blöcke verweist weiter.

Was ich noch nicht weiß, ist die Größe unsere Startblocks. Theoretisch müsste der sehr klein sein, da er nur aus Verweisen auf anderen Blöcke besteht. Schauen wir mal!
ipfs block stat - gibt uns die Größe eines Blocks zurück

ipfs block stat QmNTv6SgoLnRtqXJ6WN6HS9VPZGQMAYS21cbhoH9aDYRXj
Key: QmNTv6SgoLnRtqXJ6WN6HS9VPZGQMAYS21cbhoH9aDYRXj
Size: 537

Stimmt, unser Startblock ist nur 537 Byte klein

Der Umkehrschluss davon ist, dass wir eigentlich in jedem Block jetzt die Daten auslesen können müssten. Probieren wir das mal.

ipfs cat - Liest den Inhalt auf der Konsole vor.
Ich nehme als ersten Test einfach mal den letzten Block QmSw84fUPaQx5s5QyMHzAw8YnrkoqCoCn4fY3nMnYMVRLd

ipfs cat QmSw84fUPaQx5s5QyMHzAw8YnrkoqCoCn4fY3nMnYMVRLd

cat binary jpg

Sieht gut aus. Ich versuche den Inhalt einer Binärdatei auf der Konsole darzustellen. Das muss genau so aussehen :)

Wenn ich jetzt den Startblock angebe, müsste er eigentlich automatisch allen Verweisen folgen und mir den gesamten Inhalt der Datei "vorlesen".
Da wird also wieder das gleiche (für mich) Kauderwelsch ankommen. Da ich aber weiß, dass es ein .jpg ist leite ich die Ausgabe einfach in eine Datei um, die ich mir hinterher anschaue.

ipfs cat QmNTv6SgoLnRtqXJ6WN6HS9VPZGQMAYS21cbhoH9aDYRXj > mein_vorglesenes_bild.jpg

Das Bild ist vollständig da und ich kann es mir wieder anschauen.

https://i.imgur.com/2SqLaGL.jpg

Das hat funktioniert, wie erwartet. Jetzt müsste es ja auch möglich sein einfach alle untergeordneten Blöcke manuell zusammen zu fügen ohne, dass ich den Startblock benutze. Testen wir mal!

ipfs cat QmeFdcvrTbtWovyCBfHQuvxmuarjoYfBh3oa5DHibkU7tU Qmd55Udt99hNPDA5F2XbTtQJP2EK7Wp125mzEFRvmcfpz1 QmYVWMkpBhV5vchj2cJoqsuXX2MWmb9Ywavc5J1Q3DC7tq QmdaAxVzzwnK8m1EpYi46Efjri16omUMHKV3evm4agkyPk QmNnTFtYt9fuPfMYB7bVDXDy4UTd8xxDm41kjvEqVJWGaT QmS1b7j6YbTWktzK6Ly2Ak1vmbM5EhwvZTAzXVc76CHr11 QmRABaJE2j7MxKTkoasYKYXVHbkznic1Wo9EiPh6nGFeog Qmf4qXc9eVch83g8FcrMG6GVfSh3AxcFQzdfujmxBnCVjK QmQ2RGtmKQ473y1FGGZm3yCtiJ5pp7FGCW46PVfVfLpEfp QmQrb76m1mYbwV9Qwgw1exkADbBEBTLke1ETMgiZXNdxzt QmSw84fUPaQx5s5QyMHzAw8YnrkoqCoCn4fY3nMnYMVRLd > zusammengebaut_ohne_startblock.jpg     

https://i.imgur.com/lcig20V.jpg
Funktioniert, wie erwartet!

Eigentlich alles ganz logisch. Gut es mal in der Praxis nachvollzogen zu haben.

Fazit und Gelerntes

  • Ich habe neue IPFS Befehle gelernt, hier noch mal als Übersicht:
BefehlNutzen
ipfs block statGröße eines Blocks auslesen.
ipfs lsZeigt die Blöcke, auf die verwiesen wird und deren Größe.
ipfs object linksIst analog zu "ipfs ls".
ipfs catLiest den Inhalt von Blöcken aus. Löst dabei aber Verweise direkt auf.
  • Für mich war auch neu, dass meine Datei in 256KB "kleine" Blöcke unterteilt wird.

Ich hoffe dieses kleine Praxisbeispiel war für euch anschaulich und hilfreich. Wenn ihr Anmerkungen habt, bitte schreibt einen Kommentar! Ich würde mich auch freuen, wenn ihr mir einfach schreibt, was euch sonst noch an dem Thema interessiert. Was habt ihr für Fragen? Was soll ich mir demnächst mal anschauen?