[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-deep-evm-20-seumateeu-keonteulaekteu-cicd-teseuteu-gaseu-hoegwi":3},{"article":4,"author":60},{"id":5,"category_id":6,"title":7,"slug":8,"excerpt":9,"content_md":10,"content_html":11,"locale":12,"author_id":13,"published":14,"published_at":15,"meta_title":16,"meta_description":17,"focus_keyword":18,"og_image":19,"canonical_url":19,"robots_meta":20,"created_at":15,"updated_at":15,"tags":21,"category_name":39,"related_articles":40},"d5000000-0000-0000-0000-000000000120","a0000000-0000-0000-0000-000000000052","Deep EVM #20: 스마트 컨트랙트를 위한 CI\u002FCD — 테스트, 가스 회귀, 안전성","deep-evm-20-seumateeu-keonteulaekteu-cicd-teseuteu-gaseu-hoegwi","가스 회귀 추적, 정적 분석, 자동 검증, 배포 안전성 검사를 포함한 프로덕션급 스마트 컨트랙트 CI\u002FCD 파이프라인 구축.","## 스마트 컨트랙트에 전용 CI\u002FCD가 필요한 이유\n\n스마트 컨트랙트는 일반 소프트웨어와 다릅니다. 배포 후에는 불변입니다. 웹 앱의 버그는 핫픽스와 재배포를 의미합니다. 스마트 컨트랙트의 버그는 자금 손실, 영구적 상태 손상, 또는 비용이 많이 드는 프록시 업그레이드를 의미합니다. 이것이 전체 CI\u002FCD 철학을 바꿉니다: 파이프라인은 단순한 회귀 감지가 아니라 되돌릴 수 없는 배포 전 최후의 방어선입니다.\n\n프로덕션급 스마트 컨트랙트 CI\u002FCD 파이프라인에는 다음이 포함되어야 합니다: 컴파일과 타입 검사, 포괄적 테스트 스위트(유닛, 퍼즈, 불변성), 가스 회귀 추적, 취약점 패턴을 위한 정적 분석, 배포 시뮬레이션, 자동 컨트랙트 검증.\n\n## 파이프라인 아키텍처\n\nFoundry 기반 스마트 컨트랙트 프로젝트를 위한 완전한 GitHub Actions 워크플로입니다:\n\n```yaml\n# .github\u002Fworkflows\u002Fci.yml\nname: Smart Contract CI\n\non:\n  push:\n    branches: [main]\n  pull_request:\n\nenv:\n  FOUNDRY_PROFILE: ci\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\u002Fcheckout@v4\n        with:\n          submodules: recursive\n      - uses: foundry-rs\u002Ffoundry-toolchain@v1\n        with:\n          version: nightly\n      - name: Install Huff\n        run: |\n          curl -L get.huff.sh | bash\n          echo \"$HOME\u002F.huff\u002Fbin\" >> $GITHUB_PATH\n      - name: Build\n        run: forge build --sizes\n      - name: Check contract sizes\n        run: |\n          forge build --sizes 2>&1 | while read line; do\n            size=$(echo \"$line\" | grep -oP '\\d+\\.\\d+' | head -1)\n            if [ ! -z \"$size\" ] && (( $(echo \"$size > 24.0\" | bc -l) )); then\n              echo \"::error::Contract exceeds 24KB limit: $line\"\n              exit 1\n            fi\n          done\n\n  test:\n    runs-on: ubuntu-latest\n    needs: build\n    steps:\n      - uses: actions\u002Fcheckout@v4\n        with:\n          submodules: recursive\n      - uses: foundry-rs\u002Ffoundry-toolchain@v1\n      - name: Unit tests\n        run: forge test --match-path \"test\u002Funit\u002F*\" -vvv\n      - name: Fuzz tests\n        run: |\n          forge test --match-path \"test\u002Ffuzz\u002F*\" \\\n            --fuzz-runs 50000 -vv\n      - name: Invariant tests\n        run: |\n          forge test --match-path \"test\u002Finvariant\u002F*\" \\\n            --invariant-runs 512 \\\n            --invariant-depth 256 -vv\n```\n\n## forge snapshot으로 가스 회귀 추적\n\n가스 회귀는 스마트 컨트랙트의 중요한 지표입니다. DEX 라우터의 스왑 함수에서 5% 가스 증가는 대규모에서 실제 비용이 됩니다. 체계적으로 추적합니다:\n\n```bash\n# 기준선 생성 (리포지토리에 커밋)\nforge snapshot > .gas-snapshot\ngit add .gas-snapshot\ngit commit -m \"chore: update gas snapshot\"\n\n# CI에서 기준선과 비교\nforge snapshot --check .gas-snapshot --tolerance 2\n```\n\n`--tolerance 2` 플래그는 최대 2%의 가스 증가를 실패 없이 허용합니다. MEV 봇 운영과 같은 핫 경로에서는 허용치를 0%로 설정합니다.\n\n## 정적 분석: Slither와 Aderyn\n\n### Slither\n\nSlither는 Solidity의 업계 표준 정적 분석기입니다. 재진입, 검사되지 않은 외부 호출, 접근 제어 문제 등의 취약점 패턴을 감지합니다:\n\n```bash\nslither . --filter-paths \"test\u002F|script\u002F|lib\u002F\" \\\n  --exclude naming-convention,solc-version \\\n  --fail-on medium\n```\n\n일반적인 발견과 처리 방법:\n\n| 발견 | 심각도 | 조치 |\n|------|--------|------|\n| 재진입 | 높음 | 즉시 수정, CEI 패턴 사용 |\n| 미확인 반환 | 중간 | 반환값 검사 추가 |\n| 명명 규칙 | 정보 | `--exclude`로 억제 |\n| 미사용 상태 변수 | 낮음 | 제거 또는 억제 |\n\n### Aderyn\n\nAderyn은 Slither를 보완하는 Rust 기반 정적 분석기입니다:\n\n```bash\naderyn . --output report.json --format json\n```\n\nAderyn은 가스 최적화 기회 감지와 중앙화 리스크 탐지에 특히 뛰어납니다.\n\n## 배포 체크리스트\n\n배포 전 검사를 스크립트로 자동화합니다:\n\n```solidity\n\u002F\u002F script\u002FDeployChecklist.s.sol\ncontract DeployChecklist is Script {\n    function run() external view {\n        require(block.chainid == 1, \"Wrong chain!\");\n        address expectedOwner = vm.envAddress(\"OWNER\");\n        require(expectedOwner != address(0), \"Owner not set\");\n        require(\n            IWETH(WETH).totalSupply() > 0,\n            \"WETH not deployed\"\n        );\n        console.log(\"All checks passed\");\n    }\n}\n```\n\n## 배포 시뮬레이션\n\n메인넷 배포 전에 포크에 대해 전체 배포를 시뮬레이션합니다:\n\n```bash\n# 배포 시뮬레이션\nforge script script\u002FDeploy.s.sol \\\n  --fork-url $ETH_RPC_URL \\\n  --sender $DEPLOYER \\\n  -vvvv\n\n# 시뮬레이션 통과 시 브로드캐스트\nforge script script\u002FDeploy.s.sol \\\n  --rpc-url $ETH_RPC_URL \\\n  --broadcast \\\n  --slow \\\n  --verify\n```\n\n`--slow` 플래그는 트랜잭션을 하나씩 제출하고 확인을 기다리며, 다단계 배포에 더 안전합니다.\n\n## 보안 도구 요약\n\n| 도구 | 유형 | 적합한 용도 |\n|------|------|-------------|\n| Slither | 정적 분석 | 취약점 패턴, Solidity |\n| Aderyn | 정적 분석 | 가스, 중앙화 리스크 |\n| Foundry Fuzz | 동적 테스트 | 엣지 케이스, 경계값 |\n| Foundry Invariant | 상태 기반 퍼징 | 상태 의존적 버그 |\n| Echidna | 퍼저 | 속성 테스트(대안) |\n| Mythril | 기호 실행 | 경로 탐색 |\n| Certora | 형식 검증 | 수학적 증명 |\n\n## 결론\n\n프로덕션급 스마트 컨트랙트 CI\u002FCD 파이프라인은 전통적 소프트웨어 CI와 근본적으로 다릅니다. 모든 단계는 되돌릴 수 없는 배포 전 안전 게이트 역할을 합니다. 가스 스냅샷은 성능 회귀를 잡고, 정적 분석기는 취약점 패턴을 표시하며, 퍼저는 엣지 케이스를 탐색하고, 배포 시뮬레이션은 실제 상태에 대한 동작을 검증합니다. 파이프라인의 임무는 간단합니다: 버그를 잡는 것보다 버그를 배포하는 것을 더 어렵게 만드는 것.","\u003Ch2 id=\"ci-cd\">스마트 컨트랙트에 전용 CI\u002FCD가 필요한 이유\u003C\u002Fh2>\n\u003Cp>스마트 컨트랙트는 일반 소프트웨어와 다릅니다. 배포 후에는 불변입니다. 웹 앱의 버그는 핫픽스와 재배포를 의미합니다. 스마트 컨트랙트의 버그는 자금 손실, 영구적 상태 손상, 또는 비용이 많이 드는 프록시 업그레이드를 의미합니다. 이것이 전체 CI\u002FCD 철학을 바꿉니다: 파이프라인은 단순한 회귀 감지가 아니라 되돌릴 수 없는 배포 전 최후의 방어선입니다.\u003C\u002Fp>\n\u003Cp>프로덕션급 스마트 컨트랙트 CI\u002FCD 파이프라인에는 다음이 포함되어야 합니다: 컴파일과 타입 검사, 포괄적 테스트 스위트(유닛, 퍼즈, 불변성), 가스 회귀 추적, 취약점 패턴을 위한 정적 분석, 배포 시뮬레이션, 자동 컨트랙트 검증.\u003C\u002Fp>\n\u003Ch2 id=\"\">파이프라인 아키텍처\u003C\u002Fh2>\n\u003Cp>Foundry 기반 스마트 컨트랙트 프로젝트를 위한 완전한 GitHub Actions 워크플로입니다:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-yaml\"># .github\u002Fworkflows\u002Fci.yml\nname: Smart Contract CI\n\non:\n  push:\n    branches: [main]\n  pull_request:\n\nenv:\n  FOUNDRY_PROFILE: ci\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\u002Fcheckout@v4\n        with:\n          submodules: recursive\n      - uses: foundry-rs\u002Ffoundry-toolchain@v1\n        with:\n          version: nightly\n      - name: Install Huff\n        run: |\n          curl -L get.huff.sh | bash\n          echo \"$HOME\u002F.huff\u002Fbin\" &gt;&gt; $GITHUB_PATH\n      - name: Build\n        run: forge build --sizes\n      - name: Check contract sizes\n        run: |\n          forge build --sizes 2&gt;&amp;1 | while read line; do\n            size=$(echo \"$line\" | grep -oP '\\d+\\.\\d+' | head -1)\n            if [ ! -z \"$size\" ] &amp;&amp; (( $(echo \"$size &gt; 24.0\" | bc -l) )); then\n              echo \"::error::Contract exceeds 24KB limit: $line\"\n              exit 1\n            fi\n          done\n\n  test:\n    runs-on: ubuntu-latest\n    needs: build\n    steps:\n      - uses: actions\u002Fcheckout@v4\n        with:\n          submodules: recursive\n      - uses: foundry-rs\u002Ffoundry-toolchain@v1\n      - name: Unit tests\n        run: forge test --match-path \"test\u002Funit\u002F*\" -vvv\n      - name: Fuzz tests\n        run: |\n          forge test --match-path \"test\u002Ffuzz\u002F*\" \\\n            --fuzz-runs 50000 -vv\n      - name: Invariant tests\n        run: |\n          forge test --match-path \"test\u002Finvariant\u002F*\" \\\n            --invariant-runs 512 \\\n            --invariant-depth 256 -vv\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"forge-snapshot\">forge snapshot으로 가스 회귀 추적\u003C\u002Fh2>\n\u003Cp>가스 회귀는 스마트 컨트랙트의 중요한 지표입니다. DEX 라우터의 스왑 함수에서 5% 가스 증가는 대규모에서 실제 비용이 됩니다. 체계적으로 추적합니다:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\"># 기준선 생성 (리포지토리에 커밋)\nforge snapshot &gt; .gas-snapshot\ngit add .gas-snapshot\ngit commit -m \"chore: update gas snapshot\"\n\n# CI에서 기준선과 비교\nforge snapshot --check .gas-snapshot --tolerance 2\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Ccode>--tolerance 2\u003C\u002Fcode> 플래그는 최대 2%의 가스 증가를 실패 없이 허용합니다. MEV 봇 운영과 같은 핫 경로에서는 허용치를 0%로 설정합니다.\u003C\u002Fp>\n\u003Ch2 id=\"slither-aderyn\">정적 분석: Slither와 Aderyn\u003C\u002Fh2>\n\u003Ch3>Slither\u003C\u002Fh3>\n\u003Cp>Slither는 Solidity의 업계 표준 정적 분석기입니다. 재진입, 검사되지 않은 외부 호출, 접근 제어 문제 등의 취약점 패턴을 감지합니다:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">slither . --filter-paths \"test\u002F|script\u002F|lib\u002F\" \\\n  --exclude naming-convention,solc-version \\\n  --fail-on medium\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>일반적인 발견과 처리 방법:\u003C\u002Fp>\n\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>발견\u003C\u002Fth>\u003Cth>심각도\u003C\u002Fth>\u003Cth>조치\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\n\u003Ctr>\u003Ctd>재진입\u003C\u002Ftd>\u003Ctd>높음\u003C\u002Ftd>\u003Ctd>즉시 수정, CEI 패턴 사용\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>미확인 반환\u003C\u002Ftd>\u003Ctd>중간\u003C\u002Ftd>\u003Ctd>반환값 검사 추가\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>명명 규칙\u003C\u002Ftd>\u003Ctd>정보\u003C\u002Ftd>\u003Ctd>\u003Ccode>--exclude\u003C\u002Fcode>로 억제\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>미사용 상태 변수\u003C\u002Ftd>\u003Ctd>낮음\u003C\u002Ftd>\u003Ctd>제거 또는 억제\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Ch3>Aderyn\u003C\u002Fh3>\n\u003Cp>Aderyn은 Slither를 보완하는 Rust 기반 정적 분석기입니다:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">aderyn . --output report.json --format json\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Aderyn은 가스 최적화 기회 감지와 중앙화 리스크 탐지에 특히 뛰어납니다.\u003C\u002Fp>\n\u003Ch2 id=\"\">배포 체크리스트\u003C\u002Fh2>\n\u003Cp>배포 전 검사를 스크립트로 자동화합니다:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-solidity\">\u002F\u002F script\u002FDeployChecklist.s.sol\ncontract DeployChecklist is Script {\n    function run() external view {\n        require(block.chainid == 1, \"Wrong chain!\");\n        address expectedOwner = vm.envAddress(\"OWNER\");\n        require(expectedOwner != address(0), \"Owner not set\");\n        require(\n            IWETH(WETH).totalSupply() &gt; 0,\n            \"WETH not deployed\"\n        );\n        console.log(\"All checks passed\");\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"\">배포 시뮬레이션\u003C\u002Fh2>\n\u003Cp>메인넷 배포 전에 포크에 대해 전체 배포를 시뮬레이션합니다:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\"># 배포 시뮬레이션\nforge script script\u002FDeploy.s.sol \\\n  --fork-url $ETH_RPC_URL \\\n  --sender $DEPLOYER \\\n  -vvvv\n\n# 시뮬레이션 통과 시 브로드캐스트\nforge script script\u002FDeploy.s.sol \\\n  --rpc-url $ETH_RPC_URL \\\n  --broadcast \\\n  --slow \\\n  --verify\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Ccode>--slow\u003C\u002Fcode> 플래그는 트랜잭션을 하나씩 제출하고 확인을 기다리며, 다단계 배포에 더 안전합니다.\u003C\u002Fp>\n\u003Ch2 id=\"\">보안 도구 요약\u003C\u002Fh2>\n\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>도구\u003C\u002Fth>\u003Cth>유형\u003C\u002Fth>\u003Cth>적합한 용도\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\n\u003Ctr>\u003Ctd>Slither\u003C\u002Ftd>\u003Ctd>정적 분석\u003C\u002Ftd>\u003Ctd>취약점 패턴, Solidity\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Aderyn\u003C\u002Ftd>\u003Ctd>정적 분석\u003C\u002Ftd>\u003Ctd>가스, 중앙화 리스크\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Foundry Fuzz\u003C\u002Ftd>\u003Ctd>동적 테스트\u003C\u002Ftd>\u003Ctd>엣지 케이스, 경계값\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Foundry Invariant\u003C\u002Ftd>\u003Ctd>상태 기반 퍼징\u003C\u002Ftd>\u003Ctd>상태 의존적 버그\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Echidna\u003C\u002Ftd>\u003Ctd>퍼저\u003C\u002Ftd>\u003Ctd>속성 테스트(대안)\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Mythril\u003C\u002Ftd>\u003Ctd>기호 실행\u003C\u002Ftd>\u003Ctd>경로 탐색\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Certora\u003C\u002Ftd>\u003Ctd>형식 검증\u003C\u002Ftd>\u003Ctd>수학적 증명\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Ch2 id=\"\">결론\u003C\u002Fh2>\n\u003Cp>프로덕션급 스마트 컨트랙트 CI\u002FCD 파이프라인은 전통적 소프트웨어 CI와 근본적으로 다릅니다. 모든 단계는 되돌릴 수 없는 배포 전 안전 게이트 역할을 합니다. 가스 스냅샷은 성능 회귀를 잡고, 정적 분석기는 취약점 패턴을 표시하며, 퍼저는 엣지 케이스를 탐색하고, 배포 시뮬레이션은 실제 상태에 대한 동작을 검증합니다. 파이프라인의 임무는 간단합니다: 버그를 잡는 것보다 버그를 배포하는 것을 더 어렵게 만드는 것.\u003C\u002Fp>\n","ko","b0000000-0000-0000-0000-000000000001",true,"2026-03-28T10:44:28.269079Z","스마트 컨트랙트를 위한 CI\u002FCD — 테스트, 가스 회귀, 안전성","가스 회귀 추적, 정적 분석, 자동 Etherscan 검증을 포함한 프로덕션급 스마트 컨트랙트 CI\u002FCD 파이프라인 구축.","스마트 컨트랙트 CI\u002FCD 파이프라인",null,"index, follow",[22,27,31,35],{"id":23,"name":24,"slug":25,"created_at":26},"c0000000-0000-0000-0000-000000000012","DevOps","devops","2026-03-28T10:44:21.513630Z",{"id":28,"name":29,"slug":30,"created_at":26},"c0000000-0000-0000-0000-000000000016","EVM","evm",{"id":32,"name":33,"slug":34,"created_at":26},"c0000000-0000-0000-0000-000000000021","Foundry","foundry",{"id":36,"name":37,"slug":38,"created_at":26},"c0000000-0000-0000-0000-000000000013","Security","security","블록체인",[41,48,54],{"id":42,"title":43,"slug":44,"excerpt":45,"locale":12,"category_name":46,"published_at":47},"d0000000-0000-0000-0000-000000000674","2026년, Bali가 동남아시아의 임팩트 테크 허브가 되고 있는 이유","bali-2026-dongnamasia-impaekteu-tekeu-heobeu-iyu","Bali는 동남아시아 스타트업 생태계에서 16위를 차지하고 있습니다. Web3 빌더, AI 지속가능성 스타트업, 에코 여행 테크 기업이 집중되면서, 이 섬은 지역 임팩트 테크의 수도로 자리매김하고 있습니다.","엔지니어링","2026-03-28T10:44:49.294484Z",{"id":49,"title":50,"slug":51,"excerpt":52,"locale":12,"category_name":46,"published_at":53},"d0000000-0000-0000-0000-000000000673","ASEAN 데이터 보호 패치워크: 개발자를 위한 컴플라이언스 체크리스트","asean-deiteo-boho-paechiwokeu-gaebaljaleul-wihan-keompeullaieonseuchekeuriseuteu","7개 ASEAN 국가가 포괄적인 데이터 보호법을 시행하고 있으며, 각각 다른 동의 모델, 현지화 요건, 벌칙 구조를 가지고 있습니다. 다중 국가 애플리케이션을 구축하는 개발자를 위한 실용적인 컴플라이언스 체크리스트입니다.","2026-03-28T10:44:49.286400Z",{"id":55,"title":56,"slug":57,"excerpt":58,"locale":12,"category_name":46,"published_at":59},"d0000000-0000-0000-0000-000000000672","Indonesia 290억 달러 디지털 전환: 소프트웨어 기업을 위한 기회","indonesia-290eok-dallleo-dijiteol-jeonhwan-sopeuteuweo-gieopui-gihoe","Indonesia IT 서비스 시장은 2026년 290.3억 달러에 달할 것으로 예상되며, 이는 2025년 243.7억 달러에서 증가한 수치입니다. 클라우드 인프라, AI, 전자상거래, 데이터센터가 동남아시아에서 가장 빠른 성장을 주도하고 있습니다.","2026-03-28T10:44:49.265609Z",{"id":13,"name":61,"slug":62,"bio":63,"photo_url":19,"linkedin":19,"role":64,"created_at":65,"updated_at":65},"Open Soft Team","open-soft-team","The engineering team at Open Soft, building premium software solutions from Bali, Indonesia.","Engineering Team","2026-03-28T08:31:22.226811Z"]