Block Chain ETC

Solidity 문법 정리

PON_Z 2022. 6. 29. 15:25

- 라이센스 : 스마트 컨트랙트에 대한 신뢰를 높이고, 저작권과 같은 문제를 해소하기 위해

코드 최상단에 라이센스를 명시한다. (아래 예시말고도 다양한 라이센스 존재)

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://velog.io/@skypcy71/%EC%86%94%EB%A6%AC%EB%94%94%ED%8B%B0-%EA%B8%B0%EB%B3%B8-%EB%AC%B8%EB%B2%95

https://wkimdev.github.io/blockchain/2018/11/23/eth-solidity/

 

 

 

 

728x90

'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