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

Vor mehr als einem Jahr wurden die Pläne des Telegram-Messengers bekannt, ein eigenes dezentrales Netzwerk freizugeben Telegramm offenes Netzwerk. Dann wurde ein umfangreiches technisches Dokument verfügbar, das angeblich von Nikolai Durov verfasst worden war und die Struktur des zukünftigen Netzwerks beschrieb. Für diejenigen, die es verpasst haben, empfehle ich Ihnen, meine Nacherzählung dieses Dokuments zu lesen (Teil 1, Teil 2; der dritte Teil verstaubt leider immer noch in Zugluft).

Seitdem gab es bis vor ein paar Tagen keine nennenswerten Neuigkeiten über den Stand der TON-Entwicklung (in einem von inoffizielle Kanäle) Der Link zur Seite wurde nicht angezeigt https://test.ton.org/download.html, wo befinden sich:
ton-test-liteclient-full.tar.xz — Quellen eines Light-Clients für das TON-Testnetzwerk;
ton-lite-client-test1.config.json — Konfigurationsdatei für die Verbindung zum Testnetzwerk;
README — Informationen zum Erstellen und Starten des Clients;
Howto — Schritt-für-Schritt-Anleitung zum Erstellen eines Smart Contracts mithilfe eines Clients;
ton.pdf – aktualisiertes Dokument (vom 2. März 2019) mit einem technischen Überblick über das TON-Netzwerk;
tvm.pdf — technische Beschreibung von TVM (TON Virtual Machine, TON Virtual Machine);
tblkch.pdf — technische Beschreibung der TON-Blockchain;
fivebase.pdf – Beschreibung der neuen Fift-Sprache, die für die Erstellung intelligenter Verträge in TON entwickelt wurde.

Ich wiederhole, es gab keine offizielle Bestätigung der Seite und all dieser Dokumente von Telegram, aber der Umfang dieser Materialien macht sie durchaus plausibel. Starten Sie den veröffentlichten Client auf eigenes Risiko.

Erstellen eines Testclients

Versuchen wir zunächst, einen Testclient zu erstellen und auszuführen – zum Glück README beschreibt diesen einfachen Vorgang ausführlich. Ich werde dies am Beispiel von macOS 10.14.5 tun; für den Erfolg des Builds auf anderen Systemen kann ich nicht garantieren.

  1. Herunterladen und entpacken Quellarchiv. Es ist wichtig, die neueste Version herunterzuladen, da die Abwärtskompatibilität derzeit nicht garantiert ist.

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

  3. Nehmen wir an, die Quellen sind in einen Ordner entpackt ~/lite-client. Erstellen Sie getrennt davon einen leeren Ordner für das zusammengestellte Projekt (z. B. ~/liteclient-build), und daraus (cd ~/liteclient-build) Rufen Sie die Befehle auf:

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

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

    Um den Fift-Sprachinterpreter für Smart Contracts zu erstellen (mehr dazu weiter unten), rufen wir auch an

    cmake --build . --target fift

  4. Laden Sie das aktuelle herunter Konfigurationsdatei Stellen Sie eine Verbindung zum Testnetzwerk her und legen Sie es mit dem zusammengestellten Client in den Ordner.

  5. Abschließen, können Sie den Client starten:

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

Wenn alles richtig gemacht wurde, sollten Sie etwa Folgendes sehen:

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

Wie wir sehen können, stehen nur wenige Befehle zur Verfügung:
help — diese Befehlsliste anzeigen;
quit - hinausgehen;
time — zeigt die aktuelle Uhrzeit auf dem Server an;
status — Zeigt den Verbindungs- und lokalen Datenbankstatus an;
last — Aktualisieren Sie den Status der Blockchain (laden Sie den letzten Block herunter). Es ist wichtig, diesen Befehl vor allen Anfragen auszuführen, um sicherzustellen, dass Sie den aktuellen Status des Netzwerks sehen.
sendfile <filename> — Laden Sie eine lokale Datei in das TON-Netzwerk hoch. Auf diese Weise erfolgt die Interaktion mit dem Netzwerk – einschließlich beispielsweise der Erstellung neuer Smart Contracts und Anfragen zur Überweisung von Geldern zwischen Konten;
getaccount <address> – Zeigt den aktuellen Stand an (zu dem Zeitpunkt, als der Befehl ausgeführt wurde) last) der Status des Kontos mit der angegebenen Adresse;
privkey <filename> — Laden Sie den privaten Schlüssel aus einer lokalen Datei.

