https://secureum.substack.com/p/solidity-101
76. blockhash 접근 제한
핵심 내용
- blockhash(uint blockNumber) 함수는 모든 블록 해시를 제공하지 않음
- 이유:
- 이더리움 네트워크의 확장성(Scalability) 문제 때문
- 전체 블록 해시를 항상 저장하는 것은 비용과 자원 낭비 → 노드의 저장/처리 부담 증가
- 제한 사항:
- 최근 256개 블록의 해시만 조회 가능
- 현재 블록은 조회 불가 (즉, block.number 값은 사용할 수 없음)
- 256 블록 이전의 블록 해시를 요청하면 0 반환
bytes32 recentHash = blockhash(block.number - 1); // ✅ 가능 (이전 블록)
bytes32 oldHash = blockhash(block.number - 300); // ❌ 0 반환
bytes32 currentHash = blockhash(block.number); // ❌ 0 반환
주의점
- 랜덤 생성에 사용 금지
- 마이너가 최근 블록 데이터를 어느 정도 조작 가능
- 256블록 제한 고려
- 약 256블록 × 12초 = 약 51분 전까지의 블록만 접근 가능 → 장기 데이터 추적에는 부적합
- 과거 데이터 필요 시
- 블록체인 이벤트 로그(Log) 또는 외부 저장소(예: IPFS, DB)에 기록해 직접 보관해야 함
참고
blockhash는 주로 직전 블록의 데이터 무결성 확인이나 단기 게임 로직 등에만 유효하며,
장기 기록·랜덤성·보안이 중요한 용도에는 적합하지 않음.