IPFS - #3 - IPNS - Ein praktischer Blick auf den IPNS Layer

in deutsch •  7 years ago  (edited)

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

IPNS ist eine Ebene in IPFS. Damit wird es möglich beständige Links zu erstellen.
Wer sich erstmal einen Überblick verschaffen möchte, kann sich gern den Artikel IPFS - Das System verstehen anschauen.

Was ist mein Ziel? Warum befasse ich mich überhaupt damit?

Ich brauche so etwas, wie einen Symlink für IPFS.

Ich möchte für die Community eine gleichbleibende Adresse zu einer Datei anbieten. Der Inhalt der Datei kann und soll sich aber ändern.
Genau dafür kann man IPNS (Inter-Planetay Naming System) nutzen.

Ab in die Praxis!

https://i.imgur.com/8VrYWge.pngIPFS wird auch als permanent Web bezeichnet. Ich kann darin keine Datei editieren. Was einmal drin ist, ist so wie es ist. Ich kann nur neue Dateien hinzufügen.

Als erstes füge ich dem IPFS Netzwerk eine Datei hinzu:

ipfs add meine_datei.xml
added QmXokRT5d...2W6rXhv7 meine_datei.xml

Jetzt erstelle ich meinem IPNS Link auf die Datei:

ipfs name publish QmXokRT5d...2W6rXhv7
Published to QmeUETey...oGcN5UxFER7: /ipfs/QmXokRT5d...2W6rXhv7

Der Hash QmeUETey...oGcN5UxFER7 ist der IPNS Link auf unseren anderen Hash im IPFS QmXokRT5d...2W6rXhv7.

Jetzt habe ich "meine_datei.xml" geändert und füge sie neu hinzu. Dafür werde ich einen neuen IPFS Hash erhalten:

ipfs add meine_datei.xml
added QmXQeB...VYFSZB meine_datei.xml

Soweit so gut, jetzt wird's spannend. Ich möchte nun den Link (Inhalt meines IPNS Hashes) auf den neuen IPFS Hash ändern:

ipfs name publish QmXQeB...VYFSZB
Published to QmeUETey...oGcN5UxFER7: /ipfs/QmXQeB...VYFSZB

Das war's auch schon. Ich kann einfach jederzeit den Link ändern, indem ich das ipfs name publish erneut ausführe.

IPNS mit lesbaren Namen nutzen

Die Verbidung mit klassischen DNS Servern.
Siehe auch:

Durch den Hinweis von @Janse möchte ich den Artikel hier noch etwas ergänzen. Damit man nicht nur einen permanenten Link, sondern einen lesbaren permanenten Link hat, kann man den IPFS Hash an einen DNS Eintrag koppeln.
Das setzt voraus, dass man eine Domain hat bei der man DNS Einträge setzen kann (das trifft also nicht gerade auf jeden zu). Alles was zu tun ist, ist ein TXT Record im DNS zu setzen. Machen wir mal ein Beispiel:

Angenommen uns gehört die Domain "sonstwas.com". Dann gehen wir zu unserem Nameserver und setzen ein TXT Record:
sonstwas.com. 600 IN TXT "dnslink=/ipfs/QmXQeB...VYFSZB"

Wenn ich dann im IPFS ein name resolve ausführe:

ipfs name resolve sonstwas.com
/ipfs/QmXQeB...VYFSZB

Jetzt kann ich mir die Datei zum Beispiel herunter laden mit:

wget -O meinedatei.xml https://ipfs.io/ipns/sonstwas.com

Learnings zu IPNS<->DNS

  • Die Verknüpfung mit einem klassischen DNS bezieht sich auf den IPFS-Hash, nicht auf den IPNS-Hash
    • Folglich brauch ich bei dieser Variante alles aus dem Praxisbeispiel oben gar nicht. Denn es gibt dabei keinen IPNS-Hash.
    • Das Ganze ist einfach eine andere Funktion des IPNS Layers.
  • Wenn ich die Datei austauschen will, mache ich die Änderung in meinem klassischen DNS Server.
    • Hier verweise ich dann einfach auf den neuen IPFS-Link
    • Ob ich als Nutzer die neue Datei erhalte, hängt vom Caching des Gateways ab! Schaut euch dazu gerne den Artikel IPFS - #4 - Public IPFS Gateways an.

