Ихэнх тохиолдолд хүмүүс ухаалаг гэрээ бичиж сурахад хамгийн түрүүнд Solidity болон Ethereum-ийн тухай сонсдог. Энэ бол миний сонссон анхны зүйл юм. Энэ нь ихэнх хичээлүүд дээр төвлөрдөг бөгөөд сайн шалтгаантай. Solidity нь блокчэйн дээр амьдардаг программ бичих боломжийг олгосон бөгөөд Ethereum нь олон хүний эхлэлийг тавьсан газар болсон.
Гэхдээ Solidity бол цорын ганц ухаалаг гэрээний хэл биш юм. Мөн Ethereum нь төвлөрсөн бус програмуудыг дэмждэг цорын ганц блокчейн биш юм.
Нээлттэй сүлжээний товчлол болох TON гэж бас бий. Энэ нь Telegram-ээр үүсгэгдсэн боловч одоо олон нийтэд чиглэсэн, олон нийтийн сүлжээ болсон. Энэ нь хурдан, хөнгөн бөгөөд Ethereum дээр дассан байснаас арай өөрөөр зохицуулдаг. Үүнд ухаалаг гэрээ хэрхэн бичигдсэн байдаг. Би TON баримт бичгийг судалж эхлэхдээ ухаалаг гэрээ бичих дөрвөн өөр хэлтэй танилцсан: Tact, Tolk, FunC, Fift . Би энд дөрвөн зүйлд гүнзгий орохгүй.
Энэхүү гарын авлага нь эелдэг хэл дээр төвлөрч байгаа бөгөөд бид үүнийг хэрэглэгчдэд санал өгөх, гинжин хэлхээний үр дүнг шалгах боломжийг олгодог үндсэн саналын гэрээг байгуулахад хэрхэн ашиглахыг харах болно.
Яагаад би эхлээд эелдэг сурахаар шийдсэн бэ?
TON экосистем нь үнэндээ олон хэлийг дэмждэг бөгөөд тус бүр нь өөр өөр хэрэглээний тохиолдол, хийсвэрлэлийн түвшин, хөгжүүлэгчийн туршлагад үйлчилдэг. Тэдгээрийн тус бүрийн товч тоймыг энд оруулав.
- FunC бол TON ухаалаг гэрээ бичих уламжлалт хэл юм. Энэ нь доод түвшнийх бөгөөд таны гэрээ хэрхэн ажиллахыг нарийн хянах боломжийг танд олгоно. Энэ нь хүчирхэг боловч та TON Virtual Machine (TVM) хэрхэн ажилладаг, тухайлбал стек удирдах, санах ойн зохион байгуулалт, детерминист гүйцэтгэл зэрэг ойлголтуудыг ойлгох хэрэгтэй болно гэсэн үг юм. Синтакс нь С-тэй зарим талаараа төстэй бөгөөд хэрэв та өмнө нь тухайн хэлний хэв маягтай ажиллаж байгаагүй бол танил бус санагдаж магадгүй юм.
- Fift нь ихэвчлэн FunC-тэй хамт хэрэглэгддэг. Энэ нь ихэвчлэн TVM-тэй шууд харьцахад ашиглагддаг стек дээр суурилсан хэл бөгөөд байршуулах, дибаг хийх, гинжин тооцоолол хийхэд ашиглагддаг. Энэ нь ихэвчлэн бүрэн ухаалаг гэрээ бичихэд тань эхэлдэг хэл биш боловч TON дээрх ерөнхий боловсруулалтын ажлын урсгалд чухал ач холбогдолтой юм.
- Толк бол хөгжиж буй шинэ нэмэлт юм. Миний цуглуулсан зүйлээс харахад энэ нь багаж хэрэгсэл, дээд түвшний хэлтэй нийцтэй байдлыг сайжруулах зорилготой юм. Энэ нь ирээдүйтэй боловч одоохондоо өргөн хэрэглэгдэж, баримтжуулаагүй байна.
- Tact бол TON ухаалаг гэрээний хөгжүүлэлтийг илүү хүртээмжтэй, хөгжүүлэгчдэд ээлтэй болгох зорилгоор тусгайлан бүтээгдсэн өндөр түвшний хэл юм. Такт нь доод түвшний нарийн төвөгтэй байдлыг хялбаршуулж, логикоо цэвэр, уншигдахуйц байдлаар бичихэд анхаарлаа төвлөрүүлэх боломжийг олгодог. Синтакс нь TypeScript эсвэл Solidity-д харагдах зүйлтэй илүү ойр байдаг бөгөөд энэ нь TVM-ийн дотоод мэдээлэлд гүнзгий орох шаардлагагүйгээр эхлүүлэхэд илүү хялбар болгодог.
Tact нь TON блокчэйн дээр гэрээ байгуулах, байршуулах илүү хурдан замыг өгдөг.
Такт хэрхэн ажилладагийг ойлгох
Код бичиж эхлэхээсээ өмнө Tact ухаалаг гэрээ хэрхэн бүтэцлэгдсэнийг ойлгох нь чухал. Ердийн Tact гэрээ нь хэд хэдэн үндсэн бүрэлдэхүүн хэсгүүдийг агуулдаг:
contract
блок - Энэ бол та гэрээний нэрийг тодорхойлж, аливаа төлөвийн хувьсагчийг зарлах газар юм.init
блок - Энэ нь таны гэрээний төлөвийн хувьсагчдыг эхлүүлж, гэрээний эхлэлийн нөхцлийг тохируулдаг. Энэ блок нь байршуулах үед нэг удаа ажилладаг.блок
receive
- Эдгээр нь үйл явдлын сонсогчтой адил юм. Тэд ирж буй мессежийг зохицуулж, таны гэрээ тэдэнд хэрхэн хариу үйлдэл үзүүлэхийг тодорхойлдог.Getter функцууд (
get fun
) – Эдгээр нь хэрэглэгчид болон бусад гэрээнүүдэд гэрээний төлөвийг өөрчлөхгүйгээр асуух боломжийг олгодог зөвхөн унших боломжтой функцууд юм.
Tact нь мессежид суурилсан харилцаа холбоог ашигладаг бөгөөд энэ нь TON дээрх бүх харилцан үйлчлэл юм. Гэрээ бүр мессеж хүлээн авч, өөрийн receive
блокт боловсруулдаг. Энэхүү зурваст суурилсан бүтэц нь таны гэрээний логикийг модульчлагдсан, тогтвортой байдлаар зохион байгуулахад тусалдаг.
Энгийн саналын гэрээ байгуулах замаар үүнийг бодит жишээн дээр хэрэгжүүлье.
Анхны санал өгөх гэрээгээ эелдэг байдлаар байгуулах (TON Web IDE ашиглах)
Энэ хэсэгт бид Tact ашиглан санал өгөх үндсэн системийг хэрхэн хэрэгжүүлэх талаар авч үзэх болно. Энэхүү саналын гэрээ нь хэрэглэгчдэд урьдчилан тодорхойлсон нэр дэвшигчдэд санал өгөх боломжийг олгож, нэр дэвшигч бүрийн авсан нийт саналын тоог хянах болно.
Бид TON Web IDE доторх бүх зүйлийг хийх болно, энэ нь та дотооддоо юу ч суулгахгүйгээр гэрээ бичих, бүтээх, шалгах боломжтой хөтөч доторх хэрэгсэл юм.
Алхам 1 - TON Web IDE-г нээнэ үү
- https://ide.ton.org руу очно уу.
- Шинэ төсөл үүсгэх дээр дарна уу. Попап цонхонд:
- Хэл нь Tact дээр байгаа эсэхийг шалгаарай.
- Загвар болгон хоосон гэрээг сонгоно уу.
- Төслөө
VotingContract
гэх мэтээр нэрлэ. - + Үүсгэх дээр дарна уу.
Алхам 2 – Санал өгөх гэрээний кодыг бичих
Төслөө үүсгэсний дараа main.tact
файлыг нээнэ үү. Та бойлер хавтангийн тохиргоог харах болно:
// Import the Deployable trait so the contract can be deployed easily import "@stdlib/deploy"; contract BlankContract with Deployable { init() { } }
-
import "@stdlib/deploy";
байршуулахад шаардлагатай бөгөөд кодноос хасагдах ёсгүй. -
BlankContract
нь орлуулагчийн нэр юм. -
init()
блок нь гэрээг байршуулах үед зөвхөн нэг удаа ажилладаг бөгөөд төлөвийн хувьсагчдыг эхлүүлэхэд ашиглагддаг.
Одоо бид өөрсдийн кодыг гаргацгаая.
Эхлээд бид санал өгөх мессежийн бүтцийг тодорхойлно.
// Import the Deployable trait so the contract can be deployed easily import "@stdlib/deploy"; // Define a message structure for voting message Vote { candidate: Int as uint32; // 1 = Alice, 2 = Bob }
Энэ бол санал өгөх мессеж юм. Хэн нэгэн санал өгөхийг хүсвэл гэрээнд дараах дугаарыг агуулсан мессеж илгээх болно.
- Алисад 1
- Бобын хувьд 2
Такт нь энэ бүтцийг ашиглан ирж буй саналыг боловсруулж, аль нэр дэвшигч оноо авахыг шийддэг.
Дараа нь бид гэрээгээ байгуулж, нэр дэвшигч бүрийн саналыг бүртгэхийн тулд хоёр төлөвийн хувьсагчийг нэмнэ:
... contract VotingContract with Deployable { // State variables to track votes votesAlice: Int as uint32; votesBob: Int as uint32;
Гэрээнд бид хоёр хувьсагчийг тодорхойлсон:
-
votesAlice
: Алисын авсан саналын тоог хадгалдаг. -
votesBob
: Бобын авсан саналын тоог хадгалдаг.
Одоо бид гэрээг анх байршуулах үед эхлэх төлөвийг тохируулахын тулд init
блок дотор саналын тооллогыг тэг болгон эхлүүлэх болно.
init() { self.votesAlice = 0; self.votesBob = 0; }
init
блок нь гэрээ ашиглалтад орсны дараа зөвхөн нэг удаа ажилладаг бөгөөд саналын тоог хоёуланг нь тэг болгож тохируулдаг.
Одоо логик гарч ирнэ. Санал өгөхдөө хэний төлөө санал өгч байгааг шалгаж, саналын зөв тооллогыг нэмэгдүүлэхийг гэрээгээр хүсч байна.
// Handle vote messages receive(msg: Vote) { if (msg.candidate == 1) { self.votesAlice += 1; } else if (msg.candidate == 2) { self.votesBob += 1; } }
Тиймээс санал авах үед:
- Хэрэв
msg.candidate
1 бол бидvotesAlice
дээр +1 нэмнэ - Хэрэв
msg.candidate
2 болvotesBob
дээр +1 нэмнэ
Эцэст нь бид гэрээний төлөвийг өөрчлөхгүйгээр хэн нэгэнд нэр дэвшигч бүрийн саналын тоог асуух боломжийг олгохын тулд хүлээн авагч функцийг бий болгоно.
// Getter for Alice's votes get fun getVotesForAlice(): Int { return self.votesAlice; } // Getter for Bob's votes get fun getVotesForBob(): Int { return self.votesBob; } }
Эдгээр хоёр хүлээн авагч функц нь гэрээнд ямар нэгэн өөрчлөлт оруулалгүйгээр нэр дэвшигч бүрийн авсан саналын тоог шалгах боломжийг олгодог. Энэ нь зөвхөн уншихад зориулагдсан үйлдэл юм.
Санал өгөх гэрээний бүрэн кодыг доор харуулав.
import "@stdlib/deploy"; // Define a message structure for voting message Vote { candidate: Int as uint32; // 1 = Alice, 2 = Bob } contract VotingContract with Deployable { // State variables to track votes votesAlice: Int as uint32; votesBob: Int as uint32; init() { self.votesAlice = 0; self.votesBob = 0; } // Handle vote messages receive(msg: Vote) { if (msg.candidate == 1) { self.votesAlice += 1; } else if (msg.candidate == 2) { self.votesBob += 1; } } // Getter for Alice's votes get fun getVotesForAlice(): Int { return self.votesAlice; } // Getter for Bob's votes get fun getVotesForBob(): Int { return self.votesBob; } }
Алхам 4 – Гэрээг байгуулж, байршуулах
- Зүүн талын самбар дээрх Build & Deploy дээр дарна уу
- Environment хэсэгт Sandbox-г сонгосон эсэхийг шалгана уу.
- main.tact сонгосон эсэхийг шалгаад Build дээр дарна уу. Энэ нь таны гэрээг эмхэтгэж, кодонд синтаксийн алдаа, асуудал байгаа эсэхийг шалгах болно.
- Дараа нь, өгөгдмөл орлуулагч биш, таны бодит гэрээ учраас унадаг жагсаалтаас VotingContract-г сонгосон эсэхийг шалгаарай. Хэрэв танд харагдахгүй бол Ctrl + S дарж файлаа хадгалснаар IDE шинэчлэгдсэн гэрээг илрүүлэх боломжтой.
- Дараа нь ReDeploy дээр дарна уу. Хэрэв бүх зүйл зөв ажиллаж байвал та бүртгэлд таны гэрээг Sandbox дээр амжилттай байршуулсан тухай баталгаажуулах мессежийг харах болно.
Алхам 5 - Гэрээтэй харилцах
Байрлуулсны дараа доош гүйлгээд хоёр хэсгийг харах болно:
- Хүлээн авагч:
getVotesForAlice
,getVotesForBob
- Хүлээн авагчид:
Vote
Санал өгөхдөө: Санал өгөх хэсэгт candidate
оруулах талбарт 1
гэж оруулаад Илгээх дээр дарна уу. Та дөнгөж сая Алисын төлөө саналаа өглөө! Та илүү олон санал өгөхийн тулд үүнийг давтаж болно.
Саналын тооллогыг шалгахын тулд : getVotesForAlice
доор байрлах Дуудлага дээр дарж, бүртгэлийн самбарыг шалгаад саналын тоог харна уу.
-
candidate
талбарт2
илгээж Бобын хувьд ижил зүйлийг хий, дараа ньgetVotesForBob
шалгана уу
Туршилтын үеэр би Алис руу 9 удаа , Бобд 6 удаа санал өгсөн бөгөөд хүлээн авагчийн функцууд яг үүнийг харуулсан.
💭 Эцсийн бодол: Үргэлжлүүлэн бүтээж, эрэл хайгуул
🙌 Хэрэв та бүрэн уншсан бол баяр хүргэе!
Одоо та энгийн санал өгөх гэрээ Tact дээр хэрхэн ажилладгийг харсны дараа та TON дээр ухаалаг гэрээг хөгжүүлэх анхны алхамаа хийлээ. Энэ гэрээ нь үндсэн байж болох ч бүтэц, үзэл баримтлал нь илүү төвөгтэй логикт хамаарна.
Хэрэв та туршилтаа үргэлжлүүлэхийг хүсвэл энэ гэрээг сунгах эсвэл https://tact-by-example.org/all хаягаас урьдчилан бэлтгэсэн бусад загваруудыг судалж үзээрэй. TON Web IDE нь янз бүрийн хэрэглээний тохиолдлуудыг туршиж үзэхэд хялбар болгодог бөгөөд энэ нь танд илүү хурдан бүтээх, сурахад туслах загваруудтай ирдэг.
Тиймээс үргэлжлүүлээрэй, өөрчил, туршиж, илүү сайн зүйлийг бүтээ.