Testa kliento TON (Telegram Open Network) kaj nova Fift-lingvo por inteligentaj kontraktoj

Antaŭ pli ol unu jaro, oni sciis pri la planoj de la Telegram-mesaĝo liberigi sian propran malcentralizitan reton Malferma Reto telegramo. Tiam disponeblas granda teknika dokumento, kiu estis supozeble verkita de Nikolaj Durov kaj priskribis la strukturon de la estonta reto. Por tiuj, kiuj maltrafis ĝin, mi rekomendas, ke vi legu mian rerakonton de ĉi tiu dokumento (parto 1, parto 2; la tria parto, ve, ankoraŭ kolektas polvon en malnetoj).

Ekde tiam, ne estis signifaj novaĵoj pri la statuso de la disvolviĝo de TON ĝis antaŭ kelkaj tagoj (en unu el neoficialaj kanaloj) la ligilo al la paĝo ne aperis https://test.ton.org/download.html, kie troviĝas:
ton-test-liteclient-full.tar.xz — fontoj de malpeza kliento por la TON-testreto;
ton-lite-client-test1.config.json — agorda dosiero por konektiĝi al la testa reto;
Legu — informoj pri konstruado kaj lanĉo de la kliento;
KIEL — paŝo post paŝo instrukcioj pri kreado de inteligenta kontrakto per kliento;
tuno.pdf — ĝisdatigita dokumento (datita la 2-an de marto 2019) kun teknika superrigardo de la reto TON;
tvm.pdf — teknika priskribo de TVM (TON Virtual Machine, TON virtuala maŝino);
tblkch.pdf — teknika priskribo de la blokĉeno TON;
kvina bazo.pdf — priskribo de la nova Fift-lingvo, dizajnita por krei inteligentajn kontraktojn en TON.

Mi ripetas, ne estis oficiala konfirmo de la paĝo kaj ĉiuj ĉi dokumentoj de Telegramo, sed la volumeno de ĉi tiuj materialoj faras ilin sufiĉe kredindaj. Lanĉu la publikigitan klienton je propra risko.

Konstruante testan klienton

Unue, ni provu konstrui kaj ruli testklienton - feliĉe, Legu priskribas ĉi tiun simplan procezon detale. Mi faros tion uzante macOS 10.14.5 kiel ekzemplon; mi ne povas garantii pri la sukceso de la konstruado sur aliaj sistemoj.

  1. Elŝutu kaj malpaku fontarkivo. Gravas elŝuti la lastan version ĉar malantaŭa kongruo ne estas garantiita en ĉi tiu etapo.

  2. Certigu, ke la plej novaj versioj de make, cmake (versio 3.0.2 aŭ pli alta), OpenSSL (inkluzive de C-kapodosieroj), g++ aŭ clang estas instalitaj en la sistemo. Mi devis instali ion ajn, ĉio kuniĝis tuj.

  3. Ni supozu, ke la fontoj estas malpakitaj en dosierujon ~/lite-client. Aparte de ĝi, kreu malplenan dosierujon por la kunmetita projekto (ekzemple, ~/liteclient-build), kaj de ĝi (cd ~/liteclient-build) voku la komandojn:

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

    Testa kliento TON (Telegram Open Network) kaj nova Fift-lingvo por inteligentaj kontraktoj

    Por konstrui la Kvinlingvan interpretiston por inteligentaj kontraktoj (pli pri ĝi sube), ni ankaŭ vokas

    cmake --build . --target fift

  4. Elŝutu la nunan agorda dosiero konekti al la testa reto kaj meti ĝin en la dosierujon kun la kunmetita kliento.

  5. Farita, vi povas komenci la klienton:

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

Se ĉio estas farita ĝuste, vi devus vidi ion tian:

Testa kliento TON (Telegram Open Network) kaj nova Fift-lingvo por inteligentaj kontraktoj

