Numbers

Kiểu dữ liệu uint giúp lưu các giá trị số nguyên không dấu.

Info

Trong Solidity, uint thực chất là một alias của uint256.

Ngoài ra còn các kiểu dữ liệu số nguyên không dấu với ít bit hơn: uint8, uint16, uint32, etc.

Solidity cũng có hỗ trợ toán tử lũy thừa tương tự như Python:

uint x = 5 ** 2; // equal to 5^2 = 25

Cũng như là các toán tử thao tác với bit: <<, >>.

Tip

Với một kiểu số nguyên x bất kỳ, ta có thể sử dụng type(x).min hoặc type(x).max để truy cập đến giá trị nhỏ nhất và giá trị lớn nhất mà kiểu đó có thể biểu diễn.

Structs

Struct trong Solidity khá tương tự với C++:

struct Person {
	uint age;
	string name;
}

Để khai báo một struct với các giá trị khởi tạo thì ta dùng cú pháp sau:

Person person = Person(172, "Satoshi");

Arrays

Solidity cũng có hai loại mảng tương tự như C/C++ là mảng tĩnh và mảng động.

uint[2] fixedArray; // array with a fixed length of 2 elements.
 
string[5] stringArray; // another fixed array, can contain 5 strings.
 
 
uint[] dynamicArray; // a dynamic array - has no fixed size, can keep growing.

Ta có thể tạo mảng các struct và thêm vào mảng này một instance của struct bằng hàm push:

Person[] people; // dynamic Array, we can keep adding to it.
 
// Create a new person:
Person satoshi = Person(172, "Satoshi");
 
// Add that person to the array:
people.push(satoshi);

String

Kiểu string ở trong Solidity về bản chất là một mảng động. Ta có thể sử dụng một mảng bytes để lưu chuỗi nhằm tối ưu tốc độ.

Để so sánh hai chuỗi, ta cần so sánh dạng hash của chúng:

bool comparison = keccak256(abi.encodePacked((str1))) == keccak256(abi.encodePacked((str2)));

Seealso

Xem thêm về Keccak256.

Mappings

Tương tự như dictionary trong các ngôn ngữ lập trình khác.

// For a financial app, storing a uint that holds the user's account balance:
mapping (address => uint) accountBalance;
 
// Or could be used to store / lookup usernames based on userId
mapping (uint => string) userIdToName;

Mapping lưu dữ liệu theo cặp key-value.

Minh họa việc sử dụng mapping ở trong Solidity:

Nếu ta truy cập đến một key nào đó không có trong mapping, nó sẽ trả ra giá trị mặc định của values. Chẳng hạn như xét mapping accountBalance ở trên, giá trị mặc định nhận được sẽ là 0 (là giá trị mặc định của kiểu uint).

Hiện tại thì mapping có các hạn chế sau:

  • Không hỗ trợ kiểm tra xem một key nào đó có tồn tại ở trong mapping hay không (vì nó trả ra giá trị mặc định nên ta không chắc được).
  • Không thể sử dụng tham số có kiểu là mapping đối với các hàm public hay external.

Address

Kiểu dữ liệu này giúp lưu trữ các loại địa chỉ có trong mạng lưới của Ethereum. Một địa chỉ sẽ được sở hữu bởi một cá nhân hoặc một smart contract nào đó.

Về bản chất, kiểu dữ liệu address là một số nguyên 20 bytes.

Biến msg Là một biến toàn cục, thuộc tính sender của msg giúp lưu địa chỉ của user hoặc smart contract đang gọi thực thi hàm hiện tại.

Note

Chú ý: một contract sau khi được deployed lên blockchain thì sẽ không tự hoạt động cho đến khi có một địa chỉ nào đó gọi các hàm của nó.

Ví dụ sử dụng msg.sender và cập nhật mapping:

mapping (address => uint) favoriteNumber;
 
function setMyNumber(uint _myNumber) public {
	// Update our `favoriteNumber` mapping to store `_myNumber` under `msg.sender`
	favoriteNumber[msg.sender] = _myNumber;
}
 
function whatIsMyNumber() public view returns (uint) {
	// Retrieve the value stored in the sender's address
	// Will be `0` if the sender hasn't called `setMyNumber` yet
	return favoriteNumber[msg.sender];
}

Default Values

Giá trị mặc định của các biến khi khai báo đều là giá trị 0. Ví dụ với bool thì là false, uintint thì là 0.

Các phần tử trong mảng tĩnh sẽ có giá trị mặc định tùy thuộc vào kiểu của nó. Với mảng động hoặc string, giá trị mặc định sẽ là mảng rỗng hoặc chuỗi rỗng.

Giá trị mặc định của kiểu address0x0000000000000000000000000000000000000000.