From a4be27641a547f10b02cd9834bc5d9fcf15707d4 Mon Sep 17 00:00:00 2001
From: venkatesh mankena <venkateshmankena@venkateshs-MacBook-Air.local>
Date: Fri, 20 Sep 2019 14:39:09 +0530
Subject: [PATCH] udpated bor.go to fetch firstEndBlock

---
 consensus/bor/bor.go | 47 ++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 43 insertions(+), 4 deletions(-)

diff --git a/consensus/bor/bor.go b/consensus/bor/bor.go
index db645d54d..d301d0fa9 100644
--- a/consensus/bor/bor.go
+++ b/consensus/bor/bor.go
@@ -32,7 +32,7 @@ import (
 	"golang.org/x/crypto/sha3"
 )
 
-const validatorsetABI = `[{"constant":true,"inputs":[],"name":"getInitialValidators","outputs":[{"name":"","type":"address[]"},{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getValidators","outputs":[{"name":"","type":"address[]"},{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"}]`
+const validatorsetABI = `[{"constant":true,"inputs":[{"name":"span","type":"uint256"}],"name":"getSpan","outputs":[{"name":"number","type":"uint256"},{"name":"startBlock","type":"uint256"},{"name":"endBlock","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"span","type":"uint256"},{"name":"signer","type":"address"}],"name":"isProducer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"vote","type":"bytes"},{"name":"sigs","type":"bytes"},{"name":"txBytes","type":"bytes"},{"name":"proof","type":"bytes"}],"name":"commitSpan","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"span","type":"uint256"},{"name":"signer","type":"address"}],"name":"isValidator","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"left","type":"bytes32"},{"name":"right","type":"bytes32"}],"name":"innerNode","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"span","type":"uint256"}],"name":"getValidatorsTotalStakeBySpan","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"rootHash","type":"bytes32"},{"name":"leaf","type":"bytes32"},{"name":"proof","type":"bytes"}],"name":"checkMembership","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"CHAIN","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"span","type":"uint256"},{"name":"signer","type":"address"}],"name":"getValidatorBySigner","outputs":[{"components":[{"name":"id","type":"uint256"},{"name":"power","type":"uint256"},{"name":"signer","type":"address"}],"name":"result","type":"tuple"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"currentSpanNumber","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"d","type":"bytes32"}],"name":"leafNode","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"getNextSpan","outputs":[{"name":"number","type":"uint256"},{"name":"startBlock","type":"uint256"},{"name":"endBlock","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getInitialValidators","outputs":[{"name":"","type":"address[]"},{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FIRST_END_BLOCK","outputs":[{"name":"","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"name":"producers","outputs":[{"name":"id","type":"uint256"},{"name":"power","type":"uint256"},{"name":"signer","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"span","type":"uint256"},{"name":"dataHash","type":"bytes32"},{"name":"sigs","type":"bytes"}],"name":"getStakePower","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ROUND_TYPE","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"span","type":"uint256"}],"name":"getProducersTotalStakeBySpan","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"BOR_ID","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentSpan","outputs":[{"name":"number","type":"uint256"},{"name":"startBlock","type":"uint256"},{"name":"endBlock","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"sprint","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getValidators","outputs":[{"name":"","type":"address[]"},{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"spanNumbers","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"vote","type":"bytes"},{"name":"sigs","type":"bytes"},{"name":"txBytes","type":"bytes"},{"name":"proof","type":"bytes"}],"name":"validateValidatorSet","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"VOTE_TYPE","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"name":"validators","outputs":[{"name":"id","type":"uint256"},{"name":"power","type":"uint256"},{"name":"signer","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"currentSprint","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"spans","outputs":[{"name":"number","type":"uint256"},{"name":"startBlock","type":"uint256"},{"name":"endBlock","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"id","type":"uint256"},{"indexed":true,"name":"startBlock","type":"uint256"},{"indexed":true,"name":"endBlock","type":"uint256"}],"name":"NewSpan","type":"event"}]`
 
 const (
 	voteSnapshotInterval = 1024 // Number of blocks after which to save the vote snapshot to the database
@@ -776,14 +776,53 @@ func (c *Bor) GetCurrentValidators(number uint64) ([]*Validator, error) {
 func GetValidators(number uint64, sprint uint64, validatorContract string, ethAPI *ethapi.PublicBlockChainAPI) ([]*Validator, error) {
 	blockNr := rpc.BlockNumber(number)
 
+	// validator set ABI
+	validatorSetABI, _ := abi.JSON(strings.NewReader(validatorsetABI))
+
+	// First End block
+	getFirstEndBlock := func() (firstEndBlock uint64, err error) {
+		data, err := validatorSetABI.Pack("FIRST_END_BLOCK")
+		if err != nil {
+			fmt.Println("Unable to pack tx for getValidator", "error", err)
+			return firstEndBlock, err
+		}
+
+		ctx, cancel := context.WithCancel(context.Background())
+		defer cancel() // cancel when we are finished consuming integers
+
+		// call
+		msgData := (hexutil.Bytes)(data)
+		toAddress := common.HexToAddress(validatorContract)
+		gas := (hexutil.Uint64)(uint64(math.MaxUint64 / 2))
+		result, err := ethAPI.Call(ctx, ethapi.CallArgs{
+			Gas:  &gas,
+			To:   &toAddress,
+			Data: &msgData,
+		}, blockNr)
+		if err != nil {
+			fmt.Println("err", err)
+			return firstEndBlock, err
+		}
+
+		if err := validatorSetABI.Unpack(&firstEndBlock, "FIRST_END_BLOCK", result); err != nil {
+			fmt.Println("err", err)
+			return firstEndBlock, err
+		}
+		return firstEndBlock, nil
+
+	}
+
+	firstEndBlock, err := getFirstEndBlock()
+	if err != nil {
+		panic(err)
+	}
+
 	// method
 	method := "getValidators"
-	if number < sprint {
+	if number < uint64(firstEndBlock) {
 		method = "getInitialValidators"
 	}
 
-	// validator set ABI
-	validatorSetABI, _ := abi.JSON(strings.NewReader(validatorsetABI))
 	data, err := validatorSetABI.Pack(method)
 	if err != nil {
 		fmt.Println("Unable to pack tx for getValidator", "error", err)
-- 
GitLab