Wenn Sie beim Starten des Clients mit der Option einen Ordner dorthin übertragen -D, dann fügt er den letzten Block der Masterchain hinzu:

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

Jetzt können wir zu interessanteren Dingen übergehen – lernen Sie die Fift-Sprache, versuchen Sie, einen Smart Contract zu erstellen (z. B. ein Test-Wallet zu erstellen), laden Sie ihn in das Netzwerk hoch und versuchen Sie, Gelder zwischen Konten zu übertragen.

Sprache fünf

Aus dem Dokument fivebase.pdf Sie können herausfinden, dass das Telegram-Team eine neue Stack-Sprache zum Erstellen intelligenter Verträge erstellt hat Fünfte (anscheinend aus der Ziffer fünfte, ähnlich wie Forth, eine Sprache, mit der Fifth viel gemeinsam hat.

Das Dokument ist recht umfangreich, 87 Seiten, und ich werde seinen Inhalt im Rahmen dieses Artikels nicht im Detail nacherzählen (zumindest weil ich es selbst noch nicht zu Ende gelesen habe :). Ich werde mich auf die Hauptpunkte konzentrieren und einige Codebeispiele in dieser Sprache geben.

Grundsätzlich ist die Syntax von Fift recht einfach: Der Code besteht aus Wörter, normalerweise durch Leerzeichen oder Zeilenumbrüche getrennt (Sonderfall: Einige Wörter erfordern kein Trennzeichen hinter sich). Beliebig слово ist eine Zeichenfolge, bei der zwischen Groß- und Kleinschreibung unterschieden wird und die einer bestimmten Zeichenfolge entspricht Bestimmung (ungefähr was der Dolmetscher tun sollte, wenn er auf dieses Wort stößt). Wenn für ein Wort keine Definition vorhanden ist, versucht der Interpreter, es als Zahl zu analysieren und auf den Stapel zu legen. Übrigens sind die Zahlen hier plötzlich 257-Bit-Ganzzahlen und es gibt überhaupt keine Brüche mehr – genauer gesagt, sie verwandeln sich sofort in ein Paar ganzer Zahlen und bilden Zähler und Nenner eines rationalen Bruchs.

Wörter neigen dazu, mit Werten oben im Stapel zu interagieren. Eine separate Art von Wörtern - Präfix — verwendet nicht den Stapel, sondern die nachfolgenden Zeichen aus der Quelldatei. So werden beispielsweise String-Literale implementiert: das Anführungszeichen (") ist ein Präfixwort, das nach dem nächsten (schließenden) Anführungszeichen sucht und die dazwischen liegende Zeichenfolge auf den Stapel legt. Einzeiler verhalten sich auf die gleiche Weise (//) und mehrzeilig (/*) Kommentare.

Hier endet fast die gesamte innere Struktur der Sprache. Alles andere (einschließlich Kontrollkonstrukte) wird als Wörter definiert (entweder intern, wie arithmetische Operationen und die Definition neuer Wörter, oder in der „Standardbibliothek“ definiert). Fift.fif, die sich im Ordner befindet crypto/fift in den Quellen).

Ein einfaches Beispielprogramm in Fift:

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

Die erste Zeile definiert ein neues Wort setxy (Beachten Sie das Präfix {, wodurch ein Block vor dem schließenden Block erstellt wird } und Präfix :, was das Wort eigentlich definiert). setxy Nimmt eine Zahl von der Spitze des Stapels und definiert sie als global (oder definiert sie neu). Konstante xund das Quadrat dieser Zahl als Konstante y (Angesichts der Tatsache, dass die Werte von Konstanten neu definiert werden können, würde ich sie lieber Variablen nennen, aber ich folge der Namenskonvention in der Sprache.)

Die nächsten beiden Zeilen legen eine Nummer auf den Stapel und rufen an setxy, dann werden die Werte der Konstanten angezeigt x, y (Das Wort wird für die Ausgabe verwendet .), werden beide Konstanten auf den Stapel gelegt, summiert und das Ergebnis ebenfalls ausgedruckt. Als Ergebnis werden wir sehen:

3 9 12 ok
7 49 56 ok

(Die Zeile „ok“ wird vom Interpreter gedruckt, wenn die Verarbeitung der aktuellen Zeile im interaktiven Eingabemodus abgeschlossen ist.)

Nun, ein vollständiges Codebeispiel:

"Asm.fif" include

-1 constant wc  // create a wallet in workchain -1 (masterchain)

// Create new simple wallet
<{  SETCP0 DUP IFNOTRET INC 32 THROWIF  // return if recv_internal, fail unless recv_external
    512 INT LDSLICEX DUP 32 PLDU   // sign cs cnt
    c4 PUSHCTR CTOS 32 LDU 256 LDU ENDS  // sign cs cnt cnt' pubk
    s1 s2 XCPU            // sign cs cnt pubk cnt' cnt
    EQUAL 33 THROWIFNOT   // ( seqno mismatch? )
    s2 PUSH HASHSU        // sign cs cnt pubk hash
    s0 s4 s4 XC2PU        // pubk cs cnt hash sign pubk
    CHKSIGNU              // pubk cs cnt ?
    34 THROWIFNOT         // signature mismatch
    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
}>c
// code
<b 0 32 u, 
   newkeypair swap dup constant wallet_pk 
   "new-wallet.pk" B>file
   B, 
b> // data
// no libraries
<b b{00110} s, rot ref, swap ref, b>  // create StateInit
dup ."StateInit: " <s csr. cr
dup hash dup constant wallet_addr
."new wallet address = " wc . .": " dup x. cr
wc over 7 smca>$ type cr
256 u>B "new-wallet.addr" B>file
<b 0 32 u, b>
dup ."signing message: " <s csr. cr
dup hash wallet_pk ed25519_sign_uint rot
<b b{1000100} s, wc 8 i, wallet_addr 256 u, b{000010} s, swap <s s, b{0} s, swap B, swap <s s, b>
dup ."External message for initialization is " <s csr. cr
2 boc+>B dup Bx. cr
"new-wallet-query.boc" tuck B>file
."(Saved to file " type .")" cr

Diese gruselig aussehende Datei dient zum Erstellen eines Smart Contracts – sie wird in einer Datei abgelegt new-wallet-query.boc nach der Ausführung. Bitte beachten Sie, dass hier eine andere Assemblersprache für die TON Virtual Machine verwendet wird (ich werde nicht näher darauf eingehen), deren Anweisungen auf der Blockchain platziert werden.

Somit ist der Assembler für TVM in Fift geschrieben – die Quellen dieses Assemblers befinden sich in der Datei crypto/fift/Asm.fif und sind am Anfang des obigen Codeteils verbunden.

Was soll ich sagen, anscheinend liebt Nikolai Durov es einfach, neue Programmiersprachen zu entwickeln :)

