> ## Documentation Index
> Fetch the complete documentation index at: https://docs.optimism.io/llms.txt
> Use this file to discover all available pages before exploring further.

# OP Sepolia에 컨트랙트 배포하기

> Foundry를 사용하여 OP Stack 체인에 첫 번째 스마트 컨트랙트를 배포하고 상호작용합니다.

이 튜토리얼에서는 OP Stack 체인에 첫 번째 스마트 컨트랙트(smart contract)를 처음부터 배포하는 과정을 안내합니다.
[Foundry](https://getfoundry.sh/)를 사용하여 작은 `Greeter` 컨트랙트를 OP Sepolia testnet에 배포한 다음, 명령줄에서 컨트랙트를 읽고 쓰는 방법을 알아봅니다.

OP Stack 체인은 [EVM 동등성(EVM equivalence)](https://docs.optimism.io/ko/op-stack/protocol/differences.md)을 갖추고 있으므로, 여기서 사용하는 워크플로는 Ethereum에서 사용하는 워크플로와 동일합니다. OP 고유의 세부 사항은 연결 대상인 RPC 엔드포인트와 체인 ID뿐입니다.
이 튜토리얼을 마치면 OP Sepolia에 실제로 동작하는 컨트랙트를 갖게 되며, 이후 배포하는 모든 컨트랙트와 상호작용하는 데 사용할 수 있는 명령어도 익히게 됩니다.

> [!NOTE]
>
> 이 튜토리얼은 OP Sepolia testnet을 사용하므로 실제 자금이 소모되지 않습니다.
> 동일한 단계는 모든 OP Stack 체인에서 작동합니다. 해당 체인의 RPC URL로 바꾸고 해당 네트워크에서 계정에 자금을 충전하면 됩니다.

## 의존성

* [Foundry](https://book.getfoundry.sh/getting-started/installation) — 아래 첫 번째 단계에서 설치합니다.
* `curl`을 사용할 수 있는 터미널(macOS 및 대부분의 Linux 배포판에 기본 설치되어 있습니다).

## Foundry 설치하기

Foundry는 Ethereum 개발을 위한 툴킷입니다.
이 튜토리얼에서는 Foundry의 명령줄 도구 중 두 가지를 사용합니다. `forge`(컴파일 및 배포용)와 `cast`(트랜잭션 전송 및 상태 조회용)입니다.

**1. foundryup 설치하기**

```bash theme={null}
curl -L https://foundry.paradigm.xyz | bash
```

이 명령은 Foundry의 버전 관리자인 `foundryup`을 설치합니다.
화면의 안내에 따라 `PATH`에 추가하십시오(새 터미널을 열어야 할 수도 있습니다).

**2. Foundry 툴체인 설치하기**

```bash theme={null}
foundryup
```

### 설치 확인하기

`forge`와 `cast`를 사용할 수 있는지 확인합니다.

```bash theme={null}
forge --version
cast --version
```

각 명령은 버전 문자열을 출력해야 합니다.
명령을 찾을 수 없다면 `foundryup`의 `PATH` 안내를 다시 확인하고 새 터미널을 여십시오.

## 프로젝트 및 컨트랙트 생성하기

**1. Foundry 프로젝트 초기화하기**

```bash theme={null}
mkdir first-contract
cd first-contract
forge init
```

`forge init`은 `src/`, `test/`, `script/` 디렉터리가 포함된 새 프로젝트의 기본 구조를 생성합니다.

**2. Greeter 컨트랙트 추가하기**

`src/Greeter.sol`의 내용을 다음으로 바꿉니다.
이 컨트랙트는 [Hardhat의 Greeter 컨트랙트](https://github.com/matter-labs/hardhat-zksync/blob/main/examples/upgradable-example/contracts/Greeter.sol)를 변형한 것입니다. 인사말 문자열을 저장하고, `greet()`를 통해 이를 노출하며, 누구나 `setGreeting()`을 통해 인사말을 업데이트할 수 있습니다.

```solidity theme={null}
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Greeter {
    string greeting;

    event SetGreeting(
        address indexed sender,     // msg.sender
        string greeting
    );

    function greet() public view returns (string memory) {
        return greeting;
    }

    function setGreeting(string memory _greeting) public {
        greeting = _greeting;
        emit SetGreeting(msg.sender, _greeting);
    }
}
```

**3. 컨트랙트 컴파일하기**

```bash theme={null}
forge build
```

### 빌드 확인하기

`forge build`는 컴파일 성공을 보고하고 아티팩트를 `out/` 디렉터리에 기록해야 합니다.
컴파일에 실패하면 `src/Greeter.sol`이 위 코드와 정확히 일치하는지 확인하십시오.

## OP Sepolia 및 계정 구성하기

배포하려면 두 가지가 필요합니다. OP Sepolia용 RPC 엔드포인트와 배포 트랜잭션에 서명할 개인 키입니다.

**1. 배포용 계정 생성하기**

실제 자금이 있는 키를 재사용하지 말고 이 튜토리얼을 위한 새 키를 생성하십시오.

```bash theme={null}
cast wallet new
```

이 명령은 `Address`와 `Private key`를 출력합니다.
두 값을 모두 안전한 곳에 저장하십시오.

**2. 환경 변수 설정하기**

OP Sepolia RPC URL과 방금 생성한 개인 키를 export합니다.
이 변수들은 튜토리얼의 나머지 부분에서 `forge` 및 `cast` 명령이 읽어 들입니다.

```bash theme={null}
export L2_RPC_URL=https://sepolia.optimism.io
export PRIVATE_KEY=0x...your-private-key...
export ACCOUNT_ADDRESS=$(cast wallet address --private-key $PRIVATE_KEY)
```

> [!NOTE]
>
> `https://sepolia.optimism.io`는 개발 및 테스트에 적합한, 속도 제한이 적용된 공개 엔드포인트입니다.
> 전체 엔드포인트 목록과 프로덕션 제공업체는 [OP Stack RPC 디렉터리](https://docs.optimism.io/ko/app-developers/reference/rpc-providers.md)를 참조하십시오.
> OP Sepolia의 체인 ID(`11155420`) 및 기타 네트워크 파라미터는 [OP Mainnet에 연결하기](https://docs.optimism.io/ko/op-mainnet/network-information/connecting-to-op.md#op-sepolia)를 참조하십시오.

## 계정에 자금 충전하기

컨트랙트를 배포하려면 gas 비용이 들기 때문에 계정에 OP Sepolia의 testnet ETH가 필요합니다.

**1. testnet ETH 요청하기**

[Superchain Faucet](https://console.optimism.io/faucet?utm_source=op-docs\&utm_medium=docs)을 사용하여 `ACCOUNT_ADDRESS`로 OP Sepolia ETH를 보냅니다.

### 잔액 확인하기

배포하기 전에 faucet 자금이 도착했는지 확인합니다.

```bash theme={null}
cast balance --ether $ACCOUNT_ADDRESS --rpc-url $L2_RPC_URL
```

이 명령은 잔액을 ETH 단위로 출력합니다.
계속 진행하기 전에 잔액이 `0`보다 커질 때까지 기다리십시오.

## 컨트랙트 배포하기

`Greeter`를 OP Sepolia에 배포하고 생성된 컨트랙트 주소를 저장합니다.

```bash theme={null}
CONTRACT_ADDRESS=$(forge create \
  --rpc-url $L2_RPC_URL \
  --private-key $PRIVATE_KEY \
  Greeter \
  --broadcast \
  | awk '/Deployed to:/ {print $3}')

echo "Deployed to: $CONTRACT_ADDRESS"
```

`forge create` 명령은 (필요한 경우) 컴파일하고, 배포 트랜잭션에 서명한 뒤 브로드캐스트합니다.
출력에는 `Deployed to:` 줄이 포함되며, `awk` 명령이 해당 주소를 `CONTRACT_ADDRESS` 변수로 추출하므로 다음 단계에서 재사용할 수 있습니다.

> [!NOTE]
>
> 전체 출력(배포자 주소, 새 컨트랙트 주소, 트랜잭션 해시)을 보려면 `awk` 파이프 없이 `forge create`만 단독으로 실행하십시오.

### 배포 확인하기

컨트랙트의 바이트코드를 가져와 컨트랙트가 온체인에 존재하는지 확인합니다.

```bash theme={null}
cast code $CONTRACT_ADDRESS --rpc-url $L2_RPC_URL
```

배포된 컨트랙트는 긴 16진수 문자열을 반환합니다.
`0x`가 반환되면 배포가 반영되지 않은 것이므로, 잔액을 다시 확인하고 배포 단계를 다시 실행하십시오.

## 컨트랙트와 상호작용하기

이제 `cast`를 사용하여 실제 컨트랙트를 읽고 씁니다.

**1. 초기 인사말 읽기**

```bash theme={null}
cast call --rpc-url $L2_RPC_URL $CONTRACT_ADDRESS "greet()" | cast --to-ascii
```

인사말은 처음에 비어 있으므로 빈 문자열이 반환됩니다.

**2. 새 인사말 설정하기**

다음 명령은 `setGreeting()`을 호출하는 트랜잭션을 전송합니다.

```bash theme={null}
cast send \
  --private-key $PRIVATE_KEY \
  --rpc-url $L2_RPC_URL \
  $CONTRACT_ADDRESS \
  "setGreeting(string)" "Hello from OP Sepolia"
```

**3. 인사말 다시 읽기**

```bash theme={null}
cast call --rpc-url $L2_RPC_URL $CONTRACT_ADDRESS "greet()" | cast --to-ascii
```

이제 `Hello from OP Sepolia`가 반환되며, 쓰기 작업이 온체인에 반영되었음을 확인할 수 있습니다.

## 블록 탐색기에서 컨트랙트 확인하기

[OP Sepolia 블록 탐색기](https://docs.optimism.io/ko/app-developers/tools-sdks/block-explorers.md)를 열고 `CONTRACT_ADDRESS`를 검색하면 배포 트랜잭션과 방금 보낸 `setGreeting` 호출을 확인할 수 있습니다.
탐색기에 컨트랙트의 소스 코드를 게시(검증)하는 것은 선택 사항이지만 권장됩니다. 그러면 누구나 탐색기 UI에서 컨트랙트를 읽고 상호작용할 수 있기 때문입니다.

## 다음 단계

* [OP Stack 체인에서 앱 빌드하기](https://docs.optimism.io/ko/app-developers/guides/building-apps.md)에서 더 폭넓은 규칙을 알아보십시오.
* [Ethereum과 OP Stack 체인의 차이점](https://docs.optimism.io/ko/op-stack/protocol/differences.md)을 이해하십시오.
* 다음으로 [ERC-20 토큰 브리징](https://docs.optimism.io/ko/app-developers/tutorials/bridging/cross-dom-bridge-erc20.md)과 같은 크로스체인 튜토리얼을 시도해 보십시오.

> [!NOTE]
>
> **프로덕션 환경에서 앱 운영하기**
>
> 프로덕션 애플리케이션은 여러분의 팀이 직접 운영하지 않는 인프라에 의존합니다. 실제 트래픽을 견딜 수 있는 RPC 엔드포인트(공개 엔드포인트는 속도 제한이 있으며 프로덕션용으로 만들어지지 않았습니다), 사용자가 의존하는 bridge, 그리고 운영자가 sequencing, 업그레이드, 장애 대응을 24시간 지속하는 체인이 그것입니다. 이 문서는 빌드와 테스트를 다룹니다. 애플리케이션이 성장하여 자체 전용 블록스페이스가 필요해지고 있다면, [OP Enterprise](https://optimism.io/op-enterprise?utm_source=docs\&utm_medium=docs\&utm_campaign=op-enterprise)는 체인 운영을 위한 관리형 및 지원형 방식을 제공합니다. 어느 경우든 이 문서는 여러분이 빌드하는 것에 대한 레퍼런스로 남습니다. OP Enterprise는 Optimism의 관리형 서비스입니다.
