I generated a Taproot multisig handle utilizing Bitcoin Core’s deriveaddresses
command with multi_a
:
deriveaddresses "tr(tprv8ZgxMBicQKsPdgBQV2Y9EVPSjAGhyZXArhwSzHwnV3FytzPRr8KCR8EKEpLeHbANAncgbc31a6QoXjBTARQiZ2h1Z2NgSCjFYeTqKpAN5Gc/86h/1h/0h/0/1,multi_a(2,tprv8ZgxMBicQKsPdgBQV2Y9EVPSjAGhyZXArhwSzHwnV3FytzPRr8KCR8EKEpLeHbANAncgbc31a6QoXjBTARQiZ2h1Z2NgSCjFYeTqKpAN5Gc/86h/1h/0h/0/2,tprv8ZgxMBicQKsPdgBQV2Y9EVPSjAGhyZXArhwSzHwnV3FytzPRr8KCR8EKEpLeHbANAncgbc31a6QoXjBTARQiZ2h1Z2NgSCjFYeTqKpAN5Gc/86h/1h/0h/0/3))"
Key-path spending works accurately.
Script-path spending fails with error:
mandatory-script-verify-flag-failed (Witness program hash mismatch)
Code for Developing Script Path Spending Transaction
closing script = Script(script: [
pk2.toXOnlyHex(),
'OP_CHECKSIG',
pk3.toXOnlyHex(),
'OP_CHECKSIGADD',
2,
'OP_NUMEQUAL'
]);
closing handle = pk.toTaprootAddress(scripts: [
[script]
]);
closing sig1 = prv1.signTapRoot(
tx.getTransactionTaprootDigset(
txIndex: 0,
tapleafScript: script,
scriptPubKeys: [address.toScriptPubKey()],
quantities: [amount],
),
tweak: false
);
closing sig2 = prv2.signTapRoot(
tx.getTransactionTaprootDigset(
txIndex: 0,
tapleafScript: script,
scriptPubKeys: [address.toScriptPubKey()],
quantities: [amount],
),
tweak: false
);
closing controlBlock = ControlBlock(
public: pk,
scripts: toTapleafTaggedHash(script.toBytes())
);
closing witness = TxWitnessInput(
stack: [ sig1, sig2, script.toHex(), controlBlock.toHex()]
);
tx = tx.copyWith(witnesses: [witness]);
Uncooked Transaction
020000000001012543af34ab664d559d793946dd47345d5b6fff9f2e89456e03a5cc8acf57bf0e0100000000ffffffff0210270000000000001976a914e12bdac26ab92798ca56a38fd81bd09406458d5a88acb44e070000000000225120577176e689685df89c26a97cf400f11e33431ace42973389f48b78c14310d13a0440051c660118fbf450304e929389074629303fa4c5777a3e638c1956e64960e885fc5df26b430063e3b57012b6ec69262f30c0e922a2528aeeee472cdcada508eb40dd52984447622f84b473fa92336ebb4c3482c51cf4ad74b6ce50b76441c00cc59d69cab1b0fc76a9627847a87a7a0ca6a37860c15a574e052c675b323f90d64d46200db491b6b7b47d42a78b270a1e395e6b8f62886d4286c39c6111d326cdd31dc6ac20116d5f1c9eee66aef644423bd29e3b7549dd3e3d7e44702f3076305b7fd9d946ba529c41c0ba4e3cf774e82577c830c1e99b4e08ce158644f7ddd04aeca712b0daa72c74c01819cabf8c966ff15284017054ef1ce61b18dd66ccefa4b67941d2c0d04be44200000000
What’s inflicting the witness hash mismatch?
Is my management block appropriate?
Does Bitcoin Core enable spending by way of script-path for multi_a descriptors?
Am I lacking any required tweaks or flags.
Thanks
I generated a Taproot multisig handle utilizing Bitcoin Core’s deriveaddresses
command with multi_a
:
deriveaddresses "tr(tprv8ZgxMBicQKsPdgBQV2Y9EVPSjAGhyZXArhwSzHwnV3FytzPRr8KCR8EKEpLeHbANAncgbc31a6QoXjBTARQiZ2h1Z2NgSCjFYeTqKpAN5Gc/86h/1h/0h/0/1,multi_a(2,tprv8ZgxMBicQKsPdgBQV2Y9EVPSjAGhyZXArhwSzHwnV3FytzPRr8KCR8EKEpLeHbANAncgbc31a6QoXjBTARQiZ2h1Z2NgSCjFYeTqKpAN5Gc/86h/1h/0h/0/2,tprv8ZgxMBicQKsPdgBQV2Y9EVPSjAGhyZXArhwSzHwnV3FytzPRr8KCR8EKEpLeHbANAncgbc31a6QoXjBTARQiZ2h1Z2NgSCjFYeTqKpAN5Gc/86h/1h/0h/0/3))"
Key-path spending works accurately.
Script-path spending fails with error:
mandatory-script-verify-flag-failed (Witness program hash mismatch)
Code for Developing Script Path Spending Transaction
closing script = Script(script: [
pk2.toXOnlyHex(),
'OP_CHECKSIG',
pk3.toXOnlyHex(),
'OP_CHECKSIGADD',
2,
'OP_NUMEQUAL'
]);
closing handle = pk.toTaprootAddress(scripts: [
[script]
]);
closing sig1 = prv1.signTapRoot(
tx.getTransactionTaprootDigset(
txIndex: 0,
tapleafScript: script,
scriptPubKeys: [address.toScriptPubKey()],
quantities: [amount],
),
tweak: false
);
closing sig2 = prv2.signTapRoot(
tx.getTransactionTaprootDigset(
txIndex: 0,
tapleafScript: script,
scriptPubKeys: [address.toScriptPubKey()],
quantities: [amount],
),
tweak: false
);
closing controlBlock = ControlBlock(
public: pk,
scripts: toTapleafTaggedHash(script.toBytes())
);
closing witness = TxWitnessInput(
stack: [ sig1, sig2, script.toHex(), controlBlock.toHex()]
);
tx = tx.copyWith(witnesses: [witness]);
Uncooked Transaction
020000000001012543af34ab664d559d793946dd47345d5b6fff9f2e89456e03a5cc8acf57bf0e0100000000ffffffff0210270000000000001976a914e12bdac26ab92798ca56a38fd81bd09406458d5a88acb44e070000000000225120577176e689685df89c26a97cf400f11e33431ace42973389f48b78c14310d13a0440051c660118fbf450304e929389074629303fa4c5777a3e638c1956e64960e885fc5df26b430063e3b57012b6ec69262f30c0e922a2528aeeee472cdcada508eb40dd52984447622f84b473fa92336ebb4c3482c51cf4ad74b6ce50b76441c00cc59d69cab1b0fc76a9627847a87a7a0ca6a37860c15a574e052c675b323f90d64d46200db491b6b7b47d42a78b270a1e395e6b8f62886d4286c39c6111d326cdd31dc6ac20116d5f1c9eee66aef644423bd29e3b7549dd3e3d7e44702f3076305b7fd9d946ba529c41c0ba4e3cf774e82577c830c1e99b4e08ce158644f7ddd04aeca712b0daa72c74c01819cabf8c966ff15284017054ef1ce61b18dd66ccefa4b67941d2c0d04be44200000000
What’s inflicting the witness hash mismatch?
Is my management block appropriate?
Does Bitcoin Core enable spending by way of script-path for multi_a descriptors?
Am I lacking any required tweaks or flags.
Thanks