diff --git a/bfa_client/src/clique/clique.go b/bfa_client/src/clique/clique.go new file mode 100644 index 0000000000000000000000000000000000000000..f4aa9c23f9b2efc0539bfcee9ff26c1652859bff --- /dev/null +++ b/bfa_client/src/clique/clique.go @@ -0,0 +1,44 @@ +package clique + +import ( + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/crypto/sha3" + "github.com/ethereum/go-ethereum/rlp" + "../util" +) + +func sigHash(header *types.Header) (hash common.Hash) { + hasher := sha3.NewKeccak256() + + rlp.Encode(hasher, []interface{}{ + header.ParentHash, + header.UncleHash, + header.Coinbase, + header.Root, + header.TxHash, + header.ReceiptHash, + header.Bloom, + header.Difficulty, + header.Number, + header.GasLimit, + header.GasUsed, + header.Time, + header.Extra[:len(header.Extra)-65], // Yes, this will panic if extra is too short + header.MixDigest, + header.Nonce, + }) + hasher.Sum(hash[:0]) + return hash +} + +func GetSigner(header *types.Header) (signer string, err error) { + signature := header.Extra[len(header.Extra)-65:] + hash := sigHash(header).Bytes() + pubkey, err := crypto.Ecrecover(hash, signature) + address := make([]byte, 20) + copy(address, crypto.Keccak256(pubkey[1:])[12:]) + signer = util.ToHex(address) + return +}