블록체인 TIL-9Week-58Day

디오·2023년 5월 9일
0

💻array,struct 복습.

contract review {
    //이름, 생일, 번호를 담은 구조체 Student를 선언하고 Student들이 들어갈 수 있는 array students를 선언하시오.
    struct Student {
        string name;
        uint birth;
        uint number;
    }
    
    Student[] Students;

    //students에 Student를 넣을 수 있는 함수(이 문제는 push를 의미함)
    function pushStudents(string memory _name, uint _birth, uint _number) public {
        Students.push(Student(_name, _birth, _number));
    }

    //n번째 학생을 반환해주는 함수 
    function getStudent(uint _n) public view returns(Student memory){
        return Students[_n-1];
    }
    
    //n번째 학생의 이름을 반환해주는 함수를 구현하세요.
    function getN(uint _n) public view returns(string memory){
        return Students[_n-1].name;
    }
}
  • 민서강사님이 최종적으로 문제를 낼 때 이런형식으로 문제를 내신다고 함.
    • 이름, 생일, 번호를 담은 구조체 Student 이들의 데이터를 관리하는 array, students에 Student를 넣을 수 있는 함수, n번째 학생을 반환해주는 함수, n번째 학생의 이름을 반환해주는 함수를 구현하세요.






contract review1 {
    //이름 a, 번호 b, bytes2 c를 담은 구조체 D
    struct D {
        string a;
        uint b;
        bytes2 c;
    }
    
    //D형 변수 ddd를 선언하시오.
    D ddd;
    
    //ddd에 값을 부여하는 함수를 구현하시오.
    function setDDD(string memory _a, uint _b, bytes2 _c) public {
        ddd = D(_a, _b, _c);
    }
    
    //D가 들어가는 array D_list를 선언하시오.
    D[] D_list;
    
    //D_list 전체를 반환하는 함수 
    function getD_list() public view returns(D[] memory){
        return D_list;
    }
    
    //D_list 안에서 n번째 데이터를 반환하는 함수를 구현하시오.
    function getN(uint _n) public view returns(D memory){
        return D_list[_n-1];
    }
}






/*
실습가이드
1. 1, a, ["a", "b"] -> pushABCs
2. 2, b, ["c", "d"] -> pushABCs
3. 3, c, ["e", "f"] -> pushABCs
4. 4, d, ["g", "h"] -> pushABCs
5. 5, e, ["i", "j"] -> pushABCs
6. getABCs() 해보기
*/

contract review2 {
    //ABC라는 구조체 안에는 숫자형 a, 문자형 b, 문자형 array c가 들어있다.
    struct ABC {
        uint a;
        string b;
        string[] c;
    }
    //ABC가 들어가는 array ABCs를 구현하고 ABCs에 ABC를 넣는 함수
    ABC[] ABCs;

    function pushABCs(uint _a, string memory _b, string[] memory _c) public {
        ABCs.push(ABC(_a, _b, _c));
    }
    //특정 ABC를 반환하는 함수(특정 ABC를 반환하라는 말은 특정한 즉, array에서 n번째를 반환하라는 말.)
    function getN(uint _n) public view returns(ABC memory){
        return ABCs[_n-1];
    }
    //ABCs 전체를 반환하는 함수
    function getABCs() public view returns(ABC[] memory){
        return ABCs;
    }
    //특정 ABC의 c array를 반환받는 함수를 각각 구현하시오.
    function getABC_Array(uint _n) public view returns(string[] memory){
        return ABCs[_n-1].c;
    }
}



  • Deploy에서 문자열에 array는 어떻게 넣는지에 대해 알려주심.
    • array를 넣어줄때는 꼭 대괄호( [ ] ) 안에 따옴표( " " )를 넣어서 그 안에 문자열을 넣어줘야 제대로 사용할 수 있음.






💻Mapping 복습 및 응용.

✅Mapping 복습 [string => string]

contract MAPPING {
    mapping(uint => uint) a; // mapping(자료형 => 자료형) 이름
    mapping(string => uint) b; // key-value 쌍이 각각 string형과 uint형
    mapping(bytes=> uint) c; // bytes를 넣으면 uint가 나옴

    function setB(string memory _key, uint _value) public {
        b[_key] = _value; //mapping이름[_key값] = _value값
    }

    function getB(string memory _key) public view returns(uint) {
        return b[_key]; //mapping이름[_key값] -> value값을 돌려줌
    }

    function setC(bytes memory _key, uint _value) public {
        c[_key] = _value;
    }

    function getC(bytes memory _key) public view returns(uint) {
        return c[_key];
    }

    struct Student {
        uint number;
        string name;
        string[] classes;
    }

    mapping(string => Student) Teacher_Student;

    function setTeacher_Student(string memory _Teacher, uint _number, string memory _name, string[] memory _classes) public {
        Teacher_Student[_Teacher] = Student(_number, _name, _classes);
    }

    function getTeacher_Student(string memory _Teacher) public view returns(Student memory) {
        return Teacher_Student[_Teacher];
    }
}



  • Mapping은 Key값과 Value값이 있고, Value값을 얻기 위해서 Key값을 사용한다.

  • Mapping은 Key값과 Value값을 어떻게 사용하는지를 이해하면 문제를 이해하는데 도움이 된다.






