Skip to content

Commit d48505f

Browse files
Bug fixes for hybrid model (#162)
* tweaks to logs and updating sockets * fixing bugs found while testing hybrid model * adding compat mode to tidy command
1 parent 9cf6ac9 commit d48505f

25 files changed

+97
-257
lines changed

Makefile

+1-1
Original file line numberDiff line numberDiff line change
@@ -81,4 +81,4 @@ stop-compose:
8181
@docker-compose down
8282

8383
vendor-deps:
84-
@go mod tidy && go mod vendor
84+
@go mod tidy -compat=1.17 && go mod vendor

cmd/internal/dependencies.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,11 @@ func SetupRestDeps(cfg *config.Config, l log.Logger, db *sqlx.DB, c *client.Clie
5151
sqlLiteStore := paydSQL.NewSQLiteStore(db)
5252
proofSvc := service.NewProofsService(sqlLiteStore)
5353

54-
pcSvc := service.NewPeerChannelsSvc(sqlLiteStore, cfg.PeerChannels)
54+
pcSvc := service.NewPeerChannelsSvc(sqlLiteStore, cfg.PeerChannels, &paydSQL.Transacter{})
5555
pcNotifSvc := service.NewPeerChannelsNotifyService(cfg.PeerChannels, pcSvc)
5656
pcNotifSvc.RegisterHandler(payd.PeerChannelHandlerTypeProof, proofSvc)
5757

58-
mapiStore := mapi.NewMapi(cfg.Mapi, mapiCli)
58+
mapiStore := mapi.NewMapi(cfg.Mapi, mapiCli, l)
5959
spvv, err := spv.NewPaymentVerifier(dataHttp.NewHeaderSVConnection(&http.Client{Timeout: time.Duration(cfg.HeadersClient.Timeout) * time.Second}, cfg.HeadersClient.Address))
6060
if err != nil {
6161
l.Fatal(err, "failed to create spv client")
@@ -138,10 +138,10 @@ func SetupSocketDeps(cfg *config.Config, l log.Logger, db *sqlx.DB, c *client.Cl
138138
}
139139
sqlLiteStore := paydSQL.NewSQLiteStore(db)
140140
proofSvc := service.NewProofsService(sqlLiteStore)
141-
pcSvc := service.NewPeerChannelsSvc(sqlLiteStore, cfg.PeerChannels)
141+
pcSvc := service.NewPeerChannelsSvc(sqlLiteStore, cfg.PeerChannels, &paydSQL.Transacter{})
142142
pcNotifSvc := service.NewPeerChannelsNotifyService(cfg.PeerChannels, pcSvc)
143143
pcNotifSvc.RegisterHandler(payd.PeerChannelHandlerTypeProof, proofSvc)
144-
mapiStore := mapi.NewMapi(cfg.Mapi, mapiCli)
144+
mapiStore := mapi.NewMapi(cfg.Mapi, mapiCli, l)
145145
spvv, err := spv.NewPaymentVerifier(dataHttp.NewHeaderSVConnection(&http.Client{Timeout: time.Duration(cfg.HeadersClient.Timeout) * time.Second}, cfg.HeadersClient.Address))
146146
if err != nil {
147147
l.Fatal(err, "failed to create spv client")

cmd/internal/internal.go

+12-3
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,24 @@ import (
2424
"github.com/pkg/errors"
2525
"github.com/spf13/viper"
2626
echoSwagger "github.com/swaggo/echo-swagger"
27+
"github.com/theflyingcodr/sockets"
2728
"github.com/theflyingcodr/sockets/client"
2829
smw "github.com/theflyingcodr/sockets/middleware"
2930
"github.com/theflyingcodr/sockets/server"
3031
)
3132

3233
// SetupEcho will set up and return an echo server.
33-
func SetupEcho(l log.Logger) *echo.Echo {
34+
func SetupEcho(cfg *config.Config, l log.Logger) *echo.Echo {
3435
e := echo.New()
3536
e.HideBanner = true
3637

3738
// Middleware
3839
e.Use(middleware.Recover())
39-
e.Use(middleware.Logger())
40+
e.Use(middleware.LoggerWithConfig(middleware.LoggerConfig{
41+
Skipper: func(c echo.Context) bool {
42+
return cfg.Logging.Level != config.LogDebug
43+
},
44+
}))
4045
e.Use(middleware.RequestID())
4146
e.Use(middleware.CORSWithConfig(middleware.CORSConfig{
4247
AllowOrigins: []string{"*"},
@@ -72,10 +77,14 @@ func SetupHTTPEndpoints(cfg config.Config, services *RestDeps, g *echo.Group) {
7277

7378
// SetupSocketClient will setup handlers and socket server.
7479
func SetupSocketClient(cfg config.Config, deps *SocketDeps, c *client.Client) {
80+
lcfg := smw.NewLoggerConfig()
81+
lcfg.AddSkipper(func(msg *sockets.Message) bool {
82+
return cfg.Logging.Level != config.LogDebug
83+
})
7584
c.WithMiddleware(smw.PanicHandler,
7685
smw.Timeout(smw.NewTimeoutConfig()),
7786
smw.Metrics(),
78-
smw.Logger(smw.NewLoggerConfig()),
87+
smw.Logger(lcfg),
7988
socMiddleware.IgnoreMyMessages(cfg.Socket),
8089
socMiddleware.WithAppIDPayD()).
8190
WithErrorHandler(socMiddleware.ErrorHandler).

cmd/server/main.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ func main() {
7575
// nolint:errcheck // dont care about error.
7676
defer db.Close()
7777

78-
e := internal.SetupEcho(log)
78+
e := internal.SetupEcho(cfg, log)
7979

8080
if cfg.Server.SwaggerEnabled {
8181
internal.SetupSwagger(*cfg.Server, e)

config/defaults.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ func SetupDefaults() {
2727

2828
// db
2929
viper.SetDefault(EnvDb, "sqlite")
30-
viper.SetDefault(EnvDbDsn, "file:data/wallet.db?_foreign_keys=true&pooled=true")
30+
viper.SetDefault(EnvDbDsn, "file:data/wallet.db?_foreign_keys=true&pooling=true")
3131
viper.SetDefault(EnvDbSchema, "data/sqlite/migrations")
3232
viper.SetDefault(EnvDbMigrate, true)
3333

data/http/dpp.go

+5-4
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"context"
66
"encoding/json"
77
"errors"
8+
"fmt"
89
"net/http"
910

1011
"github.com/libsv/go-dpp"
@@ -68,15 +69,17 @@ func (p *dppClient) PaymentSend(ctx context.Context, args payd.PayRequest, req d
6869
_ = resp.Body.Close()
6970
}()
7071

71-
if resp.StatusCode != http.StatusCreated && resp.StatusCode != http.StatusNoContent {
72+
if resp.StatusCode != http.StatusCreated && resp.StatusCode != http.StatusNoContent && resp.StatusCode != http.StatusUnprocessableEntity {
7273
return nil, p.handleErr(resp)
7374
}
7475

7576
var ack dpp.PaymentACK
7677
if err := json.NewDecoder(resp.Body).Decode(&ack); err != nil {
7778
return nil, err
7879
}
79-
80+
if ack.Error > 0 {
81+
return nil, errs.NewErrUnprocessable(fmt.Sprintf("%d", ack.Error), ack.Memo)
82+
}
8083
return &ack, nil
8184
}
8285

@@ -87,11 +90,9 @@ func (p *dppClient) handleErr(resp *http.Response) error {
8790
Title string `json:"title"`
8891
Message string `json:"message"`
8992
}{}
90-
9193
if err := json.NewDecoder(resp.Body).Decode(&errResp); err != nil {
9294
return err
9395
}
94-
9596
switch resp.StatusCode {
9697
case http.StatusUnauthorized:
9798
return errs.NewErrNotAuthenticated(errResp.Code, errResp.Message)

data/mapi/mapi.go

+5-2
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,19 @@ import (
1010

1111
"github.com/libsv/payd"
1212
"github.com/libsv/payd/config"
13+
"github.com/libsv/payd/log"
1314
)
1415

1516
type minercraftMapi struct {
1617
client *minercraft.Client
1718
cfg *config.MApi
1819
fq *bt.FeeQuote
20+
l log.Logger
1921
}
2022

2123
// NewMapi will setup and return a new MAPI minercraftMapi data store.
22-
func NewMapi(cfg *config.MApi, client *minercraft.Client) *minercraftMapi {
23-
return &minercraftMapi{client: client, cfg: cfg, fq: bt.NewFeeQuote()}
24+
func NewMapi(cfg *config.MApi, client *minercraft.Client, l log.Logger) *minercraftMapi {
25+
return &minercraftMapi{client: client, cfg: cfg, fq: bt.NewFeeQuote(), l: l}
2426
}
2527

2628
// Broadcast will submit a transaction to mapi for inclusion in a block.
@@ -52,6 +54,7 @@ func (m *minercraftMapi) Broadcast(ctx context.Context, args payd.BroadcastArgs,
5254
// This should be fixed in MAPI not here, long term.
5355
return nil
5456
}
57+
m.l.Debugf("failed to submit transaction with hex: %s", tx.String())
5558
return errors.Errorf("failed to submit transaction %s", resp.Results.ResultDescription)
5659
}
5760

data/sqlite/peerchannels.go

+9-2
Original file line numberDiff line numberDiff line change
@@ -103,13 +103,20 @@ func (s *sqliteStore) PeerChannelsOpened(ctx context.Context, channelType payd.P
103103
}
104104

105105
func (s *sqliteStore) PeerChannelCloseChannel(ctx context.Context, channelID string) error {
106-
if _, err := s.db.NamedExecContext(ctx, sqlPeerChannelsCloseUpdate, struct {
106+
tx, err := s.newTx(ctx)
107+
if err != nil {
108+
return errors.Wrapf(err, "failed to close peer channel sql")
109+
}
110+
defer func() {
111+
_ = rollback(ctx, tx)
112+
}()
113+
if _, err := tx.NamedExecContext(ctx, sqlPeerChannelsCloseUpdate, struct {
107114
ChannelID string `db:"channel_id"`
108115
}{
109116
ChannelID: channelID,
110117
}); err != nil {
111118
return errors.Wrapf(err, "failed to close channel %s", channelID)
112119
}
113120

114-
return nil
121+
return errors.Wrap(commit(ctx, tx), "failed to commit transaction for peerChannelClose")
115122
}

data/sqlite/sqlite.go

+4-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ func commit(ctx context.Context, tx *sqlx.Tx) error {
4343
return nil
4444
}
4545
}
46-
4746
return tx.Commit()
4847
}
4948

@@ -119,6 +118,10 @@ type Tx struct {
119118

120119
// WithTxContext will add a new empty transaction to the provided context.
121120
func WithTxContext(ctx context.Context) context.Context {
121+
tx := TxFromContext(ctx)
122+
if tx != nil {
123+
return ctx
124+
}
122125
return context.WithValue(ctx, exec, &Tx{})
123126
}
124127

data/sqlite/transaction.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ func (s *sqliteStore) TransactionCreate(ctx context.Context, req payd.Transactio
7070
// insert tx and utxos
7171
if err := handleNamedExec(tx, sqlTransactionCreate, req); err != nil {
7272
var sqlErr sqlite3.Error
73-
if ok := errors.As(err, sqlErr); ok {
73+
if ok := errors.As(err, &sqlErr); ok {
7474
if sqlErr.Code == sqlite3.ErrConstraint {
7575
return lathos.NewErrDuplicate("D001", "transaction has already been stored")
7676
}

data/sqlite/utxo.go

+9-3
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,9 @@ func (s *sqliteStore) UTXOReserve(ctx context.Context, req payd.UTXOReserve) ([]
4747
if err != nil {
4848
return nil, errors.Wrap(err, "error creation transaction to get utxos")
4949
}
50-
50+
defer func() {
51+
_ = rollback(ctx, tx)
52+
}()
5153
timestamp := time.Now().UTC()
5254
var utxos []payd.UTXO
5355
for total := uint64(0); total <= req.Satoshis; {
@@ -79,7 +81,9 @@ func (s *sqliteStore) UTXOUnreserve(ctx context.Context, req payd.UTXOUnreserve)
7981
if err != nil {
8082
return errors.Wrap(err, "error creation transaction to get utxos")
8183
}
82-
84+
defer func() {
85+
_ = rollback(ctx, tx)
86+
}()
8387
if _, err = tx.ExecContext(ctx, sqlUTXOUnreserve, time.Now().UTC(), req.ReservedFor); err != nil {
8488
return errors.Wrap(err, "failed to unreserve utxos")
8589
}
@@ -93,7 +97,9 @@ func (s *sqliteStore) UTXOSpend(ctx context.Context, req payd.UTXOSpend) error {
9397
if err != nil {
9498
return errors.Wrap(err, "failed to create transaction to spend utxos")
9599
}
96-
100+
defer func() {
101+
_ = rollback(ctx, tx)
102+
}()
97103
req.Timestamp = time.Now().UTC()
98104
if err := handleNamedExec(tx, sqlUTXOSpend, req); err != nil {
99105
return errors.Wrap(err, "failed to mark utxos as spent")

docker-compose.faucet.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ services:
88
LOG_LEVEL: "info"
99
DPP_HOST: "wss://faucet.bitcoinsv.io/dpp/ws"
1010
MAPI_CALLBACK_HOST: "http://faucet.bitcoinsv.io/dpp"
11-
PEERCHANNELS_HOST: "faucet.bitcoinsv.io/peerchannels"
11+
PEERCHANNELS_HOST: 'faucet.bitcoinsv.io/peerchannels'
1212
WALLET_SPVREQUIRED: 'false'
1313
volumes:
1414
- ./run/regtest/payd:/paydb

docker-compose.yml

+4-4
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ services:
55
container_name: payd
66
image: local.payd
77
environment:
8-
DB_DSN: "file:paydb/wallet.db?cache=shared&_foreign_keys=true"
8+
DB_DSN: "file:paydb/wallet.db?_foreign_keys=true&pooling=true"
99
DB_SCHEMA_PATH: "migrations"
1010
LOG_LEVEL: "info"
1111
DPP_HOST: "ws://dpp:8445/ws"
@@ -27,13 +27,13 @@ services:
2727
container_name: payd-merchant
2828
image: local.payd
2929
environment:
30-
DB_DSN: "file:paydb/merchant-wallet.db?cache=shared&_foreign_keys=true"
30+
DB_DSN: "file:paydb/merchant-wallet.db?_foreign_keys=true&pooling=true"
3131
DB_SCHEMA_PATH: "migrations"
3232
SERVER_HOST: payd-merchant:28443
3333
SERVER_PORT: :28443
3434
LOG_LEVEL: "info"
35-
DPP_HOST: "ws://dpp-merchant:28445/ws"
36-
MAPI_CALLBACK_HOST: "http://dpp-merchant:28445"
35+
DPP_HOST: "ws://dpp:8445/ws"
36+
MAPI_CALLBACK_HOST: "http://dpp:8445"
3737
PEERCHANNELS_HOST: "peerchannels:25009"
3838
WALLET_SPVREQUIRED: 'true'
3939
healthcheck:

go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ require (
3333
github.com/gorilla/websocket v1.5.0
3434
github.com/libsv/go-bc v0.1.10
3535
github.com/rs/zerolog v1.27.0
36-
github.com/theflyingcodr/sockets v0.0.11-beta.0.20220225103542-c6eecb16f586
36+
github.com/theflyingcodr/sockets v0.0.12-beta
3737
)
3838

3939
require (

0 commit comments

Comments
 (0)