Primrose Docs
  • Home
    • ⛓️Blockchain
      • Avalanche
        • What is AVAX?
      • Ethereum
        • Ethereum Cancun Upgrade Explained(draft)
        • go-ethereum: gas estimate
        • Blockchain Transaction Lifecycle
        • Mempool
        • Gas optimization in Solidity, Ethereum
      • Solidity DeepDive
        • Meta transaction
        • solidity: patterns
        • UUPS vs Transparent
        • Solidity Interface
        • Smart contract storage
        • ERC-2981 Contract
        • Solidity modifier
        • Solidity delete keyword
        • How To Make NFTs with On-Chain Metadata - Hardhat and JavaScript
        • How to Build "Buy Me a Coffee" DeFi dapp
        • How to Develop an NFT Smart Contract (ERC 721) with Alchemy
        • Upgradeable Contract
        • Smart Contract Verification
      • Common
        • Eigenlayer
        • MultiSig(draft)
        • Chain-Based Proof-of- Stake, BFT-Style Proof-of-Stake
        • Byzantine Fault Tolerance
        • Zero-knowledge
        • Hierarchical Deterministic Wallet
        • Maker DAO
        • Defi
        • Uniswap
        • IBC
        • Cosmos
        • Gossip Protocol
        • Tendermint
        • UTXO vs Account
        • Blockchain Layer
        • Consensus Algorithm
        • How does mining work?
        • Immutable Ledger
        • SHA256 Hash
        • Filecoin
        • IPFS - InterPlanetary File System
        • IPFS와 파일코인
        • Livepeer
        • Layer 0
      • Bitcoin
        • BIP for HD Wallet
        • P2WPKH
        • Segwit vs Native Segwit
    • 📖Languages
      • Javascript/Typescript
        • Hoisting
        • This value in Javascript
        • Execution Context
        • About Javscript
        • tsconfig.json
        • Nest js Provider
        • 'return await promise' vs 'return promise'
      • Python
        • Pythonic
        • Python: Iterable, Iterator
        • Uvicorn & Gunicorn
        • WSGI, ASGI
        • Python docstring
        • Decorator in Python
        • Namespace in Python
        • Python Method
      • Go
        • GORM+MySQL Connection Pool
        • Context in golang
        • How to sign Ethereum EIP-1559 transactions using AWS KMS
        • Mongo DB in golang(draft)
        • Golang HTTP Package
        • Panic
        • Golang new/make
        • golang container package
        • errgroup in golang
        • Generic Programming in Golang
        • Goroutine(draft)
    • 📝Database
      • MongoDB in golang
      • Nested loop join, Hash join
      • DB Query plan
      • Index
      • Optimistic Lock Pessimistic Lock
    • 💻Computer Science
      • N+1 query in go
      • Web server 를 구성할 때 Thread, Process 개수를 어떻게 정할 것인가?
      • CAP
      • Socket programming
      • DNS, IP
      • URL, URI
      • TLS과 SSL
      • Caching(draft)
      • Building Microservices: Micro Service 5 Deploy Principle
      • Red Black Tree
      • AOP
      • Distributed Lock
      • VPC
      • Docker
      • All about Session and JWT
      • Closure
      • Singleton Pattern
      • TCP 3 way handshake & 4 way handshake
      • Race Condition
      • Process Address Space 
      • Call by value, Call by reference, Call by assignment
      • Zookeeper, ETCD
      • URL Shortening
      • Raft consensus
      • Sharding, Partitioning
    • 📒ETC
      • K8S SIGTERM
      • SQS
      • Git Branch Strategy: Ship / Show / Ask
      • Kafka
      • Redis Data Types
      • CI/CD
      • How does Google design APIs?
      • Minishell (42 cursus)
      • Coroutine & Subroutine
      • Redis
Powered by GitBook
On this page
  • Interface
  • Interface in Solidity
  1. Home
  2. Blockchain
  3. Solidity DeepDive

Solidity Interface

Interface

인터페이스는 다른 컨트랙트와 상호작용하기 위해 사용된다.

자식 컨트랙트를 위한 틀이며, 추상 함수로만 구성되어야 한다.

해당 내용을 구현하지는 않고 이를 상속하는 쪽에서 구현하게 하되, 다른 컨트랙트들에게 이 컨트랙트는 이런 함수들을 포함하니 안심하고 호출하라는 정보를 주는 역할을 한다.

