FunC ን ከ Haskell ጋር ወደ ተግባር መቀየር፡ ሴሮኬል የቴሌግራም ብሎክቼይን ውድድር እንዴት እንዳሸነፈ

ያንን ቴሌግራም ሰምተህ ይሆናል። የቶን blockchain መድረክን ሊጀምር ነው።. ግን ብዙም ሳይቆይ የቴሌግራም ዜና አምልጦህ ሊሆን ይችላል። ውድድር አስታውቋል ለዚህ መድረክ አንድ ወይም ከዚያ በላይ ዘመናዊ ኮንትራቶችን ለመተግበር.

ትላልቅ የብሎክቼይን ፕሮጄክቶችን በማዘጋጀት ረገድ ሰፊ ልምድ ያለው የሴሮኬል ቡድን ወደ ጎን መቆም አልቻለም። አምስት ሰራተኞችን ለውድድሩ በውክልና ሰጥተናል፣ እና ከሁለት ሳምንታት በኋላ በሴክሲ ቻሜሌዮን (በ) መጠነኛ የዘፈቀደ ቅጽል ስም አንደኛ ቦታ ያዙ። በዚህ ጽሑፍ ውስጥ እንዴት እንዳደረጉት እናገራለሁ. በሚቀጥሉት አስር ደቂቃዎች ውስጥ ቢያንስ አንድ አስደሳች ታሪክ እንደሚያነቡ ተስፋ እናደርጋለን, እና ቢበዛ በእሱ ውስጥ በስራዎ ውስጥ ማመልከት የሚችሉት ጠቃሚ ነገር ያገኛሉ.

ግን በትንሽ አውድ እንጀምር።

ውድድር እና ሁኔታዎች

ስለዚህ የተሳታፊዎቹ ዋና ተግባራት አንድ ወይም ከዚያ በላይ የታቀዱ ብልጥ ኮንትራቶች አፈፃፀም እንዲሁም የቶን ሥነ ምህዳሩን ለማሻሻል ሀሳቦችን ማቅረብ ነበሩ ። ውድድሩ ከሴፕቴምበር 24 እስከ ጥቅምት 15 ድረስ የተካሄደ ሲሆን ውጤቱም የተገለፀው ህዳር 15 ብቻ ነው። በቴሌግራም የቪኦአይፒ ጥሪዎች ጥራትን ለመፈተሽ እና ለመፈተሽ በ C++ ውስጥ በመተግበሪያዎች ዲዛይን እና ልማት ላይ የቴሌግራም ውጤቶችን በማዘጋጀት እና በማዘጋጀት የውድድሩን ውጤት ለማስታወቅ ረጅም ጊዜ ወስዷል።

በአዘጋጆቹ ከቀረቡት ዝርዝር ውስጥ ሁለት ዘመናዊ ኮንትራቶችን መርጠናል. ለአንደኛው ከቶን ጋር የተከፋፈሉ መሳሪያዎችን ተጠቀምን, ሁለተኛው ደግሞ በአዲስ ቋንቋ ተተግብሯል በእኛ መሐንዲሶች በተለይ ለ ቶን በተዘጋጀው እና በሃስኬል የተሰራ.

ተግባራዊ የፕሮግራም ቋንቋ ምርጫ በአጋጣሚ አይደለም. በእኛ የድርጅት ብሎግ ብዙ ጊዜ የምንነጋገረው ለምንድነው የተግባር ቋንቋዎች ውስብስብነት ትልቅ ማጋነን ነው እና ለምን በጥቅሉ ዓላማ-ተኮር ከሆኑ እንመርጣለን። በነገራችን ላይ በውስጡም ይዟል የዚህ ጽሑፍ የመጀመሪያ.

ለመሳተፍ እንኳን ለምን ወሰንን?

