د هاسکل سره FunC ته فنکشنل ته اړول: څنګه سیروکیل د ټیلیګرام بلاکچین سیالي وګټله

تاسو شاید دا ټیلیګرام اوریدلی وي د ټن بلاکچین پلیټ فارم په لاره اچولو په اړه دی. مګر تاسو شاید هغه خبرونه له لاسه ورکړی وي چې ډیر وخت دمخه ټیلیګرام نه و سیالۍ اعلان کړه د دې پلیټ فارم لپاره د یو یا ډیرو سمارټ قراردادونو پلي کولو لپاره.

د سیروکیل ټیم، د لوی بلاکچین پروژو په پراختیا کې د پراخې تجربې سره، نشي کولی یو طرف ودریږي. موږ پنځه کارمندان سیالۍ ته واستول، او دوه اونۍ وروسته دوی په (ان) کې د سیکسی چمیلیون په نوم (ان) کې لومړی ځای خپل کړ. پدې مقاله کې به زه د دې په اړه وغږیږم چې دوی دا څنګه کړي. موږ امید لرو چې په راتلونکو لسو دقیقو کې به تاسو لږترلږه یوه په زړه پورې کیسه ولولئ، او لږترلږه به تاسو په دې کې یو څه ګټور ومومئ چې تاسو یې په خپل کار کې پلي کولی شئ.

مګر راځئ چې د یو کوچني شرایطو سره پیل وکړو.

سیالي او شرایط

نو، د ګډونوالو اصلي دندې د یو یا ډیرو وړاندیز شوي سمارټ قراردادونو پلي کول، او همدارنګه د TON ایکوسیستم ښه کولو لپاره وړاندیزونه کول وو. سیالۍ د سپټمبر له 24 څخه د اکتوبر تر 15 پورې دوام درلود او پایلې یوازې د نومبر په 15 اعلان شوې. د اوږدې مودې په پام کې نیولو سره، د دې وخت په جریان کې ټیلیګرام په ټیلیګرام کې د VoIP تلیفونونو کیفیت ازموینې او ارزونې لپاره په C++ کې د غوښتنلیکونو ډیزاین او پراختیا په اړه د سیالیو پایلې ساتلي او اعلانوي.

موږ د تنظیم کونکو لخوا وړاندیز شوي لیست څخه دوه سمارټ قراردادونه غوره کړل. د دوی څخه د یوې لپاره، موږ د TON سره توزیع شوي وسیلې کارولې، او دویمه په یوه نوې ژبه کې پلي شوې چې زموږ د انجینرانو لخوا په ځانګړې توګه د TON لپاره جوړه شوې او په هاسکل کې جوړه شوې.

د فعال پروګرامینګ ژبې انتخاب ناڅاپي نه دی. زموږ په کارپوریټ بلاګ موږ ډیری وختونه د دې په اړه خبرې کوو چې ولې موږ فکر کوو چې د فعالو ژبو پیچلتیا خورا لوی مبالغه ده او ولې موږ عموما دوی د اعتراض پر بنسټ غوره کوو. په لاره کې، دا هم لري د دې مقالې اصلي.

ولې موږ حتی د ګډون پریکړه وکړه؟

په لنډه توګه، ځکه چې زموږ تخصص غیر معیاري او پیچلې پروژې دي چې ځانګړي مهارتونو ته اړتیا لري او ډیری وختونه د معلوماتي ټکنالوجۍ ټولنې لپاره ساینسي ارزښت لري. موږ د خلاصې سرچینې پراختیا په کلکه ملاتړ کوو او د هغې په مشهور کولو کې بوخت یو ، او همدارنګه د کمپیوټر ساینس او ​​​​ریاضي په برخه کې د روسیې له مخکښو پوهنتونونو سره همکاري کوو.

د سیالۍ په زړه پورې دندې او زموږ د محبوب ټیلیګرام پروژې کې ښکیلتیا پخپله یو ښه انګیزه وه، مګر د انعام فنډ یو اضافي هڅونې شو. 🙂

د TON بلاکچین څیړنه

موږ د بلاکچین ، مصنوعي استخباراتو او ماشین زده کړې کې نوي پرمختګونه له نږدې څارو او هڅه کوو چې په هره برخه کې چې موږ کار کوو یو واحد د پام وړ ریلیز له لاسه ورنکړو. له همدې امله، کله چې سیالي پیل شوه، زموږ ټیم لا دمخه له نظرونو سره آشنا و TON سپین کاغذ. په هرصورت، د TON سره د کار پیل کولو دمخه، موږ تخنیکي اسناد او د پلیټ فارم اصلي سرچینې کوډ تحلیل نه کړ، نو لومړی ګام خورا څرګند و - د رسمي اسنادو بشپړه مطالعه سایټ او په د پروژې ذخیره.