Einen Smart Contract erstellen und mit TON interagieren

Gehen wir also davon aus, dass wir den TON-Client und den Fift-Interpreter wie oben beschrieben zusammengestellt haben und uns mit der Sprache vertraut machen. Wie erstellt man jetzt einen Smart Contract? Dies ist in der Datei beschrieben Howto, den Quellen beigefügt.

Konten in TON

Wie ich in beschrieben habe TON-RezensionDieses Netzwerk enthält mehr als eine Blockchain – es gibt eine gemeinsame, die sogenannte. „Master-Kette“ sowie eine beliebige Anzahl zusätzlicher „Arbeitsketten“, identifiziert durch eine 32-Bit-Zahl. Die Masterchain hat einen Identifikator von -1; darüber hinaus kann auch eine „Basis“-Workchain mit einem Identifikator von 0 verwendet werden. Jede Workchain kann eine eigene Konfiguration haben. Intern ist jede Arbeitskette in Shardchains unterteilt, dies ist jedoch ein Implementierungsdetail, das nicht beachtet werden muss.

Innerhalb einer Arbeitskette werden viele Konten gespeichert, die über eigene account_id-Kennungen verfügen. Für die Master-Kette und die Zero-Work-Kette sind sie 256 Bit lang. So wird die Kontokennung beispielsweise so geschrieben:

