Как подписать необработанную транзакцию Bitcoin Cash?

Мне нужно подписать необработанную транзакцию в тестовой сети, шестнадцатеричный код которой приведен ниже, я пытался жестко кодировать все в части создания транзакции, она транслируется правильно. но я должен реализовать транзакцию и часть подписи отдельно. Я использую пакет bitcore-lib-cash

const bitcore = require('bitcore-lib-cash') const txhex = 010000000139a7e6578a862a10151bdbe0ed4a833cd615273b0cd0ecda1616ee8407d7d8040000000000ffffffff0241010000000000001976a914f0ac6825bd05b406d5224eab0be73852a487e06c88ac94dc0100000000001976a914185ec62d62510d40795109e6484e0487c28a3caf88ac00000000

const private_key = 'private key here' 
let transaction = new bitcore.Transaction(txbuffer).sign(private_key)
console.log(private_key)

{
"errorMessage": "Invalid state: Not all utxo information is available to sign the transaction.",
"errorType": "bitcore.ErrorInvalidState",
"stackTrace": [
    "Error",
    "new NodeError (/var/task/node_modules/bitcore-lib-cash/lib/errors/index.js:20:41)",
    "Object.checkState (/var/task/node_modules/bitcore-lib-cash/lib/util/preconditions.js:9:13)",
    "Transaction.sign (/var/task/node_modules/bitcore-lib-cash/lib/transaction/transaction.js:1077:5)",
    "/var/task/src/custody/utils/biputils.js:155:12",
    "sign_transaction (/var/task/src/custody/utils/biputils.js:167:6)",
    "Object.generate_signature (/var/task/src/custody/assets/bitcoincash.js:220:23)",
    "<anonymous>",
    "process._tickDomainCallback (internal/process/next_tick.js:228:7)"
]

}


person Er Deepak Garg    schedule 06.11.2019    source источник


Ответы (1)


ОБНОВИТЬ

Я только что проверил исходный код bitcore-lib-cash, при вызове функции toString или toBuffer они не кодируют каждое поле в input.

Вот одна из частей процесса для кодирования input:

Input.prototype.toBufferWriter = function(writer) {
  if (!writer) {
    writer = new BufferWriter();
  }
  writer.writeReverse(this.prevTxId);
  writer.writeUInt32LE(this.outputIndex);
  var script = this._scriptBuffer;
  writer.writeVarintNum(script.length);
  writer.write(script);
  writer.writeUInt32LE(this.sequenceNumber);
  return writer;
};

Поэтому я думаю, вам нужно переписать эту toBufferWriter функцию или проанализировать каждое поле в txhex и заново построить транзакцию.


Ваш txhex недействителен.

После декодирования txhex он должен иметь поле output в каждом входном объекте UTXO, откуда и возникла ошибка.

person StillFantasy    schedule 07.11.2019
comment
Хорошо, я получаю отсюда txhex (tx one, имя изменено), const tx = new bitcore.Transaction () .from (inputs) .to (output) // так что мне делать, если входы и выходы правильные, потому что если я подпишу его здесь, то он работает - person Er Deepak Garg; 07.11.2019
comment
Как преобразовать tx в txhex? - person StillFantasy; 07.11.2019
comment
После получения hex я применил .toString () и сохранил это значение в txhex. В документации .tostring заменяется на .toString ('hex). Если я этого не сделаю, то Dynamodb выдаст ошибку при сохранении этого ввода. - person Er Deepak Garg; 07.11.2019
comment
@ErDeepakGarg Если он ответит на ваш вопрос, я был бы очень признателен, если бы вы приняли мой ответ - person StillFantasy; 09.11.2019
comment
Нет, я не понял ваших ответов, когда и где нужно вызывать / применять эту функцию? Кроме того, я могу подписать транзакцию во время создания, у меня возникают проблемы, когда я пытаюсь разделить это. Или можно привести какой-нибудь рабочий пример? - person Er Deepak Garg; 12.11.2019
comment
@ErDeepakGarg Я скоро этим займусь! - person StillFantasy; 15.11.2019