హాస్కెల్‌తో ఫన్‌సిని ఫంక్షనల్‌గా మార్చడం: సెరోకెల్ టెలిగ్రామ్ బ్లాక్‌చెయిన్ పోటీని ఎలా గెలుచుకుంది

మీరు బహుశా టెలిగ్రామ్ అని విన్నారు టన్ బ్లాక్‌చెయిన్ ప్లాట్‌ఫారమ్‌ను ప్రారంభించబోతోంది. కానీ మీరు చాలా కాలం క్రితం టెలిగ్రామ్ వార్తలను కోల్పోయి ఉండవచ్చు పోటీని ప్రకటించింది ఈ ప్లాట్‌ఫారమ్ కోసం ఒకటి లేదా అంతకంటే ఎక్కువ స్మార్ట్ ఒప్పందాల అమలు కోసం.

పెద్ద బ్లాక్‌చెయిన్ ప్రాజెక్ట్‌లను అభివృద్ధి చేయడంలో విస్తృతమైన అనుభవం ఉన్న సెరోకెల్ బృందం పక్కన నిలబడలేకపోయింది. మేము పోటీకి ఐదుగురు ఉద్యోగులను నియమించాము మరియు రెండు వారాల తర్వాత వారు (ఇన్) నిరాడంబరమైన యాదృచ్ఛిక మారుపేరు సెక్సీ ఊసరవెల్లి కింద మొదటి స్థానంలో నిలిచారు. ఈ వ్యాసంలో నేను వారు ఎలా చేశారనే దాని గురించి మాట్లాడుతాను. రాబోయే పది నిమిషాల్లో మీరు కనీసం ఒక ఆసక్తికరమైన కథనమైనా చదవగలరని మేము ఆశిస్తున్నాము మరియు మీ పనిలో మీరు దరఖాస్తు చేసుకోగల ఉపయోగకరమైనది ఏదైనా కనుగొంటారు.

అయితే ఒక చిన్న సందర్భంతో ప్రారంభిద్దాం.

పోటీ మరియు దాని పరిస్థితులు

కాబట్టి, పాల్గొనేవారి ప్రధాన పనులు ప్రతిపాదిత స్మార్ట్ ఒప్పందాలలో ఒకటి లేదా అంతకంటే ఎక్కువ అమలు చేయడం, అలాగే TON పర్యావరణ వ్యవస్థను మెరుగుపరచడానికి ప్రతిపాదనలు చేయడం. పోటీ సెప్టెంబర్ 24 నుండి అక్టోబర్ 15 వరకు కొనసాగింది మరియు ఫలితాలు నవంబర్ 15 న మాత్రమే ప్రకటించబడ్డాయి. చాలా కాలంగా, టెలిగ్రామ్‌లో VoIP కాల్‌ల నాణ్యతను పరీక్షించడం మరియు అంచనా వేయడం కోసం C++లో అప్లికేషన్‌ల రూపకల్పన మరియు అభివృద్ధిపై పోటీల ఫలితాలను టెలిగ్రామ్ నిర్వహించగలిగింది మరియు ప్రకటించింది.

నిర్వాహకులు ప్రతిపాదించిన జాబితా నుండి మేము రెండు స్మార్ట్ ఒప్పందాలను ఎంచుకున్నాము. వాటిలో ఒకదాని కోసం, మేము TONతో పంపిణీ చేయబడిన సాధనాలను ఉపయోగించాము మరియు రెండవది TON కోసం ప్రత్యేకంగా మా ఇంజనీర్లు అభివృద్ధి చేసిన కొత్త భాషలో అమలు చేయబడింది మరియు హాస్కెల్‌లో నిర్మించబడింది.

ఫంక్షనల్ ప్రోగ్రామింగ్ లాంగ్వేజ్ ఎంపిక ప్రమాదవశాత్తు కాదు. మా లో కార్పొరేట్ బ్లాగ్ ఫంక్షనల్ లాంగ్వేజ్‌ల సంక్లిష్టత చాలా అతిశయోక్తి అని మనం ఎందుకు భావిస్తున్నామో మరియు సాధారణంగా వాటిని ఆబ్జెక్ట్-ఓరియెంటెడ్ వాటి కంటే ఎందుకు ఇష్టపడతామో మనం తరచుగా మాట్లాడుతాము. మార్గం ద్వారా, ఇది కూడా కలిగి ఉంటుంది ఈ వ్యాసం యొక్క అసలు.

