내맘대로 Study/블록체인

[solidity] 개발자를 위한 속성 문법

jinkwon.kim 2022. 4. 11. 00:05
728x90
반응형

개요

본 post는 적어도 하나의 언어를 안다는 가정에 하에 작성 되었습니다. 

그리고 모든 code의 test는 https://ide.klaytn.com/ 에서 테스트 되었습니다.

Solidity의 관점에서 컨트랙트란

무수한 코드들(함수)과 데이터(상태)가 Ethereum 블록체인의 특정 주소에 존재하는 것입니다.

기본 구조

1.  Licsense 명시 

    -  SPDX-License-Identifier: GPL-3.0

2. 버전 명시

    - pragma 라는 keyword를 사용해서 smart contract가 지원하는 solidity 버전 을 명시 합니다.

    1) 특정 지원 버전 명시

        - pragma solidity ^0.8.4;

    2) 지원 범위 명시

        - pragma solidity >=0.4.0 <0.6.0;

3. 계약 정의

    - contract "계약명" {

       }

    - 계약 정의는 일반 적인 programming과 동일 하게 작성이 됩니다.

4. contract 기본 구조

// 1. 라이센스 명시
// SPDX-License-Identifier: GPL-3.0

// 2. 버전 명시
pragma solidity ^0.8.4;

// 3. contract 정의
contract basic{
    // 여기에 코드를 작성
}

contract를 구성하는 항목

    - contract는 다음 7가지를 사용하면 만듭니다.

    1. 중요 키워드

    2. constructor()

    3. state variable

    4. struct type

    5. enum

    6. function 

    7. modifier

    8. event

1 중요 키워드

- 다음 키워드드들은 변수 또는 함수에서 사용되는 중요 키워드들을 나열한 것입니다.

1. visibility (접근 제어자)

항목 설명
public - 변수를 외부에 노출이 가능 하게 만듭니다.
  외부에 노출 가능하다는 의미는 다른 contract에서 호출 가능 하다는 의미 입니다.
- public을 사용 할 경우 자동으로 해당 변수 값을 돌려주는 Getter 함수가 생성이 됩니다.
  Getter함수는 변수명이랑 동일한 이름으로 생성됩니다.
- contract 내부 함수들끼리 참조하여 사용 가능
private - 컨트랙 내부만 호출가능
external - 상태 변수에서 사용 못함.
- 외부 컨트랙트만 호출 가능
- 상태변수는 external 사용 불가
- contract 내부 함수들 끼리 서로 참조해서 사용 못함
- public으로 변경 가능
internal - 컨트랙 내부 호출 가능.
- 상속받은 컨트랙도 호출 가능.
- 상태변수는 디폴트로 internal 선언

2. 자료형의 type

type keyword 설명 
reference memory - 함수 내에서 유요한 여역에 저장
- storage 이외는 모두 memory이다.
- 휘발성 data
reference storage - state variables와 같이 영속적으로 저장되는 영역에 저장
- block chain에 기록 되는 값들 입니다. 
reference calldata - external 함수 인자에 사용되는 공간

    1) 유의 사항 

        - 서로 다른 영역을 참조하는 변수 간 대입이 발생시 데이터 복사

            Ex) storage => memory / calldata

                  anything => storage

3. 유형

유형 설명
view 데이터 read-only
pure - 데이터 읽지 않음
- 인자 값만 활용해서 반환 값 정함
constance - 0.4.17 버전이전에는 view/pure 대신쓰임 (현재는 사용 할일 없을듯)
payable 함수에서 사용 시 : ethereum을 송/수신 할때 사용 합니다.

2 constructor()

    - contract를 생성 할 때 단 한번 실행 되는 code

3 state variable

1. 정의

    - solidity에서는 함수 밖에서 선언한 변수를 상태변수(state variable)이라고 부른다.

    - state variable이라고 불리는 이유는 블록체인에 영구히 기록 되기 때문 입니다.

    - 단, 함수에서 안에서 선언한 변수는 블록체인에 기록 되지 않기 때문에 state variable이 아닙니다.

2 선언에 사용되는 자료형

