블록체인의 시간: 블록 타임스탬프

블록체인의 시간 처리

전통적인 시스템에서는 신뢰할 수 있는 서버가 공식 시간을 제공합니다. 탈중앙화 블록체인에는 신뢰할 수 있는 권위체가 없기 때문에 — 시간은 합의 메커니즘 자체에서 파생되어야 합니다. 블록체인의 각 블록에는 해당 블록을 생성한 채굴자 또는 검증자가 설정한 타임스탬프가 포함됩니다.

비트코인의 블록 타임스탬프

비트코인은 블록 헤더에 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분
    }
}