మేము కూడా ఎందుకు పాల్గొనాలని నిర్ణయించుకున్నాము?

సంక్షిప్తంగా, మా స్పెషలైజేషన్ అనేది ప్రామాణికం కాని మరియు సంక్లిష్టమైన ప్రాజెక్ట్‌లు, ప్రత్యేక నైపుణ్యాలు అవసరం మరియు IT కమ్యూనిటీకి తరచుగా శాస్త్రీయ విలువను కలిగి ఉంటాయి. మేము ఓపెన్ సోర్స్ డెవలప్‌మెంట్‌కు గట్టిగా మద్దతిస్తాము మరియు దాని జనాదరణలో నిమగ్నమై ఉన్నాము మరియు కంప్యూటర్ సైన్స్ మరియు మ్యాథమెటిక్స్ రంగంలో ప్రముఖ రష్యన్ విశ్వవిద్యాలయాలతో కూడా సహకరిస్తాము.

మా ప్రియమైన టెలిగ్రామ్ ప్రాజెక్ట్‌లో పోటీ మరియు ప్రమేయం యొక్క ఆసక్తికరమైన పనులు తమలో తాము అద్భుతమైన ప్రేరణగా ఉన్నాయి, అయితే బహుమతి నిధి అదనపు ప్రోత్సాహకంగా మారింది. 🙂

TON బ్లాక్‌చెయిన్ పరిశోధన

మేము బ్లాక్‌చెయిన్, ఆర్టిఫిషియల్ ఇంటెలిజెన్స్ మరియు మెషిన్ లెర్నింగ్‌లో కొత్త పరిణామాలను నిశితంగా పరిశీలిస్తాము మరియు మేము పని చేసే ప్రతి ఏరియాలో ఒక్క ముఖ్యమైన విడుదలను కోల్పోకుండా ప్రయత్నిస్తాము. అందువల్ల, పోటీ ప్రారంభమయ్యే సమయానికి, మా బృందం ఆలోచనలతో ఇప్పటికే సుపరిచితం టన్ను తెల్ల కాగితం. అయినప్పటికీ, TONతో పనిని ప్రారంభించడానికి ముందు, మేము ప్లాట్‌ఫారమ్ యొక్క సాంకేతిక డాక్యుమెంటేషన్ మరియు వాస్తవ సోర్స్ కోడ్‌ను విశ్లేషించలేదు, కాబట్టి మొదటి దశ చాలా స్పష్టంగా ఉంది - అధికారిక డాక్యుమెంటేషన్ యొక్క సమగ్ర అధ్యయనం వెబ్సైట్ మరియు లో ప్రాజెక్ట్ రిపోజిటరీలు.

పోటీ ప్రారంభమయ్యే సమయానికి, కోడ్ ఇప్పటికే ప్రచురించబడింది, కాబట్టి సమయాన్ని ఆదా చేయడానికి, మేము వ్రాసిన గైడ్ లేదా సారాంశం కోసం చూడాలని నిర్ణయించుకున్నాము. వినియోగదారులు. దురదృష్టవశాత్తూ, ఇది ఎటువంటి ఫలితాలను ఇవ్వలేదు - ఉబుంటులో ప్లాట్‌ఫారమ్‌ను అసెంబ్లింగ్ చేయడానికి సూచనలతో పాటు, మాకు ఇతర పదార్థాలు ఏవీ కనుగొనబడలేదు.

డాక్యుమెంటేషన్ బాగా పరిశోధించబడింది, కానీ కొన్ని ప్రాంతాల్లో చదవడం కష్టం. చాలా తరచుగా మేము కొన్ని పాయింట్లకు తిరిగి రావాలి మరియు నైరూప్య ఆలోచనల యొక్క ఉన్నత-స్థాయి వివరణల నుండి తక్కువ-స్థాయి అమలు వివరాలకు మారాలి.