Anmerkungen

  • Ich kann jemand einen IPNS Link geben und dahinter später die Inhalte austauschen. Für den Empfänger bleibt der Link gleich und er kann ihn immer wieder benutzen.
  • Ich kann mit meinem Key nur einen Link verwalten.
    • Wie euch vielleicht aufgefallen ist, habe ich ja nie den Hash des IPNS Links angegeben.
    • Dafür gibt es auch keinen Parameter.
    • Es sollte aber möglich sein eigene Private Keys zu generieren. Den Private Key gibt es als Paramter von ipfs name publish. Schaut einfach mal nach mit ipfs name publish --help
  • Es ergeben sich jetzt Folgefragen
    • Ist der Link sofort überall aktualisiert?
    • Wie kann ich den Link außerhalb von IPFS, also über HTTP, allen zur Verfügung stellen?
    • Die Fragen beantworte ich in dem nächsten Artikel IPFS - #4 - Public IPFS Gateways

Wenn ihr Fragen oder Anmerkungen dazu habt, schreibt mir bitte einen Kommentar! Ich freue mich auf über Anregungen, was euch sonst noch so an IPFS interessiert.

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:  

Moinsen,

wieder ein sehr gelungener Artikel, der hinter die Kulissen von IPFS schaut. Jedoch würde ich noch anmerken, dass man m.H. des IPNS-Hashes entsprechend einen TXT-Eintrag in den eigenen DNS-Records einsetzen kann, um mit einer "normalen" Domain auf den Hash zuzugreifen (möglich auch über das lokale Gateway). Denn auch, wenn das vielleicht im nächsten Part geplant ist, macht es m.M.n. mehr Sinn, das bereits hier aufzuführen (ansonsten ist für die meisten der Hash an sich wohl kaum aufschlussreich) 😉.

BB,
JanSe

Hi, ja das stimmt das werde ich morgen hier noch ergänzen. Super Hinweis! Leider ist es nur noch ne technische Hürde um etwas lesbarer zu machen und es ändert ja nix an der Notwendigkeit vom Gateways. Man erreicht ja damit nur, dass der IPNS Hash nen fluffiger lesbarer Name wird.

Hi,

Sorry das war Mist. Ich muss meinen eigenen Kommentar korrigieren. Der DNS Eintrag bezieht sich auf den IPFS Hash nicht auf den IPNS Hash. Die Details habe ich jetzt im Artikel geupdated. Danke @Janse für den Denkanstoß!

Das hier beschriebene Prinzip wird auch in der Programmierung gern verwendet, um zB das Interface (Frontend) von dem Backend möglichst vollständig zu trennen.

Auch bei verschiedenen Bereichen innerhalb des Backends wird das verwendet (was hier noch besser auf das Beispiel zutrifft, als der Teil mit Frontend und Backend, weil diese ja Kontaktstellen benötigen, um Daten und Veränderungen von Daten auszutauschen). Man nutzt dabei sogenannte Interfaces, die eig nichts anderes machen als einen Verweis auf eine Methode festlegen. Man kann nun aber diese Methode in vielen verschiedenen Klassen nutzen und in jeder Klasse anders implementieren.
Sie heißt immer gleich, funktioniert aber jeweils anders.

Ähnlich berschreibst du es hier. Du setzt den Link und setzt darunter deine Funktionalität, in dem Fall zum Beispiel eine Datei einer Webseite.

Hoffe dieser kleine Exkurs war nicht zuviel :D Vor allem ist er vllt nicht 100% korrekt, Korrekturen werden gerne gesehen.
Allerdings hilft manchmal eine andere Sichtweise etwas besser zu verstehen, weshalb ich das unbedingt nocheinmal so aufdröseln wollte.

Sehr schöner Post :)