// ChainConfig는 블록 체인 설정을 결정하는 핵심 구성입니다.
//
// ChainConfig는 블록에 따라 데이터베이스에 저장됩니다. 이는
// 제네시스 블록으로 식별되는 모든 네트워크는 자체 설정을 가질 수 있음을 의미합니다.
type ChainConfig struct {
ChainID *big.Int `json:"chainId"` // chainId는 현재 체인을 식별하고 재생 방지를 위해 사용됩니다.
HomesteadBlock *big.Int `json:"homesteadBlock,omitempty"` // Homestead 전환 블록 (nil = 포크 없음, 0 = 이미 홈스테드)
DAOForkBlock *big.Int `json:"daoForkBlock,omitempty"` // TheDAO 하드 포크 전환 블록 (nil = 포크 없음)
DAOForkSupport bool `json:"daoForkSupport,omitempty"` // 노드가 DAO 하드 포크를 지원하거나 반대하는지 여부
// EIP150 implements the Gas price changes (https://github.com/ethereum/EIPs/issues/150)
EIP150Block *big.Int `json:"eip150Block,omitempty"` // EIP150 HF 블록 (nil = 포크 없음)
EIP155Block *big.Int `json:"eip155Block,omitempty"` // EIP155 HF 블록
EIP158Block *big.Int `json:"eip158Block,omitempty"` // EIP158 HF 블록
ByzantiumBlock *big.Int `json:"byzantiumBlock,omitempty"` // Byzantium 전환 블록 (nil = 포크 없음, 0 = 이미 byzantium)
ConstantinopleBlock *big.Int `json:"constantinopleBlock,omitempty"` // Constantinople 전환 블록 (nil = 포크 없음, 0 = 이미 constantinople)
PetersburgBlock *big.Int `json:"petersburgBlock,omitempty"` // Petersburg 전환 블록 (nil = constantinople과 동일)
IstanbulBlock *big.Int `json:"istanbulBlock,omitempty"` // Istanbul 전환 블록 (nil = 포크 없음, 0 = 이미 istanbul)
MuirGlacierBlock *big.Int `json:"muirGlacierBlock,omitempty"` // Eip-2384 (난이도 폭탄 지연) 스위치 블록 (nil = 포크 없음, 0 = 이미 활성화됨)
BerlinBlock *big.Int `json:"berlinBlock,omitempty"` // Berlin 스위치 블록 (nil = 포크 없음, 0 = 이미 berlin)
LondonBlock *big.Int `json:"londonBlock,omitempty"` // London 스위치 블록 (nil = 포크 없음, 0 = 이미 london)
ArrowGlacierBlock *big.Int `json:"arrowGlacierBlock,omitempty"` // Eip-4345 (난이도 폭탄 지연) 스위치 블록 (nil = 포크 없음, 0 = 이미 활성화됨)
GrayGlacierBlock *big.Int `json:"grayGlacierBlock,omitempty"` // Eip-5133 (난이도 폭탄 지연) 스위치 블록 (nil = 포크 없음, 0 = 이미 활성화됨)
MergeNetsplitBlock *big.Int `json:"mergeNetsplitBlock,omitempty"` // The Merge 이후의 가상 포크를 네트워크 분할기로 사용
// 포크 스케줄링은 블록에서 타임 스탬프로 전환되었습니다.
ShanghaiTime *uint64 `json:"shanghaiTime,omitempty"` // Shanghai 스위치 시간 (nil = 포크 없음, 0 = 이미 shanghai)
CancunTime *uint64 `json:"cancunTime,omitempty"` // Cancun 스위치 시간 (nil = 포크 없음, 0 = 이미 cancun)
PragueTime *uint64 `json:"pragueTime,omitempty"` // Prague 스위치 시간 (nil = 포크 없음, 0 = 이미 prague)
VerkleTime *uint64 `json:"verkleTime,omitempty"` // Verkle 스위치 시간 (nil = 포크 없음, 0 = 이미 verkle)
// TerminalTotalDifficulty는 컨센서스 업그레이드를 트리거하는 네트워크가 도달한 총 난이도량입니다.
TerminalTotalDifficulty *big.Int `json:"terminalTotalDifficulty,omitempty"`
// TerminalTotalDifficultyPassed는 네트워크가 이미 터미널 총 난이도를 통과했음을 지정하는 플래그입니다.
// 그 목적은 TTD를 로컬로 보지 않고도 레거시 동기화를 비활성화하는 것입니다(장기적으로 안전함).
TerminalTotalDifficultyPassed bool `json:"terminalTotalDifficultyPassed,omitempty"`
// 다양한 컨센서스 엔진
Ethash *EthashConfig `json:"ethash,omitempty"`
Clique *CliqueConfig `json:"clique,omitempty"`
}