all: implement support for pre-overwinter prevtx (fixes #1030)

pull/1090/head
matejcik 4 years ago committed by matejcik
parent f09dcc412e
commit e6e3043096

@ -226,8 +226,6 @@ def sanitize_tx_meta(tx: TransactionType, coin: CoinInfo) -> TransactionType:
raise wire.DataError("Timestamp must be set.")
elif not coin.timestamp and tx.timestamp:
raise wire.DataError("Timestamp not enabled on this coin.")
if coin.overwintered and tx.version_group_id is None:
raise wire.DataError("Version group ID must be set.")
elif not coin.overwintered:
if tx.version_group_id is not None:
raise wire.DataError("Version group ID not enabled on this coin.")

@ -29,7 +29,7 @@ from .bitcoinlike import Bitcoinlike
if False:
from typing import Union
from .writers import Writer
from ..writers import Writer
OVERWINTERED = const(0x80000000)
@ -69,13 +69,18 @@ class Overwintered(Bitcoinlike):
def write_tx_header(
self, w: Writer, tx: Union[SignTx, TransactionType], witness_marker: bool
) -> None:
# nVersion | fOverwintered
write_uint32(w, tx.version | OVERWINTERED)
write_uint32(w, tx.version_group_id) # nVersionGroupId
if tx.version < 3:
# pre-overwinter
write_uint32(w, tx.version)
else:
# nVersion | fOverwintered
write_uint32(w, tx.version | OVERWINTERED)
write_uint32(w, tx.version_group_id) # nVersionGroupId
def write_tx_footer(self, w: Writer, tx: Union[SignTx, TransactionType]) -> None:
write_uint32(w, tx.lock_time)
write_uint32(w, tx.expiry) # expiryHeight
if tx.version >= 3:
write_uint32(w, tx.expiry) # expiryHeight
# ZIP-0143 / ZIP-0243
# ===

@ -1339,9 +1339,10 @@ void signing_txack(TransactionType *tx) {
signing_abort();
return;
}
if (coin->overwintered && !tx->has_version_group_id) {
if (coin->overwintered &&
(tx->version >= 3) != (tx->has_version_group_id)) {
fsm_sendFailure(FailureType_Failure_DataError,
_("Version group ID must be set."));
_("Version group ID must be set when version >= 3."));
signing_abort();
return;
}
@ -1366,7 +1367,8 @@ void signing_txack(TransactionType *tx) {
}
tx_init(&tp, tx->inputs_cnt, tx->outputs_cnt, tx->version, tx->lock_time,
tx->expiry, tx->extra_data_len, coin->curve->hasher_sign,
coin->overwintered, tx->version_group_id, tx->timestamp);
coin->overwintered && tx->version >= 3, tx->version_group_id,
tx->timestamp);
#if !BITCOIN_ONLY
if (coin->decred) {
tp.version |= (DECRED_SERIALIZE_NO_WITNESS << 16);

@ -39,6 +39,19 @@ TXHASH_e38206 = bytes.fromhex(
"e3820602226974b1dd87b7113cc8aea8c63e5ae29293991e7bfa80c126930368"
)
TXHASH_v1 = bytes.fromhex(
"fb91ae741b120125b6d5c33a62f50a201b6ffd1cdc470c378c1ac8c654808246"
)
TXHASH_v2 = bytes.fromhex(
"03d30e19959d46d62ac796b8b23497b8c5700c59c4c75e1dbce7b8de49e242ef"
)
TXHASH_v3 = bytes.fromhex(
"f9418829d18140815f961c3f968b08700c283b616f3cb0f43413ae89e68ab76c"
)
TXHASH_v4 = bytes.fromhex(
"5d8de67264b08eecc8e3bee19a11a7f54a2bce1dc4f2a699538e372ae92e9c0f"
)
@pytest.mark.altcoin
@pytest.mark.zcash
@ -177,3 +190,61 @@ class TestMsgSigntxZcash:
details=details,
prev_txes=TX_API,
)
def test_spend_old_versions(self, client):
# inputs are NOT OWNED by this seed
input_v1 = proto.TxInputType(
address_n=parse_path("m/44h/1h/0h/0/0"),
amount=123000000,
prev_hash=TXHASH_v1,
prev_index=0,
)
input_v2 = proto.TxInputType(
address_n=parse_path("m/44h/1h/0h/0/1"),
amount=49990000,
prev_hash=TXHASH_v2,
prev_index=0,
)
input_v3 = proto.TxInputType(
address_n=parse_path("m/44h/1h/0h/0/2"),
amount=300000000,
prev_hash=TXHASH_v3,
prev_index=1,
)
input_v4 = proto.TxInputType(
address_n=parse_path("m/44h/1h/0h/0/3"),
amount=100000,
prev_hash=TXHASH_v4,
prev_index=0,
)
inputs = [input_v1, input_v2, input_v3, input_v4]
for i, txi in enumerate(inputs, 1):
txdata = TX_API[txi.prev_hash]
assert txdata.version == i
output = proto.TxOutputType(
address="tmNvfeKR5PkcQazLEqddTskFr6Ev9tsovfQ",
amount=sum(txi.amount for txi in inputs),
script_type=proto.OutputScriptType.PAYTOADDRESS,
)
details = proto.SignTx(
version=4, version_group_id=0x892F2085, branch_id=0x76B809BB,
)
with client:
_, serialized_tx = btc.sign_tx(
client,
"Zcash Testnet",
inputs,
[output],
details=details,
prev_txes=TX_API,
)
assert (
serialized_tx.hex()
== "0400008085202f890446828054c6c81a8c370c47dc1cfd6f1b200af5623ac3d5b62501121b74ae91fb000000006b483045022100d40e85efbadd378fc603dc8b11c70774086de631fe5b1418ac2b95a478f86507022072e999d8ddd75a0b33bd2adcc88e7234e6251b9e73c9223e7c59e0d1f8d1ff220121030e669acac1f280d1ddf441cd2ba5e97417bf2689e4bbec86df4f831bf9f7ffd0ffffffffef42e249deb8e7bc1d5ec7c4590c70c5b89734b2b896c72ad6469d95190ed303000000006b483045022100917d96445d64c80f9569cb9ca45c04c9b6d7b0fda6b9fd0b1d311837366c699202202cd6140489cf38b5d97ed271ba28603f4693c2a36113cc6ec423301f077c5a8e01210294e3e5e77e22eea0e4c0d30d89beb4db7f69b4bf1ae709e411d6a06618b8f852ffffffff6cb78ae689ae1334f4b03c6f613b280c70088b963f1c965f814081d1298841f9010000006a473044022058768c74c9b1698070636388d7d2ae8223748f13b0a5f402716e4d49fc5bc5f30220658d1e6095dcfbe66669b4141d23af28c9ed5bae73480889429b41742be85f32012103f5008445568548bd745a3dedccc6048969436bf1a49411f60938ff1938941f14ffffffff0f9c2ee92a378e5399a6f2c41dce2b4af5a7119ae1bee3c8ec8eb06472e68d5d000000006b483045022100e64853d86bed039c4edce4abaf80d41486cd21c63bec79c0308ea05a351663e302206732aa22a5dee7bd7f3cc8268faebe31a08abadb4b7e3a4257509bc7baa052b60121029ad0b9519779c540b34fa8d11d24d14a5475546bfa28c7de50573d22a503ce21ffffffff01d0c7321c000000001976a91490ede9de4bed6e39008375eace793949de9a533288ac00000000000000000000000000000000000000"
)

