[케블리] #69. Zeppelin Solidity의 SmartContract에 대해서 알아보자!(2)

in #ethereum6 years ago (edited)

 

  

Zeppelin Solidity의 Contract에 대해 알아보자!(2)

주의! 이 포스팅은 최대한 비개발자의 시선에서 쉽게 설명하고자 작성되었지만 자바스크립트나 Solidity에 대해 어느정도 지식이 있다면 더욱 이해하기 수월합니다!


두번째 코드리뷰 시간이 돌아왔습니다. 오늘은 DetailedERC20ERC20, ERC20Basic에 대해서 리뷰해보겠습니다!


Dapp 개발자를 꿈꾸는 분들의 FollowStarwooqii에게 커다란 도움과 활력을 제공합니다.

1. DetailedERC20.sol - 세부사항을 나타내는 계약

DetailedERC20은 토큰의 기본적인 명세를 지정해주는 기능을 구현한 스마트 컨트랙트입니다. 이 컨트랙트를 통해서 우리는 토큰에 이름심볼(이니셜), 수량지정을 위한 소수점을 부여할 수 있습니다!
pragma solidity ^0.4.24;

import "./ERC20.sol";

/**
* @title DetailedERC20 token
* @dev The decimals are only for visualization purposes.
* All the operations are done using the smallest and indivisible token unit,
* just as on Ethereum all the operations are done in wei.
*/

contract DetailedERC20 is ERC20 {

string public name;
string public symbol;
uint8 public decimals;

constructor(string _name, string _symbol, uint8 _decimals) public {
name = _name;
symbol = _symbol;
decimals = _decimals;

}

}

상세한 코드리뷰를 시작하겠습니다.

pragma solidity ^0.4.24;

import "./ERC20.sol";

