CryptoZombies 1-4,5

김태주·2021년 3월 17일
0

payable

  • 이더를 받을 수 있게 하는 함수 제어자
  • 이더리움 위에 컨트랙트, 함수, eth 가 존재하기 때문에 함수 실행과 동시에 돈을 보내는 것이 가능하다.
  • msg.value: 함수 실행시킨 사람이 보낸 돈
    예시
function buySomething() external payable {
//함수를 실행시킨 사람이 0.001 ether를 보냈는지 확인.
  require(msg.value == 0.001 ether);
}
}

transfer

  • 컨트랙트에 저장된 돈을 특정 주소로 보낼 수 있는 함수
  • this.balance: 현재 컨트랙트의 잔액
    ex) owner.transfer(this.balance): 이 컨트랙트의 주인 (owner) 에게 현재 잔액(this.balance)를 보낸다.
  • 컨트랙트의 잔액은 payable을 통해 받은 eth 이다.

난수

  • keccak256을 이용해서 난수 생성
    ex) 0~99까지의 난수 생성
uint randNonce = uint(keccak256(now, msg.sender, nonce)) % 100
# nonce: 동일한 해시 함수에서 딱 한 번만 쓰여야 되는 값

위의 방법은 정직하지 않다. 왜냐하면 내가 원하는 결과 값을 가질 때만 트랜잭션을 공유할 수 있기 때문이다.

컨트랙트의 함수를 실행시키게 되면 특정 노드 혹은 전체 노드에게 트랜잭션으로서 알리게 된다. 만약 랜덤 함수를 실행시켜서 내가 원하는 값이 나오지 않을 경우에는 나에게만 알리고 원하는 값이 나왔을 경우에는 전체에게 알리게 된다면, 랜덤 함수이지만 내가 원하는 값만 얻을 수 있게 된다.

예를 들어 동전 뒤집기를 하는데 실제 경우로는 앞면 뒷면 둘 다 나오는데 사람들한테 알릴 때는 앞면만 나온 것처럼 할 수 있다는 것이다.

토큰

  • 이더리움 상에서 생겨나는 코인
  • 스마트 컨트랙트에 의해서 만들어진다.
  • 이더를 스마트 컨트랙트에 보내면 토큰을 받을 수 있다.
  • ERC20: 토큰의 한 표준. 토큰을 만들 때 하나의 기준이자 표준이다.
  • ERC721: 각각의 토큰이 유일한 ID를 가지는 것. 또한 분할이 불가능하기 때문에 각각의 토큰 그 하나로 거래해야 한다.

ERC721 구현

balanceOf(_address)
  • 주소를 받아서 그 주소가 가지고 있는 토큰 수 반환
ownerOf(_tokenId)
  • tokenId를 받아서 토큰 소유자의 address를 반환

토큰 전송 로직

1) transfer( _toAddress, _tokenId)
  • 토큰을 전송하는 사람이 실행시키는 함수로 id가 _tokenId인 토큰을 _toAddress로 전송한다.
2) approve( _toAddress, _tokenId), takeOwnership( _tokenId)
  • aprrove 함수를 실행해서 _toAddress가 _tokenId를 가질 수 있도록 허용. (mapping 에 저장)
  • 이후 누군가 takeOwnership 함수를 호출하면 그 사람이 토큰을 가질 수 있는지 확인 후 전송 (토큰을 받을 사람이 실행한다.)

라이브러리 사용

  • 라이브러리 선언 방법
library example {
	function ...
}
  • 라이브러리 사용법
import "라이브러리가 존재하는 파일";

using example(라이브러리 이름) for 변수 타입;

SafeMath

  • overflow와 underflow을 방지해주는 라이브러리

SafeMath 코드

library SafeMath {

  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    if (a == 0) {
      return 0;
    }
    uint256 c = a * b;
    assert(c / a == b);
    return c;
  }

  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    // assert(b > 0); // Solidity automatically throws when dividing by 0
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    return c;
  }

  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    assert(b <= a);
    return a - b;
  }

  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    assert(c >= a);
    return c;
  }
}

사용법

using SafeMath for uint256;

uint256 a = 4;
uint256 b = a.add(4); //b=8
uint256 c = a.mul(4); //c=16
uint256 d = a.div(2); //d=2
uint256 e = a.sub(3); //e=1

add의 매개변수는 2개인데 왜 하나만 써도 되나요?
using SafeMath for int256;를 선언하면서 각 함수의 첫 번째 매개변수에 a를 전달했기 때문.

0개의 댓글

관련 채용 정보