స్పెసిఫికేషన్‌లో అమలుకు సంబంధించిన వివరణాత్మక వర్ణన లేకుండా ఉంటే అది సులభంగా ఉంటుంది. వర్చువల్ మెషీన్ దాని స్టాక్‌ను ఎలా సూచిస్తుందనే దాని గురించి సమాచారం డెవలపర్‌లకు సహాయం చేయడం కంటే TON ప్లాట్‌ఫారమ్ కోసం స్మార్ట్ కాంట్రాక్టులను రూపొందించడం దృష్టి మరల్చే అవకాశం ఉంది.

నిక్స్: ప్రాజెక్ట్ను కలిసి ఉంచడం

సెరోకెల్‌లో మేము పెద్ద అభిమానులం నిక్స్. మేము వారితో మా ప్రాజెక్ట్‌లను సేకరించి వాటిని ఉపయోగించి వాటిని అమలు చేస్తాము NixOps, మరియు మా సర్వర్‌లన్నింటిలో ఇన్‌స్టాల్ చేయబడింది నిక్సోస్. దీనికి ధన్యవాదాలు, మా బిల్డ్‌లన్నీ పునరుత్పత్తి చేయబడతాయి మరియు Nixని ఇన్‌స్టాల్ చేయగల ఏదైనా ఆపరేటింగ్ సిస్టమ్‌లో పని చేస్తాయి.

కాబట్టి మేము సృష్టించడం ప్రారంభించాము TON అసెంబ్లీ కోసం వ్యక్తీకరణతో నిక్స్ అతివ్యాప్తి. దాని సహాయంతో, TON కంపైల్ చేయడం సాధ్యమైనంత సులభం:

$ cd ~/.config/nixpkgs/overlays && git clone https://github.com/serokell/ton.nix
$ cd /path/to/ton/repo && nix-shell
[nix-shell]$ cmakeConfigurePhase && make

మీరు ఎలాంటి డిపెండెన్సీలను ఇన్‌స్టాల్ చేయనవసరం లేదని గమనించండి. మీరు NixOS, Ubuntu లేదా macOSని ఉపయోగిస్తున్నా, Nix మీ కోసం అద్భుతంగా ప్రతిదీ చేస్తుంది.

TON కోసం ప్రోగ్రామింగ్

TON నెట్‌వర్క్‌లోని స్మార్ట్ కాంట్రాక్ట్ కోడ్ TON వర్చువల్ మెషీన్ (TVM)పై నడుస్తుంది. TVM ఇతర వర్చువల్ మెషీన్ల కంటే చాలా క్లిష్టంగా ఉంటుంది మరియు చాలా ఆసక్తికరమైన కార్యాచరణను కలిగి ఉంది, ఉదాహరణకు, ఇది పని చేయగలదు కొనసాగింపులు и డేటాకు లింక్‌లు.

అంతేకాకుండా, TON నుండి వచ్చిన అబ్బాయిలు మూడు కొత్త ప్రోగ్రామింగ్ భాషలను సృష్టించారు:

ఐదు పోలి ఉండే యూనివర్సల్ స్టాక్ ప్రోగ్రామింగ్ లాంగ్వేజ్ ముందుకు. అతని సూపర్ ఎబిలిటీ TVMతో ఇంటరాక్ట్ అయ్యే సామర్ధ్యం.

ఫన్‌సి వంటి స్మార్ట్ కాంట్రాక్ట్ ప్రోగ్రామింగ్ లాంగ్వేజ్ C మరియు మరొక భాషలోకి సంకలనం చేయబడింది - ఫిఫ్ట్ అసెంబ్లర్.

ఐదవ అసెంబ్లర్ — TVM కోసం బైనరీ ఎక్జిక్యూటబుల్ కోడ్‌ను రూపొందించడానికి ఐదవ లైబ్రరీ. ఐదవ అసెంబ్లర్‌కు కంపైలర్ లేదు. ఈ ఎంబెడెడ్ డొమైన్ స్పెసిఫిక్ లాంగ్వేజ్ (eDSL).

మా పోటీ పని చేస్తుంది

చివరగా, మా ప్రయత్నాల ఫలితాలను చూడడానికి ఇది సమయం.

అసమకాలిక చెల్లింపు ఛానెల్

