💡 Integers
https://tact-by-example.org/02-integers
정수 (Integers)
Tact도 Solidity 와 마찬가지로 int 타입만 지원하고 float 타입은 지원하지 않는다. 컨트랙트에서 사용되는 타입은 Solidity 와 마찬가지로 int이며, 부동 소수점의 불확실성을 피하기 위해 float 가 아닌 integer로 계산이 항상 이루어지게된다. int 의 런타임 타입은 항상 257 비트로, 모든 런타임 계산은 257 비트내에서 수행된다. 이는 우주의 원자수를 모두 포함할 수 있을만큼 충분히 크다.
상태 관리 비용 (Integers)
상태 변수는 인라인 혹은 init() 내부에서 초기화되는데, 상태 변수를 초기화하지 않으면 코드가 컴파일이 되지 않는다. int를 인코딩할 때 저장 비용을 줄이기 위해서 258비트보다 작은 표현이 사용되는데 상태 크기는 상태 변수 선언 뒤의 as 키워드에서 지정된다.
예시
i1: Int as int257 = 3001;
i9: Int as uint32 = 0;
비용을 계산해보면, 1000개의 257비트 정수를 저장하는 데는 약 0.184 TON이 소요되고 1000개의 32비트 정수를 저장하는 데는 약 0.023TON 이 소요된다. (2024년 5월 기준 TON COIN 가격: 1 TON = $5.64)
Example Code
1) Integers 라는 스마트 컨트랙트느느 @stdlib/deploy 라이브러리를 사용하고 있다.
2) Integers 라는 컨트랙트는 i1 ~ i14 까지 14개의 상태 변수가 선언되어 있다. 몇 가지만 살펴보면, i1 은 257 비트 크기의 정수를 나타내며, i2는 256 비트 크기의 양의 정수를 나타낸다.
import "@stdlib/deploy";
contract Integers with Deployable {
// contract persistent state variables
// integers can be persisted in state in various sizes
i1: Int as int257 = 3001; // range -2^256 to 2^256 - 1 (takes 257 bit = 32 bytes + 1 bit)
i2: Int as uint256; // range 0 to 2^256 - 1 (takes 256 bit = 32 bytes)
i3: Int as int256 = 17; // range -2^255 to 2^255 - 1 (takes 256 bit = 32 bytes)
i4: Int as uint128; // range 0 to 2^128 - 1 (takes 128 bit = 16 bytes)
i5: Int as int128; // range -2^127 to 2^127 - 1 (takes 128 bit = 16 bytes)
i6: Int as coins; // range 0 to 2^120 - 1 (takes 120 bit = 15 bytes)
i7: Int as uint64 = 0x1c4a; // range 0 to 18,446,744,073,709,551,615 (takes 64 bit = 8 bytes)
i8: Int as int64 = -203; // range -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 (takes 64 bit = 8 bytes)
i9: Int as uint32 = 0; // range 0 to 4,294,967,295 (takes 32 bit = 4 bytes)
i10: Int as int32 = 0; // range -2,147,483,648 to 2,147,483,647 (takes 32 bit = 4 bytes)
i11: Int as uint16 = 0; // range 0 to 65,535 (takes 16 bit = 2 bytes)
i12: Int as int16 = 0; // range -32,768 to 32,767 (takes 16 bit = 2 bytes)
i13: Int as uint8 = 0; // range 0 to 255 (takes 8 bit = 1 byte)
i14: Int as int8 = 0; // range -128 to 127 (takes 8 bit = 1 byte)
init() {
self.i2 = 0x83dfd552e63729b472fcbcc8c45ebcc6691702558b68ec7527e1ba403a0f31a8; // we can define numbers in hex (base 16)
self.i4 = 1507998500293440234999; // we can define numbers in decimal (base 10)
self.i5 = pow(10, 9); // this is 10^9 = 1,000,000,000
self.i6 = ton("1.23"); // easy to read coin balances (coins type is nano-tons, like cents, just with 9 decimals)
}
receive("show all") {
dump(self.i1);
dump(self.i2);
dump(self.i3);
dump(self.i4);
dump(self.i5);
dump(self.i6);
dump(self.i7);
dump(self.i8);
}
get fun result(): Int {
return self.i1;
}
}
'블록체인 > TACT' 카테고리의 다른 글
[Tact] Bools (0) | 2024.05.15 |
---|---|
[Tact] Integer Opertaions (0) | 2024.05.15 |
[Tact] Simple 카운터 (0) | 2024.05.07 |
[Tact] getter 함수 (0) | 2024.05.07 |
[TACT] TON 블록체인 개발을 위한 언어 (0) | 2024.05.07 |
댓글