کله چې سیالي پیل شوه، کوډ لا دمخه خپور شوی و، نو د وخت خوندي کولو لپاره، موږ پریکړه وکړه چې یو لارښود یا لنډیز وګورو چې لخوا لیکل شوي. د کاروونکو لخوا. له بده مرغه، دې هیڅ نتیجه نده ورکړې - په اوبنټو کې د پلیټ فارم راټولولو لارښوونو سربیره، موږ نور مواد ونه موندل.

اسناد پخپله ښه څیړل شوي، مګر په ځینو برخو کې لوستل ستونزمن وو. ډیری وختونه موږ باید ځینې ټکو ته بیرته راستانه شو او د خلاصې نظریاتو د لوړې کچې توضیحاتو څخه د ټیټ کچې پلي کولو توضیحاتو ته واړوو.

دا به اسانه وي که چیرې توضیحات په بشپړ ډول د پلي کولو تفصیلي توضیحات شامل نه کړي. د دې په اړه معلومات چې څنګه یو مجازی ماشین د هغې سټیک نمایندګي کوي ډیر احتمال لري د پراختیا کونکو پام واړوي د TON پلیټ فارم لپاره سمارټ قراردادونه رامینځته کوي د دوی سره د مرستې په پرتله.

نکس: د پروژې سره یوځای کول

په سیروکیل کې موږ لوی مینه وال یو نیکس. موږ خپلې پروژې له هغې سره راټولوو او په کارولو سره یې ځای په ځای کوو NixOps، او زموږ په ټولو سرورونو کې نصب شوی Nix OS. د دې څخه مننه، زموږ ټول جوړونه د بیا تولید وړ دي او په هر عملیاتي سیسټم کار کوي چې Nix نصب کیدی شي.

نو موږ د جوړولو له لارې پیل کړ د TON مجلس لپاره د بیان سره Nix پوښښ. د دې په مرسته، د TON تالیف کول د امکان تر حده ساده دي:

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

په یاد ولرئ چې تاسو اړتیا نلرئ کوم انحصار نصب کړئ. Nix به په جادويي ډول ستاسو لپاره هرڅه وکړي، که تاسو NixOS، Ubuntu، یا macOS کاروئ.

د TON لپاره پروګرام کول

د TON شبکه کې د سمارټ قرارداد کوډ د TON مجازی ماشین (TVM) پرمخ ځي. TVM د ډیری نورو مجازی ماشینونو په پرتله خورا پیچلی دی، او خورا په زړه پورې فعالیت لري، د بیلګې په توګه، دا کولی شي کار وکړي. دوام и ډاټا ته لینکونه.

سربیره پردې ، د TON هلکانو درې نوې برنامې ژبې رامینځته کړې:

پنځم یو نړیوال سټیک پروګرامینګ ژبه ده چې ورته ورته ده فورمه. د هغه عالي وړتیا د TVM سره د متقابل عمل وړتیا ده.

FunC د سمارټ قرارداد پروګرام کولو ژبه ده چې ورته ورته ده C او په بله ژبه کې تالیف شوی - پنځم جمع کونکی.

پنځم جمع کوونکی - د TVM لپاره د بائنری اجرا وړ کوډ رامینځته کولو لپاره پنځم کتابتون. پنځم جمع کونکی کمپیلر نلري. دا سرایت شوی ډومین ځانګړی ژبه (eDSL).

زموږ سیالي کار کوي

په نهایت کې، دا وخت دی چې زموږ د هڅو پایلې وګورو.

د غیر متناسب تادیې چینل

د تادیې چینل یو سمارټ قرارداد دی چې دوه کاروونکو ته اجازه ورکوي چې د بلاکچین څخه بهر تادیات واستوي. د پایلې په توګه، تاسو نه یوازې پیسې خوندي کوئ (هیڅ کمیسیون شتون نلري)، بلکه وخت هم (تاسو اړتیا نلرئ د بل بلاک پروسس کولو ته انتظار وکړئ). تادیات ممکن د اړتیا په توګه کوچني وي او څومره چې اړتیا وي. په دې حالت کې، اړخونه باید په یو بل باور ونه کړي، ځکه چې د وروستي حل عادلانه د سمارټ قرارداد لخوا تضمین کیږي.

موږ د ستونزې لپاره خورا ساده حل وموند. دوه اړخونه کولی شي لاسلیک شوي پیغامونه تبادله کړي، هر یو دوه شمیرې لري - د هرې ډلې لخوا تادیه شوي بشپړ مقدار. دا دوه شمیرې داسې کار کوي ویکتور ساعت په دودیز ویشل شوي سیسټمونو کې او د راکړې ورکړې په اړه "مخکې پېښ شوي" ترتیب ترتیب کړئ. د دې معلوماتو په کارولو سره، قرارداد به د هرې ممکنه شخړې حل کولو توان ولري.

