검수요청.png검수요청.png

"ERC-165"의 두 판 사이의 차이

해시넷
이동: 둘러보기, 검색
(ERC 종류 문단 통째로 삭제 (중복 내용))
 
1번째 줄: 1번째 줄:
 
'''ERC-165'''는 "Ethereum Request for Comment 165"의 약자로서, 토큰 대신에 방법에 대한 표준을 지정한다. 인터페이스 확인 구현 후 인터페이스 게시하여 [[스마트 컨트랙트]]에 주어진 인터페이스를 언제 사용하는지 감지한다.
 
'''ERC-165'''는 "Ethereum Request for Comment 165"의 약자로서, 토큰 대신에 방법에 대한 표준을 지정한다. 인터페이스 확인 구현 후 인터페이스 게시하여 [[스마트 컨트랙트]]에 주어진 인터페이스를 언제 사용하는지 감지한다.
 
== 종류 ==
 
=== ERC-223 ===
 
[[ERC-223]]은 ERC-20의 토큰 표준 개선이다. 대부분의 사람은 ERC-20 표준에 지갑과 유사한 방식으로 스마트 계약서로 전송된 모든 전송이 유실될 수 있는 주요 결함이 있음을 알지 못한다. 즉, 트랜잭션이 무효로 등록되는 대신 토큰이 사라지고 회복할 수 없게 된다. 이더리움 커뮤니티가 ERC-20에 있는 결정, 즉, 토큰들이 우연히 사라질 수 있는 오류에 대해 손을 놓고 있는 것은 아니다. 그럼에도 많은 디앱 프로젝트들이 ERC-20을 수행했기 때문에 토큰들이 사라졌다. 손실이 70만 달러에서 100만 달러 정도로 추정이 가능하다. ERC-223은 토큰 스마트 계약에서 직접 보냈을 때 토큰 손실이 될 수 있다는 ERC-20의 문제를 수정한 것이다. ERC-223의 또 다른 혜택은 본질적으로 토큰들이 스마트 계약에서 한 번에 다른 지갑으로 보내질 수 있도록 지원한다. 이 기능 때문에 지갑은 원장 업데이트를 위해 토큰 스마트 계약을 필요로 하지는 않는다. 이 새로운 기능에 따른 부산물은 두 개가 아니라 하나의 기능을 확인하는 것이기 때문에 가스비가 절반 정도밖에 안 된다는 것이다. 가스비는 소액 결제로 스마트 계약이나 간단한 거래를 실행할 때 필요하다. 거래를 실행할 때마다 이더리움 네트워크 채굴자들에게 보상을 주기 위해 지불하는 소액 수수료 개념이다.<ref name="ERC 종류"> 〈[http://wiki.hash.kr/index.php/ERC-20 해시넷 ERC-20]〉, 《해시넷》 </ref>
 
 
=== ERC-777 ===
 
ERC-20의 버그를 위한 또 다른 해결책이 2017년 11일 20일에 제안됐다. 이더리움 커뮤니티에는 [[ERC-777]]로 제출됐고, ERC-20에 대한 해결책이면서 ERC-223과 같이 고유의 혜택도 제공한다. ERC-777은 ERC-820의 기능을 가져와 모든 사람에게 스마트 계약 주소를 볼 수 있게 하고, 그것들의 기능을 체크할 수 있게 해준다. 그리고 이를 트랜잭션이나 요구된 액션들을 검증하는 데 사용한다. ERC-20의 간단한 전송과 확인에서, ERC-777의 보내기 기능으로 본질을 바꾸면서, 토큰과 스마트 계약 그 자체로 더욱 많은 것들을 할 수 있게 된다. 새로운 기능으로 ERC-777은 실행하려는 행동들의 본성을 체크하고 액션을 실행할지 말지 결론을 내릴 수 있다. 하지만 아쉽게도 ERC-777은 당장 ERC-20을 사용하는 모든 프로젝트에 적용되는 것은 아니다. 하지만 전체적인 이더리움 커뮤니티 합의는, 결과적으로 시간이 걸리겠지만, 결국 ERC-777은 수행될 것이다.<ref name="ERC 종류"> 〈[http://wiki.hash.kr/index.php/ERC-20 해시넷 ERC-20]〉, 《해시넷》 </ref>
 
 
=== ERC-721 ===
 
[[ERC-721]]은 NFT(Non-Fungible Token)이다. ERC-721은 개발자들이나 복수의 소유자들 사이에서 공유될 수 없는 토큰을 개발할 수 있게 해준다. 개별적인 각각의 NFT를 위한 기능과 상태를 포함하게 해준다. ERC-721 기능은 디앱 게임들에 광범위하게 적용됐다. 캐릭터나 아이템을 나타내기 위해 NTF를 구현한 게임들이 있다. 대표적인 사례가 이더몬이다. ERC-721은 본질적으로 토큰이 디앱 내에서 공유될 수 있고 미래 NFT 생성에 영향을 미칠 수 있는 수집물이 되도록 한다. NFT는 제한없이 공급이 가능하다. 하지만 NFT의 가치가 떨어지지 않게 하려고 대부분의 디앱 프로젝트는 전체 공급량을 제한한다.<ref name="ERC 종류"> 〈[http://wiki.hash.kr/index.php/ERC-20 해시넷 ERC-20]〉, 《해시넷》 </ref>
 
 
=== ERC-998 ===
 
[[ERC-998]]은 ERC-721과 함께 사용되는 기술로 플레이어들이 모든 통계와 항목 및 토큰을 포함한 전체 캐릭터를 한 번에 전송할 수 있게 한다.<ref name="ERC 종류"> 〈[http://wiki.hash.kr/index.php/ERC-20 해시넷 ERC-20]〉, 《해시넷》 </ref>
 
  
 
== 기능 ==
 
== 기능 ==

2019년 8월 11일 (일) 04:07 기준 최신판

ERC-165는 "Ethereum Request for Comment 165"의 약자로서, 토큰 대신에 방법에 대한 표준을 지정한다. 인터페이스 확인 구현 후 인터페이스 게시하여 스마트 컨트랙트에 주어진 인터페이스를 언제 사용하는지 감지한다.

기능[편집]

  • 토큰 대신 방법에 대한 표준
  • 인터페이스 확인 구현후 인터페이스 게시
  • 스마트 컨트랙트에 주어진 인터페이스를 언제 사용하는지 감지[1]

ERC-165 인터페이스[편집]

pragma solidity ^0.4.20;
interface ERC165 {
   /// @notice Query if a contract implements an interface
   /// @param interfaceID The interface identifier, as specified in ERC-165
   /// @dev Interface identification is specified in ERC-165. This function
   ///  uses less than 30,000 gas.
   /// @return `true` if the contract implements `interfaceID` and
   ///  `interfaceID` is not 0xffffffff, `false` otherwise
   function supportsInterface(bytes4 interfaceID) external view returns (bool);
}

솔리디티(Solidity)의 함수들은 모두 selector를 가지고 있다. selector는 간단히 생각하시면 함수의 아이디라고 생각한다. 이 아이디를 만드는 방법은 함수의 시그니처를 해싱하는 것이다. 예를 들어서

function balanceOf(address _owner) external view returns (uint256){
   //...
};

위와 같은 함수의 아이디를 얻기 위해서는

bytes4(keccak256("balanceOf(address)"))

위처럼 keccak256을 이용해서 해싱하거나 혹은

this.balanceOf.selector

이렇게 컨트랙트 내부에서 각 메소드의 selector를 호출해서 확인할 수 있다. 기본적으로 함수의 시그니처에 따라 다른 해시값이 나오고 이 해시값이 해당 함수의 selector가 된다. ERC-165에선 인터페이스의 구현 여부를 확인하기 위해 이 selector를 사용한다. 이 때 함수의 selector가 해당 함수의 ID라고 한다면 우리는 인터페이스에서 정의한 함수를 모두 구현했는지 여부를 확인하기 위해 인터페이스의 ID에 해당하는 값이 필요하다. 이 아이디는 인터페이스를 구성하는 모든 함수의 selector를 비트 단위 xor 연산을 해서 구한다.

pragma solidity ^0.4.20;
import "./ERC165.sol";
interface Simpson {
    function is2D() external returns (bool);
    function skinColor() external returns (string);
}
contract Homer is ERC165, Simpson {
    function supportsInterface(bytes4 interfaceID) external view returns (bool) {
        return
          interfaceID == this.supportsInterface.selector || // ERC165
          interfaceID == this.is2D.selector
                         ^ this.skinColor.selector; // Simpson
    }
    function is2D() external returns (bool){}
    function skinColor() external returns (string){}
}

위 코드에서 보면 Simpson이라는 인터페이스의 인터페이스 id를 구하기 위해

this.is2D.selector ^ this.skinColor.selector

위와 같이 연산하는 것을 볼 수 있다. 해당 스마트 컨트랙트 Homer가 Simpson 인터페이스를 구현했는지 여부를 확인하고 싶다면 function supportsInterface(bytes4 interfaceID) {} 에 Simpson의 인터페이스 id를 파라미터로 넣어서 호출한다. true를 반환한다면 컨트랙트 Homer 는 Simpson 인터페이스를 구현한 것이고, false 를 반환한다면 구현하지 않은 것이다.[2]

각주[편집]

  1. 아마듈라, 〈암호화폐 Tips - ERC 스탠다드 종류 (ERC20 , ERC721, ERC884)[출처 암호화폐 Tips - ERC 스탠다드 종류 (ERC20 , ERC721, ERC884)]〉, 《아마듈라 블록체인 블로그》 , 2019-06-04
  2. 김병하, 〈ERC-165란 뭘까?〉, 《humanscape-tech》 , 2018-08-17

참고자료[편집]

같이 보기[편집]


  검수요청.png검수요청.png 이 ERC-165 문서는 블록체인 기술에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.