☃️ 솔리디티 기본 문법
1. 버전 명시 Pragma
솔리디티는 버전업이 매우 빠르기 때문에 솔리디티 코드 작성시 최상단에 컴파일러의 버전을 명시해준다.
// SPDX-License-Identifier: MIT => 관련된 라이센스가 존재하는 경우 추가적으로 명시해준다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8;
2. 참조 import
다른 컨트랙트를 불러와 사용하는 경우 작성한다.
// SPDX-License-Identifier: MIT
pargma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
3. 컨트랙트 contract
// SPDC-License-Identifier: MIT
pragma solidity ^0.8.0;
// 참조하는 다른 컨트랙트 없음
contract Example {
}
3-1. 상태 변수
컨트랙트 스토리지에 영구적으로 저장되는 값이다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
// 참조되는 컨트랙트 없음
contract Example {
// 상태변수 위치
// [타입] [접근성] [변수명];
uint256 public num;
string private secretKey = "secret";
}
[ 상태 변수의 접근성 ]
상태변수 타입 바로 뒤에 위치한다.
uint public count;
상태변수는 외부에서 접근할 수 없다.
💥 internal
컨트랙트 자신과 자식 컨트랙트만의 접근을 허용한다. 상태변수의 기본값이다.
💥 public
모든 접근을 허용한다.
💥 private
컨트랙트 자신만 접근 가능하다.
3-2. 함수
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Example {
string public owner = "ME";
// function 함수명 (){}
// function 함수명 ([타입] [인자]) 접근타입 returns (반환값 타입) {}
function setOwner(string memory _newOwner) public {
// 함수 파라미터로 string 타입 사용시에는 반드시 그 뒤에 memory를 붙여 준다.
owner = _newOwner;
}
}
[ 함수의 접근성 ]
함수 인자 값 받는 괄호 뒤에 위치한다.
function test(uint _x) external pure returns (uint) {}
- external
컨트랙트 외부에서 접근 가능, 내부에서 접근 불가. 컨트랙트 내에서 external 선언한 함수에 접근하기 위해서는 this를 사용해야 한다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract ExternalEx {
function test1 () external returns(uint) {
return 2;
}
function test2 (uint _num) public returns(uint) {
// uint test1Value = test1();
// 위의 경우 에러가 난다.
uint test1Value = this.test1();
uint test2Value = test1Value + _num;
return test1Value;
}
}
🔥 public
컨트랙트 내외부 모두에서 접근 가능. 함수의 기본값은 public이다.
🔥 internal
자기 자신과 자식 컨트랙트에서만 접근 가능.
🔥 private
외부에서 접근할 수 없고 자신만 접근 가능하다.
[ view와 pure ]
- view
함수에 view 사용한 경우 컨트랙트 스토리지 내 변수 읽기만 가능, 수정 불가능
- pure
함수에 pure 사용한 경우 컨트랙트 스토리지 내 변수 읽기 불가능, 수정 불가능
컨트랙트의 변수의 저장 공간은 storage와 memory이다.
storage는 블록체인 상에 영구적으로 저장되는 것이며,
memory는 임시적으로 저장되는 변수로 함수 실행 시 공간이 생성되며 함수 호출시 변수 저장 공간이 반환된다.
예를 들어 함수 외부의 멤버변수는 storage 공간에 위치하게 되며, 함수의 파라미터는 memory 공간에 생성된다.
더하기 마이너스 해주는 컨트랙트 ex)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Example {
uint8 public num;
function addOne() public returns (uint8) {
num += 1;
return num;
}
function addNum(uint8 _addNum) public returns (uint8) {
num = num + _addNum;
return num;
}
function minusNum(uint8 _minusNum) public returns (uint) {
num = num - _minusNum;
return num;
}
}
이름별 과목명 기록하는 컨트랙트 ex)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Class {
string teacher;
mapping ( string => bool ) public teachers;
mapping ( string => string ) public subjects;
function setSubject (string memory _teacher, string memory _subject) public {
teachers[_teacher] = true;
subjects[_teacher] = _subject;
}
function getSubjectByTeacher (string memory _teacher) public returns(string memory) {
return subjects[_teacher];
}
function existTeacherChk(string memory _teacher) public view returns(bool) {
if(!teachers[_teacher]) return false;
return true;
}
}
출처
https://intrepidgeeks.com/tutorial/basic-syntax-of-solidity#13