Как правильно использовать PreviousTxnID в транзакции Ripple?

На данный момент я реализую перезапись транзакции с помощью NOP в Ripple. Я хочу сохранить информацию о транзакции, которую я перезаписываю, внутри NOP. Глядя на PreviousTxnIDполе, оно кажется идеальным для этой цели. Однако, когда я пытаюсь использовать его, я получаю сообщение об ошибке:

{
  "id": 11,
  "status": "success",
  "type": "response",
  "result": {
    "engine_result": "tefWRONG_PRIOR",
    "engine_result_code": -184,
    "engine_result_message": "This previous transaction does not match.",
    "tx_blob": "1200032200000000240000F69555DA10915AA58303872299078F4CD9AD81D4771219C38764BE84B3AB3D6763977268400000000000000F7321025D9E40A50D78347EB8AFF7A36222BBE173CB9D06E68D109D189FF8616FC211077446304402204710D875B7DFC0F9A9F2101F67E0043AE255258BF9F6F21BCF7D42BC19B3A41E0220554CAB999EF43FD3EF720C6869D63F2E324AD774662B51AE4599F50B60E9B4DA8114448BD3912AA0E86A18B17784E7177B262FC38D73",
    "tx_json": {
      "Account": "rfESTMcbvbvCBqU1FTvGWiJP8cmUSu4GKg",
      "Fee": "15",
      "Flags": 0,
      "PreviousTxnID": "DA10915AA58303872299078F4CD9AD81D4771219C38764BE84B3AB3D67639772",
      "Sequence": 63125,
      "SigningPubKey": "025D9E40A50D78347EB8AFF7A36222BBE173CB9D06E68D109D189FF8616FC21107",
      "TransactionType": "AccountSet",
      "TxnSignature": "304402204710D875B7DFC0F9A9F2101F67E0043AE255258BF9F6F21BCF7D42BC19B3A41E0220554CAB999EF43FD3EF720C6869D63F2E324AD774662B51AE4599F50B60E9B4DA",
      "hash": "B1932085BA94FEBE7A360D71359752A1666C48CCBBD97DFF16FFFA8626EDA253"
    }
  }
}

Как правильно перезаписать PreviousTxnIDпредыдущую транзакцию в Ripple? (скажем, отправленная нами транзакция так и не попала в реестр из-за использования LastLedgerSequence).

Ответы (2)

Поле PreviousTxnIDустарело, сломано и никогда не должно использоваться. Вместо этого используйте AccountTxnID. Это работает следующим образом:

  1. Вы должны использовать полностью канонические подписи, и вы должны установить полностью канонический флаг (0x80000000) для всех ваших транзакций. В противном случае идентификатор транзакции может (теоретически) быть изменен злонамеренно.

  2. Вы должны включить отслеживание идентификатора транзакции в своей учетной записи. Вы делаете это, выполняя AccountSetтранзакцию с SetFlagустановленным значением 5. Это приводит к тому, что ваша учетная запись начинает отслеживать каждую выполняемую учетную запись.

  3. Включите PreviousTxnIDв свои транзакции поле, содержащее идентификатор предыдущей транзакции. Это гарантирует, что транзакция применяется только в том случае, если у нее есть ожидаемая предшествующая транзакция.

Теперь замена транзакции на nop аннулирует все последующие транзакции, в которых есть PreviousTxnIDполе.

Если вы хотите отключить PreviousTxnIDотслеживание для своей учетной записи, выполните AccountSetтранзакцию с ClearFlagустановленным значением 5.

Вы можете найти допустимые параметры AccountSet в документации: https://ripple.com/wiki/Transaction_Format#AccountSet_.283.29 (PreviousTxnID не является одним из них).

PreviousTxnID — это поле, возвращаемое rippled, а не параметр, который вы устанавливаете сами.