Verteilter Speicher: Dokumente an der Blockchain

Seite 2: Blockchain für P2P und Filesharing

Inhaltsverzeichnis

Bei der Datenorganisation und bei Anreizsystemen kann die Blockchain-Technik P2P-Filestorage und Filesharing-Netze weiterbringen. Wie das aussehen kann, soll ein kleiner Prototyp zeigen, der die Businesslogik in einen Smart Contract auf Ethereum auslagert und die Datenhaltung in Swarm abwickelt. Das Frontend ist eine Webanwendung.

Viele Entwickler nutzen zum Erstellen von Smart Contracts Testrpc, einen vollumfänglichen Ethereum-Client ohne Ethereum. Da Testrpc kein Swarm unterstützt nutzt der Prototyp stattdessen eine Dockerumgebung, die Ethereum- und Swarm-Clients startet und dadurch ein vollständiges Testnetzwerk bereitstellt. Der Code dazu findet sich auf Github.

Zum Entwickeln der Anwendung kam mit Truffle ein Framework zum Entwickeln und Deployen von Smart Contracts auf Basis von Ethereum zum Einsatz. Neben dem für das Beispiel verwendeten Starter auf Basis von Angular 4 existieren viele Startersets für React wie beispielsweise React Box.

Der Grundstein der Anwendung liegt darin, eine Verbindung mit dem Ethereum-und dem Swarm-Netzwerk herzustellen. Die Docker-Umgebung stellt auf Port 8545 einen Ethereum RPC (Remote Procedure Call) und auf Port 8500 einen Swarm RPC bereit. Außerdem verwendet das Beispiel die Bibliotheken web3 für Ethereum und web3-bzz, um mit den Knoten zu kommunizieren. Die Ethereum Foundation hat Web3 entwickelt, um eine JavaScript Bibliothek für Webanwendungen bereitzustellen, die es erlaubt einfach mit Bestandteilen von Ethereum wie Smart Contracts, Filestorage und Kommunikation zu interagieren, .

this.web3 = new Web3('http://localhost:8545');
this.bzz = new Bzz('http://localhost:8500');

Anschließend muss die Anwendung dem Nutzer eine Möglichkeit bereitstellen, eine Datei hochzuladen. Konkret ist dies als einfaches Formular mit einer Dateiauswahl umgesetzt:

<input [(ngModel)]="sendingFile" 
class="input"
type="file"
placeholder="95"
(change)="onChange($event)"
name="sendingFile"
#sendingFileModel="ngModel">
<input [(ngModel)]="fileDescription" 
name="fileDescription"
class="input"
type="text"
placeholder="Whitepaper Secret ICO"
#fileDescriptionModel="ngModel">

Beim Verwenden des Formulars liest die Anwendung die Datei ein und fügt sie zu Swarm hinzu. Anschließend wird der zurückgelieferte Hash-Wert zusammen mit der Beschreibung aus dem Formular an den Smart Contract in der Blockchain übergeben.

Der Smart Contract verfügt über drei öffentliche Funktionen: AddDocument, GetDocument und GetDocumentLength. Über erstere lassen sich Dokumente hinzufügen, GetDocument gibt ein Dokument samt Beschreibung zurück, und die letzte Funktion liefert die Anzahl der Dokumente.

Zunächst wird via Truffle die Instanz des in Ethereum deployten Vertrags bereitgestellt:

const documentManagement = 
require('../../build/contracts/DocumentManagement.json');
DocumentManagement = contract(documentManagement);
this.DocumentManagement.deployed().then(instance => {
dm = instance;
})

Das Einlesen der Datei geschieht mit einem Filereader und einem Buffer:

reader.onloadend = () => {
const buf = buffer.Buffer(reader.result) // Convert data into buffer
this.bzz.upload(buf).then((data) => {
return dm.addDocument(data,
this.fileDescription,
{from: this.account});
}).then((result) => {
this.refreshDocuments();
this.setStatus('Transaction completed.');
});
}

// Read Provided File:
reader.readAsArrayBuffer(this.sendingFile);

Die hinzugefügten Dokumente lassen sich anschließend über die getDocument- und getDocumentLength-Funktionen auslesen und in einer Tabelle anzeigen.

this.DocumentManagement
.deployed()
.then(instance => {
contract = instance;
return contract.getDocumentLength.call(
{from: this.account})
})
.then((length) => {
for (let i = 0; i < length.toNumber(); i++) {
contract.getDocument.call(i,
{from: this.account}).
then(val => {
console.log(val);
this.documents.push({
hash: val[0],
description: val[1]
});
});
}
});

Das Ergebnis kann anschließend das Frontend beispielsweise in einer Tabelle anzeigen:

<table class="table">
<tr *ngFor="let entry of documents">
<td>{{entry.description}}</td>
<td>
<a href="http://localhost:8500/bzzr:/{{entry.hash}}/">
Download</a>
</td>
</tr>
</table>

Die gesamte Anwendung können Interessierte über GitHub auschecken, testen und modifizieren.

Bei der Kombination von Smart Contracts und Distributed-File-Storage-Lösungen müssen Entwickler auf die Datensicherheit achten. Es ist nahezu unmöglich, Daten aus einem Distributed File Storage selbstständig und vor allem vollständig zu entfernen. Weiter sollte bei den einzelnen Systemen auf Verschlüsselung der Inhalte und der Kommunikation geachtet werden. Letztere ist teilweise verschlüsselt, die Ablage und Bereitstellung jedoch nicht. Bei IPFS ist das beispielsweise nicht der Fall: Das Übertragen und Halten der Daten erfolgt in Klartext. Somit können alle Nutzer eine Datei abrufen, wenn sie den Hash dazu kennen. Weiter können Außenstehende des IPFS Netzwerks durch die nicht vorhandene verschlüsselte Kommunikation einfach mitlauschen.