Are you an LLM? Read llms.txt for a summary of the docs, or llms-full.txt for the full context.
Skip to content

스마트 계약 배포

이 튜토리얼에서는 간단한 스마트 계약을 Stable Testnet에 배포하고 체인에서 상태를 읽는 방법을 다룹니다. 이 과정에서 Stable 네트워크가 어떻게 구성되어 있는지, USDT0이 가스 토큰으로 어떻게 작동하는지, 그리고 표준 EVM 툴링을 Stable에 어떻게 연결하는지 배우게 될 것입니다.

이 튜토리얼은 Solidity 및 Unix와 유사한 터미널에 대한 기본적인 지식을 전제로 합니다. Stable에 대한 사전 경험은 필요하지 않습니다.

만들게 될 것

새로운 Foundry 프로젝트에 샘플 Counter 계약을 Stable 테스트넷에 배포하고, 하나의 상태 변경 호출과 하나의 읽기 호출을 수행합니다.

데모

1단계. Foundry 프로젝트 스캐폴드 → stable-hello/

2단계. 테스트넷 구성
        RPC:      https://rpc.testnet.stable.xyz
        체인 ID: 2201

3단계. Faucet에서 지갑에 자금 지원 (1 USDT0)

4단계. forge create Counter
        배포 위치: 0xContract...

5단계. cast send Counter.setNumber(42)

6단계. cast call Counter.number()
        → 42

전제 조건

  • Foundry 설치 (forge, cast, anvil이 PATH에 사용 가능해야 합니다)
  • 제어할 수 있는 프라이빗 키가 있는 지갑 (새로운 테스트 키도 괜찮습니다; 실제 자금이 있는 키는 테스트넷에서 절대 사용하지 마십시오)
  • 테스트넷 RPC 및 Faucet에 연결하기 위한 인터넷 연결

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을 가스 토큰으로 사용합니다. 상품 및 서비스 비용을 지불하는 데 사용하는 자산과 동일한 자산을 직접 계산 비용을 지불하는 데 사용합니다. 보조 네이티브 토큰은 없습니다.

테스트넷 Faucet에 방문하여 자금을 요청합니다.

https://faucet.stable.xyz

이전 단계에서 복사한 주소를 붙여넣습니다. Faucet은 지갑에 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초이므로 이 작업은 잠시만 걸립니다.


체크포인트: 출력은 다음과 같아야 합니다.

[⠒] 컴파일 중...
변경된 파일이 없어 컴파일을 건너뜁니다.
배포자: 0xYourAddress
배포 위치: 0xSomeContractAddress
트랜잭션 해시: 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 Endpoint를 사용하여 Stable을 대상으로 Foundry(또는 모든 EVM 툴체인)를 구성하는 방법
  • USDT0 Faucet을 사용하여 지갑에 자금을 지원하는 방법
  • USDT0을 가스 토큰으로 사용하여 트랜잭션 비용을 지불하는 방법
  • Stablescan에서 작업을 검사하는 방법

다음으로 추천하는 사항

  • 계약 확인: 사용자가 소스를 읽고 상호 작용할 수 있도록 Stablescan에 소스를 업로드합니다.
  • 계약 이벤트 인덱싱: ethers.js로 이벤트 구독 및 이전 로그를 백필하는 방법.
  • 가스 요금 참조: USDT0으로 표시된 수수료가 어떻게 계산되는지 이해합니다.