From ed76d9be462c519a9705cadcdecdbc0d83221b4a Mon Sep 17 00:00:00 2001 From: admin Date: Mon, 12 Feb 2018 12:13:16 +0400 Subject: [PATCH] create coinbase transaction --- pybtc/blockchain.py | 20 ++++++-------------- test/block.py | 41 +++++++++++++++++++++++------------------ 2 files changed, 29 insertions(+), 32 deletions(-) diff --git a/pybtc/blockchain.py b/pybtc/blockchain.py index 017c609..f229411 100644 --- a/pybtc/blockchain.py +++ b/pybtc/blockchain.py @@ -617,9 +617,6 @@ class Block(): def calculate_commitment(self, witness = None): wtxid_list = [b"\x00" * 32,] - print(self.transactions) - print(self.transactions[0].witness[0].witness[0]) - # print("len ", len(self.transactions)) if not (len(self.transactions) == 1 and self.transactions[0].coinbase): for tx in self.transactions[0 if not self.transactions[0].coinbase else 1:]: wtxid_list.append(tx.whash) @@ -636,7 +633,6 @@ class Block(): coinbase_input = Input((b'\x00'*32 ,0xffffffff), coinbase, 0xffffffff) tx.tx_in = [coinbase_input] tx.witness = [Witness([b'\x00'*32])] - print(tx.witness[0].witness[0]) commitment = self.calculate_commitment(tx.witness[0].witness[0]) for o in outputs: if type(o[1]) == str: @@ -659,8 +655,6 @@ class Block(): extranonce_start = len_coinbase + extranonce_start return tx[:44 + extranonce_start], tx[44+ len_coinbase:] - result = version + marke_flag + ninputs + b''.join(inputs) +\ - nouts + b''.join(outputs) + witness + self.lock_time.to_bytes(4,'little') @classmethod def deserialize(cls, stream): @@ -669,12 +663,12 @@ class Block(): stream.seek(-80, 1) kwargs = { 'hash': double_sha256(header), - 'version': int.from_bytes(stream.read(4), 'little'), + 'version': stream.read(4), 'prev_block': stream.read(32), 'merkle_root': stream.read(32), 'timestamp': int.from_bytes(stream.read(4), 'little'), - 'bits': int.from_bytes(stream.read(4), 'little'), - 'nonce': int.from_bytes(stream.read(4), 'little'), + 'bits': stream.read(4), + 'nonce': stream.read(4), 'txs': read_var_list(stream, Transaction), 'block_size': stream.tell(), 'header': header @@ -682,19 +676,17 @@ class Block(): return cls(**kwargs) def serialize(self, hex = False): - block = self.version.to_bytes(4,'little') + \ + block = self.version + \ self.prev_block + \ self.merkle_root + \ self.timestamp.to_bytes(4,'little') + \ - self.bits.to_bytes(4,'little') + \ - self.nonce.to_bytes(4,'little') + \ + self.bits + \ + self.nonce + \ to_var_int(len (self.transactions)) for t in self.transactions: if t.hash == t.whash: - print("l") block += t.serialize(segwit = 0) else: - print("s") block += t.serialize(segwit = 1) if hex: diff --git a/test/block.py b/test/block.py index 216bdfe..c802700 100644 --- a/test/block.py +++ b/test/block.py @@ -7,7 +7,7 @@ from pybtc import * block_a = """00000020358d4156e298db6a1158e7796d511e7c3076ab64fd10bed03c1600000000000063b17c526b14f986fc73334d0879fb052daffdd33c1e280baa52d13b67aa98ab9c6d7d5a402b371a9465559c05010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff3103cf891300049c6d7d5a04545d002b0caff5545a289c0100000000000a636b706f6f6c0d2f6d696e656420627920636b2fffffffff02d82cab04000000001976a9147c16d7bcff670c37bab219e9407d75ceafaa34d488ac0000000000000000266a24aa21a9edf97be29b2cda15085a4bac02d8f9bcc6273744287c41e353ba394a6394f68799012000000000000000000000000000000000000000000000000000000000000000000000000001000000000101989da20569b2aca132eb0f8e0090c370d41edf59cf6e1520a8aabb2d1371378d0100000017160014a9389bcb70e54d474465d7ce90bcd8793cf3a9e2ffffffff0280778e060000000017a914a640d6d68fa719d2755bda2552c3e6958fc78bc087fdf684f61500000017a914ce175699405d5329596d3885e6aff61dc22b657d87024830450221009656689a849fe0cbc588442d56418270d21537e6c64d80aad394b57a182c246002200c94e5b11331709dd6b5a13b6643baee1e65537cf601ae5ccc70309185c5f423012102108261b4b61e9cb9bc54049a230e1509513d5a51881db0763cc9ffc50ca50b97000000000100000000010192ef9685c684dc644de8d4763ebf7072c656a1b6595fef9070a959ce42db970e0100000017160014a5b77a54a03531774805d7e97691b0828b5bf7e3ffffffff0280a4bf07000000001976a914efa24b963bc2f47ee35e1d43842668cc12eb3b0288ac42e8adf11500000017a9143c29761703c645d0e2c68dc22a5f56b3c60db37a870247304402205c4952fabdfd3ee859e7fc486762689456580f0ba158179ebfbba630acfa1b0e02205929178f15509b400fcd426d3e17c3e75ee72fd19bf80447ce04cc9297fbe0fb0121032455df65ea00ef726cc39a21f022ab459bb459ba19be604073c33fed2b16836b0000000001000000018cceaf4a6cc6745bc7387e12a69194c3f0f84ca677ea84fd90a27994a0023e5200000000fd660100473044022010a7b12a6c46b59ab25aa65750c51a14a997c83141f9ae5d7e788d473eeb6d3b02204b9087fcdda3317c35a53868db9bf3773e35c0a1b1a3e4c195b18455d915b7e70147304402202d8a8becc14d18e00305d8af81207fd15b53b2d5b0a26ed8e9fbf4dceaee78220220255302d8b6ed246e698887fb1b0550d6e8127ee1d1d5014eea5c779c2b84dd9401473044022032a19463e29fbbf72c198031c4a89eb48ca1556a1fe75c1e96b5a3ed4109023c02202f8db619c12256bbd5122c486a1843f60adba1a400ad7e5e082306e068659024014c8b5321039f37268e558566e5a816bdd32e2fdb46ed0106ead3bbeedd2e56d4ef24803dc02102718a52e82f51fcf0cda12ee34699bee4575430d6c7bb7503a7f243f0d0c3a85521035f62cccfb1108526ce32db4ffecb1d1d1be118899529b6a0697b81b2109994b8210206e93b92d95a053ad1c1bd43a52368c7edeb446caad63506621618fddd75a0a454aeffffffff02e0d40e000000000017a914a1726229f16d5ddf5bb6712b68003d7fed79f0be870000000000000000326a3045584f4e554d0100580f0200000000003080cc90dc9e59cd41664653b6df7419dc50dcbede2ec85c948890fc310a858e000000000100000001f62bf88577e7596b32246788b31119632da7db7df143ac0dd7716f66e1f7b5f300000000fd67010047304402201b0df8489f2ff8258d6d7f81e6a4bae875206d3d9634abf4bdcb26d93b4919af02206b8a05945d029afa84eb13b09667596657edacdc0994aac7d4579c932517661e0147304402206b18469f261a2b9ba044527a99ce5284575031af2b272f68ac284b5e1fc61e7302200269c2240c264a466c2dac545aee38b4b58fd9556a61d2b742dee032670d42d301483045022100e6a9ab3f91e6391ce20194084911e28ac1004f7970d7fc3b2d2b05325a048fb20220433616d1053d61780812cf7638ce66d4fbff85aab2d2761cea583b81bd8ee004014c8b532102949dcb6f05bc5b1fb8855aa0cbbd883edc70b1785a492bf1fa0c0287a8befc3321023193f287b227fb572f63d11aaa03a05fafc47f29caa5f8bb350359bc24191cee2103cd4aa05c4952acf1c29185df960e68787ac59aa30d6e748ff833522e4d11c8e3210221b476c94496bef7c4ace3af3e9c7bc805587f67870c425cafc6dc4a7bafe74754aeffffffff02f8530e000000000017a914b68c3488d295902dd465b486cc51be2d29af2408870000000000000000326a3045584f4e554d0100e0930400000000004892a52323d0775a566e44467b4f7aa1b0723cc98ec9e9e3f3ba266d658c8cb000000000""" # 00000020358d4156e298db6a1158e7796d511e7c3076ab64fd10bed03c1600000000000063b17c526b14f986fc73334d0879fb052daffdd33c1e280baa52d13b67aa98ab9c6d7d5a402b371a9465559c05010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff3103cf891300049c6d7d5a04545d002b0caff5545a289c0100000000000a636b706f6f6c0d2f6d696e656420627920636b2fffffffff02d82cab04000000001976a9147c16d7bcff670c37bab219e9407d75ceafaa34d488ac0000000000000000266a24aa21a9edf97be29b2cda15085a4bac02d8f9bcc6273744287c41e353ba394a6394f68799012000000000000000000000000000000000000000000000000000000000000000000000000001000000000101989da20569b2aca132eb0f8e0090c370d41edf59cf6e1520a8aabb2d1371378d0100000017160014a9389bcb70e54d474465d7ce90bcd8793cf3a9e2ffffffff0280778e060000000017a914a640d6d68fa719d2755bda2552c3e6958fc78bc087fdf684f61500000017a914ce175699405d5329596d3885e6aff61dc22b657d87024830450221009656689a849fe0cbc588442d56418270d21537e6c64d80aad394b57a182c246002200c94e5b11331709dd6b5a13b6643baee1e65537cf601ae5ccc70309185c5f423012102108261b4b61e9cb9bc54049a230e1509513d5a51881db0763cc9ffc50ca50b97000000000100000000010192ef9685c684dc644de8d4763ebf7072c656a1b6595fef9070a959ce42db970e0100000017160014a5b77a54a03531774805d7e97691b0828b5bf7e3ffffffff0280a4bf07000000001976a914efa24b963bc2f47ee35e1d43842668cc12eb3b0288ac42e8adf11500000017a9143c29761703c645d0e2c68dc22a5f56b3c60db37a870247304402205c4952fabdfd3ee859e7fc486762689456580f0ba158179ebfbba630acfa1b0e02205929178f15509b400fcd426d3e17c3e75ee72fd19bf80447ce04cc9297fbe0fb0121032455df65ea00ef726cc39a21f022ab459bb459ba19be604073c33fed2b16836b0000000001000000018cceaf4a6cc6745bc7387e12a69194c3f0f84ca677ea84fd90a27994a0023e5200000000fd660100473044022010a7b12a6c46b59ab25aa65750c51a14a997c83141f9ae5d7e788d473eeb6d3b02204b9087fcdda3317c35a53868db9bf3773e35c0a1b1a3e4c195b18455d915b7e70147304402202d8a8becc14d18e00305d8af81207fd15b53b2d5b0a26ed8e9fbf4dceaee78220220255302d8b6ed246e698887fb1b0550d6e8127ee1d1d5014eea5c779c2b84dd9401473044022032a19463e29fbbf72c198031c4a89eb48ca1556a1fe75c1e96b5a3ed4109023c02202f8db619c12256bbd5122c486a1843f60adba1a400ad7e5e082306e068659024014c8b5321039f37268e558566e5a816bdd32e2fdb46ed0106ead3bbeedd2e56d4ef24803dc02102718a52e82f51fcf0cda12ee34699bee4575430d6c7bb7503a7f243f0d0c3a85521035f62cccfb1108526ce32db4ffecb1d1d1be118899529b6a0697b81b2109994b8210206e93b92d95a053ad1c1bd43a52368c7edeb446caad63506621618fddd75a0a454aeffffffff02e0d40e000000000017a914a1726229f16d5ddf5bb6712b68003d7fed79f0be870000000000000000326a3045584f4e554d0100580f0200000000003080cc90dc9e59cd41664653b6df7419dc50dcbede2ec85c948890fc310a858e000000000100000001f62bf88577e7596b32246788b31119632da7db7df143ac0dd7716f66e1f7b5f300000000fd67010047304402201b0df8489f2ff8258d6d7f81e6a4bae875206d3d9634abf4bdcb26d93b4919af02206b8a05945d029afa84eb13b09667596657edacdc0994aac7d4579c932517661e0147304402206b18469f261a2b9ba044527a99ce5284575031af2b272f68ac284b5e1fc61e7302200269c2240c264a466c2dac545aee38b4b58fd9556a61d2b742dee032670d42d301483045022100e6a9ab3f91e6391ce20194084911e28ac1004f7970d7fc3b2d2b05325a048fb20220433616d1053d61780812cf7638ce66d4fbff85aab2d2761cea583b81bd8ee004014c8b532102949dcb6f05bc5b1fb8855aa0cbbd883edc70b1785a492bf1fa0c0287a8befc3321023193f287b227fb572f63d11aaa03a05fafc47f29caa5f8bb350359bc24191cee2103cd4aa05c4952acf1c29185df960e68787ac59aa30d6e748ff833522e4d11c8e3210221b476c94496bef7c4ace3af3e9c7bc805587f67870c425cafc6dc4a7bafe74754aeffffffff02f8530e000000000017a914b68c3488d295902dd465b486cc51be2d29af2408870000000000000000326a3045584f4e554d0100e0930400000000004892a52323d0775a566e44467b4f7aa1b0723cc98ec9e9e3f3ba266d658c8cb000000000 block_b = "00000020770aa9d59da8a8d897ed2aa023755d774c859bd7740e3fa6ef11000000000000a1bdc212eaae007129353da83ba81c3361681fcd526a9543f6b0210b4e595d1a5d8a7d5a402b371ae4be5a2202010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff2b03df891300045d8a7d5a0456360e330c64887d5a73887d5a410f00000a636b706f6f6c07746573746e6574ffffffff02699ea904000000001976a91422ba040f820174c8ad8d3b568c2801390a81fa8c88ac0000000000000000266a24aa21a9ed15e05d39fb8de40813e91f4029eb0c0bdfd27df73bca3253b4c738c1cd8b374e012000000000000000000000000000000000000000000000000000000000000000000000000001000000000101875e650b1096e216784b141f98318ec9c6f4093cade620ffad8c753304b6028101000000171600142392b05ad19a4706f1a5c3feb1f37690b964cab5ffffffff0263190000000000001976a914eb2d08a5e7839661eaf02a39289f991ad8b44d2688ac3d9683d71500000017a914a10bf0bf639376e87a6b94559a67a328e88484f28702483045022100bd9b6f580242576d069b6e0cda91260166b969fbe8748a7238364324c669031a022051e602d7b0de61442d064baaef85a355667ffcb89b45aa7fa0f3eacf68a1aa8401210351286a6b3f8f603f35e8bdcda042973fcfe31385ef436e04c2c733fe8dead8d700000000" - +block_c ="00000020000000000000103cd40624d96d263493b88f71a148233b93451c4550c7e1c50a3cf28d16f386fc108a349edd9b5cde0935a0b7433aa4bd63145c83ade7dc93e75a80b5e71a372b4005bfac060a010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff2303278d130068747470733a5c6170692e6269746170732e636f6d20d4ce1ac82a6b0000ffffffff02cafcab04000000001976a914d4e49947b9f545218cd20389244c249d3520545d88ac0000000000000000266a24aa21a9ed9c8ebeb53b3138337dcaacf0fb4d8fc1ce22a703312490bc6052cf1612ca6f57012000000000000000000000000000000000000000000000000000000000000000000000000002000000014733f43bb0952e3923ca689c4654da57222ef6b206cddd98985e80cec70ae581000000006b483045022100c309ebef9f2ea1d90336744e5a16a3d9cffafac9703ad88d2238859bebb440ff02203237047ab7ceacb5b94c35d5ea328775ecc898d2ba31272d06547e62f4665a0f0121037d094a55f3e12250aae026d3c04200d4dac282119601582678e2132b3bb2b078feffffff02ff547e04000000001976a9147863159848199efe02a51173e0cb5450d34d6f0c88acee0673c9120000001976a9146507aba717d88d7a48c75e59e3029e4b8ba3d15a88acce8c130002000000013b4973fa693a5ed999b488c494875bf5dee3f0201bd624d5f69a45499d263306010000006a473044022027f0a45246e972dfeb4a472ea46e3ac0ea55d8afbed2dd3af4ab04a3fc2e48e302203fc530e0f1206ab001eb8f663f0b8d64d4947d56900d3deccb073839285feccb012102d385d34c77c3125b7960a7b50fc9217c5e9916d49741f5ac56c35ae8da4dfe30ffffffff020000000000000000256a235357019c81d330a82cc58dafdab97093d841f5fa8f92d77eac54d0f1a23b22c2d187a35eaa0200000000001976a914278474a2dcb178ad4bd4f0f78064e0f5b0edf6e588ac0000000002000000017c98882bf8edf7f85f20fbb04eddd51839327773b75779611a231d0f92636b05010000006a473044022018e5f483b4bbdd94862d9f9b01eaf46c191ce8538dee5bdcf23d96e095305c840220557c2efc5a807bfa1d1d8ba0ce31d0b80edb76a35b3ada544fad03cb1439b5b0012102d385d34c77c3125b7960a7b50fc9217c5e9916d49741f5ac56c35ae8da4dfe30ffffffff020000000000000000256a235357019c81d330a82cc58dafdab97093d841f5fa8f92d77eac54d0f1a23b22c2d187a3bba70c00000000001976a914278474a2dcb178ad4bd4f0f78064e0f5b0edf6e588ac0000000002000000012bf1cba437312f6e8a9ef9a3a645fdd4369e26fefff607b0a6f971f06b8c75d3010000006a47304402206f472cf510fedcd44986ffbdd4df45c76bcfe149747794259f4db3e2a2490108022012e7f5a2737646bc2ceebae7f81166529ded77cc7b008f78ad481ca6fc46dbfe012102d385d34c77c3125b7960a7b50fc9217c5e9916d49741f5ac56c35ae8da4dfe30ffffffff020000000000000000256a235357019c81d330a82cc58dafdab97093d841f5fa8f92d77eac54d0f1a23b22c2d187a3f7691f00000000001976a914278474a2dcb178ad4bd4f0f78064e0f5b0edf6e588ac000000000200000001260ff9bd233cf6c1597dcdabcbf78b11184419fc1bd3966d289a25ebe5cfde1e010000006a473044022069cf55fe3c50600f9f876d24a73d1e5fc9897e2a360e77d2719faa36eeb59251022066a0d7b851e87febc80c704fc09cddc9f96379027c7a1247f69c9818c185aad9012102d385d34c77c3125b7960a7b50fc9217c5e9916d49741f5ac56c35ae8da4dfe30ffffffff020000000000000000256a235357019c81d330a82cc58dafdab97093d841f5fa8f92d77eac54d0f1a23b22c2d187a3bc180f00000000001976a914278474a2dcb178ad4bd4f0f78064e0f5b0edf6e588ac0000000002000000016aac147c604bb883e676e1c3fe2b1e60ba6fcc3573b334e70e287354843414c6010000006a473044022036f18ce444229d2bb0a4e5ef10278ac82670ef197471353f8b67b3694abc351a02207c6d58e9aa84234c2244c33eadc5401ba9019b853a9d258d6e8b498932b74cb6012102d385d34c77c3125b7960a7b50fc9217c5e9916d49741f5ac56c35ae8da4dfe30ffffffff020000000000000000256a235357019c81d330a82cc58dafdab97093d841f5fa8f92d77eac54d0f1a23b22c2d187a3bcbf0800000000001976a914278474a2dcb178ad4bd4f0f78064e0f5b0edf6e588ac0000000001000000028e59bf8afd391881a33e4e277373852d384096693654f9ee57eb571813f3814f01000000fdfe0000483045022100c65c19e9c36003111e994dea2555267c71d6d5a7ba70372146b460c46914842402201f850408d6fd0531b4bc97a7ea10fc5eaa886437d3174b19d87e22c59d232ab301483045022100c35ba17f5c2c62ef46499f4c15dcbc0130193853a2a75835ac4782c3f3f1c08b02207181bc732de489496f293678bc529e6c8092e1fdc7b7f4e4d254966660be7460014c69522102be54e9a71908f8ca9d73fa39d0cdfa42c462d28c8bd78f892c5d7c66e6b8d3752103ee6e1f7e41ab7b5401b22bc1e065493ed82b789c298196125acb75b7c598f603210393abd91f1d414ac15e7934788b8f3d91175b1fc979b8b14fd67fb6b2091ae1fb53aeffffffff9a66238a971a939926a6ac653caabf7c2781afc850358ceea50ebfaaeb7c70d900000000fdfd000048304502210082bdce0d12ba7de95103e79a25ad2d70529ed1a3fb091f07bee56905dbd759ce02200390714c151d52ad7ab95300f4c9af22f13c65f57546f68092848fbc36f782950147304402202da2ccfb83e71b2a5fe16709d5aa14992a596d4c828bca9899cbb3783a1c5428022054086bb02db7ad1d5fff34760275ef068a6042cce244c6354f70e283a76aafec014c695221029462cfdefa0f1a790c2bcc6a8e0201ab663be0e65d92c71f5e04727fd0bb2ab42102177373a3da72987fe3e39fe800ba1d2dbeb7d6fcd404db051329cbba28ecbbf82102478a976eef94fba38c86da8dca474593a9149ee9d08b7550e751df8c1509b52e53aeffffffff02a08601000000000017a914b78eaa6e1b0d4510dfc78bece72f3a517e0a162687764a00000000000017a914dddd2d4eb5950c8ec394ea44081560a6b1c3ef73870000000002000000014a87b7e27bfdbae90103aed7267531ad61ddd73fda99a51dd7c987b74bd54086010000006b483045022100b509165fa40bd108e44dc2d31891f350511fc14c3aae782e5bb85f4f9c4e539d022061602033ff412b24d4b6bcfd294ebd0afee5d83b5a45eea93113d1e525b121b7012102d385d34c77c3125b7960a7b50fc9217c5e9916d49741f5ac56c35ae8da4dfe30ffffffff020000000000000000256a235357019c81d330a82cc58dafdab97093d841f5fa8f92d77eac54d0f1a23b22c2d187a38e960400000000001976a914278474a2dcb178ad4bd4f0f78064e0f5b0edf6e588ac000000000200000001b1ff0067cfb3663c3e9fa8704ea190f086a4be6898ff03251ec3d71a6a40b551b00000006b4830450221009a99303bcb8d86cbdc9acce6c512fc6e7bcc502b1877438473edf5e2caaf141c02206169d5a837a07b37ec7b94119329aa69268e85ab6fdf1da0a04fc2381a93fb1201210242cb74d74bc5d281d80dd2ab21a4e5f454c177a775d1bec3aac0af461fb7afdbffffffff0100050000000000001976a914ffa73d19c1d7b4a81f7eb42df1731b499734da9488ac00000000" block_template = { "capabilities": [ "proposal" @@ -588,21 +588,26 @@ class BlockDeserializeTests(unittest.TestCase): print("\nTesting Block class deserialization:\n") def test_block_deserialize(self): block = blockchain.Block.deserialize(block_a) - b = block.serialize(hex=1) - print(">>>",b == block_a) - print(rh2s(block.transactions[0].hash)) - cbm = block.coinbase - cb = block.transactions.pop(0) - outs = [] - for out in cb.tx_out: - if out.pk_script.ntype != 3: - outs.append((out.value, out.pk_script.raw)) - cb2 = block.create_coinbase_transaction(block.height, outs, cbm ) - print(cb.serialize(hex=True)) - print(cb2.serialize(hex=True)) - print(cb.serialize(segwit = 0,hex=True) == cb2.serialize(segwit = 0 ,hex=True)) - print(cb.serialize(segwit = 1,hex=True) == cb2.serialize(segwit = 1 ,hex=True)) - b = block.serialize(hex=1) - print(b == block_a) - print(b) \ No newline at end of file + print(">>>",block.bits) + print(">>>",block.hash) + print(">>>",block.timestamp) + target = int.from_bytes(block.bits[1:], 'big') * (2 ** (8 * (block.bits[0] - 3))) + print(int.from_bytes(block.hash, 'big')