종류 비고
boolean true, false  
int ~ int256   - int256 = int
- 8비트 단위로 존재 
uint ~ uint256   - (uint256 =uint)
- 8비트 단위로 존재 
 fixed/ufixed   - 고정 소수점
address
  - 20바이트(이더리움 address의 크기)를 담을 수 있습니다.
-Address 관련
- balance, transfer, send, call, callcode, delegatecall 의 멤버를 가지고 있습니다. 
bytes ~ bytes32
bytes2 test = 'ab';

test[1] //a
test[2] //b
test[1] = 'cc' //error
- 고정 크기 바이트 배열
- byte[]로도 사용 가능 하지만, 배열 아이템간 31byte 패딩이 추가되어 
  공간 낭비가 발생한다.
bytes
  - 동적 크기 바이트 배열
- 임의의 길이의 원시 바이트를 처리 할 때 사용
string
"test" - 동적 크기 바이트 배열
- 임의이 길이의 문자열(UTF-8)데이터를 처리 할 때 사용
function https://solidity-kr.readthedocs.io/ko/latest/types.html#function-types 함수 타입의 변수는 함수에서 할당 될 수 있으며 함수 타입의 함수매개변수는 함수가 호출될 때, 함수를 전달하거나 반환하는데 사용될 수 있습니다. 함수 타입에는 두 종류가 있습니다 - 내부 및 외부 함수 입니다:
mapping   - 제약 사항
    - storage로만 쓸 수 있다. (state variable로만 선언가능)
    - 함수안에서 사용 불가능 하다

- hashtable과 유사 
- 배열 처럼 사용 
array T[k] x;    // 1차원 배열
T[][k] x;  // 2차원 배열
c++언어에서의 개념과 같음 그러나  사용법이 상이
- storage로 선언된 array만 size가 가변적으로 늘어날수 있습니다. 
- memory로 선언시 크기를 고정 해야 합니다. 
- 차원 배열시 특시정 
  T[][k] x;  // k개의 T를 담을 수 있는 가변 배열 x선언
                // 일반 적인 언어에서는 T[k][] 한다.
- push로 아이템 추가 가능
- delete 하면 array가 초기화 됩니다.

3. 선언 방식

    자료형 visibility 이름 = data;

contract Count {
    uint public count = 0;
    address public lastParticipant;
}

4 struct type

1. 정의 

    - solidity에서 제공하지 않는 새로운 자료형을 만들때 사용 합니다. 

    - c나 c++ 에 존재하는 strcut 와 동일 합니다.

    - struct를 구성 할 때의 자기 자신을 넣을 수 없다는 것외에는  어떤 것을 넣든지 제약은 없습니다.

2. 예제

contract Ballot{
    struct Voter {
        uint weight;
        bool voted;
        address delegate;
        uint vote;
    }
}

5 enum

1. 정의

    - 변경되지 않는 상수를 정의 할때 사용 합니다. 

    - c나 c++의 enum과 동일 합니다. 

2. 예제 

contract Ballot{
    enum Status {
        Open,
        Closed
    }
}

6 Function

1. 함수의 역활 

    - 솔리디티 함수는 코드 안에 변수로 선언된 변수를  변경하거나 불러옴.

2. 함수 문법 

3. 문법 항목 설명 

    1) visibility (접근 제어자)

        - contract 외부에서 해당 함수를 볼수 있을지 없을지를 설정 합니다.

        - 상속에도 영향을 준다.

항목 설명
public - 변수를 외부에 노출이 가능 하게 만듭니다.
  외부에 노출 가능하다는 의미는 다른 contract에서 호출 가능 하다는 의미 입니다.
- public을 사용 할 경우 자동으로 해당 변수 값을 돌려주는 Getter 함수가 생성이 됩니다.
  Getter함수는 변수명이랑 동일한 이름으로 생성됩니다.
private - 컨트랙 내부만 호출가능
external - 상태 변수에서 사용 못함.
- 외부 컨트랙트만 호출 가능
- 상태변수는 external 사용 불가
- contract 내부 함수끼리 서로 참조 못함.
internal - 컨트랙 내부 호출 가능.
- 상속받은 컨트랙도 호출 가능.
- 상태변수는 디폴트로 internal 선언

    2) 유형