ባጭሩ፣ የእኛ ስፔሻላይዜሽን መደበኛ ያልሆነ እና ልዩ ችሎታ የሚጠይቁ ውስብስብ ፕሮጀክቶች ስለሆኑ እና ብዙ ጊዜ ለ IT ማህበረሰብ ሳይንሳዊ ጠቀሜታ ያላቸው ናቸው። እኛ አጥብቆ ክፍት-ምንጭ ልማት እንደግፋለን እና በውስጡ ታዋቂነት ላይ የተሰማሩ ናቸው, እና ደግሞ ኮምፒውተር ሳይንስ እና ሒሳብ መስክ ውስጥ መሪ የሩሲያ ዩኒቨርሲቲዎች ጋር መተባበር.

የውድድሩ አስደሳች ተግባራት እና በተወዳጅ የቴሌግራም ፕሮጄክታችን ውስጥ መሳተፍ በራሱ ጥሩ ተነሳሽነት ነበር ፣ ግን የሽልማት ፈንዱ ተጨማሪ ማበረታቻ ሆነ። 🙂

TON blockchain ምርምር

በብሎክቼይን፣ አርቴፊሻል ኢንተለጀንስ እና የማሽን መማር አዳዲስ እድገቶችን በቅርብ እንከታተላለን እና በእያንዳንዱ በምንሰራበት አካባቢ አንድም ጉልህ የሆነ ልቀት እንዳያመልጥዎ እንሞክራለን። ስለዚህ ውድድሩ ሲጀመር ቡድናችን ከዚህ ቀደም ያሉትን ሃሳቦች ጠንቅቆ ያውቃል ቶን ነጭ ወረቀት. ሆኖም ከቶን ጋር ሥራ ከመጀመራችን በፊት የቴክኒካዊ ሰነዶችን እና የመድረክን ትክክለኛ ምንጭ ኮድ አልተተነተነም ፣ ስለሆነም የመጀመሪያው እርምጃ በጣም ግልፅ ነበር - በ ላይ ኦፊሴላዊ ሰነዶችን በጥልቀት ማጥናት። ጣቢያ እና ውስጥ የፕሮጀክት ማከማቻዎች.

ውድድሩ ሲጀመር ኮዱ አስቀድሞ ታትሟል፣ ስለዚህ ጊዜን ለመቆጠብ፣ የተጻፈ መመሪያ ወይም ማጠቃለያ ለመፈለግ ወስነናል። በተጠቃሚዎች. እንደ አለመታደል ሆኖ ይህ ምንም ውጤት አላስገኘም - በኡቡንቱ ላይ መድረክን ለመሰብሰብ መመሪያዎችን ከመስጠት በተጨማሪ ሌሎች ቁሳቁሶችን አላገኘንም ።

ሰነዱ ራሱ በጥሩ ሁኔታ የተመረመረ ቢሆንም በአንዳንድ አካባቢዎች ግን ለማንበብ አስቸጋሪ ነበር። ብዙ ጊዜ ወደ ተወሰኑ ነጥቦች መመለስ እና ከከፍተኛ ደረጃ የአብስትራክት ሃሳቦች መግለጫ ወደ ዝቅተኛ ደረጃ ትግበራ ዝርዝሮች መቀየር ነበረብን።

ዝርዝር መግለጫው የአተገባበሩን ዝርዝር መግለጫ ባያጠቃልል ቀላል ይሆናል። ቨርቹዋል ማሽን ቁልል እንዴት እንደሚወክል የሚገልጽ መረጃ ገንቢዎችን ከመርዳት ይልቅ ለቶን ፕላትፎርም ብልጥ ኮንትራቶችን የሚፈጥሩ ገንቢዎችን የማዘናጋት ዕድሉ ከፍተኛ ነው።

Nix: ፕሮጀክቱን አንድ ላይ ማድረግ

