Skip to content

Commit

Permalink
always write index data for VDR, never check on duplicate
Browse files Browse the repository at this point in the history
  • Loading branch information
woutslakhorst committed May 10, 2023
1 parent 5d02975 commit ca9dc7e
Show file tree
Hide file tree
Showing 7 changed files with 83 additions and 59 deletions.
13 changes: 13 additions & 0 deletions network/dag/dag_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -451,3 +451,16 @@ func TestDAG_getHighestClock(t *testing.T) {
})
})
}

func TestShit(t *testing.T) {
t.Run("19537", func(t *testing.T) {
s := "\xa9^T\xdf\x86I\xf9\xa3\xfft\x9db\xdd\"(jG\x80\r\xd0\xb5Q\xaf\xe7\n\xea\x8d\x80\xd3s\x86\xc8+Y~\xb7\x95v\xb6\xf0\xd58]\x8dB\xffWd_=\a\x03Z\x17\xcb\x84\xc8\xc7n\xac\xb6\xde\xea'\x7fUZ \x17\x1cc\xd2\xf4N\x1dpL\xe1+J\xe1\x92\x0f\x0b\xcaE\x04\xb3\x8e\x8e{\x1b\x9bZ\xe3_\x04}/Y\xc5\x12\x922M\xa7\xe9\x9a`'h\xe2\xf5#\x92\xee\xd5N\xbf\xab 9\xd2\x96pw\x1e\x9a\x9b\x14R\x9d\xdfE\xa6c%\x99e\xc5sa\x9b\x9e\xe0A \xba\xc6j\xf9X\x9ac\x8e(\xa0\xa4\xb4 x\xa8\x9e\x8c\x11\x8a\x05\xc9\xc6Dp\xec\xf7+\xcb\xd5\xfbw M\x12\xb0\x82K\xb3\xbe\x86\xa7F1\x13\x88\xfe4\xbd\x06\xab\x03\x97\x91\xc6\xf0\x02\xd4\xb7\xf8\x8b\x94\x96\xd4\x94(\x17\xbf\xaf\xe6\xe0f\xdb\xe2\xfe\xcd\x17t"
l := parseHashList([]byte(s))
assert.Len(t, l, 1)
})
t.Run("19538", func(t *testing.T) {
s := "\x15\x004\xe6\x10S\b\x95\xb6\x0c\xf3$B\x94\x17\x82m#\r\xc8\x18P\x8er}\xf7$\xb1\xb3j\x04\xa1\x8d\xf1`w\x951d4\xac\xe5\xc3\xe4\x13\"\xc2E\x8b\xdb\x9c\r\xece\xb9n\xc8\xe5+\xde_~\xff\xb7\x19\x0b\xf1k\xae\x81\xed\x8c\xc5\xe0\xde\xe0J\xd4C\b\xc1\x06~\xb7\xbfI\x9b\x1d*2\xdd\xf4\xe1\x9f\xfc\xcd\xee=\x861\x82\x7f4\xca\x9c\x05\x96\xcb\r\x05\xc0\x9a9\xe3k\bi\xf2\xbb\xda>\xddZ\x9c\x13\x85Jz\xe8\xa1\xbc4\xc2JZ\xdc28x\xf0\x83\xe8\xb6\x18\x9a}3\xfeQi\xd5\xac\x1b\xe1\x9e\"8\xcb\xe1\xbe\x1dxu\x0f&\x9e\x95\x94\xb8\xd8\xc0p\xe3\b\xd9\xdd\x89\x1fe\xe1\xed\xe6_-\x92'\xd8\xb8\xa8\xe4\x0b3\xee7^\xc4uyYl\xd3\aF\xcd\bi\x8e}]\xe5\xf1\xd5\xd3\x15\x91\x17\x1aHn\x86\xd3\x8bH\xfe"
l := parseHashList([]byte(s))
assert.Len(t, l, 1)
})
}
14 changes: 14 additions & 0 deletions vdr/didstore/event.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,11 @@ func (e event) before(other event) bool {
return e.Ref.Compare(other.Ref) < 0
}

// equal returns true when event.Ref are equal.
func (e event) equal(other event) bool {
return e.Ref.Equals(other.Ref)
}

// eventList is an in-memory representation of an Events shelf entry
type eventList struct {
Events []event `json:"events"`
Expand Down Expand Up @@ -92,3 +97,12 @@ func (el *eventList) insert(newEvent event) int {
el.Events = newList
return index
}

func (el *eventList) contains(newEvent event) bool {
for _, e := range el.Events {
if e.equal(newEvent) {
return true
}
}
return false
}
15 changes: 15 additions & 0 deletions vdr/didstore/event_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -113,3 +113,18 @@ func TestEventList_insert(t *testing.T) {
assert.Equal(t, sha2s, el.Events[2].Ref)
})
}

