Solidity là ngôn ngữ lập trình tĩnh được thiết kế đặc biệt cho việc phát triển Smart Contract trên Ethereum. Một trong những yếu tố cơ bản nhất khi làm việc với Solidity là hiểu biết về các kiểu dữ liệu mà ngôn ngữ này hỗ trợ. Dưới đây là một cái nhìn tổng quan về các kiểu dữ liệu chính trong Solidity và cách sử dụng chúng.
Kiểu Dữ Liệu Nguyên Thủy
1. Boolean
Kiểu bool
đại diện cho giá trị đúng hoặc sai. Các phép toán logic như &&
(và), ||
(hoặc), !
(phủ định) có thể được áp dụng cho các biến kiểu bool
.
solidity
bool public isActive = true;
2. Integer
Solidity hỗ trợ cả số nguyên có dấu (int
) và không có dấu (uint
) với kích thước từ 8 đến 256 bit, tăng dần theo bội số của 8 (ví dụ: uint8
, uint16
, uint256
). Mặc định, int
và uint
tương đương với int256
và uint256
.
solidity
uint256 public totalSupply = 1000;
int public balance = -100;
3. Address
Kiểu address
dùng để lưu trữ địa chỉ Ethereum. Có hai loại địa chỉ: address
và address payable
, trong đó address payable
có thể nhận Ether.
solidity
address public owner;
address payable public receiver;
4. Bytes
Solidity hỗ trợ kiểu dữ liệu bytes
với kích thước cố định từ bytes1
đến bytes32
và kiểu dữ liệu động bytes
.
solidity
bytes32 public constant id = keccak256(abi.encodePacked("identifier"));
bytes public data;
Kiểu Dữ Liệu Phức Tạp
1. Arrays
Mảng có thể được khai báo với kiểu dữ liệu cố định hoặc động và có thể chứa các kiểu dữ liệu nguyên thủy hoặc phức tạp.
solidity
uint[] public dynamicArray;
uint[10] public fixedArray;
2. Structs
Structs cho phép tạo các kiểu dữ liệu tùy chỉnh bằng cách kết hợp nhiều kiểu dữ liệu khác nhau.
solidity
struct Person {
string name;
uint age;
}
Person public alice = Person("Alice", 30);
3. Mappings
Mappings là cấu trúc dữ liệu cho phép lưu trữ các cặp khóa-giá trị, nơi khóa là duy nhất.
solidity
mapping(address => uint) public balances;
4. Enums
Enums cho phép tạo một tập hợp các hằng số được đặt tên và giới hạn.
solidity
enum State { Created, Locked, Inactive }
State public currentState = State.Created;
Sử Dụng Kiểu Dữ Liệu
Khi phát triển Smart Contract, việc lựa chọn kiểu dữ liệu phù hợp không chỉ giúp tối ưu hóa việc sử dụng gas mà còn đảm bảo tính an toàn và chính xác của dữ liệu. Dưới đây là một ví dụ về cách sử dụng các kiểu dữ liệu trong một Smart Contract đơn giản:
solidity
pragma solidity ^0.8.0;
contract Voting {
struct Candidate {
string name;
uint voteCount;
}
mapping(address => bool) public voters;
Candidate[] public candidates;
State public currentState = State.Created;
function addCandidate(string memory _name) public {
candidates.push(Candidate(_name, 0));
}
function vote(uint _candidateIndex) public {
require(!voters[msg.sender], "Already voted");
voters[msg.sender] = true;
candidates[_candidateIndex].voteCount += 1;
}
}
Trong ví dụ này, chúng ta sử dụng struct
để định nghĩa một ứng cử viên, mapping
để theo dõi cử tri đã bỏ phiếu, và một mảng động để lưu trữ danh sách các ứng cử viên. Điều này minh họa cách kết hợp các kiểu dữ liệu khác nhau để xây dựng logic phức tạp trong Smart Contract.
Kết luận
Kiểu dữ liệu trong Solidity là nền tảng cơ bản cho việc phát triển Smart Contract, giúp định nghĩa cấu trúc dữ liệu và logic xử lý. Việc hiểu rõ và sử dụng hiệu quả các kiểu dữ liệu sẽ giúp tối ưu hóa chi phí gas, tăng cường tính bảo mật và độ tin cậy của Smart Contract.