til_230501

김강현·2023년 5월 3일
0

블체스-3기-TIL

목록 보기
11/12

합의 알고리즘

  1. 마지막 블록 헤더 해시값 비교 (고유한 체인의 특성)
  2. 길이 비교
  3. 길이가 긴 쪽에서 체인을 넘겨줌!
  4. 유효성 검사 (채굴 결과 검증)
  5. 유효하면 블록체인 동기화

1 이 달라서 2를 하는데 길이가 다르다?
잠시 대기상태임!
계속 상호 물어봄!!

합의 알고리즘의 끝은 네트워크 동기화!!
모든 full node 들의 목적은 동기화가 되는 것이다! (주변 노드들과)

스크립트

돈이 들어올때는 묶인 상태로 옴.
이걸 풀어줘야함.

sender 가 나의 공개키로 묶어서, 나에게 보내고
나는 private 로 풀어서 내 지갑에 넣는다?

UTXO

mempool 에서 수많은 UTXO 들이 모이고, 어떤 UTXO 를 담은 블록들을 채굴자들이 채굴한다.

full - node

노드가 다 같은 역할을 하지는 않음.

핸드셰이킹

  • version 을 보내고, versack 을 받음 (응답 받았다는 것을 확인)
  • version 을 받고, versack 을 보냄 (version + acknowledgement)

종자 노드

오래되고, 신뢰가 쌓여있는 이웃노드들 정보가 있음.
이 노드에 요청하면, 그 노드들 받을 수 있음.

처음에 블록 받아오는 법

https://developer.bitcoin.org/reference/p2p_networking.html

  1. get block 방법 (구식)
  2. get headers 방법 (신식)

블록체인 풀노드로 첫 시작을 할거면, 풀노드가 세팅해놓은 api 를 활용해서 정보들을 받아와야함!

SPV

  • Simplified Payment Verification
  • 블록헤더만을 다운로드 받는 노드
  • 풀노드의 도움을 받아야함.

머클트리

이를 하는 이유는 검증에 있어서, 효율적인 방법을 제공해주기 위함!

spv 가 특정 tx 가 옳은지 검증을 하기 위해, 풀노드에 관련 자료들을 요청함.
특정 tx 를 검증할 수 있게, 풀노드에서 힌트를 주는 느낌?

요즘 블체 네트워크

순수한 p2p 는 지금 아님

compact block optimization -> 안정적으로 운영되는 특정 노드들을 선발하여 AWS 에 호스팅!!
FIBRE 개발 (Fast Internet Bitcoin Relay Engine)

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

1.채굴자(풀노드)는 새로운 블록을 생성 후 검증하고, 이전 블록과 연결하여 블록체인에 추가

2.새로운 블록이 추가된 블록체인은 모든 풀 노드에게 동기화

3.SPV 노드는 블록 헤더와 머클루트값을 사용하여 블록체인의 일부분을 다운로드

4.SPV 노드는 검증을 요청하는 TX의 해시값을 풀 노드에 보내어, 해당 거래의 정보 받음

5.SPV노드는 풀노드가 보내준 포함된 블록의 머클루트값과 path를 확인하여, 해당 거래의 유효성을 검증

솔리디티

// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.18;

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

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

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

    function getB() public view returns(uint) {
        return b;
    }

    // 함수, 이름은 valueAB, input 없음, public하고 view 함, output 값은 2개, 둘 다 uint형
    function getAB() public view returns(uint, uint) {
        return (a, b);
    }

    function getABC() public view returns(uint, uint, uint) {
        return (a,b,c);
    }
}

view 의 경우 상태변수를 건드리지 않는 경우에 선언

상태변수 : contract 에서 관리되는 변수
지역변수 : 메소드의 input 값으로 들어와, 메소드 안에서만 관리되는 변수

함수 종류

none : 상태변수가 수정이 될 때 (가스 필요)
view : 상태변수 수정은 x, 불러오기만 할때 (가스 x)
pure : 상태변수 를 사용하지 않을때

/*
    view와 pure 함수는 state variable(상태변수)의 값을 변화시키지는 않음 -> gas비 안씀
    */
    // 숫자 _aa와 _bb를 받아서 이 2개의 숫자를 더한 결과값을 반환하는 함수 Add를 구현하세요
    function Add(uint _aa, uint _bb) public pure/*상태변수는 하나도 필요없을 때 pure*/ returns(uint) {
        return _aa+_bb;
    }

    // 숫자 a와 b를 갖고와서 이 2개의 숫자를 더한 결과값을 반환하는 함수 Add2를 구현하세요
    function Add2() public view/*상태변수를 갖고오기 때문에 view로로*/ returns(uint) {
        return a+b;
    }
profile
this too shall pass

0개의 댓글