Testclient TON (Telegram Open Network) en de nieuwe taal Fift voor smart contracts

Meer dan een jaar geleden werd bekend dat de messaging-app Telegram plannen had om zijn eigen gedecentraliseerde netwerk uit te brengen Telegram Open Network. Toen werd een uitgebreid technisch document beschikbaar gesteld, dat vermoedelijk door Nikolai Durov was geschreven en de structuur van het toekomstige netwerk beschreef. Voor degenen die het gemist hebben — ik raad aan om mijn samenvatting van dit document te bekijken (deel 1, deel 2; het derde deel ligt helaas nog steeds in de concepten).

Sindsdien zijn er geen noemenswaardige updates geweest over de status van de ontwikkeling van TON, totdat er een paar dagen geleden (in een van de niet-officiële kanalen) een link naar de pagina verscheen https://test.ton.org/download.html, waar de volgende items zijn geplaatst:
◦ ton-test-liteclient-full.tar.xz — de broncodes van de lichte client voor het testnet TON;
◦ ton-lite-client-test1.config.json — het configuratiebestand om verbinding te maken met het testnet;
◦ README — informatie over het bouwen en starten van de client;
◦ HOWTO — een stapsgewijze handleiding voor het creëren van een smart contract met behulp van de client;
◦ ton.pdf — een bijgewerkt document (van 2 maart 2019) met een technische beoordeling van het TON-netwerk;
◦ tvm.pdf — een technische beschrijving van TVM (TON Virtual Machine, de virtuele machine TON);
◦ tblkch.pdf — een technische beschrijving van de blockchain TON;
◦ fiftbase.pdf — een beschrijving van de nieuwe taal Fift, bedoeld voor het creëren van smart contracts in TON.

Ik herhaal, er zijn geen officiële bevestigingen van de pagina en al deze documenten van Telegram gekomen, maar de hoeveelheid materiaal maakt het behoorlijk geloofwaardig. Publiceer de gelanceerde client op eigen risico.

De testclient bouwen

Laten we beginnen met het bouwen en starten van de testclient — gelukkig, README beschrijft dit proces in detail. Ik zal dit doen op macOS 10.14.5, ik kan niet garanderen dat het op andere systemen succesvol zal zijn.

  1. We downloaden en paken uit de archief met de broncode. Het is belangrijk om de laatste versie te downloaden, aangezien achterwaartse compatibiliteit op dit punt niet gegarandeerd is.

  2. We zorgen ervoor dat de laatste versies van make, cmake (versie 3.0.2 of hoger), OpenSSL (inclusief C-headerbestanden), g++ of clang op het systeem zijn geïnstalleerd. Ik hoefde niets extra te installeren, alles compileerde meteen.

  3. Laten we aannemen dat de bronbestanden zijn uitgepakt in de map ~\/lite-client. Maak apart een lege map voor het gebouwde project aan (bijvoorbeeld, ~\/liteclient-build), en vanuit deze map (cd ~\/liteclient-build) roepen we de commando's aan:

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

    Testclient TON (Telegram Open Network) en de nieuwe taal Fift voor smart contracts

    Om de taalinterpreteerder Fift te bouwen voor slimme contracten (daarover hieronder), roepen we ook aan

    cmake --build . --target fift

  4. We downloaden de actuele configur bestand om verbinding te maken met het testnetwerk en plaatsen het in de map met de gebouwde client.

  5. Klaar, dan kan de client worden gestart:

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

Als alles correct is gedaan, zou je iets als dit moeten zien:

Testclient TON (Telegram Open Network) en de nieuwe taal Fift voor smart contracts

