start
Ethernaut
on local network
한창 1기 업사이더들 사이에서 시끌시끌했던 그 이슈!
바로 Ethernaut의 자산 확보 문제였습니다. 다양한 테스트 네트워크를 지원하지만, 결국 해당 네트워크 내 트랜잭션에 필요한 가스비를 충당하기 어렵다는 얘기였죠. (심지어 5만원을 썼다는 분도 계셨습니다! 알고보니 테스트넷 faucet을 이용하기 위해 Mainnet ETH를 구매했다는 이야기)
@hakid29
의 GitHub repo 공유와 @wooz3k
멘토님의 힌트를 보고 로컬에서 동작시키면 되겠다 싶었습니다. @Sori
와 @kenny
도 anvil
은 Foundry
설치하면 된다고 힌트를 주었습니다.
그렇군요.. 문제를 풀다보면 또 다른 문제가 보일까요?
나중에 또 어떤 문제가 생길진 모르겠지만, 일단 충분한 양의 이더만 확보하는 것까지는 검증 완료했습니다. 개발자의 시선에서 시작하는 트러블 슈팅, 자ㅡ 가이드 들어갑니다잉!
⚠️ 잠깐!
본 가이드는macOS
환경에서 진행합니다. 또한homebrew
,git
,IDE
,metamask
등 기본적인 Web3 개발 환경이 준비되어 있고, CLI를 활용한 기본적인 명령 실행 방법을 알고 있다는 전제 하에 진행합니다. 궁금한 점이 있다면 댓글로 남겨주세요!
모든 개발은 소스에서부터 시작합니다. 경건한 마음으로 git clone을 해줍시다.
레포 링크
git clone https://github.com/OpenZeppelin/ethernaut
'README.md'를 살펴보니 nvm과 yarn을 사용하네요? 두 개 모두 설치합시다.
nvm --version
으로 설치 확인! 없다면 설치합시다.brew install nvm
을 수행하면 설치 후 다음을 보게 됩니다.mkdir ~/.nvm
echo 'export NVM_DIR="$HOME/.nvm"\n[ -s "/opt/homebrew/opt/nvm/nvm.sh" ] && . "/opt/homebrew/opt/nvm/nvm.sh" # This loads nvm\n[ -s "/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm" ] && . "/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm" # This loads nvm bash_completion' >> ~/.zshrc```
source ~/.zshrc
로 변경 사항 적용nvm --version
으로 설치 확인!node --version
과 yarn --version
으로 설치 확인! 역시나 없다면 설치합시다.
<토막 지식>
yarn
은 패키지 매니저의 한 종류로서, 워크스페이스 기능을 활용하여 여러 프로젝트를 하나의 저장소에서 쉽게 관리할 수 있습니다. 이를monolithic repository
, 줄여서mono-repo
라 부릅니다. 하지만 저는pnpm
을 더 좋아합니다.
yarn
은 node
에 대한 의존성이 있습니다. 따라서, node
를 설치한 적이 없다면, brew install node && brew install yarn
으로 설치해줍니다. macOS 편의성 절반은 homebrew 덕분이라고 하더라도 과언이 아니라 생각합니다.
node --version
과 yarn --version
으로 설치를 확인합니다.
⚠️ 2024/08/01 Ethernaut 수정을 기점으로 다시 테스트를 해보았는데, 일단 프로젝트 폴더를 Native Windows에 설치하면 경로 오류가 발생해서 시도를 중단했습니다. macOS 환경 또는 Native Linux 환경에서 진행하시길 권장드리고, Windows는 wsl2 환경에 직접 설치한 상태에서 작업하시면 됩니다.
nvm
은 프로젝트 내 .nvmrc
파일에 적힌 버전에 대해 자동적인 버전 호환을 진행합니다. 16.20.1
이군요! nvm install
을 실행해주면 해당 버전의 노드가 다운로드됩니다.노드 버전이 변경되었겠죠? node --verison
으로 확인해봅시다. 22.4.1
에서 16.20.1
로 바뀌었네요! 성공입니다. 만약 변경되지 않았다면, nvm use v16.20.1
명령을 실행하면 됩니다.
이제 yarn install
을 사용해서 의존 패키지를 설치해줍시다.
foundry
사용에 익숙하신 분들은 그냥anvil
명령 대신yarn network
를 사용하도록 유의해주세요!
README.md
에서는 다음 단계로 yarn network
를 실행할 것을 제안하고 있어요. 한 번 package.json
에서 해당 명령이 어떤 스크립트로 구성되어 있는지 살펴볼까요?"network": "cd contracts && anvil --block-time 1 --auto-impersonate",
anvil
을 사용하고 있군요? Foundry
는 개발 단계에서 사용하는 스마트 컨트랙트 툴체인이에요. 손쉽게 본인만의 테스트넷을 구축할 수 있죠. anvil
은 그 구성요소니까 저걸 설치하면 되겠네요.curl -L https://foundry.paradigm.xyz | bash
로 설치하라고 합니다. 실행!
간혹 터미널 세션을 초기화해야 하는 경우들이 있죠! 설치 과정에서 나온 명령source /Users/mia/.zshenv
를 실행하거나, 터미널을 재시작해줍시다.
이후 foundryup
명령을 실행하면 설치 완료입니다.
anvil --version
을 통해 확인해볼까요? 잘 설치됐네요!
이제 슬슬 막바지에 다다르고 있습니다. yarn network
를 통해 local faucet의 EOA 주소와 private key를 얻을 수 있습니다. 명령을 실행해서 임의의 Private Key 하나를 복사해두세요!
노드가 열심히 작업 중이니 내버려두고, 새로운 터미널을 실행시켜서 작업을 이어갑시다.
README.md
를 읽어보면, 이제 명령어를 실행할 일만 남았습니다!yarn compile:contracts
실행...어라?
Windows에서는 발생하지 않았던 오류를 마주했어요.
찾아보니 이는 macOS에서 solc (Solidity 컴파일러)의 특정 버전이 현재 사용 중인 CPU 아키텍처를 지원하지 않을 때 발생한다고 합니다. 특히 Apple Silicon 칩을 사용하는 최신 Mac 컴퓨터에서 x86_64 아키텍처용으로 컴파일된 바이너리를 실행하려고 할 때 발생한다고 하네요!
당황하지 말고/usr/sbin/softwareupdate --install-rosetta --agree-to-license
를 통해 Rosetta 2를 설치해줍시다!
Support Tip: Install Rosetta 2 on new Apple Silicon (M1) Macs to run apps built for Intel Macs
client/src/constants.js:204
로 이동해서 주석을 해제해주자!yarn deploy:contracts
실행! 나오는 입력에 y를 입력해서 배포를 승인해줍시다 yarn start:ethernaut
실행! 이로써http://localhost:3000
으로 접속할 수 있게 됐어요yarn network
로 anvil을 가동했을 때를 기억하시나요? 거기서 나온 faucet 계정을 Metamask를 활용해서 import 해봅시다!Private key 잘 복사해두었나요? 실행한지 오래돼서 터미널 로그에서 볼 수 없다면 ctrl + c로 인터럽트하여 다시 실행해도 괜찮습니다.
저는 0번 계좌를 사용하기로 했어요
#### Available Accounts
==================
(0) 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 (10000.000000000000000000 ETH)
#### Private Keys
==================
(0) 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80
Metamask를 실행하고, 기존 생성해 둔 계정으로 연결합니다.
화살표를 클릭하고
add account
를 누르고 ![]
계정 가져오기
를 누르고,
복사해 둔 Private key를 붙여넣습니다
hardhat
을 사용한 적 있다면 호환되겠지만, 이 기기에서는 사용한 적이 없기 때문에 직접 추가하겠습니다.이전
yarn network
결과를 활용해서 빈 칸을 채워넣으면 됩니다!Chain ID ================== 31337 v ... Listening on 127.0.0.1:8545
이렇게 작성하면 되겠네요!
10000 GO를 가진 계정을 가져왔고
프론트로 들어가 계정을 연결하고
첫 번째 예제를 따라 Console에서 명령을 실행하여 살펴보면, 기존에 사용 중인 계정이 연결되어 잔액이 0임을 알 수 있어요.
player
await getBalance(player)
송금 완료!
내부에서 확인해보면 정상적으로 반영되었음을 알 수 있습니다 ^-^
제길 다 날아갔어 내 3시간.. 정성스럽게 사진도 넣고 드립도 쳤는데..
이런 이슈가 발생할 뻔 했지만, 다행히 로컬에 결과물을 띄워두고 있었어서 텍스트를 살릴 수 있었다ㅜㅜ 아무튼 다행...
문제를 풀어보신 분들께서 도중에 오류가 발생한다고 말씀하신 것 같아서, 이걸로 충분한가 싶긴 하지만 우선 계정에 잔고 채우는 건 완료했다! 시간날 때마다 문제를 풀어보면서 또 다른 이슈가 발생하면 또 트러블 슈팅을 진행하도록 하겠따!
client/src/gamedata/deploy.local.json
의 ethernaut
주소를 x로 변경하고
그 상태에서 다시 yarn deploy:contract
를 수행해서 결과적으로 이더넛 주소를 재할당 받아보세요
기본적으로 nvm을 통해 node 버전에 맞게 패키지 설치했는지 확인해주시고, anvil은 반드시 yarn network 명령어를 통해 구동해주세요!
감사합니다!! 도움이 많이 됐어요