በሴሮኬል ትልቅ ደጋፊዎች ነን ኒክስ. ፕሮጀክቶቻችንን ከእነሱ ጋር እንሰበስባለን እና ተጠቅመን እናሰማራቸዋለን NixOpsእና በሁሉም አገልጋዮቻችን ላይ ተጭኗል ኒክስስ. ለዚህም ምስጋና ይግባውና ሁሉም ግንባታዎቻችን እንደገና ሊባዙ የሚችሉ እና ኒክስ በሚጫኑበት በማንኛውም ስርዓተ ክወና ላይ ይሰራሉ.

ስለዚህ በመፍጠር ጀመርን ኒክስ ተደራቢ ለቶን ስብሰባ መግለጫ. በእሱ እርዳታ ቶን ማጠናቀር በተቻለ መጠን ቀላል ነው፡-

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

ምንም ጥገኝነቶችን መጫን እንደማያስፈልግዎ ልብ ይበሉ. Nix፣ ኡቡንቱ ወይም ማክሮስ እየተጠቀሙም ይሁኑ ኒክስ ሁሉንም ነገር በድግምት ያደርግልዎታል።

ለቶን ፕሮግራም ማውጣት

በ TON Network ውስጥ ያለው ዘመናዊ የኮንትራት ኮድ በቶን ቨርቹዋል ማሽን (ቲቪኤም) ላይ ይሰራል። ቲቪኤም ከሌሎች ምናባዊ ማሽኖች የበለጠ ውስብስብ ነው, እና በጣም አስደሳች ተግባር አለው, ለምሳሌ, አብሮ መስራት ይችላል ይቀጥላል и ወደ ውሂብ አገናኞች.

በተጨማሪም ፣ የቶን ሰዎች ሶስት አዳዲስ የፕሮግራም ቋንቋዎችን ፈጥረዋል-

አምስት የሚመስለው ሁለንተናዊ ቁልል ፕሮግራሚንግ ቋንቋ ነው። Forth. የእሱ የላቀ ችሎታ ከቲቪኤም ጋር የመግባባት ችሎታ ነው።

FunC ተመሳሳይ የሆነ ብልጥ የኮንትራት ፕሮግራም ቋንቋ ነው። C እና ወደ ሌላ ቋንቋ ተሰብስቧል - Fift Assembler.

አምስተኛ ሰብሳቢ - ለቲቪኤም ሁለትዮሽ የሚተገበር ኮድ ለማመንጨት አምስት ቤተ-መጽሐፍት። አምስተኛ ሰብሳቢ የለውም። ይህ የተከተተ ጎራ ልዩ ቋንቋ (eDSL).

የእኛ ውድድር ይሰራል

በመጨረሻም የጥረታችንን ውጤት የምንመለከትበት ጊዜ ነው።

ያልተመሳሰለ የክፍያ ጣቢያ

የክፍያ ቻናል ሁለት ተጠቃሚዎች ከብሎክቼይን ውጭ ክፍያዎችን እንዲልኩ የሚያስችል ዘመናዊ ውል ነው። በውጤቱም, ገንዘብን ብቻ ሳይሆን (ኮሚሽን የለም), ነገር ግን ጊዜን (የሚቀጥለው እገዳ እስኪሰራ ድረስ መጠበቅ አያስፈልግዎትም). ክፍያዎች በተፈለገው መጠን ትንሽ እና በተፈለገው መጠን ሊሆኑ ይችላሉ። በዚህ ጉዳይ ላይ ተዋዋይ ወገኖች እርስ በርስ መተማመኛ አያስፈልጋቸውም, ምክንያቱም የመጨረሻው ፍትሃዊነት በስማርት ኮንትራት የተረጋገጠ ነው.

