Skip to content

Commit 585ee23

Browse files
SubmitTx: Reject invalid arkade scripts instead of skipping them (#27)
* fix: typo unknwonPacket -> unknownPacket * test: verify introspector client rejects invalid arkade scripts with an error * test: verify SubmitTx handles entries for mixed introspectors * fix: #26 return an error from SubmitTx for invalid arkade scripts
1 parent c9b0017 commit 585ee23

4 files changed

Lines changed: 542 additions & 8 deletions

File tree

internal/application/tx.go

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package application
22

33
import (
44
"context"
5+
"errors"
56
"fmt"
67

78
"github.com/ArkLabsHQ/introspector/pkg/arkade"
@@ -42,17 +43,21 @@ func (s *service) SubmitTx(ctx context.Context, tx OffchainTx) (*OffchainTx, err
4243

4344
signerPublicKey := s.signer.secretKey.PubKey()
4445

46+
var nSigned = 0
4547
for _, entry := range packet {
4648
inputIndex := int(entry.Vin)
4749
script, err := arkade.ReadArkadeScript(arkPtx, inputIndex, signerPublicKey, entry)
4850
if err != nil {
49-
// skip if the input is not a valid arkade script
50-
continue
51+
// there may be input/entry pairs attributed to a different signer
52+
if errors.Is(err, arkade.ErrTweakedArkadePubKeyNotFound) && len(arkPtx.Inputs) > 1 {
53+
continue
54+
}
55+
return nil, fmt.Errorf("failed to read arkade script: %w vin=%d", err, inputIndex)
5156
}
5257

5358
log.Debugf("executing arkade script: %x", script.Script())
5459
if err := script.Execute(arkPtx.UnsignedTx, prevoutFetcher, inputIndex); err != nil {
55-
return nil, fmt.Errorf("failed to execute arkade script: %w", err)
60+
return nil, fmt.Errorf("failed to execute arkade script: %w vin=%d", err, inputIndex)
5661
}
5762
log.Debugf("execution of %x succeeded", script.Script())
5863

@@ -75,6 +80,12 @@ func (s *service) SubmitTx(ctx context.Context, tx OffchainTx) (*OffchainTx, err
7580
if err := s.signer.signInput(checkpointPtx, 0, script.Hash(), checkpointPrevoutFetcher); err != nil {
7681
return nil, fmt.Errorf("failed to sign checkpoint input %d: %w", inputIndex, err)
7782
}
83+
84+
nSigned++
85+
}
86+
87+
if nSigned == 0 {
88+
return nil, fmt.Errorf("failed to find any valid input/entry pairs")
7889
}
7990

8091
signedCheckpointTxs := make([]*psbt.Packet, 0, len(orderedCheckpointTxids))

pkg/arkade/introspector_packet.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -166,13 +166,12 @@ func FindIntrospectorPacket(tx *wire.MsgTx) (IntrospectorPacket, error) {
166166
if pkt.Type() != PacketType {
167167
continue
168168
}
169-
unknwonPacket, ok := pkt.(extension.UnknownPacket)
169+
unknownPacket, ok := pkt.(extension.UnknownPacket)
170170
if !ok {
171171
continue
172172
}
173-
174-
return DeserializeIntrospectorPacket(unknwonPacket.Data)
173+
174+
return DeserializeIntrospectorPacket(unknownPacket.Data)
175175
}
176176
return nil, nil
177177
}
178-

pkg/arkade/script.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package arkade
22

33
import (
44
"bytes"
5+
"errors"
56
"fmt"
67

78
"github.com/arkade-os/arkd/pkg/ark-lib/extension"
@@ -13,6 +14,8 @@ import (
1314
"github.com/btcsuite/btcd/wire"
1415
)
1516

17+
var ErrTweakedArkadePubKeyNotFound = errors.New("tweaked arkade script public key not found in tapscript")
18+
1619
type ArkadeScript struct {
1720
script []byte
1821
hash []byte
@@ -70,7 +73,7 @@ func ReadArkadeScript(ptx *psbt.Packet, inputIndex int, signerPublicKey *btcec.P
7073
}
7174

7275
if !found {
73-
return nil, fmt.Errorf("tweaked arkade script public key not found in tapscript")
76+
return nil, ErrTweakedArkadePubKeyNotFound
7477
}
7578

7679
return &ArkadeScript{

0 commit comments

Comments
 (0)