تاسو شاید دا ټیلیګرام اوریدلی وي
د سیروکیل ټیم، د لوی بلاکچین پروژو په پراختیا کې د پراخې تجربې سره، نشي کولی یو طرف ودریږي. موږ پنځه کارمندان سیالۍ ته واستول، او دوه اونۍ وروسته دوی په (ان) کې د سیکسی چمیلیون په نوم (ان) کې لومړی ځای خپل کړ. پدې مقاله کې به زه د دې په اړه وغږیږم چې دوی دا څنګه کړي. موږ امید لرو چې په راتلونکو لسو دقیقو کې به تاسو لږترلږه یوه په زړه پورې کیسه ولولئ، او لږترلږه به تاسو په دې کې یو څه ګټور ومومئ چې تاسو یې په خپل کار کې پلي کولی شئ.
مګر راځئ چې د یو کوچني شرایطو سره پیل وکړو.
سیالي او شرایط
نو، د ګډونوالو اصلي دندې د یو یا ډیرو وړاندیز شوي سمارټ قراردادونو پلي کول، او همدارنګه د TON ایکوسیستم ښه کولو لپاره وړاندیزونه کول وو. سیالۍ د سپټمبر له 24 څخه د اکتوبر تر 15 پورې دوام درلود او پایلې یوازې د نومبر په 15 اعلان شوې. د اوږدې مودې په پام کې نیولو سره، د دې وخت په جریان کې ټیلیګرام په ټیلیګرام کې د VoIP تلیفونونو کیفیت ازموینې او ارزونې لپاره په C++ کې د غوښتنلیکونو ډیزاین او پراختیا په اړه د سیالیو پایلې ساتلي او اعلانوي.
موږ د تنظیم کونکو لخوا وړاندیز شوي لیست څخه دوه سمارټ قراردادونه غوره کړل. د دوی څخه د یوې لپاره، موږ د TON سره توزیع شوي وسیلې کارولې، او دویمه په یوه نوې ژبه کې پلي شوې چې زموږ د انجینرانو لخوا په ځانګړې توګه د TON لپاره جوړه شوې او په هاسکل کې جوړه شوې.
د فعال پروګرامینګ ژبې انتخاب ناڅاپي نه دی. زموږ په
ولې موږ حتی د ګډون پریکړه وکړه؟
په لنډه توګه، ځکه چې زموږ تخصص غیر معیاري او پیچلې پروژې دي چې ځانګړي مهارتونو ته اړتیا لري او ډیری وختونه د معلوماتي ټکنالوجۍ ټولنې لپاره ساینسي ارزښت لري. موږ د خلاصې سرچینې پراختیا په کلکه ملاتړ کوو او د هغې په مشهور کولو کې بوخت یو ، او همدارنګه د کمپیوټر ساینس او ریاضي په برخه کې د روسیې له مخکښو پوهنتونونو سره همکاري کوو.
د سیالۍ په زړه پورې دندې او زموږ د محبوب ټیلیګرام پروژې کې ښکیلتیا پخپله یو ښه انګیزه وه، مګر د انعام فنډ یو اضافي هڅونې شو. 🙂
د 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
په یاد ولرئ چې تاسو اړتیا نلرئ کوم انحصار نصب کړئ. Nix به په جادويي ډول ستاسو لپاره هرڅه وکړي، که تاسو NixOS، Ubuntu، یا macOS کاروئ.
د TON لپاره پروګرام کول
د TON شبکه کې د سمارټ قرارداد کوډ د TON مجازی ماشین (TVM) پرمخ ځي. TVM د ډیری نورو مجازی ماشینونو په پرتله خورا پیچلی دی، او خورا په زړه پورې فعالیت لري، د بیلګې په توګه، دا کولی شي کار وکړي. دوام и ډاټا ته لینکونه.
سربیره پردې ، د TON هلکانو درې نوې برنامې ژبې رامینځته کړې:
پنځم یو نړیوال سټیک پروګرامینګ ژبه ده چې ورته ورته ده
FunC د سمارټ قرارداد پروګرام کولو ژبه ده چې ورته ورته ده
پنځم جمع کوونکی - د TVM لپاره د بائنری اجرا وړ کوډ رامینځته کولو لپاره پنځم کتابتون. پنځم جمع کونکی کمپیلر نلري. دا
زموږ سیالي کار کوي
په نهایت کې، دا وخت دی چې زموږ د هڅو پایلې وګورو.
د غیر متناسب تادیې چینل
د تادیې چینل یو سمارټ قرارداد دی چې دوه کاروونکو ته اجازه ورکوي چې د بلاکچین څخه بهر تادیات واستوي. د پایلې په توګه، تاسو نه یوازې پیسې خوندي کوئ (هیڅ کمیسیون شتون نلري)، بلکه وخت هم (تاسو اړتیا نلرئ د بل بلاک پروسس کولو ته انتظار وکړئ). تادیات ممکن د اړتیا په توګه کوچني وي او څومره چې اړتیا وي. په دې حالت کې، اړخونه باید په یو بل باور ونه کړي، ځکه چې د وروستي حل عادلانه د سمارټ قرارداد لخوا تضمین کیږي.
موږ د ستونزې لپاره خورا ساده حل وموند. دوه اړخونه کولی شي لاسلیک شوي پیغامونه تبادله کړي، هر یو دوه شمیرې لري - د هرې ډلې لخوا تادیه شوي بشپړ مقدار. دا دوه شمیرې داسې کار کوي
په حقیقت کې ، د دې نظر پلي کولو لپاره یو شمیر کافي دی ، مګر موږ دواړه پریښودل ځکه چې پدې توګه موږ کولی شو یو ډیر اسانه کارونکي انٹرفیس جوړ کړو. سربیره پردې ، موږ پریکړه وکړه چې په هر پیغام کې د تادیې مقدار شامل کړو. پرته له دې، که پیغام د کوم دلیل لپاره ورک شوی وي، نو که څه هم ټول مقدارونه او وروستی حساب به سم وي، کاروونکي ممکن د ضایع کیدو خبر ونکړي.
زموږ د نظر آزموینې لپاره، موږ د داسې ساده او جامع تادیې چینل پروتوکول کارولو مثالونو ته کتنه وکړه. په حیرانتیا سره، موږ یوازې دوه وموندل:
شرح ورته چلند، یوازې د یو اړخیز چینل قضیې لپاره.ټیوټوریل ، کوم چې زموږ په څیر ورته نظر بیانوي، مګر پرته له دې چې ډیری مهم توضیحات تشریح کړي، لکه د عمومي درستیت او د شخړو د حل کړنالرې.
دا څرګنده شوه چې دا معنی لري چې زموږ پروتوکول په تفصیل سره تشریح کړئ، د هغې سموالي ته ځانګړې پاملرنه وکړئ. د څو تکرارونو وروسته، توضیحات چمتو وو، او اوس تاسو هم کولی شئ.
موږ قرارداد په 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