[JAVA] IOTA: [Technische Erklärung] Das ganze Bild des Überweisungsbündels.

English here. Special thanks to Take san for translating it!

Frühere Artikel, * IOTA: [Technische Erklärung] Transaktion große Dissektion! Was macht die Brieftasche hinter den Kulissen? * Es war ein Wahnsinniger, den ich in * nicht erklären konnte. Dies liegt daran, dass die Grundlage dieses Bundles das vorausgesetzte Wissen ist, um die Aufmerksamkeitstechnologie, MAM und Mehrfachsignatur von IOTA in Zukunft zu verstehen. Der Quellcode im Artikel verwendete Java. Der Grund ist, dass Java mein Favorit ist und es leichter zu verstehen ist, ob Sie den Typ der Variablen sehen können. Natürlich kann IOTA in verschiedenen Umgebungen entwickelt werden. Wenn Sie also interessiert sind, schauen Sie sich IOTA Official Github an.

Was ist IOTA?

Eine Sammlung von Links, die Ihnen helfen, die Grundlagen von IOTA zu verstehen, da IOTA noch nicht bekannt ist.

** IOTA Japanese Fan Site ** Aktuelle offizielle IOTA Japan-Site. Dies liegt daran, dass die offiziellen IOTA-Informationen ins Japanische übersetzt und veröffentlicht werden. Viele Informationen für Anfänger sind ebenfalls veröffentlicht. ** White Paper ** Englisch [Japanisch](https://www.dropbox.com /s/1w5vtu7s4idquc9/IOTA_Whitepaper%20v1.1%20in%20Japanese.pdf?dl=0) Der Umriss von Tangle steht am Anfang, und danach werden Sicherheit, erwartete Angriffe und deren Widerstand mit fortgeschrittener Mathematik erklärt. ing. Die zweite Hälfte ist nicht für Anfänger geeignet. ** Reddit-Anfänger-Thread (Englisch) ** Ich habe hier angefangen. ** IOTA Guide (Englisch) ** Wenn das Whitepaper die Fakultät für Naturwissenschaften ist, ist dies die Fakultät für Ingenieurwissenschaften.

Die IOTA-Community ist auf der Basis von Slack gewachsen. Es gibt auch einen japanischen Kanal ** #japanese **, also zögern Sie nicht, sich anzumelden und Fragen zu stellen.

Transaktionsstruktur

Es ist möglicherweise einfacher zu verstehen, wenn Sie sich die vergangenen [Artikel] ansehen (https://qiita.com/ABmushi/items/e271ff05884a7d47658d#transaction%E5%A4%A7%E8%A7%A3%E5%89%96). Die folgende Quelle stammt aus Transaction.java. Ich habe die wichtigsten kommentiert.

Transaction.java


public class Transaction {

    private static final transient Logger log = LoggerFactory.getLogger(Transaction.class);

    private transient ICurl customCurl;

    private String hash;                //Transaktions-Hash (Identität)
    private String signatureFragments;  //Ein Feld mit einer Länge von 2187 Triten, das zum Signieren usw. verwendet wird.
    private String address;             //Geben Sie die Adresse an
    private long value;                 //Geben Sie den Betrag an
    private String obsoleteTag;
    private long timestamp;             //Wurde obligatorisch
    private long currentIndex;          //Welche Nummer hat dieser Tx im Bundle? (Beginn bei 0)
    private long lastIndex;             //Was ist der Tx-Index am Ende des Bundles?
    private String bundle;              //Gibt an, zu welchem Bundle diese Transaktion gehört
    private String trunkTransaction;    //Genehmigen Sie Tx Teil 1
    private String branchTransaction;   //Genehmigen Sie Tx Teil 2
    private String nonce;               //Suche nach PoW
    private Boolean persistence;        //Richtig, wenn genehmigt. Falsch, wenn nicht genehmigt
    private long attachmentTimestamp;
    private String tag;                 //Beliebige 27 banale Tags
    private long attachmentTimestampLowerBound;
    private long attachmentTimestampUpperBound;

Für die Überweisung sind mindestens zwei ** Empfangsadresse (Ziel) ** und ** Sendequelladresse (Absender) ** erforderlich. Wie Sie jedoch sehen können, hat jedes Transaktionsobjekt nur eine Adresse. Daher hat IOTA das Konzept des Bundles eingeführt. Durch das Einfügen mehrerer Transaktionsobjekte in das Bundle werden verschiedene erforderliche Elemente wie die Empfangsadresse, die Sendeadresse und die Signatur verwaltet, indem die Rollen in separate Transaktionsobjekte aufgeteilt werden.

API übertragen

Die API zum Senden von Geld ist leicht zu sehen.

Klasse übertragen

Überweisungsinformationen aufbewahren.

Transfer.java


public class Transfer {

    private String timestamp;      //Zeitstempel
    private String address;        //Empfangsadresse (Ziel)
    private String hash;
    private Boolean persistence;   // true:Genehmigt, falsch:Nicht genehmigt
    private long value;            //Überweisungsbetrag
    private String message;        //Jede Kleinigkeit
    private String tag;            //Tag (27 Triten)

    //Objektgenerierung übertragen
    //Zieladresse, Überweisungsbetrag, beliebiger Nachrichtentrick, Tag
    public Transfer(String address, long value, String message, String tag) {
        this.address = address;
        this.value = value;
        this.message = message;
        this.tag = tag;
    }
...

sendTransfer-Funktion

Eine Funktion namens "sendTransfer" wird zum Senden von Geld verwendet. Führen Sie mehrere Übertragungen gleichzeitig durch, indem Sie eine Liste von Übertragungsobjekten als Argumente verwenden.

IotaApi.java


/**
 * Wrapper function that basically does prepareTransfers, as well as attachToTangle and finally, it broadcasts and stores the transactions locally.
 *
 * @param seed               Tryte-encoded seed
 * @param security           The security level of private key / seed.
 * @param depth              The depth.
 * @param minWeightMagnitude The minimum weight magnitude.
 * @param transfers          Array of transfer objects.
 * @param inputs             Optional: List of inputs used for funding the transfer.
 * @param remainderAddress   Optional: If defined, this remainderAddress will be used for sending the remainder value (of the inputs) to.
 * @param validateInputs     Whether or not to validate the balances of the provided inputs.
 * @param validateAddresses  Whether or not to validate if the destination address is already used and if a key reuse is detect.
 * @return Array of valid Transaction objects.
 * @throws ArgumentException is thrown when the specified input is not valid.
 */
public SendTransferResponse sendTransfer(
        String seed,
        int security, int depth, int minWeightMagnitude,
        final List<Transfer> transfers,
        List<Input> inputs,
        String remainderAddress,
        boolean validateInputs, boolean validateAddresses) throws ArgumentException {
....
}

Überweisung

** Werfen Sie einen kurzen Blick auf das Beispiel "Herr A sendet eine Nachricht an Herrn B und sendet 100 Währungen" **.

//Die Nachricht ist eine Kleinigkeit jeder Größe
String message = "MESSAGE..."

//Das Tag ist 27 Triten
String tag = "SAMPLE9TAG99999999999"

//Die Adresse lautet 81 Trite. Die Adresse von Herrn B.
String address = "B9ADDRESS..."

//Erstellung des Transferobjekts (100 Währungen mit Nachricht an die Adresse von Herrn B senden)
Transfer transfer = new Transfer(address,100,message,tag);
List<Transfer> list = new List<>();
list.add(transfer);

//Überweisung
sendTransfer("Geben Sie den Samen von Herrn A an",security,depth,minWeightMagnitude,list,null,null,true,true);

Ich habe versucht, den Überweisungsteil des Quellcodes der offiziellen Brieftasche zu vereinfachen. Ich habe dies nicht versucht, daher kann ich nichts sagen, aber die Überweisung erfolgt im obigen Ablauf. In diesem Artikel möchte ich darauf achten, was sich in dieser Funktion "sendTransfer" befindet. Der richtige Weg, um Geld zu senden, besteht darin, sich die offizielle Quelle anzusehen. Ich werde hier einen Link einfügen.

Python iota.lib.py/examples/send_transfer.py Android android-wallet-app/app/src/main/java/org/iota/wallet/ui/fragment/NewTransferFragment.java

Bündelstruktur

Zunächst erstellt IOTA ein Bundle für die Überweisung. Ein Bundle ist eine Sammlung von "Transaktionen", der kleinsten Einheit von IOTA. Die für eine Überweisung erforderlichen Informationen wie Überweisungsbetrag und Unterschrift werden zusammengefasst. Das Bundle besteht aus drei Hauptteilen.

① Ausgabeabschnitt - 'Ausgabe' (geben Sie an, wohin und wie viel Geld gesendet werden soll) ② Geben Sie den Abschnitt 'Eingabe' ein (geben Sie an, wohin der Betrag gebracht werden soll). ③ Differenzausgabeeinheit - 'Rest' (geben Sie an, wohin die Änderung gesendet werden soll)

Ein Beispiel für das Senden von "13i" an die Adresse "DEFBQV ...". (Sicherheit = 2) bundle_basic.png

Ausgabe - Ausgabe

Das Senden von Geld an eine bestimmte Zieladresse wird als ** Ausgabe ** bezeichnet. Der Ausgabeabschnitt, der die erste Hälfte des Bundles darstellt, übernimmt die Ausgabe. Die Ausgabeeinheit hat die folgenden Rollen.

① Geben Sie den Überweisungsbetrag an ② Bezeichnung des Überweisungsziels ③ Speicherung einer beliebigen Nachricht (Nachricht)

Das Beispiel von ** "Herr A legt eine Nachricht an Herrn B und sendet 100 Währungen" ** lautet wie folgt.

bundle_output.png

Wie Sie der Abbildung entnehmen können, geben Sie den Überweisungsbetrag auf "Wert" von ** Tx.0 ** und das Ziel auf "Adresse" an. Dann wird der "Nachricht" -Teil in Blöcke der Größe 2187 Trits unterteilt und in "sigF" von Tx.0, Tx.1, ... in der Reihenfolge von vorne gespeichert. Wenn message kürzer als 2187 trites ist, ist der Ausgabeabschnitt nur Tx.0, dh eine Transaktion ist ausreichend. Wenn die "Nachricht" lang ist, erhöht sich auch die "Transaktion" und der Ausgabeabschnitt selbst ist lang. Da "Nachricht" fast nie genau ein Vielfaches von 2187 ist, füllen wir normalerweise den Bruchteil von "sigF" mit "9". Obwohl jede "Nachricht" in "sigF" durch ein Tritus dargestellt wird, kann sie natürlich von einem Tritus in ein Zeichen umgewandelt werden, sodass der Inhalt des Satzes im Tangle fehlt. Daher wurde eine Verwendungsmethode namens ** MAM (Masked Authenticated Message) ** vorgeschlagen, die durch Verschlüsselung dieses "sigF" einen privaten Speicherplatz in Tangle bereitstellt und derzeit erforscht und entwickelt wird (nächster Abschnitt).

Relevanz für MAM

MAM ist eine der vielversprechendsten Funktionen in IOTA und eine Funktion, mit der Daten in Tangle gespeichert werden können, während die Privatsphäre gewahrt bleibt. Kurz gesagt, es verschlüsselt den Inhalt dieses "sigF", das jetzt auf Tangle verfügbar ist und von jedem angezeigt werden kann. Mit IOTA, für das keine Gebühren anfallen, können Sie null Yen senden, sodass Sie das "sigF" dieser Transaktion aktiv als privaten Datenbereich verwenden können. Die Veröffentlichung eines Kommentarartikels ist mein letzter Traum in diesem Jahr.

Eingabeabschnitt - Eingang

Das Sammeln des Überweisungsbetrags von der Adresse mit dem Guthaben auf dem Tangle wird als ** Eingabe ** bezeichnet. Sie müssen irgendwo genug Geld haben, um die im Ausgabeabschnitt angegebene Ausgabe auszuführen. Sie müssen auch doppelte Zahlungen verhindern, indem Sie unterschreiben, dass Sie von der Adresse bezahlt wurden. Die Eingabeeinheit, die sie übernimmt, hat die folgenden Rollen.

① Geben Sie die Eingabemenge an ② Geben Sie die Eingabeadresse an ③ Vorzeichen der Eingabeadresse

** Fahren Sie mit dem Beispiel von "Herr A setzt eine Nachricht auf Herrn B und sendet 100 Währungen" fort. ** Geben Sie an, wohin mehr als 100 Währungen gebracht werden sollen. Ich sage hier "mehr als", weil der Überschuss im nächsten Differenzausgabeabschnitt gesammelt werden kann.

bundle_input.png

In diesem Beispiel gibt es zwei Eingänge (Eingang 1 und Eingang 2). Der Grund ist, dass der Gesamtbetrag jeder gehaltenen "Adresse" (Herr A ① + Herr A ② = ** - 144 **) schließlich den Überweisungsbetrag ** 100 ** abdecken kann. Der Überschuss ** 44 ** wird im nächsten Abschnitt, dem Differenzausgabeabschnitt, behandelt. Wenn Herr A beispielsweise an einer bestimmten Adresse ein Guthaben von 100 oder mehr hat, reicht es aus, eine davon einzugeben, und infolgedessen wird die Länge des Eingabeabschnitts kürzer. Wichtiger als das ist das "sigF". Es gibt zwei Signaturen für eine Eingabeadresse. Dies hängt vom Argument "security" der Funktion "sendTransfer" ab. Wenn "security = 1" ist, wird nur "1" generiert. Mit anderen Worten, in dieser Abbildung sind insgesamt zwei Unterschriften für Herrn A ① und Herrn A required erforderlich. Wenn "Sicherheit = 3", muss jede Eingabeadresse bis "Teil 3" signiert werden, und im Eingabeabschnitt werden insgesamt 2 * 3 = 6 Transaktionen generiert. Die Formel lautet wie folgt.

$ Transaktionsnummer = Sicherheit * Eingabenummer $

Informationen zur Signaturmethode finden Sie unter Frühere Artikel Ich habe es in B9% E6% B3% 95) erwähnt, daher würde ich es begrüßen, wenn Sie sich darauf beziehen könnten.

Differenzausgabeabschnitt - verbleibend

Da es normalerweise keine Eingabeadresse gibt, deren Kontostand mit dem Ausgabewert übereinstimmt, wird ein Kontostand, der den Ausgabewert überschreitet, von mehreren Eingabeadressen erfasst. Daher tritt eine Änderung auf. Wenn in IOTA eine einmal signierte Adresse als Eingabeadresse verwendet und neu signiert wird, führt dies zum Verlust des privaten Schlüssels. Mit anderen Worten, erhalten Sie kein Geld an einer Adresse, die Sie einmal unterschrieben haben. Wenn die Änderung an die ursprüngliche Eingabeadresse zurückgegeben wird, verstößt sie gegen dieses Prinzip. Die Änderung wird dann an eine andere neue Adresse ausgegeben. Die Differenzausgabeeinheit hat die folgenden Rollen.

① Differenzbezeichnung ② Geben Sie die Ausgabeadresse an

** Im Beispiel von "Herr A legt eine Nachricht an Herrn B und sendet 100 Währungen" ** kam der Rest von ** 44 ** Währungen schließlich heraus. Schauen Sie sich die Abbildung unten an.

bundle_remainder.png

Es ist sehr einfach. Die Differenzausgabeeinheit erzeugt nur einen TX, wenn ein Unterschied vorliegt. Der Änderungsbetrag wird nur an die neue Adresse von Herrn A (Herr A ③) ausgegeben. Für diejenigen, die sich fragen, wie die neue Adresse lautet: [Frühere Artikel](https://qiita.com/ABmushi/items/e271ff05884a7d47658d#%E3%82%A2%E3%83%89%E3%83%AC%E3 Bitte lesen Sie% 82% B9) zurück. Übrigens, wenn die Änderung Null ist (die genaue Eingabeadresse wird gefunden), wird die Differenzausgabeeinheit selbst nicht erzeugt.

Beim Senden von Geld an mehrere Adressen

Wenn Sie Geld an mehrere verschiedene Adressen senden, ** erhöhen Sie den Ausgabeabschnitt um die Anzahl der Adressen. ** ** **

bundle_mult_out.png Es ist einfach, den Eingabebereich und den Differenzausgabeabschnitt zu handhaben. In diesem Beispiel sucht der Eingabeabschnitt nach Eingabeadressen für (100 + 1000 + 634 = 1734) oder mehr, und der Unterschied besteht nur darin, die Änderung in einen Tx zu setzen, und es wird nichts Besonderes getan.

Das ganze Bild von Bundle

Jetzt generiert die IOTA-Transaktion nicht nur, sondern hat die Aufgabe, zwei Transaktionen mit den Namen "trunkTransaction" und "branchTransaction" zu genehmigen.

Auswahl der zu genehmigenden Tipps

Transaktionen mit der Bezeichnung "Tipps zum Genehmigen" können problemlos mit der Funktion "getTransactionToApprove" abgerufen werden. Es ist zu einfach, aber es steckt ein hohes Maß an Mathematik dahinter, was die Köpfe von Amateuren wie mir stört. Es ist sehr unhandlich, deshalb möchte ich jemanden, der Mathematik kann, bitten, dies zu erklären.

Bündelgenehmigungsbeziehung

Wie ich im vorherigen Artikel erwähnt habe, habe ich es gewagt, die Figur erneut zu zeichnen.  bundle_approve.png Wenden Sie die von der Funktion "getTransactionsToApprove" zurückgegebenen "trunkTransaction" und "branchTransaction" auf den "Milestone" bzw. "other Tx" in der Abbildung an. Sehen Sie sich die entsprechenden Transaktionen und Bundles im Tangle Explorer an, z. B. https://iotasear.ch/. Es sollte genau so sein, wie es in diesem Artikel vorgestellt wurde. (Bitte melden Sie, wenn es anders ist)

Cheet Blatt

Druckgröße. Ich möchte es von Zeit zu Zeit aktualisieren, um es schön zu machen. bundle_cheat_sheet.png

Verweise

** IOTA Java Library JOTA ** iotaledger / iota.lib.java

Wie immer freuen wir uns über Ihr Feedback zum Artikel.

Recommended Posts

IOTA: [Technische Erklärung] Das ganze Bild des Überweisungsbündels.
Erläuterung der Reihenfolge der Schienenrouten