IPFS - #2 - Was passiert mit meiner Datei? - Merkle DAGs an einem Beispiel nachvollziehen

in deutsch •  7 years ago  (edited)

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?

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

This is a test comment, notify @kryzsec on discord if there are any errors please.


GuidelinesProject Update

Being A SteemStem Member

Ah interessant, bedeutet das eigentlich, wenn der Startblock größer als diese Grenze werden würde, dass dann der erste Block auch nur ein Verweisblock auf eine Untermenge an Blöcken wird?

Als Tipp eventuell bei deinen Konsolenbeispielen würde ich eventuell anstatt:

E:\tmp\ipfs\go-ipfs_v0.4.13_windows-amd64\go-ipfs>ipfs

nur

>ipfs

schreiben. Mich würde vor allem dann als nächstes interessieren wie das mit dem verteilen ist und woher weiß z.b. ipfs.io dann genau wo der angeforderte Hash liegt, bzw. wie kommunizieren die knoten =)

Schön veranschaulichtes Beispiel :)
Vor allem die neuen Befehle nochmal aufzulisten finde ich super ... so kann man dies auch direkt heranziehen und sich mal selbst daran versuchen. Bin ja wieder etwas spät ... Deshalb warte ich mal was du in den nächsten beiden Posts geschrieben hast xD

Gut zu Wissen ist noch, dass die Dateien wirklich in 256KB Blocks geschnitten werden. Das erklärt damit den enormen CPU Aufwand, wenn man 2 GB Dateien hochlädt. Wenn ich mich nicht verrechnet habe sind das bei 2.000.000 KB fast 8.000 Hashes, die erzeugt werden müssen (2GB 2.000.000 KB / 256KB = 7812,5 also 7813 Hashes)?