data type
// SPDX-License-Identifier: GPL-3.0
pragma solidity >= 0.7.0 < 0.9.0;
contract datatype {
// boolean: true/false
bool public b = false;
// bytes
bytes4 public bt1 = 0x12345678; // 4바이트를 넣을 수 있도록 타입을 지정할 수 있다.
bytes public bt2 = "STRING"; // 솔리디티에서 자동으로 바이트화되어 저장된다.
// address
address public addr = 0xABC...... (총 20바이트)
// int vs uint
int8 public it = 4; // int8범위: -2^7 ~ 2^7 - 1
uint256 public uit = 1634242; // 0 ~ 2^8 - 1
}
gas와 ether 단위
// SPDX-License-Identifier: GPL-3.0
pragma solidity >= 0.7.0 < 0.9.0;
contract hello {
uint256 public value1 = 1 ether;
uint256 public value2 = 1 wei;
uint256 public value3 = 1 gwei;
}
function
// SPDX-License-Identifier: GPL-3.0
pragma solidity >= 0.7.0 < 0.9.0;
contract hello {
uint256 public a = 100;
// 1. paramter, return 값이 없는 function 정의
function changeA1() public {
a = 200;
}
// paramter는 있고 return 값이 없는 function 정의
function changeA2(uint256 _value) public {
a = _value;
}
// paramter, return 값 모두 있는 function 정의
function changeA3(uint256 _value) public returns(unit256) {
a = _value;
return a;
}
}
접근제어자 - public, private, internal, external
// SPDX-License-Identifier: GPL-3.0
pragma solidity >= 0.7.0 < 0.9.0;
contract hello {
/**
1. public: 모든 곳에서 접근 가능
2. external: public처럼 모든 곳에서 접근 가능하나, external이 정의된 자기자신 컨트랙 내에서 접근 불가
3. private: 오직 private이 정의된 자기 컨트랙에서만 접근 가능(private이 정의된 컨트랙을 상속받은 자식도 불가능)
4. internal: private처럼 오직 internal이 정의된 자기 컨트랙에서만 가능하고 internal이 정의된 컨트랙을 상속받은 자식도 접근 가능
**/
// 1. public
uint256 public a = 100;
// 2. private
uint256 private b = 100;
}
view, pure
// SPDX-License-Identifier: GPL-3.0
pragma solidity >= 0.7.0 < 0.9.0;
contract hello {
/**
1. view: function 밖의 변수들을 읽을 수는 있지만, 값 변경은 불가능함
2. pure: function 밖의 변수들을 읽을 수 조차 없음
3. view, pure 아무것도 없는 경우: function 밖의 변수들을 읽어서 변경을 해야함.
**/
// 1. view
uint256 public a = 1;
function read_a1() public view returns(uint256) {
return a + 2;
}
// 2. pure
function read_a2() public view returns(uint256) {
uint256 public b = 100;
return b + 2;
}
// 3. view, pure x
function read_a3() public view returns(uint256) {
a = 13;
return a + 2;
}
}
view, pure 함수는 블록체인에 저장 용도로 사용되지 않기 때문에 가스비가 들지 않습니다.
storage, memory, colldata, stack
// SPDX-License-Identifier: GPL-3.0
pragma solidity >= 0.7.0 < 0.9.0;
contract hello {
/**
1. storage: 대부분의 변수, 함수들이 저장되며 영속적으로 저장이 되어 가스 비용이 비싸다.
2. memory: 함수의 파라미터, 리턴 값, 레퍼런스 타입이 주로 저장된다.
그러나, storage처럼 영속적이지 않고 함수내에서만 유효하기에 storage보다 가스 비용이 싸다.
3. colldata: 주로 external function의 파라미터에서 사용된다.
4. stack: EVM에서 stack data를 관리할 때 사용하는 영역인데 1024MB 제한적이다.
**/
// storage 값을 읽지도, 바꾸지도 않고 함수 내에서만 사용하므로 pure를 붙인다.
function get_string(string memory _str) public pure returns(string memory) {
return _str;
}
function get_uint(uint256 _ui) public pure returns(uint256) {
return _ui;
}
// memory 영역 예시
// string 자료형은 기본 자료형이 아닌 레퍼런스 타입이라 memory 키워드를 명시해야 합니다.
function printArg1(string memory _str) public {}
// 반면, uint256은 기본 자료형이라 memory 키워드를 생략해도 됩니다.
function printArg1(uint256 _num) public {}
}