@ -0,0 +1,18 @@
{
"bin_outputs": [
{
"amount": 49990000,
"script_pubkey": "76a914e41d2725ac1a94bede7a3fc22bc947868d256b0388ac"
}
],
"inputs": [
{
"prev_hash": "2036b9e0be36ba6290b4c4620977bf5651bb0fe2a98a8c91209e63871fbc36df",
"prev_index": 1,
"script_sig": "4730440220571b26c526fe134cbff55b785378a1a9f82a4e5804d99deae687db252a1fc07902200832f2a168a5abc2ec65fd3b5ca8db2e6a48e3293b7788564d74edb39ad6b82b012102b90005cdffb95885a3363d7361d42c0b1abfd2250d72348eb97c56d8a41d5d90",
"sequence": 4294967295
}
],
"extra_data": "0180f0fa0200000000000000000000000066e62d5418432ebcbeaeeaeeb15e94722f2ce3173cb8b43ee5a0f2bb46f18b2f3605fc432aee5015c2c60572243cb2bf8e77b8ce8813d08f48edaf8791df1353f6ed6c64dcf85d4cd0d4414f8531fc863b9948a6fb9a369a6e7c40906bca6fdb6b1f4f9bdebbd822e4370096643bd7861150d60b8dc12312a10dd6fb44cbb5764c51344af3e86d62325aa74145aac20bfd953ea1cc17bfefb1b8e4d530d9b15885191ecd9fc987d7238695ef7d0d38d2b64ed24186775aa3dfe543719b0b7e14bfc671ed1164f3bbd9a4e267bde1755b4225ca4633e0eedc61c4e2248a30ed80b24918cb5ec731a6f1bfbe23425028dfb1f850457f11489759eb58de1a06b451fd2582297374f22ae9b1461fc43ba79ac8e627406089abc1f4438d4bd603abce02124acd18e700ea56a4f3f58d00b58382a1927f2fd01ee5cd17207b3b0bfe00420304dc301df522a86848e675de19c66d4bc9759a653d1247a702366bbfc4ba81870b019d7378d397e6641f16c59c1d4b5da05721adea8563cfc79b3d23976548d37364fa88491593486e7877eb12ccf059b7aed248da9466c18d38dd1609163be9390215c7b3f51f82a126ecb8e6d358b413d836a7850f76044bacb04723081749e78b032249746dfb23dd24ed0d8a21185891483271b60de85ef1bf30b22c7c73ca737a0310405169f78ac0781a15b746cf47c97ce741949d31abaf41f3c6500bcb0dfe0f022b133298b4b11f2be2c12e6f0f622259c46eca07dd57df13c9720da8d5253094020c9a6fc4140831e99c57acc7b52cda69170dd58ceb60841c7e826503d0580c227bf438fd2925094b9545d60d048c2b65e7d8895fb2dda28a38a6460b2b8344186e177cc3f8d00277795728caeed3331a11ac4bdceddd77afeabb4d2e6570b7e3a3d7dfd4c645921f4bf2316054dbfe919d25cecda56ee049667a1edb8b4e24fe067de6f90a9a232a0ec2921c445fca7d208e656e3ab439b42dc81c278bd068bebb97ec2732635d88af856198a9ae9aa0e4ac26b0b8110c1c2ed67152ef40694cc565a83e39962a56ada4a355371632cc10b8aa8c2cfb076a6ea704db19bec85ddfec66454f70bd79b395108f8cd0db287d8f60fdb0d901debc5a5d9fffedc7780e22553f7c450fc148ccddb24b889d75a53e705c7604ae8167641a6e0f1e2a62706cf3b97f8c31b58f85cd20dd956bd8249085f5fa17c9f48361146ae92bf5814dc17e3b55a860be4812390fb6c6188e46f52cfdcf8e7124bd13a7a893b3cd938606c62e83e06ee41cc88c1c402dd8680f37bd328aa84771aa1f9507ab8be11409c7b9af1eb7ff56fd3c271f7590cf7369f57c899c190d22bdaed445e0149a53f8c2cf36d4c038b76a57841d583d100701a8eae12339d997d43b2e2f1ee3bfedcb63818f93461eaf60265f2e511075452ac2c93503b455cbbf0f7ade7eb5fe762f58af97e15b90c79793ee7d6b6dc13a84a5ae21066d4f658aa011247eccf4da44a720dcf6a07c48f67c36259189d93fe63e75cf01a5da0ae856c1c92e1aa9ede062e173c204ae9a7de52c2a2f177da8be275b6b06aad158c12e9c561fbd00dfe576637423edfa1ce0089ef924431f97867c94650cd1760dc64b0e03783c24ad786fa1182d883a77f33d615fe515d8ec7960ebb6dc135b65964a8dae67d9f358eef343dbb2d010f143828234fd351bd8cc4f4d5a06be3c0469428d3d17dd99d565a450057ad6782765e0b4116b54c2de545dc7737849ef0d6a1fc07401b7346ce8c3c46e8d34e17221ba9244da866d9dc5a1e89d9ef1a536a925990c40e0d7bff27a7f2c673cd157ce95178107f3db887d5aaef29aed158a7267bc636fe0fd0c1767c5f70b7ac87a7593fbf6201dd0fa2037e35b5d2ea57ebbba1c72148a6b307b72ab0f449e492d0b36ba6a349163b7e2f7570e71bc068de097d3fff3f30eb0014ad4357fcc8eb99a9a144ecf53d85cc1edc100f22429c70679afd4d08e4d0f4b9008a3c7f360d99851308633fa36bffe608c01e008756611d193bd6a07b47453e4cc7b7c499741ae9703c433c87216976c52f4b656090d2b3988ba6ec625c2047e1e1e19a7a0b7e0dbb17af290b23d8d74f55149353425eb6be85e492272669842673bb5e7b91a68c8eaaba9ca8bf84769b82d127f0a555b328e6b2001488d0d9e812656320610f5210e31349ce056d0294e6afda9532aaa1620e55cbf7e2a292ce53a47ea0f35fee219e666f78628d0efd238a8f128e5f0e668f6fcbc5b214c69c0adfa072f3fba8f9d1150473e539e12dceb72615b04e99ff2d68e5491228edbe893f6218a1b0634ac1b5368dddb64d7979a2e07c62422add5c92731d261c83f584333525c2f7294b5d1ad5e68d952e0748228feb9695a6d20acdb26b7ad44c1860a519ce040dc2e154ef0d03c09a55da09094746cd2b8ad04e625090155bb838e1b6941919b38054e75e4dfc9042efed1353d7eaafa0f566ea092d6d2c0075cf5009763ab1e38f6239d54f85b4fcd25726b9aa98f4f1a05b672a7012ed603d0e14bbe8bf2456c630c8e7709799911eb736a48517dabcb3709a2986616c156e8f87244c523dd44314cacb70a74c743a447214c66e2bf862c0ea5270ec9f9e564f6632045ab74a9905fe93a292abe7500",
"version": 2
}

