Skip to content

Commit 541f46b

Browse files
Update RPC client error parsing.
1 parent 632024c commit 541f46b

File tree

1 file changed

+32
-35
lines changed

1 file changed

+32
-35
lines changed

rpcnode/node.go

Lines changed: 32 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,8 @@ func NewNode(config *Config) (*RPCNode, error) {
9191

9292
func ParseError(err error) error {
9393
parts := strings.Split(err.Error(), ":")
94-
95-
if len(parts) != 2 {
96-
return err
94+
if len(parts) == 0 {
95+
return err // return original error
9796
}
9897

9998
value, intErr := strconv.Atoi(strings.TrimSpace(parts[0]))
@@ -103,13 +102,14 @@ func ParseError(err error) error {
103102

104103
switch value {
105104
case -5:
106-
return ErrNotSeen
105+
return errors.Wrap(ErrNotSeen, err.Error())
107106
case -25:
108-
return ErrMissingInputs
107+
return errors.Wrap(ErrMissingInputs, err.Error())
109108
case -26: // txn-mempool-conflict or too-long-mempool-chain
110-
return ErrTransactionConflict
109+
// -26: 258: txn-mempool-conflict
110+
return errors.Wrap(ErrTransactionConflict, err.Error())
111111
case -27: // Transaction already in the mempool
112-
return ErrTransactionInMempool
112+
return errors.Wrap(ErrTransactionInMempool, err.Error())
113113
}
114114

115115
return err
@@ -130,15 +130,13 @@ func ConvertError(err error) error {
130130

131131
switch jsonErr.ErrorCode {
132132
case -5:
133-
return ErrNotSeen
133+
return errors.Wrap(ErrNotSeen, err.Error())
134134
case -25:
135-
return ErrMissingInputs
135+
return errors.Wrap(ErrMissingInputs, err.Error())
136136
case -26: // txn-mempool-conflict or too-long-mempool-chain
137-
return ErrTransactionConflict
137+
return errors.Wrap(ErrTransactionConflict, err.Error())
138138
case -27: // Transaction already in the mempool
139-
return ErrTransactionInMempool
140-
default:
141-
return err
139+
return errors.Wrap(ErrTransactionInMempool, err.Error())
142140
}
143141

144142
return err
@@ -153,22 +151,22 @@ func (r *RPCNode) SendTx(ctx context.Context, tx *wire.MsgTx) error {
153151
}
154152

155153
// GetTX requests a tx from the remote server.
156-
func (r *RPCNode) GetTX(ctx context.Context, id *bitcoin.Hash32) (*wire.MsgTx, error) {
154+
func (r *RPCNode) GetTX(ctx context.Context, txid *bitcoin.Hash32) (*wire.MsgTx, error) {
157155
ctx = logger.ContextWithLogSubSystem(ctx, SubSystem)
158156
defer logger.Elapsed(ctx, time.Now(), "GetTX")
159157

160158
r.lock.Lock()
161-
msg, ok := r.txCache[*id]
159+
msg, ok := r.txCache[*txid]
162160
if ok {
163-
logger.Verbose(ctx, "Using tx from RPC cache : %s\n", id.String())
164-
delete(r.txCache, *id)
161+
logger.Verbose(ctx, "Using tx from RPC cache : %s\n", txid.String())
162+
delete(r.txCache, *txid)
165163
r.lock.Unlock()
166164
return msg, nil
167165
}
168166
r.lock.Unlock()
169167

170-
logger.Verbose(ctx, "Requesting tx from RPC : %s\n", id.String())
171-
ch, _ := chainhash.NewHash(id[:])
168+
logger.Verbose(ctx, "Requesting tx from RPC : %s\n", txid.String())
169+
ch, _ := chainhash.NewHash(txid[:])
172170
var err error
173171
var raw *btcjson.TxRawResult
174172
for i := 0; i <= r.Config.MaxRetries; i++ {
@@ -177,18 +175,18 @@ func (r *RPCNode) GetTX(ctx context.Context, id *bitcoin.Hash32) (*wire.MsgTx, e
177175
break
178176
}
179177

180-
err = errors.Wrap(ConvertError(err), id.String())
178+
err = errors.Wrap(ConvertError(err), txid.String())
181179
if errors.Cause(err) == ErrNotSeen {
182-
logger.Error(ctx, "RPCTxNotSeenYet GetTxs receive tx %s : %v", id.String(), err)
180+
logger.Error(ctx, "RPCTxNotSeenYet GetTxs receive tx %s : %v", txid, err)
183181
} else {
184-
logger.Error(ctx, "RPCCallFailed GetTx %s : %v", id.String(), err)
182+
logger.Error(ctx, "RPCCallFailed GetTx %s : %v", txid, err)
185183
}
186184
time.Sleep(time.Duration(r.Config.RetryDelay) * time.Millisecond)
187185
}
188186

189187
if err != nil {
190-
logger.Error(ctx, "RPCCallAborted GetTx %s : %v", id.String(), err)
191-
return nil, errors.Wrap(err, fmt.Sprintf("Failed to GetTx %v", id.String()))
188+
logger.Error(ctx, "RPCCallAborted GetTx %s : %v", txid, err)
189+
return nil, err
192190
}
193191

194192
b, err := hex.DecodeString(raw.Hex)
@@ -234,7 +232,7 @@ func (r *RPCNode) GetTXs(ctx context.Context, txids []*bitcoin.Hash32) ([]*wire.
234232

235233
for i, txid := range txids {
236234
if results[i] == nil {
237-
logger.Verbose(ctx, "Requesting tx from RPC : %s\n", txid.String())
235+
logger.Verbose(ctx, "Requesting tx from RPC : %s\n", txid)
238236
ch, _ := chainhash.NewHash(txid[:])
239237
request := r.client.GetRawTransactionVerboseAsync(ch)
240238
requests[i] = &request
@@ -262,7 +260,7 @@ func (r *RPCNode) GetTXs(ctx context.Context, txids []*bitcoin.Hash32) ([]*wire.
262260
b, err := hex.DecodeString(rawTx.Hex)
263261
if err != nil {
264262
lastError = err
265-
logger.Error(ctx, "RPCCallFailed GetTxs decode tx hex %s : %v", txids[i].String(), err)
263+
logger.Error(ctx, "RPCCallFailed GetTxs decode tx hex %s : %v", txids[i], err)
266264
continue
267265
}
268266

@@ -271,7 +269,7 @@ func (r *RPCNode) GetTXs(ctx context.Context, txids []*bitcoin.Hash32) ([]*wire.
271269

272270
if err := tx.Deserialize(buf); err != nil {
273271
lastError = err
274-
logger.Error(ctx, "RPCCallFailed GetTxs deserialize tx %s : %v", txids[i].String(), err)
272+
logger.Error(ctx, "RPCCallFailed GetTxs deserialize tx %s : %v", txids[i], err)
275273
continue
276274
}
277275

@@ -301,7 +299,7 @@ func (r *RPCNode) GetOutputs(ctx context.Context, outpoints []wire.OutPoint) ([]
301299
for i, outpoint := range outpoints {
302300
tx, ok := r.txCache[outpoint.Hash]
303301
if ok && len(tx.TxOut) > int(outpoint.Index) {
304-
logger.Verbose(ctx, "Using tx from RPC cache : %s\n", outpoint.Hash.String())
302+
logger.Verbose(ctx, "Using tx from RPC cache : %s\n", outpoint.Hash)
305303
delete(r.txCache, outpoint.Hash)
306304
results[i] = bitcoin.UTXO{
307305
Hash: outpoint.Hash,
@@ -324,7 +322,7 @@ func (r *RPCNode) GetOutputs(ctx context.Context, outpoints []wire.OutPoint) ([]
324322

325323
for i, outpoint := range outpoints {
326324
if !filled[i] {
327-
logger.Verbose(ctx, "Requesting tx from RPC : %s\n", outpoint.Hash.String())
325+
logger.Verbose(ctx, "Requesting tx from RPC : %s\n", outpoint.Hash)
328326
ch, _ := chainhash.NewHash(outpoint.Hash[:])
329327
request := r.client.GetRawTransactionVerboseAsync(ch)
330328
requests[i] = &request
@@ -352,7 +350,7 @@ func (r *RPCNode) GetOutputs(ctx context.Context, outpoints []wire.OutPoint) ([]
352350
b, err := hex.DecodeString(rawTx.Hex)
353351
if err != nil {
354352
lastError = err
355-
logger.Error(ctx, "RPCCallFailed GetRawTx decode tx hex %s : %v",
353+
logger.Error(ctx, "RPCCallFailed GetRawTx decode tx hex %s : %s",
356354
outpoints[i].Hash.String(), err)
357355
continue
358356
}
@@ -362,16 +360,16 @@ func (r *RPCNode) GetOutputs(ctx context.Context, outpoints []wire.OutPoint) ([]
362360

363361
if err := tx.Deserialize(buf); err != nil {
364362
lastError = err
365-
logger.Error(ctx, "RPCCallFailed GetRawTx deserialize tx %s : %v",
366-
outpoints[i].Hash.String(), err)
363+
logger.Error(ctx, "RPCCallFailed GetRawTx deserialize tx %s : %s",
364+
outpoints[i].Hash, err)
367365
continue
368366
}
369367

370368
outpoint := outpoints[i]
371369

372370
if int(outpoint.Index) >= len(tx.TxOut) {
373371
return results, fmt.Errorf("Invalid output index for txid %d/%d : %s",
374-
outpoint.Index, len(tx.TxOut), outpoint.Hash.String())
372+
outpoint.Index, len(tx.TxOut), outpoint.Hash)
375373
}
376374

377375
results[i] = bitcoin.UTXO{
@@ -536,8 +534,7 @@ func (r *RPCNode) SendRawTransaction(ctx context.Context, tx *wire.MsgTx) error
536534

537535
switch errors.Cause(err) {
538536
case ErrMissingInputs, ErrTransactionConflict:
539-
logger.Error(ctx, "RPCCallFailed SendRawTransaction : %s",
540-
err)
537+
logger.Error(ctx, "RPCCallFailed SendRawTransaction : %s", err)
541538
return errors.Wrap(err, tx.TxHash().String())
542539

543540
case ErrTransactionInMempool:

0 commit comments

Comments
 (0)