✅Mapping 응용 [string => array[]]

/*
실습 가이드
1. setTeacher_Student 해보기
2. getTeacher_Student 해보기
3. setTeacher_Class -> 같은 선생이름으로 여러명 학생 해보기
4. getTeacher_Class -> 3번에서 설정한 선생이름으로 해보기 -> 3번에서 등록한 학생 모두 나오는지 확인
*/

contract MAPPING1{
    struct Student{
        uint number;
        string name;
        string[] classes;
    }

    //어떤 선생님이 담당 학생이 가지고 있음
    mapping(string => Student) Teacher_Student;
    //어떤 선생님이 여러학생을 가지고 있음
    mapping(string => Student[]) Teacher_Class;

    function setTeacher_Student(string memory _Teacher,uint number,string memory name,string[] memory classes) public {
        Teacher_Student[_Teacher] = Student(number,name,classes);
    }
    
    function getTeacher_Student(string memory _Teacher) public view returns(Student memory) {
        return Teacher_Student[_Teacher];
    }

    function setTeacher_Class(string memory _Teacher, uint _number, string memory _name, string[] memory _classes) public {
        Teacher_Class[_Teacher].push(Student(_number, _name, _classes));
    }

    function getTeacher_Class(string memory _Teacher) public view returns(Student[] memory) {
        return Teacher_Class[_Teacher];
    }
}



  • 위 코드에서 " Teacher_Student[_Teacher] " 이 부분은 밸류값과 같다.
    • "_Teacher"가 키값이고, " Teacher_Student[_Teacher] "는 밸류값이다. 우측에 " Student(_number, _name, _classes) "와 같다는 의미.






💻FixedArray

contract fixedArray {
    /*
    실습 가이드
    0. getALength(), getA(), getBLength(), getB() 결과 확인하기
    1. 1 -> pushA, 2 -> pushA, 3,4 진행
    2. getA(), getALength() 해보기
    3. 1 -> pushB2, 3-> pushB2, 5,7, 진행
    4. getB(), getBLength() 해보기
    */
    
    uint[] a;   // a[n]
    uint[4] b;

    function getALength() public view returns(uint) {
        return a.length;
    }

    function pushA(uint _n) public {
        a.push(_n);
    }

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

    function getBlength() public view returns(uint) {
        return b.length;
    }

    function pushB(uint n, uint _n) public {
        b[n] = _n;
    }

    function getB() public view returns(uint[4] memory) {
        return b;
    }

    uint count;

    function pushB2(uint _n) public {
        b[count++] = _n;
    }

    function pushB3(uint _n) public {
        b[++count] = _n;
    }

    function getCount() public view returns(uint) {
        return count;
    }
}
  • 이 array에 n번째는 누구인지를 뜻한다.
    • 길이가 결정되어 있는 fixedArray같은 경우에는 위 이미지에 노랑색처럼 결정을 해줘야 한다.
    • uint[ ]는 한정되지 않은 자리들이 있는것이고, uint[ n ]은 정해진 자리수가 있는것이다.


  • FixedArray는 길이가 변하지 않기 때문에 push나 pop을 사용할 수 없다.
    • push나 pop을 사용하면 길이가 달라지기 때문에.
    • 그래서 push를 사용하지 않고 같은 기능을 사용하기 위해서는
      • " 배열[n+1번째] = 배열에 집어넣을 값 " 이렇게 사용해줘야 한다.

  • 이렇게 코드를 사용할 경우 b배열에 값이 자동적으로 들어온다.
    • [count++]는 _n을 넣고나서 연산이 된다. ex) b[ 0 ] = 2


  • 이렇게 코드를 사용할 경우 b배열 맨 앞에, 0번째 요소를 건너뛰고 값을 넣는다.
    • [++count]는 일단 연산을 하고 그 결과값 자리에 _n 넣어준다.






💻ForLoop(for문)

