블록체인 TIL-14Week-94Day

디오·2023년 6월 14일
0

블록체인이론&Solidity

목록 보기
28/29

✅오늘은 뭐했니?

  • DoubleArray 복습 (추가된 코드 있음.)
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.8.2 <0.9.0;

contract multiArray {
    uint[][] public double_A;

    function setNumber(uint _a) public {
        double_A.push([_a]);
    }

    function setNumber_2(uint _a, uint _b) public {
        double_A[_a].push(_b);
    }

    function setNumber2(uint _a, uint _b) public {
        double_A.push([_a, _b]);
    }

    function setNumber3(uint[] memory _a) public {
        double_A.push(_a);
    }

    function setNumber4(uint _a, uint _b, uint _c) public {
        double_A[_a][_b] = _c;
    }

    function getNumber(uint _a) public view returns(uint[] memory) {
        return double_A[_a];
    }

    function getNumber2() public view returns(uint[][] memory) {
        return double_A;
    }

    function getLength() public view returns(uint) {
        return double_A.length;
    }

    function getLength2(uint _a) public view returns(uint) {
        return double_A[_a].length;
    }
}
contract multiArray2 {
    uint[3][] public double_A;
    /*
    uint length;
    uint[][] public double_A = new uint[3][](length);
    */

    function setNumberA(uint _a) public {
        double_A.push([_a]);
    }

    function setNumberA2(uint _a, uint _b) public {
        double_A.push([_a, _b]);
    }

    function setNumberA3(uint[3] memory _a) public {
        double_A.push(_a);
    }

    function setNumberA4(uint _a, uint _b, uint _c) public {
        double_A[_a][_b] = _c;
    }

    function getNumber(uint _a) public view returns(uint[3] memory) {
        return double_A[_a];
    }

    function getNumber2() public view returns(uint[3][] memory) {
        return double_A;
    }

    function getLengthA() public view returns(uint) {
        return double_A.length;
    }

    function getLengthA2(uint _a) public view returns(uint) {
        return double_A[_a].length;
    }
}
contract multiArray3 {
    uint[][3] public double_A;
    //uint[][] public double_A = new uint[][](3);

    function setNumberA(uint _a, uint _b) public {
        double_A[_a] = [_b];
    }

    function setNumberA_2(uint _a, uint _b) public {
        double_A[_a].push(_b);
    }

    function setNumberA2(uint _a, uint _b, uint _c) public {
        double_A[_a][_b] = _c;
    }

    function setNumberA3(uint _a, uint[] memory _b) public {
        double_A[_a] = _b;
    }

    function getNumber(uint _a) public view returns(uint[] memory) {
        return double_A[_a];
    }

    function getNumber2() public view returns(uint[][3] memory) {
        return double_A;
    }

    function getLengthA() public view returns(uint) {
        return double_A.length;
    }

    function getLengthA2(uint _a) public view returns(uint) {
        return double_A[_a].length;
    }
}
contract multiArray4 {
    uint[3][3] public double_A;

    function setNumberA(uint _a, uint _b, uint _c) public {
        double_A[_a][_b] = _c;
    }

    function setNumberA2(uint _a, uint[3] memory _b) public {
        double_A[_a] = _b;
    }

    function getLengthA() public view returns(uint) {
        return double_A.length;
    }

    function getLengthA2(uint _a) public view returns(uint) {
        return double_A[_a].length;
    }
}
contract gasFee {
    uint[] a;
    uint[][] a_;
    uint[3][] _a;

    uint[3] b;
    uint[][3] b_;
    uint[3][3] _b;

    function setA(uint _a) public {
        a.push(_a); // 44773, 27673
    }

    function setA2(uint _a) public {
        a_.push([_a]); // 67192, 50092
    }

    function setA3(uint _b) public {
        _a.push([_b]); // 49556, 32456
    }

    function setA3_(uint[3] memory _b) public {
        _a.push(_b); // 73333, 73333
    }

    function setB(uint _n, uint _a) public {
        b[_n] = (_a); // 22788, 22788
    }

    function setB2(uint _n, uint _a) public {
        b_[_n] = [_a]; // 45221, 8221
    }

    function setB3(uint _a, uint _bb, uint _c) public {
        _b[_a][_bb] = _c; // 22951, 22951
    }
}






  • 내일 이론 테스트 준비.
  1. 다양한 종류들의 노드가 있습니다. 3개의 노드만 예시로 들고 각각의 역할을 설명하세요.
  • Full Node: 완전하고 가장 최신의 블록체인 복사본을 가지고 있다. 풀 노드는 외부 참조 없이도 독자적이고, 신뢰할 수 있는 방법을 통해 어떠한 거래도 검증할 수 있다.
  • SPV Node : 라이트 노드 혹은 라이트 웨이트 노드라고도 불리운다. 블록체인의 부분집합으로만 유지되는 노드다. 이 노드는 단순지불검증(SPV) 방법을 이용해서 거래를 검증한다.
  • 채굴 Node : 채굴 노드는 채굴을 진행하는 노드다. 작업증명(POW) 알고리즘을 푸는 전용 하드웨어를 실행해서 새로운 블록을 생성하기 위해 경쟁한다.
    채굴 노드는 풀 노드인 경우도 있고, 라이트웨이트 노드로 활동하며 풀 서버에 의존하는 경우도 있다.

  1. 우리에게 가장 가까운 노드도 설명을 하세요.
  • 우리에게 가장 가까운 노드는 "풀노드"다. 풀노드는 블록체인 내의 모든 정보를 저장하고 있는 노드이기에 거래에 대한 확인 및 검증을 할 때 스스로 할 수 있다는 장점을 가지고 있다.

  1. 딴 노드와 다른 노드가 연락을 하기 위해서 처음으로 연결하는 과정을 설명하세요. 그리고 그 과정의 이름도 설명하세요.
  • 1) 3-way방법(연결 설정을 위한 과정)

    • Handshake:
      새로운 노드가 네트워크에서 정상적으로 작동하기 위해서는 최소 1개의 다른 노드와 연결되어야 함. Handshaking은 이웃 노드가 연결 요청을 승인할 경우, 그에 대한 답으로 verack으로 응답함. 양방향 연결 요청을 원할 경우, version 메시지를 보낼 수도 있음.
      클라이언트 목록에 기록된 종자 노드를 이용하여 신속하게 네트워크 내 다른 노드를 검색함. 이웃 노드와 연결이 성공하면, 새롭게 연결된 노드는 getaddr를 통해 이웃들의 IP 주소 목록을 받을 수 있습니다.
  • 2) 4-way방법 (연결 종료를 위한 과정)

    • 정보 교환 :getblocks를 통해 서로 갖고 있는 가장 마지막 블록을 확인함.
    • 동기화 절차: version 메시지를 통해 시작함. 이 메시지에는 노드의 현재 블록체인 높이를 알 수 있는 Bestheight가 포함된다. version 메시지로 이웃 노드와 자신의 블록 개수를 비교할 수 있음. 가장 상위에 있는 블록의 해시를 담고 있는 getblock 메시지를 교환함. 길이를 비교하여 보유한 블록 체인이 더 짧은 노드를 파악함.
      inv 메시지를 이용하여 해시를 공유하고, 요청 노드는 첫 500개의 블록을 확인함. 해당 블록을 가지고 있지 않은 노드(요청 노드)는 일련의 getdata 메시지를 전송하여 이웃 노드에게 블록 데이터를 요구함.
      inv 메시지에 있는 해시 값을 이용하여 수신받은 블록 데이터의 정확성을 확인하고, 블록 체인을 구축함.

  1. spv노드와 풀노드의 차이점이 무엇인지에 대해 설명하세요.
  • spv노드는 블록체인의 전체 정보가 아닌 블록헤더 정보와 일부거래 데이터만 가지고 있기 때문에 저장공간이 많이 필요없고, 대역폭 요구사항이 적다는 장점이 있지만 거래를 확인하기 위해서는 다른 노드에 의존해야 한다. 반면 풀노드는 블록체인의 전체 정보를 가지고 있기 때문에 다른 노드에 의존하지 하지 않고 독립적인 검증이 가능하다.

  1. 위에선 언급한 차이점에서 나타나는 풀노드의 특징과 장점이 있으면 설명해주세요.
  • 장점: 독립적인 거래 검증이 가능, 자체 검증과 보안으로 자금을 안전하게 보호.
  • 단점: 큰 저장 공간 요구, 많은양의 대역폭 사용량, 초기 동기화 시간 필요, 풀 노드의 수가 증가할수록 전체 네트워크 부하 증가, 운영 및 유지 관리 비용

  1. spv노드와 풀노드가 각각 어떤 거래를 검증하고 싶다면 어떻게 해야 하는지 설명하세요.
  • spv노드: SPV 노드는 블록 헤더 정보와 일부 거래 데이터만을 가지고 있기 때문에, 검증하고자 하는 거래의 블록 헤더를 찾아 해당 블록을 다운로드하여 검증한다. 그 후, 해당 거래가 블록에 포함되어 있는지 확인하여 유효성을 검증할 수 있다.
  • 풀노드: 풀 노드는 완전하고 가장 최신의 블록체인 복사본을 가지고 있다. 그렇기 때문에 풀 노드는 외부 참조 없이도 독자적이고 신뢰할 수 있는 방법을 통해 어떠한 거래도 직접 검증할 수 있다.

  1. spv노드는 무엇의 약자이고, 그게 의미하는 바가 무엇인지 설명하세요.
  • SPV의 약자는 Simplified Payment Verification(간단한 지불 확인)으로 블록체인의 부분집합으로만 유지되는
    노드다. 이 노드는 단순지불검증(SPV) 방법을 이용해서 거래를 검증한다. 이로 인해 일반적으로 모바일 지갑 애플리케이션이나 경량 지갑에 사용된다.

  1. 각각 상황에 맞게 머클루트와 path를 구하시오.
    A. 1,2,3,4,5 / 3 검증