په حقیقت کې ، د دې نظر پلي کولو لپاره یو شمیر کافي دی ، مګر موږ دواړه پریښودل ځکه چې پدې توګه موږ کولی شو یو ډیر اسانه کارونکي انٹرفیس جوړ کړو. سربیره پردې ، موږ پریکړه وکړه چې په هر پیغام کې د تادیې مقدار شامل کړو. پرته له دې، که پیغام د کوم دلیل لپاره ورک شوی وي، نو که څه هم ټول مقدارونه او وروستی حساب به سم وي، کاروونکي ممکن د ضایع کیدو خبر ونکړي.

زموږ د نظر آزموینې لپاره، موږ د داسې ساده او جامع تادیې چینل پروتوکول کارولو مثالونو ته کتنه وکړه. په حیرانتیا سره، موږ یوازې دوه وموندل:

  1. شرح ورته چلند، یوازې د یو اړخیز چینل قضیې لپاره.
  2. ټیوټوریل، کوم چې زموږ په څیر ورته نظر بیانوي، مګر پرته له دې چې ډیری مهم توضیحات تشریح کړي، لکه د عمومي درستیت او د شخړو د حل کړنالرې.

دا څرګنده شوه چې دا معنی لري چې زموږ پروتوکول په تفصیل سره تشریح کړئ، د هغې سموالي ته ځانګړې پاملرنه وکړئ. د څو تکرارونو وروسته، توضیحات چمتو وو، او اوس تاسو هم کولی شئ. هغې ته وګوره.

موږ قرارداد په FunC کې پلي کړ، او موږ په بشپړ ډول په Fif کې زموږ د قرارداد سره د تعامل لپاره د کمانډ لاین افادیت لیکلی، لکه څنګه چې د تنظیم کونکو لخوا وړاندیز شوی. موږ کولی شو د خپل CLI لپاره کومه بله ژبه غوره کړې وای، مګر موږ د Fit هڅه کولو کې علاقه درلوده ترڅو وګورو چې دا په عمل کې څنګه ترسره کوي.

د ریښتیني کیدو لپاره ، د فیف سره کار کولو وروسته ، موږ د پرمختللي وسیلو او کتابتونونو سره مشهور او فعاله کارول شوي ژبو ته د دې ژبې غوره کولو لپاره کوم مجبور دلیل ونه لید. په سټیک میشته ژبه کې برنامه کول خورا ناخوښه دي ، ځکه چې تاسو باید په دوامداره توګه په خپل سر کې هغه څه وساتئ چې په سټیک کې دي ، او کمپیلر پدې کې مرسته نه کوي.

له همدې امله، زموږ په اند، د Fif د شتون لپاره یوازینی توجیه د Fifټ جمع کونکي لپاره د کوربه ژبې په توګه د هغې رول دی. مګر ایا دا به غوره نه وي چې د TVM راټولونکی په ځینې موجوده ژبې کې ځای په ځای کړئ ، د دې پرځای چې د دې واحد هدف لپاره نوی اختراع کړئ؟

TVM Haskell eDSL

اوس دا وخت دی چې زموږ د دوهم سمارټ قرارداد په اړه وغږیږو. موږ پریکړه وکړه چې څو لاسلیک شوي والټ رامینځته کړو ، مګر په FunC کې د بل سمارټ تړون لیکل به ډیر ستړي وي. موږ غوښتل یو څه خوند اضافه کړو، او دا د TVM لپاره زموږ د مجلس ژبه وه.

د فیفټ اسمبلر په څیر، زموږ نوې ژبه سرایت شوې، مګر موږ د فیف پر ځای هسکیل د کوربه په توګه غوره کړ، موږ ته اجازه راکوي چې د دې پرمختللي ډول سیسټم څخه بشپړه ګټه واخلو. کله چې د سمارټ قراردادونو سره کار کول، چیرې چې حتی د یوې کوچنۍ تېروتنې لګښت خورا لوړ کیدی شي، جامد ټایپ کول، زموږ په نظر، لویه ګټه ده.

د دې ښودلو لپاره چې د TVM جمع کونکی په هاسکل کې ځای پرځای شوي ښکاري ، موږ پدې کې یو معیاري والټ پلي کړ. دلته یو څو شیان دي چې باید ورته پام وکړئ:

  • دا قرارداد یو فعالیت لري، مګر تاسو کولی شئ څومره چې وغواړئ وکاروئ. کله چې تاسو په کوربه ژبه کې یو نوی فنکشن تعریف کړئ (لکه هاسکل)، زموږ eDSL تاسو ته اجازه درکوي چې دا غوره کړئ چې ایا تاسو غواړئ دا په TVM کې یو جلا معمول شي یا په ساده ډول د تلیفون په ځای کې.
  • د هاسکل په څیر، افعال ډولونه لري چې د تالیف په وخت کې چک شوي. زموږ په 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 کارولو څرنګوالي په اړه نظرونه لرئ ، موږ ته ولیکئ - موږ به خوښ یو چې خپلې تجربې شریکې کړو.

سرچینه: www.habr.com

Add a comment