인프런 커뮤니티 질문&답변

MINSEONG HEO님의 프로필 이미지
MINSEONG HEO

작성한 질문수

리액트로 구현하는 블록체인 이더리움 ERC721(NFT)

컨트랙트 구현(1) - 기본 인터페이스

컨트랙트 구현1

작성

·

178

0

constructor() 내에서

(this.functionname.selector ^ ... 의 내용이 길어서 생략으로 표현하신 거라면 아래의 의문은 유효하지 않습니다.)

1.

supportedInterfaces[ ]를

 함수의 selector값을 xor연산 시킨값이 들어가야 한다고 설명을 하셨습니다. 그런데supportedInterfaces[0x80ac58cd]처럼 값을 지정을 시켜서 true값을 준다면 

 ERC165의 규정을 지키고 있다는 것을  '거짓'으로 보일 수 있는 것 아닌가요 ? 

 값을 지정시켜놓으면 Contract내부에서 ERC165의 규정을 지키지 않으면서도 지킨다는 것을 보이는 거라고 생각합니다.

2.

supportedInterfaces[this.supportInterface.selector] = true를 주었더니 compile은 되는데 

Warning: "this" used in constructor. Note that external functions of a contract cannot be called while it is being constructed.

이라는 경고 메세지가 뜹니다. 

반면 bytes4(keccak256("supportsInterface(bytes4)")) 을 이용한 부분은 경고 메세지가 뜨지 않았습니다.

this의 사용이 옳다고 봐도 되나요?

답변 2

1

coldmind님의 프로필 이미지
coldmind
지식공유자

1. 표준을 지키도록 것을 권고하는 것이죠. 구현하지 않은 인터페이스가 있음에도 불구하고 모두 구현한 것처럼 true로 한다면, 예를 들어 구현하지 않은 메소드를 있는 것으로 알고 호출하면 오류가 나겠죠? 모두 구현한 것처럼 거짓말을 하면 오류가 발생할 뿐입니다.

ERC-721을 설계한 윌리암 엔트리켄에 의하면 앞으로 솔리디티 내에서 인터페이스ID를 상수처럼 그냥 사용할 수 있도록 할 수도 있다는 말을 한 적이 있습니다. 각 컨트랙트에서 XOR를 하거나 아예 값을 적지 않아도 말입니다. 예를 들어 다음과 같은 식으로 말이죠: ERC721Enumerable.interfaceId 

관련 정보

2. this는 컨트랙트를 가리키는 예약어 입니다. 경고의 의미는, 예를 들어 external로 지정한 함수는 원칙적으로 컨트랙트 내부에서 호출할 수 없지만 this를 사용하여 호출할 수 있습니다. 하지만 불필요한 가스를 소모하므로 장려하지도 않고 내부에서도 호출할 것이라면 external로 지정하면 안되겠죠? 컴파일러의 경고는 "this를 사용했다면 혹시 external 함수를 호출하려는 것이 아닌가?" 로 판단하여, 그렇다면 생성자에서는 this를 사용하여 함수를 호출할 수 없다는 것을 경고하는 의미가 되겠습니다. 

좋은 질문 감사드립니다.

0

MINSEONG HEO님의 프로필 이미지
MINSEONG HEO
질문자

악의적으로 사용해도 금방 확인할 수 있는 부분이기에 문제가 되는 부분이 아니군요.

답변 감사합니다.!

MINSEONG HEO님의 프로필 이미지
MINSEONG HEO

작성한 질문수

질문하기