파운드리(Foundry)?
파운드리(https://github.com/foundry-rs/foundry)는 패러다임(https://www.paradigm.xyz/)에서 만든 솔리디티 개발환경입니다.
러스트로 짜여있어 기존 자바스크립트 기반 개발환경 대비 실행 속도가 매우 빠르고,
오직 솔리디티만으로 테스트를 작성할 수 있다는 특징이 있습니다.
파운드리는 현재 버전인 v0.2.0을 기준으로 다음 네 개의 바이너리로 구성되어 있습니다.
- forge: 트러플(https://github.com/trufflesuite/truffle) 또는 하드햇(https://github.com/NomicFoundation/hardhat)과 같은 개발환경 도구로서, forge init 으로 프로젝트를 생성하거나 forge build로 솔리디티 소스를 컴파일합니다.
- anvil: 가나슈(https://github.com/trufflesuite/ganache) 또는 hardhat node와 유사한 개발노드 런쳐
- cast: CLI 환경에서 노드와 상호작용할 수 있는 클라이언트로, 트러플 또는 하드햇에서의 web3.js나 ethers.js처럼 체인에 접근하거나 트랜잭션을 발생시키는 등의 목적으로 사용합니다.
- chisel: 솔리디티 REPL
파운드리의 장단점과 특징
기존에 널리 쓰이는 솔리디티 개발 환경인 트러플, 하드햇, 리믹스 등과 비교했을 때, 파운드리가 가진 특장점들은 다음과 같습니다.
장점 1: 솔리디티로 작성하는 테스트 및 스크립트
기존 개발환경에선 컨트랙트 테스트, 배포, 상호작용을 자바스크립트로 해야했습니다.
따라서 web3.js 나 ethers.js에 대한 팔로업이 요구되고, 자바스크립트 또는 타입스크립트의 스펙과 같은 컨트랙트 외적인 요소들까지 고려했어야 했죠.
한가지 예시를 들자면, uint256과 같은 큰 수를 표현하기 위해 bn.js, bignumber.js, bigint 등 여러 방식을 사용해온 것이 바로 이 경우 입니다.
파운드리에선 이런 것들을 생각하지 않아도 됩니다.
자바스크립트 없이도 테스트, 컨트랙트 배포, 향후 상호작용까지 모든 걸 할 수 있어 훨씬 간단하고 편리해집니다.
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;
contract Counter {
uint256 public number;
function setNumber(uint256 newNumber) public {
number = newNumber;
}
function increment() public {
number++;
}
}
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;
import "forge-std/Test.sol";
import "../src/Counter.sol";
contract CounterTest is Test {
Counter public counter;
function setUp() public {
counter = new Counter();
counter.setNumber(0);
}
function testIncrement() public {
counter.increment();
assertEq(counter.number(), 1);
}
function testSetNumber(uint256 x) public {
counter.setNumber(x);
assertEq(counter.number(), x);
}
}

장점 2: 빠른 컴파일 및 테스트 속도
파운드리는 자바스크립트 기반 개발환경 대비 컴파일 속도나 테스트 실행 속도가 매우 빠릅니다.
파운드리 깃허브에서 제시한 컴파일 타임 벤치마크에 의하면, 파운드리 컴파일 속도가 하드햇 대비 최대 11배 빠르다고 합니다.
실제로 사용해보았을 때, 컴파일, 테스트, 개발노드 실행(anvil) 모두 걸리는 시간이 대폭 축소됨을 확인할 수 있습니다.

장점 3: 유용한 테스팅 라이브러리 및 내장 도구들
파운드리는 DappHub의 DappTool이란 개발환경을 기반으로 합니다.
솔리디티 온리 테스팅은 사실 DappTools로부터 상속받은 성질이죠.
따라서 DappTools의 솔리디티 테스팅 라이브러리(https://github.com/dapp-hub/ds-test)를 포함하여 유용한 솔리디티 테스팅 라이브러리(https://github.com/foundry-rs/forge-std)를 기본으로 제공합니다.
하드햇처럼 컨트랙트 레벨에서 console을 찍거나, vm cheatcode를 통해 체인 또는 트랜잭션 상태 바꾸기(block.number, msg.sender, msg.value 등) 등이 가능하고,
테스트 시엔 함수별 가스 소모량 계산, 함수 argument 프린팅, 트랜잭션 tracing 등을 기본으로 제공합니다.
또한 자체적으로 디버거를 제공하고 있어서 함수 테스트 시에 OPCODE를 단계별로 실행하면서
stack, memory 등이 어떻게 바뀌는지와 같은 것들을 별도 라이브러리 없이 확인할 수 있습니다.
prettier와 유사한 자체 코드 포매터(forge fmt)도 제공하고 있죠.

장점 4: 하드햇과의 호환성
트러플/하드햇 프로젝트의 구조는 일반적으로 컨트랙트, 테스트 코드, 스크립트 코드를 각각 contracts/, test/, scripts/ 디렉토리에 저장하며,
컨트랙트 라이브러리를 node_modules/ 디렉토리에 npm 패키지 형태로 저장하는 형태입니다.
이에 반해 파운드리는 DappTools의 프로젝트 구조(src/ test/ script/) 를 따르고 라이브러리를 lib/ 디렉토리에 git submodule로서 저장하는 등의 차이가 있습니다.
이에 대한 해결책으로 파운드리에선 하드햇 프로젝트에 대해서도 컴파일/ 테스트가 가능하도록 호환 모드를 제공합니다.
forge build 명령어에 — hardhat 옵션을 주는 식으로 간단하게 사용할 수 있습니다.
일례로, 오픈제플린의 라이브러리(https://github.com/OpenZeppelin/open-zeppelin-contracts)는 하드햇 프로젝트지만 fuzz testing 등 파운드리의 기능을 이용하기 위해 이를 병용하고 있습니다.
물론 파운드리에도 단점이라 할 만한 부분이 존재합니다.
단점 1: 러닝 커브
기존의 개발환경인 리믹스, 트러플, 하드햇, 와플 등은 모두 자바스크립트 기반이라는 공통점이 있었기 때문에 하나에 익숙해지면 다른 것들을 가져다쓰는게 비교적 쉬웠죠.
그러나 파운드리는 기존에 널리 쓰이던 개발환경들과 다른 스타일을 가지고 있습니다.
파운드리의 모티브인 DappTools도 역사가 긴 편이긴 하지만 마이너한 특징(nix 의존성, hevm의 접근성)때문인지 대중적으로 널리 쓰이지는 않은 것 같습니다.
때문에 파운드리에 익숙해지기 위해선 어느 정도 러닝 커브를 감수해야합니다.
단점 2: 업그레이더블 플러그인
업그레이더블 컨트랙트를 배포할 때는 주의해야 할 사항이 많습니다.
새 컨트랙트로 업그레이드했는데 이전 컨트랙트와 스토리지 충돌이 일어난다던지, UUPS 패턴인데 로직 컨트랙트에 upgradeTo 함수가 생략되어 업그레이드가 불가능해진다던지 등
작은 실수가 치명적인 결과로 이어질 가능성이 큽니다.
(모두 실제로 발생했던 사고입니다)
이런 부분들을 방지하기 위해, 오픈제플린에선 업그레이더블 컨트랙트 라이브러리와 배포를 위한 업그레이드 플러그인(https://docs.openzeppelin.com/up-grades-plugins/1.x/)을 제공합니다.
트러플과 하드햇에서 사용할 수 있으며, 업그레이드가 정상적으로 가능한지를 체크하고 업그레이드 실행 이력을 기록해 줍니다.
파운드리에는 위와 같은 기능이 아직 없습니다.
만약 오픈제플린의 업그레이드 플러그인을 쓰고 싶다면, hardhat-compatible한 project를 구성해서 업그레이드 배포만 hardhat을 이용하는 식으로 우회해서 사용해야 합니다.
결론
파운드리는 비교적 새롭고 생소한 솔리디티 개발환경입니다.
기존 개발환경과 꽤 다른 구조로 인해 익숙해지려면 한동안 시간을 투자해야하지만,
한 번 익숙해진다면 타 개발환경 대비 압도적인 테스팅 성능과 유틸리티, 속도를 누릴 수 있으므로 매력적인 옵션이라 생각합니다.
특히 솔리디티로 테스팅과 스크립팅 모든게 가능하다는 건 파운드리가 제공하는 가장 독보적인 장점입니다.