본문으로 건너뛰기
0%

zkSync 개발 시작하는 방법 (2025)

Petar Todorov headshot

작성자 Petar Todorov

2023년 5월 5일에 게시됨4분 읽기

Matter Labs는 이제 Scroll, Polygon과 함께 세계 최초의 zero-knowledge EVM을 운영하는 경쟁에 뛰어든 대표 주자를 보유하게 되었다 – zkSync Era.

2023년 3월 출시된 zkSync Era는 zero-knowledge proofs를 활용해 Ethereum 네트워크의 속도와 처리 능력을 확장하는 EVM 호환 ZK Rollup이다.

zkSync에서 개발하면 ETH와 ERC20 tokens에 대한 낮은 가스비, 그리고 atomic swaps, limit orders, 네이티브 Layer-2 NFT 지원 등의 이점을 얻을 수 있다.

이 글에서는 zkSync Era가 무엇인지, 그리고 zkSync 퍼블릭 테스트넷에 스마트 컨트랙트를 다섯 단계로 배포하는 방법을 설명한다.

zkSync era란 무엇인가?

zkSync Era는 Matter Labs의 새로운 Layer-2 솔루션으로, ZK-Proofs와 Ethereum Virtual Machine 기술을 결합해 Ethereum 메인넷의 처리량을 확장한다. 두 기술을 병합함으로써 zkSync Era는 더 빠르고 안전한 Ethereum 트랜잭션을 가능하게 한다.

완전한 EVM 동등성에 더해, Era는 EIP-4337에서 처음 제안된 account abstraction 개념을 Ethereum 스택에 도입한다.

account abstraction을 사용하면 지갑이 스마트 컨트랙트가 되어 커스텀 서명 알고리즘, 스폰서 트랜잭션, 2단계 인증 같은 기능을 가질 수 있다.

zkSync era 개발을 시작하는 방법

zkSync Era에서의 개발은 대부분 web3 개발자가 Ethereum에 컨트랙트를 배포할 때 사용하는 것과 동일한 도구를 사용한다. 이 튜토리얼에서는 zkSync 퍼블릭 테스트넷에 스마트 컨트랙트를 배포하는 방법을 다룬다.

사전 준비 사항

이 튜토리얼을 진행하려면 다음이 필요하다:

  • Ethereum 지갑의 개인 키
  • 테스트 ether
  • 필요한 플러그인이 설치된 Hardhat Integrated Development Environment (IDE)
  • 패키지 매니저 (NPM 또는 Yarn)
  • VScode
  • Typescript에 대한 기본적인 이해

1. zkSync era용 IDE 설정

먼저 프로젝트용 폴더를 생성한다.

VScode(또는 기기의 터미널)를 열고 다음을 입력한다:

그다음, 다음 명령어로 npm을 초기화한다: npm init -y

-y 플래그는 package.json 파일의 모든 입력 필드를 기본값으로 미리 채워 시간을 절약한다.

npm과 프로젝트 폴더가 모두 설정되었으니, 이제 필요한 dependency를 설치한다.‍

VScode 터미널에서 다음을 입력한다:

명령어 설명:

  • $ npm i -D: install 명령어의 별칭. -D 플래그는 모든 패키지를 개발자 dependency로 저장한다.
  • $ typescript ts-node: Typescript와 Node.js용 Typescript 실행 엔진 설치.
  • $ ethers@^5.7.2 zksync-web3@^0.13.1: 컨트랙트 배포 및 상호작용을 돕는 두 개의 라이브러리.
  • $ hardhat: 사용 중인 IDE.
  • $ @matterlabs/hardhat-zksync-solc @matterlabs/hardhat-zksync-deploy: 스마트 컨트랙트 컴파일 및 배포를 돕는 두 개의 Hardhat 플러그인.

다음은 Hardhat 프로젝트 초기화이다.‍

터미널에서 다음을 입력한다:

npx hardhat init

'Create a TypeScript Project'를 선택하고 엔터를 눌러 다음 필드들을 기본값으로 미리 채운다.

프로젝트 폴더 구조는 다음과 같아야 한다:

contracts 폴더에서 기본적으로 자동 생성되는 Lock.sol 컨트랙트는 필요하지 않으므로 삭제한다.‍

IDE 설정의 마지막 단계는 hardhat.config.ts 파일로 이동하는 것이다.

hardhat.config.ts 파일은 배포를 위한 다음 파라미터들을 정의하는 '커맨드 센터'이다:

  • zkSync 컴파일러 버전
  • 컨트랙트가 배포될 체인
  • 컨트랙트를 작성할 Solidity 컴파일러의 버전.

hardhat.config.ts 파일의 내용을 삭제하고 다음으로 교체한다:

이제 IDE 설정이 완료되었으며, 다음 단계는 스마트 컨트랙트를 생성하는 것이다.

2. 스마트 컨트랙트 생성

사람의 이름과 나이를 등록할 컨트랙트이다.

프로젝트 디렉토리의 contacts 폴더로 이동해 Registry.sol이라는 새 파일을 생성한다.‍

그다음, 다음의 스마트 컨트랙트 코드를 파일에 복사해 붙여넣는다:

배포 전에 컨트랙트를 컴파일해야 한다. 터미널에서 다음을 입력한다:

