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

스마트 컨트랙트 검증

검증은 컨트랙트의 소스 코드를 블록 탐색기에 업로드하고 배포된 바이트코드로 컴파일되었음을 증명합니다. 검증되면 사용자는 코드를 다시 호스팅할 필요 없이 Stablescan에서 상태를 읽고, 함수를 호출하고, 소스를 감사할 수 있습니다. 이 가이드는 Foundry에 배포된 컨트랙트를 Stable에서 검증하는 과정을 안내합니다.

Stablescan은 Etherscan의 멀티체인(V2) API에서 실행되므로, 검증 및 기타 모든 탐색기 API 호출은 chainid 매개변수와 함께 https://api.etherscan.io/v2/api로 전송됩니다.

네트워크체인 ID검증기 URL
Stable 테스트넷2201https://api.etherscan.io/v2/api?chainid=2201
Stable 메인넷988https://api.etherscan.io/v2/api?chainid=988

전제 조건

  • Stable 테스트넷 또는 메인넷에 이미 배포된 컨트랙트. 아직 배포하지 않았다면, 스마트 컨트랙트 배포를 참조하십시오.
  • Foundry가 설치되어 있어야 합니다 (forge가 PATH에 있어야 합니다). --verifier custom이 인식되지 않으면 foundryup을 실행하십시오.
  • forge create 출력에서 얻은 배포된 컨트랙트 주소.
  • https://etherscan.io/myapikey에서 얻은 Etherscan API 키. 하나의 키로 Stable 네트워크를 포함한 V2 API의 모든 체인을 커버할 수 있습니다.

1. 배포된 주소 확인

이전 배포에서 얻은 Deployed to 주소를 가지고 있는지 확인하세요. 스마트 컨트랙트 배포 흐름에서 이 값은 forge create 후 출력된 값이었습니다.

cast code 0xDeployedContractAddress --rpc-url https://rpc.testnet.stable.xyz | head -c 20
0x6080604052600436...

비어 있지 않은 바이트코드는 해당 주소에 컨트랙트가 배포되었음을 확인합니다.

2. API 키 내보내기

Foundry와 curl은 모두 셸에서 키를 읽으므로 한 번 내보냅니다.

export ETHERSCAN_API_KEY=YourApiKey
 
curl "https://api.etherscan.io/v2/api?chainid=2201&module=account&action=balance&address=0xDeployedContractAddress&tag=latest&apikey=$ETHERSCAN_API_KEY"
{"status":"1","message":"OK","result":"0"}

"status":"1" 응답은 키가 Stable 테스트넷에서 작동함을 확인합니다. Missing/Invalid API Key가 발생하면 키가 설정되지 않았거나 아직 활성화되지 않은 것입니다.

3. forge verify-contract 실행

Foundry를 체인 2201의 Etherscan V2 엔드포인트로 지정합니다.

forge verify-contract \
  0xDeployedContractAddress \
  src/Counter.sol:Counter \
  --chain-id 2201 \
  --verifier custom \
  --verifier-url "https://api.etherscan.io/v2/api?chainid=2201" \
  --verifier-api-key $ETHERSCAN_API_KEY \
  --watch
Start verifying contract `0xDeployedContractAddress` deployed on 2201

Submitting verification for [src/Counter.sol:Counter] 0xDeployedContractAddress.
Submitted contract for verification:
        Response: `OK`
        GUID: `abc123...`
Contract verification status:
Response: `OK`
Details: `Pass - Verified`
Contract successfully verified

--watch는 검증이 완료될 때까지 차단하므로 폴링할 필요가 없습니다. 메인넷에서는 체인 ID를 988로, 검증기 URL을 https://api.etherscan.io/v2/api?chainid=988로 변경합니다.

4. Stablescan에서 검증 확인

탐색기에서 컨트랙트 페이지를 엽니다.

https://testnet.stablescan.xyz/address/0xDeployedContractAddress

Contract 탭에 이제 소스 코드, 녹색 "Verified" 배지, 전체 ABI가 표시되어야 합니다. 사용자는 Read Contract에서 상태를 읽고 Write Contract에서 트랜잭션을 보낼 수 있습니다.

문제 해결

  • "Invalid API URL endpoint": 탐색기 호스트를 직접 호출하고 있습니다. https://testnet.stablescan.xyz/apihttps://api.etherscan.io/v2/api?chainid=2201로 교체하십시오.
  • "Missing/Invalid API Key": ETHERSCAN_API_KEY가 현재 셸에 설정되지 않았거나 키가 방금 생성되어 아직 활성화되지 않았습니다. 2단계에서 curl 확인을 다시 실행하십시오.
  • "Bytecode does not match": 소스가 배포된 바이트코드와 다르게 컴파일됩니다. 대부분 Solidity 버전 또는 옵티마이저 설정 불일치로 인해 발생합니다. foundry.toml과 일치하도록 --compiler-version--optimizer-runs를 명시적으로 전달하십시오.
  • "GUID not found": 검증기가 아직 제출을 등록하지 않았습니다. --watch로 다시 실행하거나 응답에 출력된 URL을 수동으로 확인하십시오.
  • 컨트랙트가 라이브러리를 사용합니다: 각 연결된 라이브러리에 대해 --libraries src/Lib.sol:Lib:0xDeployedLibAddress를 추가하십시오.

다음 권장 사항