Overview
3 - 스마트 컨트랙트 개발 환경 셋업
Overview 2 - DApp 개발 환경 셋업Overview DApp 만들기: 기본 개발 환경 셋업Overview DApp은 어떻게 만들 수 있을까요?OverviewDApp은 기존 Web 2.0의 중앙 집중식 구조에서 벗어나, 블록체인 기반의 탈중앙화
spems.tistory.com
이전 시간에는 DApp의 핵심이 되는 스마트 컨트랙트를 빌드하고 배포하기 위한 준비 작업을 진행했습니다. 이번 시간에는 스마트 컨트랙트를 작성하고, 빌드하고, 배포하는 작업을 이해해보겠습니다. 우리가 이번 포스트에서 다룰 내용은 빨간 테두리로 표시하였으니 참고하세요!

스마트 컨트랙트 작성

- SPDX-License-Identifier는 코드의 라이선스를 의미합니다.
- 이후 pragma solidity로 Solidity 컴파일러 버전을 지정합니다. 이 코드는 정확히 solc 0.8.28 버전에서 컴파일되어야 합니다만, semver 버저닝을 사용하여 호환 규칙을 정의할 수 있습니다.
- contract는 class와 비슷하게 캡슐화된 형태로 함수와 변수를 포함하게 됩니다. 여기서는 HelloWorld라는 이름의 스마트 계약이 정의되어 있네요니다.
- 이후 function 키워드를 시작으로 getName이라는 이름의 함수를 정의합니다. public으로 선언되어 있어 외부 및 내부에서 호출할 수 있으며, pure로 선언되어 있어 블록체인의 상태를 읽거나 변경하지 않습니다. 또한 메모리 위치에서 문자열 "World"를 반환합니다.
스마트 컨트랙트 빌드 및 배포

- !/bin/sh는 스크립트가 sh 셸에서 실행되어야 함을 명시합니다.
- export 명령을 통해 9번째 Anvil 관리자 계정의 개인 키를 환경 변수 PRIVATE_KEY에 설정합니다.
개인 키가 있어야만 계정 권한이 필요한 작업 - 예를 들어, 스마트 컨트랙트 배포 작업을 진행할 수 있습니다.
또한, 일정 수준 이상의 자산이 있어야만 - 다음 export TARGET 명령을 통해 배포된 스마트 컨트랙트의 주소를 TARGET에 저장합니다.
- forge create 명령은 스마트 컨트랙트 배포를 위한 foundry 도구 forge의 하위 명령어입니다.
어떤 파일에서 어떤 컨트랙트를 배포할 지 명시해야 하고, 이 부분은 find src 명령과 콜론 :으로 전달합니다. - -r localhost:8545로 로컬에 실행 중인 Anvil의 RPC URL을 전달합니다.
- --private-key $PRIVATE_KEY로 배포에 사용할 개인 키를 지정합니다.
이를 통해 9번째 Anvil 관리자 계정이 스마트 컨트랙트를 배포하게 됩니다. - --broadcast는 배포 트랜잭션을 브로드캐스트합니다.
이 옵션을 사용하지 않으면 빌드 후 어떻게 전파될 것인지 정보가 로컬에 저장된 상태로 명령이 종료됩니다. 배포를 확정한 상황에서 이를 네트워크의 다른 노드로 전파하기 위해 사용됩니다. 로컬에는 메타 데이터와 컨트랙트의 바이트 코드가 저장됩니다. 기회가 되면 좀 더 자세히 다루도록 하겠습니다. - grep과 sed 명령어는 배포된 계약의 주소를 추출하여 TARGET 변수에 저장합니다.
- forge create 명령은 스마트 컨트랙트 배포를 위한 foundry 도구 forge의 하위 명령어입니다.
++ 스마트 컨트랙트 함수 호출

