Skip to content

Commit

Permalink
fix: tx finder (#766)
Browse files Browse the repository at this point in the history
  • Loading branch information
boecklim authored Feb 10, 2025
1 parent f248943 commit 7d1c637
Show file tree
Hide file tree
Showing 15 changed files with 538 additions and 212 deletions.
6 changes: 4 additions & 2 deletions cmd/arc/services/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,10 +58,12 @@ func StartAPIServer(logger *slog.Logger, arcConfig *config.ArcConfig) (func(), e
// TODO: WithSecurityConfig(appConfig.Security)
apiOpts := []apiHandler.Option{
apiHandler.WithCallbackURLRestrictions(arcConfig.Metamorph.RejectCallbackContaining),
apiHandler.WithCacheExpiryTime(arcConfig.API.ProcessorCacheExpiryTime),
}
var cachedFinderOpts []func(f *tx_finder.CachedFinder)
var finderOpts []func(f *tx_finder.Finder)
var nodeClientOpts []func(client *node_client.NodeClient)
wocClientOpts := []func(client *woc_client.WocClient){woc_client.WithAuth(arcConfig.API.WocAPIKey)}

shutdownFns := make([]func(), 0)

Expand All @@ -82,10 +84,10 @@ func StartAPIServer(logger *slog.Logger, arcConfig *config.ArcConfig) (func(), e

mtmOpts = append(mtmOpts, metamorph.WithClientTracer(attributes...))
apiOpts = append(apiOpts, apiHandler.WithTracer(attributes...))
apiOpts = append(apiOpts, apiHandler.WithCacheExpiryTime(arcConfig.API.ProcessorCacheExpiryTime))
cachedFinderOpts = append(cachedFinderOpts, tx_finder.WithTracerCachedFinder(attributes...))
finderOpts = append(finderOpts, tx_finder.WithTracerFinder(attributes...))
nodeClientOpts = append(nodeClientOpts, node_client.WithTracer(attributes...))
wocClientOpts = append(wocClientOpts, woc_client.WithTracer(attributes...))
}

conn, err := metamorph.DialGRPC(arcConfig.Metamorph.DialAddr, arcConfig.Prometheus.Endpoint, arcConfig.GrpcMessageSize, arcConfig.Tracing)
Expand All @@ -110,7 +112,7 @@ func StartAPIServer(logger *slog.Logger, arcConfig *config.ArcConfig) (func(), e
policy = arcConfig.API.DefaultPolicy
}

wocClient := woc_client.New(arcConfig.API.WocMainnet, woc_client.WithAuth(arcConfig.API.WocAPIKey))
wocClient := woc_client.New(arcConfig.API.WocMainnet, wocClientOpts...)

pc := arcConfig.PeerRPC
rpcURL, err := url.Parse(fmt.Sprintf("rpc://%s:%s@%s:%d", pc.User, pc.Password, pc.Host, pc.Port))
Expand Down
32 changes: 10 additions & 22 deletions internal/api/handler/default_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,10 @@ import (
"testing"
"time"

"google.golang.org/protobuf/types/known/timestamppb"

defaultvalidator "github.com/bitcoin-sv/arc/internal/validator/default"
"github.com/bitcoin-sv/arc/internal/validator/mocks"
"google.golang.org/protobuf/types/known/timestamppb"

sdkTx "github.com/bitcoin-sv/go-sdk/transaction"
"github.com/labstack/echo/v4"
Expand Down Expand Up @@ -332,7 +333,6 @@ func TestPOSTTransaction(t *testing.T) { //nolint:funlen
getTx []byte
submitTxResponse *metamorph.TransactionStatus
submitTxErr error
getRawTxsErr error

expectedStatus api.StatusCode
expectedResponse any
Expand Down Expand Up @@ -405,16 +405,6 @@ func TestPOSTTransaction(t *testing.T) { //nolint:funlen
expectedStatus: 400,
expectedResponse: *api.NewErrorFields(api.ErrStatusBadRequest, "could not read varint type: EOF"),
},
{
name: "valid tx - missing inputs, text/plain",
contentType: contentTypes[0],
txHexString: validTx,
getRawTxsErr: errors.New("failed to get raw txs"),

expectedStatus: 460,
expectedResponse: errFieldMissingInputs,
expectedError: defaultvalidator.ErrFailedToGetRawTxs,
},
{
name: "valid tx - fees too low",
contentType: contentTypes[0],
Expand Down Expand Up @@ -651,7 +641,7 @@ func TestPOSTTransaction(t *testing.T) { //nolint:funlen
"8574e743bb64cf603dbd0e951e7287afd2a59593ff8837b3760e911f8fb38e35": tx,
}
finder := &mocks.TxFinderIMock{
GetRawTxsFunc: func(_ context.Context, _ validator.FindSourceFlag, ids []string) ([]*sdkTx.Transaction, error) {
GetRawTxsFunc: func(_ context.Context, _ validator.FindSourceFlag, ids []string) []*sdkTx.Transaction {
var rawTxs []*sdkTx.Transaction
for _, id := range ids {
rawTx, ok := txMap[id]
Expand All @@ -661,7 +651,7 @@ func TestPOSTTransaction(t *testing.T) { //nolint:funlen
rawTxs = append(rawTxs, rawTx)
}

return rawTxs, tc.getRawTxsErr
return rawTxs
},
}

Expand Down Expand Up @@ -842,8 +832,8 @@ func TestPOSTTransactions(t *testing.T) { //nolint:funlen
},
}

finder := &mocks.TxFinderIMock{GetRawTxsFunc: func(_ context.Context, _ validator.FindSourceFlag, _ []string) ([]*sdkTx.Transaction, error) {
return nil, errors.New("error getting raw transactions")
finder := &mocks.TxFinderIMock{GetRawTxsFunc: func(_ context.Context, _ validator.FindSourceFlag, _ []string) []*sdkTx.Transaction {
return nil
}}
sut, err := NewDefault(testLogger, txHandler, nil, defaultPolicy, finder)
require.NoError(t, err)
Expand All @@ -869,8 +859,6 @@ func TestPOSTTransactions(t *testing.T) { //nolint:funlen
_ = json.Unmarshal(b, &bErr)

assert.Equal(t, int(api.ErrStatusTxFormat), bErr[0].Status)

assert.ErrorContains(t, errors.New(*bErr[0].ExtraInfo), defaultvalidator.ErrFailedToGetRawTxs.Error())
}
})

Expand Down Expand Up @@ -1090,8 +1078,8 @@ func TestPOSTTransactions(t *testing.T) { //nolint:funlen
},
}

finder := &mocks.TxFinderIMock{GetRawTxsFunc: func(_ context.Context, _ validator.FindSourceFlag, _ []string) ([]*sdkTx.Transaction, error) {
return nil, errors.New("error getting raw transactions")
finder := &mocks.TxFinderIMock{GetRawTxsFunc: func(_ context.Context, _ validator.FindSourceFlag, _ []string) []*sdkTx.Transaction {
return nil
}}
sut, err := NewDefault(testLogger, txHandler, merkleRootsVerifier, defaultPolicy, finder)
require.NoError(t, err)
Expand Down Expand Up @@ -1162,8 +1150,8 @@ func TestPOSTTransactions(t *testing.T) { //nolint:funlen
return nil, nil
},
}
finder := &mocks.TxFinderIMock{GetRawTxsFunc: func(_ context.Context, _ validator.FindSourceFlag, _ []string) ([]*sdkTx.Transaction, error) {
return nil, errors.New("error getting raw transactions")
finder := &mocks.TxFinderIMock{GetRawTxsFunc: func(_ context.Context, _ validator.FindSourceFlag, _ []string) []*sdkTx.Transaction {
return nil
}}
sut, err := NewDefault(testLogger, txHandler, merkleRootsVerifier, defaultPolicy, finder)
require.NoError(t, err)
Expand Down
13 changes: 5 additions & 8 deletions internal/tx_finder/cached_tx_finder.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,10 +62,10 @@ func (f CachedFinder) GetMempoolAncestors(ctx context.Context, ids []string) ([]
return f.finder.GetMempoolAncestors(ctx, ids)
}

func (f CachedFinder) GetRawTxs(ctx context.Context, source validator.FindSourceFlag, ids []string) (txs []*sdkTx.Transaction, err error) {
func (f CachedFinder) GetRawTxs(ctx context.Context, source validator.FindSourceFlag, ids []string) (txs []*sdkTx.Transaction) {
ctx, span := tracing.StartTracing(ctx, "CachedFinder_GetRawTxs", f.tracingEnabled, f.tracingAttributes...)
defer func() {
tracing.EndTracing(span, err)
tracing.EndTracing(span, nil)
}()

cachedTxs := make([]*sdkTx.Transaction, 0, len(ids))
Expand All @@ -85,19 +85,16 @@ func (f CachedFinder) GetRawTxs(ctx context.Context, source validator.FindSource
}

if len(toFindIDs) == 0 {
return cachedTxs, nil
return cachedTxs
}

// find txs
foundTxs, err := f.finder.GetRawTxs(ctx, source, toFindIDs)
if err != nil {
return nil, err
}
foundTxs := f.finder.GetRawTxs(ctx, source, toFindIDs)

// update cache
for _, tx := range foundTxs {
f.cacheStore.Set(tx.TxID().String(), *tx, cacheExpiration)
}

return append(cachedTxs, foundTxs...), nil
return append(cachedTxs, foundTxs...)
}
3 changes: 1 addition & 2 deletions internal/tx_finder/cached_tx_finder_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,10 +62,9 @@ func TestCachedFinder_GetRawTxs_AllFromCache(t *testing.T) {

// when
// try to find in cache or with TransactionHandler only
res, err := sut.GetRawTxs(context.Background(), validator.SourceTransactionHandler, []string{testdata.TX1Raw.TxID().String(), testdata.TX6Raw.TxID().String()})
res := sut.GetRawTxs(context.Background(), validator.SourceTransactionHandler, []string{testdata.TX1Raw.TxID().String(), testdata.TX6Raw.TxID().String()})

// then
require.NoError(t, err)
require.Len(t, res, len(tc.cachedTx)+len(tc.fetchedTx))

if len(tc.fetchedTx) > 0 {
Expand Down
133 changes: 133 additions & 0 deletions internal/tx_finder/mocks/node_client_mock.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

83 changes: 83 additions & 0 deletions internal/tx_finder/mocks/woc_client_mock.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 7d1c637

Please sign in to comment.