Өгөгдлийн төрлүүд
Solidity бол statically typed хэл — хувьсагч бүрийн төрлийг урьдчилан тодорхойлж өгөх ёстой. Өгөгдлийн төрлийг буруу сонговол gas их зарцуулагдах буюу overflow алдаа гарна.
uint — тэмдэггүй бүхэл тоо
uint бол 0 ба эерэг тоог хадгалах төрөл. Сөрөг тоо хадгалах боломжгүй.
uint8 myU8 = 255; // 0 – 2^8-1 (0 – 255)
uint16 myU16 = 65535; // 0 – 2^16-1
uint32 myU32 = 4294967295; // 0 – 2^32-1
uint64 myU64 = 1000000;
uint128 myU128 = 999;
uint256 myU256 = 1e18; // 0 – 2^256-1 (хамгийн том)
uint гэхэд uint256-тай адил — Solidity дахь default нь 256 bit.
Хэзээ аль хэмжээ ашиглах вэ?
uint8 → жижиг утга: тоглоомын level, оноо (0-255)
uint32 → timestamp (2106 он хүртэл)
uint256 → ETH хэмжээ, ерөнхий тоо (default)
Gas хэмнэхийн тулд жижиг uint ашиглах нь заримдаа эсрэг үр дүн өгдөг — EVM 256-bit-ийн машин тул uint8-г uint256 болгон хөрвүүлэх нэмэлт gas зарцуулдаг. Struct дотор жижиг uint ашиглах үед л gas хэмнэнэ.
int — тэмдэгтэй бүхэл тоо
int нь сөрөг ба эерэг тоо хоёуланг хадгална.
int8 myI8 = -128; // -2^7 – 2^7-1 (-128 – 127)
int16 myI16 = -1000;
int256 myI256 = -1e18; // -2^255 – 2^255-1
int гэхэд int256-тай адил.
// Температур, координат, санхүүгийн өөрчлөлт зэрэг сөрөг утга шаардагдах үед:
int256 public temperatureChange = -5;
int256 public profitLoss = -1000;
bool — логик утга
bool public isActive = true;
bool public isPaused = false;
Нөхцөл, тохируулга хадгалахад ашигладаг.
function toggle() public {
isActive = !isActive; // true ↔ false солигдоно
}
address — Ethereum хаяг
address бол 20 байт (160 bit) урттай Ethereum хаяг хадгалах тусгай төрөл.
address public owner = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4;
address payable — ETH хүлээж авах боломжтой хаяг.
address payable public treasury;
// ETH илгээх боломжтой болно:
treasury.transfer(1 ether);
msg.sender — функцийг дуудаж байгаа хүний хаяг. Дараагийн хичээлд дэлгэрэнгүй үзнэ.
bytes ба bytes32
Bytes бол хоёртын (binary) өгөгдөл хадгалах төрөл.
bytes32 public documentHash; // файлын hash хадгалахад
bytes public rawData; // дурын урттай хоёртын өгөгдөл
bytes32 нь gas хэрэглээний хувьд string-ээс хямд тул богино тогтмол урттай өгөгдөлд ашиглана.
bytes32 public constant ROLE_ADMIN = keccak256("ADMIN");
string — мөр (текст)
string public name = "Болд";
string public greeting = "Сайн уу!";
String Solidity-д reference type тул санах ойд хадгалагдах байршлаа заана. Bytes-тай харьцуулахад gas илүү зарцуулна.
// Богино, тогтмол текст → bytes32
bytes32 public constant TOKEN_NAME = "MNT";
// Урт, динамик текст → string
string public description = "Энэ бол Монгол төгрөгийн токен.";
Тогтмол (constant ба immutable)
uint256 public constant MAX_SUPPLY = 21_000_000; // compile-д тогтооно
address public immutable deployer; // constructor-д нэг удаа тогтооно
constructor() {
deployer = msg.sender;
}
constant ба immutable хоёулаа gas хэмнэнэ — storage-д бичигддэггүй.
Overflow: аюул ба хамгаалалт
Solidity 0.8.0-аас өмнө overflow шалгадаггүй байсан:
// Хуучин код (0.7.x) — АЮУЛТАЙ
uint8 x = 255;
x += 1; // 255 + 1 = 0 болчихдог байсан!
Solidity 0.8.0-аас хойш overflow автоматаар шалгагдаж, revert болдог:
// Шинэ код (0.8.x) — аюулгүй
uint8 x = 255;
x += 1; // ❌ revert: arithmetic overflow
Тиймээс pragma solidity ^0.8.0 ба түүнээс дээш хувилбар ашиглахад overflow-ын тухай санаа зовохгүй.
Өгөгдлийн төрлүүдийн хүснэгт
| Төрөл | Хэмжээ | Утга | Хэрэглээ |
| --------- | ------- | ------------- | --------------- |
| uint256 | 32 байт | 0 – 2²⁵⁶-1 | ETH хэмжээ, тоо |
| int256 | 32 байт | ±2²⁵⁵ | Сөрөг тоо |
| bool | 1 байт | true/false | Тохируулга |
| address | 20 байт | Ethereum хаяг | Данс, contract |
| bytes32 | 32 байт | Тогтмол bytes | Hash, код |
| string | Динамик | Текст | Нэр, тайлбар |
Дараагийн хичээлд:
State variable, local variable, global variable-уудын ялгааг судална.