Beschikbare commando's, zoals we zien, zijn er niet veel:
◦ help — deze lijst met commando's weergeven;
◦ quit — afsluiten;
◦ met behulp van de mutate-plugin, de vereiste tijdzone instellen en deze tijdstempel plaatsen in — de huidige tijd op de server weergeven;
◦ status — de status van de verbinding en de lokale database weergeven;
◦ laatst — de status van de blockchain bijwerken (laad het laatste blok). Het is belangrijk om dit commando uit te voeren voordat je andere aanvragen doet, zodat je zeker weet dat je de actuele status van het netwerk ziet.
◦ sendfile <filename> — een lokaal bestand naar het TON-netwerk uploaden. Dit is de manier waarop interactie met het netwerk plaatsvindt — waaronder bijvoorbeeld het creëren van nieuwe smart contracts en aanvragen om middelen tussen accounts over te maken;
◦ getaccount

— de huidige (op het moment van uitvoering van het commando) status van het account met het opgegeven adres tonen; laatst)
◦ privkey <filename> — een privésleutel uit een lokaal bestand uploaden.

Als je bij het starten van de client een map opgeeft met de optie -D, dan plaatst hij het laatste blok van de masterchain daarin:

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

Nu kunnen we overgaan tot interessantere zaken — de Fift-taal bestuderen, proberen een smart contract te compileren (bijvoorbeeld een testportemonnee aanmaken), het in het netwerk te uploaden en proberen middelen tussen accounts over te maken.

De Fift-taal

Uit het document fiftbase.pdf kan worden opgemaakt dat het Telegram-team een nieuwe stacktaal heeft gemaakt voor het creëren van smart contracts Fift (waarschijnlijk van het telwoord fifth, in navolging van Forth — de taal waarmee Fift veel gemeen heeft).

Het document is behoorlijk omvangrijk, met 87 pagina's, en ik zal de inhoud ervan niet in detail samenvatten in dit artikel (minstens omdat ik zelf mijn lezing nog niet heb voltooid :). Ik ga in op de belangrijkste punten en geef een paar codevoorbeelden in deze taal.

Op basaal niveau is de syntaxis van Fift vrij eenvoudig: de code bestaat uit woorden, die over het algemeen gescheiden zijn door spaties of nieuwe regels (een uitzondering: sommige woorden vereisen geen scheidingsteken na zich). Elk woord is een case-sensitive reeks tekens, die overeenkomt met een bepaalde definitie (in grove lijnen, wat de interpreter moet doen wanneer het dit woord tegenkomt). Als er geen definitie van het woord is, probeert de interpreter het als een getal te parseren en op de stack te plaatsen. Trouwens, de getallen hier zijn — verrassend genoeg — 257-bits gehele getallen, en er zijn geen breuken — nauwkeuriger gezegd, ze worden onmiddellijk omgezet in een paar gehele getallen die de teller en noemer van een rationele breuk vormen.

