Өдрийн мэнд, бүгдээрээ! Би нэлээд удаан хугацаанд Backend хөгжүүлэлт хийж байгаа бөгөөд сүүлийн хэдэн жил би илүү олон янзын блокчейн төслүүд (Solidity on EVM) бичиж байна. Блокчэйнд шумбах нь надад амаргүй байсан бөгөөд миний арын тархи хэд хэдэн удаа эвдэрсэн тул блокчэйн хөгжүүлэлт рүү шилжих талаар санал бодлоо хуваалцахаар шийдлээ.
Анхааруулга: доор дурдсан бүх зүйл бол миний бодол юм. Би буруу байж магадгүй, би байнга алдаа гаргадаг :))
Блокчейн бол бидний ертөнцийг урагшлуулж чадах маш гайхалтай технологи юм. Гэхдээ одоохондоо маш олон хүмүүс үүнийг худалдаж авах-худалдах-луйвардах-луйвардах-өсгөх зорилгоор ашигладаг. Би криптог хөрөнгө гэж үзэхгүй, төлөвлөхгүй.
Тиймээ, олон янзын видео бичлэг, бичлэгүүд дээр "Энд ийм ийм крипто өсөх боломжтой, ийм ийм крипто унасан. Залуус аа, хөрөнгө оруулалт хийцгээе, худалдаж авъя...” гээд энэ талаар юу ч хэлэхгүй.
Би зөвхөн нэг зүйлийг хэлье - та мөнгө олохын тулд криптод ашиглахаас зайлсхийх хэрэгтэй. Хэрэв та хөгжүүлэгч бол хөгжүүлэгчийн хувиар орлого олохыг хичээж, хөрөнгө оруулалтад оролцохгүй байх нь дээр. Хэрэв та үнэхээр хөрөнгө оруулахыг хүсч байгаа бол криптод орох хэрэггүй.
Энэ нь чухал тэмдэглэлээс эхлэх нь зүйтэй юм. Блокчейн нь криптовалют биш. Блокчэйн бол криптовалютыг бүтээдэг технологи бөгөөд криптовалютыг блокчейн гэж нэрлэх нь хөгжлийн салбарыг бүхэлд нь Javascript гэж нэрлэхтэй адил юм. Тийм ээ, JavaScript нь хөгжүүлэлтийн онцгой тохиолдол мэт боловч хөгжүүлэлтийн талаар ярихдаа бид JavaScript гэсэн үг биш юм. Хэдийгээр зарим хүмүүс зөвхөн JavaScript гэсэн утгатай...
Хамгийн түрүүнд мөнгө орж ирдэг. Блокчейн хөгжүүлэгчид нэлээд сайн цалин авдаг. Би хувьдаа ийм ажлын байр нээсэн. Өдөрт ажил дээрээ зарцуулсан ижил хэмжээний цагийг ижил арын программистаас илүү авах боломжтой ийм сул орон тоонд би хувьдаа хариу өгсөн. Блокчейн хөгжүүлэгчид блокчэйнд суурилсан стартапуудад алтаар үнэлэгддэг. Ялангуяа сайн блокчейн хөгжүүлэгч!
Бүтээгдэхүүнээ орхих эсвэл засахгүйгээр сайн backend хөгжүүлэгч болох боломжгүй юм. Магадгүй би зүгээр л ялагдагч бөгөөд зөвхөн сөрөг туршлагаас суралцдаг, гэхдээ энэ бол надад байгаа онол юм:
Та бүтэлгүйтэлтэй туршлага солилцож чадахгүй, гэхдээ бүтэлгүйтлийн туршлага нь танд туршлагатай гэдгийг ойлгох боломжийг олгодог. Мөнгө алдахгүйгээр сайн блокчейн хөгжүүлэгч болоход хэцүү байдаг:
Дээрх зураг дээр ах дүү Райт нарын дэлхий дээрх анхны онгоц маш муу нисч байгааг харуулж байна. Гэвч тэр ниссэн бөгөөд тэр үед жирийн хүмүүсийн онгоцонд хандах хандлага нь иймэрхүү байв.
Одоо агаарын тээврийн салбар бол бидний амьдралын гайхалтай хэсэг бөгөөд дэлхийн өнцөг булан бүрт байгаа хүмүүсийг хэдхэн цагийн дотор холбодог. Логистик одоо ах дүү Райт нарын мөрөөдөж байгаагүй түвшинд хүрсэн! Онгоцноос болж дэлхий бүхэлдээ өөрөөр амьдардаг.
Би одоо блокчейн талаар ижил зүйлийг хэлэх болно - энэ нь үнэтэй бөгөөд тохиромжгүй бөгөөд яагаад гэдэг нь тодорхойгүй байна. Блокчейн хөгжилд шимтэх хүртлээ энэ нь надад хөрөнгө оруулагчдыг (=шишүүхэй) хуурахад хэрэггүй зүйл мэт санагдсан. Харин нөгөө талаас нь харвал ямар ч баримтыг төвлөрсөн бус байдлаар, хөндлөнгийн оролцоогүйгээр хадгалах боломжтой. "Хохирол хийх боломжгүй" нь чухал нарийн ширийн зүйл юм.
Харамсалтай нь, "блокчэйн" гэсэн үгтэй холбоотой холбоо нь уйтгартай, нэг хэвийн зүйл юм.
Боодолтой цаасан мөнгө зуух руу шидчихвэл зуух нь сайн шатаж, мөнгө нь бүр хэсэг хугацаанд дулаанаа өгнө. Гэхдээ энэ нь утгагүй юм.
Блокчэйнд ч мөн адил. Үүнийг зөвхөн мөнгө, криптод ашиглах нь муу, гэхдээ нөгөө тал нь хараахан үндэслээгүй байна ...
Аливаа бүтээгдэхүүнийг хөгжүүлэх гол хөшүүрэг нь мөнгө байдаг. Хэрэв сайн, хүчирхэг мөнгө олох ямар нэг зүйл байгаа бол энэ "ямар нэгэн зүйл" идэвхтэй хөгжих болно. Тийм ч учраас одоог хүртэл блокчэйнд суурилсан санхүүгийн төслүүд нь хэн нэгэнд мөнгө олохын тулд мөнгө олох, хэн нэгэнд мөнгө алдахад үндэслэсэн байдаг.
Төвлөрсөн болон төвлөрсөн бус үйлчилгээний хооронд ямар ялгаа байдаг вэ? Төвлөрсөн системээс эхэлье. Би болон өөр хэн нэгэн байгаа бөгөөд бид шилжүүлгийг хөнгөвчлөхийн тулд банк эсвэл өөр үйлчилгээ үзүүлэгч гэх мэт үйлчилгээг ашиглахаар шийдсэн.
Төвлөрсөн үйлчилгээ болох банктай гэж төсөөлөөд үз дээ. Би энэ банкинд: "Энэ хүнд 100 доллар шилжүүлээрэй" гэж тушааж байна. Банк надад 100 доллар дутуу, өөр хүнд 100 доллар илүү байна гэж тэмдэглэсэн байдаг.
Гэтэл төвлөрсөн үйлчилгээнд ямар асуудал байна вэ? Энэ төвлөрсөн үйлчилгээний ард эзэн бий шүү дээ? Ихэвчлэн зарим томоохон компани, холдинг, энэ нь хамаагүй; манайд бол нэг хүн л байг. Энэ нэг хүн: "Үүнийг хийцгээе. Алекст 100 доллар илгээгээрэй, гэхдээ энэ 100 долларыг хэн ч авахгүй. Надад тэд илүү хэрэгтэй."
Төвлөрсөн үйлчилгээ нь эзэнтэй. Асуудал нь эзэн нь мөнгө авч, сөрөг шийдвэр гаргаж чаддагт оршино. Мөн энэ нь зөвхөн "өөртөө мөнгө авах" тухай биш байж болно. Жишээлбэл, та "Бид банкинд 100,500 доллар байна" гэж бичээд бүх хадгаламж эзэмшигчид тэр мөнгөний араас явахгүй байх гэж найдаж байна ... SVB болон бусад үхсэн банкуудад тохиолдсон шиг.
Биткойныг мөнгөний менежментийн төвлөрлийг сааруулах зорилгоор зохион бүтээсэн.
Төвлөрсөн бус үйлчилгээ нь зангилаа бүр мэдээллийг хадгалж, дамжуулдаг зангилааны сүлжээнд баригдсан. Энгийнээр хэлэхэд, зангилаанууд ямар мэдээлэл зөв, юу нь буруу гэж тооцогддог, бид үүнийг хэрхэн хадгалах талаар тохиролцсон.
Бид өрөөтэй адилтгаж болно - нэг хүн бусаддаа хадгалахыг хүссэн мэдээллээ хашгирдаг. Дараа нь өрөөнд байгаа бүх хүмүүс хашгирсаны дараа хадгалсан мэдээллээр ажилладаг.
Жишээлбэл, блокчэйн нь мөнгө шилжүүлэх тухай мессеж эсвэл мэдээллийг хадгалах, дамжуулах боломжтой. Сүлжээнд оролцогчид мэдээллийг бүртгэхээс өмнө баталгаажуулдаг.
Өрөөний зүйрлэлд би "Би Сэм рүү 100 доллар шилжүүлж байна" гэж хашгирдаг. Хүн бүр намайг 100 доллараар дутуу, Сэм 100 доллараар илүү гэж бичдэг. Хэрэв гэнэт шилжүүлгийн өмнө надад 100 хүрэхгүй доллар байгаа бол хэн ч гүйлгээг бүртгэхгүй.
Блокчэйн дээр та Solidity хэлээр ухаалаг гэрээ байгуулж болно (EVM дээрх блокчейн тохиолдолд). Ухаалаг гэрээ нь блокчэйн сүлжээнд ажилладаг програм юм. Энэ нь баталгаажуулах механизм, алдаатай ажиллах болон бусад функцуудыг агуулж болно.
Дахин хэлэхэд, бид тушаал хашгирдаг өрөөний хувьд ухаалаг гэрээ бол өрөөнд байгаа оролцогч бүрт програмын кодыг урьдчилан өгөх явдал юм: миний тушаалуудад хэрхэн хариу үйлдэл үзүүлэх, юу шалгах, юу хадгалах вэ. Тэгээд би "Эдгээр параметртэй програмыг ажиллуул" гэж хашгирдаг. Дараа нь хүн бүр зааврыг дагаж мөрддөг. Энгийн, ухаалаг гэрээний жишээ бол өгөгдөл нэмэх, хүлээн авах функц бүхий мэдээллийн хадгалалт юм. Гэрээний кодыг байт код болгон хөрвүүлэн блокчейн оролцогчдод гүйцэтгэхээр дамжуулдаг.
Энэхүү ухаалаг гэрээнд илгээгдэх тодорхой хүсэлтүүдийг бид хэрхэн зохицуулах вэ? Хэрэв бид backend-тэй аналоги зурвал POST болон GET хүсэлтийг боловсруулах боломжтой үйлчилгээ юм. POST нь мэдээллийг хадгалдаг. GET нь бидний хадгалсан мэдээллийг буцааж илгээдэг. Ямар ч backend нь ихэвчлэн ийм бүтэцтэй байдаг.
Backend дээр хөгжүүлэлтийн явцад би API, мэдээллийн сан, өгөгдөл хадгалах, боловсруулахтай холбоотой бүх зүйл миний талд байдаг зохицуулалтад маш их дассан. Мөн би аль хэдийн хананы цаана байгаа юм шиг хэрэглэгчдэд урьдчилан бэлтгэсэн хувилбарын дагуу энэ өгөгдөлтэй ажиллах интерфейсийг өгсөн.
Жишээлбэл, хэрэглэгч 1 ирж контентыг (жишээ нь нийтлэл) POST аргаар хадгалдаг. Дараа нь хэрэглэгч 2 ирж GET аргыг ашиглан энэ агуулгыг татаж авна. Хэрэглэгчид энэ нь хаана, яаж байгааг мэдэхгүй - арын хэсэг нь тэдний хувьд хар хайрцаг юм.
Ингээд бид блокчэйний маш чухал хэсэг рүү ирлээ. Зангилаа эсвэл өрөөнд зогсож буй хүмүүсийн жишээндээ буцаж орцгооё. Backend-тэй адилтгаж ашиглавал бидэнд дараах тохиолдол бүр байна гэж бодъё: Би блокчэйнд “ADD” аргыг шидэж, дараа нь хүн бүр уг аргыг дотооддоо дуудаж, дараа нь блокчэйний хуулбараасаа мэдээлэл авч болно.
Тиймээс, зангилаанууд мэдээлэл авдаг сүлжээнд олон тооны хуулбарууд байдаг. Блокчэйнтэй холбоотой асуудал нь бид бичих үйлдэл бүрт бодит мөнгө төлөх ёстой. Үүнийг сүлжээний валютаар төлдөг бөгөөд үүнийг бодит мөнгөөр худалдаж авах боломжтой (эсвэл олборлосон, гэхдээ энэ нь бидний өнөөдрийн ярьж байгаа зүйл биш юм).
Хэрэв бид blockchain болон backend-ийг харьцуулбал зураг дараах байдалтай байна.
Жишээлбэл, Telegram нь төвлөрсөн мэдээллийн сантай. Бид үргэлж үүнд үнэгүй хандаж, мессеж, зураг, видео зэргийг татаж авах боломжтой. Гэвч Telegram-ын серверүүд гэнэт унтарвал бид үүнд нэвтэрч чадахгүй.
Бид блокчэйнд мэдээлэл бичих зэрэг ухаалаг гэрээний командуудыг гүйцэтгэхийн тулд EVM виртуал машиныг төлөх ёстой. Энэ нь зарим тооцоолол хийж, ямар нэг зүйлийг нэмж, үржүүлж, үржүүлж, үржүүлж, эцэст нь блокчейн санд шинэ олдвор гарч ирдэг бөгөөд энэ нь блокчэйнд оролцож буй бүх зангилаанууд дээр шинэчлэгддэг.
Сүлжээний аль ч оролцогч олон зуун гигабайт блокчейн өгөгдөл бүхий бүтэн зангилаа ажиллуулж, түүнтэй дотооддоо ажиллах боломжтой. Та мөн зангилааны хөнгөн хувилбарыг ашиглаж болох бөгөөд энэ нь блокчлоныг бүхэлд нь хадгалахгүй, гэхдээ та сүлжээн дэх бүтэн зангилаанд нэвтэрч, түүгээр дамжуулан шаардлагатай мэдээллийг авах боломжтой.
Гол санаа нь блокчэйн дэх оролт бүр нь блокчэйний төлөв байдалд өөрчлөлт гардаг олон тооны гүйлгээг агуулсан блок юм. Дараалсан блок бүр нь хэш алгоритм дээр суурилсан гинжин хэлхээний өмнөх блокоос хамаарна.
Ерөнхийдөө энэ нь үндсэн зүйл боловч үүнийг санаж байх нь зүйтэй юм - хэрэв өгөгдөл өөрчлөгдсөн бол найтаах бүрт төлөх ёстой. Дашрамд хэлэхэд, гэрээгээр байршуулах нь блокчэйн дэх дээд амжилт бөгөөд хямдхан биш юм!
Backend ертөнцөд би ойролцоогоор дараах функцуудыг хөгжүүлэх амьдралын мөчлөгт дассан:
Өөрөөр хэлбэл, бид ийм байдлаар ажиллахад дассан бөгөөд энэ нь үнэ төлбөргүй болдог. Хэдийгээр нөхцөлт үнэ төлбөргүй, учир нь бид серверийн төлбөрийг төлдөг. Блокчейн талаар юу хэлэх вэ?
Блокчэйний хувьд бид "хэрэглээний" (ухаалаг гэрээ) шинэ кодыг блокчэйнд бичих хэрэгтэй. Би дээр бичсэнчлэн, бид бичлэг бүрийг төлөх ёстой. Ухаалаг гэрээнд гүйлгээ хийхээсээ өмнө ухаалаг гэрээг байршуулах гүйлгээ хийх хэрэгтэй.
Дараа нь үйлчлүүлэгч/үйлчилгээний сервер нь гэрээнд заасан мэдээллийг хүлээн авах эсвэл хадгалахын тулд аль ч цэгтэй холбоо барина.
Маш олон тооны зангилаануудыг мэдэгдэх шаардлагатай - "залуус аа, миний гүйлгээнд алгоритмыг нь хийх ёстой гэрээний байт код энд байна". Блокчэйнийг сурдаг бүх зангилаа дээр ижил код гарч ирэх ёстой бөгөөд үүнийг хэн дуудаж, яаж дуудсанаас үл хамааран ижил аргаар гүйцэтгэх болно. Механикууд нь ижил бөгөөд өөрчлөгдөхгүй байх болно. Цаашилбал, ухаалаг гэрээг ямар нэгэн байдлаар өөрчлөх ямар ч зангилаа дээр өөрөөр ажиллах боломжгүй юм.
Би нэлээд эртнээс ETH сүлжээнд гэрээ хийсэн гүйлгээний жишээг доор харуулав.
Энэ бол бодит байдал дээр хэзээ ч ашиглагдаагүй туршилтын гэрээ байсан. Би үүнийг байршуулахын тулд ETH-д 200 доллар төлсөн. Өөрөөр хэлбэл, бид энэ гэрээгээр юу ч хийгээгүй - нэг ч хүсэлт биш, харин 200 доллар зарцуулсан. Энэ буруу гэрээ байгуулсныг санахад би одоо ч харамсдаг...
Өгөгдөл хадгалах талаар ярилцъя. Бид бүгд PostgreSQL , MySQL , MongoDB , Redis , болон өгөгдөлтэй хялбар ажиллах боломжийг олгодог бусад үйлчилгээнүүдэд дассан. Блокчэйний хувьд тийм ч ойрхон зүйл байхгүй.
Блокчэйнд хадгалалт нь бусад хэл дээрх анги дахь хувьсагчтай адил хэрэгждэг. Энэ нь зөвхөн гол утгууд эсвэл массивууд юм. Тохиромжтой холбоос бүхий харилцааны хүснэгтүүд байхгүй гэх мэт. Зүгээр л - хувьсагч руу бичээд аз жаргалтай байгаарай.
Одоогоор би блокчэйн дэх хадгалалтыг зохион байгуулах өөр арга замыг мэдэхгүй байна. За, магадгүй нөхцөл байдал аль хэдийн өөрчлөгдсөн байх; Магадгүй та үүнийг уншиж байхдаа ийм арга байдаг - сэтгэгдэл дээр бичээрэй.
Жишээлбэл, хэрэв бид зөвхөн массиваар хадгалахыг хүсвэл? Мөн бид мэдээллийг түлхүүрээр хадгалахыг хүсч байна - үүнд зориулж зураглал байдаг.
Долларын тэмдэг нь тодорхой шалтгааны улмаас зурсан байдаг - багц бүрт сүлжээний комисс авна.
Энэ хэсэгт би намайг гайхшруулсан эсвэл уурласан зүйлсийн талаар ярилцах болно. Энэ баримт бичигт дурдсанаас илүү олон зүйл байгаа боловч би практик дээр хамгийн түрүүнд надад нөлөөлсөн зүйлсийг хуваалцах болно.
Ихэнх "өвдөлт" нь ямар нэг логик шалтгааны улмаас ойлгомжтой байдаг гэдгийг анхаарах нь чухал юм. Гэхдээ энэ нь миний арын тархины өвдөлтийг арилгадаггүй.
Жишээлбэл, бид аливаа зүйлийн бүх элементүүдийг хялбархан даван туулж чаддагт би дассан. Энэ нь массив, объект эсвэл газрын зураг байх нь хамаагүй. Solidity-д энэ зорилгын үүднээс бид бүх түлхүүрүүдийн массивыг тусад нь хадгалах шаардлагатай бөгөөд шаардлагатай бол тэдгээрийг бүгдийг нь дамжуулж, түлхүүр бүрийн газрын зургаас элементүүдийг татаж авах шаардлагатай болно. За, бид бас энэ массив түлхүүрийг нэмж бичих, түүнийг эхлүүлэхэд зориулж хий зарцуулдаг.
Бид бас бүх ашигтай түлхүүр ангилах зүйлсийг авч чадахгүй.
Мод бэлтгэлийн байдал ч бас таагүй байна. Би хөгжүүлэлтийн орчинд дибаг хийгчээр дамжуулан дибаг хийж дассан, гэхдээ энд та ердийн бүртгэлийг мартах хэрэгтэй.
Typescript дээр би зүгээр л console.log(a)
гэж бичээд шууд л консол дээр гаралтыг авдаг байсан. Solidity-д console.log
байдаг бөгөөд энэ нь зөвхөн орон нутгийн hardhat хөгжүүлэлтийн орчинд ажиллах үед л ажилладаг. Гайхалтай нь надад хэрэгтэй зүйлээ хуваасны дараа би энэ бүх бүртгэлийг гэрээ байгуулахаас өмнө устгах ёстой, учир нь өөрөөр хэлбэл гэрээ илүү жинтэй, байршуулахад илүү их зардал гарах бөгөөд энэ нь бүтээгдэхүүн дээр огт ажиллахгүй болно. .
Эцэст нь хэлэхэд, бид төслийг аль хэдийн тулалдаанд ажиллуулахдаа юу нь буруу болсныг харахыг хүсдэг, юу нь буруу болсныг харах боломжгүй юм. Гэхдээ бид юу зөв болсныг харж байна. Ухаалаг гэрээний хүрээнд үйл явдлын систем бий. Энд жишээ дурдъя: бид энэ индексийн доор ийм утгатай шинэ зүйл нэмсэн үйл явдал хийхийг хүсч байна гэж бодъё.
Бид энэ үйл явдлыг set
арга дотор дууддаг бөгөөд үүнийг амжилттай гүйцэтгэсэн тохиолдолд л логуудыг харж болно. Хэрэв ямар нэг зүйл буруу болвол, та хэд хэдэн гэрээ хийсэн эсвэл бид гүйлгээ гацсан бол блокчейн дэх мэдээлэл буцаагдсан тул бүртгэлүүд хадгалагдахгүй.
Та хэд хэдэн ухаалаг гэрээний сүлжээг ашигладаг гэж бодъё. Та эхний гэрээнд зарим үйл явдал гэж нэрлэгддэг, дараа нь бусад үйл явдлуудыг дууддаг хоёр дахь гэрээ гэж нэрлэгддэг, дараа нь хоёр дахь гэрээнд дуудагдсан бүх зүйл унадаг. Бүх зүйл нэг удаа, бүрмөсөн устгагдах болно.
Блокчэйн дотор болж буй үйл явдлыг бүртгэхдээ бид маш болгоомжтой байх ёстой бөгөөд бидний хэрэглэж заншсан ердийн мод бэлтгэлийг энд хийх боломжгүй гэдгийг санаарай.
Өөр нэг таагүй зүйл бол бид бичих функцээр хийсэн гүйлгээнийхээ мэдээллийг авч чадахгүй байгаа явдал юм. Хэрэв бид блокчэйнд ямар нэгэн зүйл бичсэн гүйлгээг (өөрөөр хэлбэл төлбөртэй гүйлгээ) хийвэл return
нь ухаалаг гэрээтэй нэгтгэсэн манай үйлчилгээнд юу ч өгөхгүй. Энэ өгөөж нь зөвхөн ухаалаг гэрээний өөрөө эсвэл view
(үнэгүй) функцэд ажилладаг.
Жишээлбэл, бид блокчэйндээ шинэ үнэ цэнийг нэмэхдээ хадгалсаны дараа хадгалах сангийн хэмжээг олж мэдэхийг хүсч байна (дээрх дэлгэцийн зураг). Өөрөөр хэлбэл, бид яг юу нэмсэнийг зөвхөн үйл явдлуудаар дамжуулан олж мэдэх боломжтой. Үүнийг хийхийн тулд бид тухайн гүйлгээний хүрээнд үүсгэсэн үйл явдлуудыг татах хэрэгтэй.
Энд надад гэнэтийн зүйл тохиолдсон - утастай хэвийн ажиллах боломжгүй юм. Блокчэйн нь мөрт зориулж бүтээгдээгүй. Жишээнүүд рүү шилжье.
Доорх код нь ямар ч асуудалгүй ажиллах болно.
Мөн энэ код цаашид ажиллахгүй:
Би утсаар хэвийн ажиллах, тэмдэгтүүдийг солих, мөрүүдийг таслах, тэдгээрийг нэгтгэх зэрэгт удаан дассан - энэ бүгдийг хайрцагнаас нь авах боломжгүй. Мөн мөрний уртыг харуулах боломж байхгүй. Өөрөөр хэлбэл, энэ кодыг эмхэтгэхгүй:
Хэрэв танд мөрийн урт үнэхээр хэрэгтэй бол түүнийг байт болгон хувиргаж, дараа нь байтны тоог тоолж болно. Гэхдээ асуудал нь зарим тусгай тэмдэгтүүдийг 1v1 байт болгон хувиргадаггүй явдал юм. Мөн зарим нь зүгээр л хөрвүүлэгдээгүй бөгөөд гүйлгээ гацах магадлалтай.
Та энгийн мөрүүд дээр мөр, тестийг зохицуулдаг ухаалаг гэрээ бичиж дуусгаж болно. Дараа нь боловсруулагдахгүй мөр ирэх бөгөөд бүх зүйл гацах эсвэл тусгай тэмдэгтүүдээс болж мөрний уртыг буруу тоолох болно.
Мөрний талаархи дүгнэлт нь энгийн: мөртэй ажиллахгүй байх, гэрээн доторх утсанд найдаж болохгүй. Хэрэв мөрүүдийг хадгалах нь чухал бол байтыг хэмнэж, байт дээр тулгуурлаж, мөрийг үйлчилгээн дээр байт болгон хөрвүүлээрэй.
Блокчэйний гол онцлогийн өргөтгөл болох дараагийн нарийн төвөгтэй байдал бол тусгаарлалт юм. Блокчэйнд байгаа бүх өгөгдөл блокчейн дотор төрдөг эсвэл гаднаас нь дамжуулдаг. Гэхдээ блокчейн өөрөө гадаад ертөнцийг хэзээ ч тогшиж чадахгүй - зөвхөн бусад ухаалаг гэрээнүүд.
Асуудал нь бүх ухаалаг гэрээний командуудыг сүлжээнд байгаа оролцогч бүр дээр гүйцэтгэдэг. Мөн зангилаа бүр дээр ижил мэдээлэл хүлээн авна гэдэгт итгэлтэй байж чадахгүй тул та гадны эх сурвалжид итгэж болохгүй. Зангилаа бүр өөр өөр өгөгдөл бүхий блокчэйний өөр хувилбартай байх бөгөөд блокчэйн нурах болно.
"Одоогийн температурыг гадаа авах" гэсэн өчүүхэн ажил нь боломжгүй зүйл болж хувирдаг. Цаг агаар бидэнд үргэлж хэрэгтэй байдаггүй ч зарим өгөгдөл (валютын ханш эсвэл зарим гадаад системийн өнөөгийн байдал гэх мэт) зайлшгүй шаардлагатай. Үүний шийдэл нь дараахь арга барилд оршдог.
Энэ нь ийм урт гинж болж хувирдаг. Түүхийн гунигтай зүйл бол мөнгийг миний анхны хүсэлтээр "ийм хүсэлтээр над руу яв" гэсэн маягтын дагуу авдаг бөгөөд хоёр дахь хүсэлтийг хүсэлтийг гүйцэтгэсэн сервер аль хэдийн хийсэн байдаг.
Жишээлбэл, бид алхам тутамд 50 мянган хий авдаг. Бид гүйлгээг эхлүүлж, 50k GAS LIMIT тавьж, бид зүгээр болно гэж бодож байна. Гэхдээ, жишээлбэл, шинэ цаг агаарыг хэмнэх механикууд өөрчлөгддөг - одоо 10 хэмээс дээш температуртай үед бид оролцогчдын аль нэгэнд мөнгө шилжүүлэх хэрэгтэй. Логик нь өргөжин тэлж, одоо жишээлбэл, нэг гүйлгээнд 80к хий авах болно.
Эцсийн эцэст, хоёр дахь гүйлгээнд аль хэдийн гүйлгээнд хий дутагдсанаас болж бүхэл бүтэн гинжин уналтанд ордог. Гадны дуудлагын эргэн тойронд ийм "ногооны цэцэрлэг" нь ийм төслүүдийг илүү төвөгтэй болгодог. Хэрэв та гадаад ертөнцтэй хатуу холболттой бол төсөлдөө блокчэйн сонгох ёсгүй.
Мөн урьдчилан тодорхойлох боломжгүй ердийн санамсаргүй байдал гэж байдаггүй. Энэхүү санамсаргүй байдлыг өөр өөр үйлчилгээ үзүүлэгчид "байгаагаар нь" өгдөг - ухаалаг гэрээнд санамсаргүй утгыг тогтмол бичдэг. Гэхдээ бодит санхүүгийн төслүүдэд ийм зүйлд итгэх нь аюултай.
block.timestamp
хувьсагчийн утгыг блок олборлогч тогтоодог нь онцгой анхаарал хандуулах ёстой. Мэдээжийн хэрэг, уурхайчин өөрөө блок олборлодог гэдгийг урьдчилан мэдэж, цаг хугацааг орлож чадна гэж төсөөлөхөд хэцүү байдаг. Гэсэн хэдий ч таамаглалын боломж байсаар байна. Энэ аюул нь 15 секундын хүрээнд хамааралтай бөгөөд хэрэв бид минут, том хугацааны интервал дээр тулгуурлавал ийм асуудал байхгүй.
Би аюулгүй байдлын талаар нэг их ярих бодолгүй байна. Гэхдээ би нэг чухал зүйлийг онцолж хэлье: блокчэйн дэх бүх зүйл хүн бүрт харагдана. Бусдад нэвтрэх боломжгүй цорын ганц зүйл бол таны хувийн түлхүүр юм. Ухаалаг гэрээний кодыг аудитын шалгалтыг давж, ухаалаг гэрээний хэрэглэгчдэд итгэхийн тулд нээлттэй болгосон.
Аудитын журам гэдэг нь компанийг ухаалаг гэрээний кодыг үзэхийн тулд хөлсөлж, тухайн гэрээг энэ хаягаар байрлуулсан эсэхийг шалгах гэсэн үг юм. Гэрээний аюулгүй байдлын асуудлыг шалгадаг бөгөөд энэ нь хөгжүүлэгчдийн мэдэгдлийг хийдэг. Дараа нь аудитын компани вэбсайтдаа "энэ гэрээг бид баталгаажуулсан - үүнд итгэж болно" гэх мэт мэдээллийг нийтэлдэг.
Гэхдээ гэрээний кодыг өгөөгүй байсан ч амархан задалж болно. Жишээлбэл, дараах код нь өөрчлөгддөггүй хувьсагчтай байдаг - үүнийг доорх кодын тогтмолоор хаа сайгүй орлуулдаг.
Энэ гэрээг байрлуулж, хөрвүүлэгчээр дамжуулан нээсний дараа бид дараахь зүйлийг харж байна.
Өөрөөр хэлбэл, бид хувьсагчийн энэ утгыг шууд авдаг.
Би арын хэсэгт тайван байж чаддагт дассан бөгөөд санах ойд нэвтрэхгүйгээр унших хувийн хувьсагчийн үнэ цэнэ нь асуудалтай байх болно. Энд ч мөн адил - зүгээр л хүн бүр "санах ой"-д хандах боломжтой байдаг.
Бид хувьсах amount
хувийн гэж нэрлэсэн. Ухаалаг гэрээг байрлуулаад дараа нь энгийн кодын хэсгийг ашиглан үнэ цэнийг нь татна уу:
Ингэж байж та юуг ч гаргаж болно. Тиймээс ухаалаг гэрээнд ямар нэгэн эмзэг зүйлийг хадгалах талаар бүү бодоорой!
Өөрчлөлтүүдийг буцаах нь үндсэндээ боломжгүй юм. Ухаалаг гэрээг нэг удаа хуваарилдаг бөгөөд юу ч өөрчлөх боломжгүй. Энэ нь цаг хугацааны төгсгөл хүртэл блокчлон дээр үлдэх бөгөөд дараа нь зарим нь.
Тийм учраас бүгдийг нэг дор зөв, сайн бичих ёстой. Би үүнийг хийж чадахгүй, тиймээс би маш хурдан сонирхолтой тойрон гарах арга замыг оллоо - Шинэчлэх боломжтой гэрээнүүд . Тэдний механикууд дараах байдлаар ажилладаг.
Гэрээний эхний хувилбарыг (Гэрээ V1) нийтэллээ
Прокси гэрээг нийтэлсэн бөгөөд түүнд дараах үүрэг даалгавар байна: 1v1 бүх хүсэлтийг гэрээ V1 рүү дамжуулах эсвэл өөрийн хадгалах санг ашиглах, зөвхөн зорилтот гэрээний логикийг ашиглах.
Цаашид хэрэглэгч прокси гэрээтэй үндсэн гэрээтэй ижил аргаар харилцдаг.
Хэрэв гэрээг шинэчлэх шаардлагатай бол админ нь гэрээ V2-г байрлуулж, админ-гэрээгээр дамжуулан прокси-гэрээгээр гэрээ V2-ийн хаяг дээр хэрэгжиж байна гэж мэдэгдэнэ.
Дараа нь хэрэглэгч прокситэй холбогдож, V2 Contract-ийн механикууд аль хэдийн хийгдсэн байна.
Дараа нь хэрэглэгч прокситэй холбогдож, V2 гэрээний механикууд аль хэдийн хийгдсэн байна.
Энэ механизм нь хэд хэдэн хязгаарлалт, заль мэхтэй. Жишээлбэл, гэрээний шинэ хувилбарт өмнөх хувилбарын хувьсагчдыг өөрчлөх боломжгүй. Хэрэв хувьсагч шаардлагагүй бол түүнийг орхиж, шинэ гэрээнд оруулах ёстой.
Мэдээжийн хэрэг, энэ шийдэл болон бусад олон шийдлүүд аль хэдийн бэлэн болсон. Эдгээр бүтээн байгуулалтын гол нийлүүлэгч нь OpenZeppelin юм. Тиймээс аз болоход дугуйг дахин зохион бүтээх шаардлагагүй.
Сайжруулж болох гэрээ:
Сайжруулж болох ухаалаг гэрээ нь аудит хийлгэхгүй байх сайхан шалтгаан юм. Блокчейн ертөнц итгэлцэл дээр тогтдог. Одоо ухаалаг гэрээ нь шударга, нээлттэй механиктай байж болох ч дараа нь ухаалаг гэрээний эзэн бүх мөнгөө авдаг гэрээ рүү шилжих болно.