చెల్లింపు ఛానెల్ అనేది బ్లాక్‌చెయిన్ వెలుపల చెల్లింపులను పంపడానికి ఇద్దరు వినియోగదారులను అనుమతించే స్మార్ట్ ఒప్పందం. ఫలితంగా, మీరు డబ్బును మాత్రమే కాకుండా (కమీషన్ లేదు), కానీ సమయాన్ని కూడా ఆదా చేస్తారు (తదుపరి బ్లాక్ ప్రాసెస్ చేయడానికి మీరు వేచి ఉండవలసిన అవసరం లేదు). చెల్లింపులు కావలసినంత చిన్నవిగా మరియు అవసరమైనంత తరచుగా ఉండవచ్చు. ఈ సందర్భంలో, పార్టీలు ఒకరినొకరు విశ్వసించాల్సిన అవసరం లేదు, ఎందుకంటే తుది పరిష్కారం యొక్క సరసత స్మార్ట్ ఒప్పందం ద్వారా హామీ ఇవ్వబడుతుంది.

మేము సమస్యకు చాలా సులభమైన పరిష్కారాన్ని కనుగొన్నాము. రెండు పార్టీలు సంతకం చేసిన సందేశాలను మార్పిడి చేసుకోవచ్చు, ప్రతి ఒక్కటి రెండు సంఖ్యలను కలిగి ఉంటుంది-ప్రతి పక్షం చెల్లించిన పూర్తి మొత్తం. ఈ రెండు సంఖ్యలు ఇలా పనిచేస్తాయి వెక్టర్ గడియారం సాంప్రదాయ పంపిణీ వ్యవస్థలలో మరియు లావాదేవీలపై "ముందు జరిగింది" క్రమాన్ని సెట్ చేయండి. ఈ డేటాను ఉపయోగించి, ఒప్పందం ఏదైనా సాధ్యమైన వైరుధ్యాన్ని పరిష్కరించగలదు.

వాస్తవానికి, ఈ ఆలోచనను అమలు చేయడానికి ఒక సంఖ్య సరిపోతుంది, కానీ మేము రెండింటినీ వదిలివేసాము ఎందుకంటే ఈ విధంగా మేము మరింత అనుకూలమైన వినియోగదారు ఇంటర్‌ఫేస్‌ను తయారు చేయగలము. అదనంగా, మేము ప్రతి సందేశంలో చెల్లింపు మొత్తాన్ని చేర్చాలని నిర్ణయించుకున్నాము. అది లేకుండా, కొన్ని కారణాల వల్ల సందేశం పోయినట్లయితే, అన్ని మొత్తాలు మరియు తుది గణన సరైనదే అయినప్పటికీ, వినియోగదారు నష్టాన్ని గమనించకపోవచ్చు.

మా ఆలోచనను పరీక్షించడానికి, మేము అటువంటి సరళమైన మరియు సంక్షిప్త చెల్లింపు ఛానెల్ ప్రోటోకాల్‌ను ఉపయోగించే ఉదాహరణల కోసం వెతికాము. ఆశ్చర్యకరంగా, మేము రెండు మాత్రమే కనుగొన్నాము:

  1. వివరణ ఒకే విధమైన విధానం, ఏకదిశాత్మక ఛానెల్ విషయంలో మాత్రమే.
  2. ట్యుటోరియల్, ఇది మాది అదే ఆలోచనను వివరిస్తుంది, కానీ సాధారణ ఖచ్చితత్వం మరియు సంఘర్షణ పరిష్కార విధానాలు వంటి అనేక ముఖ్యమైన వివరాలను వివరించకుండా.

మా ప్రోటోకాల్‌ను వివరంగా వివరించడం అర్ధమేనని స్పష్టమైంది, దాని ఖచ్చితత్వంపై ప్రత్యేక శ్రద్ధ చూపుతుంది. అనేక పునరావృతాల తర్వాత, స్పెసిఫికేషన్ సిద్ధంగా ఉంది మరియు ఇప్పుడు మీరు కూడా చేయవచ్చు. ఆమెని చూడు.

మేము FunCలో ఒప్పందాన్ని అమలు చేసాము మరియు నిర్వాహకులు సిఫార్సు చేసిన విధంగా మా కాంట్రాక్ట్‌తో పూర్తిగా ఫిఫ్ట్‌లో పరస్పర చర్య చేయడానికి మేము కమాండ్ లైన్ యుటిలిటీని వ్రాసాము. మేము మా CLI కోసం ఏదైనా ఇతర భాషను ఎంచుకోవచ్చు, కానీ అది ఆచరణలో ఎలా పని చేస్తుందో చూడటానికి ఫిట్‌ని ప్రయత్నించడానికి మేము ఆసక్తిని కలిగి ఉన్నాము.

