mirror of
https://github.com/aljazceru/ark.git
synced 2025-12-18 20:54:20 +01:00
* Fixes * Fixes to domain layer: * Add Leaf bool field to know to fix the returned list of leaves * Add non-persisted UnsignedForfeitTxs to RoundFinalizationStarted * Store only error msg when round fails instead of full error * Fix wallet interface: * Add Close() to close conn with wallet * Add GetAsset() to fix missing asset err when calling Transfer() * Fix gocron scheduler to correctly run/build the project * Fix badger repo implementation: * Fix datadirs of projection stores * Return error if current round not found * Fix round event deserialization * Fix TxBuilder interface & dummy impl: * Pass asp pubkey as arg of the defined functions * Fix connectorsToInputArgs to return the right number of ins * Fix getTxid() to return the id of an hex encoded tx too * Fix createConnectors() to return a tx if there's only 1 connector * Add leaf bool field to psetWithLevel in case a leaf is not in the last level * Fix node's isLeaf() check * Move to hex encoded pubkeys instead of ark encoded * Fix app layer: * Add Start() and Stop() to the interface & Expect raw pubkeys instead of strings as args * Source & cache pubkey from wallet at startup * Drop usage of scheduler and schedule next task based on occurred round events * Increase verbosity * Use hex instead of ark encoding to store receveirs' pubkeys * Lower faucet amount from 100k to 10k sats in total * Fix finalizeRound() to persist round events even if it failed * Add view() to forfeitTxMap to enrich RoundFinalizationEvent with unsigned forfeit txs * Add app config * Fix interface layer: * Remove repo manager from handler factory * Fix GetEventStream to forward events to stream once they arrive from app layer * Return missing unsigned forfeit txs in RoundFinalizationEvent * Fix extracting user pubkey from address * Add log interceptors * Add config struct * Add factory * Clean interface * Add config and launcher * Tidy deps & Set defaut round interval to 30secs for dev mode
117 lines
2.5 KiB
Go
117 lines
2.5 KiB
Go
package badgerdb
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/ark-network/ark/internal/core/domain"
|
|
"github.com/dgraph-io/badger/v4"
|
|
"github.com/dgraph-io/badger/v4/options"
|
|
"github.com/timshannon/badgerhold/v4"
|
|
)
|
|
|
|
func createDB(dbDir string, logger badger.Logger) (*badgerhold.Store, error) {
|
|
isInMemory := len(dbDir) <= 0
|
|
|
|
opts := badger.DefaultOptions(dbDir)
|
|
opts.Logger = logger
|
|
|
|
if isInMemory {
|
|
opts.InMemory = true
|
|
} else {
|
|
opts.Compression = options.ZSTD
|
|
}
|
|
|
|
db, err := badgerhold.Open(badgerhold.Options{
|
|
Encoder: badgerhold.DefaultEncode,
|
|
Decoder: badgerhold.DefaultDecode,
|
|
SequenceBandwith: 100,
|
|
Options: opts,
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if !isInMemory {
|
|
ticker := time.NewTicker(30 * time.Minute)
|
|
|
|
go func() {
|
|
for {
|
|
<-ticker.C
|
|
if err := db.Badger().RunValueLogGC(0.5); err != nil && err != badger.ErrNoRewrite {
|
|
logger.Errorf("%s", err)
|
|
}
|
|
}
|
|
}()
|
|
}
|
|
|
|
return db, nil
|
|
}
|
|
|
|
func serializeEvents(events []domain.RoundEvent) (*eventsDTO, error) {
|
|
rawEvents := make([][]byte, 0, len(events))
|
|
for _, event := range events {
|
|
buf, err := serializeEvent(event)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
rawEvents = append(rawEvents, buf)
|
|
}
|
|
return &eventsDTO{rawEvents}, nil
|
|
}
|
|
|
|
func deserializeEvents(rawEvents [][]byte) ([]domain.RoundEvent, error) {
|
|
events := make([]domain.RoundEvent, 0)
|
|
for _, buf := range rawEvents {
|
|
event, err := deserializeEvent(buf)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
events = append(events, event)
|
|
}
|
|
return events, nil
|
|
}
|
|
|
|
func serializeEvent(event domain.RoundEvent) ([]byte, error) {
|
|
switch eventType := event.(type) {
|
|
default:
|
|
return json.Marshal(eventType)
|
|
}
|
|
}
|
|
|
|
func deserializeEvent(buf []byte) (domain.RoundEvent, error) {
|
|
{
|
|
var event = domain.RoundFailed{}
|
|
if err := json.Unmarshal(buf, &event); err == nil && len(event.Err) > 0 {
|
|
return event, nil
|
|
}
|
|
}
|
|
{
|
|
var event = domain.RoundFinalized{}
|
|
if err := json.Unmarshal(buf, &event); err == nil && len(event.Txid) > 0 {
|
|
return event, nil
|
|
}
|
|
}
|
|
{
|
|
var event = domain.RoundFinalizationStarted{}
|
|
if err := json.Unmarshal(buf, &event); err == nil && len(event.CongestionTree) > 0 {
|
|
return event, nil
|
|
}
|
|
}
|
|
{
|
|
var event = domain.PaymentsRegistered{}
|
|
if err := json.Unmarshal(buf, &event); err == nil && len(event.Payments) > 0 {
|
|
return event, nil
|
|
}
|
|
}
|
|
{
|
|
var event = domain.RoundStarted{}
|
|
if err := json.Unmarshal(buf, &event); err == nil && event.Timestamp > 0 {
|
|
return event, nil
|
|
}
|
|
}
|
|
|
|
return nil, fmt.Errorf("unknown event")
|
|
}
|