[DE] How to | IOTA JavaScript Library (inkl. PoW)

in #programming6 years ago (edited)

banner

Als ich auf IOTA gestoßen bin, war ich fasziniert von dem Konzept dahinter. Noch faszinierter wurde ich als ich las, dass es sogar eine JavaScript Library dafür gibt. Das war der Punkt, an dem ich entschied, selbst ein Projekt auf IOTA basierend zu programmieren. Um dir liebem Leser nun die Hürden mit denen ich zu kämpfen hatte abzunehmen, folgt ein kleiner Guide, wie du mit der IOTA JavaScript Library Transaktionen erstellen kann.

Was ist überhaupt IOTA?

Der Name IOTA setzt sich zusammen aus IOT (Internet of Things) und Tangle (IOTAs "Blockchain"). Es ist eine Crypto-Währung, welche Zahlungen zwischen Maschinen ermöglichen soll. Die Transaktionen sind aufgrund der Besonderheiten des Tangles kostenfrei, womit auch Mikrotransaktionen möglich sind.

Tangle - die Innovation hinter IOTA

Der Tangle (deutsch: "Wirrwarr") ist das blocklose veteilte Bestandsbuch von IOTA. Er ist (theoretisch) undendlich skalierbar und hat dank dem Fehlen von Minern keine Transaktionsgebühren. Während zum Beispiel bei Bitcoin die Miner das bestätigen von Transaktionen übernehmen, bestätigen in IOTA Transaktionen selbst zwei weitere Transaktionen. Dies führt dazu, dass Transaktionen immer schneller werden, je mehr Transaktionen es gibt.

Die Programmierung

Erstellen einer IOTA Instanz

Es beginnt damit, dass wir eine Instanz der IOTA Klasse erstellen. Als Parameter nimmt der Konstruktor der Klasse in Objekt mit folgenden Schlüsseln:

  1. host: String die Adresse des IOTA-Nodes, welche verwendet werden soll. Voreinstellung ist localhost
  2. port: Int der Port der IOTA-Nodes, welche verwendet werden soll. Voreinstellung ist 14265.
  3. provider: String Wenn weder host noch port angegeben wurde, kann auch ein String mit Host und Port angegeben werden.
  4. sandbox: Bool Optionaler Wert, ob der angegebene Provider eine Sandbox ist oder nicht.
  5. token: String Token welcher zur Authentifizierung an der Sandbox genutzt wird.
// create new iota object
const iota = new window.IOTA({
  'host': 'http://node01.iotatoken.nl',
  'port': 14265,
});

Einen geeigneten Hosts können wir uns direkt auf der IOTA-Support-Seite heraussuchen: http://iotasupport.com/lightwallet.shtml.

Anfragen der aktuellen Node-Informationen

Haben wir uns erfolgreich mit einem Node verbunden, können wir mit der Funktion iota.api.getNodeInfo die aktuellen Daten des Verbundenen Nodes anfragen.

const getNodeInfo = () => new Promise((resolve, reject) => {
  iota.api.getNodeInfo((error, info) => (error ? reject(error) : resolve(info)));
});

Diese Funktion muss im späteren Verlauf nicht aktiv aufgerufen werden. Stattdessen wird sie von Funktionen wie iota.api.getLatestInclusion gekapselt.

Der Proof-of-Work

Der Proof-of-Work (PoW) in IOTA wird mittels eigens von IOTA erfundenem Algorithmus und deren JavaScript Library durchgeführt. Was wir noch implementieren müssen ist die Initialisierung der Library und das Anhängen unserer IOTA Instanz.

// Proof of Work - webgl2 only
window.curl.init(); // <-- do not forget!
window.curl.overrideAttachToTangle(iota);

Die Library finden wir unter https://github.com/iotaledger/curl.lib.js. Sie benutzt die WebGL2 Schnittstelle, welche bis heute nur im Firefox und im Chrome unterstützt wird. Gibt es also die Anforderung, dass zum Beispiel der Internet Explorer für dein Projekt unterstützt werden muss, musst du an diesem Punkt wohl auf eine Server-Implementierung des PoWs ausweichen.

Erstellen von Transaktionen

Haben wir eine IOTA Instanz erstellt und die Proof-of-Work Library eingebunden, können wir den Transfer vorbereiten. Dazu erstellen wir uns zuerst ein Array mit allen Transfer-Objekten, welche in einem Bundle gesendet werden sollen. Hier ist zu beachten, dass die Nachricht eine Länge von 2673-trytes nicht überschreiten darf. Ist eine Nachricht kürzer als 2673-trytes, wird sie mit Neunen aufgefüllt.

// create an array of transfers for each message
const createTransfers = (address, messages = ['']) => messages.map(message => ({
  address: address,
  value: 0,
  message: iota.utils.toTrytes(message),
}));

Das Array mit allen Transfer-Objekten war das letzte Puzzleteil, welches uns für die Erstellung einer Transaktion gefehlt hat.
Mit unserem Seed, dem Transfer-Array und der Funktion iota.api.sendTransfer können wir nun unsere Transaktion(en) erstellen. Hat alles geklappt bekommen wir ein Array mit den ertellten Transaktionen zurück.

const createTransactions = (seed) => {
  const transfers = generateTransfers(address, ['i<3webdev']);

  // params: https://github.com/iotaledger/iota.lib.js/#sendtransfer
  return new Promise((resolve, reject) => iota.api.sendTransfer(seed, 4, 14, transfers, (error, transactions) => {
    if (error) {
      reject(error);
    } else {
      resolve(transactions);
    }
  }));
};

Fazit

Programmierung mit der IOTA JavaScript Library ist gar nicht so schwer, wenn man mal verstanden hat, welche Parameter alles benötigt werden. Die Vorarbeit der IOTA Entwickler zudem bemerkenswert, da es nicht selbstverständlich ist, dass eine Library wie diese so gut dokumentiert ist.

Quellen und weiterführende Links

https://iota.org (besucht am 24.01.2018 21:11 Uhr)

https://caniuse.com/#search=webgl2 (besucht am 25.01.2018 11:59)

https://domschiener.gitbooks.io/iota-guide/ (besucht am 25.01.2018 12:35 Uhr)

https://github.com/iotaledger/iota.lib.js/ (besucht am 24.01.2018 21:12 Uhr)

https://github.com/iotaledger/curl.lib.js (besucht am 24.01.2018 21:13 Uhr)

http://iotasupport.com/lightwallet.shtml (besucht am 24.01.2018 21:51 Uhr)


In dem Sinne, frohes Coden.

(() => {
  const colors = [
    '001f3f', '0074d9', '7fdbff', '39cccc',
    '3d9970', '2ecc40', '01ff70', 'ffdc00',
    'ff851b', 'ff4136', '85144b', 'f012be',
  ];
  const contents = ['%cI', '%c❤', '%cweb', '%cdev'];
  const options = Array.from(
    new Array(contents.length),
    () => `
      color:#${colors[Math.floor(Math.random() * colors.length)]};
      font-size:64px;
    `
  );
  console.log.apply(console, [contents.join('')].concat(options));
})();
Sort:  

Sehr interessanter Beitrag !
Ich kannte die Library bisher nicht - du hast super eingeführt.
Weiter so :)

Super Beitrag @drookyn, solche Einführungen sind Gold für Leute die sich für die Programmierseite von Crypto interessieren. Weiter so!