- 라이센스 : 스마트 컨트랙트에 대한 신뢰를 높이고, 저작권과 같은 문제를 해소하기 위해
코드 최상단에 라이센스를 명시한다. (아래 예시말고도 다양한 라이센스 존재)
ex)
// SPDX-License-Identifier: MIT
- solidity compile version : 특정 컴파일러의 버전을 표기할 때 사용, <= 와 같은 비교 연산자를 통해
구간의 버전을 지정할 수 도 있음
ex)
pragma solidity ^0.8.0;
- 접근 제어자 :
- 함수 타입 제어자
ex)
function getNumber() public view returns () {
// 스토리지값을 읽기만 하고 수정할 수 없음.
}
// pure를 붙이면 스토리지 변수를 읽거나 쓰지 않음 ex) 계산
function Add(uint a, uint b) pure internal returns (uint256) {
uint256 c = a + b;
return c;
}
// 지금은 constant 거의 안씀. 원래 view 처럼 쓰이는 것.
function getNumberOfStudents() public constant returns (uint) {
return numOfStudent;
}
// payable
- 코인을 보내거나 받으려면, 함수에 payable이 붙어야 한다.
function purchaseSlimeToken(uint256 _tokenId) external payable {
// 판매 등록되어 있는 가격 불러오기
uint256 price = slimeTokenPrices[_tokenId];
address tokenOwner = slimeBaseAddress.ownerOf(_tokenId);
// 가격이 0이하인 경우
require(price > 0, "Token is not on sale");
// 구매자가 돈이 충분하지 않은 경우
require(price <= msg.value, "Caller sent lower than price.");
// 사려는 사람이 이미 소유자인 경우
require(tokenOwner != msg.sender, "Caller is animal token's owner.");
// 토큰 소유자에게 이더 보내기
// payable(tokenOwner).transfer(msg.value);
payable(tokenOwner).transfer(price);
// slime 소유권 넘겨주기(tokenOwner -> msg.sender)
slimeBaseAddress.safeTransferFrom(tokenOwner, msg.sender, _tokenId);
// 판매 했으므로 가격 초기화
slimeTokenPrices[_tokenId] = 0;
}
- 자료형 :
(1) bool
(2) 정수형
=> int(uint) : 8bit ~ 256bit (C++의 int == int256)
(3) 주소형
=> 20byte 주소 (40글자)
ex) 0x4c69B45F2Fcc0D853EA9Ba8455D3555f8050e49f
(4) bytes 배열
=> 1 byte ~ 32 byte, (byte == bytes1), byte에 값을 저장할 때에는 hex로 넣어야함
ex) bytes32 x = "hello world"
(5) string
=> solidity는 bytes에 비해 가스비용이 더 요구되기 때문에 32byte이상일 떄만 string을
사용하도록 권장
(6) enum
- 참조 타입 :
(1) 상태변수는 기본적으로 storage를 쓰고 있음
(2) 매개변수로 넘겨졌을 때는 memory를 사용
(3) 배열은 storage로 저장
- 구조체 :
ex)
struct SlimeMetaData {
uint256 _id;
string _genes;
string _type;
uint256 _fatherTokenId;
uint256 _motherTokenId;
uint256 _health;
uint256 _attack;
uint256 _price;
}
- 매핑 : mapping(_keyType => _valueType)
ex)
// SlimeTokenId => price
mapping(uint256 => uint256) public slimeTokenPrices;
- 이벤트 : 이벤트를 발생시키면(emit 하면) 트랜잭션 스캔에 로그가 남음,
대신 가스비가 더 요구되므로 꼭 필요한 부분에만 사용 주의
ex)
contract EventTest {
mapping(address => uint256) private _counts;
event Increase(address myAddress, uint256 value);
function increaseWithEvent() public returns (bool) {
uint256 value = _counts[msg.sender];
_increase();
emit Increase(msg.sender, value);
return true;
}
function _increase() private {
_counts[msg.sender] += 1;
}
}
- 글로벌 변수(솔리디티 내장 변수) :
(1) block : 블록에 대한 정보를 가진 변수
blockhash(uint blocknumber): 주어진 블록의 해시를 bytes32 형태로 반환
코인베이스: 블록의 채굴자 주소로 address 형식
(velog의 오류로 코인베이스를 영어로 입력하면
강제 비공개 처리되어 한글로 적음)
gaslimit: 블록의 가스 한도로 uint 형식
number: 블록의 번호로 uint 형식
timestamp: 블록 타임스탬프로 uint 형식
(2) msg : 컨트랙트를 시작한 트랜잭션 콜이나 메시지 콜에 대한 정보를 가지고 있다.
gasleft(): 남아있는 가스의 양을 uint256 형태로 반환
data: 전체 콜데이터 본문으로bytes 형식
sender: 현재 호출을 수행하고 있는 메시지 발신자로 address 형식
gas: 남은 가스양으로 int 형식
value: 메시지와 함께 보낸 이더 금액으로 uint 형식
ex) msg.sender면 컨트랜트를 배포한 사람을 뜻함
(3) tx : 트랜잭션 데이터를 가진 변수
gasprice : 트랜잭션 가스 비용으로 uint 형식
origin: 트랜잭션 발신자로 address 형식
(4) this : 현재 컨트랙트를 참조하는 변수로 컨트랙트의 주소로 암시적 변환
- constructor, selfdestruct : 컨트랙트 상태를 초기화, 컨트랙트 소멸
ex)
pragma solidity ^0.8.7;
contract exmapleC {
address public account;
constructor(address _account) internal {
account = _account
}
}
selfdestruct(컨트랙트 생성자의 주소);
- 함수 변경자(modifier) :
함수를 선언할 때 modifier를 추가하여 함수가 실행되기 전, 요구조건을 만족하는지 확인 가능
변경자를 작성할 때에는 _;를 사용하여 _;를 기준으로
앞 부분은 함수 실행 전, 뒷 부분은 함수가 실행된 후에 적용되는 코드
ex)
int public num = 0;
modifier changeNum {
num++; // 함수 실행 전 실행됨
_; // 함수 실행
num--; // 함수 실행 후 실행됨
}
function func() public changeNum {
if (num == 1) {
// do something
}
}
- 에러 핸들링 :
revert : 해당 함수를 종료하고 에러를 return
require :설정한 조건이 참인지 확인하고, 조건이 거짓이면 에러를 return
assert : require처럼 조건을 확인하며 동작하지만, 사용하지 않은 가스를 호출자에게 반환하지 않고,
공급된 가스를 상태를 원래대로 되돌리는데 모두 사용
- 추가(+)
ref)
https://wkimdev.github.io/blockchain/2018/11/23/eth-solidity/
'Block Chain ETC' 카테고리의 다른 글
블록체인 개념 정리#3 (0) | 2022.07.01 |
---|---|
블록체인 개념 정리#2 (0) | 2022.06.30 |
블록체인 개념 정리#1 (1) | 2022.06.30 |
BlockChain Trilemma (0) | 2022.05.30 |
Mainnet (0) | 2022.01.03 |