-1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Dies ist das „rohe“ Format: zuerst die Workchain-ID, dann ein Doppelpunkt und die Konto-ID in hexadezimaler Schreibweise.

Darüber hinaus gibt es ein verkürztes Format – die Workchain-Nummer und die Kontoadresse werden in binärer Form kodiert, ihnen wird eine Prüfsumme hinzugefügt und das alles wird in Base64 kodiert:

Ef+BVndbeTJeXWLnQtm5bDC2UVpc0vH2TF2ksZPAPwcODSkb

Wenn wir dieses Datensatzformat kennen, können wir mit dem Befehl den aktuellen Status eines Kontos über einen Testclient abfragen

getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Wir erhalten so etwas:

[ 3][t 2][1558746708.815218925][test-lite-client.cpp:631][!testnode]    requesting account state for -1:8156775B79325E5D62E742D9B96C30B6515A5CD2F1F64C5DA4B193C03F070E0D
[ 3][t 2][1558746708.858564138][test-lite-client.cpp:652][!testnode]    got account state for -1:8156775B79325E5D62E742D9B96C30B6515A5CD2F1F64C5DA4B193C03F070E0D with respect to blocks (-1,8000000000000000,72355):F566005749C1B97F18EDE013EBA7A054B9014961BC1AD91F475B9082919A2296:1BD5DE54333164025EE39D389ECE2E93DA2871DA616D488253953E52B50DC03F and (-1,8000000000000000,72355):F566005749C1B97F18EDE013EBA7A054B9014961BC1AD91F475B9082919A2296:1BD5DE54333164025EE39D389ECE2E93DA2871DA616D488253953E52B50DC03F
account state is (account
  addr:(addr_std
    anycast:nothing workchain_id:-1 address:x8156775B79325E5D62E742D9B96C30B6515A5CD2F1F64C5DA4B193C03F070E0D)
  storage_stat:(storage_info
    used:(storage_used
      cells:(var_uint len:1 value:3)
      bits:(var_uint len:2 value:539)
      public_cells:(var_uint len:0 value:0)) last_paid:0
    due_payment:nothing)
  storage:(account_storage last_trans_lt:74208000003
    balance:(currencies
      grams:(nanograms
        amount:(var_uint len:7 value:999928362430000))
      other:(extra_currencies
        dict:hme_empty))
    state:(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 Arbeitskette gespeichert ist. Zum Beispiel auf dem Feld storage.balance ist der aktuelle Kontostand, in storage.state.code - Smart-Contract-Code und in storage.state.data - seine aktuellen Daten. Bitte beachten Sie, dass der TON-Datenspeicher – Zelle, Zellen – baumartig ist und jede Zelle sowohl eigene Daten als auch untergeordnete Zellen haben kann. Dies wird als Einrückung in den letzten Zeilen angezeigt.

Erstellen Sie einen intelligenten Vertrag

Lassen Sie uns nun selbst eine solche Struktur erstellen (sie heißt BOC - Beutel mit Zellen) unter Verwendung der Fift-Sprache. Glücklicherweise müssen Sie keinen Smart Contract selbst schreiben – im Ordner crypto/block Es gibt eine Datei aus dem Quellarchiv new-wallet.fif, was uns helfen wird, ein neues Wallet zu erstellen. Kopieren wir es in den Ordner mit dem zusammengestellten Client (~/liteclient-build, wenn Sie die obigen Anweisungen befolgt haben). Ich habe seinen Inhalt oben als Beispiel für Code auf Fift zitiert.

Führen Sie diese Datei wie folgt aus:

./crypto/fift -I"<source-directory>/crypto/fift" new-wallet.fif

Hier <source-directory> muss durch den Pfad zu den entpackten Quellen ersetzt werden (das „~“-Symbol kann hier leider nicht verwendet werden, es wird der vollständige Pfad benötigt). Anstatt einen Schlüssel zu verwenden -I Sie können eine Umgebungsvariable definieren FIFTPATH und lege diesen Weg hinein.

Seit wir Fift mit dem Dateinamen gestartet haben new-wallet.fif, es wird ausgeführt und beendet. Wenn Sie den Dateinamen weglassen, können Sie interaktiv mit dem Interpreter spielen.

Nach der Ausführung sollte in der Konsole etwa Folgendes angezeigt werden:

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

new wallet address = -1 : 4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2 
0f9PzVILj8yglrVn1zS-NSjtxr7QBfaTCp7JrBqnFPIR8nhZ
signing message: x{00000000}

External message for initialization is x{89FEE120E20C7E953E31546F64C23CD654002C1AA919ADD24DB12DDF85C6F3B58AE41198A28AD8DAF3B9588E7A629252BA3DB88F030D00BC1016110B2073359EAC3C13823C53245B65D056F2C070B940CDA09789585935C7ABA4D2AD4BED139281CFA1200000001_}
 x{FF0020DDA4F260810200D71820D70B1FED44D0D31FD3FFD15112BAF2A122F901541044F910F2A2F80001D31F3120D74A96D307D402FB00DED1A4C8CB1FCBFFC9ED54}
 x{0000000055375F730EDC2292E8CB15C42E8036EE9C25AA958EE002D2DE48A205E3A3426B}

B5EE9C724104030100000000D60002CF89FEE120E20C7E953E31546F64C23CD654002C1AA919ADD24DB12DDF85C6F3B58AE41198A28AD8DAF3B9588E7A629252BA3DB88F030D00BC1016110B2073359EAC3C13823C53245B65D056F2C070B940CDA09789585935C7ABA4D2AD4BED139281CFA1200000001001020084FF0020DDA4F260810200D71820D70B1FED44D0D31FD3FFD15112BAF2A122F901541044F910F2A2F80001D31F3120D74A96D307D402FB00DED1A4C8CB1FCBFFC9ED5400480000000055375F730EDC2292E8CB15C42E8036EE9C25AA958EE002D2DE48A205E3A3426B6290698B
(Saved to file new-wallet-query.boc)

Das bedeutet, dass das Wallet mit der ID -1:4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2 (oder, was dasselbe ist, 0f9PzVILj8yglrVn1zS-NSjtxr7QBfaTCp7JrBqnFPIR8nhZ) Erfolgreich erstellt. Der entsprechende Code befindet sich in der Datei new-wallet-query.boc, seine Adresse ist in new-wallet.addr, und der private Schlüssel ist drin new-wallet.pk (Seien Sie vorsichtig – wenn Sie das Skript erneut ausführen, werden diese Dateien überschrieben).

Natürlich ist dem TON-Netzwerk dieses Wallet noch nicht bekannt, es wird nur in Form dieser Dateien gespeichert. Jetzt muss es ins Netzwerk hochgeladen werden. Das Problem besteht jedoch darin, dass Sie für die Erstellung eines Smart Contracts eine Provision zahlen müssen und Ihr Kontostand immer noch Null ist.

Im Arbeitsmodus wird dieses Problem durch den Kauf von Gramm an der Börse (oder die Übertragung von einem anderen Wallet) gelöst. Nun, im aktuellen Testmodus wurde ein spezieller Smart Contract erstellt, von dem man einfach bis zu 20 Gramm verlangen kann.

Generieren einer Anfrage an den Smart Contract einer anderen Person

Wir stellen eine Anfrage an einen Smart Contract, der Gramm links und rechts auf diese Weise verteilt. Im selben Ordner crypto/block Datei finden 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+ 1+ u, "GIFT" $, b>
<b seqno 32 u, 1 8 u, swap ref, b>
dup ."enveloping message: " <s csr. cr
<b b{1000100} s, wc 8 i, wallet_addr 256 u, 0 Gram, b{00} s,
   swap <s s, b>
dup ."resulting external message: " <s csr. cr
2 boc+>B dup Bx. cr
"wallet-query.boc" B>file

Wir werden es auch im Ordner mit dem zusammengestellten Client speichern, aber wir werden die fünfte Zeile korrigieren – vor der Zeile „constant dest_addr". Ersetzen wir es durch die Adresse des Wallets, das Sie zuvor erstellt haben (vollständig, nicht abgekürzt). Es ist nicht nötig, „-1:“ am Anfang zu schreiben, sondern „0x“ am Anfang.

Sie können die Zeile auch ändern 6.666 Gram*/ constant amount — Dies ist die Menge in Gramm, die Sie anfordern (nicht mehr als 20). Auch wenn Sie eine ganze Zahl angeben, lassen Sie den Dezimalpunkt stehen.

Abschließend müssen Sie die Zeile korrigieren 0x00000011 constant seqno. Die erste Zahl ist hier die aktuelle Sequenznummer, die im ausstellenden Konto gespeichert ist. Woher kann ich es bekommen? Starten Sie wie oben erwähnt den Client und führen Sie Folgendes aus:

last
getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Ganz am Ende werden die Smart-Contract-Daten enthalten

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

Die Zahl 0000000D (Ihre wird größer sein) ist die Sequenznummer, die ersetzt werden muss testgiver.fif.

Das war’s, speichern Sie die Datei und führen Sie (./crypto/fift testgiver.fif). Die Ausgabe wird eine Datei sein wallet-query.boc. Das ist es, was entsteht Nachricht an den Smart-Vertrag einer anderen Person – eine Aufforderung „so viele Gramm auf dieses und jenes Konto überweisen“.

Mit dem Client laden wir es 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 anrufen last, und fragen Sie dann erneut den Status des Kontos ab, von dem wir um Gramm gebeten haben, dann sollten wir sehen, dass sich seine Sequenznummer um eins erhöht hat – das bedeutet, dass Geld auf unser Konto gesendet wurde.

Der letzte Schritt bleibt: Laden Sie den Code unserer Wallet herunter (sein Guthaben wurde bereits wieder aufgefüllt, aber ohne den Smart-Contract-Code können wir ihn nicht verwalten). Wir führen aus sendfile new-wallet-query.boc - und das war's, Sie haben Ihr eigenes Wallet im TON-Netzwerk (auch wenn es vorerst nur ein Test-Wallet ist).

Ausgehende Transaktionen erstellen

Um Geld vom Guthaben des erstellten Kontos zu überweisen, gibt es eine Datei crypto/block/wallet.fif, das ebenfalls im Ordner mit dem zusammengestellten Client abgelegt werden muss.

Ähnlich wie bei den vorherigen Schritten müssen Sie den Betrag, den Sie überweisen, die Adresse des Empfängers (dest_addr) und die Sequenznummer Ihres Wallets anpassen (sie ist nach der Initialisierung des Wallets gleich 1 und erhöht sich nach jeder ausgehenden Transaktion um 1) – das ist möglich Sehen Sie es sich an, indem Sie den Status Ihres Kontos abfragen). Für Tests können Sie zum Beispiel mein Wallet nutzen – 0x4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2.

Beim Start (./crypto/fift wallet.fif) entnimmt das Skript die Adresse Ihres Wallets (von dem Sie überweisen) und seinen privaten Schlüssel aus den Dateien new-wallet.addr и new-wallet.pk, und die empfangene Nachricht wird geschrieben new-wallet-query.boc.

Um die Transaktion direkt durchzuführen, rufen Sie wie zuvor auf sendfile new-wallet-query.boc im Client. Vergessen Sie danach nicht, den Status der Blockchain zu aktualisieren (last) und überprüfen Sie, ob sich der Kontostand und die Sequenznummer unserer Brieftasche geändert haben (getaccount <account_id>).

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

Das ist alles, jetzt können wir intelligente Verträge in TON erstellen und Anfragen an sie senden. Wie Sie sehen, reicht die aktuelle Funktionalität bereits aus, um beispielsweise ein benutzerfreundlicheres Wallet mit grafischer Oberfläche zu erstellen (es wird jedoch erwartet, dass es bereits als Teil des Messengers verfügbar sein wird).

An der Umfrage können nur registrierte Benutzer teilnehmen. Einloggenbitte.

Sind Sie daran interessiert, die Artikel mit der Analyse von TON, TVM, Fift fortzusetzen?

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

  • Ja, es ist interessant, mehr über die Fift-Sprache zu lesen

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

  • Nein, nichts davon ist interessant

39 Benutzer haben abgestimmt. 12 Benutzer enthielten sich der Stimme.

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

  • Ich setze große Hoffnungen in dieses Projekt

  • Ich verfolge die Entwicklung einfach mit Interesse.

  • Ich bin skeptisch und bezweifle den Erfolg.

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

47 Benutzer haben abgestimmt. 12 Benutzer enthielten sich der Stimme.

Source: habr.com

Kommentar hinzufügen