아카이브
티스토리에서 옮겨 온 2023년 이후의 기록 181편.
2024
- [Ethernaut] 32. Impersonator Solidity ECDSA 서명 가변성으로 이미 사용된 서명을 변형해 컨트롤러를 영 주소로 바꾸고, 누구나 잠금을 열 수 있게 만드는 공격 과정을 풀이한다.
- Transient Storage 이해하기 블록체인 EVM의 영구 스토리지와 트랜지언트 스토리지의 비용과 수명 차이를 설명하고, 재진입 방지 구현의 가스 절감 효과와 사용 시 보안 위험을 짚는다.
- React에서 텍스트 오버플로우 감지 및 스크롤 애니메이션 구현하기 개발 부스러기 React에서 요소의 위치를 비교해 긴 텍스트가 옆 영역을 침범했는지 감지하고, 오버플로우일 때만 호버 스크롤 애니메이션을 적용한다.
- Yarn을 사용한 모노레포에서 cannot find module 문제 해결하기 개발 부스러기 Yarn Berry 워크스페이스와 코드 에디터가 서로 다른 TypeScript 버전을 사용해 모듈을 찾지 못할 때의 원인과 해결 절차를 기록했다.
- [Solidity] 함수 시그니처를 사용해 동적으로 데이터를 인코딩하는 폼 만들기 개발 부스러기 Solidity 함수 시그니처를 viem으로 ABI로 변환하고, 파라미터 타입에 맞는 입력 폼을 동적으로 만든 뒤 데이터를 인코딩한다.
- EIP-7212 알아보기: secp256r1 곡선을 지원하기 위한 프리컴파일과 ZKsync에서의 구현 블록체인 secp256r1 서명 검증 프리컴파일의 필요성과 계정 추상화 활용을 설명하고, ZKsync의 P256Verify 구현과 테스트 방법을 다룬다.
- Web3OJ 문제 풀이를 위한 Foundry 템플릿 Solidity Solidity 온라인 저지 Web3OJ의 문제를 Foundry로 풀 수 있는 템플릿을 소개하고, 빠른 테스트와 실행 등 프레임워크의 장점을 설명한다.
- Next.js App Router + RainbowKit + SIWE + NextAuth.js를 사용해 지갑으로 로그인하는 기능 구현하기 개발 부스러기 Next.js App Router에 지갑 연결과 서명 로그인을 구성하고, 세션 관리와 인증 API 및 보호된 페이지까지 구현하는 과정을 담았다.
- 테스트 주도 개발 입문 - 시작하기 Go 돈 객체의 곱셈과 다중 통화 요구사항을 예제로, 실패하는 테스트부터 최소 구현과 중복 제거까지 레드·그린·리팩터 흐름을 단계별로 익힌다.
- 테스트 주도 개발 입문 - 테스트 주도 개발이란? Go 테스트 주도 개발을 테스트 기법이 아닌 코드 설계와 구조화 방법으로 설명한다. 단순성과 신뢰성을 높이는 반복 과정, 실천을 망설이는 이유와 학습 방향을 다룬다.
- [PS / Go] 백준 11729 번 하노이 탑 이동 순서, 프로그래머스 타겟 넘버 Go 하노이 탑의 이동 횟수와 순서를 재귀로 구하고, 타겟 넘버는 반복문과 메모이제이션으로 푼다. 두 문제의 점화식과 시간 복잡도 차이도 설명한다.
- [백준 / Go] 18428번: 감시 피하기 Go 교실의 빈칸 중 세 곳에 장애물을 놓는 모든 조합을 탐색한다. 각 교사의 상하좌우 시야를 검사해 모든 학생이 감시를 피할 수 있는지 판별한다.
- Ethernaut 문제 풀이 및 키워드 정리 Solidity Ethernaut 각 단계의 풀이 링크와 핵심 취약점 키워드를 한곳에 모았다. 재진입, 스토리지 배치, 프록시, 타입 변환 등 단계별 학습 주제를 빠르게 찾을 수 있다.
- [Ethernaut] 30. HigherOrder Solidity Solidity 0.8 이전 ABI 디코더가 비정상 calldata를 허용하는 특성을 분석한다. uint8 범위를 넘는 값을 저장해 HigherOrder 조건을 달성한다.
- [ZKsync] Privy와 ZKsync Sepolia 네트워크 연동하기 블록체인 Privy 소셜 로그인을 Next.js 앱에 구성하고 ZKsync Sepolia와 연결해, 테스트넷 NFT 민팅부터 Vercel 배포까지 구현한다.
- [Ethernaut] 31. Stake Solidity Stake 컨트랙트의 저수준 WETH 전송 결과 미검증과 출금 회계 오류를 분석하고, 네 가지 완료 조건을 충족하는 공격 과정을 단계별로 구현한다.
- ERC-4337: 계정 추상화 - 간단 정리 블록체인 계정 추상화의 필요성과 기존 이더리움 계정의 한계를 설명하고, ERC-4337의 주요 구성 요소와 처리 흐름, 장단점을 한데 묶어 설명한다.
- ERC-4337: 계정 추상화 - 테스트를 통한 Aggregator의 동작 이해 블록체인 BLS 서명의 쌍선형성과 서명 집계 원리를 짚고, BLSAccount와 Factory, Aggregator가 UserOperation을 검증하는 흐름을 테스트한다.
- Foundry 프로젝트에서 Hardhat 같이 사용하기 Solidity 기존 Foundry 프로젝트에 Hardhat을 추가하거나 그 반대로 구성할 때 필요한 플러그인 설치, 소스 경로 연동, 빌드 설정을 안내한다.
- ERC-4337: 계정 추상화 - 테스트를 통한 Paymaster와 LegacyTokenPaymaster의 동작 이해 블록체인 BasePaymaster를 상속한 화이트리스트형 수수료 대납과 LegacyTokenPaymaster의 토큰 결제 방식을 구현하고 Foundry 테스트로 검증한다.
- ERC-4337: 계정 추상화 - 테스트를 통한 Account Factory의 동작 이해 블록체인 SimpleAccountFactory가 create2와 salt로 스마트 계정 주소를 미리 계산하고, 직접 호출과 EntryPoint 경유로 계정을 생성하는 과정을 테스트한다.
- ERC-4337: 계정 추상화 - 테스트 수정 사항 블록체인 ERC-4337 테스트에서 발견한 UserOperation 가스 필드 패킹 순서와 한도 문제를 수정하고, vm.etch로 반복 배포를 줄인 과정을 기록한다.
- ERC-4337: 계정 추상화 - 테스트를 통한 Account와 EntryPoint의 동작 이해 블록체인 Foundry 테스트로 SimpleAccount의 작업 실행, 서명 검증, 가스비 예치와 인출, UUPS 업그레이드 및 EntryPoint 처리 흐름을 확인한다.
- ERC-4337: 계정 추상화 블록체인 ERC-4337이 합의 계층 변경 없이 계정 추상화를 구현하는 방식을 명세 중심으로 설명하고, UserOperation과 EntryPoint, Paymaster의 역할을 구분한다.
- [백준 / Go] 23324번: 어려운 모든 정점 쌍 최단 거리 Go 가중치가 1인 간선을 제외한 뒤 분리 집합으로 양쪽 연결 요소의 크기를 구해 모든 정점 쌍 최단 거리의 합을 계산하고 Go로 구현한다.
- The Graph를 사용해 온체인 이벤트 인덱싱하기 블록체인 Foundry로 배포한 NFT 컨트랙트의 이벤트를 서브그래프로 정의하고, The Graph에 배포해 GraphQL로 조회하는 과정을 다룬다.
- 소셜 로그인 + 계정 추상화를 사용한 dApp 만들기 블록체인 Privy 소셜 로그인과 Biconomy 스마트 계정을 연결해 가스비 없는 ERC-20 에어드롭 앱을 만들고 UserOperation 처리 과정을 설명한다.
- OpenZeppelin Governor 이해하기 Solidity OpenZeppelin Wizard로 거버넌스와 투표 토큰을 구성하고, Foundry 테스트로 제안 생성부터 투표와 실행까지의 흐름을 검증한다.
- [Damn Vulnerable DeFi] Climber Solidity ClimberVault와 Timelock의 실행 순서 취약점을 이용해 권한을 탈취하고 UUPS 구현체를 교체해 자금을 인출하는 공격 과정을 분석한다.
- Astar zkEVM & Yoki Origins 체험기 #3 블록체인 요키 오리진스의 캡슐 뽑기와 개봉, 융합 과정을 직접 체험하고 보상 구조와 운영 방식, UI에서 좋았던 점과 아쉬운 점을 기록한다.
- Astar zkEVM & Yoki Origins 체험기 #2 블록체인 출시 캠페인의 요키 수집 방식을 소개하고, 지갑에 네트워크를 등록한 뒤 OMA 토큰 획득과 골든 캡슐 개봉까지 체험한 과정을 기록한다.
- Astar zkEVM & Yoki Origins 체험기 #1 블록체인 Astar의 롤업 네트워크와 출시 캠페인을 선택한 배경부터 메인넷 이더 구매와 브리징까지 직접 진행하며 익힌 내용을 기록한다.
- [EPF] Study Group 2주차 Execution Layer 교육 과정 실행 레이어 노드가 블록을 검증하고 생성하는 흐름을 따라가며 상태 전환, Engine API의 newPayload 메서드와 EVM 구조를 설명한다.
- [EPF] Study Group 1주차 Protocol Intro 교육 과정 이더리움의 오픈소스 철학과 프로토콜 설계 원칙을 짚고, 실행·합의 레이어의 구성과 개발 협업 구조, 향후 연구 로드맵을 요약한다.
- [Damn Vulnerable DeFi] Backdoor Solidity Gnosis Safe 프록시 생성 과정의 delegatecall을 악용해 수혜자 지갑에 토큰 승인 권한을 심고, 등록 보상금을 회수하는 공격을 다룬다.
- [Damn Vulnerable DeFi] Free Rider Solidity 일괄 구매에서 결제액을 중복 계산하고 판매 대금을 구매자에게 돌려주는 NFT 마켓의 결함을 플래시 스왑과 결합해 공략하는 과정을 설명한다.
- [Damn Vulnerable DeFi] Puppet V2 Solidity Uniswap V2의 준비금 비율을 그대로 오라클로 쓸 때 가격 조작이 반복되는 이유와, WETH 담보로 렌딩 풀을 비우는 공격을 다룬다.
- Damn Vulnerable DeFi Foundry V3 업데이트 작업 개발 부스러기 DeFi 보안 실습 저장소를 Foundry V3에 맞춰 갱신하며 메인넷 포크, 가격 정밀도, 컴파일러 충돌과 서명 트랜잭션 재현 문제를 해결한 기록이다.
- [Damn Vulnerable DeFi] Puppet Solidity Uniswap V1의 즉시 변하는 현물 가격을 조작해 담보 요구량을 낮추고 렌딩 풀의 토큰을 빌리는 공격과 TWAP 기반 개선안을 설명한다.
- [Damn Vulnerable DeFi] Compromised Solidity 노출된 두 오라클 운영자의 비밀키를 복원해 NFT 가격의 중앙값을 조작하고, 낮게 사서 높게 팔아 거래소 자금을 빼내는 과정을 다룬다.
- [Damn Vulnerable DeFi] Selfie Solidity 플래시 론으로 과반의 거버넌스 토큰을 확보해 스냅샷과 악성 작업을 등록하고, 지연 실행으로 렌딩 풀 자금을 탈취하는 과정을 설명한다.
- [Damn Vulnerable DeFi] The Rewarder Solidity 플래시 론으로 보상 스냅샷의 지분을 순간적으로 늘려 보상 토큰을 가로채는 원리와, 민팅·보상 처리 순서를 바꾸는 대응책을 다룬다.
- [Ethernaut] 24. Puzzle Wallet Solidity 프록시와 구현체의 스토리지 충돌, delegatecall의 동작을 이용해 지갑 소유권과 관리자 권한을 탈취하는 과정을 설명한다.
- [Ethernaut] 26. DoubleEntryPoint Solidity 레거시 토큰의 이중 진입점으로 보호 대상 토큰을 우회 인출하는 취약점을 추적하고, Forta 탐지 봇으로 전송을 차단하는 과정을 다룬다.
- [Foundry] .env 파일 사용하지 마세요 Solidity 평문 환경 파일과 명령 기록에 프라이빗 키를 남길 때의 위험을 짚고, Foundry의 암호화 키스토어로 계정을 관리하고 배포하는 방법을 안내한다.
- [Ethernaut] 25. Motorbike Solidity UUPS 프록시의 구현 컨트랙트가 초기화되지 않은 점을 이용해 소유권을 얻고, 업그레이드와 위임 호출로 엔진을 무력화하는 과정을 추적한다.
- [Damn Vulnerable DeFi] Truster, Side Entrance Solidity Truster의 임의 호출 권한과 Side Entrance의 재진입 가능한 예치 구조를 악용해 자금을 탈취하고, 각 취약점의 방어 방식을 제시한다.
- [Uniswap] V2 FlashSwap 예제 Solidity Uniswap V2 페어의 콜백으로 자산을 빌린 뒤 같은 토큰이나 상대 토큰으로 상환하는 플래시 스왑을 구현하고 수수료 차이를 검증한다.
- [Uniswap] V2 Oracle 예제 Solidity Uniswap V2의 누적 가격으로 시간 가중 평균 가격을 계산하는 오라클을 구현하고, 주기적 갱신과 토큰 견적 과정을 테스트한다.
- [Damn Vulnerable DeFi] Unstoppable, Naive Receiver Solidity Unstoppable의 풀 잔액 불일치와 Naive Receiver의 고정 수수료 구조를 이용해 플래시론을 중단시키고 자금을 소진하는 공격을 구현한다.
- [Uniswap] V2 Router Solidity Uniswap V2 Router01의 인터페이스와 WETH 역할을 짚고, 유동성 추가·제거와 정확한 입력·출력 기준의 스왑 함수 동작을 해설한다.
- Inline Assembly를 사용해 ERC-20 구현하기 & Inline Assembly 활용하기 Solidity 인라인 어셈블리로 ERC-20을 구현해 가스 비용을 비교하고, 문자열 저장과 조회, 이벤트 로그, 커스텀 오류를 다루는 방법을 설명한다.
- [Ethernaut] 18. MagicNumber Solidity 초기화 코드와 런타임 코드의 구조를 구분하고, 호출 시 42를 반환하는 초소형 컨트랙트를 EVM 바이트코드로 직접 작성해 배포한다.
- Solidity 런타임 바이트코드 분해하기 개발 부스러기 소스 코드와 ABI가 없는 컨트랙트의 런타임 바이트코드를 opcode 단위로 읽어 함수 선택자와 호출 인수를 추론하는 과정을 다룬다.
- Hyperlane V3를 사용한 Crosschain NFT 개발 부스러기 Foundry로 NFT와 라우터 컨트랙트를 구성하고 서로 다른 테스트넷에 배포한 뒤, Hyperlane 메시징으로 체인 간 NFT를 발행한다.
- Go 1.22.0 업데이트 살펴보기 Go Go 1.22에 추가된 반복문 변수 할당과 정수 범위 순회를 중심으로 Vet, 런타임, 컴파일러, 표준 라이브러리의 주요 변화를 다룬다.
- [Ethernaut] 29. Switch Solidity ABI로 인코딩된 호출 데이터의 오프셋을 조작해 함수 선택자 검사를 우회하고, Switch 컨트랙트의 상태를 바꾸는 공격 과정을 설명한다.
- 컨트랙트 ABI 블록체인 스마트 컨트랙트의 정적·동적 타입이 ABI 형식으로 배치되는 규칙을 예제로 설명한다. 함수 선택자를 포함한 호출 데이터 구성과 디코딩 방법도 다룬다.
- [Ethernaut] 28. Gatekeeper Three Solidity 오타로 노출된 생성자와 스토리지에 남은 비밀번호, 이더 전송 실패 조건을 차례로 이용해 세 관문을 통과하고 진입자 주소를 바꾸는 과정을 설명한다.
- [Uniswap] V2 Core 보충 자료 - 백서 읽기 Solidity 유니스왑 V2 백서를 바탕으로 112비트 고정소수점과 타임스탬프 설계를 설명한다. 프로토콜 수수료 계산과 최소 유동성 발행 이유도 다룬다.
- [Ethernaut] 27. Good Samaritan Solidity 수신 컨트랙트가 동일한 커스텀 에러를 반환하도록 속여 지갑의 잔액 전송 분기를 실행한다. 외부 호출의 오류를 식별자로만 처리할 때의 위험도 설명한다.
- [Ethernaut] 23. Dex Two Solidity 교환 대상 토큰을 검증하지 않는 허점을 이용해 임의의 토큰으로 가격을 조작한다. 적은 수량의 공격 토큰으로 두 준비금을 모두 빼내는 과정을 다룬다.
- [Ethernaut] 22. Dex Solidity 풀의 현재 잔액 비율만으로 교환 가격을 계산하는 결함을 이용해 스왑을 반복하고 한쪽 토큰을 고갈시킨다. 조작 가능한 가격 산식의 위험을 짚는다.
- [Ethernaut] 21. Shop Solidity view 함수가 다른 컨트랙트의 상태를 읽을 수 있다는 점을 이용해 호출 시점마다 다른 가격을 반환한다. pure 함수로 의존 범위를 제한하는 방안도 다룬다.
- [Ethernaut] 20. Denial Solidity 제한 없이 가스를 전달하는 call과 재진입을 결합해 출금 함수의 가스를 소진시킨다. 외부 호출 결과 확인과 상태 변경 순서의 중요성도 짚는다.
- [Uniswap] V2 Core - UniswapV2Pair Solidity 유동성 풀의 토큰 보유량 추적과 상수곱 가격 결정 원리를 설명한다. 유동성 공급의 필요성과 위험을 바탕으로 페어 컨트랙트 구현을 해설한다.
- [Uniswap] V2 Core - UniswapV2Factory Solidity 팩토리 컨트랙트의 상태와 접근 제어, 토큰 페어 생성 절차를 코드와 테스트로 검증한다. CREATE와 CREATE2의 주소 결정 방식도 비교한다.
- [Ethernaut] 19. Alien Codex Solidity 동적 배열의 길이 언더플로우로 전체 스토리지에 접근한 뒤, 배열 원소가 저장될 슬롯을 계산해 소유자 값을 덮어쓰는 원리를 설명한다.
- [Uniswap] V2 Core - UniswapV2ERC20 Solidity ERC-2612 permit이 서명으로 토큰 사용 권한을 갱신하는 구조를 설명한다. 도메인 구분자와 논스, 만료 및 서명 재사용 방지 로직을 테스트한다.
- [Ethernaut] 17. Recovery Solidity 팩토리가 생성한 컨트랙트 주소를 블록 탐색기와 RLP 인코딩으로 찾는 방법을 비교하고, selfdestruct로 잠긴 이더를 회수하는 과정을 다룬다.
- [Ethernaut] 16. Preservation Solidity delegatecall이 호출자의 스토리지 문맥에서 실행되는 특성을 이용해 라이브러리 주소를 바꾸고, 공격 컨트랙트로 소유권을 탈취하는 과정을 설명한다.
- [Ethernaut] 15. Naught Coin Solidity ERC20의 approve와 transferFrom을 이용해 transfer에만 적용된 시간 잠금을 우회하고, 표준 기능에 덧붙인 제한 로직의 허점을 설명한다.
- [Ethernaut] 14. Gatekeeper Two Solidity 생성자 실행 중인 컨트랙트의 코드 크기가 0인 특성과 XOR 연산을 이용해 Gatekeeper의 세 조건을 우회하는 방법을 설명한다.
- RLP (Recursive Length Prefix) 직렬화 이해하기 블록체인 이더리움에서 사용하는 RLP 직렬화의 단일 바이트, 문자열, 중첩 리스트 인코딩 규칙과 길이별 접두사 계산 방식을 예제로 설명한다.
- [Ethernaut] 13. Gatekeeper One Solidity 컨트랙트 호출 구조, 잔여 가스 무차별 대입, 정수 타입 캐스팅으로 Gatekeeper의 세 조건을 통과하는 공격 과정을 단계별로 설명한다.
- [Ethernaut] 12. Privacy Solidity 솔리디티 스토리지의 슬롯 배치와 바이트 타입 캐스팅 방식을 이용해 private 배열 값을 복원하고 컨트랙트의 잠금을 해제한다.
- [Ethernaut] 11. Elevator Solidity 호출할 때마다 다른 값을 반환하는 인터페이스 구현으로 Elevator 상태를 조작하고, 외부 구현을 신뢰한 설계와 함수 책임의 문제를 설명한다.
- [Ethernaut] 10. Re-entrancy Solidity 외부 호출 전에 잔액을 차감하지 않는 취약점을 재진입 공격으로 공략하고, 검사·상태 변경·외부 호출 순서로 방어하는 원칙을 설명한다.
- mdBook을 사용해 markdown 형식의 정적 웹사이트 만들기 개발 부스러기 Rust 환경에 mdBook을 설치해 마크다운 기반 정적 사이트를 만들고, 로컬 실행부터 GitHub Actions를 이용한 페이지 배포와 테스트까지 구성한다.
- [Ethernaut] 9. King Solidity 이더 전송을 거부하는 컨트랙트로 King 게임의 왕권 교체를 막고, 외부 주소로 transfer를 호출하는 로직이 서비스 거부로 이어지는 원리를 다룬다.
- 밑바닥부터 시작하는 비트코인 - 외전2 비트코인 백서 의식의 흐름대로 읽기 블록체인 비트코인 백서의 서론부터 거래, 타임스탬프 서버, 작업증명, 네트워크, 인센티브와 간소화된 결제 검증까지 핵심 논리를 따라 읽는다.
- [Ethernaut] 8. Vault Solidity 이더리움 컨트랙트의 스토리지 슬롯에서 private 비밀번호를 찾아 금고를 해제하며, 퍼블릭 블록체인에서 비밀값을 다루는 한계를 설명한다.
- 밑바닥부터 시작하는 비트코인 - 외전1 네트워크 요청 및 응답 개선 블록체인 Go로 비트코인 피어 메시지를 안정적으로 읽도록 버퍼링과 응답 검증을 개선하고, 블록 헤더와 관심 트랜잭션 수신 문제를 해결한 과정을 다룬다.
- [Ethernaut] 7. Force Solidity 이더리움 컨트랙트의 수신 함수 유무와 관계없이 selfdestruct로 이더를 강제 전송하는 원리와 잔액 기반 조건문의 위험을 설명한다.
- [Ethernaut] 6. Delegation Solidity 함수 선택자를 담은 calldata와 delegatecall을 이용해 소유권을 탈취하고, 호출 컨텍스트와 스토리지 슬롯 배치가 결과에 미치는 영향을 분석한다.
- [Ethernaut] 5. Token Solidity 구버전 Solidity의 정수 언더플로를 이용해 보유량보다 많은 토큰 전송을 통과시키고, 최신 버전의 산술 검사와 차이를 설명한다.
- 밑바닥부터 시작하는 비트코인 - 13장 세그윗 2 블록체인 p2wsh와 p2sh-p2wsh 스크립트의 실행 순서를 구현하고, BIP143 서명해시와 세그윗의 추가 개선 사항을 기존 코드에 반영한다.
- 밑바닥부터 시작하는 비트코인 - 13장 세그윗 1 블록체인 트랜잭션 가변성과 확장성 문제를 중심으로 세그윗 도입 배경을 설명하고, p2wpkh와 p2sh-p2wpkh 스크립트 실행 방식을 다룬다.
- 밑바닥부터 시작하는 비트코인 - 12장 블룸 필터 블록체인 라이트 노드의 관심 주소 노출을 줄이는 BIP37 블룸 필터를 구현하고, 테스트넷에서 머클블록과 관심 트랜잭션을 받는 과정을 다룬다.
- 밑바닥부터 시작하는 비트코인 - 11장 단순 지급 검증 블록체인 머클 부모부터 머클루트까지 트리를 구성하는 방법을 Go로 구현하고, 머클블록을 이용한 비트코인 단순 지급 검증의 원리를 설명한다.
- [Ethernaut] 4. Telephone Solidity tx.origin과 msg.sender가 다르게 평가되는 호출 구조를 이용해 Telephone 컨트랙트의 소유권을 바꾸고, 인증에 생기는 위험을 설명한다.
- 밑바닥부터 시작하는 비트코인 - 10장 네트워킹 블록체인 비트코인 네트워크 메시지의 헤더와 페이로드 형식을 구현하고, 원격 노드와 핸드셰이크한 뒤 블록 헤더를 요청하고 검증하는 과정을 다룬다.
- [Ethernaut] 3. CoinFlip Solidity 블록 해시를 난수처럼 사용한 코인 뒤집기의 예측 가능성을 설명하고, 같은 블록 값을 쓰는 공격 컨트랙트로 연속 승리를 만드는 과정을 다룬다.
- [Ethernaut] 2. Fallout Solidity 구버전 Solidity에서 컨트랙트명과 같은 함수가 생성자로 취급되던 규칙을 짚고, 철자 오류로 노출된 소유권 탈취 과정을 재현한다.
- [Ethernaut] 1. Fallback Solidity fallback과 receive 함수의 호출 조건을 실험하고, 소액 기여 뒤 소유권을 탈취해 컨트랙트 잔액을 인출하는 취약점을 풀이한다.
- [Ethernaut] 0. Hello Ethernaut Solidity Ethernaut 입문 레벨에서 네트워크와 인스턴스를 준비하고, 브라우저 콘솔로 컨트랙트 메서드를 호출해 인증하는 과정을 안내한다.
- Rust 관련 오류 모음 Rust WSL에서 Rust 프로젝트를 실행할 때 발생하는 링커와 pkg-config 오류의 원인을 구분하고, 필요한 시스템 패키지 설치 방법을 기록한다.
2023
- Zola를 사용해 나만의 블로그/포트폴리오 만들기 개발 부스러기 Zola를 설치해 테마 기반 블로그를 빌드하고 로컬 실행과 Vercel 배포를 시도하며, 정적 자산이 적용되지 않은 문제를 기록한다.
- [Rust] stylus를 사용해 Rust로 Arbitrum stylus testnet에 스마트 컨트랙트 배포하기 Rust Rust용 Stylus 도구와 빌드 타깃을 설치하고 프로젝트를 생성한 뒤, 유효성 검사와 가스비 확인을 거쳐 테스트넷에 배포한다.
- WSL에서 Terraform 사용하기 개발 부스러기 WSL에 Terraform과 AWS CLI를 설치하고 자격 증명을 구성한 뒤, 예제 리소스의 초기화와 생성 및 제거 과정을 실행한다.
- [Rust] gRPC 서버 Docker 이미지 빌드 및 docker compose 네트워크 에러 해결 Rust Rust gRPC 서버를 다단계 빌드로 경량화하고, Docker Compose 환경에서 외부 연결이 막힌 원인을 바인딩 주소에서 찾아 해결한다.
- [Rust] tonic-build를 사용해 ProtoBuf 파일 컴파일하기 Rust 리눅스에 Protocol Buffer 컴파일러를 설치하고, Rust 프로젝트에서 tonic-build 설정으로 ProtoBuf 파일을 컴파일한다.
- WSL에서 Github 사용하기 개발 부스러기 WSL에서 SSH 키를 생성해 GitHub에 공개 키를 등록하고, Git 사용자 정보를 설정한 뒤 SSH 경로로 저장소 연결을 테스트한다.
- WSL에서 Go 사용하기 개발 부스러기 WSL에 Go 바이너리와 환경 변수를 설정하고, VSCode 확장과 개발 도구를 설치한 뒤 모듈 생성과 코드 실행까지 확인한다.
- [Go] Polygon ID와 Websocket을 사용한 신원 인증 - 4. 신원 인증 Go KYCAge 자격 증명을 발급받고 Polygon ID 앱에서 증명 토큰을 생성해 서버가 검증하는 신원 인증 절차를 단계별로 설명한다.
- [Go] Polygon ID와 Websocket을 사용한 신원 인증 - 3. 로그인 Go 세션 생성과 QR 코드 요청부터 Polygon ID 토큰 검증까지의 로그인 흐름을 구성하고, 웹소켓으로 인증 상태를 전달한다.
- [Go] Polygon ID와 Websocket을 사용한 신원 인증 - 2. Websocket Go Polygon ID 인증 진행 상태를 전달하기 위해 Go 서버에서 웹소켓 클라이언트, 허브, 메시지 채널과 연결 핸들러를 구현한다.
- [Go] Polygon ID와 Websocket을 사용한 신원 인증 - 1. Polygon ID Go Polygon ID의 DID와 검증 가능한 자격 증명 구조를 설명하고, Go 서버와 웹소켓 기반 로그인 예제의 구성과 변경 사항을 소개한다.
- [Solidity+Go] geth로 스마트 컨트랙트 배포하기 - 7. standard json input을 사용해 배포한 컨트랙트 검증 Solidity Polygon Mumbai에 배포한 컨트랙트의 표준 JSON 입력과 생성자 인수를 구성해 Polygonscan API로 소스 코드를 검증한다.
- [Solidity+Go] geth로 스마트 컨트랙트 배포하기 - 6. 메타데이터를 사용한 standard json input 생성 Solidity 솔리디티 컨트랙트 메타데이터에서 컴파일 설정과 소스 정보를 추출해 검증용 표준 JSON 입력 파일을 생성하고 결과를 테스트한다.
- [Solidity+Go] geth로 스마트 컨트랙트 배포하기 - 5. 이벤트 구독 Solidity geth의 웹소켓 연결로 배포된 토큰 컨트랙트의 전송 이벤트를 구독하고, 발생한 이벤트를 Go 채널에서 실시간으로 수신해 처리한다.
- [Solidity+Go] geth로 스마트 컨트랙트 배포하기 - 4. 배포된 스마트 컨트랙트와 상호작용 Solidity Go와 geth로 배포된 토큰 컨트랙트의 전송 함수를 호출하고, 이벤트 로그와 수신 주소 잔액을 확인하며 트랜잭션 실패 사례를 다룬다.
- [Solidity+Go] geth로 스마트 컨트랙트 배포하기 - 3. 생성된 Go 코드로 스마트 컨트랙트 배포 Solidity 배포 시리즈의 세 번째 단계로, 로컬 테스트넷과 환경 변수를 준비하고 RPC 연결·키 파싱·서명자 생성을 거쳐 Go 코드로 컨트랙트를 배포한다.
- [Solidity+Go] geth로 스마트 컨트랙트 배포하기 - 2. 스마트 컨트랙트로 Go 코드 생성 Solidity 배포 시리즈의 두 번째 단계로, ERC20 컨트랙트를 컴파일해 ABI와 바이너리를 만들고 abigen으로 배포 가능한 Go 바인딩을 생성한다.
- [Solidity+Go] geth로 스마트 컨트랙트 배포하기 - 1. 초기 구성 Solidity geth로 컨트랙트를 배포하는 시리즈의 첫 단계로, Solidity 컴파일러와 abigen을 설치하고 Go·Node 프로젝트와 의존성을 구성한다.
- Chainlink - Data Feeds 개발 부스러기 Chainlink 가격 피드 인터페이스의 주요 조회 함수와 반환값을 설명하고, Sepolia에서 컨트랙트를 배포해 최신 비트코인 가격을 읽는다.
- [백준 / Go] 1124번: 언더프라임 Go 에라토스테네스의 체와 최소 소인수 메모이제이션을 이용해 각 수의 소인수 개수를 구하고, 구간 내 언더프라임을 세는 Go 풀이를 설명한다.
- [백준 / Go] 24040번: 예쁜 케이크 Go 케이크 밑면의 가로와 세로를 정수 인수로 두고, 둘레를 세 색 띠로 같은 수만큼 나눌 수 있는지 판별하는 Go 풀이를 제시한다.
- Foundry 테스트 작성하기 Solidity Solidity로 Foundry 테스트를 작성하는 구조와 실행 규칙을 다루며, 설정 함수, 실패 검증, 함수 이름 관례, 공통 설정 공유 방법을 설명한다.
- Foundry 프로젝트 살펴보기 Solidity Foundry 프로젝트의 생성·빌드·테스트 명령과 디렉터리 구조를 익히고, Git 서브모듈 기반 의존성 설치와 경로 재매핑 방법을 설명한다.
- [백준 / Rust] 17103번: 골드바흐 파티션 Rust 에라토스테네스의 체로 소수를 미리 판별한 뒤, 짝수를 이루는 두 소수의 조합을 중복 없이 세는 Rust 풀이의 원리와 코드를 제시한다.
- [Go] Vault를 사용해 시크릿 저장하고 불러오기 기초 Go Docker Compose로 HashiCorp Vault를 실행하고 Go 클라이언트를 생성해 시크릿을 쓰고 읽는 기본 흐름을 단계별로 구성한다.
- [Go] 우아하게 종료하기 (Graceful shutdown) Go Go HTTP 서버가 종료 시그널을 받았을 때 연결과 자원을 안전하게 정리하도록 채널, 고루틴, 종료 함수를 구성하는 과정을 설명한다.
- [Go] SOLID in Go - 의존 관계 역전 원칙 Go 상위 모듈과 구체 구현의 직접 의존이 만드는 변경 비용을 짚고, Go 인터페이스로 의존 방향을 추상화하는 방법과 주의점을 설명한다.
- Foundry 설치 Solidity 스마트 컨트랙트 개발 도구인 Foundry의 컴파일, 테스트, 배포 기능을 소개한다. 바이너리, Foundryup, 소스 빌드와 도커를 이용한 설치법을 다룬다.
- [백준 / Rust] 3474번: 교수가 된 현우 Rust 팩토리얼 끝에 붙는 0의 개수를 5의 인수 개수로 환산하는 원리를 설명하고, 반복 나눗셈으로 여러 입력을 처리하는 Rust 풀이를 제시한다.
- [백준 / Go] 21920번: 서로소 평균 Go 수열에서 기준값과 최대공약수가 1인 원소만 골라 평균을 계산한다. 유클리드 호제법으로 서로소를 판별하고 합계와 개수로 평균을 구한다.
- [백준 / Go] 11815번: 짝수? 홀수? Go 약수의 개수가 홀수인 수는 완전제곱수라는 성질로 각 입력을 판별한다. 매우 큰 정수를 다루기 위해 Go의 큰 정수 연산을 활용한 풀이를 담았다.
- [백준 / Rust] 10434번: 행복한 소수 Rust 입력한 수가 소수이면서 각 자릿수 제곱합을 반복해 1에 도달하는지 판별한다. 에라토스테네스의 체와 반복 수열의 사이클 검출을 활용한다.
- [백준 / Rust] 6219번: 소수의 자격 Rust 주어진 범위에서 특정 숫자를 포함하는 소수의 개수를 구한다. 에라토스테네스의 체로 소수를 판별하고 문자열 변환으로 숫자 포함 여부를 검사한다.
- [Go] SOLID in Go - 인터페이스 분리 원칙 Go 클라이언트가 쓰지 않는 메서드에 의존하지 않도록 인터페이스를 분리하는 원칙을 설명한다. 복합기와 프린터 예제로 분리와 임베딩의 이점과 주의점을 다룬다.
- [Go] 아파치 카프카를 사용한 간단한 이벤트 기반 서비스 구현 Go Go와 아파치 카프카로 주문 접수와 처리 이벤트를 주고받는 카페 서비스를 구현한다. 토픽, 생산자와 소비자 구성부터 도커 실행 과정까지 다룬다.
- [백준 / Go] 9417번: 최대 GCD Go 각 테스트 케이스에 주어진 정수의 모든 두 수 조합을 순회하며 최대공약수의 최댓값을 구한다. 유클리드 호제법을 적용한 Go 풀이를 담았다.
- [Go] SOLID in Go - 리스코프 치환 원칙 Go 하위 타입이 상위 타입의 행동 규약을 지켜야 하는 리스코프 치환 원칙을 설명한다. 직사각형과 정사각형의 Go 인터페이스 설계를 위반 사례와 비교한다.
- [백준 / Go] 4134번: 다음 소수 Go 주어진 정수 이상인 가장 작은 소수를 찾기 위해 제곱근까지만 약수를 검사하는 이유를 설명한다. 큰 입력에서도 효율적으로 판별하는 Go 풀이를 담았다.
- [Go] gRPC 파헤치기 - 프로토콜 버퍼 (Protocol Buffers) Go gRPC의 기본 직렬화 형식인 프로토콜 버퍼의 특징을 설명한다. 프로토 파일의 문법, 패키지, 열거형, 메시지, 서비스와 주석을 구성하는 방법을 다룬다.
- [Go] SOLID in Go - 개방 폐쇄 원칙 Go 기존 코드를 바꾸지 않고 기능을 확장하는 개방 폐쇄 원칙을 주문과 할인 예제로 설명한다. Go 인터페이스를 적용한 개선과 유지보수상의 이점을 비교한다.
- [백준 / Go] 14490번: 백대열 Go 콜론으로 구분된 두 정수를 최대공약수로 나눠 가장 간단한 비율로 만드는 과정을 설명한다. 유클리드 호제법을 Go로 구현한 풀이를 담았다.
- [Go] gRPC 파헤치기 - gRPC란? Go gRPC가 원격 메서드를 로컬 호출처럼 다루는 방식과 서비스 인터페이스, 서버, 클라이언트 스텁의 역할을 설명한다. 여러 언어와 환경을 연결하는 특징도 다룬다.
- [Go] SOLID in Go - 단일 책임 원칙 Go 생성·저장·불러오기·변환을 한 객체가 맡은 구조를 역할별 함수와 타입으로 분리하며, 단일 책임 원칙이 유지보수성에 주는 이점을 설명한다.
- [백준 / Go] 13909번: 창문 닫기 Go 창문 번호의 약수 개수가 홀수일 때만 마지막에 열린다는 성질을 이용해, 제곱수의 개수로 답을 효율적으로 구하는 수학적 풀이를 설명한다.
- [Go] SOLID in Go - 패키지 Go Go 패키지의 선언과 임포트 방법을 소개하고, 이름의 첫 글자에 따라 외부 공개 범위를 제어해 패키지 수준에서 캡슐화하는 방식을 설명한다.
- [Go] SOLID in Go - 컴포지션 Go Go의 구조체와 인터페이스 임베딩으로 기능을 조합하는 방법을 익히고, 상속보다 컴포지션이 결합도와 치환 가능성에 유리한 이유를 설명한다.
- [Go] 클라우드 디자인 패턴 - 서킷 브레이커 Go 원격 서비스 장애의 전파를 막는 서킷 브레이커의 닫힘·열림·반 열림 상태 전환을 설명하고 직접 만든 Go 구현과 테스트 과정을 다룬다.
- [백준 / Rust] 6220번: Making Change Rust 날마다 달라지는 동전 단위와 목표 금액이 주어질 때 최적의 거스름돈 구성을 찾는 백준 6220번 문제와 Rust 풀이 과정을 다룬다.
- [Go] 컨텍스트(Context) Go Go Context로 작업 취소와 타임아웃, 마감 시점, 요청 범위 값을 전달하는 방법과 취소 원인을 추적하는 관련 API를 설명한다.
- [LeetCode / Go] 2571. Minimum Operations to Reduce an Integer to 0 Go 정수의 이진 표현에서 연속된 1을 덧셈으로 압축한 뒤 남은 비트를 제거하는 그리디 전략으로 최소 연산 횟수를 효율적으로 구한다.
- [Go] SOLID in Go - 인터페이스 Go Go의 암시적 인터페이스 구현 방식과 인터페이스를 통한 느슨한 결합, 서로 다른 구체 타입을 같은 계약으로 다루는 다형성을 설명한다.
- [Solidity] 재진입 공격 예방 기법 Solidity 외부 호출 전에 검사와 상태 변경을 마치는 Checks Effects Interactions 패턴과 뮤텍스로 재진입 공격을 차단하는 방법을 다룬다.
- [Solidity] 재진입 공격 (Reentrancy Attack) Solidity 취약한 출금 함수에 공격 컨트랙트가 반복 진입해 자금을 탈취하는 과정을 따라가며, 외부 호출과 상태 변경 순서가 만드는 위험을 설명한다.
- [Go] SOLID in Go - 구조체와 메서드 Go Go 구조체의 값 복사와 포인터 전달 차이, 값·포인터 리시버를 사용하는 메서드의 동작과 타입에 메서드를 소속시키는 이유를 설명한다.
- [Go] SOLID in Go - SOLID란? Go 낮은 응집도와 높은 결합도가 만드는 설계 문제를 짚고, 다섯 가지 SOLID 원칙을 Go에도 적용할 수 있는 이유를 설명한다.
- [Go] 문자열과 바이트 슬라이스를 상호 변환하는 여러가지 방법 Go Go 문자열과 바이트 슬라이스를 변환하는 타입 변환, 복사, 리플렉션, unsafe 방식을 벤치마크한다. 복사 없는 변환의 성능과 불변성 위험도 비교한다.
- [Go] 잠자는 이발사 문제 Go 잠자는 이발사 문제에서 발생하는 경쟁 상태와 기아 조건을 설명한다. Go의 뮤텍스와 채널로 대기석, 손님 순서, 이발사의 상태를 동기화해 구현한다.
- [Go] 식사하는 철학자들 문제 Go 공유 자원 접근에서 데드락이 생기는 네 가지 조건을 식사하는 철학자 문제로 설명한다. Go의 동기화 도구로 교착 상태를 피하는 구현 방법을 제시한다.
- 밑바닥부터 시작하는 비트코인 - 9장 블록 블록체인 코인베이스 트랜잭션의 구조와 블록 보상 방식을 Go로 구현한다. 블록 헤더를 이루는 버전, 이전 블록 해시, 머클 루트, 타임스탬프와 비트값을 해석한다.
- 밑바닥부터 시작하는 비트코인 - 8장 p2sh 스크립트 블록체인 다중서명 구조와 검증 연산의 동작 및 한계를 바탕으로 P2SH가 필요한 이유를 설명한다. 여러 스크립트 유형의 주소 생성과 서명 검증 로직도 Go로 구현한다.
- 밑바닥부터 시작하는 비트코인 - 중간정리 블록체인 유한체와 타원곡선부터 직렬화, 트랜잭션, 스크립트, 서명 검증과 생성까지 앞선 일곱 장의 핵심 개념과 Go 구현 흐름을 중간 점검한다.
- 밑바닥부터 시작하는 비트코인 - 7장 트랜잭션 검증과 생성 블록체인 비트코인 트랜잭션의 입력 금액과 서명을 검증하는 로직을 Go로 구현한다. 출력과 수수료를 설계해 테스트넷 트랜잭션을 생성하고 전파하는 과정까지 이어간다.
- 밑바닥부터 시작하는 비트코인 - 6장 스크립트 블록체인 비트코인 스크립트의 실행 구조와 주요 연산자를 Go로 구현한다. 스크립트 파싱과 직렬화, 잠금·해제 스크립트 결합, 표준 스크립트와 P2PK까지 다룬다.
- [Go] 깃허브 프로필 최신 블로그 글 목록 자동으로 업데이트하기 Go Go로 블로그 RSS를 읽어 깃허브 프로필 README의 최신 글 목록을 갱신하고, 깃허브 액션으로 변경 사항을 자동 반영하는 과정을 다룬다.
- 밑바닥부터 시작하는 비트코인 - 5장 트랜잭션 블록체인 비트코인 트랜잭션의 버전, 입력, 출력, 록타임 구조와 수수료·UTXO의 관계를 설명하고 직렬화와 파싱 예제를 Go 코드로 구현한다.
- 분산 데이터베이스와 분산 원장 블록체인 분산 데이터베이스의 투명성과 클러스터링·레플리케이션·샤딩 방식을 설명하고, 퍼블릭 블록체인 및 분산 원장과의 차이를 구분한다.
- 밑바닥부터 시작하는 비트코인 - 4장 직렬화 블록체인 비트코인 데이터의 빅엔디언과 리틀엔디언 표현부터 공개키의 SEC 형식, DER 서명, 주소와 WIF의 Base58 부호화까지 Go로 구현한다.
- 밑바닥부터 시작하는 비트코인 - 3장 타원곡선 암호 블록체인 유한체 위 타원곡선의 스칼라 곱셈과 군의 성질을 설명하고, 비트코인 서명에 쓰이는 secp256k1 연산을 Go 타입과 메서드로 구현한다.
- 밑바닥부터 시작하는 비트코인 - 2장 타원곡선 블록체인 2장에서는 비트코인에 쓰이는 타원곡선의 정의와 점 덧셈 성질, 무한원점을 설명하고 Python 예제를 Go 구조체와 메서드로 구현한다.
- 밑바닥부터 시작하는 비트코인 - 1장 유한체 블록체인 비트코인 암호학의 기초인 유한체의 정의와 나머지 연산, 덧셈·뺄셈·곱셈·거듭제곱을 배우고 Python 예제를 Go 구조체와 메서드로 옮긴다.
- 타입스크립트로 블록체인 만들기 in Go Go TypeScript로 작성된 간단한 블록체인을 Go의 구조체와 슬라이스로 옮기며 블록 생성, 해시 계산, 체인 추가 로직의 차이를 비교한다.
- [Trouble Shooting] invalid opcode while deploying Solidity 최신 Solidity로 컴파일한 컨트랙트를 ganache-cli에 배포할 때 생기는 invalid opcode의 원인을 찾고 Ganache 전환 절차를 제시한다.
- 바빌로니아 법 (The Babylonian Method) 개발 부스러기 내장 제곱근 함수 없이 바빌로니아 반복법으로 소수점 둘째 자리까지 근삿값을 구하고, 단순 탐색 방식과 두 방법의 시간·공간 복잡도를 비교한다.
- [Nginx] Reverse Proxy 설정 개발 부스러기 Docker 환경에서 Nginx로 웹 앱을 제공하고 API 요청의 접두사를 제거해 내부 서버로 전달하는 리버스 프록시 구성과 노출 위험을 다룬다.
- [Trouble Shooting] net::ERR_NAME_NOT_RESOLVED 개발 부스러기 React 앱의 요청이 컨테이너가 아닌 브라우저에서 실행돼 Docker Compose 서비스 이름을 해석하지 못한 원인을 추적한다. 포트를 외부에 노출해 해결한다.
- [Go] gRPC서버 요청에 담긴 메타데이터 읽기 개발 부스러기 Go gRPC 요청 컨텍스트에서 메타데이터를 읽어 사용자 에이전트와 클라이언트 IP를 추출하고 재사용 가능한 함수로 구성한다.
- [Effective Go] Names Go Effective Go의 이름 짓기 원칙을 바탕으로 패키지, 접근자, 단일 메서드 인터페이스의 관례를 설명한다. 밑줄 대신 혼합 대문자를 쓰는 규칙과 예외도 다룬다.
- Most Significant Bit Solidity Solidity에서 이분 탐색과 비트 연산으로 정수의 최상위 비트와 최하위 비트 위치를 찾는 함수의 구현 방식과 동작 원리를 다룬다.