contract DetailedERC20 is ERC20 {
string public name;
string public symbol;
uint8 public decimals;

1행은 코드를 컴파일할 컴파일러의 버전을 명시합니다.2행 ~ 6행은 ERC20을 상속한다는 것을 명시하고, 계약내 상태변수로 name,symbol,decimals를 선언하여 각각 토큰이름,심볼,소수점 을 문자열과 부호없는 정수로 외부에서 불러올 수 있게 해줍니다.

constructor(string _name, string _symbol, uint8 _decimals) public {

name = _name;
symbol = _symbol;
decimals = _decimals;

7행 부터는 앞서 선언된 상태변수를 각각 문자열, 부호없는 정수로 초기화를 해주는 역할을 합니다.

Ethereum에서 Decimals가 중요한 이유는 기본적으로 Ethereum이 토큰의 단위를 10**-18 의 가장 작은 Wei 단위로 계산을 하기 때문입니다. 이 소수점은 개인의 취향으로 다르게 지정을 할 수 있는 자유도를 컨트랙트 작성자에게 부여하지만 일반적으로는 소수점 18자리까지 사용하는 것을 기본으로 합니다.

우리는 이 계약을 통해서 우리가 발행하고 싶은 토큰의 세부사항을 지정할 수 있게 되었습니다! 여러분의 맘에드는 이름과 심볼, 소수점을 지정해보세요!

2. ERC20Basic.sol

ERC20Basic은 바로 뒤에 다룰 ERC20.sol의 간편 인터페이스를 명시하고 있습니다.
Interface란 일반적으로 객체지향언어에서 Abstract 함수를 쓰는 것과 비슷합니다. 여러가지 의미가 있지만, 기본적으로 해당 내용을 구현하지는 않고 이를 상속하는 쪽에서 구현하게 하되, 다른 컨트랙트들에게 이 컨트랙트는 이런 함수들을 포함하니, 안심하고 호출하라는 정보를 주는 역할을 합니다.
pragma solidity ^0.4.24;

/**
* @title ERC20Basic
* @dev Simpler version of ERC20 interface
* See https://github.com/ethereum/EIPs/issues/179
*/

contract ERC20Basic {

function totalSupply() public view returns (uint256);

function balanceOf(address who) public view returns (uint256);

function transfer(address to, uint256 value) public returns (bool);

event Transfer(address indexed from, address indexed to, uint256 value);

}

자세한 코드리뷰에 들어가겠습니다.

contract ERC20Basic {

function totalSupply() public view returns (uint256);

function balanceOf(address who) public view returns (uint256);

function transfer(address to, uint256 value) public returns (bool);

event Transfer(address indexed from, address indexed to, uint256 value);

이제부터 pragma solidity 0.4.24; 와 같은 컨트랙트의 버전 명시를 생략하도록 하겠습니다.


ERC20Basic 컨트랙트는 2행부터 4행까지 이 컨트랙트를 상속하는 계약들에게 totalSupplybalanceOf, transfer 함수들을 사용한다는 것을 명시해주는 역할을 합니다.

5행에서는 Transfer 이벤트를 통해서 이더를 누가from, 누구에게 to, 얼마를 value전송했는지 기록을 남깁니다.

  • 여기서 이슈가 될 수 있는 부분은 후에 언급하게 될 library와 Interface사용하는 데 있어 다른 점이 무엇인지 라이브러리와 인터페이스의 차이점에 관한 것이라고 할 수 있습니다. 잠시 이부분에 대해서 설명을 드리겠습니다.
간략히 말씀드리자면, 라이브러리와 인터페이스는 구체적으로 업그레이드가 가능한 계약과 관련되어 있어 두가지 접근 방식간에 실제로 차이가 크지는 않지만 이 두가지 구현을 통해 별도의 저장영역 약정을 가지고 있으며 저장계약에 계속 호출을 해서 계약을 실행합니다.

유일한 차이점은 가스 소비입니다. 

인터페이스를 사용하면 단일 호출을 하게 되고, 라이브러리를 사용하게 되면 추상화 레이어를 한층 추가하게 되고 Delegatecall과 함께 호출됩니다. 

사용되는 가스비는 그리 많이 소비되지 않습니다. 이 두가지 접근방법은 상당히 유사하지만 취향에 맞게 개발시 이용을 하시면 될 것 입니다. 


그렇다면 라이브러리와 인터페이스의 특징을 살펴봅시다.

라이브러리 :

  • 논리를 포함할 수 있으며 유지 관리 및 재사용 목적으로 계약에서 코드를 추출하는데 사용됩니다.
  • 한번 배치된 다음 컨트랙트에서 참조됩니다. 이들의 바이트 코드는 별도로 배포되며 이를 참조하는 계약의 일부가 되진 않습니다.

인터페이스 :

  • 주로 컨트랙트 구현체와 다른 컨트랙트에 대한 상호작용을 제공합니다. 인터페이스는 구현된 컨트랙트보다 배포및 import의 사이즈가 더 작습니다.
  • 유지보수 및 업그레이드 가능성에 대한 abstraction을 제공합니다.

위의 두가지 방법의 유사한 부분은 둘 다 저장소 변수를 포함할 수 없다는 점입니다.

3. ERC20.sol

ERC20은 위에서 언급한 인터페이스를 구현한 ERC20의 솔리디티 스마트 컨트랙트입니다. ERC20에서 사용하는 함수들을 명시해놨습니다.
pragma solidity ^0.4.24;

import "./ERC20Basic.sol";

/**
* @title ERC20 interface
* @dev see https://github.com/ethereum/EIPs/issues/20
*/

contract ERC20 is ERC20Basic {

function allowance(address owner, address spender)
public view returns (uint256);

function transferFrom(address from, address to, uint256 value)
public returns (bool);

function approve(address spender, uint256 value) public returns (bool);

event Approval(

address indexed owner,
address indexed spender,
uint256 value
);

}

ERC20.sol을 살펴보도록 하겠습니다.

pragma solidity ^0.4.24;


import "./ERC20Basic.sol";

ERC20은 ERC20Basic.sol을 상속합니다.

contract ERC20 is ERC20Basic {

function allowance(address owner, address spender)
public view returns (uint256);

11행에서 allowance 함수를 명시했습니다. 

이 함수는 owner의 주소와 sepender의 주소를 인자로 받으며 public으로 선언되었고, uint256타입의 부호없는 정수를 반환합니다.

 allowance함수는 owner로부터 spender가 인출할 수 있는 수량을 반환하는 역할을 합니다.

function transferFrom(address from, address to, uint256 value)
public returns (bool);

function approve(address spender, uint256 value) public returns (bool);

14행에서는 transferFrom함수를 명시합니다.

 fromto라는 주소타입과 uint256타입의 value를 인자로 받고 public으로 선언되었으며 bool값은 반환합니다. 

transferFrom함수는 value만큼의 토큰수량을 from으로부터 to에게 전송하는 기능을 가집니다.

17행에서는 approve함수를 명시하는데 spender라는 주소와 value라는 부호없는 정수값을 인자로 받습니다. 위와 마찬가지로 public으로 선언되었으며 bool값을 반환합니다.approve함수는 spendervalue만큼의 금액까지 여러번 나의 계정에서 인출할 수 있도록 합니다. 

이 함수를 다시 호출하면 value값을 현재 허용값에다 덮어씁니다.


event Approval(

address indexed owner,
address indexed spender,
uint256 value

);

}

마지막으로는 Approval이라는 이벤트를 선언하는데요, ownerspender로 인덱싱된 주소와 부호없는 정수값인 value를 로그로 남기는 역할을 합니다.

여기까지 ERC20의 TokenStandard중 여섯번째 컨트랙트까지 리뷰를 해봤습니다.


다음 포스트에서는 토큰발행에 있어 발행과 관련한 중요한 역할을 담은

MintableTokenPausableToken, RBACMintableToken에 대해서 리뷰해보겠습니다!

Reference


Sort:  

Congratulations @kblock! You have completed the following achievement on Steemit and have been rewarded with new badge(s) :

Award for the number of upvotes received

Click on the badge to view your Board of Honor.
If you no longer want to receive notifications, reply to this comment with the word STOP

To support your work, I also upvoted your post!

Do you like SteemitBoard's project? Then Vote for its witness and get one more award!

Coin Marketplace

STEEM 0.35
TRX 0.12
JST 0.040
BTC 70391.42
ETH 3572.68
USDT 1.00
SBD 4.74