블록체인 TIL-9Week-62Day(토요일)

디오·2023년 5월 13일
0

개인공부

목록 보기
18/28
post-thumbnail

📖블록체인 백서.

  • 강사님께서 전날 우리들이 힘들어하셨다는걸 느끼시고, 달달한 맛으로 블록체인 백서에 대해서 하나씩 자세하게 설명해주셨다. 나같은 경우 용어나 의미를 전혀 몰라서 이해하는데 쉽지 않았지만 그래도 강사님께 배웠던 부분들은 귀에 들어오는걸 보면 그래도 열심히 들었던 내용들이 아무 의미가 없었던건 아니였나보다.

    블록체인 백서는 또 열심히 수업을 듣고 시간이 또 지나면 다시 읽어봐야겠다. 그때는 이해하는 범위가 또 늘어나있지 않을까라는 기대로 ..ㅎㅎ






💻Payable.

contract Note {
    //payable이 있고 없고의 차이는 돈을 받을 수 있는지 없는지의 차이.
    //payable이 붙어야 돈을 받을 수 있고, 없으면 받을 수 없다.
    address a;
    address payable owner;
    
    // 함수에도 payable을 붙일 수 있다.
    function deposit() public payable returns(uint){
        return msg.value;
    }

    receive() external payable{}// 전송을 할 때 받는 지갑이 컨트랙트면 바로 전송.(함수명이 안붙어서 옴.)

    fallback() external payable{}
    // 이 메세지를 보낸 사람이 오너가 될 수 있다.
    function setOwner() public {
        owner = payable(msg.sender);
    }

    function getOwner() public view returns(address payable) {
        return owner;
    }

    function setA() public {
        a = msg.sender;
    }

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

    function transferTo(address payable _to, uint _amount) public {
        _to.transfer(_amount); // 지갑주소.transfer(규모)
    }

    function transferToOwner(uint _amount) public {
        owner.transfer(_amount);
    }

    /*function transferToA(uint _amount) public {
        a.transfer(_amount);
    }*/
}
  • payable

    • payable이 있고 없고의 차이는 돈을 받을 수 있는지 없는지의 차이.
    • payable이 붙어야 돈을 받을 수 있고, 없으면 받을 수 없다.
  • msg.sender = 거래를 일으킨 사람.

  • msg.value = 얼만큼을 보냈는가.

function deposit() public payable{}
  • 함수에도 위와 같이 "payable"을 붙일수가 있다.
    • deposit은 컨트랙트에 종속되어 있기 때문에 돈을 받을 수가 있다.

  • 돈을 받을 수 있는 지갑과 받을 수 없는 지갑 두개를 준비.
  • 돈을 받을 수 있는 지갑. (to.transfer(_amount) = 이 지갑주소에.보내주세요(_이만큼) ) , input값에 payable을 붙여줬기 때문에 돈을 받을 수 있음.
function transferTo(address payable _to, uint _amount) public {
        _to.transfer(_amount); // 지갑주소.transfer(규모)
    }
``
  • 돈을 받을 수 없는 지갑.(a는 payable을 사용하지 않았기 때문에 돈을 받을 수 없다.)
