From 1b50b4e7654a6d34d79dbceb1a7c46812c054708 Mon Sep 17 00:00:00 2001 From: Callum Waters Date: Wed, 20 May 2020 06:33:45 +0200 Subject: [PATCH] lite2: fix pivot height during bisection (#4850) --- lite2/client.go | 4 ++-- lite2/client_test.go | 24 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/lite2/client.go b/lite2/client.go index 5626bc3c9..5c501c154 100644 --- a/lite2/client.go +++ b/lite2/client.go @@ -728,8 +728,8 @@ func (c *Client) bisection( case ErrNewValSetCantBeTrusted: // do add another header to the end of the cache if depth == len(headerCache)-1 { - pivotHeight := (headerCache[depth].sh.Height + trustedHeader. - Height) * bisectionNumerator / bisectionDenominator + pivotHeight := trustedHeader.Height + (headerCache[depth].sh.Height-trustedHeader. + Height)*bisectionNumerator/bisectionDenominator interimHeader, interimVals, err := c.fetchHeaderAndValsAtHeight(pivotHeight) if err != nil { return err diff --git a/lite2/client_test.go b/lite2/client_test.go index d7eb29529..b2b9881a8 100644 --- a/lite2/client_test.go +++ b/lite2/client_test.go @@ -295,6 +295,30 @@ func TestClient_SkippingVerification(t *testing.T) { } }) } + + // start from a large header to make sure that the pivot height doesn't select a height outside + // the appropriate range + veryLargeFullNode := mockp.New(GenMockNode(chainID, 100, 3, 1, bTime)) + h1, err := veryLargeFullNode.SignedHeader(90) + require.NoError(t, err) + c, err := lite.NewClient( + chainID, + lite.TrustOptions{ + Period: 4 * time.Hour, + Height: 90, + Hash: h1.Hash(), + }, + veryLargeFullNode, + []provider.Provider{veryLargeFullNode}, + dbs.New(dbm.NewMemDB(), chainID), + lite.SkippingVerification(lite.DefaultTrustLevel), + ) + require.NoError(t, err) + h, err := c.Update(bTime.Add(100 * time.Minute)) + assert.NoError(t, err) + h2, err := veryLargeFullNode.SignedHeader(100) + require.NoError(t, err) + assert.Equal(t, h, h2) } func TestClient_Cleanup(t *testing.T) {