contract ForLoop {
    function forLoop() public pure returns(uint){
        uint a;

        for(uint i=1; i<6; i++ /*시작점; 끝점; 변화방식*/) {
            a = a+i; // a+=i
        }
        return a;
    }

    function forLoop2() public pure returns(uint, uint){
        uint a;
        uint i;

        for(i=1; i<6; i++ /*시작점; 끝점; 변화방식*/) {
            a = a+i;
        }
        return (a,i);
    }

    function forLoop3() public pure returns(uint, uint) {
        uint a;
        uint i;

        for(i=1;i<=5; i++) {
            a=a+i;
        }
        return (a,i);
    }

    uint[4] c;
    uint count;

    function pushA(uint _n) public {
        c[count++] = _n;
    }

    function getC() public view returns(uint[4] memory) {
        return c;
    }

    function forLoop4() public view returns(uint) {
        uint a;
        for(uint i=0;i<4;i++) {
            a=a+c[i];
        }
        return a;
    }

    function forLoop5() public view returns(uint) {
        uint a;
        for(uint i=0; i<c.length;i++) {
            a=a+c[i];
        }
        return a;
    }

    uint[] d;
    
    function pushd(uint _n) public {
        d.push(_n);
    }

    function getD() public view returns(uint[] memory) {
        return d;
    }

    function forLoop6() public view returns(uint) {
        uint a;
        for(uint i=0;i<d.length;i++) {
            a=a+d[i];
        }
        return a;
    }
}
  • For문과 If문의 차이점.
    • For문 = 정해진 횟수 안에 같은행동을 반복하는것이 For문.
      • 1~10이면 1~10까지 같은 행동을 반복한다. 어떤수가 들어가든 식에 따라서 반복한다.
      • For문은 어떤 input값이 들어오던 같은 기간내에 같은행동을 해야할 때 사용.
    • If문 = 들어온 조건에 따라서 다른행동을 하는 차이점이 있는것이 If문.
      - 1이나 2 또는 3처럼 다른 숫자가 들어올때마다 각각 다른 행동을 한다.
      - If문은 input값에 따라서 다른 행동을 해야할 때 사용.


  • For문으로 값을 구하는 과정.
    • i는 i<6의 조건에 만족할때까지 1씩 더해짐.
    • a는 처음에 0으로 시작해 i값이 더해지고 그 이후 최종 더해진 값에 다시 i가 더해지는 과정을 반복.

  • (i=1; i<=n; i++) 에서 i<=n 는 n+1까지
  • (i=1; i<n; i++) 에서 i<=n 는 n까지
    • 예를들어 i<10(미만)이면 10까지이고, i<=10(이하)이면 11까지이다.

  • fixedArray를 적용해 for문을 사용해보면.
    • 이런식으로 변경해서도 사용이 가능하다.






💻머클트리, 패트리샤트리 복습 및 추가정보.

  • 머클트리와 패트리샤트리에 대한 내용을 다시 복습.
  • Quiz


    • 내 답변.
      - 내 답변에서 잘못된 부분은 Extension node가오면 Branch node는 자연스럽게 따라온다는 것이다. b, ab, ba가 있는 Extension node가 오면 아래 갈라질 수 있는 Branch node (3, 4, 6, 1, e, 1, 2)를 만들어주고, 아래 Leaf node를 만들어주는것이다.


    • 정답.


    • prefix 포함.
      • prefix는 Extension node가 짝수일때 0, 홀수일때 1을 준다.
      • Leaf node는 짝수일때 2, 홀수일때 3을 준다.
      • prefix는 자료를 압축하는데 도움이 된다.

  • node (트리를 형성했을때있는 동그라미들을 의미.)
    • 데이터를 담고있는 아이일수도 있고, 중간 path가 될 수도있다.
      • 네트워킹을 할때 설명하는 node는 각각 통신을 하는 아이라고 생각하면 된다.(네트워킹을 할때는 node를 컴퓨터라고 생각하면 된다.)
      • 트리를 할때 노드는 각각 데이터를 담고 있는 아이들이라고 생각하면 된다.






🤓 Small Talk.

  • 수수료(가스비) 이야기.

  • 페페, 도지 이런거 사지마라.

    • 정 궁금한 사람은 ordi(토큰), ordinals(프로토콜.이걸 만들애들) 알아보면 좋다고 하신 것 같음.
  • 사이드체인, 라이트닝네트워크가 주목을 받고 있다.

    • 라이트닝네트워크까지는 나중에 설명해주신다고 하심.
    • 사이드체인은 기본적인 설명에 대해서만 다루신다고 하심.
  • BRC-20이 어떤 의미를 갖는지에 대해서도 알려주신다고 하심.

  • building blockchain with language

    • (특정 언어를 넣고 검색하면 블록체인 만드는방법에 대한 유명한 글들을 찾을 수 있음.) 하지만 이해한다는 보장은 없음.






🌜하루를 마치며..

오늘도 많은 내용을 배웠다. 복습한 부분이 많은것 같지만 이해하고 넘어가야하는 내용이 많다보니 정보가 계속 쌓이는 느낌이다. 내일은 테스트도 있고, 블록체인 백서도 읽어오라고 숙제를 내주셔서 할게 더 많아졌다. 어서 다른것들도 마무리해야지! 오늘도 현진했따!

profile
개발자가 되어가는 개린이"

0개의 댓글