Solidity / Өгөгдлийн төрлүүд

Өгөгдлийн төрлүүд

Solidity бол statically typed хэл — хувьсагч бүрийн төрлийг урьдчилан тодорхойлж өгөх ёстой. Өгөгдлийн төрлийг буруу сонговол gas их зарцуулагдах буюу overflow алдаа гарна.

uint — тэмдэггүй бүхэл тоо

uint бол 0 ба эерэг тоог хадгалах төрөл. Сөрөг тоо хадгалах боломжгүй.

solidity
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.

Хэзээ аль хэмжээ ашиглах вэ?

solidity
uint8   → жижиг утга: тоглоомын level, оноо (0-255)
uint32  → timestamp (2106 он хүртэл)
uint256 → ETH хэмжээ, ерөнхий тоо (default)

Gas хэмнэхийн тулд жижиг uint ашиглах нь заримдаа эсрэг үр дүн өгдөг — EVM 256-bit-ийн машин тул uint8-г uint256 болгон хөрвүүлэх нэмэлт gas зарцуулдаг. Struct дотор жижиг uint ашиглах үед л gas хэмнэнэ.

int — тэмдэгтэй бүхэл тоо

int нь сөрөг ба эерэг тоо хоёуланг хадгална.

solidity
int8   myI8  = -128;    // -2^7  – 2^7-1   (-128 – 127)
int16  myI16 = -1000;
int256 myI256 = -1e18;  // -2^255 – 2^255-1

int гэхэд int256-тай адил.

solidity
// Температур, координат, санхүүгийн өөрчлөлт зэрэг сөрөг утга шаардагдах үед:
int256 public temperatureChange = -5;
int256 public profitLoss = -1000;

bool — логик утга

solidity
bool public isActive = true;
bool public isPaused = false;

Нөхцөл, тохируулга хадгалахад ашигладаг.

solidity
function toggle() public {
    isActive = !isActive;    // true ↔ false солигдоно
}

address — Ethereum хаяг

address бол 20 байт (160 bit) урттай Ethereum хаяг хадгалах тусгай төрөл.

solidity
address public owner = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4;

address payable — ETH хүлээж авах боломжтой хаяг.

solidity
address payable public treasury;

// ETH илгээх боломжтой болно:
treasury.transfer(1 ether);

msg.sender — функцийг дуудаж байгаа хүний хаяг. Дараагийн хичээлд дэлгэрэнгүй үзнэ.

bytes ба bytes32

Bytes бол хоёртын (binary) өгөгдөл хадгалах төрөл.

solidity
bytes32 public documentHash;   // файлын hash хадгалахад
bytes   public rawData;        // дурын урттай хоёртын өгөгдөл

bytes32 нь gas хэрэглээний хувьд string-ээс хямд тул богино тогтмол урттай өгөгдөлд ашиглана.

solidity
bytes32 public constant ROLE_ADMIN = keccak256("ADMIN");

string — мөр (текст)

solidity
string public name = "Болд";
string public greeting = "Сайн уу!";

String Solidity-д reference type тул санах ойд хадгалагдах байршлаа заана. Bytes-тай харьцуулахад gas илүү зарцуулна.

solidity
// Богино, тогтмол текст → bytes32
bytes32 public constant TOKEN_NAME = "MNT";

// Урт, динамик текст → string
string public description = "Энэ бол Монгол төгрөгийн токен.";

Тогтмол (constant ба immutable)

solidity
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 шалгадаггүй байсан:

solidity
// Хуучин код (0.7.x) — АЮУЛТАЙ
uint8 x = 255;
x += 1;    // 255 + 1 = 0 болчихдог байсан!

Solidity 0.8.0-аас хойш overflow автоматаар шалгагдаж, revert болдог:

solidity
// Шинэ код (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-уудын ялгааг судална.