«mandatory-script-verify-flag-failed (подпись должна быть нулевой для неудачной операции проверки (мульти) подписи)»

Я сделал форк openwallet-android, чтобы добавить свою монету - (заполнители) placeh.io.

Openwallet-android подключается к серверу electromx. Я могу заставить свою цепочку правильно загружаться на сервере electromx. Openwallet корректно считывает баланс с адреса/входов и через кошелек можно посмотреть свой баланс.

Однако, когда я пытаюсь транслировать транзакцию, я получаю сообщение:

"mandatory-script-verify-flag-failed (signature must be zero for failed check(multi)sig operation)"

Из сети placehd/placeh.

Вот некоторая дополнительная информация, это необработанная транзакция, которая публикуется. Если я попытаюсь отправить необработанную транзакцию в клиенте placeh-cli, это не удастся и выдаст ту же ошибку, если сделать это вручную.

Необработанная транзакция:

placeh-cli decoderawtransaction 

01000000017477f59250a8d8a7d94ba5dcc196222c0b6c92849cad210735b4380b24c03b13010000006a473044022053b17723e8a90846fc341006f5f63d5776df619f33cec82d8065e836508672c6022036298087c2f37c3002c4897b74e7de6af8c608c89cbcef07ada9c5551c85f2810121031dc78b8c254649e204b81641f70497980ca6b5574f837001c962930580d1372dffffffff02c00e1602000000001976a914a117ed0f4e2afe1e1b8d2b0253408a7830f2b55688ac0093e651020000001976a914c472af380586ed1638686731cc1eda3c60363ec788ac00000000
{
  "txid": "de045f2220d0b9f34060336c9ed3badc7c22741fec3aa1d87ff24264c3c1fb5e",
  "hash": "de045f2220d0b9f34060336c9ed3badc7c22741fec3aa1d87ff24264c3c1fb5e",
  "version": 1,
  "size": 225,
  "vsize": 225,
  "locktime": 0,
  "vin": [
    {
      "txid": "133bc0240b38b4350721ad9c84926c0b2c2296c1dca54bd9a7d8a85092f57774",
      "vout": 1,
      "scriptSig": {
        "asm": "3044022053b17723e8a90846fc341006f5f63d5776df619f33cec82d8065e836508672c6022036298087c2f37c3002c4897b74e7de6af8c608c89cbcef07ada9c5551c85f281[ALL] 031dc78b8c254649e204b81641f70497980ca6b5574f837001c962930580d1372d",
        "hex": "473044022053b17723e8a90846fc341006f5f63d5776df619f33cec82d8065e836508672c6022036298087c2f37c3002c4897b74e7de6af8c608c89cbcef07ada9c5551c85f2810121031dc78b8c254649e204b81641f70497980ca6b5574f837001c962930580d1372d"
      },
      "sequence": 4294967295
    }
  ],
  "vout": [
    {
      "value": 0.35000000,
      "n": 0,
      "scriptPubKey": {
        "asm": "OP_DUP OP_HASH160 a117ed0f4e2afe1e1b8d2b0253408a7830f2b556 OP_EQUALVERIFY OP_CHECKSIG",
        "hex": "76a914a117ed0f4e2afe1e1b8d2b0253408a7830f2b55688ac",
        "reqSigs": 1,
        "type": "pubkeyhash",
        "addresses": [
          "FLWtv6SuocTFMozTZvdZAhroJLehVjLKhs"
        ]
      }
    },
    {
      "value": 99.64000000,
      "n": 1,
      "scriptPubKey": {
        "asm": "OP_DUP OP_HASH160 c472af380586ed1638686731cc1eda3c60363ec7 OP_EQUALVERIFY OP_CHECKSIG",
        "hex": "76a914c472af380586ed1638686731cc1eda3c60363ec788ac",
        "reqSigs": 1,
        "type": "pubkeyhash",
        "addresses": [
          "FPjqHpEzdYAbxVG2acxz8GWGAPmJsWj6oP"
        ]
      }
    }
  ]
}