Kiel ni povas vidi, estas malmultaj disponeblaj komandoj:
help — montri ĉi tiun liston de komandoj;
quit - eliru;
time — montri la nunan horon sur la servilo;
status — montru la konekton kaj lokan datumbazan staton;
last — ĝisdatigi la staton de la blokĉeno (elŝutu la lastan blokon). Gravas ruli ĉi tiun komandon antaŭ iuj petoj por certigi, ke vi vidas la nunan staton de la reto.
sendfile <filename> — alŝutu lokan dosieron al la TON-reto. Tiel okazas interago kun la reto - inkluzive de, ekzemple, la kreado de novaj inteligentaj kontraktoj kaj petoj translokigi financojn inter kontoj;
getaccount <address> — montru la fluon (je la tempo kiam la komando estis plenumita) last) la stato de la konto kun la specifita adreso;
privkey <filename> — ŝarĝu la privatan ŝlosilon el loka dosiero.

Se, komencante la klienton, vi translokigas dosierujon al ĝi uzante la opcion -D, tiam li aldonos la lastan blokon de la majstra ĉeno en ĝin:

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

Nun ni povas pluiri al pli interesaj aferoj - lernu la Fift-lingvon, provu kompili inteligentan kontrakton (ekzemple, kreu testan monujon), alŝutu ĝin al la reto kaj provu translokigi financon inter kontoj.

Lingvo Kvin

El la dokumento kvina bazo.pdf vi povas ekscii, ke la Telegram-teamo kreis novan stakan lingvon por krei inteligentajn kontraktojn Kvin (ŝajne el la numeralo kvinan, simila al Forth, lingvo kun kiu Kvina havas multon komuna).

La dokumento estas sufiĉe volumena, 87-paĝa, kaj mi ne detale rerakontos ĝian enhavon kadre de ĉi tiu artikolo (almenaŭ ĉar mi mem ne finis legi ĝin :). Mi koncentriĝos pri la ĉefaj punktoj kaj donos kelkajn kodekzemplojn en ĉi tiu lingvo.

Je baza nivelo, la sintakso de Fift estas sufiĉe simpla: ĝia kodo konsistas el vortoj, kutime apartigitaj per spacoj aŭ linio-rompoj (speciala kazo: kelkaj vortoj ne postulas apartigilon post si). Ajna la vorto estas uskle-distinga sekvenco de signoj, kiu respondas al certa difino (proksimume, kion la interpretisto devus fari kiam ĝi renkontas ĉi tiun vorton). Se ne ekzistas difino de vorto, la interpretisto provas analizi ĝin kiel nombron kaj meti ĝin sur la stakon. Cetere, la nombroj ĉi tie estas - subite - 257-bitaj entjeroj, kaj tute ne estas frakcioj - pli precize, ili tuj iĝas paro de entjeroj, formante la numeratoro kaj denominatoro de racia frakcio.

Vortoj emas interagi kun valoroj ĉe la supro de la stako. Aparta speco de vortoj - Prefikso — ne uzas la stakon, sed la postajn signojn el la fontdosiero. Ekzemple, jen kiel ĉenaj literaloj estas efektivigitaj - la citaĵo (") estas prefiksa vorto, kiu serĉas la sekvan (ferman) citaĵon, kaj puŝas la ŝnuron inter ili sur la stakon. Unu-ekskursoŝipoj kondutas en la sama maniero (//) kaj plurlinio (/*) komentoj.

Ĉi tie finiĝas preskaŭ la tuta interna strukturo de la lingvo. Ĉio alia (inkluzive de kontrolkonstruaĵoj) estas difinita kiel vortoj (aŭ internaj, kiel aritmetikaj operacioj kaj la difino de novaj vortoj; aŭ difinita en la "norma biblioteko" Fift.fif, kiu estas en la dosierujo crypto/fift en la fontoj).

Simpla ekzempla programo en Fift:

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

La unua linio difinas novan vorton setxy (notu la prefikson {, kiu kreas blokon antaŭ la ferma } kaj prefikso :, kiu fakte difinas la vorton). setxy prenas nombron de la supro de la stako, difinas (aŭ redifinas) ĝin kiel tutmondan konstanta x, kaj la kvadrato de ĉi tiu nombro kiel konstanto y (Konsiderante ke la valoroj de konstantoj povas esti redifinitaj, mi prefere nomus ilin variabloj, sed mi sekvas la nomkonvencion en la lingvo).

La sekvaj du linioj metas nombron sur la stakon kaj vokas setxy, tiam la valoroj de la konstantoj estas montrataj x, y (la vorto estas uzata por eligo .), ambaŭ konstantoj estas metitaj sur la stakon, sumigitaj, kaj la rezulto ankaŭ estas presita. Kiel rezulto ni vidos:

3 9 12 ok
7 49 56 ok

(La linio "ok" estas presita de la interpretisto kiam ĝi finas prilabori la nunan linion en interaga eniga reĝimo)

Nu, plena koda ekzemplo:

"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

Ĉi tiu timiga aspektanta dosiero estas por krei inteligentan kontrakton - ĝi estos metita en dosieron new-wallet-query.boc post ekzekuto. Bonvolu noti, ke alia asembla lingvo estas uzata ĉi tie por TON Virtual Machine (mi ne detale pritraktos ĝin), kies instrukcioj estos metitaj sur la blokĉenon.

Tiel, la asemblero por TVM estas skribita en Fift - la fontoj de ĉi tiu asemblero estas en la dosiero crypto/fift/Asm.fif kaj estas konektitaj komence de la supra kodo.

Kion mi povas diri, ŝajne Nikolao Durov simple amas krei novajn programlingvojn :)

Kreante inteligentan kontrakton kaj interagante kun TON

Do, ni supozu, ke ni kunvenis la TON-klienton kaj la Fift-interpretilon kiel priskribite supre kaj konatiĝis kun la lingvo. Kiel krei inteligentan kontrakton nun? Ĉi tio estas priskribita en la dosiero KIEL, alkroĉita al la fontoj.

Kontoj en TON

Kiel mi priskribis en TON recenzo, ĉi tiu reto enhavas pli ol unu blokĉenon - ekzistas unu komuna, la tn. "majstra ĉeno", same kiel arbitra nombro da kromaj "laborĉenoj", identigitaj per 32-bita nombro. La ĉefĉeno havas identigilon de -1; krom ĝi, ankaŭ povas esti uzata "baza" laborĉeno kun identigilo de 0. Ĉiu laborĉeno povas havi sian propran agordon. Interne, ĉiu laborĉeno estas dividita en shardĉenojn, sed ĉi tio estas efektiviga detalo, kiu ne bezonas esti memorita.

Ene de unu laborĉeno, multaj kontoj estas stokitaj, kiuj havas siajn proprajn account_id-identigilojn. Por la ĉefĉeno kaj nula laborĉeno, ili longas 256 bitojn. Tiel, la kontidentigilo estas skribita, ekzemple, jene:

-1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Ĉi tiu estas la "kruda" formato: unue la laborĉena ID, poste dupunkto, kaj la konta ID en deksesuma skribmaniero.

Krome, estas mallongigita formato - la laborĉena nombro kaj konta adreso estas koditaj en binara formo, ĉeksumo estas aldonita al ili, kaj ĉio ĉi estas kodita en Base64:

Ef+BVndbeTJeXWLnQtm5bDC2UVpc0vH2TF2ksZPAPwcODSkb

Konante ĉi tiun rekordan formaton, ni povas peti la aktualan staton de konto per testa kliento uzante la komandon

getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Ni ricevos ion tian:

[ 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}

Ni vidas la strukturon, kiu estas stokita en la DHT de la specifita laborĉeno. Ekzemple, sur la kampo storage.balance estas la nuna konta saldo, en storage.state.code - inteligenta kontraktokodo, kaj en storage.state.data - ĝiaj aktualaj datumoj. Bonvolu noti, ke la TON-datumstokado - Ĉelo, ĉeloj - estas arbo-simila, ĉiu ĉelo povas havi kaj siajn proprajn datumojn kaj infanĉelojn. Ĉi tio estas montrita kiel indentaĵo en la lastaj linioj.

Konstruante inteligentan kontrakton

Nun ni mem kreu tian strukturon (ĝi nomiĝas BOC - sako da ĉeloj) uzante la kvinan lingvon. Feliĉe, vi ne devas mem skribi inteligentan kontrakton - en la dosierujo crypto/block estas dosiero el la fontarkivo new-wallet.fif, kiu helpos nin krei novan monujon. Ni kopiu ĝin al la dosierujo kun la kunmetita kliento (~/liteclient-build, se vi sekvis la suprajn instrukciojn). Mi citis ĝian enhavon supre kiel ekzemplon de kodo ĉe Fift.

Efektivigu ĉi tiun dosieron jene:

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

estas <source-directory> devas esti anstataŭigita per la vojo al la malpakitaj fontoj (la simbolo "~", bedaŭrinde, ne povas esti uzata ĉi tie, la plena vojo estas necesa). Anstataŭ uzi ŝlosilon -I vi povas difini mediovariablon FIFTPATH kaj metu ĉi tiun vojon en ĝin.

Ekde ni lanĉis Fift kun la dosiernomo new-wallet.fif, ĝi ekzekutos ĝin kaj eliros. Se vi preterlasas la dosiernomon, vi povas ludi kun la interpretisto interage.

Post ekzekuto, io tia devus esti montrata en la konzolo:

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)

Ĉi tio signifas, ke la monujo kun la ID -1:4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2 (aŭ kio estas la sama, 0f9PzVILj8yglrVn1zS-NSjtxr7QBfaTCp7JrBqnFPIR8nhZ) sukcese kreita. La responda kodo estos en la dosiero new-wallet-query.boc, lia adreso estas en new-wallet.addr, kaj la privata ŝlosilo estas en new-wallet.pk (atentu - ruli la skripton denove anstataŭigos ĉi tiujn dosierojn).

Kompreneble, la reto TON ankoraŭ ne scias pri ĉi tiu monujo; ĝi estas konservita nur en la formo de ĉi tiuj dosieroj. Nun ĝi devas esti alŝutita al la reto. Tamen, la problemo estas, ke por krei inteligentan kontrakton vi devas pagi komisionon, kaj via konta saldo estas ankoraŭ nula.

En laborreĝimo, ĉi tiu problemo estos solvita aĉetante gramojn sur la interŝanĝo (aŭ transdonante de alia monujo). Nu, en la nuna prova reĝimo, speciala inteligenta kontrakto estis kreita, de kiu vi povas peti ĝis 20 gramojn ĝuste tiel.

Generante peton al la inteligenta kontrakto de iu alia

Ni faras peton al inteligenta kontrakto, kiu distribuas gramojn maldekstre kaj dekstre tiel. En la sama dosierujo crypto/block trovi la dosieron 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

Ni ankaŭ konservos ĝin en la dosierujon kun la kunvenita kliento, sed ni korektos la kvinan linion - antaŭ la linio "constant dest_addr". Ni anstataŭigu ĝin per la adreso de la monujo, kiun vi kreis antaŭe (plena, ne mallongigita). Ne necesas skribi "-1:" komence; anstataŭe, metu "0x" komence.

Vi ankaŭ povas ŝanĝi la linion 6.666 Gram*/ constant amount — jen la kvanto en gramoj, kiun vi petas (ne pli ol 20). Eĉ se vi specifas tutan nombron, lasu la decimalpunkton.

Fine, vi devas korekti la linion 0x00000011 constant seqno. La unua numero ĉi tie estas la nuna sinsekvo, kiu estas konservita en la konto eldonanta gramojn. De kie mi povas akiri ĝin? Kiel dirite supre, lanĉu la klienton kaj rulu:

last
getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Je la fino, la inteligentaj kontraktaj datumoj enhavos

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

La nombro 0000000D (via estos pli granda) estas la sinsekvo, kiu devas esti anstataŭigita en testgiver.fif.

Jen ĝi, konservu la dosieron kaj rulu (./crypto/fift testgiver.fif). La eligo estos dosiero wallet-query.boc. Jen kio estas formita сообщение al la inteligenta kontrakto de iu alia - peto "transloki tiom da gramoj al tia kaj tia konto."

Uzante la klienton, ni alŝutas ĝin al la reto:

> 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

Se vi nun vokas last, kaj poste denove petu la statuson de la konto, de kiu ni petis gramojn, tiam ni vidu, ke ĝia sinsekvo nombro pliiĝis je unu - tio signifas, ke ĝi sendis monon al nia konto.

La lasta paŝo restas - elŝutu la kodon de nia monujo (ĝia saldo jam estis replenigita, sed sen la inteligenta kontraktokodo ni ne povos administri ĝin). Ni efektivigas sendfile new-wallet-query.boc - kaj jen, vi havas vian propran monujon en la TON-reto (eĉ se ĝi estas nur prova nun).

Kreante eksiĝintajn transakciojn

Por translokigi monon de la saldo de la kreita konto, estas dosiero crypto/block/wallet.fif, kiu ankaŭ devas esti metita en la dosierujon kun la kunmetita kliento.

Simile al la antaŭaj paŝoj, vi devas ĝustigi la kvanton, kiun vi transdonas, la adreson de la ricevanto (dest_addr), kaj la seqno de via monujo (ĝi estas egala al 1 post pravalorigo de la monujo kaj pliiĝas je 1 post ĉiu eksiĝinta transakcio - vi povas vidu ĝin petante la staton de via konto). Por testoj, vi povas uzi, ekzemple, mian monujon - 0x4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2.

Ĉe ekfunkciigo (./crypto/fift wallet.fif) la skripto prenos la adreson de via monujo (de kie vi translokigas) kaj ĝian privatan ŝlosilon el la dosieroj new-wallet.addr и new-wallet.pk, kaj la ricevita mesaĝo estos skribita al new-wallet-query.boc.

Kiel antaŭe, por rekte plenumi la transakcion, voku sendfile new-wallet-query.boc en la kliento. Post ĉi tio, ne forgesu ĝisdatigi la staton de la blokĉeno (last) kaj kontrolu, ke la bilanco kaj sekno de nia monujo ŝanĝiĝis (getaccount <account_id>).

Testa kliento TON (Telegram Open Network) kaj nova Fift-lingvo por inteligentaj kontraktoj

Tio estas ĉio, nun ni povas krei inteligentajn kontraktojn en TON kaj sendi petojn al ili. Kiel vi povas vidi, la nuna funkcieco jam sufiĉas por, ekzemple, fari pli amikan monujon kun grafika interfaco (tamen oni atendas, ke ĝi jam estos disponebla kiel parto de la mesaĝisto).

Nur registritaj uzantoj povas partopreni la enketon. Ensaluti, bonvolu.

Ĉu vi interesiĝas daŭrigi la artikolojn kun analizo de TON, TVM, Fift?

  • Jes, mi atendas la kompletigo de la serio de artikoloj kun ĝenerala superrigardo de TON

  • Jes, estas interese legi pli pri la kvina lingvo

  • Jes, mi volas lerni pli pri TON Virtual Machine kaj la asemblero por ĝi

  • Ne, nenio el ĉi tio estas interesa

39 uzantoj voĉdonis. 12 uzantoj sindetenis.

Kion vi pensas pri la planoj de Telegram lanĉi TON?

  • Mi havas grandajn esperojn pri ĉi tiu projekto

  • Mi nur sekvas ĝian evoluon kun intereso.

  • Mi estas skeptika kaj dubas pri ĝia sukceso.

  • Mi emas konsideri ĉi tiun iniciaton fiasko kaj nenecesa por la larĝaj amasoj

47 uzantoj voĉdonis. 12 uzantoj sindetenis.

fonto: www.habr.com

Aldoni komenton