dir : consensus/clique/clique.go
parent block을 가져와 parent 자체, 블록 생성 간격 검증
var parent *types.Header
if len(parents) > 0 {
// 앞의 함수에서 줬으면 그 중 마지막 == 가장 최근 블록 header
parent = parents[len(parents)-1]
} else {
// 앞의 함수에서 이전 header 정보를 주지 않았다면 chain에서 가져옴
parents = chain.GetHeader(header.Parenthash, number - 1)
}
// parent가 없거나 유효하지 않다면 에러
if parent == nil || parent.Number.Uint64() != number -1 || parent.Hash != header.Parenthash {
return consensus.ErrUnknownAncestor
}
if parent.TIme + c.config.Period > header.Time {
return errInvalidTimestamp
}
가스 사용량 점검 ( gasLimit보다 gas 사용량이 많으면 에러)
if header.Gasused > header.GasLimit {
return fmt.Errorf(...)
}
basefee, gas limit check
// 런던 포크 이전 블럭인지 여부 확인
if !chain.Config().IsLondon(header.Number) {
// London 포크 이전까지는 BaseFee라는 개념 자체가 없다. 있다면 에러
if header.BaseFee != nil {
return fmt.Errorf(...)
}
// gaslimit이 너무 크거나 작지 않은지 검증
if err := misc.VerifyGasLimit(parent.GasLimit, header.GasLimit); err != nil {
return err
}
// 런던 포크 이후 블록이라면 따로 검증 함수를 호출한다.
} else if err := misc.VerifyEip1559Header(chain.Config(), parent, header); err != nil {
// Verify the header's EIP-1559 attributes.
// > dir : consensus/misc/eip1559.go
return err
}
나머지 검증 과정에 필요한 sanpshot을 가져온다.
snap, err := c.snapshot(chain, number-1, header.ParentHash, parents)
checkpoint block이라면 signer 목록을 검증
if number%c.config.Epoch == 0 {
signers := make([]byte, len(snap.Signers)*common.AddressLength)
for i, signer := range snap.signers() {
copy(signers[i*common.AddressLength:], signer[:])
}
// ...중략
}