State Variables (상태변수) : 컨트랙트 메모리에 영원히 저장됨
state variables (상태변수를)를 트랜잭션에서 수정하는 것은, 나중에 변수를 읽으려는 모든 사용자에 대해 값이 변경된다.
Solidity에서 상태 변수를 선언하는 것은 계약 내 변수를 선언하는 것만큼 간단하다.
contract Contract {
bool myVariable;
}
솔리디티(Solidity)의 데이터 유형에는 기본값이 있으며, boolean의 경우는 기본값이 false이다. 그래서 이 계약서를 배포한 후에 myVariable은 거짓이 된다.
여기서, 해당 변수를 public하게 하고, 기본값을 true로 한다면,
contract Contract {
bool public myVariable = true;
}
이다.
public키워드는 변수에 대한 getter 함수가 자동으로 생성됩니다.
일부 Solidity 단계에서는 validation(검증)을 제공합니다. 이 는 맞춤법이 틀리거나 예기치 않은 데이터 유형으로 문제를 신속하게 디버깅하는 데 도움이 된다.
validation에는 응용 프로그램 바이너리 인터페이스를 나타내는 Solidity ABI가 사용된다. 이 인터페이스는 스마트 컨트랙트에 대한 정보를 외부 관찰자에게 제공하는 솔리디티 컴파일러의 출력이다.
예를 들어 task tab의 컨트랙트는 다음과 같다.
contract Contract {
bool public myVariable = true;
}
JSON에서 본 계약에 대해 생성된 ABI는 다음과 같다.
[
{
"inputs": [],
"name": "myVariable",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
}
]
해당 ABI 파일은, 입력은 없으며 bool에 대한 출력을 보여주는 myvariable 함수를 보여준다.
unsigned integer 란 모든 음수 양수를 포함하는 정수다.
솔리디티에는 uint라는 부호(sign) 없는 정수에 대한 특정 데이터 유형이 있다. uint는 그것을 위해 예약된 비트 수로 접미사를 붙일 수 있다. 예를 들 uint8은 변수의 값으로 제공되는 8비트를 의미합니다.
8비트의 unit 범위는 어떨까?
8비트의 범위는 00000000 ~ 11111111입니다. 이 범위는 256개의 고유 값을 나타낼 수 있습니다.
부호(sign) 있는 정수는 키워드 int로 선언할 수 있다. int와 마찬가지로 키워드 int는 256비트의 메모리를 저장하는 데이터 형식의 줄임말이다.
uint8: Ranges from 0 to 255
int8: Ranges from -128 to 127
Solidity에서 고정 크기 및 동적 크기의 두 가지 유형의 바이트 배열을 만들 수 있다. 지금은 고정 크기열에 초점을 맞추려고 합니다.
바이트에 접미사로 숫자를 추가하여 1에서 32바이트까지 예약 가능한 바이트 크기의 배열을 만들 수 있다.
bytes1 a = 0x1f; // 0001 1111
bytes2 b = 0xbeef; // 1011 1110 1110 1111
bytes3 c = 0xabcdef; // 1010 1011 1100 1101 1110 1111
byte b = 0xa3; // <-- byte is an alias for bytes1
자바스크립트에서처럼 큰따옴표를 사용하여 문자열들을 만들 수 있다
문자열 리터럴 "Hello World"는 Solidity에서 완벽하게 유효하다.
고정 값을 리터럴로 설명하는 경우가 많습니다. "Hello World" 값은 문자열 데이터 형식과 구별되는 문자열 리터럴로 설명할 수 있다. 임의의 고정 값은 문자 그대로, "Hello World", 42 또는 true일 수 있습니다.
문자열 리터럴은 바이트 및 문자열 형식 모두에 저장할 수 있습니다.
bytes msg1 = "Hello World";
string msg2 = "Hello World";
문자열이 32 bytes보다 짧으면 bytes32와 같은 고정 크기 바이트 배열에 저장하는 것이 더 효율적이다. 메모리를 미리 할당하기 때문에 계산이 간단하다.
반면에 문자열과 bytes는 문자열의 크기에 따라 동적으로 메모리를 할당한다.
Enum 형은 clean code를 쓰도록 도와준다.
if(player.movement == 0) {
// player is moving up
}
else if(player.movement == 1) {
// player is moving left
}
위에 코드는, 하지만 완벽한 계획은 아니다.
movement 번호가 코드의 다른 곳에서 생성되고 있다. 해당 번호가 바뀐다면 코드는 깨질수있다.
게다가, 주석이 없다면, 어느 쪽이 어느 쪽인지 구분할 방법이 없다.
따라서 enum이 이를 해결할 수 있다
enum Directions = { Up, Left, Down, Right }
if(player.movement == Directions.Up) {
}
else if(player.movement == Directions.Left) {
}
숫자가 명확한 방향으로 대체될 뿐만 아니라 우리의 모든 방향을 규정하는 구조를 가지고 있다. 만약 숫자가 바뀌어도 이 구조를 다른 계약들과 공유할 수 있다.