npx hardhat compile

3. zkSync era용 지갑 설정

zkSync Era는 기존 Ethereum 지갑을 지원하므로 새 지갑을 생성할 필요는 없다.

따라서 Metamask 같은 기존 지갑을 사용할 수 있다.

참고: 배포 절차에서는 개인 키를 내보내야 하므로, 투자금이나 저축이 보관된 개인 Ethereum 지갑을 사용하는 것은 권장하지 않는다.

4. 테스트 Goerli ETH 받고 zkSync era로 브릿지하기

컨트랙트를 배포하려면 zkSync Era 테스트넷의 테스트 ether가 필요할 수 있다.

테스트 ether를 받으려면 배포자 지갑에서 zkSync Era 상의 인스턴스로 Goerli ETH를 브릿지한다.

  • 이를 위해 Alchemy의 Goerli faucet으로 이동해 Goerli 테스트넷의 ether를 받는다.

  • 진행하기 전에 무료 Alchemy 계정을 생성한다.

  • 그다음 Metamask를 열고 지갑 주소를 클릭해 복사한다.

  • Goerli faucet 웹사이트에서 지갑 주소를 붙여넣고 Send Me ETH를 클릭한다.

다음으로, zkSync Era의 bridge로 이동한다.

"Connect via a browser wallet Metamask"를 클릭한다.

컨트랙트 배포에 사용할 지갑을 선택한다.

MAX를 클릭하거나(원하는 금액을 입력해도 되지만, 최소 0.1 gETH 이상이어야 함) Deposit을 클릭한다.

참고: 우측 하단 필드에 **"zkSync Era Goerli"**라고 표시되는지 확인한다.

브릿지가 완료되기를 기다리는 동안, 배포 스크립트를 작성해 배포를 마무리한다.

5. 배포 스크립트 생성 및 개인 키 내보내기

다음으로, 배포 스크립트를 생성하고 Metamask에서 개인 키를 내보내 Private Key를 복사한 후 스마트 컨트랙트를 배포한다.

방법은 다음과 같다:

배포 스크립트 생성

VSCode로 돌아가서 scripts 폴더의 이름을 deploy로 변경하고, 그 안에 deploy.ts라는 파일을 생성한다.

그다음, 다음 코드를 파일에 복사한다:

"//"로 표시된 주석은 코드의 로직을 설명한다.

MetaMask에서 개인 키 내보내기

Metamask에서 브릿지에 사용했던 지갑을 열고 개인 키를 내보낸다.

세로 점 세 개를 클릭한 다음 Account details, 그다음 Export private key를 클릭한다.

비밀번호를 입력하고 표시된 문자열을 복사한다.

개인 키 붙여넣고 스마트 컨트랙트 배포

deploy.ts 파일로 돌아가 다음 줄을 찾는다:

** const wallet = new Wallet("<WALLET-PRIVATE-KEY>");**

<WALLET-PRIVATE-KEY> 자리에 개인 키를 붙여넣는다.

큰따옴표가 삭제되지 않도록 주의한다.

마지막으로 VScode의 터미널로 이동해 다음을 입력한다: npx hardhat deploy-zksync

6. 블록 탐색기를 통한 스마트 컨트랙트 검증

zkSync Era의 테스트넷 블록 탐색기를 사용해 배포된 컨트랙트를 검증한다.

블록 탐색기로 이동한다. 검색창에 배포된 컨트랙트의 주소를 붙여넣는다.

컨트랙트를 찾으면 Contract 탭을 클릭한 다음 Verify Smart Contract를 클릭한다.

그다음, 필요한 세부 정보를 입력한다:

Contract Name은 **"Registry"**여야 한다.

Zksolc version - v1.3.

Solc version - 0.8.17.

Zksolc VersionSolc Version 모두 hardhat.config.ts 파일에서 확인할 수 있다.

Enter the Solidity Contract Code 필드에 Registry.sol 파일의 내용을 붙여넣는다.

Verify Smart Contract를 클릭해 과정을 마무리한다.

7. ZkSync Era에 배포된 컨트랙트와 상호작용하기

블록 탐색기에서 다시 주소로 컨트랙트를 찾아 Contract 탭을 클릭한다.

이번에는 블록 탐색기에 두 개의 새 필드가 표시되어야 한다:

  1. getter 함수를 위한 Read
  2. setter 함수를 위한 Write

personInfo 매핑의 가시성이 _public_으로 정의되어 있으므로, 이에 대한 getter 메서드가 자동으로 생성된다.

배포자 지갑이 탐색기에 연결되어 있는지 확인한다. addPerson을 클릭한다.

섹션이 확장되고 두 개의 새 필드가 나타난다 - 하나는 사람의 이름을 정의하고, 다른 하나는 나이를 정의한다.‍

입력을 마친 후 Write를 클릭하고 트랜잭션을 확인한다.

트랜잭션이 확인된 후, personInfo를 클릭하고 방금 추가한 사람의 이름을 입력한다.

GUI는 추가된 사람의 나이를 반환해야 한다.‍

Background gradient

블록체인 매직을 만드세요

Alchemy는 가장 강력한 Web3 개발자 제품 및 도구를 리소스, 커뮤니티, 그리고 전설적인 지원과 결합합니다.