Woorden interageren doorgaans met waarden die bovenop de stack liggen. Een apart type woorden is prefix. — gebruikt geen stack, maar de volgende symbolen uit het bronbestand. Bijvoorbeeld, zo zijn stringliteralen geïmplementeerd — het teken «aanhalingstekens» (") is een prefixwoord dat naar het volgende (sluitende) aanhalingsteken zoekt en plaatst de string tussen hen op de stack. Op dezelfde manier gedragen zich eénregelige (//) en meerregelige (/*) commentaren.

Bijna daar eindigt de interne structuur van de taal. Al het andere (inclusief controlestructuren) is gedefinieerd als woorden (of intern, zoals rekenkundige bewerkingen en het definiëren van nieuwe woorden; of gedefinieerd in de «standaardbibliotheek» Fift.fif, die zich in de map crypto/fift in de bronteksten bevindt).

Een eenvoudig voorbeeld van een programma in Fift:

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

In de eerste regel wordt een nieuw woord gedefinieerd setxy (let op de prefix {, die een blok creëert tot het sluitende } en de prefix :, die het woord daadwerkelijk definieert). setxy neemt een getal van de bovenkant van de stack, definieert (of herschrijft) het als een globale constante x, en het kwadraat van dit getal als een constante y (aangezien waarden van constanten opnieuw kunnen worden gedefinieerd, zou ik ze liever variabelen noemen, maar ik volg de naamgeving in de taal).

In de volgende twee regels wordt er een getal op de stack geplaatst, wordt er opgeroepen setxy, dan worden de waarden van de constanten weergegeven x, y (voor de uitvoer wordt het woord .) gebruikt, worden beide constanten op de stack geplaatst, opgeteld en wordt de uitkomst ook weergegeven. Als resultaat zullen we zien:

3 9 12 ok
7 49 56 ok

(De lijn «ok» wordt door de interpreter weergegeven wanneer deze klaar is met het verwerken van de huidige regel in de interactieve invoermodus)

En een volledig voorbeeld van de code:

"Asm.fif" include

-1 constant wc  
// maak een portemonnee aan in werkchain -1 (masterchain)

// Maak nieuwe eenvoudige portemonnee
&lt;{  SETCP0 DUP IFNOTRET INC 32 THROWIF  
    // retourneer als recv_internal, mislukken tenzij recv_external
    512 INT LDSLICEX DUP 32 PLDU   
    // teken cs cnt
    c4 PUSHCTR CTOS 32 LDU 256 LDU ENDS  
    // teken cs cnt cnt&#039; pubk
    s1 s2 XCPU            
    // teken cs cnt pubk cnt&#039; cnt
    EQUAL 33 THROWIFNOT   
    // (seqno mismatch?)
    s2 PUSH HASHSU        
    // teken cs cnt pubk hash
    s0 s4 s4 XC2PU        
    // pubk cs cnt hash teken pubk
    CHKSIGNU              
    // pubk cs cnt?
    34 THROWIFNOT         
    // handtekening 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
}&gt;c
// code
<b 0 32 u, newkeypair swap dup constant wallet_pk "new-wallet.pk" b>bestand
   B, 
b&gt; // gegevens
// geen 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>$ type cr
256 u&gt;B "new-wallet.addr" B&gt;bestand
<b 0 32 u, b>
dup ."bericht ondertekenen: " <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 ."Extern bericht voor initialisatie is " <s csr. cr
2 boc+>B dup Bx. cr
"new-wallet-query.boc" tuck B&gt;bestand
."(Opgeslagen in bestand " type .")" cr

Dit angstaanjagend uitziende bestand is bedoeld voor het creëren van een smart contract — het zal worden geplaatst in het bestand new-wallet-query.boc na uitvoering. Let op dat hier ook nog een andere assembler-taal voor de TON Virtual Machine wordt gebruikt (hier zal ik niet in detail op ingaan), waarvan de instructies in de blockchain zullen worden geplaatst.

Verantwoordelijk gemaakt, is de assembler voor de TVM geschreven in Fift — de bronteksten van deze assembler bevinden zich in het bestand crypto/fift/Asm.fif en worden aan het begin van het bovenstaande codefragment gekoppeld.

Wat ik kan zeggen, duidelijk houdt Nikolai Durov gewoon van het creëren van nieuwe programmeertalen 🙂

Het creëren van een smart contract en interactie met TON

Stel je voor dat we de TON-client en de Fift-interpreter hebben verzameld, zoals hierboven beschreven, en bekend zijn met de taal. Hoe creëren we nu een smart contract? Dit wordt besproken in het bestand HOWTO, dat aan de bronbestanden is toegevoegd.

Accounts in TON

Zoals ik heb beschreven in de TON-review, bevat dit netwerk meer dan één blockchain — er is één algemene, de zogenaamde 'masterchain', en een willekeurig aantal extra 'workchains', geïdentificeerd door een 32-bits nummer. De masterchain heeft een identificator van -1, daarnaast kan ook de 'basis' workchain met identificator 0 worden gebruikt. Elke workchain kan zijn eigen configuratie hebben. Intern is elke workchain verdeeld in sharded chains, maar dat is al een detail van de implementatie dat niet noodzakelijkerwijs onthouden hoeft te worden.

Binnen één workchain worden veel accounts opgeslagen, die hun eigen identificatoren account_id hebben. Voor de masterchain en de nul workchain hebben ze een lengte van 256 bits. Dus, de identificator van het account wordt bijvoorbeeld als volgt genoteerd:

-1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Dit is het 'rauwe' formaat: eerst de identificator van de workchain, dan een dubbele punt, en de identificator van het account in hexadecimale notatie.

Daarnaast is er een verkort formaat — het nummer van de workchain en het adres van het account worden in binaire vorm gecodeerd, daarbij wordt een controlegetal toegevoegd en dit alles wordt in Base64 gecodeerd:

Ef+BVndbeTJeXWLnQtm5bDC2UVpc0vH2TF2ksZPAPwcODSkb

Met deze formaatnotatie kunnen we de huidige status van een account opvragen via een testclient met het commando

getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

We krijgen ongeveer zo'n antwoord:

[ 3][t 2][1558746708.815218925][test-lite-client.cpp:631][!testnode]    aanvraag accountstatus voor -1:8156775B79325E5D62E742D9B96C30B6515A5CD2F1F64C5DA4B193C03F070E0D
[ 3][t 2][1558746708.858564138][test-lite-client.cpp:652][!testnode]    ontvangen accountstatus voor -1:8156775B79325E5D62E742D9B96C30B6515A5CD2F1F64C5DA4B193C03F070E0D met betrekking tot blokken (-1,8000000000000000,72355):F566005749C1B97F18EDE013EBA7A054B9014961BC1AD91F475B9082919A2296:1BD5DE54333164025EE39D389ECE2E93DA2871DA616D488253953E52B50DC03F en (-1,8000000000000000,72355):F566005749C1B97F18EDE013EBA7A054B9014961BC1AD91F475B9082919A2296:1BD5DE54333164025EE39D389ECE2E93DA2871DA616D488253953E52B50DC03F
accountstatus 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}