func TestEventList_contains(t *testing.T) {
t.Run("false", func(t *testing.T) {
el := eventList{}

assert.False(t, el.contains(event{Ref: sha0s}))
})

t.Run("true", func(t *testing.T) {
el := eventList{}
el.insert(event{Ref: sha0s})

assert.True(t, el.contains(event{Ref: sha0s}))
})
}
9 changes: 0 additions & 9 deletions vdr/didstore/reader.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,12 +88,3 @@ func readEventList(tx stoabs.ReadTx, id did.DID) (eventList, error) {
}
return el, nil
}

func transactionExists(tx stoabs.ReadTx, ref hash.SHA256Hash) (bool, error) {
txReader := tx.GetShelfReader(transactionIndexShelf)
bytes, err := txReader.Get(stoabs.HashKey(ref))
if err != nil && !errors.Is(err, stoabs.ErrKeyNotFound) {
return false, err
}
return len(bytes) > 0, nil
}
35 changes: 0 additions & 35 deletions vdr/didstore/reader_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,38 +96,3 @@ func Test_readEventList(t *testing.T) {
require.NoError(t, err)
})
}

func Test_transactionExists(t *testing.T) {
store := NewTestStore(t)

t.Run("false", func(t *testing.T) {
err := store.db.Read(context.Background(), func(tx stoabs.ReadTx) error {
dup, _ := transactionExists(tx, hash.RandomHash())

assert.False(t, dup)

return nil
})
require.NoError(t, err)
})

t.Run("true", func(t *testing.T) {
transaction := newTestTransaction(did.Document{})

err := store.db.Write(context.Background(), func(tx stoabs.WriteTx) error {
txShelf := tx.GetShelfWriter(transactionIndexShelf)
_ = txShelf.Put(stoabs.HashKey(transaction.Ref), []byte{0})
return nil
})
require.NoError(t, err)

err = store.db.Read(context.Background(), func(tx stoabs.ReadTx) error {
dup, _ := transactionExists(tx, transaction.Ref)

assert.True(t, dup)

return nil
})
require.NoError(t, err)
})
}
25 changes: 10 additions & 15 deletions vdr/didstore/store.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,12 +77,6 @@ func (tl *store) Configure(_ core.ServerConfig) (err error) {
func (tl *store) Add(didDocument did.Document, transaction Transaction) error {
// prevents parallel execution
err := tl.db.Write(context.Background(), func(tx stoabs.WriteTx) error {
if exists, err := transactionExists(tx, transaction.Ref); err != nil {
return err
} else if exists {
return nil
}

currentEventList, err := readEventList(tx, didDocument.ID)
if err != nil {
return fmt.Errorf("read eventList failed: %w", err)
Expand All @@ -95,15 +89,16 @@ func (tl *store) Add(didDocument did.Document, transaction Transaction) error {
}

transaction.document = &didDocument
index := currentEventList.insert(event(transaction))
var base *event
applyList := currentEventList.Events[index:]
if index > 0 {
base = &currentEventList.Events[index-1]
}

if err = applyFrom(tx, base, applyList); err != nil {
return fmt.Errorf("applying event list failed: %w", err)
if !currentEventList.contains(event(transaction)) {
index := currentEventList.insert(event(transaction))
var base *event
applyList := currentEventList.Events[index:]
if index > 0 {
base = &currentEventList.Events[index-1]
}
if err = applyFrom(tx, base, applyList); err != nil {
return fmt.Errorf("applying event list failed: %w", err)
}
}
return writeEventList(tx, currentEventList, didDocument.ID)
}, stoabs.WithWriteLock())
Expand Down
31 changes: 31 additions & 0 deletions vdr/didstore/store_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,37 @@ func TestStore_Add(t *testing.T) {
})
})

t.Run("duplicate ok", func(t *testing.T) {
store := NewTestStore(t)

require.NoError(t, store.Add(create, txCreate))
require.NoError(t, store.Add(create, txCreate))

err := store.db.ReadShelf(context.Background(), metadataShelf, func(reader stoabs.Reader) error {
metaBytes, err := reader.Get(stoabs.BytesKey(fmt.Sprintf("%s0", testDID.String())))
if err != nil {
return err
}
metadata := documentMetadata{}
err = json.Unmarshal(metaBytes, &metadata)
if err != nil {
return err
}

assert.Equal(t, txCreate.SigningTime.Unix(), metadata.Created.Unix())
assert.Equal(t, txCreate.SigningTime.Unix(), metadata.Updated.Unix())
assert.Nil(t, metadata.PreviousHash)
assert.Equal(t, txCreate.PayloadHash, metadata.Hash)
assert.Nil(t, metadata.PreviousTransaction)
assert.Equal(t, []hash.SHA256Hash{txCreate.Ref}, metadata.SourceTransactions)
assert.Equal(t, 0, metadata.Version)
assert.Equal(t, false, metadata.Deactivated)

return nil
})
require.NoError(t, err)
})

t.Run("update ok", func(t *testing.T) {
store := NewTestStore(t)

Expand Down

0 comments on commit ca9dc7e

Please sign in to comment.