libbitcoin / libbitcoin-explorer

Bitcoin Command Line Tool
Other
600 stars 176 forks source link

Add witness option to input-set command. #644

Open praveenbm5 opened 5 years ago

praveenbm5 commented 5 years ago

I am able to generate signatures using input-sign for a segwit transaction created using bitcoin-cli

HEX: 0200000001a7be5c74cb963c426e295a3f145bf397d8d7c12711bbb2bb6dcb318a505465de0000000000ffffffff01c0e4022a0100000017a9140a37ed6a88d66dc102bde8a6a299b44c81daa7178700000000

{
  "txid": "9a79c646e3105742b815d14f107c61e5d067c271c41dc246e925351bfa529b15",
  "hash": "9a79c646e3105742b815d14f107c61e5d067c271c41dc246e925351bfa529b15",
  "version": 2,
  "size": 83,
  "vsize": 83,
  "weight": 332,
  "locktime": 0,
  "vin": [
    {
      "txid": "de6554508a31cb6dbbb2bb1127c1d7d897f35b143f5a296e423c96cb745cbea7",
      "vout": 0,
      "scriptSig": {
        "asm": "",
        "hex": ""
      },
      "sequence": 4294967295
    }
  ],
  "vout": [
    {
      "value": 49.99800000,
      "n": 0,
      "scriptPubKey": {
        "asm": "OP_HASH160 0a37ed6a88d66dc102bde8a6a299b44c81daa717 OP_EQUAL",
        "hex": "a9140a37ed6a88d66dc102bde8a6a299b44c81daa71787",
        "reqSigs": 1,
        "type": "scripthash",
        "addresses": [
          "2MtBFk78tB3awCMREc2KBy93WAUT9ZxGc2Y"
        ]
      }
    }
  ]
}

But not able to add them in a segwit compatible way using input-set. This is what I am getting after constructing and adding the endorsement script which does not look like a segwit transaction.

{
  "txid": "26c5f52031ef5d52c0ad80b79b6c77ac002101a68472a33f235b7b9223756901",
  "hash": "26c5f52031ef5d52c0ad80b79b6c77ac002101a68472a33f235b7b9223756901",
  "version": 2,
  "size": 410,
  "vsize": 410,
  "weight": 1640,
  "locktime": 0,
  "vin": [
    {
      "txid": "de6554508a31cb6dbbb2bb1127c1d7d897f35b143f5a296e423c96cb745cbea7",
      "vout": 0,
      "scriptSig": {
        "asm": "0 30440220031b6c1d27081b2bcca3fff39f58680571e831b25df8758aa579cca00cdc26b9022063d3ace4c054418a17fae96d55a9b52cefbf2f6518cbab99a051f87cecf1c3ca[ALL] 304402206cf1e786996efbc8a7f2d91ad6d3d4d7b005ba38e98af2e2c6b08b5eb75388d40220478aeac95e98999d11b559ec07ee68e5664b95ecbfedad6f63165c983497cd0a[ALL] 3045022100e7388fb90144c31f0a2a24c5dc81104a9f199781db9713f591140a108dc7ae5a02201b8a70e7eddc0c6c513044b453f0bd0e67c80e6866e21a95e1f216696ba17393[ALL] 532103cb7ef39e4bf4e487f73dd8c0ac6f0ef112a6ac7b3fa09546007121605bfa7c7b21032aa651b6e0064cf4ddc0230e5cf37496d32e7970e9221f0d16d7afefd2be245121023320c921fb86d276cf996c97a3f3893e5da2c03926acd1d5160d0ccdb582f41653ae",
        "hex": "004730440220031b6c1d27081b2bcca3fff39f58680571e831b25df8758aa579cca00cdc26b9022063d3ace4c054418a17fae96d55a9b52cefbf2f6518cbab99a051f87cecf1c3ca0147304402206cf1e786996efbc8a7f2d91ad6d3d4d7b005ba38e98af2e2c6b08b5eb75388d40220478aeac95e98999d11b559ec07ee68e5664b95ecbfedad6f63165c983497cd0a01483045022100e7388fb90144c31f0a2a24c5dc81104a9f199781db9713f591140a108dc7ae5a02201b8a70e7eddc0c6c513044b453f0bd0e67c80e6866e21a95e1f216696ba17393014c69532103cb7ef39e4bf4e487f73dd8c0ac6f0ef112a6ac7b3fa09546007121605bfa7c7b21032aa651b6e0064cf4ddc0230e5cf37496d32e7970e9221f0d16d7afefd2be245121023320c921fb86d276cf996c97a3f3893e5da2c03926acd1d5160d0ccdb582f41653ae"
      },
      "sequence": 4294967295
    }
  ],
  "vout": [
    {
      "value": 49.99800000,
      "n": 0,
      "scriptPubKey": {
        "asm": "OP_HASH160 0a37ed6a88d66dc102bde8a6a299b44c81daa717 OP_EQUAL",
        "hex": "a9140a37ed6a88d66dc102bde8a6a299b44c81daa71787",
        "reqSigs": 1,
        "type": "scripthash",
        "addresses": [
          "2MtBFk78tB3awCMREc2KBy93WAUT9ZxGc2Y"
        ]
      }
    }
  ]
}

Is it even supported? I built bx by checking out the master branch today.

evoskuil commented 4 years ago

Original tx:

$ bx tx-decode 0200000001a7be5c74cb963c426e295a3f145bf397d8d7c12711bbb2bb6dcb318a505465de0000000000ffffffff01c0e4022a0100000017a9140a37ed6a88d66dc102bde8a6a299b44c81daa7178700000000

