Vor über 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 Dubrow 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 (, ; der dritte Teil liegt leider immer noch als Entwurf vor).
Seitdem gab es keine bedeutsamen Neuigkeiten über den Status der Entwicklung von TON, bis vor ein paar Tagen (in einem der ) ein Link zu einer Seite , auf der folgende Informationen zu finden sind:
◦ — Quellcodes des leichten Clients für das Testnetz TON;
◦ — Konfigurationsdatei zum Anschluss an das Testnetz;
◦ — Informationen über das Bauen und Starten des Clients;
◦ — Schritt-für-Schritt-Anleitung zur Erstellung eines Smart Contracts mit Hilfe des Clients;
◦ — aktualisiertes Dokument (vom 2. März 2019) mit technischem Überblick über das TON-Netzwerk;
◦ — technische Beschreibung der TVM (TON Virtual Machine, virtuelle Maschine TON);
◦ — technische Beschreibung der Blockchain TON;
◦ — Beschreibung der neuen Sprache Fift, die zur Erstellung von Smart Contracts in TON dient.
Ich wiederhole, offizielle Bestätigungen der Seite und all dieser Dokumente seitens Telegram gab es nicht, aber das Volumen dieser Materialien macht sie ausreichend glaubwürdig. Der Start des veröffentlichten Clients ist auf eigene Gefahr.
Bau des Testclients
Zunächst versuchen wir, den Testclient zu bauen und zu starten - zum Glück, wird dieser einfache Prozess detailliert beschrieben. Ich werde dies am Beispiel von macOS 10.14.5 tun, die Erfolgsquote des Baus auf anderen Systemen kann ich nicht garantieren.
Laden Sie den herunter und entpacken Sie ihn. Es ist wichtig, die letzte Version herunterzuladen, da die Rückwärtskompatibilität zu diesem Zeitpunkt nicht garantiert werden kann.
Stellen Sie sicher, dass die neuesten Versionen von make, cmake (Versionen 3.0.2 oder höher), OpenSSL (einschließlich der C-Headerdateien), g++ oder clang im System installiert sind. Ich musste nichts nachinstallieren, alles wurde sofort kompiliert.
Angenommen, die Quelldateien wurden im Ordner
~\/lite-cliententpackt. Separat erstellen wir einen leeren Ordner für das gebaute Projekt (zum Beispiel,~\/liteclient-build), und von dort aus (cd ~\/liteclient-build) rufen wir die Befehle auf:cmake ~\/lite-client\ncmake --build . --target test-lite-client
Um den Fift-Interpreter für Smart Contracts (darüber unten) zu erstellen, rufen wir auch aufcmake --build . --target fiftLaden Sie die aktuelle zum Anschluss an das Testnetz herunter und legen Sie sie in den Ordner mit dem erstellten Client.
Fertig, können Sie den Client starten:
./test-lite-client -C ton-lite-client-test1.config.json
Wenn alles richtig gemacht wurde, sollten Sie etwas Ähnliches sehen:

Verfügbare Kommandos, wie wir sehen, gibt es nur wenige:
◦ help — gibt diese Liste der Befehle aus;
◦ quit — beendet;
◦ time — zeigt die aktuelle Serverzeit an;
◦ status — zeigt den Verbindungsstatus und die lokale DB an;
◦ last — aktualisiert den Blockchain-Status (lädt den letzten Block). Dieses Kommando ist wichtig, bevor irgendwelche Anfragen gestellt werden, um sicherzustellen, dass Sie den aktuellen Status des Netzwerks sehen.
◦ sendfile <filename> — lädt eine lokale Datei ins TON-Netzwerk hoch. So erfolgt die Interaktion mit dem Netzwerk - einschließlich beispielsweise der Erstellung neuer Smart Contracts und Überweisungsanfragen zwischen Konten;
◦ getaccount — zeigt den aktuellen (zum Zeitpunkt der Ausführung des Befehls last) Status des Kontos mit der angegebenen Adresse an;
◦ privkey <filename> — lädt den privaten Schlüssel aus einer lokalen Datei.
Wenn beim Starten des Clients ein Ordner mithilfe der Option -Dübergeben wird, wird der letzte Block des Masterchains darin abgelegt:
./test-lite-client -C ton-lite-client-test1.config.json -D ~/ton-db-dirJetzt können wir zu interessanteren Dingen übergehen - die Sprache Fift erkunden, versuchen, einen Smart Contract zu kompilieren (zum Beispiel eine Test-Wallet zu erstellen), ihn ins Netzwerk hochzuladen und zu versuchen, Mittel zwischen Konten zu überweisen.
Die Sprache Fift
Aus dem Dokument erfährt man, dass das Telegram-Team eine neue Stack-Sprache Fift erschaffen hat, um Smart Contracts zu erstellen (vermutlich von der Zahl fifth, analog zu Forth - einer Sprache, die viele Gemeinsamkeiten mit Fift hat).
Das Dokument ist ziemlich umfangreich, hat 87 Seiten, und ich werde in diesem Artikel nicht detailliert auf den Inhalt eingehen (zumindest, weil ich es selbst nicht zu Ende gelesen habe :). Ich werde die wichtigsten Punkte ansprechen und ein paar Codebeispiele in dieser Sprache geben.
Auf einer grundlegendem Niveau ist die Syntax von Fift ziemlich einfach: sein Code besteht aus Wörtern, die in der Regel durch Leerzeichen oder Zeilenumbrüche getrennt sind (ein Spezialfall: Einige Wörter benötigen keinen Trenner nach sich). Jedes Wort ist eine case-sensitive Zeichenfolge, der eine bestimmte Definition entspricht. (grob gesagt, was der Interpreter tun muss, wenn er dieses Wort trifft). Wenn die Definition des Wortes fehlt, versucht der Interpreter, es als Zahl zu parsen und auf den Stack zu legen. Übrigens sind die Zahlen hier - überraschenderweise - 257-bit große Ganzzahlen, und es gibt keine Brüche - genauer gesagt, sie werden sofort in ein Paar Ganzzahlen umgewandelt, die Zähler und Nenner eines rationalen Bruchs bilden.
Wörter interagieren in der Regel mit Werten, die sich an der Spitze des Stacks befinden. Ein eigener Worttyp ist präfixiert - verwendet keinen Stack, sondern die folgenden Zeichen aus der Quelldatei. Zum Beispiel sind string Literale so implementiert - das Zeichen „Anführungszeichen“ (") ist ein präfixiertes Wort, das das nächste (schließende) Anführungszeichen sucht und den String zwischen ihnen auf den Stack legt. Auf die gleiche Weise verhalten sich einzeilige (//) und mehrzeilige (/*) Kommentare.
Damit endet fast die interne Struktur der Sprache. Alles andere (einschließlich Steuerkonstruktionen) ist als Wörter definiert (entweder interne wie arithmetische Operationen und die Definition neuer Wörter oder in der „Standardbibliothek“ definiert 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 (beachten Sie das Präfix {, das einen Block bis zum schließenden } erstellt und das Präfix :, das tatsächlich das Wort definiert). setxy nimmt die Zahl vom Stack, definiert (oder überschreibt) sie als globale Konstante x, und das Quadrat dieser Zahl - als Konstante y (da die Werte von Konstanten überschrieben werden können, würde ich sie eher als Variablen bezeichnen, aber ich folge der Benennung in der Sprache).
In den folgenden beiden Zeilen wird eine Zahl auf den Stack gelegt, dann wird setxyaufgerufen, dann werden die Werte der Konstanten x, y ausgegeben (zum Ausgeben wird das Wort .verwendet), beide Konstanten werden auf den Stack gelegt, addiert und das Ergebnis wird ebenfalls ausgegeben. Infolgedessen sehen wir:
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)
Nun ein vollständiges Beispiel für Code:
"Asm.fif" einfügen
-1 konstant wc
// erstelle ein Wallet in workchain -1 (masterchain)
// Neues einfaches Wallet erstellen
<{ SETCP0 DUP IFNOTRET INC 32 THROWIF
// zurückgeben, wenn recv_internal, fehler, es sei denn, recv_external
512 INT LDSLICEX DUP 32 PLDU
// signiere cs cnt
c4 PUSHCTR CTOS 32 LDU 256 LDU ENDS
// signiere cs cnt cnt' pubk
s1 s2 XCPU
// signiere cs cnt pubk cnt' cnt
EQUAL 33 THROWIFNOT
// (seqno nicht übereinstimmend?)
s2 PUSH HASHSU
// signiere cs cnt pubk hash
s0 s4 s4 XC2PU
// pubk cs cnt hash sign pubk
CHKSIGNU
// pubk cs cnt ?
34 THROWIFNOT
// signatur nicht übereinstimmend
AKZEPTIEREN
TAUSCHEN 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>datei
B,
b>
// 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>B "new-wallet.addr" B>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>file
."(In die Datei gespeichert " typ .")" crDiese ein wenig furchterregend aussehende Datei ist dafür gedacht, einen Smart Contract zu erstellen - er wird in die Datei new-wallet-query.boc Nach der Ausführung. Bitte beachten Sie, dass hier eine weitere Assemblersprache für die TON Virtual Machine verwendet wird (darauf werde ich nicht im Detail eingehen), deren Anweisungen in die Blockchain eingefügt werden.
Somit ist der Assembler für die TVM in Fift geschrieben – der Quellcode dieses Assemblers befindet sich in der Datei crypto/fift/Asm.fif und wird zu Beginn des oben genannten Codes eingebunden.
Was kann ich sagen, anscheinend liebt Nikolai Durov es einfach, neue Programmiersprachen zu schaffen 🙂
Erstellung eines Smart Contracts und Interaktion mit TON
Angenommen, wir haben den TON-Client und den Fift-Interpreter wie oben beschrieben zusammengebaut und uns mit der Sprache vertraut gemacht. Wie erstellen wir jetzt einen Smart Contract? Darüber wird in der Datei gesprochen , die den Quellcodes beigefügt ist.
Konten in TON
Wie ich im , beschrieben habe, enthält dieses Netzwerk mehr als eine Blockchain – es gibt eine gemeinsame, den sogenannten «Masterchain», sowie beliebig viele zusätzliche «Workchains», die durch eine 32-Bit-Zahl identifiziert werden. Der Masterchain hat die ID -1, daneben kann auch eine «Basis»-Workchain mit der ID 0 verwendet werden. Jede Workchain kann ihre eigene Konfiguration haben. Intern wird jede Workchain in Shardchains unterteilt, aber das ist bereits ein Implementierungsdetail, das man nicht unbedingt im Hinterkopf behalten muss.
Innerhalb einer Workchain werden viele Konten gespeichert, die ihre eigenen Identifikatoren account_id haben. Für den Masterchain und den Null-Workchain haben sie eine Länge von 256 Bit. Somit wird der Identifikator eines Kontos beispielsweise so aufgezeichnet:
-1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0dDas ist das «rohe» Format: Zuerst die Identifikationsnummer der Workchain, dann ein Doppelpunkt, und der Identifikator des Kontos in hexadezimaler Schreibweise.
Darüber hinaus gibt es ein verkürztes Format – die Nummer der Workchain und die Adresse des Kontos werden binär kodiert, es wird eine Prüfziffer hinzugefügt und das Ganze wird in Base64 kodiert:
Ef+BVndbeTJeXWLnQtm5bDC2UVpc0vH2TF2ksZPAPwcODSkbWenn wir dieses Format kennen, können wir den aktuellen Status eines Kontos über einen Testclient mit dem Befehl anfragen
getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0dWir erhalten etwa folgende Antwort:
[ 3][t 2][1558746708.815218925][test-lite-client.cpp:631][!testnode] fordere Kontostand für -1:8156775B79325E5D62E742D9B96C30B6515A5CD2F1F64C5DA4B193C03F070E0D an
[ 3][t 2][1558746708.858564138][test-lite-client.cpp:652][!testnode] habe Kontostand für -1:8156775B79325E5D62E742D9B96C30B6515A5CD2F1F64C5DA4B193C03F070E0D in Bezug auf Blöcke (-1,8000000000000000,72355):F566005749C1B97F18EDE013EBA7A054B9014961BC1AD91F475B9082919A2296:1BD5DE54333164025EE39D389ECE2E93DA2871DA616D488253953E52B50DC03F und (-1,8000000000000000,72355):F566005749C1B97F18EDE013EBA7A054B9014961BC1AD91F475B9082919A2296:1BD5DE54333164025EE39D389ECE2E93DA2871DA616D488253953E52B50DC03F
Kontostand ist (Konto
addr:(addr_std
anycast:nichts workchain_id:-1 adresse:x8156775B79325E5D62E742D9B96C30B6515A5CD2F1F64C5DA4B193C03F070E0D)
speicher_stat:(storage_info
verwendet:(storage_used
zellen:(var_uint len:1 wert:3)
bits:(var_uint len:2 wert:539)
öffentliche_zellen:(var_uint len:0 wert:0)) zuletzt_gezahlt:0
fällige_zahlung:nichts)
speicher:(account_storage letzter_trans_lt:74208000003
saldo:(währungen
gramm:(nanogramm
betrag:(var_uint len:7 wert:999928362430000))
andere:(extra_währungen
dict:hme_empty))
status:(account_active
(
split_depth:nichts
speziell:nichts
code:(just
wert:(raw@^Cell
x{}
x{FF0020DDA4F260D31F01ED44D0D31FD166BAF2A1F80001D307D4D1821804A817C80073FB0201FB00A4C8CB1FC9ED54}
))
daten:(just
wert:(raw@^Cell
x{}
x{0000000D}
))
bibliothek:hme_empty))))
x{CFF8156775B79325E5D62E742D9B96C30B6515A5CD2F1F64C5DA4B193C03F070E0D2068086C000000000000000451C90E00DC0E35B7DB5FB8C134_}
x{FF0020DDA4F260D31F01ED44D0D31FD166BAF2A1F80001D307D4D1821804A817C80073FB0201FB00A4C8CB1FC9ED54}
x{0000000D}Wir sehen die Struktur, die im DHT des angegebenen Workchains gespeichert ist. Zum Beispiel im Feld storage.balance steht der aktuelle Kontostand, in storage.state.code — der Code des Smart Contracts, und in storage.state.data — sind die aktuellen Daten. Beachten Sie, dass der TON-Datenspeicher — Cell, Zellen — baumartig ist, d.h., jede Zelle kann sowohl eigene Daten als auch untergeordnete Zellen haben. Dies wird durch Einrückungen in den letzten Zeilen verdeutlicht.
Erstellung eines Smart Contracts
Jetzt lassen Sie uns eine solche Struktur erstellen (sie heißt BOC — 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, eine neue Brieftasche zu erstellen. Lassen Sie uns diese in den Ordner mit dem kompilierten Client kopieren (~\/liteclient-build, falls Sie den obigen Anweisungen gefolgt sind). Den Inhalt dieser Datei habe ich oben als Beispiel für Code in Fift angegeben.
Wir führen diese Datei wie folgt aus:
./crypto/fift -I"/crypto/fift" new-wallet.fifHier <source-directory> muss durch den Pfad zu den entpackten Quellcodes ersetzt werden (das Zeichen „~“ kann hier leider nicht verwendet werden, es wird der vollständige Pfad benötigt). Anstelle des Schlüssels -I kann die Umgebungsvariable FIFTPATH definiert werden, und dieser Pfad darin platziert werden.
Da wir Fift mit dem Dateinamen gestartet haben new-wallet.fif, wird es ausgeführt und beendet sich. Wenn der Dateiname weggelassen wird, kann man mit dem Interpreter im interaktiven Modus spielen.
In der Konsole sollte nach der Ausführung etwas Ähnliches ausgegeben werden:
StateInit: x{34_}
x{FF0020DDA4F260810200D71820D70B1FED44D0D31FD3FFD15112BAF2A122F901541044F910F2A2F80001D31F3120D74A96D307D402FB00DED1A4C8CB1FCBFFC9ED54}
x{0000000055375F730EDC2292E8CB15C42E8036EE9C25AA958EE002D2DE48A205E3A3426B}
neue Wallet-Adresse = -1 : 4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2
0f9PzVILj8yglrVn1zS-NSjtxr7QBfaTCp7JrBqnFPIR8nhZ
signierende Nachricht: x{00000000}
Externe Nachricht zur Initialisierung ist x{89FEE120E20C7E953E31546F64C23CD654002C1AA919ADD24DB12DDF85C6F3B58AE41198A28AD8DAF3B9588E7A629252BA3DB88F030D00BC1016110B2073359EAC3C13823C53245B65D056F2C070B940CDA09789585935C7ABA4D2AD4BED139281CFA1200000001_}
x{FF0020DDA4F260810200D71820D70B1FED44D0D31FD3FFD15112BAF2A122F901541044F910F2A2F80001D31F3120D74A96D307D402FB00DED1A4C8CB1FCBFFC9ED54}
x{0000000055375F730EDC2292E8CB15C42E8036EE9C25AA958EE002D2DE48A205E3A3426B}
B5EE9C724104030100000000D60002CF89FEE120E20C7E953E31546F64C23CD654002C1AA919ADD24DB12DDF85C6F3B58AE41198A28AD8DAF3B9588E7A629252BA3DB88F030D00BC1016110B2073359EAC3C13823C53245B65D056F2C070B940CDA09789585935C7ABA4D2AD4BED139281CFA1200000001001020084FF0020DDA4F260810200D71820D70B1FED44D0D31FD3FFD15112BAF2A122F901541044F910F2A2F80001D31F3120D74A96D307D402FB00DED1A4C8CB1FCBFFC9ED5400480000000055375F730EDC2292E8CB15C42E8036EE9C25AA958EE002D2DE48A205E3A3426B6290698B
(Gespeichert in der Datei new-wallet-query.boc)Das bedeutet, dass das Wallet mit der ID -1:4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2 (oder was dasselbe ist, 0f9PzVILj8yglrVn1zS-NSjtxr7QBfaTCp7JrBqnFPIR8nhZ) erfolgreich erstellt wurde. Der entsprechende Code wird in der Datei new-wallet-query.boc, seine Adresse ist in new-wallet.addr, und der private Schlüssel ist in new-wallet.pk (Seien Sie vorsichtig — ein erneuter Start des Skripts wird diese Dateien überschreiben).
Natürlich weiß das TON-Netzwerk noch nichts von diesem Wallet, es wird nur in Form dieser Dateien gespeichert. Jetzt muss es ins Netzwerk hochgeladen werden. Das Problem ist jedoch, dass für die Erstellung eines Smart Contracts eine Gebühr entrichtet werden muss, und der Kontostand Ihres Kontos derzeit null ist.
Im Betriebsmodus wird dieses Problem durch den Kauf von Gramm an einer Börse (oder durch Überweisung von einem anderen Wallet) gelöst. Im aktuellen Testmodus gibt es jedoch einen speziellen Smart Contract, bei dem man bis zu 20 Gramm einfach so anfordern kann.
Erstellung einer Anfrage an einen fremden Smart Contract
Die Anfrage an den Smart Contract, der links und rechts Gramm verteilt, erfolgt wie folgt. Im selben 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>
dup ."umschließende Nachricht: " <s csr. cr
<b b{1000100} s, wc 8 i, wallet_addr 256 u, 0 gram, b{00} s,
swap <s b>
dup ."resultierende externe Nachricht: " <s csr. cr
2 boc+>B dup Bx. cr
"wallet-query.boc" B>dateiDiese speichern wir ebenfalls im Ordner mit dem zusammengestellten Client, aber wir ändern die fünfte Zeile — vor der Zeile „constant dest_addr« ersetzen wir durch die Adresse des Wallets, das Sie zuvor erstellt haben (vollständig, nicht verkürzt). „-1:“ am Anfang muss nicht geschrieben werden, stattdessen setzen Sie „0x“ zu Beginn.
Außerdem kann 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 müssen wir die Zeile korrigieren 0x00000011 konstante seqno. Die erste Zahl hier ist die aktuelle Sequenznummer, die im Konto gespeichert ist, das die Gramm ausgibt. Woher bekommt man sie? Wie bereits erwähnt, starten Sie den Client und führen Sie aus:
last
getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0dAm Ende der Daten im Smart Contract wird sein
...
x{FF0020DDA4F260D31F01ED44D0D31FD166BAF2A1F80001D307D4D1821804A817C80073FB0201FB00A4C8CB1FC9ED54}
x{0000000D}Die Zahl 0000000D (die bei Ihnen größer sein wird) ist die Sequenznummer, die Sie in eintragen müssen testgiver.fif.
Alles, speichern Sie die Datei und führen Sie sie aus (. /crypto/fift testgiver.fif). Das Ergebnis ist die Datei wallet-query.boc. Das ist die erzeugte Nachricht an den 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] sende Anfrage aus der Datei wallet-query.boc
[ 3][t 2][1558747399.500236034][test-lite-client.cpp:587][!query] Status der externen Nachricht ist 1Wenn wir jetzt lastaufrufen und dann den Status des Kontos abfragen, von dem wir die Gramm angefordert haben, sollten wir sehen, dass seine Sequenznummer um eins gestiegen ist – das bedeutet, dass er Geld auf unser Konto überwiesen hat.
Es bleibt der letzte Schritt – wir laden den Code unserer Brieftasche hoch (ihr Guthaben wurde bereits aufgeladen, aber ohne den Code des Smart Contracts können wir sie nicht verwalten). Wir führen aus sendfile new-wallet-query.boc – und schon haben Sie Ihre eigene Brieftasche im TON-Netzwerk (auch wenn es bisher nur testweise ist).
Erstellung von ausgehenden Transaktionen
Um Geld von dem erschaffenen Kontostand zu überweisen, gibt es die Datei crypto/block/wallet.fif, die ebenfalls in den Ordner mit dem erstellten Client gelegt 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 seqno Ihrer Brieftasche anpassen (sie beträgt 1 nach der Initialisierung der Brieftasche und erhöht sich um 1 nach jeder ausgehenden Transaktion – Sie können sie sehen, indem Sie den Zustand Ihres Kontos abfragen). Für Tests können Sie beispielsweise meine Brieftasche verwenden – 0x4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2.
Beim Starten (. /crypto/fift wallet.fif) nimmt das Skript die Adresse Ihrer Brieftasche (von wo Sie überweisen) und ihren privaten Schlüssel aus den Dateien new-wallet.addr und new-wallet.pk, und die erhaltene Nachricht wird in new-wallet-query.boc.
geschrieben. Wie zuvor, um die Transaktion tatsächlich auszuführen, rufen wir auf sendfile new-wallet-query.boc im Client. Dann vergessen wir nicht, den Zustand der Blockchain zu aktualisieren (last) und überprüfen, ob sich der Kontostand und seqno unseres Wallets geändert haben (getaccount).

Das ist alles, jetzt können wir Smart Contracts in TON erstellen und Anfragen an sie senden. Wie wir sehen, ist die aktuelle Funktionalität bereits ausreichend, um beispielsweise eine benutzerfreundlichere Wallet mit grafischer Benutzeroberfläche zu erstellen (es wird jedoch erwartet, dass diese auch als Teil des Messengers verfügbar sein wird).
Nur registrierte Benutzer können an der Umfrage teilnehmen. .
Sind Sie an einer Fortsetzung der Artikel über die Analyse von TON, TVM, Fift interessiert?
Ja, ich warte auf den Abschluss des Artikelzyklus mit einem allgemeinen Überblick über TON
Ja, ich möchte mehr über die Sprache Fift lesen
Ja, ich möchte mehr über die TON Virtual Machine und den dafür erforderlichen Assembler erfahren
Nein, ich finde das alles nicht interessant
39 Benutzer haben abgestimmt. 12 Benutzer haben sich enthalten.
Was halten Sie von den Plänen von Telegram zur Einführung von TON?
Ich setze große Hoffnungen in dieses Projekt
Ich verfolge es einfach mit Interesse
Ich bin skeptisch eingestellt 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 haben sich enthalten.
Quelle: habr.com

