Test-Client für TON (Telegram Open Network) und die neue Sprache Fift für Smart Contracts

Vor mehr als einem Jahr wurden die Pläne des Messengers Telegram bekannt, ein eigenes dezentrales Netzwerk zu veröffentlichen. Telegram Open Network. Zu diesem Zeitpunkt wurde ein umfangreiches technisches Dokument veröffentlicht, das vermutlich von Nikolai Dorov verfasst wurde und die Struktur des zukünftigen Netzwerks beschrieb. Für diejenigen, die es verpasst haben – ich empfehle, meine Zusammenfassung dieses Dokuments zu lesen (Teil 1, Teil 2; der dritte Teil liegt jedoch leider noch im Entwurf).

Seitdem gab es keine nennenswerten Neuigkeiten zum Entwicklungsstatus von TON, bis vor ein paar Tagen (in einem der inoffiziellen Kanäle) ein Link zu einer Seite auftauchte, https://test.ton.org/download.html, wo Folgendes zu finden ist:
ton-test-liteclient-full.tar.xz – der Quellcode für einen leichten Client für das Testnetz von TON;
ton-lite-client-test1.config.json – eine Konfigurationsdatei zur Verbindung mit dem Testnetz;
README – Informationen zum Bauen und Starten des Clients;
HOWTO – eine Schritt-für-Schritt-Anleitung zur Erstellung eines Smart Contracts mit dem Client;
ton.pdf — ein aktualisiertes Dokument (vom 2. März 2019) mit einer technischen Übersicht des TON-Netzwerks;
tvm.pdf – eine technische Beschreibung der TVM (TON Virtual Machine, virtuellen Maschine TON);
tblkch.pdf — technische Beschreibung der TON-Blockchain;
fiftbase.pdf — Beschreibung der neuen Programmiersprache Fift, die für die Erstellung von Smart Contracts in TON gedacht ist.

Ich wiederhole, es gab keine offiziellen Bestätigungen der Seite und aller dieser Dokumente seitens Telegram, aber der Umfang dieser Materialien macht sie ziemlich glaubhaft. Der Start des veröffentlichten Clients erfolgt auf eigenes Risiko..

Zusammenstellung des Testclients

Zunächst werden wir versuchen, den Testclient zu erstellen und zu starten – zum Glück, README beschreibt diesen unkomplizierten Prozess detailliert. Ich werde dies am Beispiel von macOS 10.14.5 machen, für den Erfolg der Erstellung auf anderen Systemen kann ich keine Garantie übernehmen.

  1. Laden Sie herunter und entpacken Sie das Archiv mit den Quellcodes. Es ist wichtig, die neueste Version herunterzuladen, da die Abwärtskompatibilität zu diesem Zeitpunkt nicht garantiert werden kann.

  2. Stellen Sie sicher, dass auf dem System die neuesten Versionen von make, cmake (Version 3.0.2 oder höher), OpenSSL (einschließlich der C-Header-Dateien), g++ oder clang installiert sind. Ich musste nichts zusätzlich installieren, alles wurde sofort zusammengestellt.

  3. Angenommen, die Quellcodes sind im Ordner ~/lite-client. Separat davon erstellen wir einen leeren Ordner für das gebaute Projekt (zum Beispiel, ~/liteclient-build), und von dort (cd ~/liteclient-build) rufen wir die Befehle auf:

    cmake ~/lite-client
    cmake --build . --target test-lite-client

    Test-Client für TON (Telegram Open Network) und die neue Sprache Fift für Smart Contracts

    Um den Fift-Interpreter für Smart Contracts (darüber später) zu bauen, rufen wir ebenfalls auf

    cmake --build . --target fift

  4. Laden Sie den aktuellen Konfigurationsdatei für den Anschluss an das Testnetz herunter und legen Sie ihn in den Ordner mit dem gebauten Client.

  5. Fertig, der Client kann gestartet werden:

    ./test-lite-client -C ton-lite-client-test1.config.json

Wenn alles richtig gemacht wurde, sollten Sie etwas Ähnliches sehen:

Test-Client für TON (Telegram Open Network) und die neue Sprache Fift für Smart Contracts

