示例#1
0
    def sign_unvault_psbt(self, psbt_str, deriv_index):
        """Attach an ALL signature to the PSBT with the key at {deriv_index}"""
        assert isinstance(psbt_str, str)

        psbt = serializations.PSBT()
        psbt.deserialize(psbt_str)
        assert len(psbt.inputs) == 1, "Invalid Unvault PSBT"
        assert (serializations.make_p2wsh(psbt.inputs[0].witness_script) ==
                psbt.inputs[0].witness_utxo.scriptPubKey)

        script_code = psbt.inputs[0].witness_script
        sighash = serializations.sighash_all_witness(script_code, psbt, 0)
        privkey = coincurve.PrivateKey(
            self.hd.get_privkey_from_path([deriv_index]))
        sig = privkey.sign(sighash, hasher=None) + b"\x01"  # ALL

        pubkey = self.hd.get_pubkey_from_path([deriv_index])
        psbt.inputs[0].partial_sigs[pubkey] = sig

        return psbt.serialize()
示例#2
0
    def sign_spend_psbt(self, psbt_str, deriv_indexes):
        """Attach an ALL signature to each PSBT input with the keys at
        {deriv_indexes}"""
        assert isinstance(psbt_str, str)
        assert isinstance(deriv_indexes, list)

        psbt = serializations.PSBT()
        psbt.deserialize(psbt_str)
        assert len(
            psbt.inputs) == len(deriv_indexes), "Not enough derivation indexes"

        for (i, psbtin) in enumerate(psbt.inputs):
            script_code = psbtin.witness_script
            sighash = serializations.sighash_all_witness(script_code, psbt, i)
            privkey = coincurve.PrivateKey(
                self.hd.get_privkey_from_path([deriv_indexes[i]]))
            sig = privkey.sign(sighash, hasher=None) + b"\x01"  # ALL

            pubkey = self.hd.get_pubkey_from_path([deriv_indexes[i]])
            psbtin.partial_sigs[pubkey] = sig

        return psbt.serialize()