Interface in Solidity

아래는 간단한 인터페이스 예시이다.

ICalculator를 이용해서 계산기에 대한 인터페이스를 만들었고, contract Calculator is ICalculator 구절은 Calculator 컨트랙트가 해당 인터페이스를 상속받도록 만든다.

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

interface ICalculator {
    function Add(uint256 a, uint256 b) external pure returns (uint256 result);

    function Sub(uint256 a, uint256 b) external pure returns (uint256 result);

    function Div(uint256 a, uint256 b) external pure returns (uint256 result);

    function Mul(uint256 a, uint256 b) external pure returns (uint256 result);
}

contract Calculator is ICalculator {
    function Add(uint256 a, uint256 b) external pure returns (uint256 result) {
        result = a + b;
    }

    function Sub(uint256 a, uint256 b) external pure returns (uint256 result) {
        result = a - b;
    }

    function Div(uint256 a, uint256 b) external pure returns (uint256 result) {
        result = a / b;
    }

    function Mul(uint256 a, uint256 b) external pure returns (uint256 result) {
        result = a * b;
    }
}

만약에 상속받는 컨트랙트가 여러 개가 된다면 어떻게 할까?

아래와 같이 작성할 수 있다.

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

interface ICalculator {
    function Add(uint256 a, uint256 b) external pure returns (uint256 result);

    function Sub(uint256 a, uint256 b) external pure returns (uint256 result);

    function Div(uint256 a, uint256 b) external pure returns (uint256 result);

    function Mul(uint256 a, uint256 b) external pure returns (uint256 result);
}

interface IGetter {
    function Get() external view returns (uint256 result);
}

contract Calculator is ICalculator, IGetter {
    uint256 data = 10;

    function Add(uint256 a, uint256 b) external pure returns (uint256 result) {
        result = a + b;
    }

    function Sub(uint256 a, uint256 b) external pure returns (uint256 result) {
        result = a - b;
    }

    function Div(uint256 a, uint256 b) external pure returns (uint256 result) {
        result = a / b;
    }

    function Mul(uint256 a, uint256 b) external pure returns (uint256 result) {
        result = a * b;
    }

    function Get() external view returns (uint256 result) {
        return data;
    }
}

그렇다면 한 걸음 더 나아가서, 같은 메소드를 가진 두 개의 인터페이스를 상속받는 경우에는 어떻게 처리해야 할까?

아래와 같이 override로 명시해줌으로써 상속을 받아 구현할 수 있다.

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

interface ICalculator {
    function Add(uint256 a, uint256 b) external pure returns (uint256 result);

    function Sub(uint256 a, uint256 b) external pure returns (uint256 result);

    function Div(uint256 a, uint256 b) external pure returns (uint256 result);

    function Mul(uint256 a, uint256 b) external pure returns (uint256 result);
}

interface IGetter {
    function Get() external view returns (uint256 result);
}

interface ICalculatorTwo {
    function Add(uint256 a, uint256 b) external pure returns (uint256 result);

    function Sub(uint256 a, uint256 b) external pure returns (uint256 result);

    function Div(uint256 a, uint256 b) external pure returns (uint256 result);

    function Mul(uint256 a, uint256 b) external pure returns (uint256 result);
}

contract Calculator is ICalculator, IGetter, ICalculatorTwo {
    uint256 data = 10;

    function Add(
        uint256 a,
        uint256 b
    )
        external
        pure
        override(ICalculator, ICalculatorTwo)
        returns (uint256 result)
    {
        result = a + b;
    }

    function Sub(
        uint256 a,
        uint256 b
    )
        external
        pure
        override(ICalculator, ICalculatorTwo)
        returns (uint256 result)
    {
        result = a - b;
    }

    function Div(
        uint256 a,
        uint256 b
    )
        external
        pure
        override(ICalculator, ICalculatorTwo)
        returns (uint256 result)
    {
        result = a / b;
    }

    function Mul(
        uint256 a,
        uint256 b
    )
        external
        pure
        override(ICalculator, ICalculatorTwo)
        returns (uint256 result)
    {
        result = a * b;
    }

    function Get() external view returns (uint256 result) {
        return data;
    }
}
PreviousUUPS vs TransparentNextSmart contract storage

Last updated 1 year ago

⛓️