티스토리 뷰

컴포저빌리티는 스마트 컨트랙트끼리 상호작용해서 작업을 수행할 수 있는걸 의미한다고 한다.

 

예를 들어 컨트랙트 A가 있는데, 이 컨트랙트는 토큰을 예치하면 이자를 준다. 그리고 컨트랙트 B는 담보에 대해서 대출을 해준다.

그러면 사용자는 대출을 받기 위해 A 컨트랙트에서 발생한 이자에 대해 컨트랙트 B를 이용해 대출을 받는 컨트랙트 C를 만들 수 있는 것이다. 따로 이거하고, 저거하고 복잡하게 할 거 없게 되는 것이다. 

 

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.30;

import "./SimpleStorage.sol";

contract SolidityFactory {
    // type visibility name
    // uint public favoriteNumber
    SimpleStorage public simpleStorage;

    function createSimpleStorageContract() public {
        simpleStorage = new SimpleStorage();  // new - solidity knows deploy contract 
    }
}

 

여기서에서 new 키워드는 새로운 컨트랙트 인스턴스를 생성하는데 사용된다. 

 

 

 

override 

상속까지는 저번에 크립토좀비 하면서 배웠는데 오버라이드는 처음 배운다. 

SImpleStore에서 숫자 저장하는 store 함수를 AddFiveStorage에서 상속받아서 업데이트하고자 한다. 

 

AddFiveStorage.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.30;

import {SimpleStorage} from "./SimpleStorage.sol";

contract AddFiveStorage is SimpleStorage {
    // +5
    // overrides
    // virtual override
    function store(uint256 _newNumber) public override {

    }

 

여기 보면 public 옆에 override 키워드가 있다. 이대로 컴파일하려면 안된다. 

우선 괄호가 하나 없고.. (방금 추가함)

 

 

상속해서 오버라이드하려는 함수가 non-virtual이라고 한다. virtual 키워드가 필요해. 원래 SimpleStorage.sol에서 store 함수를 다음과 같이 변경한다. 

 

    function store(uint256 _favoriteNumber) public virtual {
        myFavoriteNumber = _favoriteNumber;
    }

 

그럼 컴파일이 무슨 일 있었니?? 하듯 아주 잘 되는걸 알 수 있다. 

 

virtual 키워드 넣으니 이 함수는 override-able 하게 되었다. 

 

그래서 오버라이드한 store 함수에서는 뭘 할거냐면

 

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.30;

import {SimpleStorage} from "./SimpleStorage.sol";

contract AddFiveStorage is SimpleStorage {
    // +5
    // overrides
    // virtual override
    function store(uint256 _newNumber) public override {
        myFavoriteNumber = _newNumber +5;
    }
}

 

이렇게 할거다.

 

솔리디티는 기본적으로 함수를 final, 재정의 불가한 상태로 간주한다. 그렇기에 virtual 키워드를 넣어 컴파일해주면, 컴파일러에게 이 함수는 상속되어서 자식 컨트랙트 안에서 재정의 될 수 있다고 명시적으로 알려주는 것과 같다. 의도치않은 오버라이딩 (예를 들어 모르고 같은 이름으로 상속받은 컨트랙트에서 함수를 정의한 경우 등)을 피할 수 있어서 컨트랙트의 안정성을 높일 수 있다. 

 

 

 

 

 

 

그러면 이렇게 된다. 2가 내게 젤 좋아하는 숫자야! 하고 저장하면, 7이 되어서 저장된다. 

 

 

아주 사용자를 답답하게 하는 서비스가 아닐 수 없다. 

 

 

끝! >..<

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/01   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함