메인 콘텐츠로 건너뛰기
이 튜토리얼에서는 Stable 테스트넷에 간단한 스마트 컨트랙트를 배포하고 체인에서 상태를 읽어옵니다. 이 과정에서 Stable 네트워크 구성 방식, USDT0이 가스 토큰으로 작동하는 방식, 표준 EVM 도구를 Stable에 연결하는 방법을 배웁니다. Solidity와 Unix 계열 터미널에 대한 기본 지식이 있다고 가정합니다. Stable 사용 경험은 필요하지 않습니다.

사전 요구사항

  • Foundry 설치 (forge, cast, anvil이 PATH에서 사용 가능해야 함)
  • 개인 키를 소유한 지갑 (새 테스트 키도 괜찮습니다 — 실제 자금이 있는 키는 절대 테스트넷에서 사용하지 마세요)
  • 테스트넷 RPC 및 수도꼭지에 접근할 수 있는 인터넷 연결

1. 새 Foundry 프로젝트 생성

다음 명령어로 새 프로젝트를 생성합니다:
forge init stable-hello && cd stable-hello
Foundry는 src/ 디렉토리에 샘플 Counter.sol 컨트랙트와 테스트 파일을 생성합니다. 이 컨트랙트를 그대로 배포합니다 — 목표는 새 Solidity 코드를 작성하는 것이 아니라 실제로 체인에 올리는 것입니다.

2. 배포할 컨트랙트 확인

src/Counter.sol을 열어보세요. 두 개의 함수가 있습니다:
// 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++;
    }
}
number는 체인에 저장되는 공개 상태 변수입니다. increment()setNumber()는 이를 변경하는 두 가지 방법입니다. number를 읽는 것은 가스가 들지 않습니다 — 무료 eth_call입니다.

3. Stable 테스트넷 구성

프로젝트 루트에 네트워크 자격증명을 저장할 .env 파일을 생성합니다:
touch .env
다음 내용을 추가하고, 플레이스홀더를 실제 개인 키로 교체합니다:
PRIVATE_KEY=0xYOUR_PRIVATE_KEY_HERE
다음으로 foundry.toml을 열고 Stable 테스트넷을 명명된 네트워크 프로필로 추가합니다. 기존 [profile.default] 섹션 아래에 다음 블록을 추가합니다:
[rpc_endpoints]
stable_testnet = "https://rpc.testnet.stable.xyz"
이렇게 하면 stable_testnet을 대상으로 할 때 Foundry가 트랜잭션을 어디로 보낼지 알게 됩니다. Stable은 EVM 호환이므로 다른 구성은 필요하지 않습니다.
체크포인트: RPC 엔드포인트에 접근 가능한지 확인합니다:
cast chain-id --rpc-url https://rpc.testnet.stable.xyz
예상 출력:
2201
체인 ID 2201은 Stable 테스트넷입니다. 이 숫자가 보이면 네트워크에 접근할 수 있는 것입니다.

4. 지갑 주소 가져오기

개인 키에서 배포자 주소를 도출하여 어떤 계정에 자금을 충전해야 하는지 확인합니다:
source .env
cast wallet address $PRIVATE_KEY
출력된 주소를 복사합니다. 다음 단계에서 필요합니다.

5. USDT0으로 지갑에 자금 충전

Stable은 USDT0을 가스 토큰으로 사용합니다 — 상품과 서비스 결제에 사용하는 것과 동일한 자산이 컴퓨팅 비용 지불에 직접 사용됩니다. 별도의 네이티브 토큰은 없습니다. 테스트넷 수도꼭지를 방문하여 자금을 요청합니다:
https://faucet.stable.xyz
이전 단계의 주소를 붙여넣습니다. 수도꼭지는 지갑에 1 USDT0을 전송하며, 이는 여러 컨트랙트를 배포하고 상호작용하기에 충분합니다.
체크포인트: 잔액이 도착했는지 확인합니다:
cast balance $PRIVATE_KEY --rpc-url https://rpc.testnet.stable.xyz
0이 아닌 값이 보여야 합니다. 잔액이 여전히 0이라면 몇 초 후 다시 실행하세요 — Stable은 약 0.7초마다 새 블록을 생성하므로 자금이 빨리 정산됩니다.

6. 컨트랙트 배포

forge create로 배포를 실행합니다:
source .env
forge create src/Counter.sol:Counter \
  --rpc-url https://rpc.testnet.stable.xyz \
  --private-key $PRIVATE_KEY \
  --broadcast
Foundry가 컨트랙트를 컴파일하고, 배포 트랜잭션을 브로드캐스트하고, 영수증을 기다립니다. 블록 시간이 ~0.7초이므로 잠깐이면 됩니다.
체크포인트: 출력이 다음과 같아야 합니다:
[⠒] Compiling...
No files changed, compilation skipped
Deployer: 0xYourAddress
Deployed to: 0xSomeContractAddress
Transaction hash: 0xSomeTxHash
Deployed to 주소를 복사합니다. 다음 두 단계에서 필요합니다.

7. 쓰기 함수 호출

이제 setNumber()를 호출하여 체인에 값을 저장합니다:
cast send 0xSomeContractAddress "setNumber(uint256)" 42 \
  --rpc-url https://rpc.testnet.stable.xyz \
  --private-key $PRIVATE_KEY
이것은 트랜잭션을 전송합니다. 상태 변경에 대해 소량의 USDT0 수수료를 지불합니다. 값 42가 이제 Stable 테스트넷의 number 변수에 저장되었습니다.

8. 체인에서 상태 읽기

number()를 호출하여 값을 읽어옵니다. 이것은 무료 읽기 — 트랜잭션 없음, 가스 없음:
cast call 0xSomeContractAddress "number()(uint256)" \
  --rpc-url https://rpc.testnet.stable.xyz
예상 출력:
42
Stable 테스트넷에 쓰고 읽는 것을 완료했습니다. 배포, 쓰기, 읽기의 전체 사이클은 EVM 개발의 핵심 루프이며, 다른 EVM 체인과 동일하게 작동합니다.

9. Stablescan에서 배포 확인

Stable 테스트넷 블록 탐색기를 열고 컨트랙트 주소를 붙여넣습니다:
https://testnet.stablescan.xyz
배포 트랜잭션과 setNumber 호출을 볼 수 있습니다. Stablescan은 Stable에서 온체인 상태를 검사하고, 컨트랙트 소스 코드를 검증하고, 트랜잭션 히스토리를 읽는 공식 도구입니다.

배운 내용

컨트랙트를 배포하고, 상태 변경 트랜잭션을 전송하고, 온체인 상태를 읽었습니다 — 모두 Stable 테스트넷에서 완료했습니다. 이제 다음을 할 수 있습니다:
  • 표준 RPC 엔드포인트를 사용하여 Stable을 대상으로 Foundry(또는 다른 EVM 도구체인) 구성하기
  • USDT0 수도꼭지를 사용하여 지갑에 자금 충전하기
  • USDT0을 가스 토큰으로 사용하여 트랜잭션 비용 지불하기
  • Stablescan에서 작업 내용 확인하기
다음 단계:
  • JSON-RPC API — Stable이 지원하는 eth_ 메서드와 이더리움 메인넷과의 차이점 확인
  • 가스 & 가격 책정 — USDT0 기반 수수료 계산 방식 이해
  • 테스트넷 정보 — 전체 네트워크 파라미터, 컨트랙트 주소, 브리지 세부사항