[Web3.0]/블록체인

솔리디티 기본 문법

_niel 2022. 7. 19. 16:55

1. 버전명시

- pragma 키워드를 이용해서 smart contract가 지원하는 solidity 버전을 명시한다.

pragma solidity ^0.8.7;

 

2. 계약(contract)

일반적인 언어에서의 class와 같은 개념이다. 이더리움과 비트코인의 가장 큰 차이중 하나이다. 모든 코드의 실행은 contract 안에서 이루어진다.

contract SimpleStorage {
    uint storedData;

    function set(uint x) public {
        storedData = x;
    }

    function get() public view returns (uint) {
        return storedData;
    }
}

- unit : 256비트의 양의정수 타입, unit 타입의 storedData 가 변수로 선언

- set, get : 변수의 값을 변경하거나 조회하기 위한 함수

** 상태 변수에 접근할때 다른 언어에서 일반적으로 사용되는 this. 키워드는 사용하지 않는다.

 

3. Contract의 키워드

1. visibility (접근 제어자)

public - 변수를 외부에 노출 가능 = 다른 contract에서 호출가능
- public을 사용 할 경우 자동으로 해당 변수를 반환하는 getter 함수 생성 (getter함수는 변호명이랑 동일한 이름)
- contract 내부 함수들끼리 참조하여 사용가능
private - 컨트랙트 내부만 호출가능
external - external을 붙인 함수(변수)는 컨트랙트의 외부에서만 호출 될 수 있다.
- 외부 컨트랙트에서만 호출 가능
- public으로 변경 가능
internal - private과 유사하나, 상속을 받은 컨트랙트(자식 컨트랙트)에서는 함수(변수)를 사용 할 수 있게함

2. 자료형 타입

reference memory - 함수 내에서 유효안 영역에 저장
- storage 이외에는 모두 memory이다.(휘발성)
reference storage - state variables와 같이 영속적으로 저장되는 영역에 저장
- blockchain에 기록되는 값들
reference calldata - external 함수 인자에 사용되는 공간

3. 접근유형(함수에 사용)

public pure 같은 형식으로 제어자를 여러개 나열

view storage 레벨에 있는 자료를 읽을수 있음, 수정은 불가
pure - storage 레벨에 있는 자료를 읽을 수 없음
- 함수 안의 인자 값만 활용해서 반환 값 정함
payable 함수에서 사용 시 : ethereum을 송/수신할때 사용

 

4. Contract의 구성요소

- constructor()

- state variable

- struct type

- enum

- function

- modifier

- event

 

1. constructor()

 contract를 생성시 실행

contract A{
    
    string public name;
    uint256 public age;
    
    constructor(string memory _name, uint256 _age){
        name = _name;
        age = _age;
    }
        
}

contract B{
    
  A instance = new A("Alice", 52);

}

 

2. state variable

 

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

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

- 함수안에서 선언한 변수는 블록체인에 기록 되지 않지 때문에 state variable이 아님

boolean true, false  
int ~ int256   - int256 = int
- 8비트 단위로 존재
uint ~ uint256 부호가 없는 양의정수(0포함) - (uint256 = uint)
- 8비트 단위로 존재
fixed/unfixed   - 고정 소수점
address   - 20바이트(이더리움 address의 크기)를 담을 수 있습니다.
- 솔리디티의 함수 호출은 항상 외부 호출자가 시작한다. 따라서 함수를 호출한 사람은 무조건 존재하고 그 사람의 주소를 address 자료형으로 받을 수 있다.
- balance, transfer, send, call, callcode, delegatecall의 멤버를 가지고 있습니다.
bytes ~ bytes32 byte2 test = 'no'
test[0] // n
test[1] // o
test[1] = 'cc' // error
- 고정 크기 바이트배열
- byte[]로도 사용 가능하지만, 배열 아이템간 31byte 패딩이 추가되어 공간낭비 발생
- delete test[1]// test == ['n']
- test.pop() ; // test ==['n']
bytes   - 동적 크기 바이트배열
- 임의의 길이의 원시 바이트를 처리할때 사용
string "test" - 동적 크기 바이트배열
- 임의이 길이의 문자열(UTF-8)데이터를 처리 할 때 사용
function   - 함수타입의 변수는 함수에서 할당될 수 있다
- 함수타입의 함수매개변수는 함수가 호출될때, 함수를 전달하거나 반환하는데 사용
- 내부함수 / 외부함수로 두가지 타입이 있다.
mapping   - storage로만 쓸 수 있다.(state variable로만 선언가능)
- 파이썬의 딕셔너리(해시태이블 자료구조)
- JS와 다르게 key와 value의 타입을 미리 선언해야 한다.

// key: uint 형, value: address 형
mapping(uint => address) public zombieToOwner;
array T[k] x; // 1차원 배열
T[][k] x; // 2차원 배열
- storage로 선언된 array만 size가 가변적으로 늘어날 수 있다.
- memory로 선언시 크기를 고정 해야 한다.
- 차원 배열시 특이점
T[][k] // k개의 T를 담을 수 있는 가변배열 x 선언, 일반 언어에서는 T[k][]
-push로 아이템 추가

선언방식 : 자료형 키워드 이름 = data;

contract Count {
	unit public count = 0;
    adress public lastParticipant;
}

 

3. struct type

- solidityd에서 제공하지 않는 새로운 자료형을 만들때 사용

- c나 c++ 의 struct와 동일 (타입 인터페이스)

- struct를 구성 할 때 자기 자신을 넣을 수 없다는것 외엔 제약 없음

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

 

 

4. enum

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

contract Ballot{
    enum Status {
        Open,
        Closed
    }
}

 

 

5. function

function 함수명 visibility 접근유형 modifier return (반환자료형)

 

 

6. modifier

 

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

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

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

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
    }
}

 

 

7. event

 

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

- event가 실행 될 때마다 transaction log에 저장

- 저장된 logs는 contract 주소와 연동되어 client가 RPC로 조회 가능하게

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

- client가 event를 listening 하는데 사용, block이 나올때 마다 어떤 event를 발생 했는지 확인 가능

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

 

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)

 

'[Web3.0] > 블록체인' 카테고리의 다른 글

비트코인의 UTXO  (0) 2023.02.14
비트코인의 컨센서스 (Consensus)  (0) 2023.02.13
Bitcoin 거래 서명  (0) 2023.02.13
Bitcoin Address 생성  (0) 2023.02.13
ECDSA (타원곡선 암호)  (0) 2023.02.13