diff --git a/core/interfaces.go b/core/interfaces.go index 84db750..5be4bc5 100644 --- a/core/interfaces.go +++ b/core/interfaces.go @@ -5,24 +5,13 @@ import ( ) type EntryStore interface { - Append(ctx context.Context, entry Entry) error - Get(ctx context.Context, entryID EntryID) (Entry, error) - GetBySeq(ctx context.Context, ledgerID LedgerID, seq uint64) (Entry, error) - Delete(ctx context.Context, entryID EntryID) error - - Head(ctx context.Context, ledgerID LedgerID) (EntryID, error) - HeadSeq(context.Context, LedgerID) (uint64, error) - Tail(ctx context.Context, ledgerID LedgerID) (EntryID, error) - Iterator(ctx context.Context, ledgerLedgerID, startSeq uint64) (EntryIterator, error) + Put(ctx context.Context, id EntryID, canonical []byte) error + Get(ctx context.Context, id EntryID) ([]byte, error) + Has(ctx context.Context, id EntryID) (bool, error) } -type EntryIterator interface { - Next() bool - Entry() Entry -} - -type PayloadStore interface { - Put(ctx context.Context, payload []byte) (PayloadID, error) - Get(ctx context.Context, payloadID PayloadID) ([]byte, error) - Delete(ctx context.Context, payloadID PayloadID) error +type ReferenceStore interface { + GetRef(ctx context.Context, name string) (EntryID, bool, error) + SetRef(ctx context.Context, name string, entryID EntryID) (bool, error) + RemoveRef(ctx context.Context, name string) error } diff --git a/core/ledger.go b/core/ledger.go index 72891fe..73b26cb 100644 --- a/core/ledger.go +++ b/core/ledger.go @@ -1,107 +1,14 @@ package core -import ( - "context" - "time" - - "github.com/google/uuid" - "lukechampine.com/blake3" -) +import () type Ledger struct { - LedgerID LedgerID - - entryStore EntryStore - payloadStore PayloadStore - - hashChaining bool + entryStore EntryStore + referenceStore ReferenceStore } -func NewLedger(entryStore EntryStore, payloadStore PayloadStore) (*Ledger, error) { - id, err := uuid.NewV7() - if err != nil { - return nil, err - } - - idByes, err := id.MarshalBinary() - if err != nil { - return nil, err - } - +func NewLedger(entryStore EntryStore) (*Ledger, error) { return &Ledger{ - LedgerID: LedgerID(idByes), - entryStore: entryStore, - payloadStore: payloadStore, + entryStore: entryStore, }, nil } - -func (l *Ledger) ID() LedgerID { - return l.LedgerID -} - -func (l *Ledger) Head() (Entry, error) { - panic("unimplemented") -} - -func (l *Ledger) Append(ctx context.Context, payload []byte) (EntryID, error) { - payloadDigest := blake3.Sum256(payload) - payloadID, err := l.payloadStore.Put(ctx, payload) - if err != nil { - return EntryID{}, err - } - - entryID, err := uuid.NewV7() - entryIDBytes, err := entryID.MarshalBinary() - if err != nil { - return EntryID{}, err - } - - head, err := l.Head() - if err != nil { - return EntryID{}, err - } - - entry := Entry{ - EntryID: EntryID(entryIDBytes), - LedgerID: l.LedgerID, - Seq: head.Seq + 1, - Timestamp: time.Now(), - PayloadID: payloadID, - PayloadDigest: payloadDigest, - } - - entryHash := HashEntry(entry) - entry.EntryHash = entryHash - - err = l.entryStore.Append(ctx, entry) - if err != nil { - return EntryID{}, err - } - - return EntryID(entryIDBytes), nil -} - -func (l *Ledger) Get(ctx context.Context, seq uint64) (Entry, []byte, error) { - entry, err := l.entryStore.GetBySeq(ctx, l.LedgerID, seq) - if err != nil { - return Entry{}, nil, err - } - payload, err := l.payloadStore.Get(ctx, entry.PayloadID) - if err != nil { - return Entry{}, nil, err - } - - return entry, payload, nil -} - -func (l *Ledger) GetEntry(ctx context.Context, seq uint64) (Entry, error) { - panic("unimplemented") -} - -func (l *Ledger) GetPayload(ctx context.Context, seq uint64) ([]byte, error) { - panic("unimplemented") -} - -func (l *Ledger) Iter(ctx context.Context, startSeq uint64) (EntryIterator, error) { - panic("unimplemented") -} diff --git a/core/types.go b/core/types.go index 030b7a0..4d9af37 100644 --- a/core/types.go +++ b/core/types.go @@ -1,51 +1,16 @@ package core import ( - "encoding/binary" "time" - - "lukechampine.com/blake3" ) -type LedgerID [16]byte -type EntryID [16]byte -type PayloadID [16]byte - -type Hash32 [32]byte +type EntryID [32]byte type Entry struct { EntryID EntryID - LedgerID LedgerID - Seq uint64 + Previous []EntryID Timestamp time.Time - - PayloadID PayloadID - PayloadDigest Hash32 - - PreviousHash Hash32 - EntryHash Hash32 -} - -func HashEntry(e Entry) Hash32 { - b := make([]byte, 0, 128) - - b = append(b, "chron.entry.v1"...) - b = append(b, e.LedgerID[:]...) - - var buf [8]byte - binary.LittleEndian.PutUint64(buf[:], e.Seq) - b = append(b, buf[:]...) - - binary.LittleEndian.PutUint64(buf[:], uint64(e.Timestamp.UTC().UnixNano())) - b = append(b, buf[:]...) - - b = append(b, e.EntryID[:]...) - b = append(b, e.PayloadID[:]...) - b = append(b, e.PayloadDigest[:]...) - b = append(b, e.PreviousHash[:]...) - - sum := blake3.Sum256(b) - return Hash32(sum) + Payload []byte }