Verfügbare Befehle, wie wir sehen, sind wenig:
help — diese Befehlsliste anzeigen;
beenden — beenden;
time — die aktuelle Uhrzeit auf dem Server anzeigen;
status — den Verbindungsstatus und die lokale Datenbank anzeigen;
last — Aktualisieren Sie den Zustand der Blockchain (laden Sie den letzten Block). Es ist wichtig, diesen Befehl vor allen Anfragen auszuführen, um sicherzustellen, dass Sie den aktuellen Zustand des Netzwerks sehen.
sendfile <filename> — Laden Sie eine lokale Datei in das TON-Netzwerk hoch. So erfolgt die Interaktion mit dem Netzwerk — einschließlich beispielsweise der Erstellung neuer Smart Contracts und der Anfragen zum Geldtransfer zwischen Konten;
getaccount

— Zeigen Sie den aktuellen (zum Zeitpunkt der Ausführung des Befehls last) Zustand des Kontos mit der angegebenen Adresse an;
privkey <filename> — Laden Sie den privaten Schlüssel aus einer lokalen Datei.

Wenn Sie beim Start des Clients einen Ordner mit der Option -Dübergaben, wird er den letzten Block des Masterchains dort ablegen:

./test-lite-client -C ton-lite-client-test1.config.json -D ~/ton-db-dir

Nun können wir zu interessanteren Dingen übergehen — die Fift-Sprache erkunden, versuchen, einen Smart Contract zu kompilieren (zum Beispiel ein Testwallet zu erstellen), ihn ins Netzwerk hochzuladen und Geldtransfers zwischen Konten auszuprobieren.

Die Fift-Sprache

Aus dem Dokument fiftbase.pdf kann man erfahren, dass das Telegram-Team eine neue Stack-Sprache entwickelt hat, um Smart Contracts zu erstellen, Fift (wohl vom Zahlwort fifth, ähnlich wie Forth – einer Sprache, die viele Gemeinsamkeiten mit Fift aufweist).

Das Dokument ist ziemlich umfangreich, mit 87 Seiten, und ich werde seinen Inhalt in diesem Artikel nicht ausführlich wiedergeben (zumal ich es selbst noch nicht ganz gelesen habe :). Ich werde mich auf die wesentlichen Punkte konzentrieren und ein paar Codebeispiele in dieser Sprache anführen.

Auf der grundlegenden Ebene ist die Syntax von Fift recht einfach: Der Code besteht aus Wörtern, die normalerweise durch Leerzeichen oder Zeilenumbrüche getrennt sind (eine Ausnahme: Einige Wörter benötigen nach sich keinen Trennzeichen). Jedes Wort ist eine groß-/kleinbuchstabensensible Zeichenfolge, die einer bestimmten die Definition (grob gesagt, das, was der Interpreter tun soll, wenn er auf dieses Wort trifft). Wenn es keine Definition für das Wort gibt, versucht der Interpreter, es als Zahl zu parsen und auf den Stack zu legen. Übrigens sind die Zahlen hier – überraschenderweise – 257-Bit-Ganzzahlen, und es gibt keine Brüche – vielmehr werden sie sofort in ein Paar Ganzzahlen umgewandelt, die den Zähler und den Nenner eines rationalen Bruchs bilden.

