testnet
GitHub EN

컨트랙트 아키텍처 및 빌드 시스템

developer external-dapp

Maroo 모노레포 전반에 분산된 Solidity 컨트랙트를 컴파일하고 관리하기 위한 통합 시스템입니다.

Maroo는 모노레포 구조를 사용하며, 스마트 컨트랙트, 특히 프리컴파일 인터페이스는 해당 Go 모듈과 동일한 위치에 있습니다. 컨트랙트 빌드 시스템은 이러한 분산된 레이아웃을 관리하는 데 필요한 도구를 제공합니다. 중앙 집중식 Hardhat 프로젝트를 컴파일 엔진으로 사용하며, 소스 파일을 수집하고 컴파일한 후 빌드 아티팩트를 원래 위치로 다시 배포하는 Python 스크립트에 의해 오케스트레이션됩니다. 이를 통해 Go 모듈이 항상 최신 컨트랙트 ABI에 접근할 수 있도록 보장합니다.

주요 기능

중앙 집중식 컴파일

단일 Hardhat 프로젝트를 사용하여 의존성 및 컴파일러 버전을 관리하여 모든 컨트랙트에서 일관성을 보장합니다.

아티팩트 동일 위치 저장

컴파일된 JSON 아티팩트(ABI, 바이트코드)를 소스 Solidity 파일 옆에 자동으로 배치하여 Go 모듈에서 쉽게 접근할 수 있도록 합니다.

자동화된 워크플로우

단일 Python 스크립트가 검색, 집계, 컴파일 및 배포를 처리하여 개발자 워크플로우를 단순화합니다.

선택적 컴파일

전체 재컴파일, 아티팩트 정리, 단일 컨트랙트 재컴파일을 지원하여 개발 주기를 단축합니다.

아키텍처

graph TD
    subgraph Maroo Monorepo
        A[precompiles/okrw/IOkrw.sol] --> C{compile_smart_contracts.py};
        B[precompiles/pcl/IPcl.sol] --> C;
        D[other/module/Contract.sol] --> C;
    end

    subgraph Compilation Process
        C -- 1. Copy sources --> E[contracts/solidity/];
        E -- 2. Invoke --> F[Hardhat Compiler];
        F -- 3. Generate --> G[contracts/artifacts/];
    end

    subgraph Artifact Distribution
        G -- 4. Copy back --> H[precompiles/okrw/abi.json];
        G -- 5. Copy back --> I[precompiles/pcl/abi.json];
        G -- 6. Copy back --> J[other/module/Contract.json];
    end

    subgraph Go Modules
      K[x/okrw module] -- reads --> H;
      L[x/pcl module] -- reads --> I;
    end

Maroo 컨트랙트 컴파일 및 아티팩트 배포 흐름 개요.

컨트랙트 검색 및 집계

compile_smart_contracts.py 스크립트는 전체 리포지토리에서 Solidity(.sol) 파일을 스캔하는 것으로 빌드 프로세스를 시작합니다. 특히 precompiles/ 경로 아래에 있는 컨트랙트를 주요 대상으로 삼습니다. 스크립트는 node_modules의 서드파티 라이브러리, Foundry 테스트 (*.t.sol) 및 기타 불필요한 컨트랙트와 같은 관련 없는 파일을 지능적으로 무시합니다.

검색된 모든 관련 Solidity 파일은 중앙 디렉토리인 contracts/solidity/로 복사됩니다. 이 집계 단계는 Hardhat이 흩어져 있는 모든 컨트랙트를 단일하고 일관된 프로젝트의 일부로 취급할 수 있게 해주므로 매우 중요합니다. 이를 통해 의존성 관리가 단순화되고 모든 컨트랙트에 일관된 버전의 Solidity 컴파일러와 설정이 적용됩니다.
참고: `contracts/solidity/` 내에서 복사된 파일의 원본 디렉토리 구조를 유지하여 이름 충돌을 방지하고 논리적 분리를 보존합니다.

Hardhat을 이용한 컴파일

소스 파일을 집계한 후, 스크립트는 contracts/ 디렉토리에서 Hardhat 컴파일 작업(npx hardhat compile)을 호출합니다. Hardhat은 모든 import를 해결하고, npm 또는 yarn을 통해 필요한 의존성(예: OpenZeppelin 컨트랙트)을 다운로드하며, Solidity 코드를 EVM 바이트코드와 ABI(Application Binary Interface)로 컴파일합니다.

이 프로세스의 출력은 contracts/artifacts/ 디렉토리에 저장됩니다. 각 컴파일된 컨트랙트는 ABI, 바이트코드, 배포 정보 및 기타 메타데이터를 포함하는 해당 JSON 파일을 생성합니다. 이 아티팩트는 스마트 컨트랙트의 표준적인, 기계가 읽을 수 있는 표현입니다.

아티팩트 배포 및 사용

마지막으로 가장 중요한 단계는 컴파일된 아티팩트의 배포입니다. 스크립트는 contracts/artifacts/에 생성된 JSON 파일을 순회하며 각 파일을 해당 .sol 파일의 원본 소스 디렉토리로 다시 복사합니다. 예를 들어, precompiles/okrw/IOkrw.sol의 아티팩트는 precompiles/okrw/로 다시 복사됩니다.

소스 코드와 ABI를 동일한 위치에 두는 것은 Maroo의 핵심 디자인 패턴입니다. 이를 통해 프리컴파일을 구현하는 Go 모듈(예: x/okrw 모듈)이 abi.json 파일을 직접 읽을 수 있습니다. 이 ABI는 함수 인자와 반환 값을 패킹하고 언패킹하는 데 사용되어 Go 기반 Cosmos SDK 로직과 EVM 간의 원활한 통신을 보장합니다. 이러한 긴밀한 통합은 수동 ABI 업데이트의 필요성을 없애고 Solidity 인터페이스와 Go 구현 간의 불일치 위험을 줄입니다.

다음 단계

소스: maroo
ESC
검색어를 입력하세요