We zien de structuur die wordt opgeslagen in de DHT van de opgegeven werklast. Bijvoorbeeld, in het veld storage.balance bevindt zich het huidige saldo van het account, in storage.state.code — de code van het slimme contract, en in storage.state.data — zijn huidige gegevens. Merk op dat de datavisie van TON — Cell, cellen — een boomstructuur is, waarbij elke cel zowel zijn eigen gegevens als kindcellen kan hebben. Dit wordt weergegeven door inspringingen in de laatste regels.

Samenstellen van het slimme contract

Laten we nu zelf zo'n structuur creëren (dit wordt BOC genoemd — bag of cells) met behulp van de Fift-taal. Gelukkig hoeven we het slimme contract niet zelf te schrijven — in de map crypto/block van het archief met de brondocumenten is er een bestand new-wallet.fif, dat ons helpt een nieuwe portemonnee te creëren. We kopiëren dit naar de map met de verzamelde client (~\/liteclient-build, als je de bovenstaande instructie hebt gevolgd). De inhoud ervan heb ik hierboven als voorbeeldcode in Fift gegeven.

We voeren dit bestand als volgt uit:

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

Hier <source-directory> moet worden vervangen door het pad naar de uitgepakte bronbestanden (het symbool «~» kan hier helaas niet worden gebruikt, er is een volledig pad nodig). In plaats van de optie -I kan de omgevingsvariabele FIFTPATH worden gedefinieerd en dit pad daarin worden geplaatst.

Omdat we Fift hebben gestart met de bestandsnaam new-wallet.fif, zal hij deze uitvoeren en beëindigen. Als de bestandsnaam wordt weggelaten, kun je met de interpreter in interactieve modus spelen.

Na uitvoering zou de console iets als volgt moeten weergeven:

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

nieuw wallet-adres = -1 : 4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2 
0f9PzVILj8yglrVn1zS-NSjtxr7QBfaTCp7JrBqnFPIR8nhZ
berichten ondertekenen: x{00000000}