function transferToA(uint _amount) public {
        a.transfer(_amount);
  • 돈을 받을 수 있는 지갑(이 코드는 owner가 payable을 가지고 있기 때문에 받을 수 있음.)
function transferToOwner(uint _amount) public {
        owner.transfer(_amount);
    }

🔸receive

receive() external payable{}
  • 이더를 받는데 특화 된 함수.

  • 전송을 할 때 받는 지갑이 컨트랙트면 바로 전송.(함수명이 안붙어서 옴.)

  • from은 나, to는 스마트 컨트랙트.

  • 아무 이름이 안붙어서 왔다면 receive를 실행.


🔸fallback

fallback() external payable{}

  • 예전에는 fallback이 두가지 역할을 했다.
    • 존재하지 않는 함수를 호출하거나 호출한 함수가 없을때 호출되는게 fallback 함수.
    • 돈을 보내려고 할때도 fallback함수를 씀.
    • 위 붉은 이미지와 같이 오타가 있을경우 fallback을 사용.

다시 정리.

  • deposit은 내가 이 함수를 실행시켜서 돈을 보내는것.

    • deposit을 실행시키면 deposit이라는 이름이 붙어서 나온다.
  • receive는 내가 그냥 스마트 컨트랙트에 돈을 보내려고 할 때

    • 그냥 돈을 보내는 거래.(함수명이 아무것도 안적혀있음.)
    • 그때 디폴트로 리시브가 나옴.
  • fallback은 함수의 이름이 잘못 왔을때, 내 컨트랙트에는 그런 함수가 없을때 fallback을 반환.

  • 보낸 돈 만큼을 반환하는 함수.
    • payable 함수랑 붙어있을때만 msg.value를 사용할 수 있음.






💻Sorting.

/*
실습가이드
1. push() 사용하여 2,5,7,4,3,6 넣어보기
2. get() 사용하여 결과 확인 -> 2,5,7,4,3,6
3. sorting() 사용 후, get()으로 결과 확인 -> 7,6,5,4,3,2 
*/

contract Sorting {

    uint[] numbers;

    function push(uint _n) public {
        numbers.push(_n);
    }

    function sorting() public {
        for(uint i=0;i<numbers.length-1;i++) {
            for(uint j=i+1; j<numbers.length ;j++) {
                if(numbers[i] < numbers[j]) {
                    (numbers[i], numbers[j]) = (numbers[j], numbers[i]);
                }
            }
        }
    }

    function sorting2() public {
        for(uint j=1; j<numbers.length;j++) {
            for(uint i=0; i<j; i++) {
                if(numbers[i] < numbers[j]) {
                    (numbers[i], numbers[j]) = (numbers[j], numbers[i]);
                }
            }
        }
    }

    function get() public view returns(uint[] memory) {
        return numbers;
    }
}
  • S반에서 상위 인원을 착출하기 위해 필요한 방법이 sorting.

  • sorting으로 순서를 오름차순 혹은 내림차순으로 정렬시켜 그안에서 상위 또는 하위 몇명을 뽑아낼 수 있도록 하기 위해서 사용.

  • 가장 높은 숫자를 받아야 하는데 그 방법을 예를 들어서 작성해보겠다.

    • 2,7,4,5,6이 있다.
    • 처음 2가 들어왔을땐 2가 제일크고, 그 다음 7이 들어왔을땐 2보다 7이 크기 때문에 7,2의 순서가 된다.
    • 그 다음 4가 들어왔는데 2보다는 크고 7보다는 작기때문에 7,4,2가 된다.
    • 이런 순서로 5와 6이 들어오면 각각 7,5,4,2 그리고 7,6,5,4,2가 된다.
    • 그리고 비교가 되는 순서는 아래와 같다.
    • 이렇게 반복적으로 비교를 하고 순서를 바꾸기 위해서는 for문을 사용해야하고 비교를 위해 2개의 for문을 사용한다.
    • 또한, for문 안에 length가 사용되는데 첫번째 for문에 length-1이 되는 이유는 length보다 하나 작은것까지만 돌아가야하기 때문에 -1을 붙여준것이다.
    • 그리고 numbers[i]와 numbers[j]를 만들어 i보다 j가 크면 자리를 바꿀 수 있도록 if문을 사용해 준다.
      - 한번에 2개 이상의 자리를 바꿔줄때는 아래와 같이 표현할 수 있다.

  • 이렇게 코드를 작성하고나면 하나의 문제점이 생긴다. 바로 for문을 통해 숫자가 반복되다보면 i의 값이 상승할때 j의 값이 i보다 하나씩 더 상승해야하는데 그렇지 못한 상황이 발생한다.
    • 이 문제를 해결하기 위해서는 아래와 같이 j=i+1로 i를 추가해주면 해결할 수 있다.

  • 위 문제를 다른방식으로도 코드를 작성할 수 있다.
    • 앞에있는 아이가 작으면 뒤로가게되고, 뒤에있는 아이가 더 크면 앞으로오는 관계성을 가지고 있기 때문에 그 과정에서 하나씩 다 비교하며 어떻게 하면 더 쉽게 볼 수 있을까라는 생각에서 작성된 코드다.

  • 이렇게 코드를 작성하게 되면 위에서 설명했던 방법과는 반대로 비교를 하게 된다. 예를들어 보겠다.
    • j를 시작 기준으로 1이 들어오게 된다. i는 0이 들어오게 되고, 1이 크기때문에 통과하고 i는 1이 된다. j도 1인 상태이기 때문에 조건이 성립하지 않게된다.
    • j는 2가됐다. 그다음 i는 다시 0이 들어오고, 통과하고 i는 1이 더해지고, 다시 통과한다. i가 다시 1이 더해져 2가되고, j도 2이기때문에 조건이 성립하지 않게되고 j는 3이된다.
    • 이런 순서로 마지막까지의 과정을 거치게 되는것이다.
  • 위에 있는 sorting과 아래있는 sorting2는 다른 코드이지만 같은 역할을 한다. 그리고 sorting을 이용하여 아래와 같이 S반 상위4명의 정보를 반환할 수 있는 코드를 작성할 수 있게 된다.






💻코딩테스트.

  • 두번째 코딩테스트를 치렀다. 중하수준으로 문제를 내셨다고 했는데 역시나 나는 너무 어려웠다.
여러분은 검색 엔진 사이트에서 근무하고 있습니다. 
고객들의 ID와 비밀번호를 안전하게 관리할 의무가 있습니다. 
따라서 비밀번호를 rawdata(있는 그대로) 형태로 관리하면 안됩니다. 
비밀번호를 안전하게 관리하고 로그인을 정확하게 할 수 있는 기능을 구현하세요.

아이디와 비밀번호는 서로 쌍으로 관리됩니다. 
비밀번호는 rawdata가 아닌 암호화 데이터로 관리되어야 합니다.
(string => bytes32)인 mapping으로 관리

value인 bytes32는 ID와 PW를 같이 넣은 후 나온 결과값으로 설정하기
abi.encodePacked() 사용하기

* 로그인 기능 - ID, PW를 넣으면 로그인 여부를 알려주는 기능
* 회원가입 기능 - 새롭게 회원가입할 수 있는 기능
---------------------------------------------------------------------------
* 회원가입시 이미 존재한 아이디 체크 여부 기능 - 이미 있는 아이디라면 회원가입 중지
* 비밀번호 5회 이상 오류시 경고 메세지 기능 - 비밀번호 시도 회수가 5회되면 경고 메세지 반환
* 회원탈퇴 기능 - 회원이 자신의 ID와 PW를 넣고 회원탈퇴 기능을 실행하면 관련 정보 삭제

  • 정답 풀이를 강사님이 해주시다 수업이 끝났다. 추가적인 풀이는 다음 시간에 해주시기로 했다.
contract QUIZ2 {
    mapping(string => bytes32) ID_PW;

    // * 로그인 기능 - ID, PW를 넣으면 로그인 여부를 알려주는 기능
    function logIn(string memory _ID, string memory _PW) public view returns(bool){
        return ID_PW[_ID] == keccak256(abi.encodePacked(_ID, _PW));
    }

    function logIn2(string memory _ID) public view returns(bytes32){
        return ID_PW[_ID];
    }

    // * 회원가입 기능 - 새롭게 회원가입할 수 있는 기능
    function signIn(string memory _ID, string memory _PW) public{
        ID_PW[_ID] = keccak256(abi.encodePacked(_ID, _PW));
    }


}






🌜하루를 마치며..

어제 알려주신 내용들을 정리하면서 배운부분에 대해서 다시 정리할 수 있었다.
사실 그제 코테 이후로 정신을놔서 어제 수업내용을 정리만 해두고 머릿속에 하나도 담지 못했는데 그나마 다행인건 어제 정리라도 해놔서 오늘 다시 복습을 할 수 있었으니 다행이었다.
확실히 코데를 두번 해보니 가장 큰 문제는 코드의 기능적인 부분을 제대로 숙지하지 못하는것과 문제를 읽었을때 문제에 어떻게 적용하고 사용할지 또는 응용할지를 전혀 떠올리지 못한다는것이었다.
근데 이 문제는 단시간에 해결할 수 있는 문제는 아닌것 같다.
특히나 강사님 문제는 나에게 개인적으로 많이 이해하기 어려워서 강사님이 테스트후 알려주시는 풀이내용을 잘 듣는게 굉장히 중요할 것 같다.
오늘은 이렇게 어제 배운 내용에 대해서 정리를 마치고 강사님께서 주신 솔리디티 뽀개기를 하나씩 해보는 시간을 가져야겠다.

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

0개의 댓글