Я считаю, что это может иметь какое-то отношение к тому, как openwallet создает необработанную транзакцию. Я хотел бы обновить библиотеки, чтобы он мог правильно транслировать транзакцию.

Это означает, что подпись недействительна, возможно, подпись создается неправильно, возможно, данные транзакции, которые она подписывает, не совпадают, или используемые закрытые ключи не могут использовать предыдущий вывод.
JBaczuk: Есть ли у вас какие-либо предложения о том, как я могу решить эту проблему? Транзакции, созданные и подписанные в placeh-qt, работают нормально.
Без (а) потраченного вывода транзакции и (б) правил консенсуса вашего альткойна невозможно ответить на этот вопрос.
Спасибо, Питер, я разместил исходный код альткоина здесь, это «довольно недавний» форк ядра биткойна. github.com/xagau/placeh
Ваша фактическая подпись действительна (по крайней мере, согласно моему биткойн-скрипту vm). Возможно, вы сталкиваетесь с чем-то похожим на это . Вы уверены, что openwallet правильно обрабатывает суммы при подписании?
@RaghavSood, где вы берете ввод scriptPubKey для его проверки?
Рагхав, я не уверен. Я не знаю, как давно openwallet был «фактически обновлен», но похоже, что он работает с биткойнами, хотя я не отправлял в него настоящие биткойны для тестирования. Форк openwallet завершен на github.com/xagau/openwallet-android . К сожалению, мне нужно решить эту основную проблему с сантехникой, прежде чем я смогу попытаться построить сверху, и это немного не в моей лиге. Я видел комментарии о том, что суммы vout должны составлять точную сумму, включая комиссию, но я немного не уверен.
@JBaczuk Только что расшифровал адрес из проводника, связанного с сайтом монет, чтобы получить HASH160 ( 40840b34365502f6fa5f066b137cf5081b7be8f8), а затем просто добавил обратно коды операций, чтобы получить 76a91440840b34365502f6fa5f066b137cf5081b7be8f888ac, что является стандартным скриптом p2pkh
@xagau Ваши суммы в decoderawtransaction кажутся правильными. Возможно, в процессе подписания суммы взяты неправильно, поэтому суммы в вашем vout в необработанном tx отличаются от тех, что были подписаны. Однако это чистая спекуляция, основанная только на том факте, что в ядре биткойнов существует открытая проблема, и что сама подпись действительна.
@RaghavSood спасибо, и благодаря Питеру, Дж. Бачуку, это дает мне возможность поискать. Если я найду решение, я могу внести поправки в эту ветку и добавить комментарий к открытому вопросу о биткойн-ядре. Спасибо!
@PieterWuille, RaghavSood, JBaczuk: я понял, в чем здесь проблема, для справки. Мне пришлось сделать signrawtransaction, чтобы заставить его «работать». Кажется, что-то в процедуре подписи клиента (openwallet-android) отклонило процесс подписи в биткойнах 0,12. После того, как я подписал необработанную транзакцию с помощью последнего клиента альткойнов, он смог создать подписанную транзакцию «hex», которая была принята сетью.

Ответы (1)

После некоторых дополнительных исследований и полезной информации, найденной здесь, я смог сделать следующий вывод:

Транзакции, закодированные в биткойне 0.12.X, а затем переданные в биткойн 0.15, могут столкнуться с ошибкой обязательного-скрипта-проверки-флага (подпись должна быть нулевой для неудачной проверки (мульти)подписи)

Эту проблему можно решить, выполнив следующие действия: Подпишите необработанную транзакцию версии 0.12.X подписью версии 0.15. Я не могу точно определить проблему, однако мне удалось закодировать необработанную транзакцию в 0.12.X, подписать ее в 0.15 и успешно транслировать. Эта информация может быть полезна, если кто-то пытается выяснить, какие части их процесса подписания нуждаются в рефакторинге/обновлении.