블록체인의 시간 처리
전통적인 시스템에서는 신뢰할 수 있는 서버가 공식 시간을 제공합니다. 탈중앙화 블록체인에는 신뢰할 수 있는 권위체가 없기 때문에 — 시간은 합의 메커니즘 자체에서 파생되어야 합니다. 블록체인의 각 블록에는 해당 블록을 생성한 채굴자 또는 검증자가 설정한 타임스탬프가 포함됩니다.
비트코인의 블록 타임스탬프
비트코인은 블록 헤더에 Unix 타임스탬프(32비트)를 저장합니다. 규칙은 느슨합니다:
- 최근 11개 블록의 중앙값(Median Time Past)보다 커야 함
- 수신 노드의 현재 시간 기준 2시간 이내여야 함
- 이 범위 내에서 채굴자는 어떤 타임스탬프도 설정 가능
이더리움의 블록 시간
이더리움은 블록 헤더에 Unix 타임스탬프를 사용합니다. 지분증명(PoS, 머지 이후) 전환으로 슬롯이 12초로 고정되어 더 예측 가능한 블록 시간을 제공합니다:
// Solidity — block.timestamp 접근
contract TimeLock {
uint256 public unlockTime;
// 경고: block.timestamp는 검증자가 ~15초 내에서 조작 가능
// 분 단위 미만 정밀도에 사용 금지
modifier afterUnlock() {
require(block.timestamp >= unlockTime, "Too early");
_;
}
}
타임스탬프 조작 취약점
채굴자/검증자가 블록 타임스탬프를 설정하므로, 허용 범위 내에서 조작할 수 있습니다. 이는 타임스탬프 조작 취약점이라 불리며 다음과 같은 스마트 컨트랙트에 영향을 미칩니다:
- 난수 생성 (쉽게 악용 가능)
- 15분 미만의 잠금 기간
- 타임스탬프 기반 복권 컨트랙트
블록 타임스탬프의 안전한 사용
- 안전한 경우: 시간 또는 일 단위로 측정되는 기한 (예: "30일 후 잠금 해제")
- 위험한 경우: 초 또는 분 단위 기한 — 대신 블록 번호 사용
// 더 안전: 짧은 잠금 기간에 블록 번호 사용
contract ShortLock {
uint256 public unlockBlock;
constructor() {
unlockBlock = block.number + 50; // 12s/블록 기준 ~10분
}
}