Wörter interagieren normalerweise mit den Werten, die sich an der Spitze des Stacks befinden. Eine spezielle Art von Wörtern ist Präfix — verwendet keine Stapel, sondern die nachfolgenden Zeichen aus der Quelldatei. Zum Beispiel werden String-Literale so realisiert — das Zeichen „Anführungszeichen“ (") ist ein Präfixwort, das nach dem nächsten (schließenden) Anführungszeichen sucht und den String zwischen ihnen auf den Stapel legt. Ähnlich verhalten sich Einzelzeilen- (//) und Mehrzeilen- (/*) Kommentare.

Damit endet fast die gesamte interne Struktur der Sprache. Alles andere (einschließlich Kontrollstrukturen) ist als Wörter definiert (entweder interne wie arithmetische Operationen und Definition neuer Wörter; oder definiert in der „Standardbibliothek“ Fift.fif, die sich im Ordner crypto/fift in den Quelldateien befindet).

Ein einfaches Beispiel für ein Programm in Fift:

{ dup =: x dup * =: y } : setxy
3 setxy x . y . x y + .
7 setxy x . y . x y + .

In der ersten Zeile wird ein neues Wort definiert setxy (bitte beachten Sie das Präfix {, das einen Block bis zum schließenden } erzeugt, und das Präfix :, das tatsächlich das Wort definiert). setxy nimmt die Zahl von der Spitze des Stapels, definiert (oder überschreibt) sie als globale Konstante x, und das Quadrat dieser Zahl als Konstante. y (da die Werte der Konstanten überschrieben werden können, würde ich sie eher Variablen nennen, aber ich folge der Namensgebung in der Sprache).

In den folgenden beiden Zeilen wird eine Zahl auf den Stack gelegt, dann wird setxy, danach werden die Werte der Konstanten ausgegeben x, y (zum Ausgeben wird das Wort .), beide Konstanten werden auf den Stack gelegt, addiert und das Ergebnis wird ebenfalls ausgegeben. Das Ergebnis wird sein:

3 9 12 ok
7 49 56 ok

(Die Zeile „ok“ wird vom Interpreter ausgegeben, wenn er die aktuelle Zeile im interaktiven Eingabemodus verarbeitet hat)

Hier ist auch ein vollständiges Beispiel für den Code:

"Asm.fif" einfügen

-1 konstante wc  // erstelle eine Brieftasche in der Arbeitskette -1 (Hauptkette)

// Neue einfache Brieftasche erstellen
&lt;{  SETCP0 DUP IFNOTRET INC 32 THROWIF  // zurückgeben, wenn recv_internal, fehlerhaft, es sei denn, recv_external
    512 INT LDSLICEX DUP 32 PLDU   // cs cnt signieren
    c4 PUSHCTR CTOS 32 LDU 256 LDU ENDS  // cs cnt cnt&#039; pubk signieren
    s1 s2 XCPU            // cs cnt pubk cnt&#039; cnt signieren
    EQUAL 33 THROWIFNOT   // (seqno nicht übereinstimmend?)
    s2 PUSH HASHSU        // cs cnt pubk hash signieren
    s0 s4 s4 XC2PU        // pubk cs cnt hash sign pubk
    CHKSIGNU              // pubk cs cnt ?
    34 THROWIFNOT         // Signatur stimmt nicht überein
    ACCEPT
    SWAP 32 LDU NIP 
    DUP SREFS IF:<{
      8 LDU LDREF         // pubk cnt mode msg cs
      s0 s2 XCHG SENDRAWMSG  // pubk cnt cs ; ( message sent )
    }>
    ENDS
    INC NEWC 32 STU 256 STU ENDC c4 POPCTR
}&gt;c
// Code
<b 0 32 u, newkeypair swap dup constant wallet_pk "new-wallet.pk" b>Datei
   B, 
b&gt; // Daten
// keine Bibliotheken
<b b{00110} s, rot ref, swap b>  // create StateInit
dup ."StateInit: " <s csr. cr
dup hash dup constant wallet_addr
."new wallet address = " wc . .": " x. cr
wc over 7 smca>$ Typ cr
256 u&gt;B "neue-brieftasche.addr" B&gt;file
<b 0 32 u, b>
dup ."signiere Nachricht: " <s csr. cr
dup hash wallet_pk ed25519_sign_uint rot
<b b{1000100} s, wc 8 i, wallet_addr 256 u, b{000010} swap <s b{0} b, b>
dup ."Externe Nachricht zur Initialisierung ist " <s csr. cr
2 boc+>B dup Bx. cr
"new-wallet-query.boc" tuck B&gt;file
."(In Datei gespeichert " type .")" cr

Diese etwas gruselig aussehende Datei ist dazu gedacht, einen Smart Contract zu erstellen – er wird in die Datei new-wallet-query.boc nach der Ausführung eingefügt. Beachten Sie, dass hier eine weitere Assemblersprache für die TON Virtual Machine verwendet wird (ich werde darauf nicht näher eingehen), deren Befehle in die Blockchain eingefügt werden.

Somit ist der Assembler für die TVM in Fift geschrieben – die Quellcodes dieses Assemblers befinden sich in der Datei crypto/fift/Asm.fif und werden zu Beginn des oben genannten Codeabschnitts eingebunden.

Was ich sagen kann, anscheinend liebt Nikolai Durov einfach, neue Programmiersprachen zu entwickeln 🙂

Erstellung eines Smart Contracts und Interaktion mit TON

Angenommen, wir haben den TON-Client und den Fift-Interpreter wie oben beschrieben eingerichtet und uns mit der Sprache vertraut gemacht. Wie erstellen wir nun einen Smart Contract? Dazu finden Sie Informationen in der Datei HOWTO, die den Quellcodes beigefügt ist.

Konten in TON

Wie ich in meinem Überblick über TONbeschrieben habe, enthält dieses Netzwerk mehr als eine Blockchain — es gibt eine gemeinsame, die sogenannte „Masterchain“, sowie eine beliebige Anzahl zusätzlicher „Workchains“, die durch eine 32-Bit-Zahl identifiziert werden. Die Masterchain hat die Kennung -1; zusätzlich kann die „Basis“-Workchain mit der Kennung 0 verwendet werden. Jede Workchain kann ihre eigene Konfiguration haben. Intern ist jede Workchain in Shardchains unterteilt, aber das ist bereits ein Implementierungsdetail, das nicht unbedingt im Kopf behalten werden muss.

Innerhalb einer Workchain werden zahlreiche Konten gespeichert, die ihre eigenen Identifikatoren account_id haben. Für die Masterchain und die Null-Workchain haben diese eine Länge von 256 Bit. Somit wird der Identifikator eines Kontos beispielsweise wie folgt aufgezeichnet:

-1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Dies ist das «Roh»-Format: Zuerst die Identifier des Workchains, gefolgt von einem Doppelpunkt und der Identifier des Kontos in hexadezimaler Darstellung.

Außerdem gibt es ein kompaktes Format – die Nummer des Workchains und die Adresse des Kontos werden binär kodiert, eine Prüfziffer wird hinzugefügt und das Ganze wird in Base64 kodiert:

Ef+BVndbeTJeXWLnQtm5bDC2UVpc0vH2TF2ksZPAPwcODSkb

Mit diesem Format können wir den aktuellen Status eines Kontos über den Test-Client mit folgendem Befehl abfragen:

getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Wir erhalten eine etwa solche Antwort:

[ 3][t 2][1558746708.815218925][test-lite-client.cpp:631][!testnode]    Anforderung des Kontostatus für -1:8156775B79325E5D62E742D9B96C30B6515A5CD2F1F64C5DA4B193C03F070E0D
[ 3][t 2][1558746708.858564138][test-lite-client.cpp:652][!testnode]    Kontostatus für -1:8156775B79325E5D62E742D9B96C30B6515A5CD2F1F64C5DA4B193C03F070E0D erhalten in Bezug auf Blöcke (-1,8000000000000000,72355):F566005749C1B97F18EDE013EBA7A054B9014961BC1AD91F475B9082919A2296:1BD5DE54333164025EE39D389ECE2E93DA2871DA616D488253953E52B50DC03F und (-1,8000000000000000,72355):F566005749C1B97F18EDE013EBA7A054B9014961BC1AD91F475B9082919A2296:1BD5DE54333164025EE39D389ECE2E93DA2871DA616D488253953E52B50DC03F
Der Kontostatus lautet (Kontostand
  addr:(addr_std
    anycast:nothing workchain_id:-1 address:x8156775B79325E5D62E742D9B96C30B6515A5CD2F1F64C5DA4B193C03F070E0D)
  speicher_stat:(storage_info
    genutzt:(storage_used
      cells:(var_uint len:1 value:3)
      bits:(var_uint len:2 value:539)
      public_cells:(var_uint len:0 value:0)) letzte_bezahlte:0
    fällige_zahlung:nothing)
  speicher:(account_storage last_trans_lt:74208000003
    saldo:(currencies
      grams:(nanograms
        amount:(var_uint len:7 value:999928362430000))
      andere:(extra_currencies
        dict:hme_empty))
    status:(account_active
      (
        split_depth:nothing
        special:nothing
        code:(just
          value:(raw@^Cell 
            x{}
             x{FF0020DDA4F260D31F01ED44D0D31FD166BAF2A1F80001D307D4D1821804A817C80073FB0201FB00A4C8CB1FC9ED54}
            ))
        data:(just
          value:(raw@^Cell 
            x{}
             x{0000000D}
            ))
        library:hme_empty))))
x{CFF8156775B79325E5D62E742D9B96C30B6515A5CD2F1F64C5DA4B193C03F070E0D2068086C000000000000000451C90E00DC0E35B7DB5FB8C134_}
 x{FF0020DDA4F260D31F01ED44D0D31FD166BAF2A1F80001D307D4D1821804A817C80073FB0201FB00A4C8CB1FC9ED54}
 x{0000000D}

Wir sehen die Struktur, die im DHT der angegebenen Blockchain gespeichert ist. Zum Beispiel befindet sich im Feld storage.balance der aktuelle Kontostand, in storage.state.code — der Code des Smart Contracts, und in storage.state.data — seine aktuellen Daten. Beachten Sie, dass der TON-Datenspeicher — Cell, oder Zelle — baumartig ist, wobei jede Zelle sowohl eigene Daten als auch untergeordnete Zellen haben kann. Dies wird in den letzten Zeilen anhand der Einrückungen gezeigt.

Erstellung des Smart Contracts

Jetzt lassen Sie uns eine solche Struktur erstellen (sie wird BOC genannt — bag of cells) mit der Sprache Fift. Glücklicherweise müssen wir den Smart Contract nicht selbst schreiben — im Ordner crypto/block im Archiv mit den Quellcodes gibt es eine Datei new-wallet.fif, die uns hilft, ein neues Wallet zu erstellen. Kopieren Sie es in den Ordner mit dem kompilierten Client (~/liteclient-build, wenn Sie den Anweisungen oben gefolgt sind). Den Inhalt habe ich bereits oben als Beispielcode in Fift angegeben.

Führen Sie diese Datei wie folgt aus:

./crypto/fift -I"/crypto/fift" new-wallet.fif

Hier <source-directory> muss durch den Pfad zu den entpackten Quellcodes ersetzt werden (das Symbol „~“ kann hier leider nicht verwendet werden, es ist der vollständige Pfad erforderlich). Anstelle der Verwendung des Schlüssels -I Sie können eine Umgebungsvariable festlegen FIFTPATH und diesen Pfad dort hineinlegen.

Da wir Fift mit dem Dateinamen gestartet haben new-wallet.fif, wird er diesen ausführen und beenden. Wenn Sie den Dateinamen weglassen, können Sie mit dem Interpreter im interaktiven Modus spielen.

Nach der Ausführung sollte in der Konsole Folgendes ausgegeben werden:

StateInit: x{34_}
 x{FF0020DDA4F260810200D71820D70B1FED44D0D31FD3FFD15112BAF2A122F901541044F910F2A2F80001D31F3120D74A96D307D402FB00DED1A4C8CB1FCBFFC9ED54}
 x{0000000055375F730EDC2292E8CB15C42E8036EE9C25AA958EE002D2DE48A205E3A3426B}

neue Wallet-Adresse = -1 : 4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2 
0f9PzVILj8yglrVn1zS-NSjtxr7QBfaTCp7JrBqnFPIR8nhZ
signiere Nachricht: x{00000000}

Externe Nachricht zur Initialisierung ist x{89FEE120E20C7E953E31546F64C23CD654002C1AA919ADD24DB12DDF85C6F3B58AE41198A28AD8DAF3B9588E7A629252BA3DB88F030D00BC1016110B2073359EAC3C13823C53245B65D056F2C070B940CDA09789585935C7ABA4D2AD4BED139281CFA1200000001_}
 x{FF0020DDA4F260810200D71820D70B1FED44D0D31FD3FFD15112BAF2A122F901541044F910F2A2F80001D31F3120D74A96D307D402FB00DED1A4C8CB1FCBFFC9ED54}
 x{0000000055375F730EDC2292E8CB15C42E8036EE9C25AA958EE002D2DE48A205E3A3426B}

B5EE9C724104030100000000D60002CF89FEE120E20C7E953E31546F64C23CD654002C1AA919ADD24DB12DDF85C6F3B58AE41198A28AD8DAF3B9588E7A629252BA3DB88F030D00BC1016110B2073359EAC3C13823C53245B65D056F2C070B940CDA09789585935C7ABA4D2AD4BED139281CFA1200000001001020084FF0020DDA4F260810200D71820D70B1FED44D0D31FD3FFD15112BAF2A122F901541044F910F2A2F80001D31F3120D74A96D307D402FB00DED1A4C8CB1FCBFFC9ED5400480000000055375F730EDC2292E8CB15C42E8036EE9C25AA958EE002D2DE48A205E3A3426B6290698B
(In Datei new-wallet-query.boc gespeichert)

Das bedeutet, dass die Brieftasche mit der ID -1:4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2 (oder, was dasselbe ist, 0f9PzVILj8yglrVn1zS-NSjtxr7QBfaTCp7JrBqnFPIR8nhZ) erfolgreich erstellt. Der entsprechende Code wird in der Datei new-wallet-query.boc, ihre Adresse ist new-wallet.addr, und der private Schlüssel ist in new-wallet.pk (Seien Sie vorsichtig – ein erneutes Ausführen des Skripts überschreibt diese Dateien).

Natürlich weiß das TON-Netzwerk noch nichts von dieser Geldbörse, sie existiert nur in Form dieser Dateien. Jetzt muss sie ins Netzwerk hochgeladen werden. Das Problem ist jedoch, dass für die Erstellung eines Smart Contracts eine Gebühr zu zahlen ist, und das Guthaben Ihres Kontos derzeit null ist.

In der Praxis wird dieses Problem durch den Kauf von Gramm auf der Börse (oder durch Übertragung von einer anderen Geldbörse) gelöst. Im aktuellen Testmodus gibt es jedoch einen speziellen Smart Contract, bei dem man bis zu 20 Gramm einfach so anfordern kann.

Anfrage an einen fremden Smart Contract

Die Anfrage an den Smart Contract, der Gramm nach Belieben verteilt, erfolgt wie folgt. Im gleichen Ordner crypto/block finden wir die Datei testgiver.fif:

// "testgiver.addr" file>B 256 B>u@ 
0x8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d
dup constant wallet_addr ."Test giver address = " x. cr

0x4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2
constant dest_addr

-1 constant wc
0x00000011 constant seqno

1000000000 constant Gram
{ Gram swap */ } : Gram*/

6.666 Gram*/ constant amount

// b x --> b'  ( serializes a Gram amount )
{ -1 { 1+ 2dup 8 * ufits } until
  rot over 4 u, -rot 8 * u, } : Gram, 

// create a message (NB: 01b00.., b = bounce)
<b b{010000100} s, wc 8 i, dest_addr 256 u, amount gram, 0 9 64 32 + 1+ "gift" $, b>
<b seqno 32 u, 1 8 swap ref, b>
doppelt ."umhüllende Nachricht: " <s csr. cr
<b b{1000100} s, wc 8 i, wallet_addr 256 u, 0 gram, b{00} s,
 swap <s b>
doppelt ."resultierende externe Nachricht: " <s csr. cr
2 boc+>B doppelt Bx. cr
"wallet-query.boc" B&gt;Datei

Diese speichern wir ebenfalls im Ordner des zusammengestellten Clients, aber wir korrigieren die fünfte Zeile – vor der Zeile „constant dest_addrWir ersetzen ihn durch die Adresse des Wallets, das Sie zuvor erstellt haben (vollständig, nicht verkürzt). Schreiben Sie am Anfang kein „-1:“, setzen Sie stattdessen „0x“ voran.

Es kann auch die Zeile geändert werden 6,666 Gramm*/ konstante Menge — das ist die Menge in Gramm, die Sie anfordern (nicht mehr als 20). Auch wenn Sie eine ganze Zahl angeben, lassen Sie den Dezimalpunkt stehen.

Schließlich muss die Zeile angepasst werden 0x00000011 konstante seqno. Die erste Zahl hier ist die aktuelle Sequenznummer, die im Konto gespeichert ist, das Gramm ausgibt. Woher bekommt man sie? Wie oben erwähnt, starten Sie den Client und führen Sie aus:

last
getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Am Ende der Daten des Smart Contracts wird sein

...
x{FF0020DDA4F260D31F01ED44D0D31FD166BAF2A1F80001D307D4D1821804A817C80073FB0201FB00A4C8CB1FC9ED54}
 x{0000000D}

Die Zahl 0000000D (bei Ihnen wird sie größer sein) ist die Sequenznummer, die Sie in testgiver.fif.

Alles klar, speichern Sie die Datei und starten Sie (./crypto/fift testgiver.fif). Als Ausgabe erhalten wir die Datei wallet-query.boc. Das ist die gebildete Mitteilung an einen fremden Smart Contract – die Anfrage „überweise so viel Gramm auf dieses Konto“.

Laden Sie es mit dem Client ins Netzwerk hoch:

> sendfile wallet-query.boc
[ 1][t 1][1558747399.456575155][test-lite-client.cpp:577][!testnode]    Sending query from file wallet-query.boc
[ 3][t 2][1558747399.500236034][test-lite-client.cpp:587][!query]   External message status is 1

Wenn Sie jetzt aufrufen last, und dann erneut den Status des Kontos abfragen, von dem wir Gram angefordert haben, sollten wir sehen, dass seine Sequenznummer um eins erhöht wurde — das bedeutet, dass er Geld an unser Konto gesendet hat.

Es bleibt nur noch ein Schritt — Laden Sie den Code unserer Brieftasche hoch (ihr Guthaben ist bereits aufgeladen, aber ohne den Code des Smart Contracts können wir nicht darauf zugreifen). Führen Sie aus sendfile new-wallet-query.boc — und schon haben Sie Ihre eigene Brieftasche im TON-Netzwerk (wenn auch vorerst nur eine Testversion).

Erstellen von ausgehenden Transaktionen

Um Geld von dem erstellten Kontostand zu überweisen, gibt es eine Datei crypto/block/wallet.fif, die ebenfalls in den Ordner mit dem kompilierten Client gelegt werden muss.

Ähnlich wie in den vorherigen Schritten müssen Sie den Betrag, den Sie überweisen, die Adresse des Empfängers (dest_addr) und seqno Ihrer Brieftasche anpassen (nach der Initialisierung der Brieftasche beträgt dieser 1 und erhöht sich nach jeder ausgehenden Transaktion um 1 — Sie können ihn sehen, indem Sie den Status Ihres Kontos abfragen). Für Tests können Sie beispielsweise meine Brieftasche verwenden — 0x4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2.

Beim Start (./crypto/fift wallet.fif) wird das Skript die Adresse Ihres Wallets (von wo Sie überweisen) und den privaten Schlüssel aus den Dateien abrufen new-wallet.addr und new-wallet.pk, und die erhaltene Nachricht wird in new-wallet-query.boc.

Wie zuvor, um die Transaktion direkt auszuführen, rufen wir sendfile new-wallet-query.boc im Client auf. Danach vergessen Sie nicht, den Zustand der Blockchain zu aktualisieren (last) und überprüfen Sie, dass der Kontostand und seqno Ihres Wallets sich geändert haben (getaccount).

Test-Client für TON (Telegram Open Network) und die neue Sprache Fift für Smart Contracts

Das war's, jetzt können wir Smart Contracts in TON erstellen und Anfragen an sie senden. Wie wir sehen, reicht die aktuelle Funktionalität bereits aus, um beispielsweise eine benutzerfreundlichere Wallet mit grafischer Benutzeroberfläche zu erstellen (obwohl erwartet wird, dass sie ohnehin als Teil des Messengers verfügbar wird).

Nur registrierte Benutzer können an der Umfrage teilnehmen. Bitte melden Sie sich an.Sind Sie an Contour interessiert?

Sind Sie daran interessiert, die Artikel über TON, TVM und Fift fortzusetzen?

  • Ja, ich warte auf den Abschluss der Artikelreihe mit einem allgemeinen Überblick über TON

  • Ja, ich würde gerne mehr über die Sprache Fift erfahren

  • Ja, ich möchte mehr über die TON Virtual Machine und den Assembler dafür erfahren

  • Nein, mich interessiert nichts davon

39 Benutzer haben abgestimmt. 12 Benutzer haben sich enthalten.

Was halten Sie von den Plänen von Telegram, TON zu starten?

  • Ich setze große Hoffnungen in dieses Projekt

  • Ich verfolge mit Interesse seine Entwicklung.

  • Ich bin skeptisch eingestellt und zweifle an seinem Erfolg.

  • Ich neige dazu, diese Initiative als misslungen zu betrachten und halte sie für unnötig für die breite Masse.

47 Nutzer haben abgestimmt. 12 Nutzer haben sich enthalten.

Quelle: habr.com

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server 🔥 Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster