Iota Ticker in Java

Hi,

ich würde gerne eine App in Java/Kotlin schreiben, die Daten aus dem Tangle zieht.
MAM/Stream ist für Java noch nicht verfügbar, soweit ich gesehen habe. Nun die Frage, wie müsste ich die Daten in den Tangle pushen, damit ich sie sinnvoll wieder „pullen“ könnte?

Alles auf eine Adresse pushen wäre nicht so sinnvoll oder?
Wenn ich von dieser Adresse (https://thetangle.org/address/DAAUUAKUZHKBWTCGKXTJGWHXEYJONN9MZZQUQLSZCLHFAWUWKHZCICTHISXBBAKGFQENMWMBOVWJTCMEW)
versuche alle Transaktionen zu pullen, bekomme ich eh eine „InternalException“, da man den Request nicht komplettieren konnte.

Müsste ich also anfangen mir mein eigenes Mam/Stream zu schreiben, bei der in jeder Transaktion die nächste Adresse/Transaktion angegeben ist?

Die Idee ist Temperaturdaten in den Tangle zu pushen, um anschließend auf der App den Verlauf visuell darstellen zu können und evtl einen Alarm setzen, wenn die Temperatur zu hoch oder zu niedrig ist.

1 Like

Solche Fragen habe ich mir auch schon gestellt.

Kennt jemand gute Lektüre, wie man als App-Entwickler mit dem IOTA-Tangle umgehen sollte?

1 Like

Ja, mit diesen Informationen kommt man nicht sehr weit!

Programmatisch eine Verbindung zur Node aufzubauen ist recht einfach. Sogar viel einfacher wie z.B. bei BTC.

Die Tutorials sind ja die erste Anlaufstelle und funktionieren auch soweit ganz gut.
Die Frage ist halt, wie man die Daten strukturiert im Tangle ablegt, um sie anschließend wieder im Tangle zu finden.

Wenn man mein Beispiel nimmt, in dem alle paar Sekunden ein Temperaturwert in den Tangle gespeichert wird, will man mit einer App vlt nur die Werte der letzten Stunden/Tage haben und nicht alle Daten, die jemals von dem Sensor in den Tangle gepusht wurden.

Wenn ich jetzt alles auf eine Adresse pushe, hätte ich auch erstmal nicht die Möglichkeit selektiert nur die Daten der letzten Stunden anzufordern, sondern würde alles, was auf der Adresse liegt, bekommen. Aber das Problem ist, dass ich eh einen Fehler bekomme, wenn bereits zu viele Transaktionen auf der Adresse liegen und das pullen zu lange dauern würde.

Wenn ich eine Transaktionskette mache, in der ich in jede Transaktion reinschreibe auf welcher Adresse ich die nachfolgende Transaktion finde, dann hätte ich ähnlich wie bei MAM eine Root-Adresse/Root-Transaktion. Daraus ergeben sich aber zwei Probleme:

  1. Auch hier müsste ich erstmal die komplette Transaktionshistorie durchkämmen, damit ich zu den aktuellen Daten komme. Gut, man könnte dies noch irgendwie organisieren, dass man nur einmal die Daten laden müsste und sich dann für beispielsweise jeden Tag eine Root-Adresse merkt um anschließend wieder schnelle Einstiegspunkte in der Transaktionskette findet und nicht die kompletten Daten abspeichern muss.

  2. Aber was machst du dann, wenn es einen Snapshot gibt und die Transaktionsdaten verschwunden sind? Ein neuer Client könnte mit der ursprünglichen Root-Adresse nichts mehr anfangen.

Eine Idee, die ich vlt noch hätte, ist, dass man sich an den Adressnamen orientiert. zB das die letzten Zeichen einer Adresse das Datum+Stunde repräsentieren und man dann guckt, ob auf dieser Adresse Transaktionen zu finden sind. Ich glaube, das probier ich mal aus xD

Hoffe das ist irgendwie verständlich.

Nein, kannte ich noch nicht. Werde ich mir gleich mal aneignen. Danke!

Nein, ich kannte die Seite auch noch nicht. Sieht aber sehr gut aus und ist sicher ne gute Anlaufstelle für Entwickler.
Aber ich sehe auf den ersten Blick kein Beispiel, das mein Problem löst.

Ich schreibe gerade an einer Klasse die eine 67-Zeichen-lange Adresse, sowie einen TimeMode entgegennimmt.

Die Klasse hat die Funktion „sendMessage“, die wiederum eine Nachricht entgegennimmt.
Bevor die Funktion die Nachricht senden kann, wird die 67-Zeichen-lange Adresse auf 81 Zeichen vervollständigt.
Die letzten 14 Zeichen ergeben dann einen Zeitcode:
Angenommen ich sende eine Transaktion um 14.25:00 Uhr am 10.05.2020
dann würden die letzten Zeichen zB so aussehen: 05102020142500.
Dies würde dem Format „MM-DD-YYYY-hh-mm-ss“ entsprechen wobei

  • M = Monat
  • D = Tag
  • Y = Jahr
  • h = Stunde
  • m = Minute
  • s = Sekunde

sind.
Jetzt ist es aber so, dass Iota-Adressen nur aus Großbuchstaben + der Zahl 9 bestehen dürfen. Andere Zahlen sind nicht erlaubt.
Daher habe ich die Zahlen einfach umgewandelt:

  • 0 > A
  • 1 > B
  • 2 > C
  • 3 > D
  • 4 > E
  • 5 > F
  • 6 > G
  • 7 > H
  • 8 > I
  • 9 > J

Aus 05102020142500 wird dann AFBACACABEFAAA.

Da man beim anschließenden Durchsuchen des Tangles aber nicht unbedingt jede mögliche Sekunde durchsuchen möchte, muss ein TimeMode bei der Erstellung angegeben werden.
Aktuell gäbe es die Modi

  • OneMinute
  • TenMinutes
  • OneHour
  • OneMonth
  • OneYear

Ist der TimeMode „OneYear“ ausgewählt, werden alle Transaktionen innerhalb eines Jahres auf einer Adresse gesammelt. Nämlich die Adresse, die den Zeitraum 01.01. 00.00:00 Uhr bis 31.12. 23.59:59 Uhr eines Jahres repräsentiert.
Für das Jahr 2020 würden bei dem Format „MM-DD-YYYY-hh-mm-ss“ der Adresse-Zeitcode wie folgt aussehen ABABCACAAAAAAA für 01012020000000.

Beim Erstellen eines Tickers müsste man sich also fragen, wie häufig eine Nachricht gesendet wird.
In meinem Temperaturüberwachungszenario würde es ausreichen, wenn ich nur jede Minute einen Temperaturwert in den Tangle schreibe. Daher würde ich den Modus „TenMinutes“ nehmen, sodass immer ungefähr 10 Werte auf eine Adresse geschrieben werden, bevor aus Zeitgründen die Werte dann automatisch auf eine neue Adresse geschrieben werden.

Für andere Szenarien, zB wenn immer nur ein Tageswert in den Tangle geschrieben wird, würde sogar der „OneMonth“-Modus ausreichen.

Der Client (also die App in meinem Falle) könnte, wenn er die 67-Zeichen-Adresse und den verwendeten TimeModus kennt, gezielt nach den Informationen in einem bestimmten Zeitraum suchen, ohne dass er die vorherigen Werte zusätzlich aus dem Tangle bekommt.

Zusätzlich könnte man noch die Nachrichten ohne Probleme verschlüsselt in den Tangle senden, sodass nur Leute, die das Passwort kennen, diese Nachrichten entziffert lesen könnten.

Ein Problem sehe ich (für die Zukunft) aber noch:
Spammer könnten meine Adressen zumüllen, sodass auch ich ewig brauchen würde, um wieder meine Informationen aus dem Tangle zu ziehen. Aber aktuell ist das denke ich noch nicht so das Problem.

Mein Ansatz ist sicher auch von der IF nicht so gedacht und in Zukunft wird es hoffentlich einfache anwendbare Lösungen für dieses Problem geben, aktuell ist dem aber nicht so.

Was haltet ihr von der Idee?

Evtl. solltest du es doch lieber mit MAM versuchen!
Das wurde genau dafür entwickelt.

Mit .NET scheint das sehr einfach möglich zu sein:
https://tangle-net.readthedocs.io/en/latest/mam.html

Ob jetzt Java oder .NET ist ja erst mal egal :wink:

Der Iota-Price Ticker selbst hat erstmal nichts mit dem Tangle zu tun. Der holt sich die Daten von CoinMarketcap. Die hackster-Seite sieht aber ganz gut aus. Mal sehen ob ich da was finde.

Ja, MAM wäre wahrscheinlich die smarteste Lösung, aber ist halt leider erst offiziell für Javascript/Typescript verfügbar. Hast du schon versucht Tangle-Net irgendwie zu verwenden?

Aber auch bei MAM sehe ich das Problem, dass man von der Root-Transaktion erstmal alle Transaktionen durchkämmen muss, bis man zu den aktuellen, relevanten Transaktionen kommt, sofern man keinen weiteren Einstiegspunkt zugewiesen bekommt. Das wäre erstmal nicht das Problem. Ein Client müsste sich dann halt einmalig durch alle Tranaktionen durchkämpfen, könnte dabei aber für ihn selbst sinnvolle Einstiegspunkte definieren. (zB. Jeden Tag ein Einstiegspunkt lokal speichern)
Aber was passiert nach einem Snapshot? Betrifft dieser MAM nicht? Sobald ein Teil der Transaktionskette weg ist, kann ich nicht mehr auf die aktuellen Daten zugreifen.
Oder habe ich MAM komplett falsch verstanden?

So wie ich das verstehe, musst du eben NICHT alle Transaktionen durchsuchen! Der MAM-Channel muss bevor er beendet wird serialisiert werden, damit beim nächsten mal, alle verpassten Transaktionen automatisch gefunden werden können.

Given the statefullness of channels and subscriptions, any application should persist the state of them. This is especially true for channels, where each message has its own index. No second message should be published to that index (similar to the address reuse issie).

The state of a channel/subscription can be retrieved by simply calling the .ToJson method. This generates a JSON representation of the channel/subscription. When recreating the channel/subscription, simply use the factories CreateFromJson method.

var subscrptionJson = subscription.ToJson();
var factory = new MamChannelSubscriptionFactory(iotaRepository, CurlMamParser.Default, 
CurlMask.Default);

var channelSubscription = factory.CreateFromJson(subscrptionJson)
var channelJson = channel.ToJson();
var factory = new MamChannelFactory(CurlMamFactory.Default, CurlMerkleTreeFactory.Default, 
iotaRepository);

var channel = factory.CreateFromJson(channelJson)

Okay, wenn das der Fall ist, wäre das natürlich klasse.

Ich habe jetzt ein kleines .NET Core Programm geschrieben und das ganze getestet. Auf den ersten Blick funktioniert es!

Das löst genau dein beschriebenes Problem.

Bein Interesse, kann ich dir gerne den C# Code zukommen lassen, wobei der fast 1:1 dem Beispiel entspricht.

2 Like

Jo gerne. Ich melde mich am Wochenende nochmal. Grad keine Zeit :stuck_out_tongue:

Hi ich hätte sehr gerne den Code. Ich programmiere auf unity und könnte ihn eventuell gebrauchen.

Hi zusammen.
Ich programmiere zur Zeit die App IOTA+OS nano.
Da könnt ihr im Bereich „Connect“ Adressen abspeichern und sehen was passiert, respektive passiert ist.
Diese Adressen werden mit deinen anderen Accountdaten ebenfalls auf dem Tangle abgespeichert(die App funktioniert 100% nur mit IOTA), sodass du dich später einloggen kannst und deine Wunschadressen gleich wieder hast.

Zurzeit wird die Message einer Transaktion als string angezeigt aber das lässt sich grafisch einfach schöner darstellen(Zum Beispiel in einem Graph über die Zeit oder einfach ein Thermometer für die aktuelle Temperatur)
Die App sortiert automatisch die Reihenfolge der Transaktionen, sodass ein Graph leicht erstellt werden kann.

Lade dir die App doch einfach runter und gebe mir ein Feedback was du für zusätzliche Features brauchst(eben z.B. Darstellung, Auswertung)

Ich setz mich mal daran den TTGO zu programmieren und überlege mir noch zusätzlich ob es möglich ist, direkt von der IOTA+ app aus das Gerät steuern(aus/ein schalten, standby oder Ähnliches).
Ich habe eine Klimaanlage die nur bei einer gewissen Temperatur anspringen soll.
Zusätzlich möchte ich sie manuell steuern, sodass ich 10 Minuten bevor ich nach Hause komme die aktuelle Temperatur nachschauen und bei bedarf die Klimaanlage einschalten kann.

1 Like

Klar, kannst gerne haben. Erwarte aber nicht zu viel, das war nur ein kleiner Test :slight_smile:

https://1drv.ms/u/s!AhmTIyg8aWUgr8gcsjNCoQX-1mKfQQ?e=Chnr2l

Wo finde ich die App, hast du einen Link?

Hahaha ja sorry :smiley:

iota-plus.com
unter downloads

Wenn die App offen ist, registriere dich links unten und suche dann die App „Connect“. Du kannst da dann „Add“ klicken und eine IOTA Adresse eingeben und den Stream benennen.

PS: Falls dir die Energie ausgeht und du keine kaufen möchtest um die App weiterhin zu nutzen, kannst du unter Einstellungen „Ads“ aktivieren. So lädst du Energie wieder auf. Wenn du mal IOTAs brauchst kannst du deine Energie sogar im Shop tauschen gegen echte IOTAs und sie in der „wallet“ App verschicken wohin du möchtest.

mmh bekomme es nicht so ganz hin, habe die Windows-Version genommen.
Was meinst du mit Energie? Ist die App nur nutzbar, wenn man Energie kauft bzw. durch Werbung welche bekommt?

Der Stream bezieht sich nur auf eine Adresse oder? Damit ist nicht MAM gemeint?

1 Like

Hey ja die Windows Version habe ich vorher runtergenommen, um eine neuere Version hochzuladen.
Ich bin aber noch etwas am lösen. Versuche es doch in ein paar Minuten nochmal.

Ja bei der Windows Version geht Werbung schauen nicht, also das fällt weg.
Ich werde bei der jetzigen Version jedoch die geschenkten 30 Energie auf 70 Energie erhöhen.
Damit kannst du genügend Speicherungen(5 Energie) vornehmen und/oder Chatnachrichten (1 Energie) versenden.
Versenden von IOTAs (also nicht reine Datenströme) sind gratis. Versende 10 IOTAs und es kommen 10 IOTAs an.
Das auslesen von ist auch gratis.

Wegen MAM: Ich habe anfänglich MAM benutzt im „IOTA+OS Connect“ und werde wahrscheinlich nach dem 1.5 Crysalis update wieder wechseln, doch im moment fragt die app alle 7 Sekunden alle Messageinhalte aller Transaktionen von einer Adresse ab, filtert sie, sortiert sie und stellt sie (noch im moment) als chat dar zum scrollen und schreiben.

Wenn das TTGO nun auch Transaktionen von der Adresse auslesen kann, kann man es steuern. Mit einem Raspberry pi sollte es gehen…