ለችግሩ ቀላል የሆነ መፍትሄ አግኝተናል። ሁለት ወገኖች የተፈረሙ መልእክቶችን መለዋወጥ ይችላሉ, እያንዳንዳቸው ሁለት ቁጥሮች ይይዛሉ - በእያንዳንዱ ወገን የሚከፈለው ሙሉ መጠን. እነዚህ ሁለት ቁጥሮች ይሠራሉ የቬክተር ሰዓት በባህላዊ የተከፋፈሉ ስርዓቶች እና በግብይቶች ላይ "ከዚህ በፊት ተከስቷል" የሚለውን ትዕዛዝ ያዘጋጁ. ይህንን ውሂብ በመጠቀም ኮንትራቱ ማንኛውንም ግጭት ለመፍታት ያስችላል።

በእውነቱ፣ ይህንን ሃሳብ ለመተግበር አንድ ቁጥር በቂ ነው፣ ነገር ግን ሁለቱንም ትተናል ምክንያቱም በዚህ መንገድ የበለጠ ምቹ የተጠቃሚ በይነገጽ ማድረግ እንችላለን። በተጨማሪም, በእያንዳንዱ መልእክት ውስጥ የክፍያውን መጠን ለማካተት ወስነናል. ያለሱ, መልእክቱ በሆነ ምክንያት ከጠፋ, ምንም እንኳን ሁሉም መጠኖች እና የመጨረሻው ስሌት ትክክል ቢሆኑም, ተጠቃሚው ኪሳራውን ላያስተውለው ይችላል.

ሀሳባችንን ለመፈተሽ እንደዚህ አይነት ቀላል እና አጭር የክፍያ ቻናል ፕሮቶኮልን ለመጠቀም ምሳሌዎችን ፈልገናል። የሚገርመው፣ ያገኘነው ሁለቱን ብቻ ነው።

  1. መግለጫ ተመሳሳይ አቀራረብ ፣ ለአንድ አቅጣጫዊ ቻናል ጉዳይ ብቻ።
  2. አጋዥ ስልጠናእንደ አጠቃላይ ትክክለኛነት እና የግጭት አፈታት ሂደቶች ያሉ ብዙ አስፈላጊ ዝርዝሮችን ሳያብራራ እንደ እኛ ተመሳሳይ ሀሳብን የሚገልጽ።

ለትክክለኛነቱ ልዩ ትኩረት በመስጠት ፕሮቶኮላችንን በዝርዝር መግለጹ ምክንያታዊ እንደሆነ ግልጽ ሆነ። ከብዙ ድግግሞሾች በኋላ መግለጫው ዝግጁ ነበር፣ እና አሁን እርስዎም ይችላሉ። ተመልከታት.

ውሉን በFunC ውስጥ ተግባራዊ አድርገናል፣ እና በአዘጋጆቹ በተጠቆመው መሰረት ከኮንትራታችን ጋር ሙሉ ለሙሉ መስተጋብር ለመፍጠር የትእዛዝ መስመር መገልገያውን ጻፍን። ለ CLIችን ሌላ ማንኛውንም ቋንቋ መምረጥ እንችል ነበር፣ ነገር ግን የአካል ብቃትን በተግባር እንዴት እንደሚሰራ ለማየት ፈልገን ነበር።

እውነቱን ለመናገር፣ ከ Fift ጋር ከሰራን በኋላ፣ ይህን ቋንቋ ከተዘጋጁ መሳሪያዎች እና ቤተ-መጻሕፍት ጋር ታዋቂ ከሆኑ እና በንቃት ከሚጠቀሙባቸው ቋንቋዎች ለመምረጥ ምንም አሳማኝ ምክንያቶች አላየንም። ቁልል ላይ በተመሠረተ ቋንቋ ​​ፕሮግራሚንግ በጣም ደስ የማይል ነው፣ ምክንያቱም ቁልል ላይ ያለውን ነገር ያለማቋረጥ በጭንቅላታችሁ ውስጥ ማስቀመጥ ስላለባችሁ፣ እና አቀናባሪው በዚህ ላይ አይረዳም።

