From 2526aa8530ca53decf9e0fd9ac85a9bab0502ee1 Mon Sep 17 00:00:00 2001
From: atvanguard <93arpit@gmail.com>
Date: Wed, 20 May 2020 10:08:30 +0530
Subject: [PATCH] wip

---
 consensus/bor/bor.go                | 22 ++++++---
 consensus/bor/bor_test/bor_test.go  | 73 +++++++++++++++++++++++++++++
 consensus/bor/bor_test/genesis.json |  2 +-
 consensus/bor/errors.go             |  2 +-
 4 files changed, 91 insertions(+), 8 deletions(-)

diff --git a/consensus/bor/bor.go b/consensus/bor/bor.go
index 37ae73128..4b1a7ad05 100644
--- a/consensus/bor/bor.go
+++ b/consensus/bor/bor.go
@@ -221,7 +221,7 @@ type Bor struct {
 	lock   sync.RWMutex   // Protects the signer fields
 
 	ethAPI                 *ethapi.PublicBlockChainAPI
-	genesisContractsClient *GenesisContractsClient
+	GenesisContractsClient *GenesisContractsClient
 	validatorSetABI        abi.ABI
 	stateReceiverABI       abi.ABI
 	HeimdallClient         IHeimdallClient
@@ -263,7 +263,7 @@ func New(
 		signatures:             signatures,
 		validatorSetABI:        vABI,
 		stateReceiverABI:       sABI,
-		genesisContractsClient: genesisContractsClient,
+		GenesisContractsClient: genesisContractsClient,
 		HeimdallClient:         heimdallClient,
 	}
 
@@ -1076,11 +1076,11 @@ func (c *Bor) CommitStates(
 	chain chainContext,
 ) error {
 	number := header.Number.Uint64()
-	lastSync, err := c.genesisContractsClient.LastStateSyncTime(number - 1)
+	lastSync, err := c.GenesisContractsClient.LastStateSyncTime(number - 1)
 	if err != nil {
 		return err
 	}
-	_lastStateID, err := c.genesisContractsClient.LastStateId(number - 1)
+	_lastStateID, err := c.GenesisContractsClient.LastStateId(number - 1)
 	if err != nil {
 		return err
 	}
@@ -1088,6 +1088,7 @@ func (c *Bor) CommitStates(
 	from := lastSync
 	to := time.Unix(int64(chain.Chain.GetHeaderByNumber(number-c.config.Sprint).Time), 0)
 	lastStateID := _lastStateID.Uint64()
+	fmt.Println("to Uint64", lastStateID)
 	if !from.Before(to) {
 		return nil
 	}
@@ -1123,12 +1124,19 @@ func (c *Bor) CommitStates(
 		return eventRecords[i].ID < eventRecords[j].ID
 	})
 
+	for _, e := range eventRecords {
+		fmt.Println("here", e.ID)
+	}
+
 	chainID := c.chainConfig.ChainID.String()
 	for _, eventRecord := range eventRecords {
+		fmt.Println(eventRecord.ID, lastStateID)
 		if eventRecord.ID <= lastStateID {
+			fmt.Println("continuiing", lastStateID)
 			continue
 		}
 		if err := validateEventRecord(eventRecord, number, from, to, lastStateID, chainID); err != nil {
+			fmt.Println("breaking", err.Error())
 			log.Error(err.Error())
 			break
 		}
@@ -1143,11 +1151,13 @@ func (c *Bor) CommitStates(
 			c.stateDataFeed.Send(core.NewStateChangeEvent{StateData: &stateData})
 		}()
 
-		if err := c.genesisContractsClient.CommitState(eventRecord, state, header, chain); err != nil {
+		if err := c.GenesisContractsClient.CommitState(eventRecord, state, header, chain); err != nil {
+			fmt.Println("erred", err)
 			return err
 		}
+		lastStateID++
 	}
-	lastStateID++
+	fmt.Println("lastStateID is", lastStateID)
 	return nil
 }
 
diff --git a/consensus/bor/bor_test/bor_test.go b/consensus/bor/bor_test/bor_test.go
index 31db0d17d..dd282c9e5 100644
--- a/consensus/bor/bor_test/bor_test.go
+++ b/consensus/bor/bor_test/bor_test.go
@@ -115,6 +115,72 @@ func TestFetchStateSyncEvents(t *testing.T) {
 	assert.True(t, h.AssertCalled(t, "FetchWithRetry", clerkPath, query2Params))
 }
 
+func TestFetchStateSyncEvents_2(t *testing.T) {
+	init := buildEthereumInstance(t, rawdb.NewMemoryDatabase())
+	chain := init.ethereum.BlockChain()
+	engine := init.ethereum.Engine()
+	_bor := engine.(*bor.Bor)
+
+	// A. Insert blocks for 0th sprint
+	db := init.ethereum.ChainDb()
+	block := init.genesis.ToBlock(db)
+	// Insert sprintSize # of blocks so that span is fetched at the start of a new sprint
+	for i := uint64(1); i < sprintSize; i++ {
+		block = buildNextBlock(t, _bor, chain, block, nil, init.genesis.Config.Bor)
+		insertNewBlock(t, chain, block)
+	}
+
+	// B. Before inserting 1st block of the next sprint, mock heimdall deps
+	// B.1 Mock /bor/span/1
+	res, _ := loadSpanFromFile(t)
+	h := &mocks.IHeimdallClient{}
+	h.On("FetchWithRetry", spanPath, "").Return(res, nil)
+
+	// B.2 Mock State Sync events
+	// read heimdall api response from file
+	res = stateSyncEventsPayload(t)
+	var _eventRecords []*bor.EventRecordWithTime
+	if err := json.Unmarshal(res.Result, &_eventRecords); err != nil {
+		t.Fatalf("%s", err)
+	}
+	sample := _eventRecords[0]
+
+	// First query will be from [0, (block-sprint).Time]
+	// Insert 4 events are in this time range
+	eventRecords := []*bor.EventRecordWithTime{
+		buildStateEvent(sample, 2, 3), // id = 2, time = 3
+		buildStateEvent(sample, 3, 2), // id = 3, time = 2
+		buildStateEvent(sample, 1, 1), // id = 1, time = 1
+		// event with id 4 is missing
+		buildStateEvent(sample, 5, 4), // id = 5, time = 4
+	}
+	_res, _ := json.Marshal(eventRecords)
+	response := bor.ResponseWithHeight{Height: "0"}
+	if err := json.Unmarshal(_res, &response.Result); err != nil {
+		t.Fatalf("%s", err)
+	}
+
+	from := 0
+	to := int64(chain.GetHeaderByNumber(0).Time)
+	page := 1
+	queryParams := fmt.Sprintf(clerkQueryParams, from, to, page)
+	h.On("FetchWithRetry", clerkPath, queryParams).Return(&response, nil)
+
+	page = 2
+	query2Params := fmt.Sprintf(clerkQueryParams, from, to, page)
+	h.On("FetchWithRetry", clerkPath, query2Params).Return(&bor.ResponseWithHeight{}, nil)
+	_bor.SetHeimdallClient(h)
+
+	block = buildNextBlock(t, _bor, chain, block, nil, init.genesis.Config.Bor)
+	insertNewBlock(t, chain, block)
+
+	assert.True(t, h.AssertCalled(t, "FetchWithRetry", spanPath, ""))
+	assert.True(t, h.AssertCalled(t, "FetchWithRetry", clerkPath, queryParams))
+	lastStateID, _ := _bor.GenesisContractsClient.LastStateId(sprintSize)
+	assert.Equal(t, uint64(3), lastStateID.Uint64())
+	fmt.Println("lastStateId after", lastStateID)
+}
+
 func TestOutOfTurnSigning(t *testing.T) {
 	init := buildEthereumInstance(t, rawdb.NewMemoryDatabase())
 	chain := init.ethereum.BlockChain()
@@ -210,3 +276,10 @@ func generateFakeStateSyncEvents(sample *bor.EventRecordWithTime, count int) []*
 	}
 	return events
 }
+
+func buildStateEvent(sample *bor.EventRecordWithTime, id uint64, timeStamp int64) *bor.EventRecordWithTime {
+	event := *sample
+	event.ID = id
+	event.Time = time.Unix(timeStamp, 0)
+	return &event
+}
diff --git a/consensus/bor/bor_test/genesis.json b/consensus/bor/bor_test/genesis.json
index a77b7b79e..93f3cdbd3 100644
--- a/consensus/bor/bor_test/genesis.json
+++ b/consensus/bor/bor_test/genesis.json
@@ -31,7 +31,7 @@
     },
     "0000000000000000000000000000000000001001": {
       "balance": "0x0",
-      "code": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806319494a17146100515780633434735f146100ec5780634c7af28e146101365780635407ca6714610154575b600080fd5b6100d26004803603604081101561006757600080fd5b81019080803590602001909291908035906020019064010000000081111561008e57600080fd5b8201836020820111156100a057600080fd5b803590602001918460018302840111640100000000831117156100c257600080fd5b9091929391929390505050610172565b604051808215151515815260200191505060405180910390f35b6100f461049c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61013e6104b4565b6040518082815260200191505060405180910390f35b61015c6104ba565b6040518082815260200191505060405180910390f35b600073fffffffffffffffffffffffffffffffffffffffe73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101c057600080fd5b60005484101561021b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806109a06027913960400191505060405180910390fd5b83600081905550606061027961027485858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506104c0565b6104ee565b9050600061029a8260008151811061028d57fe5b60200260200101516105cb565b905080600180540114610315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f537461746549647320617265206e6f742073657175656e7469616c000000000081525060200191505060405180910390fd5b60016000815480929190600101919050555060006103468360018151811061033957fe5b602002602001015161063c565b905060606103678460028151811061035a57fe5b602002602001015161065f565b9050610372826106eb565b15610491576000624c4b409050606084836040516024018083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156103cc5780820151818401526020810190506103b1565b50505050905090810190601f1680156103f95780820380516001836020036101000a031916815260200191505b5093505050506040516020818303038152906040527f26c53bea000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060008082516020840160008887f1965050505b505050509392505050565b73fffffffffffffffffffffffffffffffffffffffe81565b60005481565b60015481565b6104c861096b565b600060208301905060405180604001604052808451815260200182815250915050919050565b60606104f982610704565b61050257600080fd5b600061050d83610752565b905060608160405190808252806020026020018201604052801561054b57816020015b610538610985565b8152602001906001900390816105305790505b509050600061055d85602001516107c3565b8560200151019050600080600090505b848110156105be5761057e8361084c565b91506040518060400160405280838152602001848152508482815181106105a157fe5b60200260200101819052508183019250808060010191505061056d565b5082945050505050919050565b60008082600001511180156105e557506021826000015111155b6105ee57600080fd5b60006105fd83602001516107c3565b9050600081846000015103905060008083866020015101905080519150602083101561063057826020036101000a820491505b81945050505050919050565b6000601582600001511461064f57600080fd5b610658826105cb565b9050919050565b6060600082600001511161067257600080fd5b600061068183602001516107c3565b905060008184600001510390506060816040519080825280601f01601f1916602001820160405280156106c35781602001600182028038833980820191505090505b50905060008160200190506106df848760200151018285610904565b81945050505050919050565b600080823b905060008163ffffffff1611915050919050565b6000808260000151141561071b576000905061074d565b60008083602001519050805160001a915060c060ff168260ff1610156107465760009250505061074d565b6001925050505b919050565b6000808260000151141561076957600090506107be565b6000809050600061077d84602001516107c3565b84602001510190506000846000015185602001510190505b808210156107b7576107a68261084c565b820191508280600101935050610795565b8293505050505b919050565b600080825160001a9050608060ff168110156107e3576000915050610847565b60b860ff16811080610808575060c060ff168110158015610807575060f860ff1681105b5b15610817576001915050610847565b60c060ff168110156108375760018060b80360ff16820301915050610847565b60018060f80360ff168203019150505b919050565b6000806000835160001a9050608060ff1681101561086d57600191506108fa565b60b860ff1681101561088a576001608060ff1682030191506108f9565b60c060ff168110156108ba5760b78103600185019450806020036101000a855104600182018101935050506108f8565b60f860ff168110156108d757600160c060ff1682030191506108f7565b60f78103600185019450806020036101000a855104600182018101935050505b5b5b5b8192505050919050565b600081141561091257610966565b5b602060ff1681106109425782518252602060ff1683019250602060ff1682019150602060ff1681039050610913565b6000600182602060ff16036101000a03905080198451168184511681811785525050505b505050565b604051806040016040528060008152602001600081525090565b60405180604001604052806000815260200160008152509056fe417474656d7074696e6720746f2073796e63207374617465732066726f6d207468652070617374a265627a7a72315820d74a9109f80ef82840d3b83791c2edb76ecd1948140aa0c31a0db7ce72393dac64736f6c634300050c0032"
+      "code": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806319494a17146100515780633434735f146100ec5780634c7af28e146101365780635407ca6714610154575b600080fd5b6100d26004803603604081101561006757600080fd5b81019080803590602001909291908035906020019064010000000081111561008e57600080fd5b8201836020820111156100a057600080fd5b803590602001918460018302840111640100000000831117156100c257600080fd5b9091929391929390505050610172565b604051808215151515815260200191505060405180910390f35b6100f4610441565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61013e610459565b6040518082815260200191505060405180910390f35b61015c61045f565b6040518082815260200191505060405180910390f35b600073fffffffffffffffffffffffffffffffffffffffe73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101c057600080fd5b83600081905550606061021e61021985858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050610465565b610493565b9050600061023f8260008151811061023257fe5b6020026020010151610570565b9050806001805401146102ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f537461746549647320617265206e6f742073657175656e7469616c000000000081525060200191505060405180910390fd5b60016000815480929190600101919050555060006102eb836001815181106102de57fe5b60200260200101516105e1565b9050606061030c846002815181106102ff57fe5b6020026020010151610604565b905061031782610690565b15610436576000624c4b409050606084836040516024018083815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610371578082015181840152602081019050610356565b50505050905090810190601f16801561039e5780820380516001836020036101000a031916815260200191505b5093505050506040516020818303038152906040527f26c53bea000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060008082516020840160008887f1965050505b505050509392505050565b73fffffffffffffffffffffffffffffffffffffffe81565b60005481565b60015481565b61046d610910565b600060208301905060405180604001604052808451815260200182815250915050919050565b606061049e826106a9565b6104a757600080fd5b60006104b2836106f7565b90506060816040519080825280602002602001820160405280156104f057816020015b6104dd61092a565b8152602001906001900390816104d55790505b50905060006105028560200151610768565b8560200151019050600080600090505b8481101561056357610523836107f1565b915060405180604001604052808381526020018481525084828151811061054657fe5b602002602001018190525081830192508080600101915050610512565b5082945050505050919050565b600080826000015111801561058a57506021826000015111155b61059357600080fd5b60006105a28360200151610768565b905060008184600001510390506000808386602001510190508051915060208310156105d557826020036101000a820491505b81945050505050919050565b600060158260000151146105f457600080fd5b6105fd82610570565b9050919050565b6060600082600001511161061757600080fd5b60006106268360200151610768565b905060008184600001510390506060816040519080825280601f01601f1916602001820160405280156106685781602001600182028038833980820191505090505b50905060008160200190506106848487602001510182856108a9565b81945050505050919050565b600080823b905060008163ffffffff1611915050919050565b600080826000015114156106c057600090506106f2565b60008083602001519050805160001a915060c060ff168260ff1610156106eb576000925050506106f2565b6001925050505b919050565b6000808260000151141561070e5760009050610763565b600080905060006107228460200151610768565b84602001510190506000846000015185602001510190505b8082101561075c5761074b826107f1565b82019150828060010193505061073a565b8293505050505b919050565b600080825160001a9050608060ff168110156107885760009150506107ec565b60b860ff168110806107ad575060c060ff1681101580156107ac575060f860ff1681105b5b156107bc5760019150506107ec565b60c060ff168110156107dc5760018060b80360ff168203019150506107ec565b60018060f80360ff168203019150505b919050565b6000806000835160001a9050608060ff16811015610812576001915061089f565b60b860ff1681101561082f576001608060ff16820301915061089e565b60c060ff1681101561085f5760b78103600185019450806020036101000a8551046001820181019350505061089d565b60f860ff1681101561087c57600160c060ff16820301915061089c565b60f78103600185019450806020036101000a855104600182018101935050505b5b5b5b8192505050919050565b60008114156108b75761090b565b5b602060ff1681106108e75782518252602060ff1683019250602060ff1682019150602060ff16810390506108b8565b6000600182602060ff16036101000a03905080198451168184511681811785525050505b505050565b604051806040016040528060008152602001600081525090565b60405180604001604052806000815260200160008152509056fea265627a7a72315820517dba64036af56cf58779d5f7ff3abb8279cf161ce9a6ad2c3f7cb1a1f1090764736f6c634300050c0032"
     },
     "0000000000000000000000000000000000001010": {
       "balance": "0x204fce28085b549b31600000",
diff --git a/consensus/bor/errors.go b/consensus/bor/errors.go
index 778a2672b..1a72d42f2 100644
--- a/consensus/bor/errors.go
+++ b/consensus/bor/errors.go
@@ -135,7 +135,7 @@ type InvalidStateReceivedError struct {
 
 func (e *InvalidStateReceivedError) Error() string {
 	return fmt.Sprintf(
-		"Received invalid event %s at block %d. Requested events from %s to %s. lastStateID was %d.\n",
+		"Received invalid event %s at block %d. Requested events from %s to %s. lastStateID was %d.",
 		e.Event,
 		e.Number,
 		e.From.Format(time.RFC3339),
-- 
GitLab