నిజం చెప్పాలంటే, ఫిఫ్ట్‌తో కలిసి పనిచేసిన తర్వాత, అభివృద్ధి చెందిన సాధనాలు మరియు లైబ్రరీలతో జనాదరణ పొందిన మరియు చురుకుగా ఉపయోగించే భాషల కంటే ఈ భాషను ఇష్టపడటానికి మాకు బలమైన కారణాలేవీ కనిపించలేదు. స్టాక్-ఆధారిత భాషలో ప్రోగ్రామింగ్ చేయడం చాలా అసహ్యకరమైనది, ఎందుకంటే మీరు స్టాక్‌లో ఉన్నదాన్ని నిరంతరం మీ తలలో ఉంచుకోవాలి మరియు కంపైలర్ దీనికి సహాయం చేయదు.

అందువల్ల, మా అభిప్రాయం ప్రకారం, ఫిఫ్ట్ యొక్క ఉనికికి ఉన్న ఏకైక సమర్థన ఫిఫ్ట్ అసెంబ్లర్‌కు హోస్ట్ భాషగా దాని పాత్ర. కానీ TVM అసెంబ్లర్‌ను ఈ ఏకైక ప్రయోజనం కోసం కొత్తదాన్ని కనిపెట్టడం కంటే, ఇప్పటికే ఉన్న ఏదైనా భాషలో పొందుపరచడం మంచిది కాదా?

TVM హాస్కెల్ eDSL

ఇప్పుడు మా రెండవ స్మార్ట్ ఒప్పందం గురించి మాట్లాడే సమయం వచ్చింది. మేము మల్టీ-సిగ్నేచర్ వాలెట్‌ని అభివృద్ధి చేయాలని నిర్ణయించుకున్నాము, కానీ FunCలో మరొక స్మార్ట్ కాంట్రాక్ట్ రాయడం చాలా బోరింగ్‌గా ఉంటుంది. మేము కొంత రుచిని జోడించాలనుకుంటున్నాము మరియు TVM కోసం అది మా స్వంత అసెంబ్లీ భాష.

ఫిఫ్ట్ అసెంబ్లర్ లాగా, మా కొత్త భాష పొందుపరచబడింది, అయితే మేము ఫిఫ్ట్‌కు బదులుగా హాస్కెల్‌ను హోస్ట్‌గా ఎంచుకున్నాము, దీని వలన దాని అధునాతన రకం సిస్టమ్‌ని పూర్తిగా ఉపయోగించుకోవడానికి మాకు వీలు కల్పిస్తుంది. స్మార్ట్ కాంట్రాక్టులతో పని చేస్తున్నప్పుడు, చిన్న లోపం యొక్క ధర కూడా చాలా ఎక్కువగా ఉంటుంది, మా అభిప్రాయం ప్రకారం, స్టాటిక్ టైపింగ్ పెద్ద ప్రయోజనం.

