diff --git a/hived/conftest.py b/hived/conftest.py deleted file mode 100644 index 337443a615131ee7fb7a4989001c778ea5134033..0000000000000000000000000000000000000000 --- a/hived/conftest.py +++ /dev/null @@ -1,7 +0,0 @@ -from pytest import fixture - - -def pytest_addoption(parser): - parser.addoption( "--ref", action="store", type=str, help='specifies address of reference node') - parser.addoption( "--test", action="store", type=str, help='specifies address of tested service') - parser.addoption( "--hashes", action="store", type=str, help='specifies path to file with hashes to check (one per line)') \ No newline at end of file diff --git a/hived/input_data/accounts.csv b/hived/input_data/accounts.csv new file mode 100644 index 0000000000000000000000000000000000000000..634b9c25e4e315ad95d0ab2b7eb5d31599a7df9e --- /dev/null +++ b/hived/input_data/accounts.csv @@ -0,0 +1,100 @@ +ranko-k +alittle +hxclife +nkdk +aboundlessworld +theoretical +etccrap +clonewarz +karen13 +sulev +thecryptofiend +cm-steem +phenom +darkb4dawn +bue-witness +robi-rusmana +dwinblood +papa-pepper +keepcalmand +cryptocurrency1 +lindee-hamner +gaspot +acidyo +fabio +testz +bison015 +kingjohal +rossenpavlov +ledzeppelin +tombstone50 +ivanba12 +ola1 +isteemit +me-tarzan +belkins +talanhorne +irit +jackkang +bbqbear +dmacshady +cogliostro +fairider1 +boatymcboatface +daniel.pan +bridgetbunchy +sweetsssj +onesunbeingnow +msjennifer +bhuz +alexoz +ubg +sponge-bob +alchemage +carlidos +tombstone35 +hilarski +geronimo +dasha +winstonwolfe +putradham +gidlark +anarchyhasnogods +eleiminer +creationlayer +ciao +koolaidssss +timsaid +runridefly +nobodyishome +maykor15 +someguy123 +stealthtrader +groovy +bleepcoin +sascha +steemitpatina +veralynn +calva +ninzacode +sephiroth +rayphu +oaldamster +rubenalexander +allasyummyfood +yogi.artist +creemej +tombstone55 +trending +algimantas +markopaasila +jonnyrevolution +kakradetome +jesta +warrensteem +ikigai +hakise +leylar +akareyon +always1success +jparty diff --git a/hived/input_data/hashes.csv b/hived/input_data/hashes.csv new file mode 100644 index 0000000000000000000000000000000000000000..9d6bf4bd1b05eb17bb43ad8ec7e39c41dabed179 --- /dev/null +++ b/hived/input_data/hashes.csv @@ -0,0 +1,1000 @@ +973290d26bac31335c000c7a3d3fe058ce3dbb9f +6707feb450da66dc223ab5cb3e259937b2fef6bf +b664e368d117e0b0d4b1b32325a18044f47b5ca5 +a9596ee741bd4b4b7d3d8cadd15416bfe854209e +8f2a70dbe09902473eac39ffbd8ff626cb49bb51 +9f4639be729f8ca436ac5bd01b5684cbc126d44d +f72b66e67933f652381a888f42f8cb9b0cb2ab57 +05d54bc0413172f4b65e350c2a2677d392b1b936 +e75f833ceb62570c25504b55d0f23d86d9d76423 +cd37ff668ffd5f304d91787463642145686fee4c +c7ff9544c82b87d9aea811bbcacbd887c40d71f8 +402de988705ea3deb2f0e1ab0411157c7d4656fc +f8f06c7eb2853d247a040bf01b1a16421895b29f +28bdee506698f5b5780e75724ed8fe2daede2cef +d2362369316bf2175093d3f3eda43badd7342627 +14669f700014276a681ac09b0df046362b5bc7d1 +5b8100ffb6414e774de15752e0b2873b70cfdeea +b9506b77439b70980a59d5f202ec3722082033b8 +014f18b60008d4f5985b3acd6703072d89beb2ac +4b9ef86001ea34d4d1c3be9a307b2b9e8e996189 +0a8ef345c69e1401ca4ac849d932436799043241 +cd8c708c55c06606e80ccc1d7f68fde8ed314e37 +13eb4b4b86ac951da54858815fbb527b27fce2c1 +641b458efb92db5c6dc01fe8a9bb8ccf734caf83 +52cfdf79d9e9127ba0b8f9bcf0a866e3344d9ceb +36b0bc22b0749aba48c1dff9c0e1ef6c58037cc2 +a61ac1e718624a9fa7f364bf77de5ede7766fe3d +24ea3a4cdc4f5b1e0fad44628fba13fbaece3575 +dd6cab312671414542a2343bd006e7af2113a9e0 +9a2060802b5263097443e63fe0ebd1f81791015a +4710584d7e76e319c525de0cf147c9a7d04e37d7 +e48c5952287770faea58cbf13b30773d2b90f442 +015cc6c168603beaab75c3cda37fa8c47fc5c226 +6d5f64d6a3bffd1872f1c48c479467a1fab2852c +9a2986faad9224a69be77cc42c0cfa1348da9bc0 +4414458344d2cf3391059d3ede608df02480cdb4 +919f249ed5e40fd86f71d216921ff85ad281ffc7 +fa7c8ac738b4c1fdafd4e20ee6ca6e431b641de3 +b34c25913379195bf0aa146f337c03f56aea2758 +b65a665ee5638f3fbb32158a1ce78d5dd8d88099 +3179b62cfb1b6ef23683acfddd2dc8b2a1bed008 +11d20c1971df220e7b2009599a5ae25636cba763 +5dfbffb1804032f52ac4ff11400811babc2f69f4 +eef8d19d32e250607afb9a3544244f62d8c349db +f51df41abd498b7b8bc689cacc8913b85293b6d1 +f1da3f2b5f80a9ed1e4c892328d0ecc9d4f7941d +0eaeee5e1e7e1235681650c844e2a1adc2a24e37 +09eea62e3506aadd7bb25904e790b2b712cf7e23 +3dbdf5ec5fe6ee370a39d82bd4b06dba69d415a2 +1d21799a2107110e43ba4f1004ac68af04bd2fa6 +ca3391da22a9c5834595d0bf0a26e0be87cc9f18 +6c76f18b4950ca1e70a6cf71590d699cfb727f3e +d211335d2e685feb247417089438908b0e85b08b +82a025201b5cd32f0895c100412180aed4c010f1 +d09ce9caa83aa0895c2940b439c1e89bb8943b16 +62dc8ddc85e94f9b1b42a8c9278cb209e3dba905 +099d74fa29eda6bf38226235b6cb08d23c385436 +bc666464f84c00205f72145d2ea243e8ec87ab27 +7feeb504bbd72f1b08a2592f84e5dee727e2d747 +d39f71e0bddeda77deb8a0c1dd315896de85fb07 +6f35d717f9c3e292d62a46e59817988701980d26 +073266fd91574dca46d322917c68f4fd5a61c9d2 +919c6e8b13b6201ac22ad85ddb8a18eac9584a39 +de0c418d20855a3c9037cd546a01cb3dd51ff8b5 +bc8f7941edbfd75056d16e5fbe1d3dedff05cb67 +c07f39735a7a6cc8f465a21d779768b7b6a2f89e +232d363cdcb9467fc8d49578a04ebcb2046a537b +b84c86831acd54e8fe93a2667b9377ce25807d18 +fd9959a4c6c5b08ae7086dc7ada6d8ed6f695a51 +06437b7559cac83df7c05197d5be82aac18c025c +518d661842eefd912e8c116381883a836274827d +4dd9534ba24746827c1e05d8bb7f935375a3e6c6 +14e37e492db5d3917b2e1e391aff9f42a0812941 +d9286e538b0c97e4cfe62a1fc02a477dc542ce88 +c45db2565fd1c18bfc76bed39c78dab9478b7f8a +ff763fe4581a351d60819f62aa34a7c3c5b3b87a +3ff537f57756117bc1467dddd6a19e83df7e2c3f +2c0fc1d693f14efff2efce82c0d067ee8a832742 +b18991725a835993b61eb77a8e9d69e109fd0b96 +c6433cfa1c177397d694702e91e847c6c85317fd +71948367406c2e5759badb29039bbd5bb260d7b1 +672e989f809acbfe4cb5cfb96f7d84710c070a75 +c2e7f1d0d5b816a1882eb1aa6a67d36a36d30d2e +59086cb99c03922a344d3d5651affb25926b2c1e +951014b5345005251a562760f1bfdd0e5c301b03 +424810b9d4ee174d32147f42046253b0b61326f9 +6c8a48c1216f689ada5736c1f7dcc811451be19f +7aa4f82c1a245790e4be36852738aa65fccee42d +e08b0706586dd2c1a93532dd57b029e0b72ad669 +9f615e7cc73c630021a72ced83df1a18f5badf9b +314c35111e518b240af8b6537b65626d2e564575 +2cfd9a9df850cc7f52a3f7ccf838518fea31c882 +d3526827f6f11f817185306739b6711198ca1f17 +5768022ce0fc68f7a89e10876944ff1889e47092 +4240e5ca287d78068f2530015ff834529abb887e +967234d4198a33d9b83a2ccf6000e8bb7db1d988 +509f1ddafed08490bdf52e42de7b4436e6c7647c +b9e9fb63215f614c50c5b8a13dd187c8041f9f4b +b550dc454ade71d65e7e738bf6b40fc3de05d131 +ab3289ddfd93edad78ea9f7db936387139a5e787 +02999c617d83a4ded5f209ebe0643c82c0e9088f +02ce82c6d4a868a0fb4dc6c08dff2f95b990cf9c +504bb8cd31b15e2470290e2bcffe7c1d502f280e +5b627b78955939ffc732ebd0abf410ac02f6731b +fcd07ff45e2708076dbc01ee1fcd55baa7f5931b +eb8e3dc876b22f4a2d814fff7750f3462e4f636f +a830969d7d9457c8927f4a11272265552f92adb2 +0d4fc0033b117476f96a3d949fb96ecb095f2374 +2caf04ca97665a5b51da7fbe4b6d56ea15a84392 +0a0e4381c8f59fa21682b1718f4e637655ade26e +1689ec982de7deabe54b7dcacbcd11ca4a1393eb +f145186f961f08cb038c6289dc909d32093e8dd2 +38c6e747f96459cd6158f476ba7d984540c454cc +1af433b228dd7c9fe3ad5c6bb0b8684582153f40 +dcbbfa5ab72de94b2345f82a79e459c41e27630f +765dc2920d8bed7106f7d84c6deddfeccc462071 +dbaf25372c816053ccacde0e15c318bf586a7a0b +ea6dd37f90ca0dd32306d441938eda1d0f0500d7 +61fe9fdf29d15a81d23954dbd3f871fa8a670cd0 +b2e11a94718042318db8f907d5b5ffb34d90e28f +229b7d062704ea8512ccc53f3611c1fa902344c7 +e0c52feea278ccecf515983f13605379c123ea35 +ebe7bab469bf0b3df594c3c5d487e934349e0025 +d02d3d691b165368052a4c8de0a7c600b733637f +1b4b641cae18d10adfd40e7168f2b92e745bcb4d +424c7362bb01ade2d1a7209712d4ce220643daf0 +1a7f12be8415ea9248cf363a5feee5f695ae8de0 +f15968bc3c5950516c0d77087abecc1e1787b1c5 +c03605df8d2d10616b64547cbf030405e02ed4a3 +016ef86cbc3f9b7df3fcf93296b40e21c49bad14 +f0482d32017f17c4e2f8d00d90563ed39017aebe +8d0580cd27133576f0b6f4f8537fb04a88ae11da +aed22f0403d210f4e48607723b98cd78e6fcbe5f +1f7d813d206b4b7c3c400c24be4357e7de4119b6 +07534a058ba207c4457ca22c941bed14bb8fce2a +0cb4fc96f8b88436fe125cee14110962b83bf88e +107dcf1665c82f9645071a3b61c57371b2706026 +da20134fda99d899a08031b981b57f328adc39be +71eccfc08cf871483ac653e78b1fd72b447dacd6 +69b8f70de3c99be2272ab3385288f9ad1180eca2 +aa7d35a97a0df4a3ba5c696005c0bd6f5123ae5f +a10da765db45709976864c61187b327eecab9b58 +f1b0ef1c0151b1a7f77270119fd074904850bf8e +8b788149c29b7155148720f6de367ee6f1f2e241 +31e99bd5131628b7033551e1201ae0b90fd3a4e8 +68f901d93de510e5a02455011f38edea93021a6b +a5ed16cc65b3f2243e4156a65ad125ceba3a6405 +b8faf9e976e45b92b77e05aa88c363a4061bb5f0 +8e248669c64c34331171aa96f323ca9ac73aba5f +bc9cc8ba7018c98227c53e478282ca906660908d +b21c4f2c30c76323b69132e0d938d9a6d53f7203 +b5846e2ac98ff1804ecd19dc733708ab1f4cf110 +f907c8d0c2247a144f043dfeffbdb60c437fe4b1 +699991403db9ac010de43e19cc15ae46eaebee61 +2f9519b4aada17989b6f7588986b5d39cb752253 +de85ab8a7025893211022d653f9440ce2eabbb1b +e8e2b2023653b1bef70796ca871a49e9ff88d195 +43a2ced5e2136fdc9564ad2d7cd18ceb5a1fb8cd +8cffd40dc55a07ee869ed7a504957ced1ce03b22 +36ff2a93f1c296dc058be05df6fc7a74035a315f +4be92b086414f1fa4fcfd4218ff3a206a61541b3 +4aef0b234ea463246a2d8f614c70f4dad4d410f8 +e4680fc0f7bf03ac35df4a3ab9c760347faa9c0b +6e20dfd682940b224e70726b67aaa6e74606150b +bc36f180256287828423a8fc2fed4c94fad2f999 +c8c6d6ff56d033bbe530f74b8fe9a25c021d03f3 +9feb015f5aef1b852f80b087a2a5fecc428bcad2 +45104d526fdf8f15de6f437086b44ebe4d506e58 +697e434a01e9a88fde2dbd3cfd00043bcc55d918 +6b369280a88ea8e4a0b342f84fbc25b2ab0803a1 +10022a34998cd71deb98f75847f269a50a3f9a91 +893b2bdad5af46d14ecb21b7daeb96d38fb5a3ad +6686b0bf4c716afa03891fb33c60302577d629c4 +823695271807ee745f2e0d311257a9043accf873 +4588d34dba7efc0664b08eddcb7e5e134a6cbb5c +df3b88b152b04df0477a8e7629c614c1dad3ae46 +f10d08a8e15e66b62f8fc1fa8dfa1f4604d87e4e +e458f67091d500eb976c764f2ff29740f5cd5ba6 +6a8c44456c62ab02f7c4081e6bdfcea3c9d04322 +e01af2fb1b471df64b441cce2cdfe91e27e1fca4 +47101d7ab7955028d8a3acc7fc80eb6d8948acd4 +9cbf368bc44616f2acf7fab7ddbfa24ac9e3cf79 +d755f5116e4a632acf6f242ef4b9a6510bd9e33f +025d699b085281280dd8f7ea15f6a51e1f753263 +ddd2b7dacf3b400fbd6dc5016b84edb3d9452978 +1b2262c4cf23ef1f66ee26ed1868bc7bb600b8c9 +1b8f14195ed5cbcb8e3c887184071462bfe21720 +7bf55a1beffde767613ea8d6fabc144695177626 +c0a794c04590b554a88b7567c3bcd2df1bafda61 +74bf02355ef1ec5fa74d3950ac90b0cd7e07eb94 +6026e0af0caf95850edaa776ec11f89afa3466ec +83a1387e782cb96437c42537769baf47801f2708 +968a5899fc421996b1d3bca842eea3c21f038b20 +89be275420088668c1d78bd291928ca7dc79c7c3 +d4fb5cd21f5753f2d91130a082972a7b0a75998b +a48cf1190c98cc2e4aa04738e65a9b293fe79394 +384d6469a2a766e857db54e8f9676ebed16d4aee +1e49447cdb80d57621b338c2f563112f615acfce +54eff7791cc3461c1d4de37cf06ec45f023ea782 +835bb961b67fcef7d5fb9a7e1d4e0d8d7693b77e +de47188341659192153928a1387a420a9d156e22 +85c88060cb42c4ebbc94b34d16bec133619a86ca +c9e783ce6760c403f09355ecd2b3018b426db544 +17e68516cb5fdd53f474baf616f85aadcb9dcc85 +0e75e44b97058d79dafccd65807c0aab1bec921b +4134bc0c7864cd05c85281f16a624c1bc83a0eb5 +012a5419304c256335827832b0228751ef378c1b +7614e223f62025468eef6a5ce77c6aaba0c6c214 +5a7ee9be84707855e244beefb7ab8d82306ccdee +121b5e810494fcc4ad7340de43f3a9cd1070766e +ea01d2c1980535db5715d63cc06e0eda82d047e5 +68478d57770dc941cd214972a71e29d2f9151549 +035d1fc2a6a1a1c08c41588569f7ddae27bde6ce +f68cc766c3f37a4710dcd017196e2ad7a4891411 +be2cb95c66d0e556b45d16e89c8c882ce8435de3 +67f18a1b5b1d87014f2a65b06292abc1c8d50b8a +422738fec5b9a0709478a70eaa802ccf2ac7f9f5 +0b3a0c5f0ece98a2c47b6df71f5bc4d7f8e4e563 +43d8df28bab6e52344bf0d069e86cc2a3e0f5bf7 +391105312afe6bae731e37e09445fdb1780799d7 +187e8e345631920e73ccf02ef8224a028668e34f +1960682c37fd470b7212313beb3ffc9557fee9e3 +31944e1b8c068ea8300344c0f5db1fb90c8117d0 +cc7e10ce42ed1f02dd6e5ea4f79a1b4ca1b35a72 +202559d53e9334ba1f317b1a62eb87d88a345690 +f4cb9c30b76056671b4e61b10d2e14548215f522 +6ebd988b07740132c502f58f6ef254eeb3586c31 +7b4731efe62f3b92258111b7c13a75a73cffc16e +5284de42305dde9d1ee2453a35b02531aba2a870 +617c99b149ba9ee741113ba33999da1752e4a35e +242b4e2b9e3247b41eeb02b6aa1caf60b9019e26 +5d674da5e6f9d14947999344c0368987e0ab6626 +51fd56adec6176270549e4d28cc90f3f0c5287b9 +a1e79088a6fbf2477112461021f49887d4111bc6 +e0f152022a57a17c3eb57905b47c1f48a3b5b7ff +8f17e1c257b1c73185965cd1458243a6187103d7 +c05db781e48a2cc7541487d1e35c281aea973f21 +a2b2f60ee271f8f7dd08366a8d9623c3c3ef701c +3da6e26da1c532a8be3b8c5e4df2925ed2167254 +53c965b0972040724db850445e5f7b028a377d61 +656cf904409d7d11dbaa5f341a2dbafbc29942d3 +7f8ccc27c173e3ee690fb882612ec1a4f770a523 +ef7a7b7fce71506357c048ad12d880c6af165086 +a744e4191b74af98904a29bf51dfe0083102b21b +ae50fc5a1d8d12eca5232e487c63ade90ec70961 +afac242dec430d9027c95037fc8f5f6e01675f19 +b6c96d4d5465fec5158c7c69d665d2b0e27d1aaa +96a4452433f41fcaf24c3247cd2f2ed469a5e6f0 +76437420936ffb630ef859c16b3f0bc993311c14 +ff99729eb5657c41ddeb1b237450c8b1dcb87ac2 +957c5f1d3ee4f47cbc7eee65878c15b4b0039654 +0dc3386d11eedbf8b1bb383bcba463a226e7e36c +7017368ca629e3785b09749b9989c94479ac066c +c1dbe6d5aa1d3c8c845a88ef1517bb3665bbe7fc +2e55f8f4434eef4df1c3da9d9edcc5ed134269fe +f4f8a7ccb1e1b13c58d9a16f1d6fb78487b7f581 +357ea6aa9d1b46257acd44a66f899425a4598676 +ef076d47328a622c2c675f3236258aa89f77d8cd +3802c64ca5c92253c53be4a00383d9327eed6b1c +2f8b659a06c3bfbd5246a571b841244d3a4b36fa +5fe655e0f087f9f69a7e1d5223eb4872540862f7 +c849221ad26309a889ce3c28820329e58b240373 +1aac9768a59caf76a39d1fd859196572704054d5 +f801f7b2c7c5e721525a4a26d2032f969dc5d8eb +6110cb28af7a36b21ccce477929a20d902690baf +093ea6a01174d145073630b67ac116a747d5f922 +2917c8df86ef048bd50550318ffc734eb651a204 +58ed28e34ee1d8764baea0d85fef3c75247cf595 +912cfccf3d6b851c63702155815a33031180fec0 +95e89a2d65ff2c8ac81e1cba846cf759768b90bc +e9420ed784bf9d30f0b0ca966d9b5f191994c193 +af19bc0b7a06b161ad4114a4117bf7a3154539e5 +19451263ad4390c7267787e3fbd0737a091246a5 +a0d1fd24ae60ef7ca47f76306aa2c6e830c93ab0 +eda500a424d4b070e3714d91b316370f5a457eb5 +9dc3f41cabd23c55ee07d9b080dd903eb3f51c08 +b6c86aa49cd541b9fffba916d0c4f0da157755f0 +12e10d1ca48f020d0010474b392fd000f744d681 +86eb9e8f97a5c321f01b6dd6354aa7fce8096ac0 +2d7446a2ced88e9999ef3dacbfb67f406fbdc668 +d4c79278f03e20a311810c9c87e8594a95067222 +9500c39878e7b2fb13b1feec10368a5b67e9356e +115720db9f3470c7550a18635179de14761849d9 +ca4d6a0de0c614b4c241cf4a30eb1d55b88c7c48 +e2a4b68249b3f409720087ad69bbe736a8de55f7 +727adcc51aee49f552675aca7669a9477166c546 +93d14deefa115c2df402a5d11c219bff8a84a945 +85f51a75c3c54df952a79b50b4adf397101ccf61 +9b028c2267cbc6a90c724336319ab8d5924cca21 +890fd89f9daabab8b1c9995dbbafefdb9befb58e +0a783518f5a0b42bb67d3419eb9a71bd07c88563 +43e7c519365cbbf098ddbdb266689262c917d9c4 +db81c06d8d156efbb8e4627feabe8093abdcaf3b +390eb1fbe90885cd5d9ccdf30f2687dd3efbcee2 +2f1bca4b0e2fe0bd58b4df4fc6f0906dc24eb583 +137e1f0af9139bd37a327071bcceec890283a972 +72ee963b900272ef01603b204534dd00ca079b39 +5161d40df83c66c240a8ea336b4512e7cb9d33ba +f90d2c624a14894fe951b708a41b40d77bf1c25e +7b9cda9eb101656ac6ff89c6b9871d5561b9acf9 +a33fbb6eb82d9f0b31bda2efd67ea20970e4c275 +4331607c05194394072effeed5c4c6075f8cff46 +f6703020e732c20110ea0a369b2b51a9acec2cef +bd5dd5d176469a296349bd043d06162adf84ea66 +02219360259225281cb4f9526d268e26584b99c1 +d8e062757d38242f68cd17f925b34a294b1c5e5a +ceac54371f142d25363b0a4170c3a333cac1399f +444e03dbfef2998cc04fc4c9e07c3337f99377af +dbd6f9edc3e208f569e3d6d9fe59ef04cfc596e0 +8612cc588e645a0e1d5ffe3b45c4a2a84bf60f2f +26976934d6719c164779206fe957323369547adf +18afab1a68d8d8b045955b63530e953e78297d77 +9a09c08c2502f75f921ead8c7068638f1018784f +6c26f138cdf374ad67631d187c0a270946f2ea7d +9fcedaa3360a4ecb031b96ee2c7b5d7434be1431 +8e472298ff423556d1a481ee4616411951c20b83 +a6b0d373926aa5d7f4a883753f05efebb40bc8fe +c3c54d7a3059bbb4760f119149855bd4a3c5c416 +4042d898194db095f98ea829167c9d51b05eac9a +4cb0d7701186cc3c6a7eba004635aceef5109de4 +b0a4903597e6efcf09005d3923f612b40a47fdb4 +ff28a1817adfad53ac77e219ecbfe88dc6a49ffb +230e84a0cbe7853a41ea806f4251aa88dd95bda8 +a4ffc7704e1afba3e8d8fa273a4202b9de34e8c8 +452aee116562229d162bba10a761f00804c5d4ca +f315740455e5cd9517138c66c30da81bf6d5721b +446c33ceafa493dab01d7c1207ed8368015347e8 +21cb3197eba9ae863c7a43108424ac10fcdf4bea +9edfc063a1220984d39994967c110936f92e9d3e +8b3d7b25accd9431df58e9d9f504f262e1922aab +ec99c0baf49f05a1749aa94ead6abcce536399fa +e3a491efb5c9ca1a627f1e265fa4c82ef60a7d30 +006430d38b2aca39a0a45c2d66bf4597dc2ca1eb +eb91100a8a03eb70ddb8ba611165f988241c0b4c +0cd5b24d33488b8e61ffd2eb76efe8a259c8175c +18047966a95d25ce5751e3918817f527d4b919a4 +8adb1b92df0bfa3b727eb05fd52393ee81ecf2b5 +07584daa4af70b33bcb94cac8aeaa0e15d102907 +be2b1afaee8984242cd256f78275fdddd36f6da6 +9e118811546becfcd148c85f1ac1d442d2a8279c +e6117081c560babd37e312130634b7df358ffc51 +0da4b71089d7f82417cc7caea22bc12e8b30dcbf +e9bdb53b882c16e07becc92c610c94e2db605081 +e5ef40c98484fef2c9b4dda9e9d6837caa2ee8b8 +e8639e67dc95f61dcf4ab6e28ad18046b5ed2dfa +bd29f8043f952d9c088692b83404c9dbbcb5204a +e840039e6bfc69b314dbc4331eb26edc4e3a2015 +0ec7a380aff0fce48dc408b10c0abee208af9422 +94aa76b33d05756f5d2eb58268a7fbdd193c7370 +b60056418b383d7d2b1ca4c96f3d13062f018714 +5b705f51a43bae4b24784db8dd78d404809874b8 +fc3b86dc094866a81f4e88f9957be8c1e236e589 +ebc0967b5a44193141b0444fe2ea4808f7c62c01 +037bdc9c9b54087d97e8251c6d2a2e07a05e0530 +afe6f43684d53ef3e15e8a54b6f94633d29e5703 +0c4d24c07124301f3bfe0ce68ae5a3fd24422a6f +1ce163b5e05974dfdf99dfab5185c72aff659139 +daae44cc2e10aeb7c25c2a78f82e816efd5c7082 +5b1747a1d233d1c3ef914870ac074f008d664332 +314838c1761e0dff5d02f25a1669acb09f4d3881 +76777ac49f75cb3caf59185bd59938d3b2327226 +f1b6f85124838310e4aa2708c5f0853072595c0d +df2e3338a20251cbfd0375ae20b4d23180c0737d +4a49ce6879b897a6c50ccaeb56118595b4ffcd14 +73a17905012e3e583eabafc30a9426a672a5a79d +353a78116f11629d74a937032bb3919c77ef19c5 +04d99e732c384755eefa3ed9dcc59c5c291e8328 +86fdc359c124c94d55a89f2b69d2cec6d78eca07 +ba93f0eaf2f514022c0ea88414adde969f6f1640 +22e457b14aa8b400fc5ad8a82c359f67135eb526 +2e41d3ed7f52b211bc40c5684b12bbfd01217d95 +1912c780eab908fa762d58dcd704015801b7aac7 +8a5f9a937087d1aa53e07484d172dbcf41d73b07 +4631c034899ea8a416ae3a622ba970154bf95206 +fbcd67e03eee7fa48a7f35773f2ed659e23fd877 +dbbc822b68dc458aada65daded80f5db335863ea +8563d36fd3256c015dbc67f5d39b519076793f60 +d5cc91b34a13da42faf0862d7ab01f3f6ff6398e +385321c65bae33f8290c3ccef92d0e9c772d8396 +8748cc4fe91a1d185e6629d719512f9ce12eda06 +98f388c485fc5c9b5a1193b540d9c8c81541a6cf +9ac5ae2cc0d17775604b1d94f74fa41bc88d8aca +8b81a6c7c2084418791ce9922d4eb4912478e80d +4bdb2daa2cee2f9f73961a596c9f63294cd69865 +7f8ba968e221537f017b6cb88522d6820ec3eb29 +c3a7e2c2ee95bd78695a7c14869c7e9d442ea2f1 +623b7b8930a6099e41dd3e786a5b906169f72d6c +efb53b8c2231ad848b5220b1b5ab07a37f493a0e +89dccca9028264d3cfba63bcd53d4841f078b9c4 +b11fd871099ab7e482110c1c765738f3ca6eccfa +fa0e105f2d91ad16f8961ad82c53a25f4b2f791b +235d45654c1fb3f0ab18d79bcf15edf0f65845c5 +1297187173b61efd06ba16783a68296ee5c0e375 +f37cea07ffd642456584004e7520b3b1b1fbc1a6 +4b8741176bd0a0774fd0fbe0c076bfe96bc307f4 +1d0ca4541ba972df621c01e5fc6b7471091c5e7c +7fac1d6e93a8345baf6c51f11b23a307db3cdbbc +425d912f55af586e0a57d884adbd270ce30e090d +a6f69202a6c216ce887b765ec745cf3f406bc4ab +5d532b0cdcaa8d50abf4d1c9b41e6b741690c3bf +cc14fb808bceaac09c489020dd72dda27d8eb5f8 +63772ecc7202c48a2e96af420f889d62116ec726 +ee9a70b7bc2341d9cca7a9a3871fab5b202f2aa0 +e81b0b390e6f4129e96f356c1fd1f04feaa5d2d0 +6fd922fbdb74b02a84ba56b5aab586e11fa16c5e +c033f9122e076bb0c1d6b0aa757b22b884fea94a +424647cd0654d85c5eaea1c7600dfa50015f3bcf +ddf7bc1550ba70000a1c54a32d7af3af5012efe0 +387e4174ec3e61f7cf3cb6ef3bd99cbc02bd47fb +b7b216bff83908cfda60dd60cde971dec039ced2 +af52797680f4e1ac8a58631ad0af2bc660b92ffd +4bce68d69cc0f11eaab85a279aac3bdad142f17c +811eda40542ded5e5250b80a1ce91d1adc3b9fe7 +9fd7fc44b459993820039c4012f284fa2697e702 +014f9c1640889833139a9754f84931256f4a16e6 +bfaafcfbf693cf969e05b9ec8b44799598d195ab +27b5b73c23f13d82898a3bd473c953ca0a11c503 +ebacdd23bd3f9f6c73e7310bf0ffa44151fe123c +3977b66401e118a6a3806dbe601a2e71d18216d3 +25caf0727cb4c0d568cb09f4d7ee5b475180407a +33d80db7f21a80ed437749c2b6f116a1c0b8d8bb +34ca048bd3fde0cc8dd038ee5f47afbdfab25484 +1d97e7ae9b81182dcf1b144f63c71a4576584e5c +0bd9b6840e25205fb23407e73bf265d21de0c06f +364db8b2a3ec12f37b7ec840b143a13f4491fcb5 +bdf2d58d12fbbc7971f7302c011da11ad86df7a8 +711f95d680379e4d9f8af81b9f9b24b49a332109 +e760b620708b247860d8d3559c9eb6cf2e623e3e +74478130ba07d8a05aaf67e228fa2e1f98a0643b +0df9f26aa7693939fd56dab8a5ae1ac00a0fa12b +56df21d4e1d3d96d98e74fb926bb46a56992aecd +93f847154b2f66f4c30122e1c4978cefc0807d5f +396933fef36a2d3a8676fdea019d5aa18e2066b6 +47a3fca3e22a81c0369db56895bc0415b763564a +76f137431de6f8a12dcad96871aff91126524305 +f053365ef4dc2162e87ea7303d09406e231f468f +b9086e403b6a34d86152384be8dd7e1bf3ddc29a +19a75d3b4d87a8c666d6be98931999cca4b97ab4 +aeca8406c064c2bca7a01a53e0fbe2acc4e18b9b +45cc8b2b5c0ad1d7a5a283509bb92a28273abe0b +800b2649dd17f7f894154f8c7e3c032b13f26556 +d05f72235111ce0c54c8f5d060affe59eeb12fd4 +affeafb575e5c43cae6f537f05f49a47839caa11 +0f9b5c13f604b78dd21db8f1009d22ac1874f317 +5cbf93a0646b12b17b6909c82919184bc98606ac +4a945664976f0b91f7de89232929a9da9fe22e8e +1b749fc8439f66d949cc108a01bca1f3850163cb +235cc6e04199ce9437f35c222d2ef38f375dc09a +5c22cd33bb461334a9dd5cf2329d8f7cb8640560 +52755f9234ea36799f998e86de9bcab726a6d30d +adbdef024fbced8a13436bf293bb9682b92a8296 +20af8e5482eba1f5fd48d5c50088d64683ed5991 +445c406f3ea2cadeda437698e20972eac20b9bd3 +8dc888e1171384081671623fbad0dfcc9789495e +0ba18d43ff1257d4da266192ee912cb1d3d3dcf6 +8a084aeabbe1bf60a8baa43d766c4c59a3627b43 +b8003f77b87bf4b1324dae73a60cd2e7d35b0b21 +5358044e366b43d5695b40a7d5e8a0a527832484 +96d7b6ff9f662dc3a17bb8b48921389a0b7d7c30 +59fca925cfb380e6ffedd4b00676aa10ec4ef5eb +bb51b276b20a5fa2d9cc66970ce4ce662295582c +64c756d863e231bd59f2ca56645fdca726c3062b +136962bab2f26d86b4abf7b7c49a92914a761619 +7888fd63ca4a31f7f1f5ee8db0ecd63a44442fe2 +e0240041563b7ea1ca3a43da55995c546d15fd89 +61e590715c4d77aeaba039568ee8d6d1b38829ec +477546b87cd8c2a369cd1833b7df322184cb3de2 +f9176daccd1dcb852bd8fad76d89cc495c4162cf +afb937f9c17d16e0b5b703ca5c335850048f381b +0c53cc936ce34702de6b97ada6c9339fde295d14 +04c5bd331bf5bf98059f53ca3fa4433412eb9311 +c3095891f1fde550d655aa11e07dce36814c39e9 +42a972255e527c446bd7a8bcdd29a874e73e933c +71be0d5fb3937d42724b11a292ad217190905864 +af73a9392d14f65133c56d0ea1c93d5abbf32a29 +4bf6815c77c7e1971499679ed029ac831d32f38f +2d0f87c02d36a7a2bdcb20eabfa8d70bfd8dbed2 +deab3ca14bbf648cdc3ed3571243f0ca870b352e +7396107521161a3be7d986d54f23dff71a424ae6 +a674d775d8f86f46a389918026a2644ca0f2fc23 +e7662a6c96b2b91ecc88b5583ef51b13710bff6e +6440bbb53d4bd414f6699f5df10c4fa73db9204f +4cdfad415d8f34418c0ff05eee12d07b6f2326a5 +ac2950caa7177167d1d25e8dcfaeec4eeb1fad55 +9a7ef44d48d0bae63add324f7df682d1535d362f +af60083849ba711986aa8f08ca16ef69cd21cb1d +7e1691bf88291d5c018a6d607a237d372cea0a70 +4473d4d237a26a25b8046f2557856be70564f647 +1aead4019bbea5a19ff1b0e20653616ae1ec9757 +08143f1a373566a5ea46a85986048f2095b473d3 +36edf14c325eb182bf1567afd2a316802d58b821 +96eca68b0bb710ed3fe0a88ad2bbb9e92fa4e7d7 +1c4094d42ef7151073429e988d58bee8c582d4bc +5993dd87179d38a67600417d54e9c801c86c461f +e9ff214345e9f812875dda268f293baa7f4792c0 +43754759fe799fb66669b192c84ef07e3dea014d +ddc1e82a4077f4441d8a4d7c617f84bbb7ec3adf +adb7a991664082cb7897c387fe967adbad1337d7 +234f592f8e34bb8930c81069e445a47c43593041 +4d35e3966757f69d7bd92f5c97a61b7d3700affa +393d5227b913e73dd4f0080ec505b19f55ad5f75 +306bd79963cd646916d6a345e57b2264eaca7f1b +2db51ff2fb83057626262f81face6623b0ee7a7a +bb021d3eda8e01194ac17b02ffb26bf52f89b09a +9195025004d67101e3b503e8b8221569e5925011 +bb5a4fcd388773e261c4095e99bb43a8fdc8fa54 +954ae1e77ef6b9bdeb906b7ec6449ed0dd5ea9b6 +b621aa28bd2354fcc963d26f22676d5a1e89ccb7 +2591ccf39944e9d3ef3200c97a8f57188065afe8 +4667c66471d8c858a74d22d74081f23d1375cd3d +d1db934be75c1e7815328728c2a2e84db797ba5b +1164d4c7bdf4cd78af3b90019841d996dc3bf400 +03e95024e5c568f55fb4da09bee8d99d17ed1606 +3646757b55f7b9bd5a4e22f6f36e906eddaf3142 +70de1cf359299dba32f93c2fd493bd31806cad1b +83602a7d671d857b88f78261efc4491d7c6886ef +005ce0c44eb741b438824ecc703c099894332430 +072dd56aba0e21ae7e32aed2f1fe7595992c84f9 +12f734bb7325cf79678c044aa3154155f28e973f +dbc6b1ebca6e4080a9a7c17da946cd35ea704684 +bf2baa92ff5e38256a370b3e294ff6083a0263ea +3631aba3dc9a2d972330055441d3f37cf2951fff +d8e9303d0df638732572798dbad0122ee7325f2d +d88157949d91286c25f473e61ff345a800e32fd9 +1c3f80b8a4b87bd94d8e8fff76612e368b1a8674 +b7ffc5dcb37335149784447a75cf694e10ffd7dd +fb8ec3059deb547fa8cf0921f34220b055b2d177 +e0023fcad556986865a7f441199f33930227d4d3 +cd5a9b80f4456f2f85438d84f1487204044b6558 +f451d929661c42ce86a09e8047675ff4a9f91a06 +524e78a2941cdfe544e92da9e909d64d0b8ca6ff +034d0976c0d14a96e726f7103449ff5b5ae68821 +dda506fc281a96186e0b17799c9057ae7584a5e1 +0c8ec482058ed21f6688361624d147fb4ff49c48 +e89be88968adbb8003357d2a469fc837161a7a05 +e017caaa879ae6e2a71a71fab93fdf8db53653a7 +c990e779af9e02086f75a59ff27dca1dd6ded710 +0908a79808705c8befaa1043ad41ace8ebd0427e +1b14373817d97d2c56e09261d6d7f155d51a8d43 +9e6996db95959c19fa90942c8520b498239e8d1f +6717148f7ebc8510ac6eff905f7b2bcdc018c480 +99dadf8dd7441d939cb745bf42b917803a81e628 +03cf498476315ec1ba7723762e7d72bf098a51b9 +3a4fbf7750a2f4896860991b015e7e77502a2175 +a3c7a4068a0f01f93caef453a2e30125cb539eca +7ff152e4deaaba5297fd3556f657561836441129 +b3c903d0c3f7c5a62fe1a00ca4789156f1a1fd91 +d08da2500bd36376c90e1a2231547dcdb5fda1ee +07a87d7b57dff4346d4fe501d4356b013b46c2df +d289e65ed684e3edd9645cafa1e1f3b19b7b3513 +d02f2cbf772d5c4519365f134a39194e1c236f5a +1f1419c572ca1d47c1569229c1ec2638f147908e +d9c5ffdc9c2e2cfb676d23ccbdf9b13ced06401a +9e121357432e7dfd628b78033aa03f5a48da92a3 +2af131d1b67913c4050efca83eee9486accd7dda +504d058023cbb09d382adc7109ef2ad8d8a1a9c5 +289f3346ae31bfa28a915470ea404d999236f4e1 +20159cafbc4ed89804f55b4afc5c398d90d523fa +ecd17817767dcbf6c96b4175e0369eee6fe739ae +37abef5d23caab19c5e6390e9ee897f2640983dc +aeb8cd4f1d819a6477d7a2d0776e00918a0f900e +12a452523e36f6f63921a6240eb49a4d650ea892 +3619c0fd650a426aaf9406c35943f4504ced3bb7 +62a5adb5bb8c5122a585b060793eaa51cd0f3e46 +c998738cbd8603f5baa531f0a0825f8b8e579238 +806f4f7f5ddec9b308654a91f108d26b16b1adc5 +81d45bf2b20db1f36e79a05b2c6f7a97a060093e +4b844aace548d4de77b394556721a3368967ff6a +3825e2f06b5bf9e8f33371a28934bcd4db76afd0 +4b0bee20a58540c87b2d7b679d6925b045741744 +c86a167fdc4455cb725aa732019e2dcc2abefadf +60531ffc969c58d2906b4a7d18b6e99381ae58eb +7d7c4a497fe01ec9eeae689b73595429c1c37e0f +38f2e5aa7beac48622057e0e99db97ecf051438d +cf6727038a2501b2d93fa11a4ad69702bbe4116f +06376f46736ce647c3fa38a32e14ed2692c08599 +73b9bf6fcc662b90d2898e2f387172b8181ecb70 +4b172e0d39832ae43663aa4dcf7b2f9eea8417ad +42bf73d68c25b9301b41ae1d3d38ff2e7761c029 +8f415ed53de0ee7d72aa984e8ed482cef8fdbdf6 +d0e6252ea5a3909efd5cebbf518fec1666b5e38e +da35eb26108703b094fb321ae33fb2b399bd62b5 +99b1fb646a298ea44ea219def32e7a3ebb07ea05 +21ec979e4c036167711d414a6ed6ea5685c83149 +89c4f2b12f660c568b5aeeb44ba05b21384125f8 +b21ff65b38b61bbada89e72e8d2b819c3600e078 +ccb4e2374151d508648435ab479de1f1387121d1 +2063c954c062554a3a0d5ff58999593c2afefdd9 +5d7c010c08b95ddc1436efbe3c221407aa15071f +7902e44f91b1d1eeed5f69a79c63e6b9af613fbb +062a64ab2e7c4ffe6bd9f6566944b7ec5cb70cd4 +452b168e2661c6de047867d387baff19052668e6 +1c8b6a68199a16698b5cb8e6581a4d6f93c657e6 +87c3f229f9956430479eb7cf26c2df0b16d7e980 +7a56527d4d39803307b52903b7b339083dbd0ecf +f43000cd44fa5c2c5f89b99cf0e8c5ab991c792c +6b9e7df91275397198c4cd4e2f9b6503778d5ea8 +fad0665a566a556b5da6fa383300bbb593b08a57 +444704d0d9c907d16414570a05b8289f3609e6f1 +e7227fb95ad1fbe4b96cc5c31c7b298d65ab9edc +11a1550bcf06a1df7aca2d2f1a38e88b4ed72be9 +1c51ef4e5383eeb4f6fe8a96e8b1e03f735f5c36 +2f077c74f8c15f025fc22f77a7ed60c1feca3e1b +08492430b39f55127be1c857e6fbea2058cc7d22 +e5b9a9fcd74ff00eda8ff72f6c9bd18c58d0557f +ce0c20fe6532099273f3b5b6100d4110352d7ea4 +a830e4b8e278c01dd4292e8ed1f773acefa8fcb3 +fd20feeb06575b601bd0025d9effae4bdbdc80ee +bd29425035a44c2d54c29eb45906892c10a123e7 +7f9dc120c66571887ca33643f9ab2dd416aab97d +312eeea19f76ecc6e9ae1368867a179154cdecf7 +1a0e93a7c7f2745f680c2cac11d3aba920746c9e +62fc68839fdbda3208f575f00ce2c18c0f4603c0 +0547ecf1ffa74a637afc49c31b1f9f86fe085460 +81699caad82162596b0871a1e8945e0795dd9630 +9ebdcd24b32b33ae4d2aecdcfbc23cb1a79a7267 +6a83dce6311887bec425b87e159c33969fe483e3 +cfb032d56f7c7613e921a9855b7e276f5ecd5429 +d0249b82e3112737abb5972f1c74168f560264ff +3edc86b20d8df42ff4f1801ea065e6c86ee60f2b +781d256f0a9f161c2ee260eb04082e73d38f036d +c318e88b9680f4800e36fea79d0301020fe6167b +4eecdb5fec43c55308295af4a15f733bdbb86f4e +16748380256ce2be562969830e599830be4487fc +ed743630e2f7309bffe12471b19ddf0768acf147 +ddfd20937de8717c448ae614db4e26d8f861279c +e7cc348824d66ca2d59c91f6581014b5ef139102 +8ea541791abba6850deaa2b2d6c01418638de7c2 +4dc2222baa7d824a1513de38549f5f514e005412 +29f65cc784664872fec10041600807b152b7e1e1 +b927b5dbc99f718c64bcb848ea2c6c383b5c3dc4 +2d609b41c5fa5f76adee11786363deee8f7a16ca +ef94aba27f9875d6da33b26dae44ee63f06f89a2 +5a3380a8e2e74cbc8fdd2d543351c5e7a24eb2fa +e4a14d6d47cf77cef748bf45a3d9b478d39c2142 +238acbdbe1076a21a7f49c628f29fd1449164bf8 +84e9a5af8ab5f01bf7c4a62b2b15e0de767e5bec +459fb4b79457caf8820334e73fcb94f205f32a75 +37ae7ee08e07340d5ca9df69bc1a6d5894d6f71e +0d457f28374c6e8c5592779784fc9eae03c4b4f0 +e0234f33c852b265ae45408a8bb2057592e35208 +ed47f85b4d81eda3803935ba4f78585a722cb909 +9404992f308bd2185b4579a8a316ad62c215c4de +394c52f526e0364d7b739e0093bc26fb7687d93f +c9344ad89b9a734af45f76cddec44160866769a9 +4335e7ccf6c36166c487748df6bee44918c94327 +0e1dc54b902255415b2ec2ada9ed93f6fe9b3838 +b83ef2de62bd6a27411c89d5dd796cd98ddaf45c +6a2dc4b862ef578eea8fe134490773e80abf7635 +2a1acdb5462a4f24ffa16caf591791f82a79cfaf +0c9f2ca207598b1f4db70d98c7d481161293048a +8ae6faa8f4b2370ed842cd332b45ef49a8839193 +811828b385ecd53886d007686fecdc234cef2bda +d12b2bd21be85ceca0dea35caa1f07e193d023a4 +5ce67b2c708ed4c90ca4596f3983085ab43d002e +1279b0c252dbfe3807797134ffdeae9f8249787c +80b2307c6309d5362fa514b8bfd423a080232f61 +4b0a8b25a84be2d887bdd71ecee892795e5d1ca8 +ce186e6b46f0d6b8fead24dbd7111749f07e15f7 +3491abc7aa75fe20712bc6c806ce3761533b406d +c16ea234d05a228b505b43497fd023d3b1376f49 +bd63a32cb4004770cfba222973881535b7013ce5 +929dcb7714e78264228ad031102dbf0c4dc44a77 +ff87124b3fd9054bcee69c711e7293d8651b3070 +10b14836aafb1444584c3c27b3886d903b4f8962 +732fcb6b4ce585ad2b08f16f676f8df5cf2275f6 +dc38de71c1def85c67e9b12431d0c07afdc4e555 +b6d23bd3972622644cc7c3bdd7e4991b08cf4682 +3988f116d85caad819207cc74f25633b791b9924 +b3b1ef3716d61f2803725c0e742cf7fb0f1b1bb9 +3a765811273fe932e43d2a7ca3e0de64a00303de +1ec28200d2b19a2509d33d94b50cc86514c057b7 +5ae71581302b57b366ffe7be433cca430f36af45 +1f3d03ca1988cfe4b22e40078b5298b03138acfe +a1a1fdfb4674da3635efc6571031cf70240276f7 +d3acdfa0af8ce06b92019de911e089bf12573ac2 +412a528dfb4365e235d819c574d11d746f54671d +83398f732e1d781a053debacd41353da9b60eb5d +71aaca5ae1d3a83772d02a674e02d9e47482a582 +9607dd01d353d2595ae7e767a3095305252716a4 +82be27088a179bd4d9b681f1338511ab93d10253 +495588109a40b5dbc5d8eef0472a9a0427974cb8 +7e815024632f876e75def1ae5b396db8fe6f8585 +203bbe27d9ea7d6e87c139b966ca380304d14348 +1b7720e316dbae02db8c34f08ee7199adcf1b06a +a70b8827aa6c602c79c985c868dd34d62ab9eae7 +d0a25a8d3981bd3bcd2eca4d933543f6498fdf22 +ff40dc5302f2508c0c678d320b8542f155d061b2 +a1a8227cdbf0bfaf3edc059c6b334f67d3462642 +68a3e64770fc1deb66d324eaef849289a0f3232d +480a5c64bcf451091ff588449c8a8a019690e4fb +dbe3ad53ac41494115163ec2a0f72a08d0c2623d +fcc185be97ea986a220d6aded007f5208860acca +e312eada8d32d439f6ebfce899da9856013187cf +17dab02637379d10a083cad0687b988cc36170fd +ad18a8a66b6354bc36e8ead768830c2d6fdd09e3 +5062cac6a51429d27a838d23f1982d6e2d473a19 +cd3fac2755bcb60b199db7026e768938a071efda +efe6b96e94f4aab0e30e971d8e02f57c3163a0aa +ec9357b1c7f465353cb11fc52969788751becf8c +dba220b9f52c4f3b9ea8996670bd4cfe4d55bc15 +9fe7da501ee11ec42ce300053c6e68783c21731f +6c9d5c9d72253084774be4f85f0f7a7aa4e10da3 +a5004f48a033c6bb377740cbab06645ea4dc4feb +6713f3c1992a961eae70aa7e98a1b17e91764406 +7e38cea571ee69e1e3986a660ab7f8b539709b02 +c0adae91549aec34f6f172932603fec444cf7adc +cb42d24f7d72d761ed4fc90b5de5a3a5839b0668 +a9d3731c71beef5ca87a1e5c35fdba9f18f5503b +a12340cf91824c73ff1254e5470f98ec63c2568b +9919c8996cd2694f6096092276025ce99c4f5b02 +de8af433338cfac4a4d4ceb9035a05f0383abe6d +723b08baaef19078ba0ff059d3ef20012f9748f9 +e1054915e16794cbc1b30e7a10f7f49032b95942 +7f9dad6129c6f3052b8ccdd7578fa8cc09a403cb +fdf58886080141e0479d35d2ce3781a8f9944fab +96543ffc9ba3320d2d21c485f1712366ef74dd03 +800e10a5d2597e074bd2a4ed1edc11178c630769 +840e9e09ffdcb03d822837973f0250a1f05262e0 +03bb755c03cb82425c5bbd9061cc0560eb123711 +28d1e51ff67dfabe2a5588817dea8c0a273dba56 +2d7f836eadae0d0584f65404ec4dd1f82e879795 +bfe3ed1b219439359a09833c20e28bbaa35296a8 +33e83299c27f9a70e672cb572368079be4372507 +2a1175e22097319c8af43073a72920320323d905 +c7caceee9a242c36018fe6a84c212bc83bedf2e8 +4b9dda94e2dc25c488aed00481f9975e2ee15987 +4a5ea24d1bf5bb8b866017f6e09321ddea01a893 +79d68faeafb8b9fb08c32df8b2dd512bb272c510 +b58dc724abc6abc5e00833f3aab2390cee064349 +3cf13549944ed258e02a30a4cdc1db7d9e62c049 +7d82b97f15c9472be4d101ba5572359b4ccf76fe +9e0ac331d8686bad30270ce403dba9fc8e032b54 +80f881db80989df4e6a78e32c721b41c783d0eae +35495dc4b463ea06d8880e75006f9f6f10956a0a +b4999affe9880a8d4067d91c121801d4ea1a0a74 +25fd50a6c2af1081f8886ae1f19e3d864b4ba95b +8ac5c80b5a9881284e5f3229fd3679058d20b17e +3c65857c60763465c21302add7e657324c3f8a88 +ec64fcabee70986fb5ed2cf1a0f6f9d230f834b2 +3ea725a47309a7dcfd2bdb1a629dc2d21f87edb8 +58ba63126151ed7c68db5eef6a99b75f3511ce6b +9b59c6ff81a12c97fba7e74e8cf9470e6e1ba69f +becb0b35e5f313b787b6dde0e625bc1c7f28d0cb +ca6e38ba8368a5f74fb4b8cc045aa4d1b78720d7 +63bdccf8780018614174bfdd4a55f8d4b490330a +0b4586bd4c3cab1c7d132bfb54c097ca6884664f +638f0bd1d619c417d89c5695ff637ecd0489087d +5d64c2ffee3b59e1b3bdba2704fc37741ba683d4 +ba51391b848f25d7979393579080b7c55e928d63 +08b39026ac929566c41ea4ac8c8d87920d69e68d +a02fafaef5f47a867991dd80128ac6da34eb6d15 +ba0edcb8cbed106c6fbf63782eadcfa6cbf759bf +f3ed9b1f93542ca136aa07726abe0ce6915fbe9a +30ea05d5cacc04c3e2012808ba446b66c54ac382 +c04a902f989d6eace83aeb06c594c218c71b4d20 +bcf20259af73f1c5621292cd89e02591f604efae +8c4bff6ad1c98862a07cb0f84a29219f09056939 +07d3db57537e716ed7f2fa8ecdbdda756deca044 +67e52e5f05a47bd181608b7e572fd233680764e6 +6fa2e09694464c5e6bfdcd56b4ed2d80847d771c +9411e3d72342c0a87a7eb21f060b5cfac232a65e +bab2b2ad85652fda83bb446adfe268b8f90e5663 +0b43fcb65e2caa6a06f4b65d5ad7be89403b0e7c +8902535f50c226ed73277a960c5d302f31548eff +06e5444dc7dd006a6b69b3e618dd05a21feb4811 +82b2d370dfd42179ab2a638ddbf1e06ba9c1a946 +9145c3e532db342ce5fed888ce02452faf84bf70 +267be97a1847f094491566f9628eb67712626e52 +d71cc5d45c62433db3d9330063effac439449865 +953dcfa04bf8c181d026fb58786da607c3d27eca +484a5adb1214fed09f9b8de271cb33a1e7d6c77f +ca279f384f30deb43694b0ea6cb640af0d7793ba +2f825adcbda57463a1d8f12a3a9fed4e7228efec +5d47e3943cab3fb47b494aab145716ecece12004 +1fe5ad556e9e07faadad5dc2f399494719dc4d74 +a3089c5951e9c3938db25a1120ea043b30665d2a +b1c652a125e16e97b3906cd2ee844c98d04f4ce0 +bfb5ff59031a3e6cdb595e70120135d9ec12d12b +d9920583ce205eb6ffd1c4e9839f4ea8b0e77265 +80960c9f610d7187f97adb176545bc6144bc0984 +ee073b60abe37f43df2c097ace8110b6fe301af6 +962e113f9e95ee05e83c3088bbc195b3c5a6b9e4 +0748b2c4c8b1431a29160c820d48cc4ba8c2952e +cf7748fbe12b28c1d7122d97a7778ebb4b96787c +0b48eaca7148a7fc9066b60f66ccb6826976d957 +9ffe0904451ee6d84a4dc0357fdc9c863c7033be +39b7a8614f316dec2683b1bd52c9081ea1d04b06 +9e9c8d17e4f0f1e44eef2b733813e6894ff41ead +228fab9f900b54e39dc491db0f5a1dab52b1b482 +2c628f099b3639e0e652bf1718686f5b8256edfd +49bd0e35acc613eca01bcc1449201c78046f4404 +4b6d72cd05ad672315dbafa41e5ada54131a05dd +a5e9cf197c3f7dcc235e301e120a24f33dab8c45 +ce695e1e5d3e12cb176cd5ccc4819648c85a44bd +e884340c603d6f543a2e97d9c416c678a3990194 +e82af26806275c4ab502d95c1e00e9eaec125a8d +dbdb790406102f7f676b2d5f651a0a9490db2ad7 +6d9ffbdcabea6fc30789c66d01f72629b8f5dc7f +b3df1a68c2c1d6c5007576eabf9dcae7445a8416 +ea63b196c1089f1b1645cd6240764929295df40d +dc17137d019db1ce8a0c07738663e3b6ed1a88f6 +4e4841a6dd84505b956ce960460f5be05dbd6e41 +c5cbc347146f62dc59e3618c881a4142f8388094 +90b0b6aa3b3dccce540e6f36554b3b8de7b5567e +98ed62e2adec6ea5f4d3d7da588def68f32fdc7f +38f29ce696e80c0228adb85d22814187627613c3 +0e84597278a17ab60dc9c8738c292f1814b131e9 +d9beda3bc00c43f0343d38fa3139c6a9dd5639c7 +0f5d1369be2aca4b56b645fbcd3b9bc529155bbd +3d8e91eaacf352430d877efa4a3a0889cc6dd762 +7402944ae539e29cdfba861962a54bf6d5592acf +a017e0d35dcfcc8a56288d524cbedf6327bbe6fa +446a34d0918c5aeb417b27b14471441f523fd1b7 +5e59fe25bf343a4fa32b484f5897b084750b9280 +4e604650ce70f99be0f8e5cc3de83f39074ad894 +ca2c2ba9cef438582c9ee0751261a55b7b02aa2a +d9a7fa06066bfee2e5c086539e1d8649bb59c8c7 +975e6e9f253beacd5800a77c9a3000130f36c3a4 +d8bd62756cc3db0f5ebae6541cf09f0e81470f9c +3a16178d341a31ed73ff3df7d61e716c7e37be5f +cea08ed0d2f971ec81385443d455e31ca46fbcea +4790d788651cecfd8c9c7841c9f22ac72b84028f +3cc2c7c333eeb56b7d00ffb0940dc0f34c5be425 +f54df459e5d333d75937d0fb705281430a39b889 +f2ff679309c644b1757eceaae2bb68d767b36057 +2b379bc0c09efce91ff51dab866d69615fb5173a +b8998da7792fa63d367b29af23c182a089a77d16 +45b0e0343e3e38137f936ec252267b776159139c +3183d833704abe22c3f9dc09a2a3e41adc836fbb +576146b545b7b6a196acf894884c7243bdd0591c +78f63eb2146e6bbde74305e2fc876a9b0cea27dd +d0f992c5abb10989588754b8b1fd85e2e19c1877 +50f82961aa47213ceecb68bce980f317a988e518 +06ca0256df4eb3ab9a1305615bf13ae1a7015688 +762b12a9bd08d22d1184313096d875b5cf5477dc +b743451ebba02937543716f5d1f5d019020f9543 +07599b20241d47d98dd914b204508e1b18a37f63 +b8e40089835582dcb00f8a9f1c4cb95e02702106 +27ff63cd0a7083ca2ba72a332098011c1a3bdb9e +2da4ed3f8f1e087ed9b490e94ee85ffb5e3ae501 +fa4528523d3e47eedaaeb3611ddd69d32c40a0dd +265b4696ac3a9564030d98901390f8c664662614 +5915bafb780e8cf2856336b56174f9cccbb2e03d +6b93719ca10ec7688a2c894e3fef4b2ce10151ef +52908976e734a44f56e079afcd19d9d0a956e97a +ba9122525f1cb05fb28880d1e3d7ed32618c7026 +2af6c9f15e9c5eb28fc2285ebfac7228eaeca4cf +1643da5dc80c69c4b1b4a83487517ff4414d92ff +393673e2685b93367c192494728a5d5d039e18eb +03c227274e36093e08cc3ba6c79165790f90718a +bb39a6aee3d071d5ea0205a80172b666c66bf8b0 +13a69bb4703eba71b59f0f9f7a92f9890dfaaa56 +adb72d715c87085da75f790fa87f754fd3e4e4a7 +364fa1d03426f03cbbc3ebd1bf7197d04fa7ff35 +ab6739de44afa70904fde97f532316eb01afd239 +88b917804e5272b10e2dabe37f902b12042a6565 +db11fc97e5e356975a25542f80a25f64ea8b5f83 +87473e8f3a1895eaf9485af3017ed4421114de3c +53fbca6ee5fbbb92b100fd7fda952b0403b15899 +2c55c2c5efbb1a18f602c4fba904476e880d1d0e +0090e2f3da2ee4cd524cd69b713b6237bf20e53c +892beb9ca6ec1a459856e1670e9b4195523f3838 +fb3cd30e4beb34c27dcf2e27a298b38ad24cee6f +8514876e80834081b6a53c1d25e57623b729f653 +6f2fede89b8be9ca4b5eef5f7efce3478d7a93ec +ae88dbc2033cfd9b32e7f0c521154e8a437cfd58 +f56ef423923383b7d882baa9cf36cdf2334bd4f6 +3c935b86c7fd3eedeaa457dd0b8494cdfe98ebe0 +a38acd21452f7de6802bbfb991fd06c3145ede1d +14774854bfb47a3816185855e72dc2dc29744de5 +ace49a473a4af8d4e91fe1c152bcadbb26c09ddc +017cf85a3dcef07c3993574a176bdb92a58afd36 +02975bcfe182e502a52defc8f1f4c9ea5fd7b2b4 +d72846ff45ad346296884d212404a8706e0bccfe +9faf802339a181904fcee82407cc27771cacea5c +16c6457ba69289829fa903db317d839f8614ea9e +54f199e9ed1df874ec667dbc1f977c1d411c5a77 +00fb46f614cf812e91c2e495d3d4d1b681da42fe +e1f919a60a6870a30ef8d68d2e4119f9d19ab156 +052a400212de0569d44b50ed32c7c850d693d271 +043fb9ccf65df9248a145a76012ddd8be46b5e0e +f6723f30e7e0dc9dc8458c055492e534dc564920 +c76c38e0c38e765d230b48b4a7ec7ca5d8280554 +51a227cfa49d059269d5d3f5a4377db547be007f +d7c3f867c6286f6af9db7b1bfc0d3d8719ab791e +d0c2f18cddf97356fb77ea0a4a2ef6acddd2918e +daff2e31f9cd40e0e4f0adcecb45873e3e8d2b3d +4d95f4ed1e8036d7ce7779d4f3fc936985f648f8 +a6b6e09ff1acca9123b6e5760823e4f35f038ddb +55d7023391d3c3d040545431dd36145a84e1c2c7 +79c533dde510df7fd63f44d89514c276d203b3fa +5095aec34c0ea8dbdf4c4f6c4d2f3b15b9c68c9a +f7983867f3804fcf455bfd90bf8bda1d6766a617 +96baf29a995f43ed3f936826ec61cf6387860252 +bb20400ac088f041e1ddfccc53e91f226039c5f7 +2b24b4d1b98c2bb41d008bd18ba928c5cea8b11c +2852be42a2507b07838cc8616fbf3f929dfbbb61 +0e5d229f42247f6f1ed7e713f13c0a182fd25687 +422a7e5277f1ca61b410d1c2efce79712a1d8a4b +d1d260ff14d29a45cc69b2330b334cdf71e7b61a +2e4c8342185fa6e47c590d30fb6bc15d138cfd84 +7838c9723b23ed3ab68224feff800e2d60aca6bf +4bdd660542c34fee0b8627bded3d0568d1e28785 +a86fea6926acfe486fd749a964e7d76fcbbb2b19 +2419dd833678f96a8a483acdec7572d46b6355e6 +3107dce9977d00a655e791e30bd0069f7d4d382a +8cd5668f5fa0b427367d665ec649ae4e1fdffb6b +a0d2f7f3006a082b2bd8efa1a20cdeaffe04b5c5 +e371c4dea7710ed5108f65757b149be7ce75ba06 +0578282a9c03112016382fb0bfb86526faf1eefd +d08e6f0ec8fcad5a042bbfe63390ea91c4c27d3a +af5aa75161b8555734118e31d673df6f7a2da577 +e55bfbb7f57dbdce70b50b309c5d3d9590a2017e +a11c0080bacb11c3e8e95b47aad47adafeceb11c +3229ac787ee80b6e04000af94e1f5efad908946f +6280f0b777857bce4557ea97f99e0f7da3a96bb2 +3a946f6a17f8c0ef55cf27014097b8b2a0fcac5e +436740950ae19f2c638d6c980989b0682038c092 +eec4e252d6a4cd17cd4282794a17c8f68be62e6e +4ad08150d98f9b9206fbf98a33faf019a40b3e35 +a267f29665a11452be9f82ca8fdda0add9a15307 +ccde7cd029cbd9772e39668e56ad3142547e2c18 +e18765f0b69f3b73f6c540d724fb9c00ae35cc65 +41706c9032a7c0209afee17aed3afffd50d86531 +79a1f1bc31393c033144ebeea1de606ccfafe833 +c7a3f74461bdfda885fd04d45a35ba6488922f0a +ac885f7c8b586263eef7eec37ae357fd29ddb592 +4f48ce73273bf38057ab6cbc545b4749ea716e39 +9d93cf3e8a8257132c7c1ccc74def2b5ee2ff245 +27a7f8595d2834bfe87c084a6f63808509b08cfb +0eb2876284b1cc05cb85368a9c6fef34a48e8d60 +83ca117592c92a6bedd1f4f6d4f5c6cab72051e8 +edf3a05d8a3591a157c85f72feb27019790a135d +0d04619e0cf9f4d70c307293f75c7bdff0c545d8 +2bb0341a3a264d50430d5ef6b085c53426b108ea +579114645b28a9ed2bef2b9a72d0e9cc938faa92 +3b723bf989ac5eb7a9f02dfa7ef7cbb4ab05a84a +e8b3328f1dcdcacc45c42b5901946f7bc90afb7c +2e94ccce1e9d21c4fd75bd6f5e7f0bf032995de4 +78357f049ad4dab3f80c945851cf21eea039e536 +95561f43c710338e4b91420d5b7b6cc074068014 +e7cc1d7de412587f37815e8897350fbd0bbb7a40 +b0afb1408fa82d664b5f9e0ddbfbd95a2a9d5daf +3fe4e339a44b8bf4761e04226932c34aa33401c8 +bcc17aa0c0e04718a916d088c3f6d18b488dbc27 +01a53a8cbea9791be9dcb332d7ca124f5f84defd +e5d871116ffc250a0e7d96dcd964d19ddd4e8062 +324df8b3e924dc14ccac7562cd6583e3c9e0f7af +4b56d14e00610f17607f2853429825a295200b87 +564625a62f2d32817a4dc3f7abd0fbc1b374954b +295daab9e12a84f657a2618a69bebbd64fd22001 +af6e2e35fe2398fd3add6b1fc6e0eae8d96b5060 +dee364b0e70eff2ad203ad48f0f5fa80a9516604 +e7f70a9a109c0fd303d3f1dd853f529a54363b8f +b310d2af641ee0e77b1e065db6c22ed0162957c0 +479bf132b44aa3b6613221e684d98e33e01d808d +58adfede3056081c8d67a06c5c87b4e899050783 +91a30eec45875ae954103027d74a803ff7e7337f +b28b7c1d6253abf0afdfc0694089652dcc13c94d +cb5ae9c31500b8066d4570587de17be93cb27e91 +022c82ef7b9564a179bd6bd2ed6ee9c89fbcff82 +22f64ed15c5e9cf7e0c71017a4cb38a54768d802 +4ff3322b54ffe1c8b8964b45e5a45eba1f5e578b +a84d712e63f6ad2b815db4555ae82e90e1d8b240 +af57afd52bfab8ab710ea954ea8c1b39aede9b25 +45445d8f11379645027f2e876da8716fcd8f1a54 +660229baecc4d0ae165788a2fdb5ae2a7344e9ac +ada0c3da1cc7a67f19b340e18f4a3b0c82a00290 +5b3366d1a178b8fc03cb78613eeaf7cf1016b51d +f7f4870ee6be4d93f3037d25969532019be5f49a +6ae7c8e9a3c0d00700fa44047c1e8e609d50f7ba +8f1b8405cae119718d8942eaa8611ee0cf68f9bf +b573b6943d7c28e8709c256b44376166fc0c9d78 +9aa4848e5f4b052d6e384b4f43a1fa2ce1228fb2 +0720a6656614ca6c2a18bec90cf6eaae28a96345 +5109e954aea1dbec2bc3d7ec1a9bd3b24d38cd03 +4aa173bce6388537ddac605720cd3719a2acb0c0 +9875cd75ffd1b886246e58975f487f5cf3add145 +585f9c53ec9de920bd5ea33ed83beae303f46e71 +4d5065249be8a269d472215d9d04afa03e1493d7 +0fc9d0deb0f357f134404915bbfda2f874f60501 +794e73e4d35fcee17946432f79a3740c0c177c3b +838d8d444974c236eb9b18643308105433d51648 +f5f49593e418dcdb0d0ec77d1552cb032ba307ef +d926e49f959b2867eda1639a0d94394f95d67182 +40acee42207ed319d7e0acdf6fe871c34877b857 +a17bc9a2b896ade408114afc47c3fa38bf5126f7 +f53d713507ec756b42751349297b860b4134edc8 +ceacb4b2e71dedea3a7774ae033a11917e043ea3 +db8f3afa07c9d29659fdacb9c3807aedf40c7912 +9ee90715c0844e6dd3eca956c5f44763f452e07c +db2dc5a9e8791b852fb3fef51313f1bff03b57ba +7059537f38c31ca8d1cd53bdd9b6cd38058490bc +3377b2a1222c1bcdd596a771dd2a8070bd243998 +0db140a9aaf67392167e15b19ee95cb68755bd83 +36569ce61e7ececad9407d7e2ad4f0448d2dc669 +accb092a7839c4481d6d044874877fddd4efa6ba +597b28a03ffff9cd604aa513e9fe32e902e73943 +6ead95f2c1dbfbd49524917a5134827f21517694 diff --git a/hived/jsonsocket.py b/hived/jsonsocket.py index 0ce98f58954b5f8e01ce566b192c48a08f2106f9..e056049cfea9d7e6141f6b64454bb440d97127c5 100644 --- a/hived/jsonsocket.py +++ b/hived/jsonsocket.py @@ -41,7 +41,7 @@ class JSONSocket(object): """ data - complete binary form of json request (ends with '\r\n' json - json request as python dict - + return value in form of json response as python dict """ if data == None: @@ -57,7 +57,7 @@ class JSONSocket(object): #if response == {}: # print("response is empty for request:", request.decode("utf-8")) return status, response - + def __call__(self, data=None, json=None): return self.request(data, json) @@ -79,14 +79,14 @@ class JSONSocket(object): return True, r else: return False, r - + return False, {} - + def __del__(self): if self.__sock: self.__sock.close() - + def hived_call(host, data=None, json=None, max_tries=10, timeout=0.1): """ host - [http[s]://<ip_address>:<port> @@ -97,7 +97,7 @@ def hived_call(host, data=None, json=None, max_tries=10, timeout=0.1): # except: # print("Cannot open socket for:", host) # return False, {} - + for i in range(max_tries): try: jsocket = JSONSocket(host, None, "/rpc", timeout) @@ -117,8 +117,3 @@ def hived_call(host, data=None, json=None, max_tries=10, timeout=0.1): continue else: return False, {} - -def universal_call(url, data, *args, **kwargs): - from requests import post - result = post(url, json=data) - return [result.status_code, result.text] diff --git a/hived/test_account_history.py b/hived/test_account_history.py deleted file mode 100644 index 1d21b6dd9c521ca0f81ecd26518c5c2b97bc24a9..0000000000000000000000000000000000000000 --- a/hived/test_account_history.py +++ /dev/null @@ -1,81 +0,0 @@ -# Example usage: pytest -s -n 4 test_account_history.py --ref localhost:8091 --test localhost:8095 --hashes /path/to/hashes.csv -v - -from pytest import fixture, mark -from typing import Generator -from test_tools import RemoteNode - -pytestmark = mark.asyncio - -@fixture -def ref_node(request) -> RemoteNode: - return RemoteNode(request.config.getoption("--ref")) - -@fixture -def test_node(request) -> RemoteNode: - return RemoteNode(request.config.getoption("--test")) - -@fixture -def transactions(request) -> list: - from os.path import exists - path = request.config.getoption("--hashes") - assert exists(path) - with open(path, 'rt') as file: - return [x.strip() for x in file.readlines()] - -@fixture -def accounts(ref_node : RemoteNode) -> list: - LIMIT = 1_000 - all_accounts = [] - last_account = None - - - while True: - result = ref_node.api.database.list_accounts(start=last_account, order="by_name" ,limit=LIMIT)['result'] - all_accounts.extend( [ x['name'] for x in result['accounts'] ] ) - if len(result) < LIMIT: break - last_account = all_accounts[-1] - - return all_accounts - -@fixture -def block_range(): - return range(4_900_000, 4_905_000) - -def compare(ref_node : RemoteNode, test_node : RemoteNode, foo) -> bool: - assert foo(ref_node) == foo(test_node) - - -async def test_get_transactions(ref_node : RemoteNode, test_node : RemoteNode, transactions : list): - for trx in transactions: - compare(ref_node, test_node, lambda x : x.api.account_history.get_transaction( - id=trx, - include_reversible=True - )) - -async def test_get_account_history(ref_node : RemoteNode, test_node : RemoteNode, accounts : list): - for account in accounts: - compare(ref_node, test_node, lambda x : x.api.account_history.get_account_history( - account=account, - start=-1, - limit=1_000, - include_reversible=True - )) - -async def test_get_ops_in_block(ref_node : RemoteNode, test_node : RemoteNode, block_range : Generator): - for bn in block_range: - compare(ref_node, test_node, lambda x : x.api.account_history.get_ops_in_block( - block_num=bn, - only_virtual=False, - include_reversible=True - )) - -async def test_enum_virtual_ops(ref_node : RemoteNode, test_node : RemoteNode, block_range : Generator): - for bn in block_range: - compare(ref_node, test_node, lambda x : x.api.account_history.enum_virtual_ops( - block_range_begin=bn, - block_range_end=bn+1, - include_reversible=True, - group_by_block=False, - limit=1_000, - operation_begin=0 - )) diff --git a/hived/test_ah_enum_virtual_ops.py b/hived/test_ah_enum_virtual_ops.py deleted file mode 100755 index 3582bede0a588a06f0ad4ba77f6755242af9e430..0000000000000000000000000000000000000000 --- a/hived/test_ah_enum_virtual_ops.py +++ /dev/null @@ -1,164 +0,0 @@ -#!/usr/bin/env python3 -""" - Usage: __name__ jobs url1 url2 [working_dir [accounts_file]] - Example: script_name 4 http://127.0.0.1:8090 http://127.0.0.1:8091 [get_account_history [accounts]] - set jobs to 0 if you want use all processors - url1 is reference url for list_accounts -""" -import sys -import json -import os -from argparse import ArgumentParser -from concurrent.futures import ThreadPoolExecutor -from concurrent.futures import ProcessPoolExecutor -from concurrent.futures import Future -from concurrent.futures import wait -from jsonsocket import JSONSocket -from jsonsocket import universal_call as hived_call -from list_account import list_accounts -from pathlib import Path -import deepdiff - - -wdir = Path() -errors = 0 - - -def future_end_cb(future): - global errors - if future.result() == False: - errors += 1 - - -def main(): - global wdir - global errors - - arg_engine = ArgumentParser() - arg_engine.add_argument('--ref', dest='ref_node', type=str, help='address to reference node (ex. http://127.0.0.1:8091)') - arg_engine.add_argument('--test', dest='test_node', type=str, help='address to tested node (ex. http://127.0.0.1:8095)') - arg_engine.add_argument('--start', dest='start', type=int, help='block range begin') - arg_engine.add_argument('--stop', dest='stop', type=int, help='block range end') - arg_engine.add_argument('-j', dest='jobs', type=int, default=4, help='amount of threads to use') - arg_engine.add_argument('-d', dest='wdir', type=str, default='workdir', help='path where output should be kept (ex. /path/to/workdir)') - args = arg_engine.parse_args(list(sys.argv[1:])) - - jobs = args.jobs - url1 = args.ref_node - url2 = args.test_node - wdir = Path(args.wdir) - first_block = args.start - last_block = args.stop - - print( "setup:" ) - print( " jobs: {}".format(jobs) ) - print( " url1: {}".format(url1) ) - print( " url2: {}".format(url2) ) - print( " wdir: {}".format(wdir) ) - print( f" testing range: [{first_block} : {last_block}]" ) - - create_wdir() - - - blocks = last_block - first_block + 1 - - if jobs > 1: - blocks_per_job = blocks // jobs - - with ProcessPoolExecutor(max_workers=jobs) as executor: - for i in range(jobs-1): - future = executor.submit(compare_results, first_block, (first_block + blocks_per_job - 1), url1, url2) - future.add_done_callback(future_end_cb) - first_block = first_block + blocks_per_job - future = executor.submit(compare_results, first_block, last_block, url1, url2) - future.add_done_callback(future_end_cb) - else: - errors = (compare_results(first_block, last_block, url1, url2) == False) - - exit( errors ) - - -def create_wdir(): - global wdir - - if wdir.exists(): - if wdir.is_file(): - os.remove(wdir) - - if wdir.exists() == False: - wdir.mkdir(parents=True) - - -def compare_results(begin, end, url1, url2, max_tries=10, timeout=0.1): - success = True - print("Compare operations: [{}..{}]".format(begin, end)) - - for bn in range(begin, end): - if enum_virtual_ops(url1, url2, bn, max_tries, timeout) == False: - success = False; break - - print("Compare operations: [{}..{}] {}".format(begin, end, "finished" if success else "break with error" )) - return success - - -def enum_virtual_ops(url1, url2, bn : int, max_tries=10, timeout=0.1): - global wdir - start = 0 - - if True: - request = { - "jsonrpc":"2.0", - "method":"account_history_api.enum_virtual_ops", - "params":{ - "block_range_begin":bn, - "block_range_end":bn+1, - "include_reversible":True, - "start": start - }, - "id":1 - } - - with ThreadPoolExecutor(max_workers=2) as executor: - future1 = executor.submit(hived_call, url1, data=request, max_tries=max_tries, timeout=timeout) - future2 = executor.submit(hived_call, url2, data=request, max_tries=max_tries, timeout=timeout) - - status1, json1 = future1.result() - status2, json2 = future2.result() - - json1 = json.loads(json1) - json2 = json.loads(json2) - - if status1 == False or status2 == False or json1 != json2: - bn_str = str(bn) - print(f"Comparison failed for block: {bn};") - - filename1 = wdir / (bn_str + "_ref.json") - filename2 = wdir / (bn_str + "_tested.json") - filename3 = wdir / (bn_str + "_diff.json") - try: file1 = filename1.open("w") - except: print("Cannot open file:", filename1); return False - try: file2 = filename2.open("w") - except: print("Cannot open file:", filename2); return False - # try: file3 = filename3.open("w") - # except: print("Cannot open file:", filename3); return False - - file1.write("{} response:\n".format(url1)) - json.dump(json1, file1, indent=2, sort_keys=True, default=vars) - file1.close() - file2.write("{} response:\n".format(url2)) - json.dump(json2, file2, indent=2, sort_keys=True, default=vars) - file2.close() - return False - file3.write("Differences:\n") - json_diff = deepdiff.DeepDiff(json1, json2) - json.dump(json_diff, file3, indent=2, sort_keys=True, default=vars) - file3.close() - return False - - start = json1['result']['next_operation_begin'] - - return True - - -if __name__ == "__main__": - main() diff --git a/hived/test_ah_get_account_history.py b/hived/test_ah_get_account_history.py deleted file mode 100755 index 5410b093483148c6dd0bc68c79ff0eee4e6560d6..0000000000000000000000000000000000000000 --- a/hived/test_ah_get_account_history.py +++ /dev/null @@ -1,193 +0,0 @@ -#!/usr/bin/env python3 -""" - Usage: __name__ jobs url1 url2 [working_dir [accounts_file]] - Example: script_name 4 http://127.0.0.1:8090 http://127.0.0.1:8091 [get_account_history [accounts]] - set jobs to 0 if you want use all processors - url1 is reference url for list_accounts -""" -import sys -import json -import os -import shutil -import locale -from concurrent.futures import ThreadPoolExecutor -from concurrent.futures import ProcessPoolExecutor -from concurrent.futures import Future -from concurrent.futures import wait -from jsonsocket import JSONSocket -from jsonsocket import universal_call as hived_call -from list_account import list_accounts -from pathlib import Path -import deepdiff - - -wdir = Path() -errors = 0 - - -def future_end_cb(future): - global errors - if future.result() == False: - errors += 1 - - -def main(): - if len( sys.argv ) < 4 or len( sys.argv ) > 6: - print( "Usage: __name__ jobs url1 url2 [working_dir [accounts_file]]" ) - print( " Example: __name__ 4 http://127.0.0.1:8090 http://127.0.0.1:8091 [get_account_history [accounts]]" ) - print( " set jobs to 0 if you want use all processors" ) - print( " url1 is reference url for list_accounts" ) - exit () - - global wdir - global errors - - jobs = int(sys.argv[1]) - if jobs <= 0: - import multiprocessing - jobs = multiprocessing.cpu_count() - - url1 = sys.argv[2] - url2 = sys.argv[3] - - if len( sys.argv ) > 4: - wdir = Path(sys.argv[4]) - - accounts_file = sys.argv[5] if len( sys.argv ) > 5 else "" - - if accounts_file != "": - try: - with open(accounts_file, "rt") as file: - accounts = file.readlines() - except: - exit("Cannot open file: " + accounts_file) - else: - accounts = list_accounts(url1) - - length = len(accounts) - - if length == 0: - exit("There are no any account!") - - create_wdir() - - print( str(length) + " accounts" ) - - if jobs > length: - jobs = length - - print( "setup:" ) - print( " jobs: {}".format(jobs) ) - print( " url1: {}".format(url1) ) - print( " url2: {}".format(url2) ) - print( " wdir: {}".format(wdir) ) - print( " accounts_file: {}".format(accounts_file) ) - - if jobs > 1: - first = 0 - last = length - accounts_per_job = length // jobs - - with ProcessPoolExecutor(max_workers=jobs) as executor: - for i in range(jobs-1): - future = executor.submit(compare_results, url1, url2, accounts[first : first+accounts_per_job]) - future.add_done_callback(future_end_cb) - first = first + accounts_per_job - future = executor.submit(compare_results, url1, url2, accounts[first : last]) - future.add_done_callback(future_end_cb) - else: - errors = (compare_results(url1, url2, accounts) == False) - - exit( errors ) - - -def create_wdir(): - global wdir - - if wdir.exists(): - if wdir.is_file(): - os.remove(wdir) - - if wdir.exists() == False: - wdir.mkdir(parents=True) - - -def compare_results(url1, url2, accounts, max_tries=10, timeout=0.1): - success = True - print("Compare accounts: [{}..{}]".format(accounts[0], accounts[-1])) - - for account in accounts: - if get_account_history(url1, url2, account, max_tries, timeout) == False: - success = False; break - - print("Compare accounts: [{}..{}] {}".format(accounts[0], accounts[-1], "finished" if success else "break with error" )) - return success - - -def get_account_history(url1, url2, account, max_tries=10, timeout=0.1): - global wdir - START = -1 - HARD_LIMIT = 1000 - LIMIT = HARD_LIMIT - - while True: - request = { - "jsonrpc": "2.0", - "id": 0, - "method": "account_history_api.get_account_history", - "params": { "account": account, "start": START, "limit": LIMIT } - } - - with ThreadPoolExecutor(max_workers=2) as executor: - future1 = executor.submit(hived_call, url1, data=request, max_tries=max_tries, timeout=timeout) - future2 = executor.submit(hived_call, url2, data=request, max_tries=max_tries, timeout=timeout) - - status1, json1 = future1.result() - status2, json2 = future2.result() - json1 = json.loads(json1) - json2 = json.loads(json2) - #status1, json1 = hived_call(url1, data=request, max_tries=max_tries, timeout=timeout) - #status2, json2 = hived_call(url2, data=request, max_tries=max_tries, timeout=timeout) - - if status1 == False or status2 == False or json1 != json2: - print("Comparison failed for account: {}; start: {}; limit: {}".format(account, START, LIMIT)) - - filename1 = wdir / (account.strip() + "_ref.json") - filename2 = wdir / (account.strip() + "_tested.json") - filename3 = wdir / (account.strip() + "_diff.json") - try: file1 = filename1.open("w") - except: print("Cannot open file:", filename1); return False - try: file2 = filename2.open("w") - except: print("Cannot open file:", filename2); return False - try: file3 = filename3.open("w") - except: print("Cannot open file:", filename3); return False - - file1.write("{} response:\n".format(url1)) - json.dump(json1, file1, indent=2, sort_keys=True, default=vars) - file1.close() - file2.write("{} response:\n".format(url2)) - json.dump(json2, file2, indent=2, sort_keys=True, default=vars) - file2.close() - - file3.write("Differences:\n") - json_diff = deepdiff.DeepDiff(json1, json2) - json.dump(json_diff, file3, indent=2, sort_keys=True, default=vars) - file3.close() - return False - - history = json1["result"]["history"] - last = history[0][0] if len(history) else 0 - - if last == 0 or last == 1: - break - - last -= 1 - START = last - LIMIT = last if last < HARD_LIMIT else HARD_LIMIT - # while True - - return True - - -if __name__ == "__main__": - main() diff --git a/hived/test_ah_get_account_history.sh b/hived/test_ah_get_account_history.sh deleted file mode 100755 index ed7bd3402fc1f9fe3f7f3f82b2846da42d42ab17..0000000000000000000000000000000000000000 --- a/hived/test_ah_get_account_history.sh +++ /dev/null @@ -1,126 +0,0 @@ -#!/bin/bash - -if [ $# -ne 6 ] -then - echo Usage: jobs 1st_address 1st_port 2nd_address 2nd_port working_dir - echo Example: 100 127.0.0.1 8090 ec2-34-235-166-184.compute-1.amazonaws.com 8090 logs - exit -1 -fi - -JOBS=$1 -NODE1=http://$2:$3 -NODE2=http://$4:$5 -WDIR=$6 - -rm -fr $WDIR -mkdir $WDIR - -./create_account_list.py $NODE1 $WDIR/accounts - -EXTRACT_RESULT="python -c \ - 'import sys, json; \ - response=json.load(sys.stdin); \ - result=response[\"result\"]; \ - print(json.dumps(result, sort_keys=True, indent=2))'" - -ERRORS=0 - -# account -get_account_history () -{ - echo Comparing account history for $account - - local account=$1 - local START=-1 - local LIMIT=1000 - - while true; do - - local GET_AH="curl -s --data \ - \"{ \\\"jsonrpc\\\": \\\"2.0\\\", \\\"id\\\": 0, \ - \\\"method\\\": \\\"account_history_api.get_account_history\\\", \ - \\\"params\\\": { \\\"account\\\": \\\"$account\\\", \\\"start\\\": $START, \\\"limit\\\": $LIMIT } }\"" - - for tries in {1..10} - do - local JSON1=$(eval $GET_AH $NODE1) - if [[ $? -eq 0 && $JSON1 != "" ]]; then - JSON1=$(echo $JSON1 | python -c \ - 'import sys, json; \ - response=json.load(sys.stdin); \ - result=response["result"]; \ - print(json.dumps(result, sort_keys=True, indent=2))') - if [[ $? -eq 0 && $JSON1 != "" ]]; then - break - fi - fi - done - [[ $? -ne 0 || $JSON1 == "" ]] && ((ERRORS++)) && echo ERROR: Failed to get history account for account from node $NODE1 >$WDIR/$account && return - - for tries in {1..10} - do - local JSON2=$(eval $GET_AH $NODE2) - if [[ $? -eq 0 && $JSON2 != "" ]]; then - JSON2=$(echo $JSON2 | python -c \ - 'import sys, json; \ - response=json.load(sys.stdin); \ - result=response["result"]; \ - print(json.dumps(result, sort_keys=True, indent=2))') - if [[ $? -eq 0 && $JSON2 != "" ]]; then - break - fi - fi - done - [[ $? -ne 0 || $JSON2 == "" ]] && ((ERRORS++)) && echo ERROR: Failed to get history account for $account from node $NODE2 >$WDIR/$account && return - - if [[ "$JSON1" != "$JSON2" ]] - then - echo ERROR: Comparison failed >$WDIR/$account - echo $NODE1 response: >>$WDIR/$account - echo "$JSON1" >>$WDIR/$account - echo $NODE2 response: >>$WDIR/$account - echo "$JSON2" >>$WDIR/$account - ((ERRORS++)) - return - fi - - LAST=$(echo $JSON1 \ - | python -c \ - 'import sys, json; \ - result=json.load(sys.stdin); \ - history=result["history"]; \ - print(history[0][0] if len(history) else 0)') - - if [ "$LAST" -eq 0 ]; then - break - fi - - START=$LAST - if [ $LAST -gt 10000 ]; then - LIMIT=10000 - else - LIMIT=$LAST - fi - done # while true; do -} # get_account_history () - -CURRENT_JOBS=0 - -for account in $( <$WDIR/accounts ); do - -if [ $ERRORS -ne 0 ]; then - wait - exit -1 -fi - -if [ $CURRENT_JOBS -eq $JOBS ]; then - wait - CURRENT_JOBS=0 -else - ((CURRENT_JOBS++)) - get_account_history $account & -fi - -done # for account in $( <accounts ); do - -wait diff --git a/hived/test_ah_get_ops_in_block.py b/hived/test_ah_get_ops_in_block.py deleted file mode 100755 index e179d55017a3801cc4f24971df346d02e04df9a7..0000000000000000000000000000000000000000 --- a/hived/test_ah_get_ops_in_block.py +++ /dev/null @@ -1,190 +0,0 @@ -#!/usr/bin/env python3 -""" - Usage: script_name jobs url1 url2 [wdir [last_block [first_block]]] - Example: script_name 4 http://127.0.0.1:8090 http://127.0.0.1:8091 ./ 5000000 0 - set jobs to 0 if you want use all processors - if last_block == 0, it is read from url1 (as reference) -""" - -import sys -import json -import os -import shutil -from jsonsocket import JSONSocket -from jsonsocket import universal_call as hived_call -from concurrent.futures import ThreadPoolExecutor -from concurrent.futures import ProcessPoolExecutor -from concurrent.futures import Future -from concurrent.futures import wait -from pathlib import Path - - -wdir = Path() -errors = 0 - - -def future_end_cb(future): - global errors - if future.result() == False: - errors += 1 - - -def main(): - if len(sys.argv) < 4 or len(sys.argv) > 7: - print("Usage: script_name jobs url1 url2 [wdir [last_block [first_block]]]") - print(" Example: script_name 4 http://127.0.0.1:8090 http://127.0.0.1:8091 ./ 5000000 0") - print( " set jobs to 0 if you want use all processors" ) - print(" if last_block == 0, it is read from url1 (as reference)") - exit() - - global wdir - global errors - first_block = 0 - last_block = 0 - - jobs = int(sys.argv[1]) - if jobs <= 0: - import multiprocessing - jobs = multiprocessing.cpu_count() - - url1 = sys.argv[2] - url2 = sys.argv[3] - - if len(sys.argv) > 4: - wdir = Path(sys.argv[4]) - - if len(sys.argv) > 5: - last_block = int(sys.argv[5]) - else: - last_block = 0 - if len(sys.argv) == 7: - first_block = int(sys.argv[6]) - else: - first_block = 0 - - # last_block1 = get_last_block(url1) - # last_block2 = get_last_block(url2) - last_block1 = last_block - last_block2 = last_block1 - - if last_block1 != last_block2: - exit("last block of {} ({}) is different then last block of {} ({})".format(url1, last_block1, url2, last_block2)) - - if last_block == 0: - last_block = last_block1 - elif last_block != last_block1: - print("WARNING: last block from cmdline {} is different then from {} ({})".format(last_block, url1, last_block1)) - - if last_block == 0: - exit("last block cannot be 0!") - - create_wdir() - - blocks = last_block - first_block + 1 - - if jobs > blocks: - jobs = blocks - - print("setup:") - print(" jobs: {}".format(jobs)) - print(" url1: {}".format(url1)) - print(" url2: {}".format(url2)) - print(" wdir: {}".format(wdir)) - print(" block range: {}:{}".format(first_block, last_block)) - - if jobs > 1: - blocks_per_job = blocks // jobs - - with ProcessPoolExecutor(max_workers=jobs) as executor: - for i in range(jobs-1): - future = executor.submit(compare_results, first_block, (first_block + blocks_per_job - 1), url1, url2) - future.add_done_callback(future_end_cb) - first_block = first_block + blocks_per_job - future = executor.submit(compare_results, first_block, last_block, url1, url2) - future.add_done_callback(future_end_cb) - else: - errors = (compare_results(first_block, last_block, url1, url2) == False) - - exit( errors ) - - -def create_wdir(): - global wdir - - if wdir.exists(): - if wdir.is_file(): - os.remove(wdir) - - if wdir.exists() == False: - wdir.mkdir(parents=True) - - -def get_last_block(url, max_tries=10, timeout=0.1): - request = bytes( json.dumps( { - "jsonrpc": "2.0", - "id": 0, - "method": "database_api.get_dynamic_global_properties", - "params": {} - } ), "utf-8" ) + b"\r\n" - - status, response = hived_call(url, data=request, max_tries=max_tries, timeout=timeout) - - if status == False: - return 0 - try: - return response["result"]["head_block_number"] - except: - return 0 - - -def compare_results(f_block, l_block, url1, url2, max_tries=10, timeout=0.1): - global wdir - - print( "Compare blocks [{} : {}]".format(f_block, l_block) ) - - for i in range(f_block, l_block+1): - request = { - "jsonrpc": "2.0", - "id": i, - "method": "account_history_api.get_ops_in_block", - "params": { "block_num": i, "only_virtual": False } - } - - with ThreadPoolExecutor(max_workers=2) as executor: - #with ProcessPoolExecutor(max_workers=2) as executor: - future1 = executor.submit(hived_call, url1, data=request, max_tries=max_tries, timeout=timeout) - future2 = executor.submit(hived_call, url2, data=request, max_tries=max_tries, timeout=timeout) - - status1, json1 = future1.result() - status2, json2 = future2.result() - json1 = json.loads(json1) - json2 = json.loads(json2) - - #status1, json1 = hived_call(url1, data=request, max_tries=max_tries, timeout=timeout) - #status2, json2 = hived_call(url2, data=request, max_tries=max_tries, timeout=timeout) - - if status1 == False or status2 == False or json1 != json2: - print("Difference @block: {}\n".format(i)) - - filename1 = wdir / Path(str(f_block) + "_" + str(l_block) + "_ref.log") - filename2 = wdir / Path(str(f_block) + "_" + str(l_block) + "_tested.log") - try: file1 = filename1.open( "w" ) - except: print( "Cannot open file:", filename1 ); return - try: file2 = filename2.open( "w" ) - except: print( "Cannot open file:", filename2 ); return - - file1.write("{} response:\n".format(url1)) - json.dump(json1, file1, indent=2, sort_keys=True, default=vars) - file1.close - file2.write("{} response:\n".format(url2)) - json.dump(json2, file2, indent=2, sort_keys=True, default=vars) - file2.close() - print( "Compare blocks [{} : {}] break with error".format(f_block, l_block) ) - return False - - print( "Compare blocks [{} : {}] finished".format(f_block, l_block) ) - return True - - -if __name__ == "__main__": - main() diff --git a/hived/test_ah_get_ops_in_block.sh b/hived/test_ah_get_ops_in_block.sh deleted file mode 100755 index e2ce2d7c0fb617c735860dc3ddad9b4994fab772..0000000000000000000000000000000000000000 --- a/hived/test_ah_get_ops_in_block.sh +++ /dev/null @@ -1,150 +0,0 @@ -#!/bin/bash - -if [[ $# -lt 5 || $# -gt 7 ]] -then - echo Usage: jobs 1st_address 1st_port 2nd_address 2nd_port [last_block [first_block]] - echo if jobs == 0 script detect processor count and use it - echo if last_block not passed or 0 will be read from hived - echo if first_block not passed will be 0 - echo Example: 127.0.0.1 8090 ec2-34-235-166-184.compute-1.amazonaws.com 8090 - exit -1 -fi - -JOBS=$1 -NODE1=http://$2:$3 -NODE2=http://$4:$5 -FIRST_BLOCK=0 -LAST_BLOCK=0 - -if [ $# -eq 6 ] -then - LAST_BLOCK=$6 -fi - -if [ $# -eq 7 ] -then - FIRST_BLOCK=$7 -fi - -if [ $JOBS -eq 0 ] -then - $JOBS=$(nproc -all) -fi - -if [ $LAST_BLOCK -eq 0 ] -then - for tries in {1..10} - do - LAST_BLOCK=$(curl -s --data '{ "jsonrpc": "2.0", "id": 0, "method": "database_api.get_dynamic_global_properties", "params": {} }' $NODE1\ - | python -c \ - 'import sys, json;\ - print(json.load(sys.stdin)["result"]["head_block_number"])') - if [[ $? -eq 0 && $LAST_BLOCK != "" ]]; then - break - fi - done - [[ $? -ne 0 || $LAST_BLOCK == "" ]] && echo FATAL: database_api.get_dynamic_global_properties on $NODE1 failed && exit -1 - - for tries in {1..10} - do - LAST_BLOCK2=$(curl -s --data '{ "jsonrpc": "2.0", "id": 0, "method": "database_api.get_dynamic_global_properties", "params": {} }' $NODE2\ - | python -c \ - 'import sys, json;\ - print(json.load(sys.stdin)["result"]["head_block_number"])') - if [[ $? -eq 0 && $LAST_BLOCK != "" ]]; then - break - fi - done - [[ $? -ne 0 || $LAST_BLOCK2 == "" ]] && echo FATAL: database_api.get_dynamic_global_properties on $NODE2 failed && exit -1 - - if [ $LAST_BLOCK -ne $LAST_BLOCK2 ] - then - echo FATAL: $NODE1 head_block_number $LAST_BLOCK is different than $NODE2 head_block_number $LAST_BLOCK2 - exit -1 - fi -fi - -# node block -get_ops_in_block () -{ -local NODE=$1 -local BLOCK=$2 -local JSON="" - -for tries in {1..10}; do - JSON=$(curl -s --data "{ \"jsonrpc\": \"2.0\", \"id\": \"$BLOCK\", \"method\": \"account_history_api.get_ops_in_block\", \"params\": { \"block_num\": \"$BLOCK\", \"only_virtual\": false } }" $NODE) - - if [[ $? -eq 0 && $JSON != "" ]]; then - JSON=$(echo $JSON \ - | python -c \ - 'import sys, json; \ - response=json.load(sys.stdin); \ - result=response["result"]; \ - print(json.dumps(result, sort_keys=True, indent=2))') - if [[ $? -eq 0 && $JSON != "" ]]; then - break - fi - fi -done - -echo $JSON -} # get_ops_in_block () - -# args: first_block last_block output -test_blocks () -{ -local BLOCK=$1 -local OUTPUT=$3 -local JSON1="" -local JSON2="" - -echo Blocks range: [ $1 : $2 ] >$OUTPUT -echo >>$OUTPUT - -while [ $BLOCK -le $2 ] -do - echo Comparing block number $BLOCK - - JSON1=$(get_ops_in_block $NODE1 $BLOCK &) - - JSON2=$(get_ops_in_block $NODE2 $BLOCK &) - - wait - - [[ $JSON1 == "" ]] && echo ERROR: Failed to get block $BLOCK from node $NODE1 >>$OUTPUT && exit -1 - [[ $JSON2 == "" ]] && echo ERROR: Failed to get block $BLOCK from node $NODE2 >>$OUTPUT && exit -1 - - if [[ "$JSON1" != "$JSON2" ]] - then - echo ERROR: Comparison failed at block $BLOCK >>$OUTPUT - echo $NODE1 response: >>$OUTPUT - echo "$JSON1" >>$OUTPUT - echo $NODE2 response: >>$OUTPUT - echo "$JSON2" >>$OUTPUT - return - fi - - ((BLOCK++)) -done - -echo SUCCESS! >>$OUTPUT -} # test_blocks () - -if [ $JOBS -gt 1 ] -then - BLOCKS=$(($LAST_BLOCK-$FIRST_BLOCK+1)) - BLOCKS_PER_JOB=$(($BLOCKS/$JOBS)) - - for ((JOB=1;JOB<JOBS;++JOB)) - do - test_blocks $FIRST_BLOCK $(($FIRST_BLOCK+$BLOCKS_PER_JOB-1)) "get_ops_in_block$JOB.log" & - FIRST_BLOCK=$(($FIRST_BLOCK+$BLOCKS_PER_JOB)) - done - OUTPUT="get_ops_in_block$JOBS.log" -else - OUTPUT=get_ops_in_block.log -fi - -test_blocks $FIRST_BLOCK $LAST_BLOCK $OUTPUT - -wait diff --git a/hived/test_ah_get_transaction.py b/hived/test_ah_get_transaction.py deleted file mode 100755 index 313a2282629da2cb578ed11dea9efaec774826e4..0000000000000000000000000000000000000000 --- a/hived/test_ah_get_transaction.py +++ /dev/null @@ -1,171 +0,0 @@ -#!/usr/bin/env python3 -""" - Usage: __name__ jobs url1 url2 [working_dir [accounts_file]] - Example: script_name 4 http://127.0.0.1:8090 http://127.0.0.1:8091 [get_account_history [accounts]] - set jobs to 0 if you want use all processors - url1 is reference url for list_accounts -""" -import sys -import json -import os -from argparse import ArgumentParser -from concurrent.futures import ThreadPoolExecutor -from concurrent.futures import ProcessPoolExecutor -from concurrent.futures import Future -from concurrent.futures import wait -from jsonsocket import JSONSocket -from jsonsocket import universal_call as hived_call -from list_account import list_accounts -from pathlib import Path -import deepdiff - - -wdir = Path() -errors = 0 - - -def future_end_cb(future): - global errors - if future.result() == False: - errors += 1 - - -def main(): - global wdir - global errors - - arg_engine = ArgumentParser() - arg_engine.add_argument('--ref', dest='ref_node', type=str, help='address to reference node (ex. http://127.0.0.1:8091)') - arg_engine.add_argument('--test', dest='test_node', type=str, help='address to tested node (ex. http://127.0.0.1:8095)') - arg_engine.add_argument('-f', dest='in_file', type=str, help='path to file with transaction hashes') - arg_engine.add_argument('-j', dest='jobs', type=int, default=4, help='amount of threads to use') - arg_engine.add_argument('-d', dest='wdir', type=str, default='workdir', help='path where output should be kept (ex. /path/to/workdir)') - args = arg_engine.parse_args(list(sys.argv[1:])) - - jobs = args.jobs - url1 = args.ref_node - url2 = args.test_node - wdir = Path(args.wdir) - trx_file = args.in_file - - - if trx_file != "": - try: - with open(trx_file, "rt") as file: - hashes = file.readlines() - except: - exit("Cannot open file: " + trx_file) - - length = len(hashes) - - if length == 0: - exit("There are no any transaction!") - - create_wdir() - - print( str(length) + " hashes" ) - - if jobs > length: - jobs = length - - print( "setup:" ) - print( " jobs: {}".format(jobs) ) - print( " url1: {}".format(url1) ) - print( " url2: {}".format(url2) ) - print( " wdir: {}".format(wdir) ) - print( " trx hash file: {}".format(trx_file) ) - - if jobs > 1: - first = 0 - last = length - accounts_per_job = length // jobs - - with ProcessPoolExecutor(max_workers=jobs) as executor: - for i in range(jobs-1): - future = executor.submit(compare_results, url1, url2, hashes[first : first+accounts_per_job]) - future.add_done_callback(future_end_cb) - first = first + accounts_per_job - future = executor.submit(compare_results, url1, url2, hashes[first : last]) - future.add_done_callback(future_end_cb) - else: - errors = (compare_results(url1, url2, hashes) == False) - - exit( errors ) - - -def create_wdir(): - global wdir - - if wdir.exists(): - if wdir.is_file(): - os.remove(wdir) - - if wdir.exists() == False: - wdir.mkdir(parents=True) - - -def compare_results(url1, url2, transactions, max_tries=10, timeout=0.1): - success = True - print("Compare transactions: [{}..{}]".format(transactions[0], transactions[-1])) - - for trx in transactions: - if get_tramsacton(url1, url2, trx, max_tries, timeout) == False: - success = False; break - - print("Compare transactions: [{}..{}] {}".format(transactions[0], transactions[-1], "finished" if success else "break with error" )) - return success - - -def get_tramsacton(url1, url2, trx : str, max_tries=10, timeout=0.1): - global wdir - HARD_LIMIT = 1000 - - if True: - request = { - "jsonrpc": "2.0", - "id": 0, - "method": "account_history_api.get_transaction", - "params": { "id": trx.strip(), "include_reversible": True } - } - - with ThreadPoolExecutor(max_workers=2) as executor: - future1 = executor.submit(hived_call, url1, data=request, max_tries=max_tries, timeout=timeout) - future2 = executor.submit(hived_call, url2, data=request, max_tries=max_tries, timeout=timeout) - - status1, json1 = future1.result() - status2, json2 = future2.result() - - json1 = json.loads(json1) - json2 = json.loads(json2) - - if status1 == False or status2 == False or json1 != json2: - print("Comparison failed for trx: {};".format(trx)) - - filename1 = wdir / (trx.strip() + "_ref.json") - filename2 = wdir / (trx.strip() + "_tested.json") - filename3 = wdir / (trx.strip() + "_diff.json") - try: file1 = filename1.open("w") - except: print("Cannot open file:", filename1); return False - try: file2 = filename2.open("w") - except: print("Cannot open file:", filename2); return False - try: file3 = filename3.open("w") - except: print("Cannot open file:", filename3); return False - - file1.write("{} response:\n".format(url1)) - json.dump(json1, file1, indent=2, sort_keys=True, default=vars) - file1.close() - file2.write("{} response:\n".format(url2)) - json.dump(json2, file2, indent=2, sort_keys=True, default=vars) - file2.close() - - file3.write("Differences:\n") - json_diff = deepdiff.DeepDiff(json1, json2) - json.dump(json_diff, file3, indent=2, sort_keys=True, default=vars) - file3.close() - return False - - return True - - -if __name__ == "__main__": - main()