다음 DEBUG 주석이 붙은 부분은 빌드와는 관련이 없고, foundry 도구 cast의 명령을 활용하여 배포된 계약의 getName 함수를 호출하는 확인용 명령입니다. \x1b[32m과 \x1b[0m는 출력 텍스트를 녹색으로 설정하고, 이후 기본 색상으로 되돌립니다. cast call $TARGET "getName()(string)"는 TARGET 주소의 계약에서 getName 함수를 호출합니다. 뒤에 따라오는 (string)은 해당 함수의 결과을 string 형태로 반환하도록 만듭니다. 아래 로그를 확인해보면 정상적으로 "World"가 반환되는 것을 확인할 수 있습니다.
빌드 스크립트를 실행했을 때, 터미널에 출력되는 로그는 아래와 같습니다. 이를 통해 TARGET 변수에는 0x700b6A60ce7EaaEA56F065753d8dcB9653dbAD35 값이 저장될 것이라고 예상할 수 있습니다.
0x와 같은 표현은 16진수를 표현할 때 사용하는 접두사입니다. 우리가 일상에서 10을 기준으로 자리수를 늘려 사용하는 십진수와 같은 원리로, 16진수는 0~9 그리고 A(10)부터 F(15)를 사용해서 16을 기준으로 자리수를 늘리는 수 체계입니다. 이러한 수 체계는 비트를 최소 저장 단위로 사용하는 컴퓨터 체계에서, 애매한 10진수보다 정확히 4비트씩 나누어 수를 저장할 수 있다는 장점이 있습니다. 참고로 3비트씩 끊어 접두사 0을 붙이고 8진수로 취급하기도 합니다.
❯ npm run start
> prestart
> anvil --allow-origin 'http://localhost:3000' & npm run build
_ _
(_) | |
__ _ _ __ __ __ _ | |
/ _` | | '_ \ \ \ / / | | | |
| (_| | | | | | \ V / | | | |
\__,_| |_| |_| \_/ |_| |_|
0.3.0 (5a8bd89 2024-12-20T08:45:53.195623000Z)
https://github.com/foundry-rs/foundry
Available Accounts
==================
...
(9) 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 (10000.000000000000000000 ETH)
Private Keys
==================
...
(9) 0x2a871d0798f97d79848a013d4936a73bf4cc922c825d33c1cf7073dff6d409c6
...
Listening on 127.0.0.1:8545
> build
> sh src/sol/build.sh
eth_chainId
eth_getTransactionCount
eth_estimateGas
eth_feeHistory
eth_sendRawTransaction
eth_blockNumber
Transaction: 0x06127d6cd32b232f5ccbdf4a582a4e20c396e04b34a3b581d0857852a72e9a74
Contract created: 0x700b6A60ce7EaaEA56F065753d8dcB9653dbAD35
Gas used: 95617
Block Number: 1
Block Hash: 0x693eb072e1524e938dcdf12aff517690e691f75bbd39a4643ba9040a31297820
Block Time: "Mon, 10 Feb 2025 12:26:44 +0000"
eth_getBlockByNumber
eth_getTransactionReceipt
eth_getTransactionReceipt
eth_chainId
eth_getTransactionCount
eth_call
"World"
> start
> node src/node/index.js
Server is running on http://localhost:3000
마치며
지금까지 스마트 컨트랙트를 작성하고, 빌드 및 배포하고, 함수를 호출해보는 과정을 간단히 다루었습니다! 여기서 알고 있어야 하는 점은 DApp의 본질은 체인과 스마트 컨트랙트와의 상호 작용에 의존적이지만, 그 빌드 및 배포 과정이 굳이 웹 애플리케이션과 동기적으로 이루어질 필요는 없다는 것입니다. 즉, 이미 배포된 컨트랙트를 활용하는 것도 가능합니다.
다음 시간에는 웹 애플리케이션에서의 스마트 컨트랙트 함수 호출에 대해 다룰 것입니다. 이번에 다루었던 cast call 명령은 foundry 도구를 활용한 것인데, 이러한 도구나 라이브러리 없이도 본질적으로 규악에 맞는 통신을 수행하여 얼마든지 함수를 호출할 수 있음을 알 수 있게 될 것입니다. 그럼 다음 포스트로 만나요~ ☺️
'Learn > UPSIDE' 카테고리의 다른 글
6 - Foundry 기반 프로젝트 (0) | 2025.02.21 |
---|---|
5 - 스마트 컨트랙트 함수 호출 (0) | 2025.02.18 |
3 - 스마트 컨트랙트 개발 환경 셋업 (4) | 2025.02.10 |
2 - DApp 개발 환경 셋업 (1) | 2025.02.09 |
1 - 기본 개발 환경 셋업 (0) | 2025.02.05 |