유형 설명
view 데이터 read-only
pure - 데이터 읽지 않음
- 인자 값만 활용해서 반환 값 정함
constance - 0.4.17 버전이전에는 view/pure 대신쓰임 (현재는 사용 할일 없을듯)
payable 함수에서 사용시 : ethereum을 송/수신 할 때 사용 합니다.

    3) modifier

        - modifer 함수를 명시 합니다 (아래에서 modifier가 뭔지 설명 합니다)

7 Function modifier

1. 정의 

    - 함수의 실행 전, 후 성격을 정의

    - 대부분의 경우 함수의 실행 조건을 정의하는데 사용됨.

2. 정의 방법

     - require() 함수로 실행 조건을 명시

     Ex) require(msg.sender == chairperson, "only ther chaireperson can call");
           // require에서 앞에 조건이 true이면 문제 없음.
           // 조건이 false이면 , 뒤에 메시지를 보여주면서 종료가됨

3. 예제 코드

    - msg.sender (함수를 실행한 사람의 주소)

contract Ballot {
    constructor() public { chairperson = msg.sender; }
    address chaireperson;
    modifier onlyChair {
        require(msg.sender == chairperson, "only ther chaireperson can call");
        // require에서 앞에 조건이 true이면 문제 없음.
        // 조건이 false이면 , 뒤에 메시지를 보여주면서 종료가됨
        _;
    }
    
    function giveRightToVote(addreess to) public onlyChair {
    // 'onlyChair' modifier ensures that this function is called by ther chaireperson
    }
}

8 Event

1. 정의 

    - EVM(Ethereum Virtual Machine)로깅을 활용한 시스템 입니다.

2. 기능

    - event가 실행 될 때 마다 transaction Log에 저장 합니다.

    - 저당된 Log는 contract 주소와 연동되어 client가 RPC로 조회 가능하게 해줍니다.

3. 언제 사용된는가

    - transaction을 보내고 transaction이 block에 기록될 때 마다 transaction은 자기 로그를 남길 수 있습니다. 

      그래서 event를 생성하면 transacntion Log라는 공간에 기록을 남기게 됩니다.

      그리고 나중에 contract 주소로 조회가 가능 합니다.

     - client가 event를 listenning 하는데 사용 됩니다. block이 나올 떄 마다 어떤 event를 발생 했는지 확인이 가능 합니다.

       client는 listening하고있는 contract의 event가 발생하면 무언가 하게끔 만들 수 있습니다.

4. 예제 코드

    1) contract 예제 코드 

        - Voted라는 event를 만들고 vote가 실행되면 emit을 사용하여 Voted event를 발생 시킵니다.

contract Ballot{
    event Voted(address voter, uint proposal);
    function vote(uint proposal) public {
        ...
        emit Voted(msg.sender, proposal);
    }
    
}

    2) client 예제 코드 

        - caver를 사용해서 contract를 생성하고 해당 contract의 event를 listenning 하는 코드 입니다. 

const BallotContract = new caver.klay.Contract(abi, address);
BallotContract.event.Voted(
    { fromBlock: 0 },
    function(error,event) {
        console.log(event);
    }
).on('error', console.error)

 

contract는 간결 해야한다.

1. proxy contract로 

 

 

 

참조사이트 

https://www.youtube.com/playlist?list=PLKqrwxupttYEcJhWAw0E_5RVpDD9LD6Q- 

 

Klaytn 클레이튼 스마트계약과 탈중앙앱 강의

이 수업은 한양대학교 일반대학원(석사과정) 블록체인 융합학과에서 한 학기동안 진행하게 된 블록체인 플랫폼 클레이튼을 활용한 스마트계약과 탈중앙앱 개발에 대한 수업입니다. 이 강의를

www.youtube.com

https://solidity-kr.readthedocs.io/ko/latest/

 

Solidity — Solidity 0.5.10 documentation

Solidity는 스마트 컨트랙트를 구현하기 위한 컨트랙트 기반의 고급 프로그래밍 언어입니다. Solidity는 C++, Python, 그리고 JavaScript의 영향을 받아 만들어졌습니다. 그리고 Ethereum Virtual Machine(EVM)에서

solidity-kr.readthedocs.io

 

728x90
반응형