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

in #ethereum6 years ago (edited)

<p dir="auto">  <p dir="auto">   <h2>Zeppelin Solidity의 Contract에 대해 알아보자!(2) <p dir="auto"><strong>주의! <strong>이 포스팅은 최대한 비개발자의 시선에서 쉽게 설명하고자 작성되었지만 자바스크립트나 Solidity에 대해 어느정도 지식이 있다면 더욱 이해하기 수월합니다! <p dir="auto"><br /> <p dir="auto">두번째 코드리뷰 시간이 돌아왔습니다. 오늘은 <strong>DetailedERC20과 <strong>ERC20, <strong>ERC20Basic에 대해서 리뷰해보겠습니다! <p dir="auto"><br /> <p dir="auto">Dapp 개발자를 꿈꾸는 분들의 <strong>Follow와 <strong>Star는 <a href="https://github.com/wooqii/wooqii.github.io" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">wooqii에게 커다란 도움과 활력을 제공합니다. <h2>1. DetailedERC20.sol - 세부사항을 나타내는 계약 <blockquote><strong>DetailedERC20은 토큰의 기본적인 명세를 지정해주는 기능을 구현한 스마트 컨트랙트입니다. 이 컨트랙트를 통해서 우리는 토큰에 <strong>이름과 <strong>심볼(이니셜), <strong>수량지정을 위한 소수점을 부여할 수 있습니다! <pre><code>pragma solidity ^0.4.24;<br /> <br /> import "./ERC20.sol";<br /> <br /> /**<br /> * @title DetailedERC20 token<br /> * @dev The decimals are only for visualization purposes.<br /> * All the operations are done using the smallest and indivisible token unit,<br /> * just as on Ethereum all the operations are done in wei.<br /> */<br /> <br /> contract DetailedERC20 is ERC20 {<br /> <br /> string public name;<br /> string public symbol;<br /> uint8 public decimals;<br /> <br /> constructor(string _name, string _symbol, uint8 _decimals) public {<br /> name = _name;<br /> symbol = _symbol;<br /> decimals = _decimals;<br /> <br /> }<br /> <br /> }<br /> <p dir="auto">상세한 코드리뷰를 시작하겠습니다. <pre><code>pragma solidity ^0.4.24;<br /> <br /> import "./ERC20.sol";<br /> <br /> contract DetailedERC20 is ERC20 {<br /> string public name;<br /> string public symbol;<br /> uint8 public decimals;<br /> <p dir="auto">1행은 코드를 컴파일할 컴파일러의 버전을 명시합니다.2행 ~ 6행은 <code>ERC20을 상속한다는 것을 명시하고, 계약내 상태변수로 <code>name,<code>symbol,<code>decimals를 선언하여 각각 <code>토큰이름,<code>심볼,<code>소수점 을 문자열과 부호없는 정수로 외부에서 불러올 수 있게 해줍니다. <pre><code>constructor(string _name, string _symbol, uint8 _decimals) public {<br /> <br /> name = _name;<br /> symbol = _symbol;<br /> decimals = _decimals;<br /> <p dir="auto">7행 부터는 앞서 선언된 상태변수를 각각 문자열, 부호없는 정수로 초기화를 해주는 역할을 합니다. <blockquote>Ethereum에서 Decimals가 중요한 이유는 기본적으로 Ethereum이 토큰의 단위를 10**-18 의 가장 작은 Wei 단위로 계산을 하기 때문입니다. 이 소수점은 개인의 취향으로 다르게 지정을 할 수 있는 자유도를 컨트랙트 작성자에게 부여하지만 일반적으로는 소수점 18자리까지 사용하는 것을 기본으로 합니다. <p dir="auto"><strong>우리는 이 계약을 통해서 우리가 발행하고 싶은 토큰의 세부사항을 지정할 수 있게 되었습니다! 여러분의 맘에드는 이름과 심볼, 소수점을 지정해보세요! <h2>2. ERC20Basic.sol <blockquote><strong>ERC20Basic은 바로 뒤에 다룰 ERC20.sol의 간편 인터페이스를 명시하고 있습니다. <blockquote>Interface란 일반적으로 객체지향언어에서 Abstract 함수를 쓰는 것과 비슷합니다. 여러가지 의미가 있지만, 기본적으로 해당 내용을 구현하지는 않고 이를 상속하는 쪽에서 구현하게 하되, 다른 컨트랙트들에게 이 컨트랙트는 이런 함수들을 포함하니, 안심하고 호출하라는 정보를 주는 역할을 합니다. <pre><code>pragma solidity ^0.4.24;<br /> <br /> /**<br /> * @title ERC20Basic<br /> * @dev Simpler version of ERC20 interface<br /> * See https://github.com/ethereum/EIPs/issues/179<br /> */<br /> <br /> contract ERC20Basic {<br /> <br /> function totalSupply() public view returns (uint256);<br /> <br /> function balanceOf(address who) public view returns (uint256);<br /> <br /> function transfer(address to, uint256 value) public returns (bool);<br /> <br /> event Transfer(address indexed from, address indexed to, uint256 value);<br /> <br /> }<br /> <p dir="auto">자세한 코드리뷰에 들어가겠습니다. <pre><code>contract ERC20Basic {<br /> <br /> function totalSupply() public view returns (uint256);<br /> <br /> function balanceOf(address who) public view returns (uint256);<br /> <br /> function transfer(address to, uint256 value) public returns (bool);<br /> <br /> event Transfer(address indexed from, address indexed to, uint256 value);<br /> <p dir="auto"><strong>이제부터 <code><strong>pragma solidity 0.4.24; <strong>와 같은 컨트랙트의 버전 명시를 생략하도록 하겠습니다. <p dir="auto"><br /> <p dir="auto"><code>ERC20Basic 컨트랙트는 2행부터 4행까지 이 컨트랙트를 상속하는 계약들에게 <code>totalSupply와 <code>balanceOf, <code>transfer 함수들을 사용한다는 것을 명시해주는 역할을 합니다. <p dir="auto">5행에서는 <code>Transfer 이벤트를 통해서 이더를 누가<code>from, 누구에게 <code>to, 얼마를 <code>value전송했는지 기록을 남깁니다. <ul> <li><strong>여기서 이슈가 될 수 있는 부분은 후에 언급하게 될 library와 Interface사용하는 데 있어 다른 점이 무엇인지 라이브러리와 인터페이스의 차이점에 관한 것이라고 할 수 있습니다. 잠시 이부분에 대해서 설명을 드리겠습니다. <blockquote>간략히 말씀드리자면, 라이브러리와 인터페이스는 구체적으로 업그레이드가 가능한 계약과 관련되어 있어 두가지 접근 방식간에 실제로 차이가 크지는 않지만 이 두가지 구현을 통해 별도의 저장영역 약정을 가지고 있으며 저장계약에 계속 호출을 해서 계약을 실행합니다. <p dir="auto">유일한 차이점은 <strong>가스 소비입니다.  <p dir="auto">인터페이스를 사용하면 단일 호출을 하게 되고, 라이브러리를 사용하게 되면 추상화 레이어를 한층 추가하게 되고 <code>Delegatecall과 함께 호출됩니다.  <p dir="auto">사용되는 가스비는 그리 많이 소비되지 않습니다. 이 두가지 접근방법은 상당히 유사하지만 취향에 맞게 개발시 이용을 하시면 될 것 입니다.  <p dir="auto"><br /> <p dir="auto">그렇다면 라이브러리와 인터페이스의 특징을 살펴봅시다. <h3><em>라이브러리 : <ul> <li>논리를 포함할 수 있으며 유지 관리 및 재사용 목적으로 계약에서 코드를 추출하는데 사용됩니다. <li>한번 배치된 다음 컨트랙트에서 참조됩니다. 이들의 바이트 코드는 별도로 배포되며 이를 참조하는 계약의 일부가 되진 않습니다. <h3><em>인터페이스 : <ul> <li>주로 컨트랙트 구현체와 다른 컨트랙트에 대한 상호작용을 제공합니다. 인터페이스는 구현된 컨트랙트보다 배포및 import의 사이즈가 더 작습니다. <li>유지보수 및 업그레이드 가능성에 대한 abstraction을 제공합니다. <p dir="auto">위의 두가지 방법의 유사한 부분은 둘 다 저장소 변수를 포함할 수 없다는 점입니다. <h2>3. ERC20.sol <blockquote><strong>ERC20은 위에서 언급한 인터페이스를 구현한 ERC20의 솔리디티 스마트 컨트랙트입니다. ERC20에서 사용하는 함수들을 명시해놨습니다. <pre><code>pragma solidity ^0.4.24;<br /> <br /> import "./ERC20Basic.sol";<br /> <br /> /**<br /> * @title ERC20 interface<br /> * @dev see https://github.com/ethereum/EIPs/issues/20<br /> */<br /> <br /> contract ERC20 is ERC20Basic {<br /> <br /> function allowance(address owner, address spender)<br /> public view returns (uint256);<br /> <br /> function transferFrom(address from, address to, uint256 value)<br /> public returns (bool);<br /> <br /> function approve(address spender, uint256 value) public returns (bool);<br /> <br /> event Approval(<br /> <br /> address indexed owner,<br /> address indexed spender,<br /> uint256 value<br /> );<br /> <br /> }<br /> <p dir="auto">ERC20.sol을 살펴보도록 하겠습니다. <pre><code>pragma solidity ^0.4.24;<br /> <br /> <br /> import "./ERC20Basic.sol";<br /> <p dir="auto">ERC20은 ERC20Basic.sol을 상속합니다. <pre><code>contract ERC20 is ERC20Basic {<br /> <br /> function allowance(address owner, address spender)<br /> public view returns (uint256);<br /> <p dir="auto">11행에서 <code>allowance 함수를 명시했습니다.  <p dir="auto">이 함수는 owner의 주소와 sepender의 주소를 인자로 받으며 <code>public으로 선언되었고, <code>uint256타입의 부호없는 정수를 반환합니다. <p dir="auto"> <code>allowance함수는 <code>owner로부터 <code>spender가 인출할 수 있는 수량을 반환하는 역할을 합니다. <pre><code>function transferFrom(address from, address to, uint256 value)<br /> public returns (bool);<br /> <br /> function approve(address spender, uint256 value) public returns (bool);<br /> <p dir="auto">14행에서는 <code>transferFrom함수를 명시합니다. <p dir="auto"> <code>from과 <code>to라는 주소타입과 <code>uint256타입의 <code>value를 인자로 받고 <code>public으로 선언되었으며 <code>bool값은 반환합니다.  <p dir="auto"><code>transferFrom함수는 <code>value만큼의 토큰수량을 <code>from으로부터 <code>to에게 전송하는 기능을 가집니다. <p dir="auto">17행에서는 <code>approve함수를 명시하는데 <code>spender라는 주소와 <code>value라는 부호없는 정수값을 인자로 받습니다. 위와 마찬가지로 <code>public으로 선언되었으며 <code>bool값을 반환합니다.<code>approve함수는 <code>spender가 <code>value만큼의 금액까지 여러번 나의 계정에서 인출할 수 있도록 합니다.  <p dir="auto">이 함수를 다시 호출하면 <code>value값을 현재 허용값에다 덮어씁니다. <p dir="auto"><br /> <pre><code>event Approval(<br /> <br /> address indexed owner,<br /> address indexed spender,<br /> uint256 value<br /> <br /> );<br /> <br /> }<br /> <p dir="auto">마지막으로는 <code>Approval이라는 이벤트를 선언하는데요, <code>owner와 <code>spender로 인덱싱된 주소와 부호없는 정수값인 <code>value를 로그로 남기는 역할을 합니다. <p dir="auto">여기까지 ERC20의 TokenStandard중 여섯번째 컨트랙트까지 리뷰를 해봤습니다. <p dir="auto"><br /> <p dir="auto">다음 포스트에서는 토큰발행에 있어 발행과 관련한 중요한 역할을 담은 <h2><strong>MintableToken과 <strong>PausableToken, <strong>RBACMintableToken에 대해서 리뷰해보겠습니다! <h2><strong>Reference <ul> <li><a href="https://github.com/ethereum/EIPs/issues/200" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">https://github.com/ethereum/EIPs/issues/20 <li><a href="https://stackoverflow.com/questions/50022369/upgradable-smart-contracts-with-solidity-interface-vs-library#" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">https://stackoverflow.com/questions/50022369/upgradable-smart-contracts-with-solidity-interface-vs-library# <li><a href="https://openzeppelin.org/" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">https://openzeppelin.org/ <p dir="auto"><br /> <p dir="auto"><img src="https://images.hive.blog/768x0/https://imageshack.com/a/img924/4806/yHuNLU.png" srcset="https://images.hive.blog/768x0/https://imageshack.com/a/img924/4806/yHuNLU.png 1x, https://images.hive.blog/1536x0/https://imageshack.com/a/img924/4806/yHuNLU.png 2x" />
Sort:  

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

<p dir="auto"><a href="http://steemitboard.com/@kblock" target="_blank" rel="noreferrer noopener" title="This link will take you away from hive.blog" class="external_link"><img src="https://images.hive.blog/768x0/https://steemitimages.com/70x80/http://steemitboard.com/notifications/voted.png" srcset="https://images.hive.blog/768x0/https://steemitimages.com/70x80/http://steemitboard.com/notifications/voted.png 1x, https://images.hive.blog/1536x0/https://steemitimages.com/70x80/http://steemitboard.com/notifications/voted.png 2x" /> Award for the number of upvotes received <p dir="auto"><sub><em>Click on the badge to view your Board of Honor.<br /> <sub><em>If you no longer want to receive notifications, reply to this comment with the word <code>STOP <p dir="auto">To support your work, I also upvoted your post! <blockquote> <p dir="auto">Do you like <a href="https://steemit.com/@steemitboard" target="_blank" rel="noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">SteemitBoard's project? Then <strong><a href="https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1" target="_blank" rel="noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">Vote for its witness and <strong>get one more award!