[멋쟁이 사자처럼 블록체인 스쿨 3기] 23-05-02

임형석·2023년 5월 3일
0

블록체인 이론

Node

비트코인의 네트워크의 노드는 라우팅, 블록체인 db
, 채굴, 지갑서비스 등 기능의 집합체이다.

모든 노드는 라우팅, 거래와 블록을 검증하고 전파하는 기능, 이웃 노드와의 연결 유지 기능을 기본적으로 가지고 있다.

모든 노드는 동등한 위치이다. 하지만 역할이 다르다.

Node 의 종류

3가지 노드가 있다.

풀노드: 블록체인의 모든 정보를 가지고 있는 노드이다. 따라서, 풀노드는 모든 정보를 가지고 거래에 대한 확인과 검증을 스스로 할 수 있다.

SPV 노드: 라이트노드 혹은 라이트웨이트 노드라고 불리기도 한다. 이 노드는 SPV 방식으로 거래를 검증한다.

채굴노드: 채굴을 진행하는 노드이다. POW 알고리즘을 푸는 전용 하드웨어를 실행해서 새로운 블록을 생성하기 위해 경쟁한다. 채굴노드는 풀노드인 경우도 있고, 라이트웨이트 노드로 풀노드에 의존하는 경우도 있다.

노드의 종류는 행동이나 역할에 따라 바뀐다.
모든 노드는 동등한 위치이며, 자의적으로 역할을 바꿀 수 있다.

Merkle Tree

머클해시 값은 블록의 바디에 담긴 모든 거래내역을

해시화 시켜서 하나의 해시값으로 나타낸 것을 말한다.

머클해시는 블록의 헤더에 담기고, 거래 내역값이 하나라도

바뀌게 된다면, 이 값도 바뀌기 때문에 거래내역을 조작할 수 없다.

Merkle Path

머클패스는 SPV 노드가 거래를 검증할때, 풀노드에게 검증할 거래내역의 TX 해시값을 보내어 해당 거래의 정보를 받고, 받아온 거래 정보가 포함된 블록과 머클해시와 머클패스 값을 확인하여 해당 거래가 유효한지 검증한다.

위 사진과 같은 경우, D 의 머클패스는

C, AB, EFEF 이다.

반대편의 값을 차례로 구하면 됨.


요약.

  1. 채굴자는 새로운 블록을 생성
  2. 생성된 블록은 풀 노드에 전송
  3. 풀 노드는 새로운 블록을 검증하고, 이전 블록과 연결하여 블록체인에 추가
  4. 새로운 블록이 추가된 블록체인은 모든 풀 노드에게 동기화
  5. SPV 노드는 블록 헤더와 머클루트값을 사용하여 블록체인의 일부분을 다운로드
  6. SPV 노드는 검증을 요청하는 TX의 해시값을 풀 노드에 보내어, 해당 거래의 정보 받음
  7. SPV노드는 풀 노드가 보내준 TX가 포함된 블록의 머클해시값과 머클패스를 확인하여, 해당 거래의 유효성을 검증

Solidity

컴파일

솔리디티 코드 작성 후엔 컴파일링을 해야함.

컴파일링에는 여러 버전이 있는데,

아래와 같이 버전을 지정해주면

0.8.2 이상 0.9.0 미만 버전의 컴파일러로만 컴파일링이 가능하다.

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.8.2 <0.9.0;

변수

최상단 a b c 를 선언한 변수는 상태변수.

function 안에서 선언하면 지역변수.

상태변수는 다른 function 에서도 사용할 수 있다.

지역변수는 선언한 function 안에서만 사용 가능.

contract StoreandReturn {
    uint a; //숫자형 변수 a
    uint b; //숫자형 변수 b
    uint c=2; // 숫자형 변수 c, 값은 2

    // 함수이고, 이름은 valueA, input값은 없음, public 하고 view 함, output 값은 1개 있음, uint 형임임
    function valueA() public view returns(uint) {
        return a;
    }

함수

function 은 함수를 정의한다.

아래는 함수이고, 이름은 valueA, input값은 없음, public 하고 view 함, output 값은 1개 있음, uint 형임

    function getA() public view returns(uint) {
        return a;
    }

view, pure 라는 값을 정의할 수 있다.

둘은 가스비를 소모하지 않으며, read 하는 기능이다.

view 는 함수 밖의 상태변수를 읽어올 수 있다.

pure 는 함수 밖의 상태변수를 읽을 수 없다.


아래와 같이 함수를 작성하면, a 값을 input 할 수 있다.

    function setA(uint _a) public {
        a = _a;
    }
    

값을 변경시키는 경우엔 아래 사진처럼 초록 체크표시와,

vm 이 찍히게 된다.


계산기

상태변수를 사용할 수 도 있음.

하지만, 상태변수를 선언하고 상태변수를 수정하려면 블록체인에 접근해야 하므로 가스비가 필요.

따라서, 인풋값을 직접 받는 지역변수 선언이 낫다.

아래 코드처럼.

contract Basic2 {

    function Add(uint _a, uint _b) public pure returns(uint){
        return _a+_b;
    }

    function Mul(uint _a, uint _b) public pure returns(uint) {
        return _a*_b;
    }

    function Sub(uint _a, uint _b) public pure returns(uint) {
        return _a-_b;
    }

    function Div(uint _a, uint _b) public pure returns(uint, uint) {
        return (_a/_b, _a%_b);
    }
}

0개의 댓글