B. 1,2,3,4,5,6,7 / 4 검증

C. 1,2,3,4,5,6,7,8,9,10 / 5 검증

D. 1,2,3,4,5,6,7,8,9,10,11,12,13 / 7 검증

  • A = 4, 12, 5555
  • B = 3, 12, 5677
  • C = 6, 78, 1234, 910910910910
  • D = 8, 56, 1234, 910111213131313

  1. 풀노드가 되고싶은 신입노드가 있다고 가정했을 때 신입노드가 하는 일에 대해서 설명하세요.
    아래 세가지의 식중에서? 설명을 하세요.

누구에게 처음 연락하는가 (누구의 이름과 정의):
피어(peer)라고 불리는 기존의 블록체인 네트워크 참여자에게 연락을 취한다. 이 피어들은 이미 블록체인 네트워크에 참여하고 있고, 신입노드의 참여를 승인하고 신뢰할 수 있는 노드인지 확인하는 역할을 다.

정보는 어떻게 비교하는가 (메시지 명):
블록은 이전 블록과 연결된 데이터 구조로, 트랜잭션(거래) 기록과 이를 검증하는 작업증명(Proof of Work) 등의 정보를 포함하고 있다. 신입노드는 피어로부터 전달받은 블록을 자신이 가지고 있는 블록체인과 비교하여 일치 여부를 확인한다.

정보를 주거나 받는 과정은 어떻게 되는가:
신입노드가 풀노드로 참여하기 위해서는 초기 블록체인 데이터를 다운로드해야 한다. 이를 위해 신입노드는 피어로부터 최신 블록체인 데이터를 요청하고, 피어는 해당 데이터를 신입노드에게 전송한다. 신입노드는 이후에는 피어들과 지속적으로 정보를 주고받으며, 새로운 블록을 받아들이고 검증하는 과정을 거치는데 이를 통해 신입노드는 네트워크의 상태를 업데이트하고 블록체인의 유효성을 유지하며, 풀노드로써의 역할을 수행하게 된다.


  1. 특정 집단에 속하면 같이 채굴파워를 합치고 기여한 만큼 보상을 받아갈 수 있는데 그 집단의 이름은 무엇일까요?
  • 마이닝풀

  1. 그 집단에 들어가는 이유는 무엇일까요?
  • 상대적으로 힘이 약한 사람들이 확률을 높이기 위해 , 보다 안정적인 수익을 얻을 수 있기 때문에.

  1. 이더리움의 헤더와 비트코인의 헤더는 비슷한 듯 다른데 이더리움과 비트코인에 공통적으로 들어가 있는 두가지 요소를 골라
    설명해주세요.
  • 이전 블록 해시 :모든 블록은 이전 블록의 해시 값을 가지고 있다. 해시 값은 이전 블록의 데이터를 암호화한 결과로, 이전 블록과의 연결을 형성하는 역할을 한다. 이전 블록의 해시 값을 가지고 있음으로써 블록체인은 연속성을 유지하고, 변경된 블록을 감지할 수 있다

  • 머클 루트 : 머클 루트는 트랜잭션 데이터의 무결성을 확인하기 위한 요소로 사용된다. 블록 내의 모든 트랜잭션은 해시 함수에 의해 암호화되고, 이 암호화된 해시 값들이 계층적으로 연결되어 머클 트리(Merkle Tree)를 형성한다. 머클 루트는 이 머클 트리의 루트 노드에 해당하는 해시 값으로, 모든 트랜잭션 데이터의 일관성과 무결성을 검증하는 역할을 한다


  1. 여러가지 키,벨류 쌍? 요소들을 주는데 아래 주어진 정보들을 가지고 머클패트리샤 트라이를 작성하면 됨.
  • (요소들을 주는데 아래 주어진 정보들을 가지고 머클패트리샤 트라이를 작성하면 됨.)

  1. 위와같이 여러가지 정보들을 주는데 (그림을 한장 주신다고 함) cab8?, dog, cat 이런식으로 트라이에서 라딕스트라이로 옮겨가는 과정. 즉 머클패트리시아 트라이로 최적화 되는 과정을 표현하세요.
  • 09 PDF 보면 알수있음.(초기버전, 최적화버전 두개 제출)

  1. 이더리움에 존재하는 4개의 트라이를 설명하고, 그 중에서 블록에 포함되는 3개의 트라이를 언급하고 각각 어떤 종류의 정보들이 담기는지 설명하세요.
  • 상태 트라이: 이더리움의 전역 상태 정보를 저장한다. 각 계정은 주소와 잔액, 계약 코드, 상태 변수 등의 정보를 포함하고 있다.

  • 계약 코드 트라이: 이더리움에서 배포된 스마트 계약 코드를 저장한다. 각 계약은 고유한 주소를 가지며, 해당 주소에 대한 스마트 계약 코드를 이 트라이에서 찾을 수 있다.

  • 트랜잭션 트라이: 이더리움에서 발생한 모든 트랜잭션을 저장하고 블록에 포함되는 트랜잭션의 유효성 검사와 관련된 정보를 제공한다.

  • 리십 트라이: 이더리움에서 발생한 이벤트 로그를 저장합니다. 이벤트 로그는 스마트 계약에서 발생하는 특정 이벤트에 대한 정보를 담고 있으며, 로그 트라이는 블록에 포함되는 이벤트 로그들을 저장한다.

-블록에 포함되는 3개의 트라이

  • 상태 트라이(휘발성): 계정 정보와 계약 상태

  • 트랜잭션 트라이(영구): 송신자와 수신자, 전송하는 이더의 양, 가스 정보와 같은 트랜잭션의 상세한 정보

  • 리십 트라이(정보): 스마트 컨트랙트에서 발생하는 특정 이벤트에 대한 정보


  1. 상황에 맞게 어떤 트라이를 사용해야 하는지 답변하세요.
  2. A라는 거래가 B라는 블록에 포함되어 있나요?
  3. A라는 거래의 결과로 C라는 계정은어떻게 되었는지 확인하고 싶어요
  4. D라는 계정이 존재하나요?
  5. E라는 스마트 컨트랙트내 F라는 함수를 실행시켰을 때의 결과를 알고 싶어요
  6. C라는 계정이 지난 2주동안 E 스마트 컨트랙트 내 F라는 함수를 얼마나 실행시켰는지 알고 싶어요
  7. 변수 a가 10을 넘기면 실행이 안되는 함수가 있다. 나는 현재 이 함수를 실행했을 때 어떤 결과가 나오는지 알 수가 없다.

1.transaction trie
2.receipts trie
3.state trie
4.receipts trie
5.transaction trie
6.state trie

  • 영구적인 정보를 저장하는 곳은 transaction Trie이고,
    state Trie는 휘발성 정보를 저장하고 있다.

    • 영구적 : 거래
    • 휘발성 : 계정의 상태
  • state trie 이더리움 네트워크에 존재하는 모든 계정에
    대한 정보를 키-값 쌍으로 보관하고 있다.

  • 이 거래가 특정 블록에 속해있나요? (transaction trie)

  • 지난 30일동안, 이 주소에서 생성된 특정 형태의 모든 거래를 알려주세요. (receipts trie)

  • 특정 계정의 현재 잔고가 얼마인가요? (state trie)

  • 현재 이 계정이 존재하나요? (state trie)

  • 특정 거래를 특정 계약에서 실행시켜보려고 합니다. 출력값이 무엇인가요? (state trie)


  1. 이더리움의 블록 용량은 어떻게 설정(결정) 되는지 설명하세요.
  • 특정 블록에 포함될 수 있는 "가스"의 최대 양으로 결정됨.
    더 많은 연산 등을 하면 가스도 많이 들고 용량도 늘어남
    최대 가스 한도가 있어서 무제한은 아님

  1. 가스리밋이라는 단어는 여기저기서 혼용되고 있는데 두가지 종류를 배울거다. 두가지 종류를 모두 제안하고 각각에 대해서 설명하세요.
  • 가스 리밋 : 개별 트랜잭션이 사용할 수 있는 최대 가스량. 가스 리밋을 넘어서는 트랜잭션은 실행되지 않으며, 가스 리밋을 낮게 설정하면 블록 내에 포함되는 트랜잭션 수가 제한될 수 있다.

  • 블록 가스리밋 : 1개의 블록에 담길 수 있는 최대 양을 의미한다.


  1. 가스값을 높게 설정할수록 거래의 속도는 빨라질까요? 맞다면 그 이유를 아니라면 왜 아닌지에 대해서 설명하세요.(빨라지게하는 방법은 무엇인지에 대해서 설명)
  • 빨라진다.
  • 블록을 생성하는 마이너들이 보상을 최대화하려고 하기 때문에
    트랜잭션들을 비싼 가스부터 블럭에 넣기 때문에 빠르게 들어간다.

  1. 현재 일으키려고 하는 거래가 70만큼의 가스를 소비할것으로 예상되는데 현재 가스 리밋을 100으로 설정했다. 가스값을 20으로 설정했다면 마이너와 센더에는 각각 어떤 잔고변화가 일어나는지 예상치 못해서 더 많은 가스비가 소모된다면 최대수수료의 소비액을 계산하세요.
  • A 만큼의 가스 = 벽돌 갯수
    가스 값 = 벽돌 가격

  • 사용되는 가스비 = A 가스값 = 14,000,000 wei ( 70만 20 )

  • 최대 가스비 = A 가스값 = 20,000,000 wei ( 110만 20 )

  • 마이너 : 사용되는 가스비만큼 잔고 증가

  • 센더 : 사용되는 가스비만큼 잔고 감소


  1. 가스리밋이 충분하지 않다면 어떤일이 벌어질까요?

1.gasLimit은 사용할 최대 가스양, 가스 상한선으로 gasLimit이 충분하지 않으면 트랜젝션이 리벌트가 됨(실패 할수 있음), 가스의 상한선보다 작게 잡혀 있어 가스가 부족 할수 있음,

2.체굴자 입장에서 gasLimit은 트랜젝션 작업량을 의미하여 낮으면 맨풀에서 오래 대기 해야하는 상황이 생길수 있음.


  1. 이더리움에선 어떻게해야 가장 빠르게 블록안에 담기는 방법이 될까요?
  • gasLimit이 무조건 높게 되면 들어갈 수 있는 거래의 양이 줄어 들어 체굴자에게 인기가 없을 수 있음, 적절한 gasLimit과 높은 가스값을 같이 측정 해줘야 한다.

  1. 이더리움에는 두가지 종류의 계정이 있는데 그 계정의 이름과 차이점을 설명하세요.
  • CA(Contract Account) : 거래를 스스로 일으키지 못하며, 호출이 될 때만 거래를 일으킨다.사람이 smart contract를 이용하는 것은 EOA에 의해서 호출되는 것을 의미한다.
    내부에는 코드가 보관되어 있으며 개인키가 없다. 이더는 송수신할 수 있다.

  • EOA(Externally Owned Account) : 우리가 알고 있는 일반적인 계정이다. 내부에는 키가 보관되어 있다.일반적인 계정의 역할을 수행한다. 거래를 실질적으로 일으키는 거래의 시발점이다.


  1. 이더리움에서 발생하는 거래는 총 4가지 종류의 거래가 있는데 각 거래가 발생하는 과정을 설명하세요.
  • EOA

    • 1) 다른 EOA에 이더를 송수신하는 거래 (Transaction)
      Externally owned account => Transaction => Externally owned account
      외부 소유 계정(EOA) => 트랜잭션 => 외부 소유 계정(EOA)
      EOA에서 트랜잭션을 생성하여 EOA에서 시작되고, 블록체인 네트워크를 통해 다른 EOA로 전달됨
    • 2) Contract를 호출하는 거래 (Transaction)
      Externally owned account => Transaction => Contract Account => Internal Transaction => Contract Account
      외부 소유 계정(EOA) => 트랜잭션 => 컨트랙트 계정 => 내부 트랜잭션 => 컨트랙트 계정
      EOA에서 생성된 트랜잭션은 컨트랙트 계정을 호출할 수 있음, EOA에서 시작되며, 블록체인 네트워크를 통해 컨트랙트 계정으로 전달됨, 컨트랙트 계정은 해당 트랜잭션을 수신하고, 컨트랙트의 소스 코드에 정의된 작업을 수행, 내부 트랜잭션으로 실행됨.
    • 3) Creation하는 거래 (Transaction)
      Externally owned account => Transaction => Contract Account => Internal Transaction => Contract Account
      외부 소유 계정(EOA) => 트랜잭션 => 컨트랙트 계정 => 내부 트랜잭션 => 컨트랙트 계정
      생성 트랜잭션은 컨트랙트 계정을 생성하는 트랜잭션, EOA에서 생성되며, 블록체인 네트워크를 통해 컨트랙트 계정으로 전달, 컨트랙트 계정은 블록체인에 영구적으로 저장되며, 컨트랙트의 상태와 코드가 저장됨.
  • CA

    • 4) CA는 다른 CA에 의해서 호출된 거래 (Internal Transaction )
      Externally owned account => Transaction => Contract Account => Internal Transaction => Contract Account
      외부 소유 계정(EOA) => 트랜잭션 => 컨트랙트 계정 => 내부 트랜잭션 => 컨트랙트 계정
      다른 CA에 의해 호출되는 트랜잭션은 내부 트랜잭션, 컨트랙트 계정 내부에서 실행되는 함수나 작업에 대한 호출 함, 내부 트랜잭션은 컨트랙트 계정 내에서 처리되고, 해당 컨트랙트의 상태를 변경하거나 다른 컨트랙트를 호출할 수 있음, 컨트랙트 간 상호작용과 실행 흐름을 제어하는 데 사용됨.

  1. 이더리움의 지갑주소가 생성되는 과정을 최소 4단계로 나눠서 설명하세요.
  • private Key를 sha256를 돌려 256비트의 64자리의 랜덤 값 생성

  • 타원 곡선 암호법을 사용하여 private Key로 Public Key생성 (K = k * G (G : 생성포인트))

  • Public Key를 Keccak256 해시 알고리즘을 사용해 해싱

  • Keccak256의 결과물의 마지막 20바이트(40개의 문자)에 0x를 붙여 이더리움 지갑 주소를 생성






  • 마지막 아기사자.
    • Firebase 연동.
profile
개발자가 되어가는 개린이"

0개의 댓글