హాస్కెల్‌లో పొందుపరిచిన TVM అసెంబ్లర్ ఎలా ఉంటుందో ప్రదర్శించడానికి, మేము దానిపై ప్రామాణిక వాలెట్‌ని అమలు చేసాము. ఇక్కడ శ్రద్ధ వహించాల్సిన కొన్ని విషయాలు ఉన్నాయి:

  • ఈ ఒప్పందం ఒక ఫంక్షన్‌ను కలిగి ఉంటుంది, కానీ మీకు నచ్చినన్ని ఉపయోగించవచ్చు. మీరు హోస్ట్ లాంగ్వేజ్‌లో (అంటే హాస్కెల్) కొత్త ఫంక్షన్‌ను నిర్వచించినప్పుడు, మీరు TVMలో ప్రత్యేక రొటీన్‌గా మారాలనుకుంటున్నారా లేదా కాల్ సమయంలో ఇన్‌లైన్ చేయాలనుకుంటున్నారా అని ఎంచుకోవడానికి మా eDSL మిమ్మల్ని అనుమతిస్తుంది.
  • హాస్కెల్ వలె, విధులు కంపైల్ సమయంలో తనిఖీ చేయబడిన రకాలను కలిగి ఉంటాయి. మా eDSLలో, ఫంక్షన్ యొక్క ఇన్‌పుట్ రకం అనేది ఫంక్షన్ ఆశించే స్టాక్ రకం, మరియు ఫలిత రకం అనేది కాల్ తర్వాత ఉత్పత్తి చేయబడే స్టాక్ రకం.
  • కోడ్ ఉల్లేఖనాలను కలిగి ఉంది stacktype, కాల్ పాయింట్ వద్ద ఊహించిన స్టాక్ రకాన్ని వివరిస్తుంది. అసలు వాలెట్ ఒప్పందంలో ఇవి కేవలం వ్యాఖ్యలు మాత్రమే, కానీ మా eDSLలో అవి వాస్తవానికి కోడ్‌లో భాగం మరియు కంపైల్ సమయంలో తనిఖీ చేయబడతాయి. కోడ్ మారితే మరియు స్టాక్ రకం మారితే సమస్యను కనుగొనడంలో డెవలపర్‌కు సహాయపడే డాక్యుమెంటేషన్ లేదా స్టేట్‌మెంట్‌లుగా అవి ఉపయోగపడతాయి. వాస్తవానికి, అటువంటి ఉల్లేఖనాలు రన్‌టైమ్ పనితీరును ప్రభావితం చేయవు, ఎందుకంటే వాటి కోసం TVM కోడ్ రూపొందించబడదు.
  • ఇది ఇప్పటికీ రెండు వారాల్లో వ్రాసిన నమూనా, కాబట్టి ప్రాజెక్ట్‌లో ఇంకా చాలా పని చేయాల్సి ఉంది. ఉదాహరణకు, దిగువ కోడ్‌లో మీరు చూసే తరగతులకు సంబంధించిన అన్ని సందర్భాలు స్వయంచాలకంగా రూపొందించబడాలి.

మల్టీసిగ్ వాలెట్ అమలు మా eDSLలో ఇలా ఉంటుంది:

main :: IO ()
main = putText $ pretty $ declProgram procedures methods
  where
    procedures =
      [ ("recv_external", decl recvExternal)
      , ("recv_internal", decl recvInternal)
      ]
    methods =
      [ ("seqno", declMethod getSeqno)
      ]

data Storage = Storage
  { sCnt :: Word32
  , sPubKey :: PublicKey
  }

instance DecodeSlice Storage where
  type DecodeSliceFields Storage = [PublicKey, Word32]
  decodeFromSliceImpl = do
    decodeFromSliceImpl @Word32
    decodeFromSliceImpl @PublicKey

instance EncodeBuilder Storage where
  encodeToBuilder = do
    encodeToBuilder @Word32
    encodeToBuilder @PublicKey

data WalletError
  = SeqNoMismatch
  | SignatureMismatch
  deriving (Eq, Ord, Show, Generic)

instance Exception WalletError

instance Enum WalletError where
  toEnum 33 = SeqNoMismatch
  toEnum 34 = SignatureMismatch
  toEnum _ = error "Uknown MultiSigError id"

  fromEnum SeqNoMismatch = 33
  fromEnum SignatureMismatch = 34

recvInternal :: '[Slice] :-> '[]
recvInternal = drop

recvExternal :: '[Slice] :-> '[]
recvExternal = do
  decodeFromSlice @Signature
  dup
  preloadFromSlice @Word32
  stacktype @[Word32, Slice, Signature]
  -- cnt cs sign

  pushRoot
  decodeFromCell @Storage
  stacktype @[PublicKey, Word32, Word32, Slice, Signature]
  -- pk cnt' cnt cs sign

  xcpu @1 @2
  stacktype @[Word32, Word32, PublicKey, Word32, Slice, Signature]
  -- cnt cnt' pk cnt cs sign

  equalInt >> throwIfNot SeqNoMismatch

  push @2
  sliceHash
  stacktype @[Hash Slice, PublicKey, Word32, Slice, Signature]
  -- hash pk cnt cs sign

  xc2pu @0 @4 @4
  stacktype @[PublicKey, Signature, Hash Slice, Word32, Slice, PublicKey]
  -- pubk sign hash cnt cs pubk

  chkSignU
  stacktype @[Bool, Word32, Slice, PublicKey]
  -- ? cnt cs pubk

  throwIfNot SignatureMismatch
  accept

  swap
  decodeFromSlice @Word32
  nip

  dup
  srefs @Word8

  pushInt 0
  if IsEq
  then ignore
  else do
    decodeFromSlice @Word8
    decodeFromSlice @(Cell MessageObject)
    stacktype @[Slice, Cell MessageObject, Word8, Word32, PublicKey]
    xchg @2
    sendRawMsg
    stacktype @[Slice, Word32, PublicKey]

  endS
  inc

  encodeToCell @Storage
  popRoot

getSeqno :: '[] :-> '[Word32]
getSeqno = do
  pushRoot
  cToS
  preloadFromSlice @Word32

మా eDSL మరియు బహుళ సంతకం వాలెట్ ఒప్పందం యొక్క పూర్తి సోర్స్ కోడ్‌ను ఇక్కడ కనుగొనవచ్చు ఈ రిపోజిటరీ. ఇంకా చాలా వివరంగా చెప్పారు అంతర్నిర్మిత భాషల గురించి, మా సహోద్యోగి జార్జి అగాపోవ్.

పోటీ మరియు TON గురించి ముగింపులు

మొత్తంగా, మా పని 380 గంటలు పట్టింది (డాక్యుమెంటేషన్, సమావేశాలు మరియు వాస్తవ అభివృద్ధితో సహా). పోటీ ప్రాజెక్ట్‌లో ఐదుగురు డెవలపర్‌లు పాల్గొన్నారు: CTO, టీమ్ లీడ్, బ్లాక్‌చెయిన్ ప్లాట్‌ఫారమ్ నిపుణులు మరియు హాస్కెల్ సాఫ్ట్‌వేర్ డెవలపర్లు.

హ్యాకథాన్ స్ఫూర్తి, సన్నిహిత టీమ్‌వర్క్ మరియు కొత్త సాంకేతికతలకు సంబంధించిన అంశాల్లో త్వరగా లీనమవ్వడం ఎల్లప్పుడూ ఉత్తేజకరమైనది కాబట్టి, పోటీలో ఇబ్బంది లేకుండా పాల్గొనడానికి మేము వనరులను కనుగొన్నాము. పరిమిత వనరుల పరిస్థితులలో గరిష్ట ఫలితాలను సాధించడానికి అనేక నిద్రలేని రాత్రులు అమూల్యమైన అనుభవం మరియు అద్భుతమైన జ్ఞాపకాల ద్వారా భర్తీ చేయబడతాయి. అదనంగా, అటువంటి పనులపై పని చేయడం ఎల్లప్పుడూ సంస్థ యొక్క ప్రక్రియలకు మంచి పరీక్ష, ఎందుకంటే అంతర్గత పరస్పర చర్య బాగా పని చేయకుండా నిజంగా మంచి ఫలితాలను సాధించడం చాలా కష్టం.

సాహిత్యం పక్కన పెడితే: TON బృందం చేసిన పనికి మేము ఆకట్టుకున్నాము. వారు సంక్లిష్టమైన, అందమైన మరియు ముఖ్యంగా పని వ్యవస్థను నిర్మించగలిగారు. TON గొప్ప సంభావ్యత కలిగిన వేదికగా నిరూపించబడింది. అయితే, ఈ పర్యావరణ వ్యవస్థ అభివృద్ధి చెందాలంటే, బ్లాక్‌చెయిన్ ప్రాజెక్ట్‌లలో దాని ఉపయోగం మరియు అభివృద్ధి సాధనాలను మెరుగుపరచడం పరంగా చాలా ఎక్కువ చేయాల్సి ఉంటుంది. మేము ఇప్పుడు ఈ ప్రక్రియలో భాగమైనందుకు గర్విస్తున్నాము.

ఈ కథనాన్ని చదివిన తర్వాత మీకు ఇంకా ఏవైనా ప్రశ్నలు ఉంటే లేదా మీ సమస్యలను పరిష్కరించడానికి TONని ఎలా ఉపయోగించాలనే దానిపై ఆలోచనలు ఉంటే, напишите nam - మా అనుభవాన్ని పంచుకోవడానికి మేము సంతోషిస్తాము.

మూలం: www.habr.com

ఒక వ్యాఖ్యను జోడించండి