From ee4529065f6990d3ec0ca093963db12f3fc0eacb Mon Sep 17 00:00:00 2001 From: "Jamie C. Driver" Date: Mon, 27 Jun 2022 10:56:58 +0100 Subject: [PATCH] sign tx: extract reading tx-signing message fields into helper function --- docs/index.rst | 4 +-- jadepy/jade.py | 20 ++++++------- main/process/process_utils.c | 53 ++++++++++++++++++++++++++++++++++- main/process/process_utils.h | 4 +++ main/process/sign_liquid_tx.c | 40 ++++---------------------- main/process/sign_tx.c | 40 ++++---------------------- test_data/txn_large.json | 2 -- test_data/txn_legacy_ae.json | 1 - 8 files changed, 78 insertions(+), 86 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index 37a7d06b..452b32d7 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1195,7 +1195,7 @@ A batch of 'tx_input' messages should be sent to Jade - one for each tx input. } } -* 'script' and 'path' should be omitted if a signature for this input is not required. +* 'is_witness', 'script' and 'path' should be omitted if a signature for this input is not required. * If provided, 'script' should be the script-sig/redeem-script required to satisfy the input utxo. * 'input_tx' should be the streamed bytes of the txn which output the utxo being spent. * NOTE: if this is the only input, and 'is_witness' is 'true', the 'input_tx' can (optionally) be replaced with a 'satoshi' element, eg: '"satoshi": 2200000'. @@ -1637,7 +1637,7 @@ A batch of 'tx_input' messages should be sent to Jade - one for each tx input, a } } -* 'script' and 'path' are as in sign_tx_legacy_input_request_. +* 'is_witness', 'script' and 'path' are as in sign_tx_legacy_input_request_. * In addition, if a signature is required for this input and 'is_witness' is 'true', then the input utxo 'value_commitment' must be passed. * NOTE: no 'input_tx' is needed. diff --git a/jadepy/jade.py b/jadepy/jade.py index cbbd3cf2..ecfce5fb 100644 --- a/jadepy/jade.py +++ b/jadepy/jade.py @@ -1330,18 +1330,19 @@ def sign_liquid_tx(self, network, txn, inputs, commitments, change, use_ae_signa The transaction to sign inputs : [dict] - The tx inputs. Should contain keys: + The tx inputs. + If signing this input, should contain keys: is_witness, bool - whether this is a segwit input - value_commitment, 33-bytes - The value commitment of ths input - - These are only required if signing this input: script, bytes- the redeem script path, [int] - the bip32 path to sign with + value_commitment, 33-bytes - The value commitment of ths input These are only required for Anti-Exfil signatures: ae_host_commitment, 32-bytes - The host-commitment for Anti-Exfil signatures ae_host_entropy, 32-bytes - The host-entropy for Anti-Exfil signatures + If not signing this input a null or an empty dict can be passed. + commitments : [dict] An array sized for the number of outputs. Unblinded outputs should have a 'null' placeholder element. @@ -1415,17 +1416,16 @@ def sign_tx(self, network, txn, inputs, change, use_ae_signatures=False): inputs : [dict] The tx inputs. Should contain keys: - is_witness, bool - whether this is a segwit input - - These are only required if signing this input: - script, bytes- the redeem script - path, [int] - the bip32 path to sign with - One of these is required: input_tx, bytes - The prior transaction which created the utxo of this input satoshi, int - The satoshi amount of this input - can be used in place of 'input_tx' for a tx with a single segwit input + These are only required if signing this input: + is_witness, bool - whether this is a segwit input + script, bytes- the redeem script + path, [int] - the bip32 path to sign with + These are only required for Anti-Exfil signatures: ae_host_commitment, 32-bytes - The host-commitment for Anti-Exfil signatures ae_host_entropy, 32-bytes - The host-entropy for Anti-Exfil signatures diff --git a/main/process/process_utils.c b/main/process/process_utils.c index ef7463e0..80a19e73 100644 --- a/main/process/process_utils.c +++ b/main/process/process_utils.c @@ -7,6 +7,7 @@ #include "../utils/cbor_rpc.h" #include +#include #include #include "process_utils.h" @@ -256,6 +257,56 @@ bool params_get_master_blindingkey( return true; } +// Get the common parameters required when signing an tx input +bool params_tx_input_signing_data(const bool use_ae_signatures, CborValue* params, bool* is_witness, + signing_data_t* sig_data, const uint8_t** ae_host_commitment, size_t* ae_host_commitment_len, + const uint8_t** script, size_t* script_len, script_flavour_t* aggregate_script_flavour, const char** errmsg) +{ + JADE_ASSERT(params); + JADE_ASSERT(is_witness); + JADE_ASSERT(sig_data); + JADE_INIT_OUT_PPTR(ae_host_commitment); + JADE_INIT_OUT_SIZE(ae_host_commitment_len); + JADE_INIT_OUT_PPTR(script); + JADE_INIT_OUT_SIZE(script_len); + JADE_ASSERT(aggregate_script_flavour); + JADE_ASSERT(errmsg); + + if (!rpc_get_boolean("is_witness", params, is_witness)) { + *errmsg = "Failed to extract is_witness from parameters"; + return false; + } + + const size_t max_path_len = sizeof(sig_data->path) / sizeof(sig_data->path[0]); + if (!rpc_get_bip32_path("path", params, sig_data->path, max_path_len, &sig_data->path_len) + || sig_data->path_len == 0) { + *errmsg = "Failed to extract valid path from parameters"; + return false; + } + + // If required, read anti-exfil host commitment data + if (use_ae_signatures) { + rpc_get_bytes_ptr("ae_host_commitment", params, ae_host_commitment, ae_host_commitment_len); + if (!*ae_host_commitment || *ae_host_commitment_len != WALLY_HOST_COMMITMENT_LEN) { + *errmsg = "Failed to extract valid host commitment from parameters"; + return false; + } + } + + // Get prevout script - required for signing inputs + rpc_get_bytes_ptr("script", params, script, script_len); + if (!*script || *script_len == 0) { + *errmsg = "Failed to extract script from parameters"; + return false; + } + + // Track the types of the input prevout scripts + const script_flavour_t script_flavour = get_script_flavour(*script, *script_len); + update_aggregate_scripts_flavour(script_flavour, aggregate_script_flavour); + + return true; +} + // For now just return 'single-sig' or 'other'. // In future may extend to inlcude eg. 'green', 'other-multisig', etc. script_flavour_t get_script_flavour(const uint8_t* script, const size_t script_len) @@ -284,4 +335,4 @@ void update_aggregate_scripts_flavour( // As soon as we see something differet, set to 'mixed' *aggregate_scripts_flavour = SCRIPT_FLAVOUR_MIXED; } -} \ No newline at end of file +} diff --git a/main/process/process_utils.h b/main/process/process_utils.h index 3139c22d..4a2ed4ba 100644 --- a/main/process/process_utils.h +++ b/main/process/process_utils.h @@ -112,6 +112,10 @@ bool params_multisig_pubkeys(bool is_change, CborValue* params, multisig_data_t* bool params_get_master_blindingkey( CborValue* params, uint8_t* master_blinding_key, size_t master_blinding_key_len, const char** errmsg); +bool params_tx_input_signing_data(const bool use_ae_signatures, CborValue* params, bool* is_witness, + signing_data_t* sig_data, const uint8_t** ae_host_commitment, size_t* ae_host_commitment_len, + const uint8_t** script, size_t* script_len, script_flavour_t* aggregate_script_flavour, const char** errmsg); + // Track the types of the input prevout scripts script_flavour_t get_script_flavour(const uint8_t* script, const size_t script_len); void update_aggregate_scripts_flavour(script_flavour_t new_script_flavour, script_flavour_t* aggregate_scripts_flavour); diff --git a/main/process/sign_liquid_tx.c b/main/process/sign_liquid_tx.c index 38e8fd40..7953d3f3 100644 --- a/main/process/sign_liquid_tx.c +++ b/main/process/sign_liquid_tx.c @@ -540,6 +540,7 @@ void sign_liquid_tx_process(void* process_ptr) // txn input as expected - get input parameters GET_MSG_PARAMS(process); + bool is_witness = false; size_t script_len = 0; const uint8_t* script = NULL; @@ -555,47 +556,16 @@ void sign_liquid_tx_process(void* process_ptr) rpc_get_id(&process->ctx.value, sig_data->id, sizeof(sig_data->id), &written); JADE_ASSERT(written != 0); - bool is_witness = false; - ret = rpc_get_boolean("is_witness", ¶ms, &is_witness); - if (!ret) { - jade_process_reject_message( - process, CBOR_RPC_BAD_PARAMETERS, "Failed to extract is_witness from parameters", NULL); - goto cleanup; - } - // Path node can be omitted if we don't want to sign this input // (But if passed must be valid - empty/root path is not allowed for signing) const bool has_path = rpc_has_field_data("path", ¶ms); if (has_path) { - const size_t max_path_len = sizeof(sig_data->path) / sizeof(sig_data->path[0]); - if (!rpc_get_bip32_path("path", ¶ms, sig_data->path, max_path_len, &sig_data->path_len) - || sig_data->path_len == 0) { - jade_process_reject_message( - process, CBOR_RPC_BAD_PARAMETERS, "Failed to extract valid path from parameters", NULL); + // Get all common tx-signing input fields which must be present if a path is given + if (!params_tx_input_signing_data(use_ae_signatures, ¶ms, &is_witness, sig_data, &ae_host_commitment, + &ae_host_commitment_len, &script, &script_len, &aggregate_inputs_scripts_flavour, &errmsg)) { + jade_process_reject_message(process, CBOR_RPC_BAD_PARAMETERS, errmsg, NULL); goto cleanup; } - - // If required, read anti-exfil host commitment data - if (use_ae_signatures) { - rpc_get_bytes_ptr("ae_host_commitment", ¶ms, &ae_host_commitment, &ae_host_commitment_len); - if (!ae_host_commitment || ae_host_commitment_len != WALLY_HOST_COMMITMENT_LEN) { - jade_process_reject_message(process, CBOR_RPC_BAD_PARAMETERS, - "Failed to extract valid host commitment from parameters", NULL); - goto cleanup; - } - } - - // Get prevout script - required for signing inputs - rpc_get_bytes_ptr("script", ¶ms, &script, &script_len); - if (!script || script_len == 0) { - jade_process_reject_message( - process, CBOR_RPC_BAD_PARAMETERS, "Failed to extract script from parameters", NULL); - goto cleanup; - } - - // Track the types of the input prevout scripts - const script_flavour_t script_flavour = get_script_flavour(script, script_len); - update_aggregate_scripts_flavour(script_flavour, &aggregate_inputs_scripts_flavour); } size_t value_len = 0; diff --git a/main/process/sign_tx.c b/main/process/sign_tx.c index b5bbbf80..bc0fd651 100644 --- a/main/process/sign_tx.c +++ b/main/process/sign_tx.c @@ -430,6 +430,7 @@ void sign_tx_process(void* process_ptr) // txn input as expected - get input parameters GET_MSG_PARAMS(process); + bool is_witness = false; size_t script_len = 0; const uint8_t* script = NULL; uint64_t input_satoshi = 0; @@ -448,47 +449,16 @@ void sign_tx_process(void* process_ptr) rpc_get_id(&process->ctx.value, sig_data->id, sizeof(sig_data->id), &written); JADE_ASSERT(written != 0); - bool is_witness = false; - ret = rpc_get_boolean("is_witness", ¶ms, &is_witness); - if (!ret) { - jade_process_reject_message( - process, CBOR_RPC_BAD_PARAMETERS, "Failed to extract is_witness from parameters", NULL); - goto cleanup; - } - // Path node can be omitted if we don't want to sign this input // (But if passed must be valid - empty/root path is not allowed for signing) const bool has_path = rpc_has_field_data("path", ¶ms); if (has_path) { - const size_t max_path_len = sizeof(sig_data->path) / sizeof(sig_data->path[0]); - if (!rpc_get_bip32_path("path", ¶ms, sig_data->path, max_path_len, &sig_data->path_len) - || sig_data->path_len == 0) { - jade_process_reject_message( - process, CBOR_RPC_BAD_PARAMETERS, "Failed to extract valid path from parameters", NULL); + // Get all common tx-signing input fields which must be present if a path is given + if (!params_tx_input_signing_data(use_ae_signatures, ¶ms, &is_witness, sig_data, &ae_host_commitment, + &ae_host_commitment_len, &script, &script_len, &aggregate_inputs_scripts_flavour, &errmsg)) { + jade_process_reject_message(process, CBOR_RPC_BAD_PARAMETERS, errmsg, NULL); goto cleanup; } - - // If required, read anti-exfil host commitment data - if (use_ae_signatures) { - rpc_get_bytes_ptr("ae_host_commitment", ¶ms, &ae_host_commitment, &ae_host_commitment_len); - if (!ae_host_commitment || ae_host_commitment_len != WALLY_HOST_COMMITMENT_LEN) { - jade_process_reject_message(process, CBOR_RPC_BAD_PARAMETERS, - "Failed to extract valid host commitment from parameters", NULL); - goto cleanup; - } - } - - // Get prevout script - required for signing inputs - rpc_get_bytes_ptr("script", ¶ms, &script, &script_len); - if (!script || script_len == 0) { - jade_process_reject_message( - process, CBOR_RPC_BAD_PARAMETERS, "Failed to extract script from parameters", NULL); - goto cleanup; - } - - // Track the types of the input prevout scripts - const script_flavour_t script_flavour = get_script_flavour(script, script_len); - update_aggregate_scripts_flavour(script_flavour, &aggregate_inputs_scripts_flavour); } // Full input tx can be omitted for transactions with only one single witness diff --git a/test_data/txn_large.json b/test_data/txn_large.json index 6d3bcae9..d677b6ee 100644 --- a/test_data/txn_large.json +++ b/test_data/txn_large.json @@ -21,12 +21,10 @@ ] }, { - "is_witness": false, "input_tx": "01000000000106c95eb7348e7c36cd5ac7a178b977cf1851fdb91eadf171eaedba96a6242038540000000000ffffffff7d1397fa029a15eb793ed5130f1f3d4bce121743ae3afc9d4dc20c09be2bb1940000000000ffffffffa6af054281c8ca43b8d88f7ff592843adffcd49a765b911256aa61bcbcceb5b20000000000ffffffff216eb27f2750b801c0a1c1bfe1e009e1d05fe66d421dab0e0913218a4b3b7b0e0000000000ffffffff56e528b8eed008149d256f07d5e18b96dcc047855c4b9a035c0c5138281ef9640000000000ffffffffa521c18e54346e27c795bad7bd53fe7290a0568904deb2cbcba4f707fa0394ca0000000000ffffffff14400d03000000000017a914fb662cb551d6fafff1d6b71acc9f05ac65fd6be587400d03000000000017a9147404244e50e647c3ecfeeee9c2a9965e68e0f46487400d03000000000017a9147404244e50e647c3ecfeeee9c2a9965e68e0f46487400d03000000000017a9142e7e362cec7898ed5953ce7b4c97b55443ada17e87400d03000000000017a914ba25f430d32c9114cc770a80feadbde8a0880b7687400d03000000000017a9147404244e50e647c3ecfeeee9c2a9965e68e0f46487400d03000000000017a914e8d74935cfa223f9750a32b18d609cba17a5c3fe87400d03000000000017a914e8d74935cfa223f9750a32b18d609cba17a5c3fe87400d03000000000017a914ba25f430d32c9114cc770a80feadbde8a0880b7687400d03000000000017a9142e7e362cec7898ed5953ce7b4c97b55443ada17e87400d03000000000017a914fb662cb551d6fafff1d6b71acc9f05ac65fd6be587400d03000000000017a914ba25f430d32c9114cc770a80feadbde8a0880b7687400d03000000000017a9142e7e362cec7898ed5953ce7b4c97b55443ada17e87400d03000000000017a914fb662cb551d6fafff1d6b71acc9f05ac65fd6be587400d03000000000017a9142e7e362cec7898ed5953ce7b4c97b55443ada17e87400d03000000000017a914ba25f430d32c9114cc770a80feadbde8a0880b7687400d03000000000017a914e8d74935cfa223f9750a32b18d609cba17a5c3fe87400d03000000000017a914fb662cb551d6fafff1d6b71acc9f05ac65fd6be587400d03000000000017a914e8d74935cfa223f9750a32b18d609cba17a5c3fe87400d03000000000017a9147404244e50e647c3ecfeeee9c2a9965e68e0f464870400473044022013598e0ad971e0a3ae089656b45950b73e46f39e212cfbf1b3b90233c803639e0220118538302f315fa3329c68fad7c1c4d19f68b98c33ed981a830a95bd42f550a40147304402201104281617d6ca6869a39268bc3ae7d8db3301f675f4c1bca386f6772d6e59090220379db6bbb88a1e9d5b6265dafdda9ade0ef3bdc8caabf0a28a7c759cc920a9620169522102eef9b9d46cb4bb37ef8298b81226e060cd4b34424912ec9c00a514987dc1a087210233073424eebfc5196f4fa3e55fa2ae68c13fdd89e8a2b6c14bfcb915a5ca1cec2102a562562439b56ef38998895eaf45ace0da0e4fb6eb4fb54b99bd4549cd1c962653ae0400483045022100d12251e4f42a7a8e92a5cf158d03a61079381a6c0177610169609c090bd9060b0220454f0febfbd3235f170ead06916e5cc0136e9e54129ba70b548fff64dc0c43b701473044022065276ad331cb311524c076fa74e2afb915238b654fdf85c9c5d2785fe9180cfc0220720e69905860f415aa2dd82a8de0756a034833722773abb9f9c38821f349623d0169522102eef9b9d46cb4bb37ef8298b81226e060cd4b34424912ec9c00a514987dc1a087210233073424eebfc5196f4fa3e55fa2ae68c13fdd89e8a2b6c14bfcb915a5ca1cec2102a562562439b56ef38998895eaf45ace0da0e4fb6eb4fb54b99bd4549cd1c962653ae0400473044022013ed2b58a6b1d81d7ce8f9b1613c842eb638c9b5ea80900af6cea51f28ae5e75022034d4dc7d18449dc0e4ce3df63cf2fe991e617da9c7c0acfb4f17894316cfc7780147304402202ad01945ae3d67cf90804d546c22aa125ccd9462a1d13ad51d3b8f63b7260bf202201e566a26d4d6aa22bc3dff7940e38d6f586420a8d16ac793c6e19b16269f19f90169522102eef9b9d46cb4bb37ef8298b81226e060cd4b34424912ec9c00a514987dc1a087210233073424eebfc5196f4fa3e55fa2ae68c13fdd89e8a2b6c14bfcb915a5ca1cec2102a562562439b56ef38998895eaf45ace0da0e4fb6eb4fb54b99bd4549cd1c962653ae040047304402204a155f6b0c5dd50886d028d637ea15be0e1e813e80e3695e781b3cb4e695fa3002207c8c32f4ee27ddc6d7f6e2a2643edf5ad371e049b11a2775252d7f4a3119ec7301473044022036a9c0b5e6f3e992b28b5f0c49a1408a3881e53cadde8c1fab018de70f0eb0c30220402d9f018641d7691083617a4fdc9008433dc9f1dee30b0f4532b11641e5440e0169522102eef9b9d46cb4bb37ef8298b81226e060cd4b34424912ec9c00a514987dc1a087210233073424eebfc5196f4fa3e55fa2ae68c13fdd89e8a2b6c14bfcb915a5ca1cec2102a562562439b56ef38998895eaf45ace0da0e4fb6eb4fb54b99bd4549cd1c962653ae04004830450221008cb1b8d4e36b30eeab9c67f93d74febe7e952965202c05d203ba0f0673f3897202204db0cae370f9e3e29e0914c2520b1477df30457be64accc293cbf3c13507dfac014730440220257fdfab8682fd1fbec498670f20b32e7c34a0eb864a3332e1369f34e5ba56ca02201ce1d97ba1d46d6b036d835576c64ad56f4e4905dbd77057a69b561252a04a8e0169522102eef9b9d46cb4bb37ef8298b81226e060cd4b34424912ec9c00a514987dc1a087210233073424eebfc5196f4fa3e55fa2ae68c13fdd89e8a2b6c14bfcb915a5ca1cec2102a562562439b56ef38998895eaf45ace0da0e4fb6eb4fb54b99bd4549cd1c962653ae0400483045022100d45b3e024d2eec9ff4780a4b0de672ab17eeb31db349d5ff00c41c110c1bdc3302203f3fecf93c6cd76c4fe89c0cbc95b66b8d9b5ccd54ea62871b5dd342b8d83dc201473044022009c3e65b17f761330d1973bf43f8163fb622fb4607d9a1f844059c042d9cdfa902200926ca4b89ca78cf68d58ee20d4b3e9d8d12cfa023ff13e23261de99cf4df6600169522102eef9b9d46cb4bb37ef8298b81226e060cd4b34424912ec9c00a514987dc1a087210233073424eebfc5196f4fa3e55fa2ae68c13fdd89e8a2b6c14bfcb915a5ca1cec2102a562562439b56ef38998895eaf45ace0da0e4fb6eb4fb54b99bd4549cd1c962653ae732c1800", "path": null }, { - "is_witness": false, "input_tx": "01000000000106c95eb7348e7c36cd5ac7a178b977cf1851fdb91eadf171eaedba96a6242038540000000000ffffffff7d1397fa029a15eb793ed5130f1f3d4bce121743ae3afc9d4dc20c09be2bb1940000000000ffffffffa6af054281c8ca43b8d88f7ff592843adffcd49a765b911256aa61bcbcceb5b20000000000ffffffff216eb27f2750b801c0a1c1bfe1e009e1d05fe66d421dab0e0913218a4b3b7b0e0000000000ffffffff56e528b8eed008149d256f07d5e18b96dcc047855c4b9a035c0c5138281ef9640000000000ffffffffa521c18e54346e27c795bad7bd53fe7290a0568904deb2cbcba4f707fa0394ca0000000000ffffffff14400d03000000000017a914fb662cb551d6fafff1d6b71acc9f05ac65fd6be587400d03000000000017a9147404244e50e647c3ecfeeee9c2a9965e68e0f46487400d03000000000017a9147404244e50e647c3ecfeeee9c2a9965e68e0f46487400d03000000000017a9142e7e362cec7898ed5953ce7b4c97b55443ada17e87400d03000000000017a914ba25f430d32c9114cc770a80feadbde8a0880b7687400d03000000000017a9147404244e50e647c3ecfeeee9c2a9965e68e0f46487400d03000000000017a914e8d74935cfa223f9750a32b18d609cba17a5c3fe87400d03000000000017a914e8d74935cfa223f9750a32b18d609cba17a5c3fe87400d03000000000017a914ba25f430d32c9114cc770a80feadbde8a0880b7687400d03000000000017a9142e7e362cec7898ed5953ce7b4c97b55443ada17e87400d03000000000017a914fb662cb551d6fafff1d6b71acc9f05ac65fd6be587400d03000000000017a914ba25f430d32c9114cc770a80feadbde8a0880b7687400d03000000000017a9142e7e362cec7898ed5953ce7b4c97b55443ada17e87400d03000000000017a914fb662cb551d6fafff1d6b71acc9f05ac65fd6be587400d03000000000017a9142e7e362cec7898ed5953ce7b4c97b55443ada17e87400d03000000000017a914ba25f430d32c9114cc770a80feadbde8a0880b7687400d03000000000017a914e8d74935cfa223f9750a32b18d609cba17a5c3fe87400d03000000000017a914fb662cb551d6fafff1d6b71acc9f05ac65fd6be587400d03000000000017a914e8d74935cfa223f9750a32b18d609cba17a5c3fe87400d03000000000017a9147404244e50e647c3ecfeeee9c2a9965e68e0f464870400473044022013598e0ad971e0a3ae089656b45950b73e46f39e212cfbf1b3b90233c803639e0220118538302f315fa3329c68fad7c1c4d19f68b98c33ed981a830a95bd42f550a40147304402201104281617d6ca6869a39268bc3ae7d8db3301f675f4c1bca386f6772d6e59090220379db6bbb88a1e9d5b6265dafdda9ade0ef3bdc8caabf0a28a7c759cc920a9620169522102eef9b9d46cb4bb37ef8298b81226e060cd4b34424912ec9c00a514987dc1a087210233073424eebfc5196f4fa3e55fa2ae68c13fdd89e8a2b6c14bfcb915a5ca1cec2102a562562439b56ef38998895eaf45ace0da0e4fb6eb4fb54b99bd4549cd1c962653ae0400483045022100d12251e4f42a7a8e92a5cf158d03a61079381a6c0177610169609c090bd9060b0220454f0febfbd3235f170ead06916e5cc0136e9e54129ba70b548fff64dc0c43b701473044022065276ad331cb311524c076fa74e2afb915238b654fdf85c9c5d2785fe9180cfc0220720e69905860f415aa2dd82a8de0756a034833722773abb9f9c38821f349623d0169522102eef9b9d46cb4bb37ef8298b81226e060cd4b34424912ec9c00a514987dc1a087210233073424eebfc5196f4fa3e55fa2ae68c13fdd89e8a2b6c14bfcb915a5ca1cec2102a562562439b56ef38998895eaf45ace0da0e4fb6eb4fb54b99bd4549cd1c962653ae0400473044022013ed2b58a6b1d81d7ce8f9b1613c842eb638c9b5ea80900af6cea51f28ae5e75022034d4dc7d18449dc0e4ce3df63cf2fe991e617da9c7c0acfb4f17894316cfc7780147304402202ad01945ae3d67cf90804d546c22aa125ccd9462a1d13ad51d3b8f63b7260bf202201e566a26d4d6aa22bc3dff7940e38d6f586420a8d16ac793c6e19b16269f19f90169522102eef9b9d46cb4bb37ef8298b81226e060cd4b34424912ec9c00a514987dc1a087210233073424eebfc5196f4fa3e55fa2ae68c13fdd89e8a2b6c14bfcb915a5ca1cec2102a562562439b56ef38998895eaf45ace0da0e4fb6eb4fb54b99bd4549cd1c962653ae040047304402204a155f6b0c5dd50886d028d637ea15be0e1e813e80e3695e781b3cb4e695fa3002207c8c32f4ee27ddc6d7f6e2a2643edf5ad371e049b11a2775252d7f4a3119ec7301473044022036a9c0b5e6f3e992b28b5f0c49a1408a3881e53cadde8c1fab018de70f0eb0c30220402d9f018641d7691083617a4fdc9008433dc9f1dee30b0f4532b11641e5440e0169522102eef9b9d46cb4bb37ef8298b81226e060cd4b34424912ec9c00a514987dc1a087210233073424eebfc5196f4fa3e55fa2ae68c13fdd89e8a2b6c14bfcb915a5ca1cec2102a562562439b56ef38998895eaf45ace0da0e4fb6eb4fb54b99bd4549cd1c962653ae04004830450221008cb1b8d4e36b30eeab9c67f93d74febe7e952965202c05d203ba0f0673f3897202204db0cae370f9e3e29e0914c2520b1477df30457be64accc293cbf3c13507dfac014730440220257fdfab8682fd1fbec498670f20b32e7c34a0eb864a3332e1369f34e5ba56ca02201ce1d97ba1d46d6b036d835576c64ad56f4e4905dbd77057a69b561252a04a8e0169522102eef9b9d46cb4bb37ef8298b81226e060cd4b34424912ec9c00a514987dc1a087210233073424eebfc5196f4fa3e55fa2ae68c13fdd89e8a2b6c14bfcb915a5ca1cec2102a562562439b56ef38998895eaf45ace0da0e4fb6eb4fb54b99bd4549cd1c962653ae0400483045022100d45b3e024d2eec9ff4780a4b0de672ab17eeb31db349d5ff00c41c110c1bdc3302203f3fecf93c6cd76c4fe89c0cbc95b66b8d9b5ccd54ea62871b5dd342b8d83dc201473044022009c3e65b17f761330d1973bf43f8163fb622fb4607d9a1f844059c042d9cdfa902200926ca4b89ca78cf68d58ee20d4b3e9d8d12cfa023ff13e23261de99cf4df6600169522102eef9b9d46cb4bb37ef8298b81226e060cd4b34424912ec9c00a514987dc1a087210233073424eebfc5196f4fa3e55fa2ae68c13fdd89e8a2b6c14bfcb915a5ca1cec2102a562562439b56ef38998895eaf45ace0da0e4fb6eb4fb54b99bd4549cd1c962653ae732c1800" } ] diff --git a/test_data/txn_legacy_ae.json b/test_data/txn_legacy_ae.json index d9794327..c39fcd5a 100644 --- a/test_data/txn_legacy_ae.json +++ b/test_data/txn_legacy_ae.json @@ -19,7 +19,6 @@ "ae_host_entropy": "49aa539ecf1ee2713379e736ed8937e79cb44bcdb5f0115228002274862e429f" }, { - "is_witness": false, "input_tx": "0100000001ace8142aed633be6a06300d3ca7a6a61ccb934281d19aa7d14a267722cecf391010000006a473044022019192805078efeaaab1ebf6662cf8248a2bf39469b2eed09aa5572a112b4fcd902203e33f964c712ddd340ffefe1b1cf3ffeea2317e407da689fa5b67247f417e6200121020c3ef7786a5ff9922895a63cdfd333c9976ff72c677b90239c9a99b5a0c57936ffffffff0210270000000000001976a914dbf5a78f0a5441577b464073f4beefafa364353788ac840d0f00000000001976a9146a76719d014d81fd2c8065ef80703afcbd55454e88ac00000000" }, {