ስለዚህ, በእኛ አስተያየት, ለፊፍት መኖር ብቸኛው ማረጋገጫ ለ Fift Assembler የአስተናጋጅ ቋንቋ ሆኖ ሚናው ነው. ግን ለዚህ ብቸኛ ዓላማ አዲስ ከመፍጠር ይልቅ የቲቪ ኤም ሰብሳቢውን ወደ አንዳንድ ነባር ቋንቋዎች መክተት የተሻለ አይሆንም?

TVM Haskell eDSL

ስለ ሁለተኛው ዘመናዊ ኮንትራታችን ለመነጋገር ጊዜው አሁን ነው. ባለብዙ ፊርማ የኪስ ቦርሳ ለማዘጋጀት ወስነናል፣ ነገር ግን በFunC ውስጥ ሌላ ዘመናዊ ውል መፃፍ በጣም አሰልቺ ይሆናል። አንዳንድ ጣዕም ለመጨመር እንፈልጋለን፣ እና ያ ለቲቪኤም የራሳችን የመሰብሰቢያ ቋንቋ ነበር።

ልክ እንደ Fift Assembler አዲሱ ቋንቋችን ተካቷል ነገርግን ከፋፍት ይልቅ ሃስኬልንን እንደ አስተናጋጅ መርጠናል ይህም የላቀ አይነት ሲስተም ሙሉ በሙሉ እንድንጠቀም አስችሎናል። ከስማርት ኮንትራቶች ጋር ሲሰራ, ትንሽ ስህተት እንኳን ዋጋ በጣም ከፍተኛ ሊሆን ይችላል, የማይለዋወጥ ትየባ, በእኛ አስተያየት, ትልቅ ጥቅም ነው.

በ Haskell ውስጥ የቲቪኤም ሰብሳቢ ምን እንደሚመስል ለማሳየት አንድ መደበኛ የኪስ ቦርሳ ተግብረናል። ትኩረት ሊሰጣቸው የሚገቡ ጥቂት ነገሮች እዚህ አሉ

  • ይህ ውል አንድ ተግባርን ያቀፈ ነው, ነገር ግን የፈለጉትን መጠቀም ይችላሉ. አዲስ ተግባርን በአስተናጋጅ ቋንቋ ሲገልጹ (ማለትም Haskell) የእኛ eDSL በቲቪኤም ውስጥ የተለየ የዕለት ተዕለት ተግባር እንዲሆን ወይም በቀላሉ በመደወያ ቦታ ውስጥ እንዲገባ ለማድረግ እንዲመርጡ ይፈቅድልዎታል።
  • ልክ እንደ Haskell፣ ተግባራት በማጠናቀር ጊዜ የሚፈተሹ ዓይነቶች አሏቸው። በእኛ eDSL ውስጥ የአንድ ተግባር ግቤት አይነት ተግባሩ የሚጠብቀው የቁልል አይነት ሲሆን የውጤት አይነት ደግሞ ከጥሪው በኋላ የሚፈጠረው የቁልል አይነት ነው።
  • ኮዱ ማብራሪያዎች አሉት stacktype, የሚጠበቀውን የቁልል አይነት በመጥሪያ ቦታ ላይ በመግለጽ. በመጀመሪያው የኪስ ቦርሳ ውል ውስጥ እነዚህ አስተያየቶች ብቻ ነበሩ፣ ነገር ግን በእኛ eDSL ውስጥ እነሱ የኮዱ አካል ናቸው እና በተጠናቀረ ጊዜ ላይ ምልክት ይደረግባቸዋል። ኮዱ ከተቀየረ እና የቁልል አይነት ከተለወጠ ገንቢው ችግሩን እንዲያገኝ የሚያግዙ ሰነዶች ወይም መግለጫዎች ሆነው ሊያገለግሉ ይችላሉ። እርግጥ ነው፣ እንዲህ ያሉት ማብራሪያዎች የቲቪ ኤም ኮድ ስላልተፈጠረላቸው የሩጫ ጊዜ አፈጻጸም ላይ ተጽዕኖ አይኖራቸውም።
  • ይህ አሁንም በሁለት ሳምንታት ውስጥ የተፃፈ ምሳሌ ነው, ስለዚህ በፕሮጀክቱ ላይ ገና ብዙ ስራዎች አሉ. ለምሳሌ፣ ከዚህ በታች ባለው ኮድ ውስጥ የሚያዩዋቸው የመማሪያ ክፍሎች ሁሉም ምሳሌዎች በራስ-ሰር መፈጠር አለባቸው።