Extern bericht voor de initialisatie is x{89FEE120E20C7E953E31546F64C23CD654002C1AA919ADD24DB12DDF85C6F3B58AE41198A28AD8DAF3B9588E7A629252BA3DB88F030D00BC1016110B2073359EAC3C13823C53245B65D056F2C070B940CDA09789585935C7ABA4D2AD4BED139281CFA1200000001_}
 x{FF0020DDA4F260810200D71820D70B1FED44D0D31FD3FFD15112BAF2A122F901541044F910F2A2F80001D31F3120D74A96D307D402FB00DED1A4C8CB1FCBFFC9ED54}
 x{0000000055375F730EDC2292E8CB15C42E8036EE9C25AA958EE002D2DE48A205E3A3426B}

B5EE9C724104030100000000D60002CF89FEE120E20C7E953E31546F64C23CD654002C1AA919ADD24DB12DDF85C6F3B58AE41198A28AD8DAF3B9588E7A629252BA3DB88F030D00BC1016110B2073359EAC3C13823C53245B65D056F2C070B940CDA09789585935C7ABA4D2AD4BED139281CFA1200000001001020084FF0020DDA4F260810200D71820D70B1FED44D0D31FD3FFD15112BAF2A122F901541044F910F2A2F80001D31F3120D74A96D307D402FB00DED1A4C8CB1FCBFFC9ED5400480000000055375F730EDC2292E8CB15C42E8036EE9C25AA958EE002D2DE48A205E3A3426B6290698B
(Opgeslagen in bestand new-wallet-query.boc)

Dit betekent dat de wallet met het identificatienummer -1:4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2 (of, hetzelfde als, 0f9PzVILj8yglrVn1zS-NSjtxr7QBfaTCp7JrBqnFPIR8nhZ) succesvol is aangemaakt. De bijbehorende code komt in het bestand terecht new-wallet-query.boc, het adres is te vinden in new-wallet.addr, en de privésleutel in new-wallet.pk (wees voorzichtig - het opnieuw uitvoeren van het script overschrijft deze bestanden).

Natuurlijk weet het TON-netwerk nog niets van deze wallet, hij is alleen opgeslagen in de vorm van deze bestanden. Nu moet hij in het netwerk worden geladen. Het probleem is dat je een vergoeding moet betalen om een slim contract aan te maken, en het saldo van je account is momenteel nul.

In de operationele modus zal dit probleem worden opgelost door grammen op de beurs te kopen (of over te maken vanuit een andere wallet). Maar in de huidige testmodus is er een speciaal slim contract ingesteld waarbij je tot 20 gram gratis kunt aanvragen.

Het indienen van een verzoek aan een extern slim contract

De aanvraag bij het slim contract dat grammen links en rechts uitdeelt, doen we als volgt. In dezelfde map crypto/block vinden we het bestand 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 ."omvattend bericht: " <s csr. cr
<b b{1000100} s, wc 8 i, wallet_addr 256 u, 0 gram, b{00} s,
 swap <s b>
dup ."resulterend extern bericht: " <s csr. cr
2 boc+>B dup Bx. cr
"wallet-query.boc" B&gt;bestand

We zullen dit ook in de map met de verzamelde client opslaan, maar we zullen de vijfde regel aanpassen - vóór de regel «constant dest_addr« . Vervang deze door het adres van de wallet die je eerder hebt aangemaakt (volledig, niet afgekort). Schrijf aan het begin geen «-1:», maar plaats in plaats daarvan «0x» aan het begin.

Je kunt ook de regel wijzigen 6.666 Gram* / constante hoeveelheid — dit is het aantal in grammen dat je aanvraagt (maximaal 20). Ook als je een geheel getal opgeeft, laat een decimale punt staan.

Ten slotte moeten we de regel aanpassen 0x00000011 constante seqno. Het eerste getal hier is het huidige sequence number dat wordt opgeslagen in het account dat de grammen uitgeeft. Hoe krijg je het? Zoals eerder vermeld, start de cliënt en voer uit:

last
getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Aan het eind van de gegevens van het slimme contract staat

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

Het getal 0000000D (bij jou zal het groter zijn) is het sequence number dat moet worden ingevoerd in testgiver.fif.