@ -0,0 +1,24 @@
{
"bin_outputs": [
{
"amount": 100000,
"script_pubkey": "76a9149b3169e886c51e1fa9e44e3d6d1ab6716e32849c88ac"
},
{
"amount": 729179223,
"script_pubkey": "76a91490ede9de4bed6e39008375eace793949de9a533288ac"
}
],
"inputs": [
{
"prev_hash": "7a25323386b6bb5cc0e99779ffc323014c3672e16c09fdadcf5e680a207788f3",
"prev_index": 1,
"script_sig": "4730440220344d3bc054eb30ca3a43bde0522c51bc475461c0c3a3d0328820351da528c040022045bfd98057f2446bd498bae29a7a76f9c95d375092ee13b95a568c50995e051e012102dd8ffe8dffdb27bc39b1aca58a89102f3a166240673503db9f14b03920a2e101",
"sequence": 4294967295
}
],
"expiry": 10000000,
"extra_data": "0000000000000000000000",
"version": 4,
"version_group_id": 2301567109
}

@ -0,0 +1,25 @@
{
"bin_outputs": [
{
"amount": 331164603,
"script_pubkey": "76a9143d74bfaaa3350399cade6bd43d866d69cae759f188ac"
},
{
"amount": 300000000,
"script_pubkey": "76a914837451e69716a2dac13b6f98ace4d9405f64374488ac"
}
],
"inputs": [
{
"prev_hash": "b980eeb137f0078603e187839ee03f1643154abbb96ac0d65bdcf09842688cc5",
"prev_index": 1,
"script_sig": "483045022100dbe1cbb94581a42dcb8b24b454158d46dc5b72039dab1e4c607323ccef31235d0220449132fdb19aebccdd2a4f1402fb56801b23639bc97ae43ac4f5c977d6b3a66501210201d494a45f36f545443bafd1a9050b02f448dd236bb4ce2602f83978980b98f2",
"sequence": 4294967294
}
],
"expiry": 208963,
"extra_data": "00",
"lock_time": 208932,
"version": 3,
"version_group_id": 63210096
}

@ -0,0 +1,22 @@
{
"bin_outputs": [
{
"amount": 123000000,
"script_pubkey": "76a9149062b916fd17c35adb105b79e6ae78f4d02db1fb88ac"
},
{
"amount": 744857242,
"script_pubkey": "76a914ed48aa1326c67f80bdd751acd54033efc41d4a6e88ac"
}
],
"inputs": [
{
"prev_hash": "57dc0b2b6d4fe89a3d652b11a3311ea01e0055599d7835a3c225c1d9a321097c",
"prev_index": 0,
"script_sig": "483045022100d5fe30a06ed47a1314f27c8c97ee883492868dd932e40d013c431a372147185a02207933223190406c20f21d94861c84eca5de497af9282e1cd7ae88d088b10ff2fb0121024122b78d5763ff39cccc4d8606e945ad9ff8f5f76aa24207dc5aa417435280ca",
"sequence": 4294967295
}
],
"extra_data": "",
"version": 1
}
Loading…
Cancel
Save