강사님께서 전날 우리들이 힘들어하셨다는걸 느끼시고, 달달한 맛으로 블록체인 백서에 대해서 하나씩 자세하게 설명해주셨다. 나같은 경우 용어나 의미를 전혀 몰라서 이해하는데 쉽지 않았지만 그래도 강사님께 배웠던 부분들은 귀에 들어오는걸 보면 그래도 열심히 들었던 내용들이 아무 의미가 없었던건 아니였나보다.
블록체인 백서는 또 열심히 수업을 듣고 시간이 또 지나면 다시 읽어봐야겠다. 그때는 이해하는 범위가 또 늘어나있지 않을까라는 기대로 ..ㅎㅎ
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
msg.sender = 거래를 일으킨 사람.
msg.value = 얼만큼을 보냈는가.
function deposit() public payable{}
- 돈을 받을 수 있는 지갑. (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() external payable{}
이더를 받는데 특화 된 함수.
전송을 할 때 받는 지갑이 컨트랙트면 바로 전송.(함수명이 안붙어서 옴.)
from은 나, to는 스마트 컨트랙트.
아무 이름이 안붙어서 왔다면 receive를 실행.
fallback() external payable{}
deposit은 내가 이 함수를 실행시켜서 돈을 보내는것.
receive는 내가 그냥 스마트 컨트랙트에 돈을 보내려고 할 때
fallback은 함수의 이름이 잘못 왔을때, 내 컨트랙트에는 그런 함수가 없을때 fallback을 반환.
- 보낸 돈 만큼을 반환하는 함수.
- payable 함수랑 붙어있을때만 msg.value를 사용할 수 있음.
/*
실습가이드
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으로 순서를 오름차순 혹은 내림차순으로 정렬시켜 그안에서 상위 또는 하위 몇명을 뽑아낼 수 있도록 하기 위해서 사용.
가장 높은 숫자를 받아야 하는데 그 방법을 예를 들어서 작성해보겠다.
- 위에 있는 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));
}
}
어제 알려주신 내용들을 정리하면서 배운부분에 대해서 다시 정리할 수 있었다.
사실 그제 코테 이후로 정신을놔서 어제 수업내용을 정리만 해두고 머릿속에 하나도 담지 못했는데 그나마 다행인건 어제 정리라도 해놔서 오늘 다시 복습을 할 수 있었으니 다행이었다.
확실히 코데를 두번 해보니 가장 큰 문제는 코드의 기능적인 부분을 제대로 숙지하지 못하는것과 문제를 읽었을때 문제에 어떻게 적용하고 사용할지 또는 응용할지를 전혀 떠올리지 못한다는것이었다.
근데 이 문제는 단시간에 해결할 수 있는 문제는 아닌것 같다.
특히나 강사님 문제는 나에게 개인적으로 많이 이해하기 어려워서 강사님이 테스트후 알려주시는 풀이내용을 잘 듣는게 굉장히 중요할 것 같다.
오늘은 이렇게 어제 배운 내용에 대해서 정리를 마치고 강사님께서 주신 솔리디티 뽀개기를 하나씩 해보는 시간을 가져야겠다.