Alles, we slaan het bestand op en starten het (. /crypto/fift testgiver.fif). We krijgen het bestand wallet-query.boc. Dit is het gegenereerde een bericht aan een ander slim contract — het verzoek "verzend zoveel gram naar dit account".

Met behulp van de cliënt laden we het in het netwerk:

> sendfile wallet-query.boc
[ 1][t 1][1558747399.456575155][test-lite-client.cpp:577][!testnode] verzenden van query vanuit bestand wallet-query.boc
[ 3][t 2][1558747399.500236034][test-lite-client.cpp:587][!query] externe berichtstatus is 1

Als we nu aanroepen laatst, en vervolgens opnieuw de status van het account opvragen waarvan we de grammen hebben aangevraagd, dan zouden we moeten zien dat zijn sequence number met één is verhoogd — dat betekent dat het geld naar ons account is gestuurd.

Er is nog één laatste stap — we laden de code van onze wallet (de balans is al aangevuld, maar zonder de code van het slimme contract kunnen we er niet mee omgaan). Voer uit sendfile new-wallet-query.boc — en dat is het, je hebt je eigen wallet in het TON-netwerk (ook al is het voorlopig alleen een testversie).

Het creëren van uitgaande transacties

Om geld van de balans van het gemaakte account over te maken, is er een bestand crypto/block/wallet.fif, dat ook in de map met de samengestelde cliënt moet worden geplaatst.

Net als bij de vorige stappen, moet je hierin het bedrag dat je overmaakt, het adres van de ontvanger (dest_addr) en seqno van je wallet aanpassen (het is 1 na de initialisatie van de wallet en verhoogt met 1 na elke uitgaande transactie — je kunt het zien door de status van je account op te vragen). Voor tests kun je bijvoorbeeld mijn wallet gebruiken — 0x4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2.

Bij uitvoering (. /crypto/fift wallet.fif) neemt het script het adres van je wallet (waarvandaan je overmaakt) en zijn privé-sleutel uit de bestanden new-wallet.addr en new-wallet.pk, en schrijft het verkregen bericht in new-wallet-query.boc.

Zoals eerder, om de transactie daadwerkelijk uit te voeren, roepen we op sendfile new-wallet-query.boc in de client. Vergeet niet de status van de blockchain bij te werken (laatst) en controleer of het saldo en seqno van onze portemonnee zijn aangepast (getaccount).

Testclient TON (Telegram Open Network) en de nieuwe taal Fift voor smart contracts

Dat is alles, nu weten we hoe we slimme contracten in TON kunnen maken en verzoeken daarheen kunnen sturen. Zoals we zien, is de huidige functionaliteit al voldoende om bijvoorbeeld een gebruiksvriendelijkere portemonnee met een grafische interface te maken (hoewel verwacht wordt dat deze als onderdeel van de messenger beschikbaar zal komen).

Alleen geregistreerde gebruikers kunnen deelnemen aan de enquête. Log in, alstublieft.

Bent u geïnteresseerd in het vervolg van de artikelen over de analyse van TON, TVM, Fift?

  • Ja, ik wacht op de afronding van de cyclus artikelen met een algemeen overzicht van TON

  • Ja, ik wil graag meer lezen over de programmeertaal Fift

  • Ja, ik wil meer weten over de TON Virtual Machine en de assembler daarvoor

  • Nee, ik ben in dit alles niet geïnteresseerd

39 gebruikers hebben gestemd. 12 gebruikers hebben zich onthouden.

Wat vindt u van de plannen van Telegram om TON te lanceren?

  • Ik heb grote verwachtingen van dit project

  • Ik volg het gewoon met interesse

  • Ik ben sceptisch ingesteld en twijfel aan het succes ervan

  • Ik ben geneigd te denken dat dit initiatief mislukt en voor de bredere massa's niet nodig is

47 gebruikers hebben gestemd. 12 gebruikers hebben zich onthouden.

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster