diff --git a/src/main/java/com/sparrowwallet/drongo/protocol/Block.java b/src/main/java/com/sparrowwallet/drongo/protocol/Block.java new file mode 100644 index 0000000..efc97d5 --- /dev/null +++ b/src/main/java/com/sparrowwallet/drongo/protocol/Block.java @@ -0,0 +1,45 @@ +package com.sparrowwallet.drongo.protocol; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class Block extends Message { + private BlockHeader blockHeader; + private Sha256Hash hash; + private List transactions; + + public Block(byte[] payload) { + super(payload, 0); + } + + public void parse() { + blockHeader = new BlockHeader(payload, cursor); + cursor += blockHeader.getMessageSize(); + + hash = Sha256Hash.wrapReversed(Sha256Hash.hashTwice(payload, offset, cursor - offset)); + if(cursor != payload.length) { + int numTransactions = (int)readVarInt(); + transactions = new ArrayList<>(numTransactions); + for(int i = 0; i < numTransactions; i++) { + Transaction tx = new Transaction(payload, cursor); + transactions.add(tx); + cursor += tx.getMessageSize(); + } + } else { + transactions = Collections.emptyList(); + } + } + + public BlockHeader getBlockHeader() { + return blockHeader; + } + + public Sha256Hash getHash() { + return hash; + } + + public List getTransactions() { + return transactions; + } +} diff --git a/src/main/java/com/sparrowwallet/drongo/protocol/BlockHeader.java b/src/main/java/com/sparrowwallet/drongo/protocol/BlockHeader.java index 863d3cb..e157111 100644 --- a/src/main/java/com/sparrowwallet/drongo/protocol/BlockHeader.java +++ b/src/main/java/com/sparrowwallet/drongo/protocol/BlockHeader.java @@ -19,6 +19,10 @@ public class BlockHeader extends Message { super(rawheader, 0); } + public BlockHeader(byte[] blockdata, int offset) { + super(blockdata, offset); + } + public BlockHeader(long version, Sha256Hash prevBlockHash, Sha256Hash merkleRoot, Sha256Hash witnessRoot, long time, long difficultyTarget, long nonce) { this.version = version; this.prevBlockHash = prevBlockHash; diff --git a/src/main/java/com/sparrowwallet/drongo/protocol/Transaction.java b/src/main/java/com/sparrowwallet/drongo/protocol/Transaction.java index 4a39392..dbada37 100644 --- a/src/main/java/com/sparrowwallet/drongo/protocol/Transaction.java +++ b/src/main/java/com/sparrowwallet/drongo/protocol/Transaction.java @@ -53,6 +53,10 @@ public class Transaction extends ChildMessage { super(rawtx, 0); } + public Transaction(byte[] blockdata, int offset) { + super(blockdata, offset); + } + public long getVersion() { return version; } diff --git a/src/test/java/com/sparrowwallet/drongo/protocol/BlockTest.java b/src/test/java/com/sparrowwallet/drongo/protocol/BlockTest.java new file mode 100644 index 0000000..7060916 --- /dev/null +++ b/src/test/java/com/sparrowwallet/drongo/protocol/BlockTest.java @@ -0,0 +1,36 @@ +package com.sparrowwallet.drongo.protocol; + +import com.sparrowwallet.drongo.Network; +import com.sparrowwallet.drongo.Utils; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class BlockTest { + @Test + public void testBlock() { + Network.set(Network.TESTNET); + + String hex = "00e00020e6ece94ef5ced047ae108c84593d040c1b76afe42b6a8e5e842d4b0f000000006b193276ea98474f5f17dff91bc013421da28383e8daf7ec1060b02c00fdd6aff26fa068ffff001da78a126f01010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff2703417c010004794fa06804a91151020cf543766844000000000000000a636b706f6f6c032f362fffffffff0200f2052a01000000160014f7e30e04d4c474790185e802d84426ea6b8d074c0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000"; + Block block = new Block(Utils.hexToBytes(hex)); + Assertions.assertEquals("000000000ee6e33bd782d55877515b2cfa6aaacd0774a5c8bc357252955f3795", block.getHash().toString()); + Assertions.assertEquals(1, block.getTransactions().size()); + } + + @Test + public void testLargeBlock() { + Network.set(Network.TESTNET); + + String hex = "0000ff3f7313699fb6ba27c8a50d8adb86c208e5ce14ed277c75f158d79b7d01000000000fda037495f2ad398e222a68ea278e37552f9f84937b9e2d723e6ed1b70bb2ff2e5da068ffff001d99ab06a028010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff27033d7c0100045d3ca06804cab7310e0cdb43766801000000000000000a636b706f6f6c032f362fffffffff02d1fe092a01000000160014f7e30e04d4c474790185e802d84426ea6b8d074c0000000000000000266a24aa21a9ed5749af04de7a4b78908f30e1edc17a9c66a9713e7750646916ce87cfbc76ce42012000000000000000000000000000000000000000000000000000000000000000000000000002000000000101a891200aa9db4017dbd05bf6b409281e4fd7b77cf8159d6fefe6b27d69ccb5560200000000fdffffff0320a10700000000001600141ee8cf4e13f347fac8954fa6fa27ebce68553f6b80484d0901000000160014d9faa9dc48fbfb2ade5bd2ae5c69c2ac2e8f11a90000000000000000196a176661756365742e746573746e6574342e6465762074786e0140d87d586f4cd51f1af42075ed61cd87162edea30eb07a86338af4f5fab005fe52d6aa51cf3c2757c6b9af605c8b0af30b4cd4a3af3273b2aca4972acf67ff0f7e000000000200000000010139336fe30f77d27b5e8629b3e60573a92374b98661745998d57ad9e05cc429a90200000000fdffffff0342604e07010000002251201ca7b70002d4a4f91fe0cca73788411662a7a87eb3059dc2455dd58e7546e22220a107000000000022512030d90a4d882cbf726a3de1122b2789ddd6ce1f06b7effe326e4403755a806eb30000000000000000196a176661756365742e746573746e6574342e6465762074786e014015d2ca486ef3c34eb11076322206f20b5c631676c64c7c12715df907c6a5ef69e859256391705c469971c7738c67991977538715f1ea5e3ca5140124861acfdc00000000020000000001013578cbfb0a77c7654d613db752e5c76bfbe83dbc126bc88d983ecd912feabf370000000000fdffffff0320a1070000000000225120d1636cc5f183d6874568904ef2574f8107b0e4b060e13d481f42e1150a53c1044e75460701000000225120694a52434e9ea45ac45aa29f6db609974760126925bc2f968ba6870a027c28fc0000000000000000196a176661756365742e746573746e6574342e6465762074786e0140d13a464c03ce506297bc4669686fa5617cb1b0b9f67fe88bf81eb1e750a1edeb6146a33ea3fb16850975323c90990f8cc72091c1e738039b75c29e11f262406c0000000002000000000101f099a7d517cd6c58abef4fe1430b3b7020bad714e284490feb1f4be2854781340200000000fdffffff0320a107000000000022512077a03167e1c82bbc463ad3d6764197d9cb99aafef140e31ca82e8b26d16ddce50000000000000000196a176661756365742e746573746e6574342e6465762074786ed8aa495a000000002251205b6fd98f12e1e1bbc07c460146be9e9d356c9fe2d73ca0ab8b08f68343185c030140083b800541920386e24aca5321e3a1b85ce57daf23e8df1df5a2b7866d3f51f279e07fb05d096aa6af83eaacc9fcd4b0969fe94ade4f0c4dea7cd076aca5b0f300000000020000000001019b556adcf82af36972f048569491fce8904ae3ded8364288b5058ad31461abce0000000000fdffffff0320a10700000000002251205d4afeed897a36454e94854075accd7506aac2aa5ed72b4237279a48ca6ee42fcf7ae104010000002251206044957e5c6630afd37edbd2fd8d0bc68c1c048314e89431c328f65ad883638a0000000000000000196a176661756365742e746573746e6574342e6465762074786e0140d8afbfca40f8b61afd6d5514238295b951117c17edbe7cc86b316974519bd57775df5e604577d775d8f0084a2c0c673cc97c7d54e388b038b3f4bba19be5f529000000000200000000010148432cc42176d0d298e3262aa74df552e8be56affd26bdb2cade6cacdab2e27e0100000000fdffffff03db8fd904010000002251203d916df014f0c550844e7ee54f65e05845842a764c77894d31a192531d1c308520a10700000000002251202543ae412af721e29ddfd54291cec6853aba5f322fe3892f8b1f3bf3669ad6c80000000000000000196a176661756365742e746573746e6574342e6465762074786e0140bc0287c1b0790503006aea3a4d40962e7b56d43e53e6b29ba19c885ffb7c4dfcb377acdb732e6b44715677edc0c2181e46edd955a67f5e69d52b3e8b68ae3238000000000200000000010127059ee3856ca421b7429bffe08912d7d1907154be45349f53857bc8ed62e81f0200000000fdffffff0320a1070000000000225120ace391173667d1eeaaa1da8210e3f181a5e8eee9a564fe043ad92c12ab9e70a5e4bf415a00000000225120e8c68d5d93ff7992387780c848f38d4c1d4182b5c9ddca036b1b02c009456a5b0000000000000000196a176661756365742e746573746e6574342e6465762074786e014041a4f585702f41bb9c1f213150de019d990797db22bf1149802b921353d1eb4b5c12475a006ac1656c2832e62d67665c7956fb8f2c93789134af166c3b8bf7c200000000020000000158eb8bbfb8507123349472af6730f29dde9ba0856db032ed58e87910d18625a9000000006a47304402201154e91e036f79d136bbf829c23de6aeb10c3d8ebe400a712f986870461df42c02200626462168a69debd2fc74c25c8286b3b9ae95786bd679b1704b1db3bd137f1901210258af808dd52c715c38c6dbc5d416c569d16600eb8646672e0394cb81528c2f16fdffffff03d54d061401000000225120e94d8a6abb16708d408618a13dc1cbe558143f76cc07f406af0cb61c6be86d7d20a10700000000002251202560c633b2cd75a4a50af82cbcd736c0eb53d674b762a6b0a55e285210354b3f0000000000000000196a176661756365742e746573746e6574342e6465762074786e000000000200000001f6dfb49eddc3060b114a6777c6b909c5dd7dcefb8cd3c94ffa63f4ccf234f4e8020000006a47304402200c3871cea91af3d8a1f3911bc6664ba2b2628ac86a8f8e21eca9d0e6f835bd40022073a1f35c6dec5c4c07027cadee4071ca8a5da71ce8a6ffe9540478d29dcc77d301210378130ab378e115bff27ee2bdde6bf9b98fbebaa6181341ae2e6bf6d34f57aee2fdffffff0320a10700000000002251202aebdb7356a5fab0d3a2188330d575434ec942c93f2e2413882f325cfb8442a10000000000000000196a176661756365742e746573746e6574342e6465762074786eb3708c140100000022512075f81b7edc3fc5857a0780b34aaed5d9f2e00efdfeed8545b8691a2349c553da000000000200000001b31c384e260e6cab7bcd99e816727226884795fd5b0be009be5416f8e401b858010000006a4730440220382d615c132b71ec1328434a9fe74a8df8e0b1f175a13b86e6a140f0aecbb66102200f061531981a80aee27ea128d75cf837bef35912ccf76658bca5f3515a508c7b0121036ae4b1646812c92cff81828003fe0c667198973bd8abaf9a8b53ffe22a4bdf43fdffffff037ec3a10c010000002251200cc1aa47801ce9def2bee8552c3a0428ea803c0270e6b091602538c9f732ed6420a107000000000022512095e2a4e4e69c07ad9ffbee28bd232956f4c1dabf50de1ce7bae39072bd400c1c0000000000000000196a176661756365742e746573746e6574342e6465762074786e000000000200000001027bc5a104480b58222f28a8ccfcb34ef38457244fbf9fa40cbaeb1b64af5d1c010000006a473044022007120638f41b31e672367e2e2f652ed2e4be589c47eea71f15e970b5634f5b3c02201904452aec1d5a8eb1af12b6db368799069bfcfaa21a32c22f257efad86f9573012102f842512055ca718e9c9d4682b1d083d1b32d332f7e0d6690bdd4743e92312490fdffffff03439f870c01000000160014481bfcd9cab86e706e11482a401b89436cabf28020a10700000000001600145f9b2a67407badf1e854a3c7edf4b15381ed439b0000000000000000196a176661756365742e746573746e6574342e6465762074786e00000000020000000001013a9d4119d628b04f953a47a283643ee7f01eef44fedc1a165b802765049bfd420100000000fdffffff012c9f0700000000002251205b89289cbcaf1f95cb16e9230000b9ed1398111e26e60169f1d056818b59149b014071ef140a35ac4d41acf2e92e56d3221741700b0f3791b66abef05a0df621e95cf543b668ff42c7e7dd76696243cdc9d5fd69b4705840285b2901b2d19877017f0000000002000000000106c059b0e5529f1bd329560f545f55885ba1686a9b26488f66c1469aaeb9f049ea0500000000ffffffffc18ef63ed12bbf43bdb89df5abeffdabb73084544730bfd82ddd4623ef92ccf50500000000ffffffffc1d1e2fd055710bc249675be3af69ddeadf6f6f1799f0724914991cda2c8fd410500000000ffffffffc3c2f84e55fdd8f281627ae13275743183d4490db7bdb0d665a357dfbca70fc00500000000ffffffffc49138187417d2dd42b940872f06fc71d9489d6be6d61329036178e14b8c93e70500000000ffffffffc5831f7a109fcba3828c3c13a2b15696a23247a33b62c09eff601f55779df05d0500000000ffffffff0640420f000000000022512058417a6688115ccd11ded910ffb64f4ae745e513e6a78687b06e84bde291109b40420f000000000022512058417a6688115ccd11ded910ffb64f4ae745e513e6a78687b06e84bde291109b40420f000000000022512058417a6688115ccd11ded910ffb64f4ae745e513e6a78687b06e84bde291109b40420f000000000022512058417a6688115ccd11ded910ffb64f4ae745e513e6a78687b06e84bde291109b40420f000000000022512058417a6688115ccd11ded910ffb64f4ae745e513e6a78687b06e84bde291109bbafe0e000000000022512025458c6a6d42027688df4b7c29c76b6d894c55fd3c249ccb2e1905c6dd7814eb0140fd9a4573e069ac836a6d4d1039ac4db18b201bfbd0d8ad2bb446d825b46deda7e7d052846504150e650a6a4bf5065b9ecd8c26135424d47eca5cd59f629e6fe00140b0ecefbbee0741cea8ea9e533d3cbe163b1c195ccc5e4d85ededb4eed7fab7fd1a7ee68a396682d3f1b51c0cef807573fbde7bf07fe8276b8b4b0a94122406c501400dc8839fadb42fd928947e7f4dca85decc80f9ba77e3f77ad6f4d1e6e93df29dfc36f4b02359f8112ecfbe272484d347ee944cf5f794ff1ca968364dd90412a601407e596916620ff79b32f4a14633276fc49706274fd04938697346bb2032dc671fef646590b9502a2114d5aa71ce80ce367f5e26839afb7657fb1bdb60d0b37a31014073583aff1d81058542c427003da2ddcd345e55de6929a087a5b84fa5ba9f7856a5375a6090822204168d273bdf0676a1169f7c2f492b5e65b07aa866259a87410140d0472dc7c8f3f936b224313f3e791dd0d2a59a6fa482b7f86c75ba9c17bcccfb527627dd35891debc5014f3654c9e497a5212a99e55d82553fcb5ef7e9153b800000000002000000000106daf1bbb9e5328b90e41b89a0d92534c9e1a452d9435b4f022e339fcdcca9db390500000000ffffffffdcf16592ae9a3dac18bc6e82533478a68c40407487abbe88f172a7ad1ac7ff390500000000ffffffffe2d7d7d087a871c1954f532c14907e0f7cc9ff0ac0994553324dbe3833da7ea70500000000ffffffffe5ae89873d0461b9699ce0fc4feaae3eee20ab9b3185788b8b0a3bfb03891ea20500000000ffffffffe64444cb372916cdff0974a357e2b882e329ed2422690a04b0a23c31628c2e050500000000ffffffffe8344ef3791d2e18d1f7bb028468e1e8dc1cd0ef2417c8543f8b9e83de1301690500000000ffffffff0640420f0000000000225120169d5c442afbd545b621bd4aa07812e14257711c1501c88952b5e03c67554ecb40420f0000000000225120169d5c442afbd545b621bd4aa07812e14257711c1501c88952b5e03c67554ecb40420f0000000000225120169d5c442afbd545b621bd4aa07812e14257711c1501c88952b5e03c67554ecb40420f0000000000225120169d5c442afbd545b621bd4aa07812e14257711c1501c88952b5e03c67554ecb40420f0000000000225120169d5c442afbd545b621bd4aa07812e14257711c1501c88952b5e03c67554ecbc80b0f000000000022512025458c6a6d42027688df4b7c29c76b6d894c55fd3c249ccb2e1905c6dd7814eb0140d0e6ca5f166e6e47ad7778eebe78b5289e7ee5d9e5bd8bf075732f6d45e2cabf4badddee21af120bc099af675faff6c5f0a024330b56db3fa1549063c119d1ed014086e9d77fcde73ca1e0099cd391ae7d506356d45f8ae46e4a3ab4d4903e708b1218c2bf2f18602c4ec53d3e08c416594467835cd569237cc823b3382d1242d4d0014016cff506877fcd98ced832d4f5f41577ee6918226d0a0ce7dbfde431ad8befe28777883bee0b5942bf48a30e98432eaabc04e999034b2c8c8742d51ff1495ec3014002b0ca78002d76c7b91b2f86c7a4f9e761d1790b41e0e3c7fe64d90bc593ff38138ab662b464b66c9513e0ec8408cdd0108efed9cca019a65372108ef0d6d5e20140b9560762c3305e08dd9436b7e223a64764fc33b64d2219a1cab75ede316fd0b2a137c179312de3d7e137f2f3cb2bb6400c6755fc26a3c8d6b7230a84dc6eb4be0140a5aa335f631fb8f3118b2126730006f3486cd359f9e8cbb2522dc97d781067b321abfe458edeb0c865cf5541ac4999c33c6d10d8695de01e07febf5a9f2557fb0000000002000000000106b11d673ec1769027d8cf1dbfc8bd5fbab595f8997e7f95fd97a87fe5e84cc0230500000000ffffffffb33aa45c0ead01fcc37f624ef524e88a14f1240987bc7c351cab684afbf1dc540500000000ffffffffb4771b68ae2ca79ee2ca702d8810c33041475f7dd0e2fe410d46f39fdbc2bc4d0500000000ffffffffb9e188a79c12b56048530afd9ea9acb3de21c6bc2dca6aa9c3bc677d840646520500000000ffffffffbcf08b1f6c79d6536b2f2e1c6986ab334eaf4771c26875100d865c7840dcf5320500000000ffffffffbcf3ce49d80884aba1cd502ab03eaf476e49a206bb1d679dd159cf378467f5e00500000000ffffffff0640420f000000000022512096f8154cb2ffea728926377fdada958a0d8e5c18a8d48dc5b7dedad0d2a481a040420f000000000022512096f8154cb2ffea728926377fdada958a0d8e5c18a8d48dc5b7dedad0d2a481a040420f000000000022512096f8154cb2ffea728926377fdada958a0d8e5c18a8d48dc5b7dedad0d2a481a040420f000000000022512096f8154cb2ffea728926377fdada958a0d8e5c18a8d48dc5b7dedad0d2a481a040420f000000000022512096f8154cb2ffea728926377fdada958a0d8e5c18a8d48dc5b7dedad0d2a481a000040f000000000022512025458c6a6d42027688df4b7c29c76b6d894c55fd3c249ccb2e1905c6dd7814eb0140a580df37f69a7a9e150b8c2c81a8fbf349e1b2d7cd91a69ee0a4ae06a0cb6a25fa5e0fd208383341d1258799cad333d85d9d4a017fc263a71725cee4444b97f501409017590ee0d7a56b343b043d2206d677c503254ae27627749b4cf476c91827a25efb9b61a2ac0a703305e37481a7c18bcedb0d53f4cd0dc3746ca4e201c144e40140ade65056d0d89a7908a62c29622ed547c2ba23ea1e536c12c254cbdd83692cf79b32b8d7d64829dba8a940debd9479d34c79c6d6a5ec5ab5bd950ce8ce3e71330140df820a7ab3155fe95e679903aca7c63c0e79e337c3e94a1237931ba2cefc51bf9b425a210352e0d63624da203cc91206f4eb82d92c1588d4d8247be62f13ac080140cf61ee8e2ab906acad1850d2693f178656f9763b0ca5e576d589d2cb2b533a8005da85f2a947d75c6cda3432935f6f42c9ff43503632e700a5ea93063f6e08520140083ab15a36aa1ce551d38fe91cc7a7a3c00e849238240e36b8e8c2a564db0900345c09a9b9ef676478a4ef7d3c3093d75d0204ccabe78ed2dc4e04d5a5c2eaa90000000002000000000106d40d0680708b23ba0eea563667dff0a3eee0461558a521152f3bf8ad447ed54a0500000000ffffffffd56e35bb55e6c40e24e9af4c35d70adc13f18e22073a6e2f5242ad59afd137820500000000ffffffffd69e91dcb913a00665d41b42f097fdc95b86217394140b10a11ffdfe534828460500000000ffffffffd6e4e8c00ef5374154bfc67c261fc7d16a53d609450331e81498a6ce647e4d5b0500000000ffffffffd73ad8a6f2b32e0568643a05acb324fc5180b8406dbb3f17c90ce6016d56b7490500000000ffffffffd7c8ff852023cbb9d985b49ecdc4c5711ccf9103988e3ce0c0db18df4c205ec20500000000ffffffff0640420f0000000000225120564ddb0d3d425c25f8fd48f0d5c25c45ad228378fa18786c9eb1895c14cbb3a540420f0000000000225120564ddb0d3d425c25f8fd48f0d5c25c45ad228378fa18786c9eb1895c14cbb3a540420f0000000000225120564ddb0d3d425c25f8fd48f0d5c25c45ad228378fa18786c9eb1895c14cbb3a540420f0000000000225120564ddb0d3d425c25f8fd48f0d5c25c45ad228378fa18786c9eb1895c14cbb3a540420f0000000000225120564ddb0d3d425c25f8fd48f0d5c25c45ad228378fa18786c9eb1895c14cbb3a5c80b0f000000000022512025458c6a6d42027688df4b7c29c76b6d894c55fd3c249ccb2e1905c6dd7814eb01407177326043616ab94a6e045067eb158cd35cb7ad104d84c581153984f8b3fd1755fc38f0495d9b7b49c9afc311c8d60496d6cf73795406122eab713a5f4332d101401ff91a9d715f2b899863db20cef55d60e3b0fd6bc5acd747aacb2c4078c2478190e6f77f92bfd10ec5b0a9a15365e3e52e3067fd54529485bf3e30867a61d2a00140702b676bbc5da220636e52cd88b9e99ddf56fcaa810efa3d705d12b38eb1e65372e6b18e9fb651dfdb315e0c452494291fabd1265ec88ff02b517f33003ce8cf01403cf963046ae3bd1dc5f32b250c4ac3d87badbee71fefbdbe5a009676d3a0535a8c49d6e8c70bd7e8090ee3a17b111fb89d0993a5d39b0295e4738a19156e512001400fefba2bdb0d80d4c944bb2b2db4f76a10fa64ed959fe7c301eb5795921649c4229e5244995c023d990a9ff8392e176ffc91c86b66af51f4b5dd696cdd0a28f5014078fdee55794c45b0a0e71a854c6130e6185094d203d2eeb5784b646d9c37dc1ae97fcc39ac6f3ef36b46517cb18944a8cb1b82aa97bab01a7fce375d825b858a0000000002000000000106c594b39dc69b97504cf5204c349812b00f315f041b84e91e2b11e5b6e6a91b760500000000ffffffffc7bae1da28e2d81a45cda63b58cd29b6865d46784f2030587ac0b396d479318b0500000000ffffffffcc6e99da0249bffd315d143965119359506710a934dc2c8c589fdcbc0abab2f10500000000ffffffffcd662920aff1049de4abef95716b34e8a3d10c834e15d59fc16d49f795989ce60500000000ffffffffcdacdaf1f8a51d92a761539d2370d72d1d6c2b73e4f06c60fea71123e52a04fe0500000000ffffffffd27b34dd75f287d479697b28802db07860ecc4d90e91d1bb1864886008f5157f0500000000ffffffff0640420f00000000002251203d69a95fdd703e417e3c2241583f7033034f83fe00f9f881b013fecd33b6ffa640420f00000000002251203d69a95fdd703e417e3c2241583f7033034f83fe00f9f881b013fecd33b6ffa640420f00000000002251203d69a95fdd703e417e3c2241583f7033034f83fe00f9f881b013fecd33b6ffa640420f00000000002251203d69a95fdd703e417e3c2241583f7033034f83fe00f9f881b013fecd33b6ffa640420f00000000002251203d69a95fdd703e417e3c2241583f7033034f83fe00f9f881b013fecd33b6ffa6c80b0f000000000022512025458c6a6d42027688df4b7c29c76b6d894c55fd3c249ccb2e1905c6dd7814eb0140b05658f4cad775a03911c3974b429297ecb0873f5657d6c751ec17fb5295bff357ccd72e8b6544b34bbaf697e4995f9d4e43978f2d0a33c2d54ac344e9a37d9b0140e26edf638a27988c61446fbf191c62797a33eb17f81d72b139a12e88687b43d745e95de3fbdb69d602646e76bbb13fe7d49af9d0e03b047dd58b306984516fdc0140cb867136f63bae8705b479b36825392a0db754c426ee299fc018070d3a11ef7fbf85ba3ff014864d65ceaa2ecf89eb7c82f94f08ee15c987c60049fd7629b7d70140545e7c3050aafe79cc71eb684df3fcb0d8615e443f84221363418ff7d25c3a0d85fe65edb07d63dfdd94815d3b2e9557eb8870bb80bc191ee77aab532a0ba1af0140c4fc0c66d1fdc55e0110850a0dcfb1472f5006d06b522a71d31741507b961c24bd35c0dc283d0bc6e6892234c79485ba66fb5ac7ce1cf9f590b9e27a0551512a0140a8fc291577867360c1619e0fc648ff3e512cef053bb48b9b7cf23b437ee750f3525d5b272b684ed1208e2117203ecb36616863f1ebfce35658f453433467e2c300000000020000000001030b3ab65d42f80747b5be52ed33360f1d2e102a9d448f2a21a0ab98b870c27ee70000000000ffffffff117b78b891f5287398a6fbf5c06a313a9b3bc1c44e8a5a512b00ad07d19fb8e23800000000ffffffff0b3ab65d42f80747b5be52ed33360f1d2e102a9d448f2a21a0ab98b870c27ee70100000000ffffffff06220200000000000022512066da923ef1979c5d28fa0f70d6898f76941a0d7f67aca787cf6c0de758008a2d2202000000000000225120061292633b79ea648e9607e84083201979698bf079cdd5f927097a88a4ebddbd2202000000000000225120be69bb1785359138411f6406432dd77bb11464ef5afa9924510a72130bb203a4351c0f0000000000225120061292633b79ea648e9607e84083201979698bf079cdd5f927097a88a4ebddbd00000000000000000e6a5d0b160100bff204ac03821f02431e000000000000225120be69bb1785359138411f6406432dd77bb11464ef5afa9924510a72130bb203a4034089b9fc2a6feabce2bb8723a3b5e1d8bb0ebbd1d496fbbded7d62d49e3b663282509a64e8257375b9dffa01d2f9973ccde4079422a2a35e5af93b84ac00f64fba452064bb5be52c75a923ab1fd83227cedc96132f0963f14b00de9689d840ea120d0cac63203c5023585fc14b15221aba09efcba42292209d761f3bd00473c8a6f046872a416821c164bb5be52c75a923ab1fd83227cedc96132f0963f14b00de9689d840ea120d0c0141e73b26f4e7c260d0590da74d4ed478b8d646731932e37cf2a4f40815270405b766a3eccea1ee0a6ae4ec5a3061b2fe3dfef0f50b3b66fe9ff14743b0514e8bbf810340b18dc62edcf1b656552825a329593c452194332ec572ee707de4b159ad0fea7eac76bb21e1748939ab9cbe626dbc8bf9736b1462a202005118e6c74949317d47452064bb5be52c75a923ab1fd83227cedc96132f0963f14b00de9689d840ea120d0cac6320f459378df0b7fee33978573c17811f581e78b2048cef120752d80673ffbfe2cd6821c064bb5be52c75a923ab1fd83227cedc96132f0963f14b00de9689d840ea120d0c000000000200000000010300413470aae9042f10a727b6e25f364e83426b53a4fba56a0d63516ea16f00750000000000ffffffff363bd0e701034b5731cb99ce12fc96b48cb2f454314b9b5216ff8d8b072ad6dc0b00000000ffffffff00413470aae9042f10a727b6e25f364e83426b53a4fba56a0d63516ea16f00750200000000ffffffff062202000000000000225120c90afdec5ef70d38e43855ca617a9c84d528dad100be7f856fbddbaf9c4047142202000000000000225120061292633b79ea648e9607e84083201979698bf079cdd5f927097a88a4ebddbd2202000000000000225120ace391173667d1eeaaa1da8210e3f181a5e8eee9a564fe043ad92c12ab9e70a5a5bc0d0000000000225120061292633b79ea648e9607e84083201979698bf079cdd5f927097a88a4ebddbd0000000000000000116a5d0e16010086ee04c50a97e2b9bd0102ca7d010000000000225120ace391173667d1eeaaa1da8210e3f181a5e8eee9a564fe043ad92c12ab9e70a503408101078bc6f17ee529d939adfc5a19a4a958fe17fd2aa3318170a7172e5efd08a47b7befc1787f77ade24f2052247afde5c3370246d3b9f98255e22eae03baf1452064bb5be52c75a923ab1fd83227cedc96132f0963f14b00de9689d840ea120d0cac6320415a1c92689fd07af641ef50ebed03bf2296ff692ffee9f889d0c2449dc542996821c064bb5be52c75a923ab1fd83227cedc96132f0963f14b00de9689d840ea120d0c01412ec52942047332be0df0277ad167a0446169888bb33b1e9c63a308674a6a3277f2970c5fb4233571fea654d8ff1b5ac52e7a2fc341125afcd6f77adc0c2f4cd2810340f6b4d0f0006e52fbca21850f4ec18c445f327e632b5495f9a84f03d7f8cd9debd27696c021f08ff0f3074e1df98f089dfd034510d67005c74fb2a92bc872aae5452064bb5be52c75a923ab1fd83227cedc96132f0963f14b00de9689d840ea120d0cac6320f459378df0b7fee33978573c17811f581e78b2048cef120752d80673ffbfe2cd6821c064bb5be52c75a923ab1fd83227cedc96132f0963f14b00de9689d840ea120d0c00000000020000000001030cbddb10f7df328aba3a25a653c26dd1d1c4b48fd7608389489028f99446225b0000000000ffffffff1ed90138faed1fd268978e99989a449f09dd19351b2e8d5961853d0f6611581d0500000000ffffffff0cbddb10f7df328aba3a25a653c26dd1d1c4b48fd7608389489028f99446225b0100000000ffffffff0622020000000000002251206db9371a53d0e8da987975f68f5d3817fb28226c6ae3e2b32a2ccbc0a94bb8832202000000000000225120061292633b79ea648e9607e84083201979698bf079cdd5f927097a88a4ebddbd220200000000000022512095e2a4e4e69c07ad9ffbee28bd232956f4c1dabf50de1ce7bae39072bd400c1ca5bc0d0000000000225120061292633b79ea648e9607e84083201979698bf079cdd5f927097a88a4ebddbd0000000000000000116a5d0e160100e580048f01c8b2bbd60e02ca7d01000000000022512095e2a4e4e69c07ad9ffbee28bd232956f4c1dabf50de1ce7bae39072bd400c1c03407171079793a14f974a7f2f33aa468577b0f4394b45388b289b0adce8bc56a64c95323fd6d6295cb759fa7c6e9118ff1531f555bbc4aaee613b3c4fb02027cd8a452064bb5be52c75a923ab1fd83227cedc96132f0963f14b00de9689d840ea120d0cac6320216c6c7946888ac9156ac97df3854660c7eed7d046c524ff2444f1342592f2746821c164bb5be52c75a923ab1fd83227cedc96132f0963f14b00de9689d840ea120d0c0141d449ea0f49d30d9831f6719b0a181713d5caa5258c406e62ad0f9a43c2e2ae5768ce909e19f0d1053304eb6cdbc9119f2ee6829d65f82aaa9670bd1a345a4e4e8103408d91010bb868ffcb145077b4a34f59a810a91490117b7bf1090059758b514a56df23d2ab1c736ae565f428f773c12a7ffd0c3ffb81790febcfb6343dcc40b72d452064bb5be52c75a923ab1fd83227cedc96132f0963f14b00de9689d840ea120d0cac6320f459378df0b7fee33978573c17811f581e78b2048cef120752d80673ffbfe2cd6821c064bb5be52c75a923ab1fd83227cedc96132f0963f14b00de9689d840ea120d0c00000000020000000001014a8e5a9e8da3177285ca82045486350b9d85974213b3c1cb812260c6b8c11d330300000000ffffffff042202000000000000225120cd7cb4dbdc39c5e540d01ae1ae2b8e6a8acfcf1c6cec1ce0e40439f66611e1c410270000000000002251207cee7853a1f872031e39df640f8f625ef592bf193d9376fc8a477ee89488818b0000000000000000096a5d0614d5a60514045a18000000000000225120cd7cb4dbdc39c5e540d01ae1ae2b8e6a8acfcf1c6cec1ce0e40439f66611e1c40141bcc75dd2ea5d2687dcb1dcd373714577868477756ce4525e8bed0e779a4a00339f5975fabe1bc452c599fca74769944632dc35bb87f5da88299ab9780a74a50c0100000000020000000001013c864434f2b9d98f81d6e1ed0c7827548ff5c13d9d65a2159e5a4c902bdb26330300000000ffffffff0422020000000000002251203a6a85f198c6f0b659ccb8e7cacea7c3e2605726d94fc5f1c7ef4b9b91bb499210270000000000002251207cee7853a1f872031e39df640f8f625ef592bf193d9376fc8a477ee89488818b0000000000000000096a5d0614d5a60514045a180000000000002251203a6a85f198c6f0b659ccb8e7cacea7c3e2605726d94fc5f1c7ef4b9b91bb499201417d5dcce2f66c3df4914cb12c6c9b2d83696a390b29b0aeca77b101070a9f37a7ec6cc1279cd45b0c176acb8115b781884fe2689a16c9c459a5e38df99af80e8e010000000002000000000101b2c068e64817e9c3bc1705cc90cd427980a4b88c83ebcaf9cc2ad5e361b628b65100000000ffffffff042202000000000000225120ace391173667d1eeaaa1da8210e3f181a5e8eee9a564fe043ad92c12ab9e70a510270000000000002251207cee7853a1f872031e39df640f8f625ef592bf193d9376fc8a477ee89488818b0000000000000000096a5d0614a7a205143183160f0000000000225120ace391173667d1eeaaa1da8210e3f181a5e8eee9a564fe043ad92c12ab9e70a50141bf52480646108d0d42be067bee30f1896a2245d3c17bc09c1d8de8187c2dece11a3dbc0ccd67cddc25570aa0835eaa047321bc45de2ed5269546e1774480d9b7010000000002000000000101c1e8ed76a9753e41023b6a54442fc78e53a595780d15c3a89fedfbbc42547d110300000000ffffffff042202000000000000225120b248a972ef39a2e5766ccd10363938a91d4b11c881b29e8526767b941f10e21d10270000000000002251207cee7853a1f872031e39df640f8f625ef592bf193d9376fc8a477ee89488818b0000000000000000096a5d0614d5a6051404a042000000000000225120b248a972ef39a2e5766ccd10363938a91d4b11c881b29e8526767b941f10e21d01415e70434fb3f13eeaf9f5cc5da095f46899ea3cbdedc314c242e4f403d3a71edbbdb023d2a80129c9c42b527ba547eac0299bfa3bf5b739650b30a8103bf38a660100000000020000000001011ace12c5648073a307977f35788139ec7dfd31894d687db90c230fed752d915c0300000000ffffffff042202000000000000225120e5ac4ca7e331b8187f17608fd7cb17ce1e9b172c6295a5f11e0791847a82e3d210270000000000002251207cee7853a1f872031e39df640f8f625ef592bf193d9376fc8a477ee89488818b0000000000000000096a5d0614d5a60514045a18000000000000225120e5ac4ca7e331b8187f17608fd7cb17ce1e9b172c6295a5f11e0791847a82e3d201410e75e8b0919b28b51519bb53baa7c731e899f6f1cab83c3e1fbbb28e8954038a725134163039a422153876467948850fac36c909332860d03ce57eca8537eadb0100000000020000000001011d14cbec9eb5f3717aab6e4c200d1bdc717312bf2b667e96ad7aa95387e56d500300000000ffffffff04220200000000000022512032f5a921462c67d8a66358f8b0ec84e9c8d99922b6b97173cf50ae1f4c773a7010270000000000002251207cee7853a1f872031e39df640f8f625ef592bf193d9376fc8a477ee89488818b0000000000000000096a5d0614d5a60514049d4200000000000022512032f5a921462c67d8a66358f8b0ec84e9c8d99922b6b97173cf50ae1f4c773a700141c203c17a125233713fd56c490244c4230ece3d2f36322f895dc05e5b11a7328fce896df99c7b38176081fae29dc404506d38fa0ca463778a67e936e36884e56901000000000200000000010119915015ecc25aace761841e1834e547768d8860b90461da8f0c8f42229ae01f0300000000ffffffff042202000000000000225120c8900bc189cc7324a0d56ec9a7897f0ccdbc1c4e173204c7e60408e4c7540d2d10270000000000002251207cee7853a1f872031e39df640f8f625ef592bf193d9376fc8a477ee89488818b0000000000000000096a5d0614d5a6051404e616000000000000225120c8900bc189cc7324a0d56ec9a7897f0ccdbc1c4e173204c7e60408e4c7540d2d014156603f96e45c8d175a8e6f83c26b0442e9d6a1e0fb871ad6c408fbc7b460a17425ae5fa021d0eaac7883bbce56c4c61749b8360a3613425af1495760f664c57701000000000200000000010167b755f907b1f6977e7256df3cb85f08947c42768216f63af604c8fc5179ef9b0300000000ffffffff042202000000000000225120b1e692d4c8a1938fac88eebc38ecf0ed175eeb4a1a8d4623d6933f78701311da10270000000000002251207cee7853a1f872031e39df640f8f625ef592bf193d9376fc8a477ee89488818b0000000000000000096a5d0614d5a60514044515000000000000225120b1e692d4c8a1938fac88eebc38ecf0ed175eeb4a1a8d4623d6933f78701311da0141773c3d9dae806e80197ce79f5350dd21abe475c4bb43ef35f5d822acdb8667aba7aff7bb160b6cb164cd320ae6406ce1d601cd505bc768c8bd566c412637e2c6010000000002000000000101a7b79f286651eb251ae57b00420d209f42264b0659eca6e3de8c78e805191dbc0300000000ffffffff0422020000000000002251201ecc2c32f0d3081257448d5fca78fb62c49cdba3fef620bd25a94b6370f3a73510270000000000002251207cee7853a1f872031e39df640f8f625ef592bf193d9376fc8a477ee89488818b0000000000000000096a5d0614d5a6051404e6160000000000002251201ecc2c32f0d3081257448d5fca78fb62c49cdba3fef620bd25a94b6370f3a73501417b842059b383cfeb8b65c8193aa7dcddfb930a23c6fa067d585f20b0e18bc7958c6a47f4d3792decbaf95a21132ed7a464236d1962071c7ce5677c4d09e0ded80100000000020000000001012b430f764fac3d96201f6c19a14eadc81e451b0471fa01ca3a0656cbc2b40c5e0300000000ffffffff042202000000000000225120ebf6f56c68cae928a436dc99663b8d7e72d35b81ee71406f86a97406a16558dd10270000000000002251207cee7853a1f872031e39df640f8f625ef592bf193d9376fc8a477ee89488818b0000000000000000096a5d0614d5a6051404a042000000000000225120ebf6f56c68cae928a436dc99663b8d7e72d35b81ee71406f86a97406a16558dd0141b6a6a89aa886c840d30e2049ea30374b1e644894f54dfdc42cee06aa2e7907bb4a2ae5c97719ddd90fb796d4805e23ec13c33d27fca5d1806f0364002fbe423e010000000002000000000101fa303d6474f3d62351fbcbdee07015e86cb3392bdc80e4452e146477155717030300000000ffffffff0422020000000000002251204a1af751cedffbc2211c0e36ec3c4eb9246e1b65c41a6cb77f526f434d4c695510270000000000002251207cee7853a1f872031e39df640f8f625ef592bf193d9376fc8a477ee89488818b0000000000000000096a5d0614d5a60514045a180000000000002251204a1af751cedffbc2211c0e36ec3c4eb9246e1b65c41a6cb77f526f434d4c6955014144de970118412374a5d41a9b426ba181b84808beecb3baded25ea034acbd42a269ec8051c684dbad7dc2602ebeb58d1e524814ed68ba0a5fcde1b03bbdabc99101000000000200000000010109f3375f723de72978cc29fcbc21b764d5a2daae440e5c4e3048ee7028dd573c0300000000ffffffff0422020000000000002251203a56117a626ba236ba6177f2b7190a3b87740e2336d88c99c370510ed6b677cf10270000000000002251207cee7853a1f872031e39df640f8f625ef592bf193d9376fc8a477ee89488818b0000000000000000096a5d0614d5a60514045a180000000000002251203a56117a626ba236ba6177f2b7190a3b87740e2336d88c99c370510ed6b677cf01410f5bd8f7bc85de0532a21c60864230dff9fb96df692df15d6771cdf9c8d7d696f3326fe9d48152229edf3f72bb490eb8847a9de637c5c2fd5df2327a4311e807010000000002000000000101bf6fbedd16cf1ab924e1a14ff7e064f134c2fdd6d70808cd231283a64340059f0300000000ffffffff042202000000000000225120fdbe5b10a3a844900d797a8c1329ab8bf1447dac28192bc512b4b889bf85184410270000000000002251207cee7853a1f872031e39df640f8f625ef592bf193d9376fc8a477ee89488818b0000000000000000096a5d0614d5a60514045a18000000000000225120fdbe5b10a3a844900d797a8c1329ab8bf1447dac28192bc512b4b889bf8518440141bc1c606bf0c990d29bfbb1b2d8e74249ce76dde351e662dc570010e18873dc76b606d3f4c7d3ee131f9ff604807d0fb640d57f9d83ab75ddd60d32b8c47a9a640100000000020000000001017ea95b9c8bc43777fea7e61912fecc2514e663d4da2283ac92752442b19d2f590500000000ffffffff0422020000000000002251209e62b475441f3d1f030bde4d2ca81945feb400bd977495fd614a17da7cdeaa8210270000000000002251207cee7853a1f872031e39df640f8f625ef592bf193d9376fc8a477ee89488818b00000000000000000a6a5d071499fd0414dc04d5360600000000002251209e62b475441f3d1f030bde4d2ca81945feb400bd977495fd614a17da7cdeaa820141b851abd3becbb64b4791fac79b94bbf01816054ea44e38b586ddb4e13d2427d0714a040828197897834e88bea56358d4bb38dfebe8a46a399409f7ae41e3ea000100000000020000000001013948ca0be7354e2c423cb0405fe50616211ffcf4e802a961a3d2cb1414e364005300000000ffffffff04220200000000000022512095e2a4e4e69c07ad9ffbee28bd232956f4c1dabf50de1ce7bae39072bd400c1c10270000000000002251207cee7853a1f872031e39df640f8f625ef592bf193d9376fc8a477ee89488818b00000000000000000a6a5d071495a20514f50180160f000000000022512095e2a4e4e69c07ad9ffbee28bd232956f4c1dabf50de1ce7bae39072bd400c1c01416fb1a2d47c9610e3e83a3ab40adfe346ac9dc99a47fdb6380d6143eabd5fbc7b7bdc7a1eb933796b0f4d02475546a23c6ebc6709866410826352756fcf55af98010000000002000000000101b8e7a64e9472efb232aeef651aa024b1de1539444c088ca9afe5fadf12948ae93500000000ffffffff042202000000000000225120be69bb1785359138411f6406432dd77bb11464ef5afa9924510a72130bb203a410270000000000002251207cee7853a1f872031e39df640f8f625ef592bf193d9376fc8a477ee89488818b00000000000000000a6a5d071487ee0414b70380160f0000000000225120be69bb1785359138411f6406432dd77bb11464ef5afa9924510a72130bb203a40141c44c8b861286a428d9c041b66593481a9a25808a5099898bccfdcab70bed05a108234bee8d393cd08e4f3aa1f088bb3c2c44a97b8bf66df67d834237a2573987010000000002000000000101ddccfdca439f1e9e4eaf2dd08907f6b414c3b0de05c436f1362af3f17a6808b20300000000ffffffff0422020000000000002251209e62b475441f3d1f030bde4d2ca81945feb400bd977495fd614a17da7cdeaa8210270000000000002251207cee7853a1f872031e39df640f8f625ef592bf193d9376fc8a477ee89488818b00000000000000000a6a5d071495a20514f501eb3b0600000000002251209e62b475441f3d1f030bde4d2ca81945feb400bd977495fd614a17da7cdeaa82014198a79b63f5093a267a04e8dab26b4a7781f035a4a3205a3474f5c5554d6561fe36a153be7616bbbb7b83f80ed22ac34712aa047547a68a5f11f234b48be8233f01000000000200000000010278a0537c8c23fe0ff9b771343347770a0d8fc96547df48a14be8805f212d1aed0000000000ffffffff8c993daaf9da25da6ff4552b6f457a431918a4492f035d45c4412a5c656b39160300000000ffffffff062202000000000000225120757fea904a337b2efc50b599928d9a0974d17a19a36222174c5e290682c5f5a72202000000000000225120061292633b79ea648e9607e84083201979698bf079cdd5f927097a88a4ebddbd532f000000000000225120061292633b79ea648e9607e84083201979698bf079cdd5f927097a88a4ebddbd2202000000000000225120b044069bcaac09c8edbd6253c496479d6e0bdf9add8262222697aea54423916600000000000000000c6a5d090099e2033dbd9e0e01bb5f400000000000225120757fea904a337b2efc50b599928d9a0974d17a19a36222174c5e290682c5f5a7014175b95141f9886ef30ff8a9deb04f4e4cce28d5a34f1fb0ce6c8b14b40e325839ff939b4cd8c6616c53291899e6142345801b4f811057b98f07205611368fb6380101418d2293dfbb7f62bac18059f604c40cb9156805ddb764e58c4c6df987e7b22c202c1bd7840b4fc79314cd68916b1d380d33cf5466a89b5335477840b8ea096ec7010000000002000000000101085bb83aeaa55ee05ee1dc43619959ea83a10204eb0e171b6e836634f691a6fc0000000000ffffffff02e8030000000000001600142db37287d52f46cbcdeb9722c46d1ff1013a26c6ab9c0700000000001600142db37287d52f46cbcdeb9722c46d1ff1013a26c602473044022030e7620beb1af3a7c828b7eccf3012316770125402951b23ceb5df2cd8256010022076ca6a9954d5c0cdd7fdc1f8a5856ae185afd9a6f6bd84332bc9b66a15be965b012103fc04f75e36676a0ef4af5e983fb55a54bbf765f9966432dc0d03050312c3605a00000000"; + Block block = new Block(Utils.hexToBytes(hex)); + Assertions.assertEquals("00000000009e9f0f2585aec1b003156e74d15c5e407bd1450d937a7b6c1f4fe4", block.getHash().toString()); + Assertions.assertEquals(40, block.getTransactions().size()); + Assertions.assertEquals(Sha256Hash.wrap("1d3191e3447a6725d8a5be53cc9a931f30d95d649c202f7c8272793ee6357c60"), block.getTransactions().get(1).getTxId()); + Assertions.assertEquals(Sha256Hash.wrap("dfb588d52eab6091649b77fdcd5f41e8eeec645519032b6c55fff3f5308715d3"), block.getTransactions().get(39).getTxId()); + } + + @AfterEach + public void tearDown() throws Exception { + Network.set(null); + } +}