# Танилцуулга

TEO блокчэйн нь нийтийн блокчэйн сүлжээ бөгөөд хурдан, шимтгэл бага, аюулгүй Proof-of-Stake концесс протоколд суурилсан олон нийтийн блокчэйн сүлжээ юм.

Онцлогууд:

* Тархмал буюу төвлөрсөн бус
* [Нээлттэй эхийн](https://github.com/teo-mn/go-corex)
* Ethereum virtual machine дэмждэг


# Блокчэйн гэж юу вэ?

## Блокчэйн технологи

Блокчэйн гэдэг нь нэгэн төрлийн өгөгдлийн сан бөгөөд блокчэйнийг ойлгохын тулд эхлээд өгөгдлийн сангийн талаар ойлгох нь чухал юм. Өгөгдлийн сан нь цахим хэлбэрээр компьютерын системд хадгалсан мэдээллийн цуглуулга юм. Өгөгдлийн санд байрлах мэдээлэл эсвэл өгөгдлийг ихэвчлэн хүснэгтээр илэрхийлдэг бөгөөд энэ нь мэдээлэл хайх болон шүүхэд илүү амар болгодог байна. Тэгвэл хэн нэгэн мэдээллээ өгөгдлийн санд хүснэгтэн хэлбэрээр байршуулахаас юугаараа ялгаатай вэ?

> ### Хадгалах бүтэц
>
> Энгийн өгөгдлийн сан ба блокчэйн сангийн гол ялгаа нь өгөгдөл хадгалах бүтэц юм. Блокчэйн нь мэдээллүүдийг нэг багц болгон хадгалах буюу БЛОК болгон хадгалдаг. Блок бүр нь тодорхой хэмжээтэй байх бөгөөд тухайн блок дүүрмэгц өмнөх баталгаажсан блокийн араас гинжлэн хадгалдаг. Иймд бүх блокчэйн нь өгөгдлийн сан боловч бүх өгөгдлийн сан нь блокчэйн биш гэдгийг харуулж байна. Мөн блокчэйн нь төвлөрсөн бус буюу тархмал хэлбэртэй тул өгөгдлийг эргэлт буцалтгүй цаг хугацааны цуваанд оруулж байдаг. Гинжин хэлхээнд шинээр блок бичигдэх бүрт нарийвчилсан цаг бүртгэдэг ба энэ нь мөн блокчэйндээ хадгалагддаг.

> ### Тархмал шинж
>
> Блокчэйн нь блокуудыг зөвхөн нэг тоглогчийн серверт хадгалдаггүй бөгөөд зөвшилцлийн үндсэн дээр хэдэн зуугаас хэдэн мянган компьютерт хувилан байршуулдаг. Харин блокийг шинээр үүсгэхдээ тухайн блок үнэн зөв болохыг сайтар баталгаажуулсны эцэст блокчэйн рүү бичдэг ба баталгаажуулагч нь мөн олон эсвэл зөвшилцлийн дагуу сонгогддог. Иймд хэн нэгэн ганцаараа бүх мэдээллийг эзэмшиж давамгай байдал бий болгох, хэн нэгэн ганцаараа шинэ блок үүсгэх боломжгүй юм.

> ### Ил тод, тунгалаг
>
> Блокчэйн нь тархмал шинж чанар, онцлогтой тул нээлттэй блокчэйн дээр бичигдэж байгаа бүхий л мэдээлэл, гүйлгээ ил тод буюу шилэн байдаг

Саяхныг хүртэл аливаа критик мэдээллийг (тухайлбал эд хөрөнгө, санхүү, бүртгэлтэй холбоотой мэдээлэл) төвлөрсөн байдлаар хадгалж, хамгаалж ирсэн. Гэхдээ ийм төвлөрсөн системийн сул талууд цөөнгүй ажиглагдсан бөгөөд бүртгэлийн дэвтрийг тархмал, аливаа давуу эрхтэй төвлөрсөн зангилаа байхгүйгээр peer-to-peer (ижил түвшний зангилаа хооронд) байдлаар зохион байгуулах, ингэхдээ мэдээллийн ил тод, цор ганц, бүрэн бүтэн байдал, зангилаа бүрийн тэгш эрхийг хангах зэрэг нь тулгамдсан асуудал болон хувирсан юм.

2008 онд Сатоши Накамото хэмээх хүн (магадгүй бүлэг хүмүүс) дээрх асуудлыг криптографийн алгоритмууд болон peer-topeer мэдээлэл солилцох технологиудыг ашиглан оригинал аргаар шийдсэн байдаг. Ингэхдээ бүртгэлийн дэвтрээ (Ledger) цаг хугацааны хувьд ижил хэмжээний блокуудад хувааж, hash-лаж (мэдээллийн бүрэн бүтэн байдлыг илэрхийлдэг "лац"), хооронд нь гинжилж өгсөн. Үүнийгээ блокчэйн гэж нэрлэсэн.&#x20;

Шинэ блок үүсгэхдээ майнер гэж нэрлэгдэх зангилаануудаар крифтографийн бодлого бодуулсан ба хэн түрүүлж бодсон нь шинэ блокийг hash-лаж, системээс шагнал авдаг байхаар зохион байгуулсан. Энэхүү зөвшилцлийн (consensus) алгоритмыг proof-of-work гэж нэрлэдэг. С.Накамото энэхүү системээ Биткойн хэмээн нэрлэсэн.&#x20;

Тун удалгүй 2014 онд Виталий Бутерин, Гэвин Вүд тэргүүтэй программистууд блокчэйн дээр программ ч бичиж болох юм гэсэн санаа гаргасан нь энэ салбарын хоёр дах том үсрэлт болсон байдаг. Ингэхдээ тэд Ethereum Virtual Machine-ийг зохион бүтээж Solidity хэмээх программчлалын хэл гаргасан. Ethereum дээр бичигдсэн программуудыг smart contract (эсвэл Dapp) хэмээн нэрийдсэн.&#x20;

Өдгөө дэлхий дээр өөр өөрийн онцлогтой маш олон төрлийн блокчэйн ажиллаж байна. Блокчэйн технологи нь аливаа давуу эрхт зангилаа байхгүй, бүгд ижил түвшний, тархмал, ил тод, мэдээллийн бүрэн бүтэн байдал нь найдвартай хамгаалагдсан зэрэг олон давуу талыг үүсгэдэг учраас аж үйлдвэрийн 4-р хувьсгалын том ололт, тренд гэж тэргүүлэх өндөр хөгжилтэй орнуудад үнэлж байна.&#x20;

Өгөгдөл ил тод, аюулгүй, хэн нэгэн дураараа өөрчлөх боломжгүй болсноор олон улсад банк санхүү, даатгал, эрүүл мэнд, боловсрол, хөдөө аж ахуй, эм үйлдвэрлэл, цахим худалдаа, машин үйлдвэрлэл, тээвэр ложистик зэрэг бизнесийн байгууллагууд, засгийн газар, төрийн үйлчилгээ үзүүлэгч газрууд блокчэйн бүртгэлийн системийг өргөнөөр ашиглаж байна. Блокчэйн бүртгэлийн системийг ашигласнаар байгууллага хоорондын тооцоо нийлэх, хяналтын процессыг хялбаршуулах, цагНийтийн блокчэйн сүлжээ​ хугацааг хэмнэх болон цаасан баримтыг халах зэрэг эдийн засгийн үр ашгийг дээшлүүлж, бүтээмжийг нэмэгдүүлэх ашиг тустай.

## Арай энгийнээр!

Мэдээж блокчэйн гэдгийг технологийн онцлог талаас нь тайлбарлавал маш нарийн, төвөгтэй боловч агуулга нь маш энгийн.

Блокчэйн гэдэг нь сүлжээнд бичигдэж буй мэдээллийг хакердах, өөрчлөх болон булхайцах боломжгүйгээр хадгалах, бүртгэх боломжийг олгодог дэд бүтэц юм. Үндсэндээ сүлжээнд оролцож буй бүхий л компьютер болон сүлжээний хэрэглэгчдийн тусламжтай тухайн мэдээллийг тараан байршуулж баталгаажуулах цахим (дижитал) бүртгэлийн дэд бүтэц юм. Тийм ч учраас төвлөрсөн бус буюу тархмал дэд бүтэц гэдгээрээ онцлог юм.

## Блокчэйний төрлүүд

### Нийтийн блокчэйн​

Нийтийн блокчэйн нь хамгийн өргөн хэрэглэгддэг төвлөрсөн бус сүлжээ бөгөөд мэдээж нээлттэй учир хүссэн бүхэн сүлжээнд оролцох боломжтой юм. Эдгээр сүлжээний томоохон жишээ нь Биткойн, Этериум сүлжээ юм. Сүлжээнд хэн ч оролцон мэдээлэл оруулах, лавлах боломжтой бөгөөд эдгээр мэдээллүүд нь сүлжээн дахь Node-үүдээр баталгааждаг.​&#x20;

Давуу тал:​

* Тархмал буюу төвлөрсөн бус​
* Ил тод​
* Хүссэн тоглогч бүр сүлжээнд оролцох боломжтой​

Сул тал:​

* Хувийн блокчэйнтэй харьцуулахад баталгаажуулах хурд удаан​

![](https://1406593324-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2WNiOcpRFxBUrofQV1sz%2Fuploads%2FRzx7LmApAeg4DXgRUjtj%2FScreenshot%20from%202022-01-31%2016-46-39.png?alt=media\&token=2a8b236d-f35e-443a-8c04-016a74e6c8ee)

### Хувийн буюу зөвшөөрөлт блокчэйн​

Аж ахуй нэгжүүд голчлон хувийн буюу зөвшөөрөлт блокчэйн ашигладаг бөгөөд блокчэйнээр дамжуулан мэдээллээ хадгалах оролцогч аж ахуй нэгжүүд хоорондоо хялбар бөгөөд найдвартай аргаар мэдээллээ солилцоход голлох үүрэг гүйцэтгэдэг байна.​

Давуу тал:​

* Өргөтгөх боломж​
* Оролцогч хооронд тусгайлсан сүлжээ үүсгэх​
* Хурд​
* Дата удирдлага​

![](https://1406593324-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2WNiOcpRFxBUrofQV1sz%2Fuploads%2FbxITtrHq0BKUHcjKlqM6%2FScreenshot%20from%202022-01-31%2016-49-18.png?alt=media\&token=b685f3b5-1213-45d4-882c-ec8c83ca22fe)

## Нийтийн блокчэйн сүлжээ​

### Византын алдаа​

Нийтийн блокчэйнд мэдээллийн санг (distributed ledger) гол хөтөлж явдаг тоглогчдийг miner эсвэл validator хэмээн нэрлэдэг. Эдгээр нь сүлжээний бүх оролцогч хоорондын гүйлгээг бүртгэх, мэдээллийн бүрэн бүтэн, ил тод байдлыг хангаж ажиллах ёстой. Хэрэв аль нэгэн майнер санаатай болон санаандгүй “алдаа” гаргаж тархмал мэдээллийн санд зөрүү үүсвэл бусад “шударга” майнерууд ямар нэгэн дүрмийн дагуу зөвшөлцөлд орж мэдээллийн санг цор ганц утгатайгаар сэргээх чадвартай байх ёстой. Үүнийг зөвшилцлийн алгоритм гэдэг. Санаатайгаар гаргасан алдааг Византийн алдаа (Byzantine fault) гэдэг. ​

### Византын алдаанд тэсвэртэй байдал

Тархмал системд Византийн алдаанд тэсвэртэй (BFT, Byzantine fault tolerant) зөвшилцлийн алгоритмүүдийг эртнээс судлаж, санал болгож ирсэн. Жишээ нь L.Lamport, F.Schneider зэрэг эрдэмтдийн 1989 онд санал болгож байсан “Paxos” алгоритм нь Google Spanner, IBM SAN Volume Controller, Neo4j граф мэдээллийн сан зэрэгт өдгөө хүртэл ашиглагдаж ирсэн. Тун удалгүй M.Castro, B.Liskov нар 1999 “Practical BFT” хэмээх хурдтай, хоцролт багатай алгоритм зохиосон. Энэ алгоритмаас салаалсан олон хувилбарууд өдгөө өргөн ашиглагдаж байна. Жишээ нь Hyperledger Indy-н “rBFT”, Hyperledger Burrow болон Tendermint блокчэйны “Tendermint” г.м.​

### Proof-of-Work

Дээр дурдагдсан зөвшилцлийн алгоритмүүд нь сүлжээнд leader сонгодог, мөн синхрон алгоритмууд юм. Энэ нь тухайн блокчэйныг бага хэмжээгээр төвлөрсөн болгодог сул талтай. 2008 онд S.Nakamoto-н санал болгосон PoW алгоритм нь лидергүй, асинхрон зөвшилцлийн алгоритм юм. PoW нь лидерийг санамсаргүйгээр сонгодог. Тодруулбал майнерүүдийг өгөгдсөн хүндрэлийг (шинэ блокийн hash утганд байх 0-н тоо) хангах nonce олохын төлөө уралдуулдаг. Үүний тулд майнерууд nonce хэмээх тоог өөрчилж олон дахин SHA256 hash бодохоос өөр арга болдог. ​

Түрүүлсэн майнер nonce -оо зарлаж сүлжээнээс шагнал авдаг. PoW алгоритмд уралдаанд түрүүлэхийн тулд майнерууд маш өндөр hash бодох хүчин чадал бүхий хардвар, цахилгаан энерги зарцуулдаг. Энэ нь системийг удаан, өндөр зардалтай болгодог. Nakamoto -н PoW алгоритмын бас нэгэн сул тал finality байхгүй. Өөрөө хэлбэл мэдээллийн санг өндөр тооцоолон бодох чадвар бүхий майнер өөрчлөх магадлал бага ч гэсэн байдаг.​

### Proof-of-Stake

PoW-д сүлжээнд холбогдсон бүх майнерууд хамгийн шинэ, зөв блокыг түрүүлж олж ашиг олохын тулд нэг ижил бодлого бодож маш их эрчим хүч зарцуулдаг нь байгаль орчинд сөрөг нөлөө үзүүлэхүйц түвшинд хүрээд байгаа. Энэ асуудлыг оновчтой шийдэх нэг арга нь PoS (proof-of-Stake) юм. Уг PoS алгоритмийн гол санаа нь сүлжээний майнерууд хоорондоо өрсөлдөх биш харин бүгд хамгийн шинэ, зөв блокыг баталгаажуулахад хувь нэмрээ оруулан өөрсдийн царцаасан койны хэмжээтэй пропорционалиар ашиг хүртдэг юм.&#x20;

PoS нь PoW-тай харьцуулахад тоног төхөөрөмж болон цахилгааны зардал бага, нэг секундэд гүйцэтгэх гүйлгээний тоо (TPS, transaction per second) нь өндөр байдаг. PoS-д үүсэх “grinding attack” эсвэл “nothing to stake attack”-уудаас сэргийлэх үүднээс Delegated PoS алгоритмүүд өргөн хэрэглэгдэж байна. Тухайлбал Lisk, EOS, Ark г.м. блокчэйныг дурдаж болно.​


# TEO блокчэйн

## TEO блокчэйн сүлжээ товчоор​

TEO блокчэйн нь олон нийтийн болон хувийн гэсэн хоёр төрлийн блокчэйн сүлжээнээс бүрдэнэ. Олон нийтийн сүлжээ нь нээлттэй өгөгдөлд суурилсан тархмал санхүүгийн бүтээгдэхүүн (defi, dApps)-ийг хөгжүүлэхэд чиглэсэн байна.

Харин хувийн сүлжээ нь төр эсвэл хувийн хэвшлийн байгууллагууд хоорондоо зөвшилцөлд хүрэн мэдээлэл хуваалцах, өгөгдлийн нууцлал болон эрхийн зохицуулалт хийх, боловсруулалтын зардал хэмнэх зорилготой энтерпрайс түвшний сүлжээ байна. ​

## Олон нийтийн блокчэйн

Олон нийтийн сүлжээг ашиглан дараах үйлчилгээг үзүүлнэ:​

* Энгийн токен үүсгэх​
* Хөрөнгөөр баталгаажсан токен үүсгэх​
* NFT үүсгэх​
* Хөгжүүлэгчдэд Decentralized Application зохион бүтээх​
* Ухаалаг гэрээ ашиглах​
* Validator болж сүлжээнд оролцох&#x20;

### TEO концесс алгоритм ​

Бид TEO блокчэйнд DAG болон PoS-г хослон ашигласан. Манай систем нь лидергүй ба асинхрон (aBFT) ажиллаж чаддагаараа бусад зөвшилцлийн алгоритмуудаас ялгаатай. Византын validator нь нийт validator-н гуравны нэгээс эрс цөөн тохиолдолд TEO сүлжээ зөвшилцөлд хүрнэ.

### TEO ухаалаг гэрээ&#x20;

Олон улсад хамгийн түгээмэл ашигладаг ухаалаг гэрээний платформ бол эфериум юм. Эфериумын сайтар үүссэн холбоо, хөгжүүлэгчдийн мэдлэг, бэлэн болсон аппликейшин, хялбар хөгжүүлэх боломж зэрэг давуу талыг ашиглахын тулд корэкс экосистем эфериум виртуал машиныг дэмжнэ. Мөн Web3JS api болон RPC протоколоор блокчэйн node-тэй харьцах учир хялбараар тархмал аппликейшн хөгжүүлэх боломжийг олгоно.​

TEO сүлжээ нь Эфериум виртуал машин бүрэн дэмжих учир ухаалаг гэрээг Solidity программчлалын хэл дээр хийнэ. Түүнчлэн эфериум дэд бүтцийн бүх хэрэгсэлийг (Trufle, Ganache) ашиглаж болно гэдгээрээ давуу талтай юм. ​

### Токеномикс​

|    |                                                                                                                |                |
| -- | -------------------------------------------------------------------------------------------------------------- | -------------: |
| 1​ | IEO​                                                                                                           |  2,000,000,000 |
| ​  | a. Олон нийтэд санал болгох​                                                                                   |  1,000,000,000 |
|    | <p>b. Стратегийн хөрөнгө оруулагч буюу блокчэйн​ сүлжээнд оролцогч​</p><p>​</p><p>Түгжих хугацаа: 3 жил​</p>   |  1,000,000,000 |
| 2​ | Олон улс дахь бүртгэл (listing)​                                                                               |  3,500,000,000 |
| 3​ | <p>Төслийн эзэмшигчид​</p><p>​</p><p>Түгжих хугацаа: 5 жил байх бөгөөд эхний 2 жилдээ зарцуулах боломжгүй​</p> |  1,500,000,000 |
| 4​ | Биржийн урамшуулал, бэлэг /Referral, Airdrop/​                                                                 |    150,000,000 |
| 5​ | Крипто хадгаламжийн өгөөж /Staking/​                                                                           |  2,850,000,000 |
|    | Нийт койны тоо​                                                                                                | 10,000,000,000 |

![](https://1406593324-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2WNiOcpRFxBUrofQV1sz%2Fuploads%2FdGhJgebKB5ClaKRsOndh%2FScreenshot%20from%202022-01-31%2017-43-11.png?alt=media\&token=7c49a1f5-1816-412f-894f-48c5749ee865)


# Сүлжээнд холбогдох

### Сүлжээнд холбогдох Node

TEO блокчэйн дээр ухаалаг гэрээ, dApp, NFT зэргийг хөгжүүлэхэд сүлжээнд холбогдох шаардлага зайлшгүй гарна. Хэрэглэгч сүлжээнд холбогдохдоо дараах 2 аргаар холбогдож болно.

> #### **Өөрийн төхөөрөмж дээрээ корэкс блокчэйний node-ий програм ажиллуулж холбогдох.**
>
> Ингэхийн тулд танд програмчлалын буюу техникийн мэдлэг хэрэгтэй ба зааврыг [эндээс](/general/network-connection/mainnet) харж болно. Бирж эсвэл өндөр түвшний ухаалаг гэрээ хөгжүүлэгчдэд зохимжтой.

> #### Хэдийн ассан нээлттэй node ашиглах.
>
> Node асааж цаг алдах хэрэггүй жижиг dApp, ухаалаг гэрээ хөгжүүлэгчдэд илүү зохимжтой. \
> [https://node.teo.mn/](https://node.corexchain.io/) , [https://node-testnet.teo.mn/](https://node-testnet.corexchain.io/) URL-уудаар JSON-RPC хүсэлт шууд тавьж ашиглаж болно.

### Node-тэй харьцах

TEO блокчэйн нь эфериумын JSON-RPC 2.0 протоколыг дэмждэг.  JSON-RPC нь блокчэйний node-тэй JSON форматын өгөгдлөөр харьцдаг, хөнгөн хурдтай протокол юм. JSON-RPC - ийн талаар илүү дэлгэрэнгүйг эфериумын [вики](https://eth.wiki/json-rpc/API) хуудсаас уншаарай.

Жишээ болгож нийт блокын тоог авах хүсэлтийн коммандыг ажиллуулж үзье.

#### Request:

```shell
curl --location --request POST 'https://node.teo.mn' \
--header 'Content-Type: application/json' \
--data-raw '{
    "jsonrpc": "2.0",
    "method": "eth_blockNumber",
    "params": [],
    "id": 1
}'

# эсвэл

curl --location --request POST 'http://localhost:18545' \
--header 'Content-Type: application/json' \
--data-raw '{
    "jsonrpc": "2.0",
    "method": "eth_blockNumber",
    "params": [],
    "id": 1
}'
```

#### Response:

```json
{
    "jsonrpc":"2.0",
    "id":1,
    "result":"0x6c52"
}
```


# Mainnet Node асаах

### Ерөнхий мэдээлэл

Name:           TEO Mainnet\
Chain Id:       1104\
genesis file:  <https://github.com/teo-mn/releases/blob/main/genesis/mainnet.g>\
Explorer:       <https://explorer.teo.mn>\
Wallet:           <https://wallet.corexchain.io/>

### go-corex програм

TEO блокчэйнтэй холбогдоход go-corex нэртэй node-ий програмыг өөрийн компьютер дээр  компайл хийж ажиллуулах шаардлагатай. Эх кодыг [эндээс](https://github.com/teo-mn/go-corex) авах боломжтой.

### Шаардалагатай хэрэгслийг суулгах

`go-corex`-ыг кодоос компайлдахын тулд дараах хөгжүүлэгч хэрэгслийн цуглуулгыг суулгана

```
sudo apt install -y build-essential
```

#### Go суулгах

Бидэнд дор хаяж `go1.14` хувилбар шаардлагатай.

go package-ыг татаж авна.&#x20;

```
wget https://golang.org/dl/go1.17.3.linux-amd64.tar.gz
```

root хэрэглэгчээр go package-ыг задална.

```shell
sudo su
rm -rf /usr/local/go && tar -C /usr/local -xzf go1.17.3.linux-amd64.tar.gz
```

Задалсны зараагаар `go` системийн замд оруулахын тулд `/etc/profile` эсвэл `~/.bashrc` файлуудын төгсгөлд дараах кодыг хуулж тавьж ажиллуулна.

```
export PATH=$PATH:/usr/local/go/bin
```

Уг өөрчлөлтийг хэрэгжүүлэхийн тулд та терминалаа хаагаад нээх эсвэл дараах кодыг ажиллуулна уу.

```
. /etc/profile 
# эсвэл
. ~/bashrc
```

go суусан эсэхийг баталж үзэхдээ дарах командыг терминалаас ажиллуулна уу.

```
go version
```

#### go-corex суулгах

`go-corex` сүлжээний кодыг github-аас татаж компайлдана.

```shell
git clone https://github.com/teo-mn/go-corex.git
cd go-corex
make
```

Хэрэв амжилттай компайл хийгдсэн бол дараах байдлаар та хувилбарыг харах боломжтой.

```shell
./build/corex help
```

### Node ажиллуулах

Node асаахын тулд бидэнд genesis файл хэрэгтэй. Genesis файл нь корэкс блокчэйний шинж чанарыг агуулсан хамгийн анхын блок юм. Үүнээс хойш үүсэх блокууд нь  genesis блок дээр үүссэн дүрмийн дагуу үүсдэг.

```shell
cd build
# genesis файл татах
wget https://github.com/teo-mn/releases/raw/main/genesis/mainnet.g
# ажиллуулах
./corex --genesis mainnet.g
```

#### JSON-RPC нээх

JSON-RPC нээх болон WebSocket нээх сонголтыг `go-corex` ажиллуухдаа сонгох боломжтой.

```
./corex --genesis mainnet.g --rpcvhosts=* --http --http.corsdomain="*" --http.addr=0.0.0.0 --http.corsdomain='*' --http.api="crx,eth,admin,web3,personal,net,txpool,sfc"
```


# Testnet Node асаах

### Ерөнхий мэдээлэл

Name:           TEO Testnet\
Chain Id:       3305\
genesis file:  <https://github.com/teo-mn/releases/blob/main/genesis/testnet.g>\
Explorer:       <https://explorer-testnet.teo.mn/>\
Wallet:           <https://wallet-testnet.corexchain.io/>

### Ажилуулах заавар

Ажиллуулахын өмнө [энэ](/general/network-connection/mainnet#shaardalagatai-kheregsliig-suulgakh) зааврыг дагаж шаардлагатай хэрэгслийг суулгаарай.

```shell
# genesis файл татах
wget https://github.com/corex-mn/releases/raw/main/genesis/testnet.g
# ажиллуулах
./corex --genesis testnet.g
```

### Тест сүлжээний койн авах

Тест сүлжээнд [faucet](https://faucet.teo.mn) сайтаас хаягаа оруулж 5 минут тутам 10 CRX -ээр цэнэглэх боломжтой.

![Faucet](https://1406593324-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2WNiOcpRFxBUrofQV1sz%2Fuploads%2FRYEDBnEBkuii1FeosYzK%2FScreenshot%20from%202022-01-28%2015-16-54.png?alt=media\&token=ca2a4764-c685-47bc-ba76-03d035fc4b36)


# Валидатор болох (Mainnet)

Энэ хэсэгт Линукс үйлдлийн систем дээр Валидатор node ажиллуулахыг харуулна. Танд мэдээллийн технологийн мэргэжлийн мэдлэг, туршлага хэрэгтэй болохыг анхаарна уу!

## Валидаторын шаардлага

Та Валидатор node-ыг ажиллуулахдаа дараах шаардлагыг анхаарна уу!

1. Хамгийн бага барьцааны хэмжээ: 2,000,000 CRX дансандаа байршуулсан байх
2. Бусдын барьцаатай нийлэх дээд хязгаар: Өөрийн барьцаанаас 15 дахин их
3. Төхөөрөмжийн үзүүлэлт: 4 vCPUs (3.1 GHz), 16GiB RAM, багадаа 1TB SSD диск

Валидатор сервер унтрах нь танд хохиролтой тул үүлэн тооцооллыг сонгохыг зөвлөж байна. Энэ зааварт ubuntu-server ашигласан болно.

## Шаардагдах хэрэгслүүдийг суулгах

Та [энэ](/general/network-connection/mainnet#shaardalagatai-kheregsliig-suulgakh) зааврын дагуу node-ыг ажиллуулахад хэрэгтэй хэрэгслийг суулгаарай.

## Валидатор хаяг үүсгэх

TEO Валидатор node-ыг ажиллуулахаас өмнө эхлээд TEO энгийн node-ыг асааж, үүнтэйгээ харьцаж байж валидатор эрхийг бүртгүүлнэ. Дараах алхмаар `mainnet`-ын genesis файлыг татан авч `go-corex`-ыг ажиллуулснаар энгийн node асаж, корэкс сүлжээтэй шууд синхрон буюу сүлжээний бүх мэдээллийг дамжуулж эхэлнэ.

```shell
cd build
wget https://github.com/teo-mn/releases/raw/main/genesis/mainnet.g
./corex --genesis mainnet.g
```

![](https://1406593324-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2WNiOcpRFxBUrofQV1sz%2Fuploads%2FKCVZIPLKOd2FgroexjJt%2Fnode.png?alt=media\&token=86bff40c-397a-41b6-99fa-2568be46d398)

Таны node TEO сүлжээнд амжилттай холбогдсон бол `New event` гэсэн өгөгдлүүдийг хүлээн авч синхрончлох процессыг эхлүүлнэ.

![](https://1406593324-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2WNiOcpRFxBUrofQV1sz%2Fuploads%2FeaGsoDDWY67THfEaGxtF%2Fnode_sync.png?alt=media\&token=7a9b9452-2d36-4add-b4b0-d2eb84e69340)

### Валидатор хэтэвч үүсгэх

Бидний ажиллаж буй терминал дээр энгийн node ажиллаж эхэлсэн учраас бид SSH ашиглан валидатор сервертэйгээ нэмж холбогдоно. Сервертэй холбогдсоны дараагаар дараах командаар шинэ хэтэвч үүсгэнэ.

```shell
cd go-corex/build
./corex account new
```

![](https://1406593324-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2WNiOcpRFxBUrofQV1sz%2Fuploads%2F12avrQedtH8l6wtF6OAf%2Faccount_new.png?alt=media\&token=a537c1d0-f915-4525-af5b-f819640369a8)

&#x20;Дээрх командыг ажиллуулснаар танаас түлхүүрийг нууцлах нууц үгийг асуух болно. Энэ нууц үгийг та мартахгүй санах хэрэгтэй. Нууц үгээ мартсан тохиолдолд, эсвэл хэтэвч устсан тохиолдолд сэргээх боломжгүй гэдгийг хатуу анхаарна уу. Тиймээс аюулгүйн үүднээс та secret key file-д заагдсан зам, нэрээр үүсгэгдсэн файлыг хаа нэгтэй нөөцөлж авах нь зүйтэй. Уг файл доторх таны хувийн түлхүүр таны нууц үгээр хамгаалагдсан байх болно.

Зурагт үзүүлснээр `Public address of the key` хэсэгт таны түлхүүрийн хаяг байрлах болно. Энэхүү зургаас түлхүүрийн хаягийг албаар авч хаясан болно. Одоо та өөрийн хаягаа [www.corex.mn](http://www.corex.mn) биржээр орж дор хаяж 2,000,000CRX-р цэнэглэх ёстой. Нэмэлт гүйлгээний төлбөрт зориулж арай ихээр цэнэглэхээ мартуузай.

Одоо бид валидатор түлхүүрийг үүсгэх болно.

```shell
./corex validator new
```

![](https://1406593324-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2WNiOcpRFxBUrofQV1sz%2Fuploads%2FxfS8SZw5gfeAdBFmzPaC%2Fvalidator.png?alt=media\&token=6b27f4d6-2c50-48c9-9c6d-127b5b16bd7b)

&#x20;Дээрх командыг ажиллуулсны дараа танаас түлхүүрийг нууцлах нууц үгийг асууна. Энэ нууц үгийг та мартахгүй санах хэрэгтэй. Нууц үгээ мартсан тохиолдолд, эсвэл хэтэвч устсан тохиолдолд сэргээх боломжгүй гэдгийг хатуу анхаарна уу. Тиймээс аюулгүйн үүднээс та secret key file-д заагдсан зам, нэрээр үүсгэгдсэн файлыг хаа нэгтэй нөөцөлж авах нь зүйтэй. Уг файл таны нууц үгээр хамгаалагдсан байх болно.

## TEO валидатор бүртгүүлэх

TEO валидатор бүртгүүлэхдээ бид гүйлгээ хийж ухаалаг гэрээтэй харьцах тул дараах командаар JavaScript console-д орно.

```shell
./corex attach
```

![](https://1406593324-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2WNiOcpRFxBUrofQV1sz%2Fuploads%2FgrBKeX9JculDeNpnP6WY%2Fjs_console.png?alt=media\&token=1b0305cc-bdde-484b-ac3d-9218c2aa6b59)

&#x20;Уг console дээр `web3` гэж бичиж та хийж болох үйлдлүүдийг харах боломжтой.

Одоо бид TEO сүлжээнд суурилсан ухаалаг гэрээг ашиглан валидатор бүртгүүлэх болно. Эхлээд бидэнд уг гэрээний ABI хэрэгтэй. ABI-г эндээс [github](https://github.com/corex-mn/releases/blob/main/abi/sfc-abi.json) татаж аваарай.

```shell
abi = JSON.parse('Татаж авсан json тэкст')
```

ABI нь TEO-ийн албан ёсны ухаалаг гэрээний, JSON хэлбэрт байгаа [abi](https://en.wikipedia.org/wiki/Application_binary_interface). Одоо гэрээний хуулбарыг авчиръя. Уг албан ёсны ухаалаг гэрээ corex блокчейн дээр `0xc04e800000000000000000000000000000000cfc` хаяг дээр үүсгэгдсэн байдаг.

```shell
sfcc = web3.crx.contract(abi).at("0xc04e800000000000000000000000000000000cfc")
```

Хэрэв бүх зүйл амжилттай болсон бол одоо ухаалаг гэрээний функцийг дуудаж шалгаж үзье. `sfcc` гэж доторх үйлдлүүдийг харах боломжтой.

```shell
sfcc
# Хамгийн сүүлийн валидаторын ID. Алдаагүй бол 0-ээс их утга буцаана.
sfcc.lastValidatorID()
```

<div align="left"><img src="https://1406593324-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2WNiOcpRFxBUrofQV1sz%2Fuploads%2FCUMtju0BSknaQ4Ft5GQ3%2Fvalidator_id.png?alt=media&amp;token=f4b3d542-088e-46ac-8fb1-348cf724f4c9" alt=""></div>

&#x20;Хэрэв бүх зүйлүүд амжилттай болсон бол энд алдаа заах учиргүй. Хамгийн сүүлд бүртгүүлсэн валидаторын ID-ыг буцаана. Валидатор бүр дахин давхардахгүй ID-тай байдаг.

Мөн бид бусад валидаторуудын мэдээллийг эндээс харах боломжтой.

```shell
for (i = 1; i <= sfcc.lastValidatorID(); i++) { console.log(sfcc.getValidator(i)); }
```

Дээрх функцийг дуудсанаар та бусад бүх валидаторуудын барьцааны хэмжээ төлөв гэх мэт мэдээллийг харж байх ёстой.

Одоо валидатор үүсгэх гүйлгээг хийцгээе. Эхлээд гүйлгээ хийхэд бэлдэж хэтэвчээ нээе.

```shell
personal.unlockAccount("<таны хаяг>")
```

<div align="left"><img src="https://1406593324-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2WNiOcpRFxBUrofQV1sz%2Fuploads%2FdigMT3qvh6RFBqQnS6SW%2Funlock.png?alt=media&amp;token=261dc593-ad8c-4cc9-91fd-7866a9b1dcca" alt=""></div>

Дээрх командын `<таны хаяг>` хэсэг дээр `./corex account new` командаар буцаасан хаягийг тавина. Командыг ажиллуулахад түлхүүрийг онгойлгох нууц үгийг танаас асуух болно. Амжилттай болсон бол **true** утга буцаана.

Валидатораар бүртгүүлэхийн тулд гэрээний `createValidator` функцийг дуудна. Уг гүйлгээ 2,000,000CRX болон түүнээс дээш төлбөр шаардана.

```shell
tx = sfcc.createValidator("<таны нийтийн түлхүүр>", {from:"<таны хаяг>", value: web3.toWei("2000000.0", "crx")}) 
```

<figure><img src="https://1406593324-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2WNiOcpRFxBUrofQV1sz%2Fuploads%2FZYqoRE8yCxAvGeabrbvL%2FScreen%20Shot%202023-01-03%20at%2015.31.11.png?alt=media&amp;token=53709f32-1fff-43ab-be21-fa9f2337d45b" alt=""><figcaption></figcaption></figure>

Дээрх командын `<таны нийтийн түлхүүр>` хэсэгт `./corex validator new` командаар буцаасан `Public Key:` дээрх нийтийн түлхүүрийг хуулж тавина. **"0xPubkey" бүтэцтэй байх ёстой.** Харин `<таны хаяг>` гэдэг нь өмнөх командтай адилхан байх юм. `tx`-т валидатор үүсгэх гүйлгээний хаяг хадгалагдана. Энд бид 2,000,000CRX ашиглан валидатор бүртгүүлсэн бөгөөд та энэ хэмжээг ихэсгэх боломжтой. Одоо гүйлгээ аль хэдийн хийгдсэн бөгөөд гүйлгээ амжилттай болсон эсэхийг

```shell
crx.getTransactionReceipt(tx)
```

гэж харах боломжтой.

Одоо та албан ёсоор валидатор болсон бөгөөд өөрийн валидатор ID-аа дараах командаар харах боломжтой.

```shell
sfcc.getValidatorID("<таны хаяг>")
```

<div align="left"><img src="https://1406593324-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2WNiOcpRFxBUrofQV1sz%2Fuploads%2F4zio4OtoK5xROEwlQfqR%2Fvalidator_id.png?alt=media&amp;token=ac294d3a-2404-491a-a0e1-10e6859ffb51" alt=""></div>

**Анхааруулга**: Дээрх зурагт үзүүлсэн ID-г туршилтаар үүсгэсэн бөгөөд corex сүлжээн дээр ямар ч холбоогүй болно.

Та валидатор болоход барьцаанд тавьсан CRX-ын хэмжээг дараах үйлдлээр харах боломжтой.

```shell
sfcc.getStake("<таны хаяг>", "<таны Validator ID>")
```

<div align="left"><img src="https://1406593324-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2WNiOcpRFxBUrofQV1sz%2Fuploads%2FadAELjKHdpAmtL5y1vdN%2Fvalidator_stake.png?alt=media&amp;token=ff7fdfb8-89e5-4bab-bdf3-babedd63a1c9" alt=""></div>

Одоо та өөрийн node-ыг валидатор горимоор дахин асаах л үлдлээ.

## Валидатор node асаах

Одоо сүүлийн алхам үлдлээ. Та өөрийн серверийг валидатор горимоор ажиллуулах ёстой. Та өмнө ажиллуулсан энгийн node (SSH терминал) дээр очоод `ctrl + C` дарж зогсоогоод, дараах командаар валидатор горимоор ажиллуулах ёстой.

```shell
nohup ./corex --genesis mainnet.g --nousb --validator.id "Validator ID" --validator.pubkey "0xPubkey" --validator.password "password file" &
```

Дээрх командыг дуудахдаа та өөрийн валидатор ID, нийтийн түлхүүр, валидатор түлхүүрийн нууц үгийг агуулах файлыг зааж өгнө. Нууц үг текст хэлбэрээр файл дотор байрших шаардлагатай. Одоо таны node нь валидатор горимоор ажиллаж эхэллээ. Танд баяр хүргэе!


# Docker ашиглаж валидатор node ажиллуулах заавар

Энэ хэсэгт Docker Container дээр валидатор node ажиллуулах талаар тайлбарлана.

## Шаардагдах хэрэгслүүдийг суулгах

Энэхүү зааварт Docker програмийг Ubuntu үйлдлийн системтэй сервер дээр тохируулсан болно.

1. apt-ыг шинэчилж, Docker програмыг суулгахад хэрэглэгдэх програмуудыг суулгана.

```shell
sudo apt-get update

sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
```

1. Албан ёсны GPG түлхүүрийг нэмэх, програмын тогтвортой хувилбарыг татах санг нэмэх.

```shell
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
```

1. Дээрх командуудыг ажиллуулсны дараа таны компьютерт Docker програм суух орчин бүрдэнэ. Доорх командаар Docker болон түүнтэй холбоотой ажиллах програмуудыг суулгана.

```shell
sudo apt-get update

sudo apt-get install docker-ce docker-ce-cli containerd.io
```

1. Docker програм зөв суусан эсэхийг шалгаж `hello-world`-ийг ажиллуулъя.

```shell
docker run hello-world
```

1. Docker-compose програмыг суулгах.

```shell
 sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
```

1. Татсан програмыг ажиллуулах эрхийг олгох.

```shell
 sudo chmod +x /usr/local/bin/docker-compose
```

### Docker-compose ашиглаж corex -ийг асаах

1. Бидний бэлдсэн docker image -ийг татаж авах.

```shell
docker pull corexchain/corex
```

corexchain/corex-ийн тухай дэлгэрэнгүй мэдээллийг [эндээс](https://hub.docker.com/repository/docker/corexchain/corex) авна уу.

Үндсэн ubuntu үйлдлийн систем дээрх datadir гэсэн директорийг container-ийн /root/.corexchain гэсэн директортой холбож асаана. Хоёр директорийг холбож асааснаар бид өгөгдлөө алдагдхаас зайлс хийх, node-ийн өгөгдлийг зөөх боломжтой болно.

1. Corex Validator node-ыг ажиллуулахаас өмнө эхлээд corex энгийн node-ыг асааж, үүнтэйгээ харьцаж байж validator эрхийг бүртгүүлнэ. Дараах алхмаар `corex`-ыг ажиллуулснаар энгийн node асаж, corex сүлжээтэй шууд синхрон хийж эхлэх болно.

```shell
docker container run -v $(pwd)/datadir:/root/.corexchain:rw corexchain/corex ./corex --genesis /genesis/mainnet.g 
```

### Валидатор хэтэвч үүсгэх

Бидний ажиллаж буй терминал дээр энгийн node ажиллаж эхэлсэн учраас бид SSH ашиглан валидатор сервертэйгээ нэмж холбогдоно. Сервертэй холбогдсоны дараагаар дараах командаар шинэ хэтэвч үүсгэнэ.

```shell
docker container exec -it {CONTAINER ID} ./corex account new
```

&#x20;Дээрх командыг ажиллуулснаар танаас түлхүүрийг нууцлах нууц үгийг асуух болно. Энэ нууц үгийг та мартахгүй санах хэрэгтэй. Нууц үгээ мартсан тохиолдолд, эсвэл хэтэвч устсан тохиолдолд сэргээх боломжгүй гэдгийг хатуу анхаарна уу. Тиймээс аюулгүйн үүднээс та secret key file-д заагдсан зам, нэрээр үүсгэгдсэн файлыг хаа нэгтэй нөөцөлж авах нь зүйтэй. Уг файл доторх таны хувийн түлхүүр таны нууц үгээр хамгаалагдсан байх болно.

Зурагт үзүүлснээр `Public address of the key` хэсэгт таны түлхүүрийн хаяг байрлах болно. Энэхүү зургаас түлхүүрийн хаягийг албаар авч хаясан болно. Одоо та өөрийн хаягаа [www.corex.mn](http://www.corex.mn) биржээр орж дор хаяж 2,000,000CRX-р цэнэглэх ёстой. Нэмэлт гүйлгээний төлбөрт зориулж арай ихээр цэнэглэхээ мартуузай.

Одоо validator түлхүүрийг үүсгэе.

```shell
docker container exec -it {CONTAINER ID} ./corex validator new
```

&#x20;Дээрх командыг ажиллуулсны дараа танаас түлхүүрийг нууцлах нууц үгийг асууна. Энэ нууц үгийг та мартахгүй санах хэрэгтэй. Нууц үгээ мартсан тохиолдолд, эсвэл хэтэвч устсан тохиолдолд сэргээх боломжгүй гэдгийг хатуу анхаарна уу. Тиймээс аюулгүйн үүднээс та secret key file-д заагдсан зам, нэрээр үүсгэгдсэн файлыг хаа нэгтэй нөөцөлж авах нь зүйтэй. Уг файл таны нууц үгээр хамгаалагдсан байх болно.

## Валидатор бүртгүүлэх

Валидатор бүртгүүлэхдээ бид гүйлгээ хийж ухаалаг гэрээтэй харьцах тул дараах командаар JavaScript console-д орно.

```shell
docker container exec -it {CONTAINER ID} ./corex attach
```

&#x20;Уг console дээр `web3` гэж бичиж та хийж болох үйлдлүүдийг харах боломжтой.

Одоо бид корэкс сүлжээнд суурилсан ухаалаг гэрээг ашиглан валидатор бүртгүүлэх болно. Эхлээд бидэнд уг гэрээний ABI хэрэгтэй. ABI-г эндээс [github](https://github.com/corex-mn/releases/blob/main/abi/sfc-abi.json) авах боломжтой.

```shell
abi = JSON.parse('Татаж авсан json тэкст')
```

ABI нь Корэксийн албан ёсны ухаалаг гэрээний, JSON хэлбэрт байгаа [abi](https://en.wikipedia.org/wiki/Application_binary_interface). Одоо гэрээний хуулбарыг авчиръя. Уг албан ёсны ухаалаг гэрээ corex блокчейн дээр `0xc04e800000000000000000000000000000000cfc` хаяг дээр үүсгэгдсэн байдаг.

```shell
sfcc = web3.crx.contract(abi).at("0xc04e800000000000000000000000000000000cfc")
```

Хэрэв бүх зүйл амжилттай болсон бол одоо ухаалаг гэрээний функцийг дуудаж шалгаж үзье. `sfcc` гэж доторх үйлдлүүдийг харах боломжтой.

```shell
sfcc
# Хамгийн сүүлийн Validator-ын ID. Алдаагүй бол 0-ээс их утга буцаана.
sfcc.lastValidatorID()
```

&#x20;Хэрэв бүх зүйл амжилттай болсон бол энд алдаа заах учиргүй ба хамгийн сүүлд бүртгүүлсэн валидаторын ID -ыг буцаана. Валидатор бүр дахин давхардахгүй ID -тай байдаг.

Мөн бусад Validator-уудын мэдээллийг эндээс харах боломжтой.

```shell
for (i = 1; i <= sfcc.lastValidatorID(); i++) { console.log(sfcc.getValidator(i)); }
```

Дээрх коммандаар бусад бүх Валидаторын барьцааны хэмжээ төлөв гэх мэт мэдээллийг харуулна.

Одоо валидтор үүсгэх гүйлгээг хийцгээе. Эхлээд гүйлгээ хийхэд бэлдэж хэтэвчээ нээх хэрэгтэй.

```shell
personal.unlockAccount("<таны хаяг>")
```

Дээрх командын `<таны хаяг>` хэсэг дээр `./corex account new` командаар буцаасан хаягийг тавина. Командыг ажиллуулахад түлхүүрийг онгойлгох нууц үгийг танаас асуух болно. Амжилттай болсон бол **true** утга буцаана.

Валидатораар бүртгүүлэхийн тулд гэрээний `createValidator` функцийг дуудна. Уг гүйлгээ 2,000,000CRX болон гүйлгээний шимтгэлийг шаардана.

```shell
tx = sfcc.createValidator("<таны нийтийн түлхүүр>", {from:"<таны хаяг>", value: web3.toWei("1000000.0", "crx")}) 
```

Дээрх командын `<таны нийтийн түлхүүр>` хэсэгт `./corex validator new` командаар буцаасан `Public Key:` дээрх нийтийн түлхүүрийг хуулж тавина. Харин `<таны хаяг>` гэдэг нь өмнөх командтай адилхан байх юм. `tx`-т Validator үүсгэх гүйлгээний хаяг хадгалагдана. Энд бид 2,000,000CRX ашиглан validator бүртгүүлсэн бөгөөд та энэ хэмжээг ихэсгэх боломжтой. Одоо гүйгээ аль хэдийн хийгдсэн бөгөөд гүйлгээ амжилттай болсон эсэхийг

```shell
crx.getTransactionReceipt(tx)
```

гэж харах боломжтой.

Одоо та албан ёсоор валидатор болсон бөгөөд өөрийн валидатор ID-аа дараах командаар харах боломжтой.

```shell
sfcc.getValidatorID("<таны хаяг>")
```

**Анхааруулга**: Дээрх зурагт үзүүлсэн ID-г туршилтаар үүсгэсэн бөгөөд корэкс сүлжээнд ямар ч холбоогүй болно.

Та валидатор болоход барьцаанд тавьсан CRX-ын хэмжээг дараах үйлдлээр харах боломжтой.

```shell
sfcc.getStake("<таны хаяг>", "<таны Validator ID>")
```

Одоо та өөрийн node-ыг validator горимоор дахин асаах л үлдлээ.

## Валидатор node асаах

Одоо сүүлийн алхам үлдлээ. Та өөрийн серверийг валидатор горимоор ажиллуулах ёстой. Та өнмө ажиллуулсан энгийн node (Docker container) -ийг унтраана `docker container stop {CONTAINER ID}`, дараах `docker-compose.yaml` -ийг datadir / corex -ийн өгөгдөл байгаа газар үүсгэнэ.

```shell
# docker-compose.yaml
version: '3.9'
services:
  go-corex:
    image: corexchain/corex
    command: /corex --genesis /genesis/mainnet.g --validator.id=${VALIDATOR_ID} --validator.pubkey=${VALIDATOR_PUB_KEY} --validator.password=/passphrase 
    volumes:
      - $(pwd)/datadir:/root/.corexchain
      - $(pwd)/passphrase:/passphrase
    ports:
      - "5050:5050"
```

Дээрх командыг дуудахдаа та өөрийн валидатор ID, нийтийн түлхүүр, валидатор түлхүүрийн нууц үгийг агуулах файлыг зааж өгнө. Нууц үг текст хэлбэрээр файл дотор байрших шаардлагатай. Одоо таны node валидатор горимоор ажиллаж эхэллээ. Танд баяр хүргэе!


# Metamask холбох

### Метамаск гэдэг нь?

Метамаск нь крифтовалютаа хялбараар захиран зарцуулахад зориулагдсан цахим хэтэвч юм. Эфериум болон эфериум суурьтай блокчэйнүүд дээр шинээр хаяг үүсгэх, гүйлгээ хийх зэрэг үндсэн боломжуудтай. Chrome, Firefox, Brave, Edge вэб хөтөчүүд дээр Extenstion байдлаар эсвэл гар утсан дээрээ аппликэйшн суулгаж ашиглана. Extension хэлбэрээр суудаг тул бусад хэтэвч, dApp-уудтай хоршиж ажиллах боломжтой. ([Татах хаяг](https://metamask.io/download/))

### Метамаск  хэтэвчийг корэкс блокчэйнтэй холбох

Метамаск хэтэвчийн "Settings"->"Networks"->"Add Network" цэсээр орж дараах утгуудыг бөглөн корэкс блок чэйнийг холбоорой.

### Mainnet

**Network Name:**        TEO Blockchain Mainnet\
**New RPC URL:**           <https://node.teo.mn\\>
**Chain ID:**                      1104\
**Currency Symbol:**    CRX \
**Block Explorer URL:** <https://explorer.teo.mn>

### Testnet

**Network Name:**        TEO Blockchain Testnet\
**New RPC URL:**           <https://node-testnet.teo.mn\\>
**Chain ID:**                      3305\
**Currency Symbol:**    CRX \
**Block Explorer URL:** <https://explorer-testnet.teo.mn>

#### Жишээ зураг

<figure><img src="https://1406593324-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2WNiOcpRFxBUrofQV1sz%2Fuploads%2Fceiiybw8Q346Pmlr24uX%2FScreenshot%20from%202023-01-16%2016-42-44.png?alt=media&amp;token=afb9e99e-92b2-40a6-a435-323c7d4dbad5" alt=""><figcaption><p>Метамаск Mainnet жишээ</p></figcaption></figure>

Хэрэв амжилттай болсон бол сүлжээний жагсаалт дунд дараах байдлаар харагдана.

<figure><img src="https://1406593324-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2WNiOcpRFxBUrofQV1sz%2Fuploads%2FHpkrdX2m9Lohd1JjrYLh%2FScreenshot%20from%202023-01-16%2016-46-19.png?alt=media&amp;token=adf85c72-6e45-499e-983b-c7287147be55" alt=""><figcaption><p>Метамаск дээр нэмсний дараа</p></figcaption></figure>


# Стэйкинг

### Товчхон

TEO сүлжээ Proof-of-Stake протокол ашиглан сүлжээг аюулгүй байлгадаг. Та өөрт багаа CRX койныг стэйкинг хийх замаар сүлжээний аюулгүй байдалд өөрийн хувь нэмрээ оруулан, үүнийхээ төлөө өгөөж хүртэх боломжтой. Стэйкинг хийнэ гэдэг нь та өөрийн CRX койныг "царцааж" байгаа хэрэг бөгөөд зөвхөн та л өөрийн CRX койнд хандан ашиглах боломжтой. "Царцаасан" койныг та хүссэн үедээ буцааж авах боломжтой.

> ### Validator
>
> Validator node асааж TEO сүлжээнд блок үүсгэх үйл явцад оролцох боломжтой.
>
> **Барьцаа**: Хамгийн багадаа 2,000,000 CRX барьцаанд байршуулах шаардлагатай.\
> **Бусдаас барьцаа хүлээн авсны дараах дээд хэмжээ**: Өөрийн барьцаанаас 15 дахин их.\
> **Validator нь бусдаас авсан барьцааны хураамж**: Validator нь бусдаас барьцаа авч (delegate) stake хийх боломжтой ба бусдын барьцаанд ноогдох шагналын 15% - ийг validator авна.\
> **Барьцааг буцаан олгох хугацаа\***: 7 хоног
>
> Хэрэв Validator сүлжээг будилуулах санаатай үйлдэл хийвэл барьцааг сүлжээ автоматаар устана. Энэ нь validator-д нэмэлтээр барьцаа байршуулсан Delegator-уудад мөн хамаатай.

> ### Delegator
>
> Delegator гэдэг нь та өөрийн CRX-ийг Validator node-д хадгалуулж шагнал буюу хүү авах боломжтой. Хадгалуулахдаа хугацаатай, хугацаагүйгээр хадгалуулж болно.
>
> **Барьцааны доод дүн**: 1CRX\
> **Шагнал**: Сүлжээнд байгаа нийт стэйкийн хэмжээнээс хамаарч өөрчлөгдөнө. Нийт стэйкийн хэмжээ зах зээл дээрх CRX-ын 50%-д хүрэхэд жилийн ашгийн хувь 22% орчим байна.\
> **Барьцааг буцаан олгох хугацаа\***: 7 хоног
>
> Та барьцаа байршуулах Validator node-ийг сайтар судалж барьцаагаа байршуулах хэрэгтэй. Validator node таны барьцааг үрж, зарцуулах эрхгүй. Харин таны хадгалуулсан Validator node сүлжээнд санаатай хор учруулсан, будилуулсан дохиолдолд таны барьцаа, Validator-ын барьцаатай хамт устгагдана.

\***Барьцааг буцаан олгох хугацаа** нь тархмал сүлжээнд ямар нэг залилан, форк үүсэх нөхцлөөс сэргийлж тохируулсан. Хэрэв ямар нэг асуудал үүссэн тохиолдолд корэксчэйний community уг хугацаанд асуудлыг шийдвэрлэх үүрэг хүлээнэ.

Корэкс сүлжээний Validator, Delegator PoS-ын зохицуулалтыг [SFC](https://explorer.teo.mn/address/0xc04e800000000000000000000000000000000cfc) ухаалаг гэрээгээр шийддэг. Та SFC гэрээний эх кодыг [эндээс](https://github.com/teo-mn/corex-sfc) харж болно.


# Токэн үүсгэх

### Товчхон

TEO блокчэйн нь эфериумийн EVM(Ethereum virtual machine)-ийг дэмждэг тул дурын ухаалаг гэрээг хөгжүүлэх боломжтой юм. Энэ заавраар энгийн ERC20 стандартын токэнийг  [Remix Ethereum](https://remix.ethereum.org) түүл болон [Метамаск](https://metamask.io/download/)  хэтэвч ашиглан корэкс блокчэйн дээр үүсгэх заавар хүргэж байна.

TEo сүлжээнд токэн үүсгэхэд таны хаягт гүйлгээний шимтгэл төлөхөд хүрэлцэхүйц CRX хэрэгтэй.

{% hint style="info" %}
Энэ заавраар таныг хэдийн корэкс блокчэйнийг өөрийн метамаск хэтэвчтэй холбосон гэж үзэн үргэлжлэх тул хэрэв та хараахан холбож амжаагүй бол [ЭНЭ](/general/metamask) зааврын дагуу холбоорой.
{% endhint %}

### Remix IDE түүлийн тухай

Remix IDE нь эфериум болон эфериумд суурилсан блокчэйнүүд дээр ухаалаг гэрээг хамгийн хялбараар үүсгэж болох вэб аппликэйшн юм. Та ямар нэг нэмэлт програм эсвэл компайлар суулгах шаардлагагүй мөн блокчэйний нөүд асаах ч хэрэггүйгээр вэб хөтөч ашиглан өөрийн ухаалаг гэрээг үүсгэх боломжтой. [Нүүр хуудас](https://remix.ethereum.org) нь дараах байдлаар харагдана.

![Remix Ethereum Homepage](https://1406593324-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2WNiOcpRFxBUrofQV1sz%2Fuploads%2FJRMNDPIIPWfrw1V8icLQ%2FScreenshot%20from%202022-01-26%2018-31-23.png?alt=media\&token=f06d2761-4b61-4845-b0a4-52460e6165a4)

### Remix-ээ метамасктай холбох

Метамаскын цонхноос "Corexchain Testnet"-ийг сонгоод, Remix-ийн хуудаснаас Remix -> Deploy & Run Transactions -> Environment цэсний "Injected Web3" хэсгийг сонгоход метамаскын холбох цонх нээгдэнэ. Тест токэн үүсгэх хаягаа сонгоод "Connect" товчийг дарж холбоно. Хэрэв бүх зүйл амжилттай болсон бол доорх зураг дээрх шиг "Custom (3305) network" гэж харагдана. Энэ зааврыг тест сүлжээн дээр үүсгэлээ. Хэрэв үндсэн сүлжээн дээр үүсгэх бол "Corexchain Mainnet"-ийг сонгоно.

![Connect metamask](https://1406593324-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2WNiOcpRFxBUrofQV1sz%2Fuploads%2FlnhKY0sjSWxlFcYMsud2%2FScreenshot%20from%202022-01-26%2018-32-23.png?alt=media\&token=dc968890-f86a-4822-929f-28be09412304)

### ERC20 токэн

File Explorers -> Create New File цэсээр "TestErcToken.sol" нэртэй файл үүсгээд "Test" нэртэй нийт хэмжээ 100000 TKN байдаг шинэ токэн үүсгэе.

```solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract Token is ERC20 {

    constructor () ERC20("Test", "TKN") {
        _mint(msg.sender, 1000000 * (10 ** uint256(decimals())));
    }


    function transfer(address recipient, uint256 amount) public override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }
}
```

Ухаалаг гэрээний кодоо бичиж дууссаны дараа Solidity Compiler цэсний "Compile TestErcToken.sol" товчыг дарж Solidity эх файлаа компайл хийцгээе.

Хэрэв компайл алдаагүй амжилттай болсон бол зүүн дээд хэсгийн Solidity Compiler -ийн icon зөв тэмдэгтэй болно.

![Source code](https://1406593324-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2WNiOcpRFxBUrofQV1sz%2Fuploads%2F5SwcwGoFQYk33RuJJG1H%2FScreenshot%20from%202022-01-26%2018-46-55.png?alt=media\&token=8de2c227-3375-4c7b-9921-093955c429b9)

Кодоо бичсэн, компайл асуудалгүй хийгдсэн бол бидэнд Deploy буюу токэноо блокчэйн дээр үүсгэх л үлдлээ. Ингэхийн тулд та "Deploy & run transactions" цэсний "Contract" жагсаалт дотроос сая үүсгэсэн "TestErcToken.sol" файлыг сонгоод "Deploy" товчыг дарна. Үүний дараа метамаскын шилжүүлэг хийх цонх нээгдэх ба шилжүүлгийг баталснаар Deploy хийх хүсэлт үүснэ.

![Deployment](https://1406593324-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2WNiOcpRFxBUrofQV1sz%2Fuploads%2FmXzbjIhaWulKQJGC6txw%2FScreenshot%20from%202022-01-26%2018-47-16.png?alt=media\&token=6c8ec0db-a87d-417f-adb2-a81b74ab5604)

Бидний ухаалаг гэрээ үүсгэх хүсэлт амжилттай болсон бол "Deplioy & run transaction" цэсний доод хэсэгт "At Address" болон "Deployed Contracts"-ын утгууд автоматаар бичигдэнэ. "At Address" нь блокчэйн дээр үүссэн манай токэний хаяг бол "Deployed Contracts" дотор манай токэнийг функцүүдийг дуудаж шалгах боломжийг нээж өгнө. Доорх зурагт "Total Supply" функцийг дуудаж харуулсан жишээ оруулав. Мөн та мэтамаск хэтэвчний "Import token" цэсийг ашиглан шалгаж үзэх, шилжүүлэг хийх боломжтой.

![After deployment](https://1406593324-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2WNiOcpRFxBUrofQV1sz%2Fuploads%2FphrPNslvJW8iN6Gv2fWw%2FScreenshot%20from%202022-01-28%2015-19-33.png?alt=media\&token=332906ee-0f6b-413d-8cf5-1d834bcb4e81)

Блокчэйний [explorer](https://explorer.teo.mn)-ийн Contracts болон Transactions хуудсуудаас токэн үүссэн гүйлгээг харж болно.

![Explorer contract](https://1406593324-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2WNiOcpRFxBUrofQV1sz%2Fuploads%2FX7wD9M0E5v2i7kEUl4w0%2FScreenshot%20from%202022-01-26%2018-48-58.png?alt=media\&token=e861476c-6769-41f1-9d85-3e79765528cb) ![Explorer transaction](https://1406593324-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2WNiOcpRFxBUrofQV1sz%2Fuploads%2FTvML9LfSL30fnOERyzTz%2FScreenshot%20from%202022-01-26%2018-51-35.png?alt=media\&token=4e2581df-7815-45a2-ad5d-b7a89c58f5b5)


# NFT үүсгэх

### Корэкс блокчэйн дээр хэрхэн NFT үүсгэх вэ?

TEO блокчэйн дээр ERC721 стандартын ухаалаг гэрээ буюу  NFT үүсгэх зааврыг [Remix Ethereum](https://remix.ethereum.org) түүл болон [Метамаск](https://metamask.io/download/) ашиглан хүргэе. Хэрэв та Метамаск эсвэл Remix-ийг төдийлөн мэдэхгүй бол өмнө оруулсан [Токэн үүсгэх](/development/token-creation) зааврыг үзэхийг зөвлөе.

ERC721-ын ухаалаг гэрээ үүсгэхдээ [OpenZeppelin](https://docs.openzeppelin.com/) (Solidity хэлний хамгийн том сан)-ын ERC721 классыг дахин ашиглаж, шинээр бүтээгдэхүүн үүсгэх `awardItem` нэртэй функцийг эзэмшигчийн хаяг, токэний хаяг, файлын URI утгуудыг гаднаас дамжуулдаг байдлаар хөгжүүлэв.&#x20;

```solidity
pragma solidity ^0.7.0;

import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.4-solc-0.7/contracts/token/ERC721/ERC721.sol";

contract NftItem is ERC721 {
    constructor() ERC721("TestNft", "TNFT") {
    }

    /**
    * Шинээр NFT item үүсгэх функц
    * @param player - эзэмшигчийн хаяг
    * @param tokenId - шинээр үүсгэх бүтээгдэхүүний дугаар
    * @param tokenURI - шинэ бүтээгдэхүүний эх файлын байршил. 
    *  (өөрчлөгдөхгүй байх хэрэгтэй тул ipfs дээр хадгалахыг зөвлөе)
    */
    function awardItem(address player, uint256 tokenId, string memory tokenURI)
        public
        returns (uint256)
    {
        _mint(player, tokenId);
        _setTokenURI(tokenId, tokenURI);

        return tokenId;
    }
}
```

Компайл хийхдээ Solidity Compiler цэсрүү орж компайл хийх файлыг сонгоод "Compile TestNft.sol" товчыг дарна. Таны файлын нэр TestNft.sol-с ялгаатай бол "Compile ${File*Name}" хэлбэртэй харагдана(${FileName} нь таны файлын нэр юм*). Хэрэв компайл амжилттай болсон бол зүүн дээд хэсгийн Solidity Compiler-ийн лого зөв тэмдэгтэй харагдана.

![Compile solidity file](https://1406593324-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2WNiOcpRFxBUrofQV1sz%2Fuploads%2Fd6pK73yJjSdWHGzLVvPO%2FScreenshot%20from%202022-01-30%2013-14-37.png?alt=media\&token=ffc076ae-fd8a-487d-bf4a-8c9ab6ed3dd2)

Компайл хийж дууссан бол Deploy & Run transactions цэсний Environment утгыг "Injected Web3" болгож өөрчлөөд "Deploy" товч дээр дарна. Бид корэксийн тест сүлжээг ашиглан заавар бэлтгэж буй тул "Custom (3305) network" гэж харагдаж байна. Хэрэв та корэксийн үндсэн сүлжээн дээр үүсгэх гэж буй бол метамаск дээрээ корэксийн үндсэн сүлжээг сонгоорой. Сүлжээ зөв бол "Custom (1104) network" гэж харагдана.

{% hint style="info" %}
Deploy үйлдэл нь блокчэйний гүйлгээ тул таны холбосон хаягт CRX байх ёстойг анхаараарай. Хэрэв та тестнэт ашиглаж байгаа бол [faucet](https://faucet.corexchain.io) ашиглах, үнсдэн сүлжээ бол [биржээс](https://corex.mn) цэнэглэх боломжтой.
{% endhint %}

![Deploy NFT smart contract](https://1406593324-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2WNiOcpRFxBUrofQV1sz%2Fuploads%2FhdkFLPT7rX38aQKYAIsx%2FScreenshot%20from%202022-01-30%2016-28-37.png?alt=media\&token=007d1f5b-19fe-4d02-b937-c3e38dc5752a)

"Deploy" товчийг дараад метамаскын гүйлгээ амжилттай хийгдсэн бол таны ухаалаг гэрээ корэкс сүлжээн дээр амжилттай үүслээ гэж хэлж болно. Блокчэйний explorer-ийн Contracts цэснээс үүсгэсэн NFT ухаалаг гэрээгээ шалгаж үзээрэй.

![NFT contract on explorer](https://1406593324-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2WNiOcpRFxBUrofQV1sz%2Fuploads%2Fa3bRobOZr9vqaGEwz4mx%2FScreenshot%20from%202022-01-30%2013-17-36.png?alt=media\&token=8cfc52a1-74de-4b25-b55b-984dda6a6725)

Мөн Remix түүлийн Deploy & Run transactions цэсний хэсэгт "At Address" болон "Deployed Contracts" утгууд автоматаар бөглөгдөнө. "At Address" нь шинээр үүсэн ухаалаг гэрээний блокчэйн дээрх хаяг бол "Deployed Contracts"-д уг ухаалаг гэрээг шалгаж үзэх орчин үүсэх юм.  Шалгахын тулд `awardItem` функцийг дуудаж үзье.  Дуудахдаа дараах утгуудыг ашигласан.

**player:**              "0x01a810F6C2f88EeAC22b2D5D7f47B255b154Df56"\
**tokenId:**           "1"\
**tokenURI:**         "<https://www.corexchain.io/wp-content/uploads/2021/10/logo-colored.svg>"

![](https://1406593324-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2WNiOcpRFxBUrofQV1sz%2Fuploads%2FPMJySxcbOwXBQHrmLiM9%2FMicrosoftTeams-image%20\(9\).png?alt=media\&token=9f297915-e13c-42eb-8012-a914cb8b102a)

`awardItem`  амжилттай болсон бол "0x01...Df56" хаягын  ERC721 гүйлгээний жагсаалт дотор "0x00...0000" хаягаас дараах шиг гүйлгээ хийгдсэн байгааг харж болно. Энэ нь "0x01...Df56" хаягт "1" гэсэн ID-тай NFT бүртгэгдснийг илэрхийлнэ.

![After NFT creation](https://1406593324-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2WNiOcpRFxBUrofQV1sz%2Fuploads%2F2gFXX0qwuRvoLIZbkuvx%2FScreenshot%20from%202022-01-30%2013-19-50.png?alt=media\&token=0bb40527-465b-49e9-b55b-3905af45240b)

Одоо "0x01...Df56"-ийн NFT-ийг өөр хаягруу шижлүүлж туршъя. Ингэхдээ `safeTranferFrom` функцийг дуудна.

**from:**              "0x01a810F6C2f88EeAC22b2D5D7f47B255b154Df56"\
**to:**                    "0xf96B054736e8537FC00b832bB4c536924dca21eF"\
**tokenId:**         "1"

![](https://1406593324-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2WNiOcpRFxBUrofQV1sz%2Fuploads%2FyTQsYrxOKJB6G5I25uGN%2Fsafe-transfer-nft.png?alt=media\&token=d36e85e6-d6ca-4e90-ad00-bfc2a6e1641f)

Хэрэв гүйлгээ амжилттай болсон бол "0x01...Df56"-д байсан 1 ширхэг "1" гэсэн ID-тай NFT "0xf9...21eF" шилжинэ. Хэрхэн шилжснийг Explorer-ийн ERC721 Txns хэсгээс шалгаж харж болно.

![](https://1406593324-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2WNiOcpRFxBUrofQV1sz%2Fuploads%2F52X6RvyM2WIrokNnQdFF%2FScreenshot%20from%202022-01-30%2013-21-48.png?alt=media\&token=36b29662-0304-4a19-8f72-628c9be51989) ![](https://1406593324-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2WNiOcpRFxBUrofQV1sz%2Fuploads%2FC1lPlbFNxAYzbpUzTV6I%2FScreenshot%20from%202022-01-30%2013-22-13.png?alt=media\&token=93d19743-f8e7-4e43-9034-644bc02b9545)


# Боодолтой Токэн (Wrapped Token)

## Боодолтой токэн гэж юу вэ?

Ямар нэгэн крипто хөрөнгөтэй нэг нэг харьцаатайгаар уягдсан токэнийг боодолтой токэн гэнэ. Tether койн бол USD-той 1:1 харьцаагаар уягдсан койн бөгөөд боодолтой токэн гэж хэлж болох юм. Учир нь 1 tether бүрийн цаана 1$ хадгалагдаж байдаг гэж үздэг. Боодолтой токэнууд нь дараах төрлийнх байж болно.

1. Бодит мөнгөн дэсвгэрт, хувьцаа, хөрөнгөтэй уягдсан
2. Өөрийн блокчэйн дээрх койнтой уягдсан
3. Бусад блокчэйн дээрх койнтой уягдсан

Боодолтой токэн ямар нэг хөрөнгөтэй 1:1 харьцаатай уягддаг тул боодолтой токэн олборлогдох үед уягдсан хөрөнгө ямар агуулахад цоожлогдож, боодолтой токэн шатаагдах үед уягдсан хөрөнгө агуулахаас гардаг.

## Яагаад Боодолтой Токэн гэж?

Боодолтой токэн нь бусад блокчэйнд суурилсан койн болон токэнийг эсвэл бодит хөрөнгийг өөрийн блокчэйнд ERC-20 токэн байдлаар ашиглах боломжийг олгодог. Жишээлбэл USD, BitCoin, ETH гэх мэт валют болон криптокойныг боодолтой токэн болгон Корэкс блокчэйнд оруулж ирэх боломжтой. Ямар нэгэн крипто хөрөнгийг блокчэйнд ERC-20 боодолтой токэн болгон оруулж ирэх нь дараах давуу талуудтай.

1. ERC-20-ийн бүх давуу талуудыг хүртэх
2. Гүйлгээний шимтгэл бага блокчэйнд үнийн алдагдалгүйгээр хөрөнгийг захиран зарцуулах.
3. DeFi системүүдээр хөрөнгийг ашиглах
4. Олон токэнуудыг хооронд нь хөрвүүлж, солилцох боломж. DEX-д ашиглах.

## Боодолтой токэн хэрхэн үүсгэх вэ?

Энд бид боодолтой токэнийг хэрхэн үүсгэх боломжыг харуулах болно. Боодолтой токэнийг 3 янзаар үүсгэх боломжтой.

1. Итгэмжит гуравдагч этгээд буюу ямар нэгэн биржээр дамжуулан шийдэх
2. Ухаалаг гэрээгээр шийдэх
3. Гүүрийг ашиглах (Гүүр үүсгэх хэсгийг харна уу)

Энд бид эхний хоёр аргыг авч үзэх болно. 3 дахь аргын хувьд гүүр үүсгэх хэсгийг харна уу.

### Итгэмжит гуравдагч этгээд буюу ямар нэгэн биржээр дамжуулан шийдэх

Боодолтой токэний ухаалаг гэрээг үүсгэгч нь ихэнхдээ бирж өөрөө, эсвэл бирж өөрөө тухайн боодолтой токэнийг их хэмжээгээр эзэмшсэн этгээд байна. Уг арга нь заавал гуравдагч этгээдээр дамжин хийгдэнэ. Доорх зурагт токэн нь өөр болокчэйн дээр байрлах токэн, койн эсвэл бодит хөрөнгө байна.

![Итгэмжит гуравдагч этгээдийг ашиглан боодолтой токэнийг хэрэгжүүлэх](https://1406593324-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2WNiOcpRFxBUrofQV1sz%2Fuploads%2F4AfbT5unJRO8bQrlfGiJ%2Fimage.png?alt=media\&token=c7c56376-9312-4803-bf62-b682f0ed3b92)

Зурагт үзүүлснээр хэрэглэгч өөрийн эзэмшиж буй токэнийг Худалдаачинруу шилжүүлж, худалдаачин тухайн токэнд харгалзах Боодолтой токэнийг олборлох эсвэл шилжүүлэх замаар хэрэглэгчид яг ижил хэмжээний боодолтой токэн өгнө. Хэрэглэгч боодолтой токэнийг эзэмшиж байгаа хугацаанд Худалдаачин жинхэнэ токэнийг аюулгүй хадгална. Хэрэглэгчийн хүлээн авсан боодолтой токэн нь уг блокчэйн дээр яг л өмнөх токэнтэй адил үнэтэй байх бөгөөд өөрийн мэдлээр зарцуулах боломжтой.

Боолттой токэнийг задлах буюу эргүүлэн хуучин токэн болгохын тулд хэрэглэгч боолттой токэний ухаалаг гэрээнд токэнийг шатаах, эсэл худалдаачинруу шилжүүлэх хүсэлтийг хийнэ. Уг хүсэлт хийгдснээр ухаалаг гэрээг эзэмшигч эсвэл худалдаачин аюулгүй хадгалагдсан хуучин токэнийг хэрэглэгчид шаатаасан эсвэл шилжүүлсэн хэмжээгээр нь эргүүлэн олгоно. Уг зүйлдлийг доорх зурагт үзүүлэв.

![Боолтыг задлах буюу эргээд токэноо буцаан авах](https://1406593324-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2WNiOcpRFxBUrofQV1sz%2Fuploads%2FZQHUs2Ze4vyBveJ5vFMS%2Fimage.png?alt=media\&token=c1df4aa3-cdce-4cdf-891c-2a0bdb78970c)

### Ухаалаг гэрээгээр шийдэх

Нэг блокчэйн дээр орших токэнуудыг боохдоо ухаалаг гэрээнд суурилан хийх боломжтой. Жишээ нь TEO блокчэйн дээрх CRX-ыг дараах ухаалаг гэрээг ашиглан боох боломжтой.

```solidity
pragma solidity ^0.7.0;

contract WCRX {
    string public name     = "Wrapped CRX";
    string public symbol   = "WCRX";
    uint8  public decimals = 18;

    event  Approval(address indexed src, address indexed guy, uint wad);
    event  Transfer(address indexed src, address indexed dst, uint wad);
    event  Deposit(address indexed dst, uint wad);
    event  Withdrawal(address indexed src, uint wad);

    mapping (address => uint)                       public  balanceOf;
    mapping (address => mapping (address => uint))  public  allowance;

    fallback() external payable {
        deposit();
    }
    function deposit() public payable {
        balanceOf[msg.sender] += msg.value;
        emit Deposit(msg.sender, msg.value);
    }
    function withdraw(uint wad) public {
        require(balanceOf[msg.sender] >= wad);
        balanceOf[msg.sender] -= wad;
        msg.sender.transfer(wad);
        emit Withdrawal(msg.sender, wad);
    }

    function totalSupply() public view returns (uint) {
        return address(this).balance;
    }

    function approve(address guy, uint wad) public returns (bool) {
        allowance[msg.sender][guy] = wad;
        emit Approval(msg.sender, guy, wad);
        return true;
    }

    function transfer(address dst, uint wad) public returns (bool) {
        return transferFrom(msg.sender, dst, wad);
    }

    function transferFrom(address src, address dst, uint wad)
        public
        returns (bool)
    {
        require(balanceOf[src] >= wad);

        if (src != msg.sender && allowance[src][msg.sender] != uint(-1)) {
            require(allowance[src][msg.sender] >= wad);
            allowance[src][msg.sender] -= wad;
        }

        balanceOf[src] -= wad;
        balanceOf[dst] += wad;

        emit Transfer(src, dst, wad);

        return true;
    }
}

```

Уг гэрээ нь өөр дээрээ CRX хүлээн авах боломжтой бөгөөд CRX шилжүүлсний хариуд тухайн хаягт WCRX токэнийг шилжүүлэн өгөх болно.

### Гүүр ашиглан боодолтой токэн үүсгэх

Өөр бусад блокчэйнд суурилсан токэн болон койнуудыг 1-р арга, эсвэл 3-р аргаар боодолтой токэнийг өөрийн блокчэйн дээр үүсгэх боломжтой боломжтой. Гүүр хэсгийг харна уу!


# Блокчэйн хоорондын гүүр

Нэг блокчэйнээс өөр нэг блокчэйнд токэнийг шууд зөөх боломжгүй гэж хэлж болно. Учир нь өөр өөр блокчэйн өөр өөрийн гэсэн дүрэм, төлбөрийн хэрэгсэлтэй байдаг. Гэтэл крипто хөрөнгийг блокчэйн хооронд зөөх нь **DeFi**-д зайлшгүй байх ёстой чухал хэрэгцээ юм. Үүнийг ухаалаг гэрээ, боодолтой токэний тусламжтайгаар холбогч гүүрийг ашиглан шийддэг.

Энэхүү заавраар бүгдээрээ Ethereum блокчэйн сүлжээн дахь ETH-ийг Корэкс сүлжээн дээр CRX болгох гүүрийг байгуулах жишээг харах болно.

{% hint style="warning" %}
Энд бичигдсэн код нь зөвхөн үзүүлэнд зориулж бичигдсэн тул үйлчилгээнд хэрэглэхэд тохиромжгүй гэдгийг анхаарна уу!
{% endhint %}

## Хэрэгжүүлэлт

Хоёр блокчэйн хооронд крипто хөрөнгө дамжуулахдаа блокчэйн бүр дээр тус тусыг ухаалаг гэрээг үүсгэнэ. Ухаалаг гэрээнд хийгдсэн үйлдлүүд дээр **event** үүсгэгдэх ба энэ нь блокчэйнд хадгалагдан үлддэг. Бидний хэрэгжүүлэх **гүүр**, хоёр блокчэйнээс event сонсох ба сонссон event-ийн дагуу үйлдлийг хийнэ.<br>

![Ethereum, Corexchain хооронд ETH, CRX дамжуулах гүүрний архитектур](https://3584451794-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fk8ArHG3L17wkbmKRlvP6%2Fuploads%2FL8Yq48GHNJquEZtZUNeT%2Fbridge.png?alt=media\&token=5d07904e-1305-43c5-82bd-dc7a7b49081d)

Ethereum сүлжээн дээрх ухаалаг гэрээ эхлээд ETH-ийн дүүргэлттэй байх ёстой. Мөн түүнчлэн TEO сүлжээн дээрх ухаалаг гэрээ CRX-ийн дүүргэлттэй байх ёстой.

### Ethereum сүлжээн дээрх ухаалаг гэрээ

Зурагт харуулсны дагуу Ethereum сүлжээн дээр ETH2CRX гэрээ байрлана. Уг гэрээ нь дотроо ETH хадгалах бөгөөд корэкс дээр гүйлгээ хийх үнэ *cost*, болон CRX/ETH ханш crxeth-ийг хадгална.  &#x20;

* ***toCorex*** үйлдлийг корэкс-ийн ямар хаягт шилжүүлэх хаягийг дамжуулан, ETH шилжүүлж гүйлгээ хийхэд *ToCorex* event ялгарах болно. Шилжүүлсэн ETH-ээс гүйлгээний хураамжыг авч, ханшаар хөрвүүлж event үүсгэн блокчэйнд хадгална. Энэ event-ийг гүүр сонсох юм.
* **toEthereum** үйлдлийг зөвхөн *owner* дуудах бөгөөд корэкс сүлжээнээс ETH-ийг захиалсны дараагаар гүүрээр дамжин Ethereum сүлжээнд, захиалсан ETH-ийг түгээхэд ашиглана.&#x20;

```solidity
contract ETH2CRX {

    uint public cost;                // corex chain дээр гүйлгээ хийх үнэ
    uint public crxeth;
    address public owner;
    
    event ToCorex(address indexed dst, uint val);
    event ToEthereum(address indexed dst, uint val);

    constructor() public {
        owner = msg.sender;
        cost = 0.01 ether;
        crxeth = 607715;
    }

    function() external payable {
    }
    
    function toCorex(address to) external payable {
	    require(msg.value > cost);
	    emit ToCorex(to, (msg.value - cost) * crxeth);
    }

    function toEthereum(address payable dst, uint256 val) external payable {
	    require(msg.sender == owner);
	    dst.transfer(val);
	    emit ToEthereum(dst, val);
    }
}

```

### TEO сүлжээн дээрх ухаалаг гэрээ

CRX2ETH гэрээ нь CRX-ийг ETH болгох мөн Ethereum сүлжээнээс орж ирсэн захиалгын CRX-ийг түгээх үйлдлүүдийг хариуцна. Уг гэрээ нь дотроо гэрээний эзэн owner, CRX-ийг ETH болгох ханш ethcrx, Ethereum сүлжээн дээр хийгдэх гүйлгээний хураамж cost зэргийг агуулна.&#x20;

* **toEthereum** үйлдлийг CRX-ийг ETH болгоход ашиглана. Ethereum сүлжээн дээрх хаягийг дамжуулах ба уг үйлдлийг хийхдээ CRX шилжүүлэх ёстой. Шилжүүлсэн CRX-ээс ETH сүлжээн дээр хийгдэх гүйлгээний хураамжыг хасаж ethcrx ханшаар хөрвүүлэн ToEthereum event үүсгэн блокчэйнд хадгална.
* **toCorex** үйлдлийг зөвхөн гэрээний эзэн дуудна. Ethereum сүлжээнээс CRX-ийг захиалах үед гүүрээр дамжин корэкс сүлжээнд, захиалсан CRX-ийг түгээхэд хэрэглэнэ.

```solidity
pragma solidity ^0.5.0;

contract CRX2ETH {

    uint public cost;                // ethereum chain дээр гүйлгээ хийх үнэ
    uint public ethcrx;
    address public owner;
    
    event ToCorex(address indexed dst, uint val);
    event ToEthereum(address indexed dst, uint val);

    constructor() public {
        owner = msg.sender;
        cost = 6077.15 ether;
        ethcrx = 1.64e-6 ether;
    }

    function() external payable {
    }
    
    function toCorex(address payable dst, uint val) external payable {
	require(msg.sender == owner);
	dst.transfer(val);
	emit ToCorex(dst, val);
    }

    function toEthereum(address payable dst, uint val) external payable {
	require(msg.value > cost);
        emit ToEthereum(dst, (msg.value - cost) * ethcrx);
    }
}

```

### Ухаалаг гэрээний event сонсох

Ухаалаг гэрээний event-үүд блокчэйнд хадгалагдан үлддэг тул хэзээч гэсэн тэр event-ийг ухаж үзэх боломжтой гэсэн үг юм. Ухаалаг гэрээний үүсгэсэн event-ийг web3js ашиглан хоёр янзаар сонсох боломжтой.

#### 1. Өнгөрсөн event-үүдийг унших

Contract тохиолдол үүсгэсний дараагаар `getPastEvents` функцийг ашиглан тухайн гэрээний бүх event-үүдийг шүүн харах боломжтой. Доорх жишээнд гэрээний `ToCorex` event-ийг блок 0-ээс эхлэн хамгийн сүүлийн блок хүртэл түүж харж байна. Маш их өгөгдөл буцаах боломжтой бөгөөд удаан ажиллана. Энэ фукцийн нэг дутагдалтай тал бол event-үүдийг индекслэх системийг гүүр дээр хэрэгжүүлж өгөх шаардлагатай.

```javascript
const addr = '<address of the contract>'
abi = JSON.parse('<contract abi>');
ETH2CRX = new this.web3.eth.Contract(abi, addr);
let options = {
    filter: {
        value: []    
    },
    fromBlock: 0,                  //Number || "earliest" || "pending" || "latest"
    toBlock: 'latest'
};

ETH2CRX.getPastEvents('ToCorex', options)
    .then(results => console.log(results))
    .catch(err => throw err);
```

#### 2. Гэрээний event функцийг ашиглах

Гэрээний event функцийг ашиглан гэрээнээс гарсан өөрчлөлтүүдийг чагнах боломжтой. Доор жишээнд `ToCorex` event-ийг сонсох ба `data` дээр шинээр үүсгэгдсэн event-ийн мэдээлэл ирдэг. Уг арга ажиллахын тулд ABI зөв байх ёстойг анхаарна уу.

```javascript
const addr = '<address of the contract>'
abi = JSON.parse('<contract abi>');
ETH2CRX = new this.web3.eth.Contract(abi, addr);
let options = {
    filter: {
        value: [],
    },
    fromBlock: 0
};

ETH2CRX.events.ToCorex(options)
    .on('data', event => eth2crx_process(event))
    .on('changed', changed => console.log(changed))
    .on('error', err => throw err)
    .on('connected', str => console.log(str))
```

### Ухаалаг гэрээний функцийг дуудах

Ethereum сүлжээн дээр `ToCorex` event-ийг сонсон ирсэн тохиолдолд `eth2crx_process` функцийг дуудна. Уг функц нь TEO сүлжээн дээрх CRX2ETH гэрээний `toCorex` функцийг дуудаж зохиох хэмжээний CRX-ийг харгалзах хаягт шилжүүлнэ. Гүйлгээний хураамж гэрээний эзнээс гарах бөгөөд мөнгөн дүн нь гэрээнд агуулагдах CRX-ээс шилжүүлэгдэх болно.

```javascript
const crx_owner_addr = '<address of the owner of CRX2ETH contract>'
const crx_owner_privateKey = '<private key of the owner>'
function eth2crx_process(e) {
    if (e.event == 'ToCorex') {
	let dst = e.returnValues.dst;
	let val = e.returnValues.val;
	transfer({
	    from: crx_owner_addr,
	    to: crx2eth_addr,
	    value: '0',
	    data: CRX2ETH.methods.toCorex(dst, val).encodeABI(),
	    privateKey: crx_owner_privateKey,
	}).then(tx => {console.log('Tx successful: ', tx.transactionHash)});
    } else {
	try {
	    console.log(e.event, ' occurred: ', e.returnValues)
	} catch (e) {
	    console.log('Error occured: ', e)
	}
    }
}

```

Дээрх жишээнд агуулагдаж буй гүйлгээ хийх`transfer` функцийн кодыг доор оруулав.

```javascript
async transfer({ from, to, value, data, privateKey }) {
    const chainId = await this.web3.eth.getChainId()
    const gasPrice = await this.web3.eth.getGasPrice();
    const privateKeyBuffer = EthUtil.toBuffer(privateKey);
    
    const nonce = await this.web3.eth.getTransactionCount(from, 'pending');
    const rawTx = {
	from,
	to,
	chainId: Web3.utils.toHex(chainId),
	value: Web3.utils.toHex(value),
	gasLimit: Web3.utils.toHex(50000),
	gasPrice: Web3.utils.toHex(gasPrice),
	data: data,
	nonce: Web3.utils.toHex(nonce),
    };

    const tx = new Tx(rawTx);
    tx.sign(privateKeyBuffer);
    const serializedTx = tx.serialize();
    const res = await this.web3.eth.sendSignedTransaction(`0x${serializedTx.toString('hex')}`);

    return res;
}
```

### Бүгдийг нь нийлүүлсэн код

Бидний жишээнд харуулсан гүүрийг доорх client.js, main.js файлуудад харуулав.&#x20;

* client.js - Блокчэйнтэй холбогдох хэсгийг агуулах код
* main.js - Гүүрийг хэрэгжүүлсэн код

{% code title="client.js" %}

```javascript
const EthUtil = require('ethereumjs-util');
const Web3 = require('web3');
const Tx = require('ethereumjs-tx');

class Client {

    constructor(connection) {
	this.web3 = new Web3(connection);
    }
    async transfer({ from, to, value, data, privateKey }) {
	const chainId = await this.web3.eth.getChainId()
	const gasPrice = await this.web3.eth.getGasPrice();
	const privateKeyBuffer = EthUtil.toBuffer(privateKey);
	
	const nonce = await this.web3.eth.getTransactionCount(from, 'pending');
	const rawTx = {
	    from,
	    to,
	    chainId: Web3.utils.toHex(chainId),
	    value: Web3.utils.toHex(value),
	    gasLimit: Web3.utils.toHex(50000),
	    gasPrice: Web3.utils.toHex(gasPrice),
	    data: data,
	    nonce: Web3.utils.toHex(nonce),
	};

	const tx = new Tx(rawTx);
	tx.sign(privateKeyBuffer);
	const serializedTx = tx.serialize();
	const res = await this.web3.eth.sendSignedTransaction(`0x${serializedTx.toString('hex')}`);

	return res;
    }

    get_contract(abi, addr) {
	var contract = new this.web3.eth.Contract(abi, addr);
	return contract;
    }
    async get_balance(addr) {
	const bal = await this.web3.eth.getBalance(addr);
	return bal;
    }
};

module.exports = Client;
```

{% endcode %}

{% code title="main.js" %}

```javascript
const Web3 = require('web3');
const net = require('net')
const Client = require('./client');

const crx2eth_addr = '0x.....';
const crx2eth_abi_json = '[{"constant": true,"inputs": [],"name": "cost","outputs": [{"name": "","type": "uint256"}],"payable": false,"stateMutability": "view","type": "function"},{"constant": false,"inputs": [{"name": "dst","type": "address"}],"name": "toEthereum","outputs": [],"payable": true,"stateMutability": "payable","type": "function"},{"constant": true,"inputs": [],"name": "owner","outputs": [{"name": "","type": "address"}],"payable": false,"stateMutability": "view","type": "function"},{"constant": true,"inputs": [],"name": "ethcrx","outputs": [{"name": "","type": "uint256"}],"payable": false,"stateMutability": "view","type": "function"},{"constant": false,"inputs": [{"name": "dst","type": "address"},{"name": "val","type": "uint256"}],"name": "toCorex","outputs": [],"payable": true,"stateMutability": "payable","type": "function"},{"inputs": [],"payable": false,"stateMutability": "nonpayable","type": "constructor"},{"payable": true,"stateMutability": "payable","type": "fallback"},{"anonymous": false,"inputs": [{"indexed": true,"name": "dst","type": "address"},{"indexed": false,"name": "val","type": "uint256"}],"name": "ToCorex","type": "event"},{"anonymous": false,"inputs": [{"indexed": true,"name": "dst","type": "address"},{"indexed": false,"name": "val","type": "uint256"}],"name": "ToEthereum","type": "event"}]';
const crx2eth_abi = JSON.parse(crx2eth_abi_json)
const crx_owner_addr = '0x.....'
const crx_owner_privateKey = '0x.....';

const eth2crx_addr = '0x.....';
const eth2crx_abi_json = '[{"constant":true,"inputs":[],"name":"cost","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"crxeth","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"}],"name":"toCorex","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"dst","type":"address"},{"name":"val","type":"uint256"}],"name":"toEthereum","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"dst","type":"address"},{"indexed":false,"name":"val","type":"uint256"}],"name":"ToCorex","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"dst","type":"address"},{"indexed":false,"name":"val","type":"uint256"}],"name":"ToEthereum","type":"event"}]';
const eth2crx_abi = JSON.parse(eth2crx_abi_json)
const eth_owner_addr = '0x.....';
const eth_owner_privateKey = '0x.....';

var corex_web3 = new Web3.providers.IpcProvider('/home/corex/.corexchain/corex.ipc', net)
var eth_web3 = new Web3.providers.WebsocketProvider('ws://localhost:8545');
var corex_cli = new Client(corex_web3);
var eth_cli = new Client(eth_web3);

var crx2eth_contract = corex_cli.get_contract(crx2eth_abi, crx2eth_addr);
var eth2crx_contract = eth_cli.get_contract(eth2crx_abi, eth2crx_addr);

let options = {
    filter: {
        value: [],
    },
    fromBlock: 0
};

function crx2eth_process(e) {
    if (e.event == 'ToEthereum') {
	let dst = e.returnValues.dst;
	let val = e.returnValues.val;
	eth_cli.transfer({
	    from: eth_owner_addr,
	    to: eth2crx_addr,
	    value: '0',
	    data: eth2crx_contract.methods.toEthereum(dst, val).encodeABI(),
	    privateKey: eth_owner_privateKey,
	}).then(tx => { console.log('Tx successful: ', tx.transactionHash) });
    } else {
	try {
	    console.log(e.event, ' occurred: ', e.returnValues)
	} catch (e) {
	    console.log('Error occured: ', e)
	}
    }
}

function eth2crx_process(e) {
    if (e.event == 'ToCorex') {
	let dst = e.returnValues.dst;
	let val = e.returnValues.val;
	eth_cli.transfer({
	    from: crx_owner_addr,
	    to: crx2eth_addr,
	    value: '0',
	    data: crx2eth_contract.methods.toCorex(dst, val).encodeABI(),
	    privateKey: crx_owner_privateKey,
	}).then(tx => {console.log('Tx successful: ', tx.transactionHash)});
    } else {
	try {
	    console.log(e.event, ' occurred: ', e.returnValues)
	} catch (e) {
	    console.log('Error occured: ', e)
	}
    }
}

try {
    crx2eth_contract.events.ToEthereum(options)
	.on('data', event => crx2eth_process(event))
	.on('changed', changed => console.log(changed))
	.on('error', err =>  { throw err;})
	.on('connected', str => console.log(str));
} catch (e) {
    console.log(e)
}

try {
    crx2eth_contract.events.ToCorex(options)
	.on('data', event => console.log(event))
	.on('changed', changed => console.log(changed))
	.on('error', err =>  { throw err;})
	.on('connected', str => console.log(str))
} catch (e) {
    console.log(e);
}

try {
    eth2crx_contract.events.ToEthereum(options)
	.on('data', event => console.log(event))
	.on('changed', changed => console.log(changed))
	.on('error', err =>  { throw err;})
	.on('connected', str => console.log(str))
} catch (e) {
    console.log(e);
}

try {
    eth2crx_contract.events.ToCorex(options)
	.on('data', event => crx2eth_process(event))
	.on('changed', changed => console.log(changed))
	.on('error', err => { throw err;})
	.on('connected', str => console.log(str))
} catch (e) {
    console.log(e);
}


console.log('Listening for events');
```

{% endcode %}