የባለብዙ ሲግ ቦርሳ አተገባበር በእኛ 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

የኢዲኤስኤል እና የባለብዙ ፊርማ የኪስ ቦርሳ ውል ሙሉ ምንጭ ኮድ በ ላይ ይገኛል። ይህ ማከማቻ. ሌሎችም በዝርዝር ተናግሯል። ስለ አብሮ የተሰሩ ቋንቋዎች፣ ባልደረባችን Georgy Agapov።

ስለ ውድድር እና ቶን መደምደሚያዎች

በድምሩ፣ ስራችን 380 ሰአታት ፈጅቷል (ከሰነድ ጋር መተዋወቅን፣ ስብሰባዎችን እና ትክክለኛ እድገትን ጨምሮ)። አምስት ገንቢዎች በውድድር ፕሮጀክቱ ውስጥ ተሳትፈዋል፡ CTO፣ የቡድን መሪ፣ የብሎክቼይን መድረክ ስፔሻሊስቶች እና የ Haskell ሶፍትዌር ገንቢዎች።

የሃካቶን መንፈስ፣የቅርበት የቡድን ስራ እና እራሳችንን በአዳዲስ ቴክኖሎጂዎች ገፅታዎች ውስጥ በፍጥነት የማስገባት አስፈላጊነት ሁል ጊዜ የሚያስደስት በመሆኑ ያለምንም ችግር በውድድሩ ለመሳተፍ ግብዓቶችን አግኝተናል። ብዙ እንቅልፍ የሌላቸው ምሽቶች በውስን ሀብቶች ውስጥ ከፍተኛውን ውጤት ለማግኘት በዋጋ ሊተመን የማይችል ልምድ እና ምርጥ ትውስታዎች ይካሳሉ። በተጨማሪም እንደዚህ ባሉ ሥራዎች ላይ መሥራት ሁል ጊዜ የኩባንያው ሂደቶች ጥሩ ፈተና ነው ፣ ምክንያቱም በጥሩ ሁኔታ የሚሰራ የውስጥ መስተጋብር ከሌለ እውነተኛ ጥሩ ውጤቶችን ለማግኘት እጅግ በጣም ከባድ ስለሆነ።

ግጥሞች ወደ ጎን፡ የቶን ቡድን ባደረገው የስራ መጠን አስደነቀን። ውስብስብ, ቆንጆ, እና ከሁሉም በላይ, የአሰራር ስርዓት መገንባት ችለዋል. ቶን ትልቅ አቅም ያለው መድረክ መሆኑን አረጋግጧል። ይሁን እንጂ, ይህ ሥነ-ምህዳር እንዲዳብር, በብሎክቼይን ፕሮጀክቶች ውስጥ አጠቃቀሙን እና የልማት መሳሪያዎችን ከማሻሻል አንፃር ብዙ ተጨማሪ መከናወን አለበት. አሁን የዚህ ሂደት አካል በመሆናችን ኩራት ይሰማናል።

ይህንን ጽሑፍ ካነበቡ በኋላ አሁንም ጥያቄዎች ካሉዎት ወይም ችግሮችን ለመፍታት ቶን እንዴት መጠቀም እንደሚችሉ ሀሳብ ካለዎት ይጻፉልን - ልምዳችንን ለማካፈል ደስተኞች እንሆናለን።

ምንጭ: hab.com

አስተያየት ያክሉ