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
+}