Elizabeth/aura (#18)

* added bootnodes to bootnodes.go and added authorities array to GoerliChainConfig in params/config.go

* Seal() returns errUnauthorized if not authorized to sign block

* verifySeal now checks if signer of block was correct signer at that turn
This commit is contained in:
noot 2018-09-08 08:42:34 -07:00 committed by GitHub
parent 2cf98eb934
commit ba563eb96c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 51 additions and 33 deletions

View file

@ -454,27 +454,35 @@ func (a *Aura) verifySeal(chain consensus.ChainReader, header *types.Header, par
return errUnknownBlock return errUnknownBlock
} }
// Retrieve the snapshot needed to verify this header and cache it // Retrieve the snapshot needed to verify this header and cache it
snap, err := a.snapshot(chain, number-1, header.ParentHash, parents) // snap, err := a.snapshot(chain, number-1, header.ParentHash, parents)
if err != nil { // if err != nil {
return err // return err
} // }
// Resolve the authorization key and check against signers // Resolve the authorization key and check against signers
signer, err := ecrecover(header, a.signatures) signer, err := ecrecover(header, a.signatures)
if err != nil { if err != nil {
return err return err
} }
if _, ok := snap.Signers[signer]; !ok {
ts := header.Time.Uint64()
step := ts % a.config.Period
turn := step % uint64(len(a.config.Authorities))
if signer != a.config.Authorities[turn] {
// not authorized to sign
return errUnauthorized return errUnauthorized
} }
for seen, recent := range snap.Recents { // if _, ok := snap.Signers[signer]; !ok {
if recent == signer { // return errUnauthorized
// Signer is among recents, only fail if the current block doesn't shift it out // }
if limit := uint64(len(snap.Signers)/2 + 1); seen > number-limit { // for seen, recent := range snap.Recents {
return errUnauthorized // if recent == signer {
} // // Signer is among recents, only fail if the current block doesn't shift it out
} // if limit := uint64(len(snap.Signers)/2 + 1); seen > number-limit {
} // return errUnauthorized
// }
// }
// }
// Ensure that the difficulty corresponds to the turn-ness of the signer // Ensure that the difficulty corresponds to the turn-ness of the signer
//inturn := snap.inturn(header.Number.Uint64(), signer) //inturn := snap.inturn(header.Number.Uint64(), signer)
//if inturn && header.Difficulty.Cmp(diffInTurn) != 0 { //if inturn && header.Difficulty.Cmp(diffInTurn) != 0 {
@ -591,24 +599,34 @@ func (a *Aura) Seal(chain consensus.ChainReader, block *types.Block, results cha
signer, signFn := a.signer, a.signFn signer, signFn := a.signer, a.signFn
a.lock.RUnlock() a.lock.RUnlock()
// Bail out if we're unauthorized to sign a block
snap, err := a.snapshot(chain, number-1, header.ParentHash, nil) // check if authorized to sign
if err != nil { step := uint64(time.Now().Unix()) % a.config.Period
return err turn := step % uint64(len(a.config.Authorities))
} if a.signer != a.config.Authorities[turn] {
if _, authorized := snap.Signers[signer]; !authorized { // not authorized to sign
return errUnauthorized return errUnauthorized
} }
// If we're amongst the recent signers, wait for the next block
for seen, recent := range snap.Recents { // Bail out if we're unauthorized to sign a block
if recent == signer { // snap, err := a.snapshot(chain, number-1, header.ParentHash, nil)
// Signer is among recents, only wait if the current block doesn't shift it out // if err != nil {
if limit := uint64(len(snap.Signers)/2 + 1); number < limit || seen > number-limit { // return err
log.Info("Signed recently, must wait for others") // }
return nil // if _, authorized := snap.Signers[signer]; !authorized {
} // return errUnauthorized
} // }
} // // If we're amongst the recent signers, wait for the next block
// for seen, recent := range snap.Recents {
// if recent == signer {
// // Signer is among recents, only wait if the current block doesn't shift it out
// if limit := uint64(len(snap.Signers)/2 + 1); number < limit || seen > number-limit {
// log.Info("Signed recently, must wait for others")
// return nil
// }
// }
// }
// Sweet, the protocol permits us to sign the block, wait for our time // Sweet, the protocol permits us to sign the block, wait for our time
delay := time.Unix(header.Time.Int64(), 0).Sub(time.Now()) // nolint: gosimple delay := time.Unix(header.Time.Int64(), 0).Sub(time.Now()) // nolint: gosimple
//if header.Difficulty.Cmp(diffNoTurn) == 0 { //if header.Difficulty.Cmp(diffNoTurn) == 0 {

View file

@ -92,10 +92,10 @@ var (
ByzantiumBlock: big.NewInt(0), ByzantiumBlock: big.NewInt(0),
ConstantinopleBlock: nil, ConstantinopleBlock: nil,
Aura: &AuraConfig{ Aura: &AuraConfig{
Period: 15, Period: 4,
Epoch: 30000, Epoch: 30000,
Authorities: []string{ Authorities: []common.Address{
"0x540a9fe3d2381016dec8ffba7235c6fb00b0f942", common.HexToAddress("0x540a9fe3d2381016dec8ffba7235c6fb00b0f942"),
}, },
Difficulty: big.NewInt(131072), Difficulty: big.NewInt(131072),
}, },
@ -166,7 +166,7 @@ type CliqueConfig struct {
type AuraConfig struct { type AuraConfig struct {
Period uint64 `json:"period"` // Number of seconds between blocks to enforce Period uint64 `json:"period"` // Number of seconds between blocks to enforce
Epoch uint64 `json:"epoch"` // Epoch length to reset votes and checkpoint Epoch uint64 `json:"epoch"` // Epoch length to reset votes and checkpoint
Authorities []string `json:"authorities"` // list of addresses of authorities Authorities []common.Address `json:"authorities"` // list of addresses of authorities
Difficulty *big.Int `json:"difficulty"` // Constant block difficulty Difficulty *big.Int `json:"difficulty"` // Constant block difficulty
} }