작성
·
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
1. 표준을 지키도록 것을 권고하는 것이죠. 구현하지 않은 인터페이스가 있음에도 불구하고 모두 구현한 것처럼 true로 한다면, 예를 들어 구현하지 않은 메소드를 있는 것으로 알고 호출하면 오류가 나겠죠? 모두 구현한 것처럼 거짓말을 하면 오류가 발생할 뿐입니다.
ERC-721을 설계한 윌리암 엔트리켄에 의하면 앞으로 솔리디티 내에서 인터페이스ID를 상수처럼 그냥 사용할 수 있도록 할 수도 있다는 말을 한 적이 있습니다. 각 컨트랙트에서 XOR를 하거나 아예 값을 적지 않아도 말입니다. 예를 들어 다음과 같은 식으로 말이죠: ERC721Enumerable.interfaceId
2. this는 컨트랙트를 가리키는 예약어 입니다. 경고의 의미는, 예를 들어 external로 지정한 함수는 원칙적으로 컨트랙트 내부에서 호출할 수 없지만 this를 사용하여 호출할 수 있습니다. 하지만 불필요한 가스를 소모하므로 장려하지도 않고 내부에서도 호출할 것이라면 external로 지정하면 안되겠죠? 컴파일러의 경고는 "this를 사용했다면 혹시 external 함수를 호출하려는 것이 아닌가?" 로 판단하여, 그렇다면 생성자에서는 this를 사용하여 함수를 호출할 수 없다는 것을 경고하는 의미가 되겠습니다.
좋은 질문 감사드립니다.
0