서명자와 서명 함수 load
signer, signFn := c.signer, c.signFn
직전 블록 스냅샷을 참조해 signer가 서명 권한이 있는지 확인
snap, err := c.snapshot(chain, number-1, header.ParentHash, nil)
// 권한이 없는데 사인하려고 하면 여기서 튕김
if _, authorized := snap.Signers[signer]; !authorized {
return errUnauthorizedSigner
}
서명 주기가 돌아왔는지 확인 (내 순서가 아직 돌아오지 않았다면 돌아올 때 까지 계속 패스)
for seen, recent := range snap.Recents {
// signer가 최근 서명한 명단에 있다면 다른 사람들의 서명을 기다림
if recent == signer {
if limit := uint64(len(snap.Signers)/2 + 1); number < limit || seen > number-limit {
return errors.New("signed recently, must wait for others")
}
}
}
서명을 하기로 결정했다면 resultCh로 송신할 delay를 정하고 서명한다.
delay := time.Unix.(...)
// ...중략
// 서
sighash, err := signFn(accounts.Account{Address: signer}, accounts.MimetypeClique, CliqueRLP(header))
Sealing된 block을 채널로 전송
go func() {
select {
case <- stop:
return
// delay 후 다음 select문 진행
case <- time.After(delay)
}
select {
case results <- block.WithSeal(header)
// ...중략
}
}()
return nil