transaction
{
    hash 9a79c646e3105742b815d14f107c61e5d067c271c41dc246e925351bfa529b15
    inputs
    {
        input
        {
            previous_output
            {
                hash de6554508a31cb6dbbb2bb1127c1d7d897f35b143f5a296e423c96cb745cbea7
                index 0
            }
            script ""
            sequence 4294967295
        }
    }
    lock_time 0
    outputs
    {
        output
        {
            address_hash 0a37ed6a88d66dc102bde8a6a299b44c81daa717
            script "hash160 [0a37ed6a88d66dc102bde8a6a299b44c81daa717] equal"
            value 4999800000
        }
    }
    version 2
}
evoskuil commented 4 years ago

Desired script:

$ bx script-decode 004730440220031b6c1d27081b2bcca3fff39f58680571e831b25df8758aa579cca00cdc26b9022063d3ace4c054418a17fae96d55a9b52cefbf2f6518cbab99a051f87cecf1c3ca0147304402206cf1e786996efbc8a7f2d91ad6d3d4d7b005ba38e98af2e2c6b08b5eb75388d40220478aeac95e98999d11b559ec07ee68e5664b95ecbfedad6f63165c983497cd0a01483045022100e7388fb90144c31f0a2a24c5dc81104a9f199781db9713f591140a108dc7ae5a02201b8a70e7eddc0c6c513044b453f0bd0e67c80e6866e21a95e1f216696ba17393014c69532103cb7ef39e4bf4e487f73dd8c0ac6f0ef112a6ac7b3fa09546007121605bfa7c7b21032aa651b6e0064cf4ddc0230e5cf37496d32e7970e9221f0d16d7afefd2be245121023320c921fb86d276cf996c97a3f3893e5da2c03926acd1d5160d0ccdb582f41653ae

zero [30440220031b6c1d27081b2bcca3fff39f58680571e831b25df8758aa579cca00cdc26b9022063d3ace4c054418a17fae96d55a9b52cefbf2f6518cbab99a051f87cecf1c3ca01] [304402206cf1e786996efbc8a7f2d91ad6d3d4d7b005ba38e98af2e2c6b08b5eb75388d40220478aeac95e98999d11b559ec07ee68e5664b95ecbfedad6f63165c983497cd0a01] [3045022100e7388fb90144c31f0a2a24c5dc81104a9f199781db9713f591140a108dc7ae5a02201b8a70e7eddc0c6c513044b453f0bd0e67c80e6866e21a95e1f216696ba1739301] [532103cb7ef39e4bf4e487f73dd8c0ac6f0ef112a6ac7b3fa09546007121605bfa7c7b21032aa651b6e0064cf4ddc0230e5cf37496d32e7970e9221f0d16d7afefd2be245121023320c921fb86d276cf996c97a3f3893e5da2c03926acd1d5160d0ccdb582f41653ae]
evoskuil commented 4 years ago

Explorer's input-set command only adds the script to the input, which appears to be happening as designed. There is not yet support for adding the witness via input-set, which is all that is required to produce the desired serialization.

evoskuil commented 4 years ago

The multi-token nature of the input-set ENDORSEMENT_SCRIPT parameter complicates backward compatible extension of the command, as it cannot be added cleanly as a colon-delimited portion of the script (e.g. as in tx-encode). As an additional parameter it must be required (not backward compatible) and as an option it's a little clunky, but it would appear that an additional --witness (-w) option is most appropriate.

evoskuil commented 4 years ago

For consistency the witness should be provided unencoded, as a set of bracketed data tokens (without prefix). This is the canonical textual serialization provided by system::chain::witness.

praveenbm5 commented 4 years ago

Thank you for looking into this issue and taking it up as an enhancement.

--witness (-w) is the cleanest way as far as I can see too.

Lack of this feature in bx is a deal breaker for people relying on bx and still wanting to try Segwit and second level protocols that are now possible.

I understand you are pushing it as an enhancement for next release and 4.0 has a lot of Segwit related enhancements as I can see. Any time line you are thinking of for this so that I can help test etc.

praveenbm5 commented 4 years ago

I am waiting for this issue to be resolved and I also want to help with the development of such a useful tool.

Adding a bounty :-)

Anyone... please make this happen!

/boss $1000

praveenbm5 commented 4 years ago

I am not sure why this Bounty app is not working... sorry for posting multiple times...

The promise holds good if this enhancement is committed in the next 7 days. I can do PayPal.

Thank you for understanding.

evoskuil commented 4 years ago

I thought it was 1000 sats :). I am tempted to raise a little money for the Libbitcoin Institute. Maybe tonight when I finish up with taproot signature hashing, unless someone else wants to take it.

praveenbm5 commented 4 years ago

Also... do we need any changes to bx input-sign to generate segwit compatible signatures...

As far as I know and understanding, no changes are required but some one more knowledgeable in this can clarify please...

praveenbm5 commented 4 years ago

Any updates? @evoskuil Eric are you attempting this enhancement?

evoskuil commented 4 years ago

Sorry, got a little sidetracked, and now I’m traveling for a few days. I decided to finish up taproot before taking on something new. Bu if nobody grabs this I’ll pick it up.

j1warren commented 4 years ago

@evoskuil, hi, do you still have plans on implementing it sometimes?

And if it's backlogged what is the best alternative to bx to generate segwit transactions currently?

evoskuil commented 4 years ago

Hi @j1warren - I’m not up on alternative tooling, sorry. It is definitely planned, and also a bit backlogged while I get my shit together, and while other contributors are busy making money.

praveenbm5 commented 3 years ago

@evoskuil Hello Eric...

Any updates on this enhancement?

evoskuil commented 3 years ago

No :/