WIP Removing payloadStore
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
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,
|
||||
}, 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")
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user