solidity

21.07.28 diamond problem

슈팅스타제제 2021. 7. 28. 15:34

내 컨트랙트를 만들 때 ElmoToken에 openzeppelin 의 기존 소스 코드를 다음과 같이 상속해주었다.

다음과 같이 작성한 이유는 함수를 작성한 순서대로 그에 따라 필요한 소스코드를 추가하였기 때문이다. 

contract ElmoToken is ERC20, AccessControl,Ownable, IERC20 {

하지만 아래와 같은 밑줄의 오류가 발생하였다.

"Linearization of inheritance graph impossible"

https://ethereum.stackexchange.com/questions/63564/question-regarding-linearization-of-inheritance

 

question regarding linearization of inheritance

If I have the following inheritance: pragma solidity ^0.4.24; interface A { function foo(uint256 _x) external pure returns(uint256); } contract B1 is A { function foo(uint256 _x) public ...

ethereum.stackexchange.com

위 문서에 따르면 다중 상속 과정에서 컴파일 오류가 발생하는 다이아몬드 문제때문에 이 오류가 나타나는 것이다.

솔리디티는 다음과 같이 C3 linearization을 따른다. 

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.0 <0.9.0;

contract X {}
contract A is X {}

//삐- 컴파일 오류
contract C is A, X {}
//컴파일 성공!
contract C is X, A {}

openzeppelin 소스코드의 상속 관계는 다음과 같다. 

interface IERC20{

/////////////////
contract ERC20 is Context, IERC20, IERC20Metadata {

따라서 부모 컨트랙트인 IERC20을 앞으로 위치시켜야 한다.

아래처럼 코드를 수정했더니 오류가 뜨지 않았다. 

contract ElmoToken is IERC20, ERC20, AccessControl,Ownable{

'solidity' 카테고리의 다른 글

22.09.05 npx hardhat test  (0) 2022.09.05
22.08.29 락업이란?  (0) 2022.08.29
21.07.27 ERC-20 Token Contract  (0) 2021.07.28
21.07.23 Token Role  (0) 2021.07.26
21.07.22 Mint & Burn Token  (2) 2021.07.24