ProHoster > Blogi > antaminen > Testaa asiakas TON (Telegram Open Network) ja uusi Fift-kieli älykkäille sopimuksille
Testaa asiakas TON (Telegram Open Network) ja uusi Fift-kieli älykkäille sopimuksille
Yli vuosi sitten tuli tieto Telegram Messengerin suunnitelmista julkaista oma hajautettu verkko Telegram avoin verkko. Sitten tuli saataville laaja tekninen asiakirja, jonka väitetään kirjoittaneen Nikolai Durov ja jossa kuvattiin tulevan verkon rakenne. Niille, jotka jäivät siitä paitsi, suosittelen lukemaan tämän asiakirjan uudelleen kertomisen (osa 1, osa 2; kolmas osa, valitettavasti, kerää edelleen pölyä luonnoksiin).
Sen jälkeen TON-kehityksen tilasta ei ole ollut merkittäviä uutisia vasta pari päivää sitten (yhdessä epävirallisia kanavia) linkki sivulle ei ilmestynyt https://test.ton.org/download.html, missä sijaitsevat:
◦ ton-test-liteclient-full.tar.xz — valoasiakkaan lähteet TON-testiverkkoon;
◦ ton-lite-client-test1.config.json — määritystiedosto testiverkkoon yhdistämistä varten;
◦ LUEMINUT — tiedot asiakkaan rakentamisesta ja käynnistämisestä;
◦ MITEN — vaiheittaiset ohjeet älykkään sopimuksen luomiseen asiakkaan avulla;
◦ ton.pdf — päivitetty asiakirja (päivätty 2. maaliskuuta 2019), joka sisältää teknisen yleiskatsauksen TON-verkosta;
◦ tvm.pdf — TVM:n (TON-virtuaalikone, TON-virtuaalikone) tekninen kuvaus;
◦ tblkch.pdf — TON-lohkoketjun tekninen kuvaus;
◦ fivebase.pdf — kuvaus uudesta Fift-kielestä, joka on suunniteltu älykkäiden sopimusten luomiseen TONissa.
Toistan, sivulle ja kaikille näille asiakirjoille ei ollut virallista vahvistusta Telegramista, mutta näiden materiaalien määrä tekee niistä melko uskottavia. Käynnistä julkaistu asiakas omalla vastuulla.
Testiasiakkaan rakentaminen
Ensin yritetään rakentaa ja ajaa testiasiakas - onneksi LUEMINUT kuvaa tätä yksinkertaista prosessia yksityiskohtaisesti. Teen tämän käyttämällä esimerkkinä macOS 10.14.5:tä; en voi taata muiden järjestelmien rakentamisen onnistumista.
Lataa ja pura lähdearkisto. On tärkeää ladata uusin versio, koska taaksepäin yhteensopivuutta ei taata tässä vaiheessa.
Varmista, että uusimmat versiot make-, cmake- (versio 3.0.2 tai uudempi), OpenSSL- (mukaan lukien C-otsikkotiedostot), g++- tai clang-versiot on asennettu järjestelmään. Minun ei tarvinnut asentaa mitään, kaikki järjestyi heti.
Oletetaan, että lähteet on purettu kansioon ~/lite-client. Luo siitä erikseen tyhjä kansio kootulle projektille (esim. ~/liteclient-build), ja siitä (cd ~/liteclient-build) kutsu komennot:
Jos kaikki on tehty oikein, sinun pitäisi nähdä jotain tällaista:
Kuten näemme, käytettävissä on muutamia komentoja:
◦ help — näyttää tämän komentoluettelon;
◦ quit - mene ulos;
◦ time — näyttää kellonajan palvelimella;
◦ status — näyttää yhteyden ja paikallisen tietokannan tilan;
◦ last - päivitä lohkoketjun tila (lataa viimeinen lohko). On tärkeää suorittaa tämä komento ennen pyyntöjä varmistaaksesi, että näet verkon nykyisen tilan.
◦ sendfile<filename> — lataa paikallinen tiedosto TON-verkkoon. Näin tapahtuu vuorovaikutusta verkon kanssa - mukaan lukien esimerkiksi uusien älykkäiden sopimusten luominen ja pyynnöt siirtää varoja tilien välillä;
◦ getaccount<address> - näyttää nykyisen (komennon suoritushetkellä) last) määritetyllä osoitteella olevan tilin tila;
◦ privkey<filename> — lataa yksityinen avain paikallisesta tiedostosta.
Jos asiakasohjelmaa käynnistettäessä siirrät kansion siihen käyttämällä vaihtoehtoa -D, sitten hän lisää siihen masterchainin viimeisen lohkon:
Nyt voimme siirtyä kiinnostavampiin asioihin - opettele Fift-kieli, yritä laatia älykäs sopimus (esimerkiksi luoda testilompakko), ladata se verkkoon ja yrittää siirtää varoja tilien välillä.
Kieli Fift
Dokumentista fivebase.pdf saat selville, että Telegram-tiimi on luonut uuden pinokielen älykkäiden sopimusten luomiseen Viisi (ilmeisesti numerosta viides, joka on samanlainen kuin Forth, kieli, jonka kanssa Fifthillä on paljon yhteistä).
Dokumentti on melko laaja, 87 sivua, enkä kerro sen sisältöä sen tarkemmin tämän artikkelin puitteissa (ainakaan siksi, että en ole itse lukenut sitä loppuun :). Keskityn pääkohtiin ja annan pari koodiesimerkkiä tällä kielellä.
Perustasolla Fiftin syntaksi on melko yksinkertainen: sen koodi koostuu sanat, erotetaan yleensä välilyönneillä tai rivinvaihdoilla (erikoistapaus: jotkut sanat eivät vaadi erotinta perään). Minkä tahansa слово on kirjainkoolla erottuva merkkijono, joka vastaa tiettyä merkkiä määritelmä (suunnilleen mitä tulkin tulisi tehdä, kun hän kohtaa tämän sanan). Jos sanalle ei ole määritelmää, tulkki yrittää jäsentää sen numerona ja laittaa sen pinoon. Muuten, täällä olevat luvut ovat - yhtäkkiä - 257-bittisiä kokonaislukuja, eikä murtolukuja ole ollenkaan - tarkemmin sanottuna, ne muuttuvat välittömästi kokonaislukupariksi, muodostaen rationaalisen murtoluvun osoittajan ja nimittäjän.
Sanoilla on tapana olla vuorovaikutuksessa pinon yläosassa olevien arvojen kanssa. Erillinen sanatyyppi - etuliite — ei käytä pinoa, vaan lähdetiedoston myöhempiä merkkejä. Esimerkiksi tällä tavalla merkkijonoliteraalit toteutetaan - lainausmerkki (") on etuliitesana, joka etsii seuraavaa (päättävää) lainausta ja työntää niiden välisen merkkijonon pinoon. Yksilinjaiset käyttäytyvät samalla tavalla (//) ja monirivinen (/*) kommentteja.
Tähän päättyy melkein koko kielen sisäinen rakenne. Kaikki muu (mukaan lukien ohjausrakenteet) määritellään sanoiksi (joko sisäisiksi, kuten aritmeettiset operaatiot ja uusien sanojen määritelmät, tai "vakiokirjastossa" Fift.fif, joka on kansiossa crypto/fift lähteissä).
Yksinkertainen esimerkkiohjelma Fiftissä:
{ dup =: x dup * =: y } : setxy
3 setxy x . y . x y + .
7 setxy x . y . x y + .
Ensimmäinen rivi määrittelee uuden sanan setxy (huomaa etuliite {, joka luo lohkon ennen sulkevaa } ja etuliite :, joka itse asiassa määrittelee sanan). setxy ottaa luvun pinon yläosasta, määrittelee (tai määrittelee uudelleen) sen globaaliksi vakiox, ja tämän luvun neliö vakiona y (Koska vakioiden arvot voidaan määritellä uudelleen, kutsuisin niitä mieluummin muuttujiksi, mutta noudatan kielen nimeämiskäytäntöä).
Seuraavat kaksi riviä laittavat numeron pinoon ja soitat setxy, niin vakioiden arvot näytetään x, y (sanaa käytetään tulostukseen .), molemmat vakiot asetetaan pinoon, lasketaan yhteen ja tulos myös tulostetaan. Tuloksena näemme:
3 9 12 ok
7 49 56 ok
(Tulkki tulostaa rivin "ok", kun se lopettaa nykyisen rivin käsittelyn interaktiivisessa syöttötilassa)
Tämä pelottavan näköinen tiedosto on tarkoitettu älykkään sopimuksen luomiseen - se sijoitetaan tiedostoon new-wallet-query.boc teloituksen jälkeen. Huomaa, että TON-virtuaalikoneessa käytetään toista kokoonpanokieltä (en käsittele sitä yksityiskohtaisesti), jonka ohjeet sijoitetaan lohkoketjuun.
Siten TVM:n assembler on kirjoitettu Fift-kielellä - tämän assemblerin lähteet ovat tiedostossa crypto/fift/Asm.fif ja ne on yhdistetty yllä olevan koodinpätkän alussa.
Mitä voin sanoa, ilmeisesti Nikolai Durov vain rakastaa uusien ohjelmointikielien luomista :)
Älykkään sopimuksen luominen ja vuorovaikutus TONin kanssa
Oletetaan siis, että olemme koonneet TON-asiakkaan ja Fift-tulkin edellä kuvatulla tavalla ja tutustuneet kieleen. Kuinka luoda älykäs sopimus nyt? Tämä on kuvattu tiedostossa MITEN, liitetty lähteisiin.
Tilit TON
Kuten kuvailin kohdassa TON arvostelu, tämä verkko sisältää useamman kuin yhden lohkoketjun - on yksi yhteinen, ns. "pääketju" sekä mielivaltainen määrä muita "työketjuja", jotka tunnistetaan 32-bittisellä numerolla. Masterchainin tunniste on -1, sen lisäksi voidaan käyttää myös "perus"-työketjua, jonka tunniste on 0. Jokaisella työketjulla voi olla oma konfiguraationsa. Sisäisesti jokainen työketju on jaettu shardchaineihin, mutta tämä on toteutusyksityiskohta, jota ei tarvitse pitää mielessä.
Yhteen työketjuun on tallennettu monia tilejä, joilla on omat account_id-tunnisteensa. Pääketjussa ja nollatyöketjussa ne ovat 256 bittiä pitkiä. Siten tilin tunnus kirjoitetaan esimerkiksi näin:
Tämä on "raaka" muoto: ensin työketjun tunnus, sitten kaksoispiste ja tilin tunnus heksadesimaalimuodossa.
Lisäksi on lyhennetty muoto - työketjun numero ja tilin osoite on koodattu binäärimuodossa, niihin lisätään tarkistussumma, ja kaikki tämä on koodattu Base64:ään:
Ef+BVndbeTJeXWLnQtm5bDC2UVpc0vH2TF2ksZPAPwcODSkb
Kun tiedämme tämän tietuemuodon, voimme pyytää tilin nykyistä tilaa testiasiakkaan kautta komennolla
[ 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}
Näemme rakenteen, joka on tallennettu määritetyn työketjun DHT:hen. Esimerkiksi kentällä storage.balance on vaihtotilin saldo, in storage.state.code - älykäs sopimuskoodi ja sisään storage.state.data - sen nykyiset tiedot. Huomaa, että TON-tietovarasto - Solu, solut - on puumainen, jokaisessa solussa voi olla sekä omat tiedot että lapsisolut. Tämä näkyy sisennyksenä viimeisillä riveillä.
Älykkään sopimuksen rakentaminen
Luodaan nyt itse tällainen rakenne (se on nimeltään BOC - pussi soluja) käyttämällä Fift-kieltä. Onneksi sinun ei tarvitse kirjoittaa älykästä sopimusta itse - kansioon crypto/block lähdearkistosta on tiedosto new-wallet.fif, joka auttaa meitä luomaan uuden lompakon. Kopioidaan se kansioon kootun asiakkaan kanssa (~/liteclient-build, jos noudatit yllä olevia ohjeita). Mainitsin sen sisällön yllä esimerkkinä Fiftin koodista.
Täällä <source-directory> on korvattava polulla pakkaamattomiin lähteisiin ("~"-symbolia ei valitettavasti voi käyttää tässä, koko polku tarvitaan). Avaimen käytön sijaan -I voit määrittää ympäristömuuttujan FIFTPATH ja laita tämä polku siihen.
Koska käynnistimme Fiftin tiedostonimellä new-wallet.fif, se suorittaa sen ja poistuu. Jos jätät tiedoston nimen pois, voit pelata tulkin kanssa interaktiivisesti.
Suorituksen jälkeen konsolissa pitäisi näkyä jotain tällaista:
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)
Tämä tarkoittaa, että lompakko ID -1:4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2 (tai mikä on sama, 0f9PzVILj8yglrVn1zS-NSjtxr7QBfaTCp7JrBqnFPIR8nhZ) luotu onnistuneesti. Vastaava koodi tulee tiedostoon new-wallet-query.boc, hänen osoitteensa on new-wallet.addr, ja yksityinen avain on sisällä new-wallet.pk (ole varovainen - komentosarjan uudelleen suorittaminen korvaa nämä tiedostot).
Tietenkään TON-verkko ei vielä tiedä tästä lompakosta, se on tallennettu vain näiden tiedostojen muodossa. Nyt se on ladattava verkkoon. Ongelmana on kuitenkin, että älykkään sopimuksen luomiseksi sinun on maksettava palkkio, ja tilisi saldo on edelleen nolla.
Työtilassa tämä ongelma ratkaistaan ostamalla grammoja vaihdosta (tai siirtämällä toisesta lompakosta). No, nykyisessä testitilassa on luotu erityinen älysopimus, josta voi pyytää jopa 20 grammaa sellaisenaan.
Luodaan pyyntö jonkun muun älykkääseen sopimukseen
Teemme pyynnön älysopimukselle, joka jakaa grammoja vasemmalle ja oikealle näin. Samassa kansiossa crypto/block etsi tiedosto 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
Tallennamme sen myös kansioon kootun asiakkaan kanssa, mutta korjaamme viidennen rivin - ennen riviä "constant dest_addr". Korvataan se aiemmin luomasi lompakon osoitteella (täysi, ei lyhennetty). Ei tarvitse kirjoittaa "-1:" alkuun, vaan laita "0x" alkuun.
Voit myös vaihtaa linjaa 6.666 Gram*/ constant amount — tämä on pyytämäsi määrä grammoina (enintään 20). Vaikka määrität kokonaisluvun, jätä desimaalipilkku.
Lopuksi sinun on korjattava viiva 0x00000011 constant seqno. Ensimmäinen numero tässä on nykyinen järjestysnumero, joka on tallennettu tilille grammoina. Mistä saan sen? Kuten yllä todettiin, käynnistä asiakas ja suorita:
last
getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d
Älykkäiden sopimusten tiedot sisältävät aivan lopussa
Numero 0000000D (omasi on suurempi) on järjestysnumero, joka on korvattava testgiver.fif.
Siinä kaikki, tallenna tiedosto ja suorita (./crypto/fift testgiver.fif). Tulos on tiedosto wallet-query.boc. Tätä muodostuu сообщение jonkun muun älykkääseen sopimukseen - pyyntö "siirrä niin monta grammaa sellaiselle ja sellaiselle tilille".
Lataamme sen verkkoon asiakkaan avulla:
> 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
Jos nyt soitat last, ja pyydä sitten uudelleen sen tilin tilaa, jolta pyysimme grammoja, niin meidän pitäisi nähdä, että sen järjestysnumero on kasvanut yhdellä - tämä tarkoittaa, että se lähetti rahaa tilillemme.
Viimeinen vaihe jää - lataa lompakkomme koodi (sen saldo on jo täydennetty, mutta ilman älykästä sopimuskoodia emme pysty hallitsemaan sitä). Me toteutamme sendfile new-wallet-query.boc - ja siinä kaikki, sinulla on oma lompakkosi TON-verkossa (vaikka se olisikin toistaiseksi vain koe).
Lähtevien tapahtumien luominen
Rahan siirtämiseksi luodun tilin saldosta on tiedosto crypto/block/wallet.fif, joka on myös sijoitettava kootun asiakkaan kansioon.
Samoin kuin edellisissä vaiheissa, sinun on säädettävä siirrettävää summaa, vastaanottajan osoitetta (dest_addr) ja lompakon järjestystä (se on yhtä suuri kuin 1 lompakon alustamisen jälkeen ja kasvaa 1:llä jokaisen lähtevän tapahtuman jälkeen - voit nähdä sen pyytämällä tilisi tilaa). Testeihin voit käyttää esimerkiksi lompakkoani - 0x4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2.
Käynnistyksessä (./crypto/fift wallet.fif) komentosarja ottaa lompakkosi osoitteen (josta siirrät) ja sen yksityisen avaimen tiedostoista new-wallet.addr и new-wallet.pk, ja vastaanotettu viesti kirjoitetaan osoitteeseen new-wallet-query.boc.
Kuten ennenkin, suorita tapahtuma suoraan soittamalla sendfile new-wallet-query.boc asiakkaassa. Tämän jälkeen älä unohda päivittää lohkoketjun tilaa (last) ja tarkista, että lompakkomme saldo ja seqno ovat muuttuneet (getaccount <account_id>).
Siinä kaikki, nyt voimme luoda älykkäitä sopimuksia TONissa ja lähettää heille pyyntöjä. Kuten näette, nykyinen toiminnallisuus riittää jo esimerkiksi ystävällisemmän lompakon tekemiseen graafisella käyttöliittymällä (oletetaan kuitenkin, että se tulee saataville jo osana messengeriä).
Vain rekisteröityneet käyttäjät voivat osallistua kyselyyn. Kirjaudu sisään, ole kiltti.
Oletko kiinnostunut jatkamaan artikkeleita TONin, TVM:n, Fiftin analyysillä?
Kyllä, odotan TONin yleiskatsauksen sisältävän artikkelisarjan valmistumista
Kyllä, on mielenkiintoista lukea lisää Fift-kielestä
Kyllä, haluan oppia lisää TON Virtual Machinesta ja sen kokoonpanosta