diff --git a/internal/bfa/node.go b/internal/bfa/node.go
index ad5e71e4110263ef25cf6ee95f5698ffeb142289..7c85a16b63841118d570e2a1d3ec3d0be71b01a2 100644
--- a/internal/bfa/node.go
+++ b/internal/bfa/node.go
@@ -159,16 +159,23 @@ func (node *Node) HeaderByHash(hash common.Hash) (header Header) {
 	return
 }
 
+func (node *Node) BlockSigner(blockNumber int64) (signer Address) {
+	if blockNumber > 0 {
+		signer = node.SnapshotAtBlock(blockNumber).Recents[uint64(blockNumber)]
+	}
+	return
+}
+
 func (node *Node) BlockByNumber(blockNumber int64) (block Block) {
 	node.Call(&block, "eth_getBlockByNumber", hexBlockNumber(blockNumber), true)
-	block.Signer = block.GetSigner()
+	block.Signer = node.BlockSigner(blockNumber)
 	block.Hash = block.GetHash()
 	return
 }
 
 func (node *Node) BlockByHash(hash common.Hash) (block Block) {
 	node.Call(&block, "eth_getBlockByHash", hash, true)
-	block.Signer = block.GetSigner()
+	block.Signer = node.BlockSigner(block.Number.Int64())
 	block.Hash = block.GetHash()
 	return
 }
@@ -179,15 +186,7 @@ func (node *Node) BlockTransactionCount(blockNumber int64) (count int64) {
 	return int64(num)
 }
 
-func (node *Node) BlockSigner(blockNumber int64) (signer Address) {
-	if blockNumber == 0 { // we return an empty signer for genesis block
-		return
-	}
-	header := node.HeaderByNumber(blockNumber)
-	return header.GetSigner()
-}
-
-func (node *Node) GetSnapshot() (snapshot Snapshot) {
+func (node *Node) Snapshot() (snapshot Snapshot) {
 	node.Call(&snapshot, "clique_getSnapshot", nil)
 	return
 }
@@ -241,7 +240,6 @@ func (node *Node) IsSealerAtBlock(address Address, blockNumber int64) bool {
 
 func (node *Node) Propose(address Address, vote bool) {
 	node.Call(nil, "clique_propose", address.String(), vote)
-	return
 }
 
 func (node *Node) Votes(blockNumber int64) (votes Proposals) {
@@ -249,7 +247,7 @@ func (node *Node) Votes(blockNumber int64) (votes Proposals) {
 		snapshot Snapshot
 	)
 	if blockNumber < 0 {
-		snapshot = node.GetSnapshot()
+		snapshot = node.Snapshot()
 	} else {
 		snapshot = node.SnapshotAtBlock(blockNumber)
 	}
@@ -319,7 +317,10 @@ func (node *Node) SealersStatus(blockNumber int64) (status map[Address]*SealerSt
 	blockNumber = block.Number.Int64()
 	until := Max(1, blockNumber-SealerRounds*notSeen)
 	for notSeen > 0 {
-		signer := block.GetSigner()
+		signer := node.BlockSigner(blockNumber)
+		if _, ok := status[signer]; !ok {
+			panic("Unknown signer")
+		}
 		if status[signer].LastBlock == 0 {
 			status[signer].LastBlock = block.Number.Int64()
 			status[signer].Time = uint64(block.Time)