diff --git a/scripts/benchmark.py b/scripts/benchmark.py new file mode 100644 index 00000000..592b7e00 --- /dev/null +++ b/scripts/benchmark.py @@ -0,0 +1,103 @@ +import secrets +from time import time + +from py_ecc.optimized_bls12_381 import ( + field_modulus as q, + G1, + G2, + add, + multiply, + pairing as _pairing, +) +from py_ecc import bls +from constants import ( + data_path, + msg, + domain, + P_G1, + P_G2, + Q_G1, + Q_G2, +) +import json +from eth_utils import ( + is_hex, + decode_hex, +) +import timeit + + +def _is_hex(value): + return isinstance(value, str) and is_hex(value) + + +def convert(value): + if isinstance(value, list) and _is_hex(value[0]): + return [decode_hex(v) for v in value] + elif _is_hex(value): + return decode_hex(value) + else: + return value + + +with open(data_path) as f: + d = {k: convert(v) for k, v in json.load(f).items()} + +pubkeys = d["pubkeys"] +sigs = d["sigs"] +agg_sigs = d["agg_sigs"] +agg_keys = d["agg_keys"] + + +def bench(func, seconds=2, repeat=3): + stmt = "{0}()".format(func.__name__) + setup = "from __main__ import {0}".format(func.__name__) + timer = timeit.Timer(stmt, setup=setup) + for _ in range(repeat): + total_time = 0 + count = 0 + while total_time < seconds: + total_time += timer.timeit(1) + count += 1 + yield total_time / count, count + + +def report(func): + results = "\t".join( + "{0}\tsecs / {1}\ttimes".format(seconds, count) + for seconds, count in bench(func) + ) + print(func.__name__, "\t", results) + + +def adding_G1(): + return add(P_G1, Q_G1) + + +def adding_G2(): + return add(P_G2, Q_G2) + + +def pairing(): + return _pairing(P_G2, Q_G1, final_exponentiate=False) + + +def aggregate_keys(): + return bls.aggregate_pubkeys(pubkeys) + + +def aggregate_sigs(): + return bls.aggregate_signatures(sigs) + + +def bls_verify(): + return bls.verify(msg, agg_keys, agg_sigs, domain) + + +if __name__ == '__main__': + report(adding_G1) + report(adding_G2) + report(pairing) + report(aggregate_keys) + report(aggregate_sigs) + report(bls_verify) diff --git a/scripts/constants.py b/scripts/constants.py new file mode 100644 index 00000000..2950eeff --- /dev/null +++ b/scripts/constants.py @@ -0,0 +1,25 @@ +from pathlib import Path +import os +from py_ecc.optimized_bls12_381 import ( + curve_order as r, + G1, + G2, + add, + multiply, + pairing, +) + + +data_path = Path(os.path.dirname(__file__)) / "fixtures" / "data.json" + + +N_VALIDATORS = 100 +privkeys = [pow(2, i, r) for i in range(N_VALIDATORS)] + +msg = b'\xab'*32 +domain = 5566 +P_G1 = multiply(G1, 100) +Q_G1 = multiply(G1, 5566) + +P_G2 = multiply(G2, 100) +Q_G2 = multiply(G2, 5566) diff --git a/scripts/fixtures/data.json b/scripts/fixtures/data.json new file mode 100644 index 00000000..ac6506be --- /dev/null +++ b/scripts/fixtures/data.json @@ -0,0 +1,208 @@ +{ + "pubkeys": [ + "0x97f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb", + "0xa572cbea904d67468808c8eb50a9450c9721db309128012543902d0ac358a62ae28f75bb8f1c7c42c39a8c5529bf0f4e", + "0xac9b60d5afcbd5663a8a44b7c5a02f19e9a77ab0a35bd65809bb5c67ec582c897feb04decc694b13e08587f3ff9b5b60", + "0xa85ae765588126f5e860d019c0e26235f567a9c0c0b2d8ff30f3e8d436b1082596e5e7462d20f5be3764fd473e57f9cf", + "0xa73eb991aa22cdb794da6fcde55a427f0a4df5a4a70de23a988b5e5fc8c4d844f66d990273267a54dd21579b7ba6a086", + "0xa72841987e4f219d54f2b6a9eac5fe6e78704644753c3579e776a3691bc123743f8c63770ed0f72a71e9e964dbf58f43", + "0x911bb496153aa457e3302ea8e74427962c6eb57e97096f65cafe45a238f739b86d4b790debd5c7359f18f3642d7d774c", + "0x8b737f47d5b2794819b5dc01236895e684f1406f8b9f0d9aa06b5fb36dba6c185efec755b77d9424d09b848468127559", + "0x8025cdadf2afc5906b2602574a799f4089d90f36d73f94c1cf317cfc1a207c57f232bca6057924dd34cff5bde87f1930", + "0xa9843dc6497bb8028cdbaea5c085b8e8c28bb5182ce691fa9ab5303b6792b2f5af0fc8fe52abb92c07ad5f4cf586c400", + "0xae0031515253249cc68e8ff6381c85231781f9ba5c251f8d663d634b461bc6a35ecccd2938704d36cfd7eb7bcf843b82", + "0xadec245e630cdf805c86f14258ca0e24c8016ec11defb065d70ad9a8c6dee38b26b2499a5cf1931ec65a2640ecd8424b", + "0x956f2f510d8e6acf438600f0bbbf8b6c96e31183abadab8adb864d76dfb209bd3cedad07d188bc53ebcaef76eeb368b1", + "0x9664301dfcb940539b336e6b21c156cda3c8a63847727d37491a892db7f4f2bb9fc9730163254e8bd028b730c8b39309", + "0xa5b360b364f081836261542b2b89effd6a596ec8b34fd330a80446d64329bcc8c74bce9db9b5c6adcad5f70e3b631bb0", + "0xa5680dcfa6fe6f7878132df80664232f847e03748b6383a3255c019c45bc9299835562b0b288fa1282c267a94a6daf00", + "0x8494bff563fd1259a04b868f64e0472e2d1f48ff0a02a3142effe17df01f8611146e1218235837868b42963637a4e769", + "0x96fd045abfda74406e9626cb18b8dac331d2ac3b37d8429e16a2f08415e128be210ff16c47c8958043a9812cd78159d9", + "0xb5f5e6bb054d785fab30756d542e9cd9461b286fc75f09c6368b577f9e3b486d4d1b11fe4c60b3ec838421276b78e55a", + "0x8b3ba6ccb6ce819329a40ed6c804622423dff836f618a364f1b6abfafcf979014cc628c795a65f777ef73de1b60bb9eb", + "0xa06ed227d708d67e14dfb5062211b1ee95fd7af61989297e08bc0eb1a9b3c5a9eca256f181b59d09c86746acea06d5e0", + "0x8cfaed1a56f5709324661a8e98718ae1b1a556839d622d473852283887e44aa197c75787d67ec2d1e6ff06a88e4087e4", + "0x90acb49b847d2dc727499c14d667efc7788bfaf12736b80df4ae28c505037e7acf22936964a7a5e75b78d6fdaff196fa", + "0xa468bd3b3c8e5d281ee78ee82a79fe8a92fa29161a52e9fab6f89d5b504d79bf0a1839262c3ecdef123830a8ac31bb03", + "0xb4d042a6a4098d9e08bc71ef6be948b6281f0f5a0f827924d367a97dedfd7ad900041dc0dbf45c97908a6b7e7b8de2c1", + "0xaae77052de5f10b669565187ea3c65ffb21ffb71268b11d1e27ec0e8ded8dee8de2a8316a91d4004d31126bd7e09e0b8", + "0xb2f3447ee96702a908269eb79948537c86a1d1e425c191a012c5a869ea7aa5d7ef90bea26111d265c8623017b8cb3359", + "0x96f370cbd771a847ff9d37d000037d18dda7d113649036a403842c09e610606ac04217ad651c66edb3e66a8d65e66ad2", + "0xacc9e9dc5d1498c1a5cf2fa977298bb04b16d1ffe38f9ed7ca076fd55bd5bb2a2dbdc21d03640763a90ca66ced3a29aa", + "0x8be35cd7d9d7081147eace4ea3a41609f65fcad2677dbe659a2b2f7673cb9b986531817c314b0d9d1f93a5ee7c176b1e", + "0x838e6999e280483328b0893b74ac34268ed6d4c1c291cd6212f155cf959ffe96f4ed1c7dbec093125c5ff60cad253ab3", + "0x81598ae491efa7dc792da276f90c055dbfe54684e0718ed34f829bbf62966fdc177464c3611c81c5c912261d2f70814f", + "0x9962157960a16461b89c06aaf91d0e0817a650dfff74f041fe9100288769489e6cefe0aa501f2f165a53e5e5ba986f18", + "0x93595a99565efdf519dfacfb0682654a2652a53756db3ecf213cf28faaafd96bdf48450667690c48b9cc9a7ff08314e0", + "0x81cf17ed4079b9c601accec23f87414cee32baf86edfb8050fb8d980d0cd346767190f8735cde6be587c0cae6de25f29", + "0xaba9f2f9f74bf3cf053a18c2b4f1ac5a3cdf23ae9e45901a30385b765e1ed2ecd1e41edf89de5bc9fee777fec3b49971", + "0x8ed3dd2dc68b43a35ce6900eeda5382ce9dd71fd821a6375739ee07de8d3674d8e263c760986396822f4d9f14043c3fe", + "0xb68dd494a35bb87cb047d87e72ad575de648a6cf7b556774e5a6d555222f3233d8e659970a49ea4f47494bc2aa317442", + "0xaa46d7ad828715f4b0cf1569d2e2e6c2295bf6cd9d0be41c12216f94fa3b15892f31378e71d83ca5c4d0bdf5d499d00a", + "0xa6de4853510dcb06a0a090f60144367a52ef3a03c3ee8e85c7d44a57e0126fe039d573e5362f1cdaa321f864411e75a4", + "0xa221d4f8f33b4536d420f431408c99a9bb892d7dc6828f0d4480d057180aa5efa5a16cf0df6e42aa91ed749ba477afe9", + "0xab9eaa1569897ed7b0e8b5101eee59a151d6831539bdc6c5ee963172e6eca0128a85f3bfe2ead63c6d82b5e18ab1ba6c", + "0x9721a05bf7b4ecf2b0b0c3941397c6348966878ef958b493a1385824853fb2666b93cec4a12a218795c9a772e61b8f67", + "0xa7ee041a89f349b421fdb832dee4bc0f2661772a6cc38ef53bfbe2dcd677346863372e07187567bc576218436876f22d", + "0xb3dc7f6e963aa8daf98e8703602ed700b895f508e73f4b2ea50ae2763a6f2ceec5e3032408a4dcf303b46b9c94360a5c", + "0x94e973c8410ccc315cbcd5b8bed877e4955b17a0c189654133e27756443d975a3166286c109b6a5d89787a147b678e69", + "0x917576dfa3b891d906ef5638dd66b50471ce5363822f226a35a9e3d5f902155878936d9b7715f759b18a2029869c1d86", + "0xaffcaba212211b41ed2ad32300efeedc6bf8d6d5c0c5383331d75ff3b1ad8aab1805594080cd6d810a94eeb67ef06ced", + "0xb561ec5922f56b65ef63ba2cac01e47e82add1c909c73884f7e53379fa30ae35b8b2ea37cccf7bafd70949502ba5b01a", + "0xb40cbab1fd9f832fb86f29b214fc0269edc59460498070490322158b036ee68931e84ba305851a6d8d2a0816cb3e2bf8", + "0xafdead70d2396d5177a3666ac80b689403ebbc5e6d9d5bcfb3aa3b8310ffb2c0e7cedccf096550d9adbd55edf681974b", + "0x8eb5cb28d05c4dcea36b047a94c7542bc1043cb36bc5a3c5e8e158b3aed441c723061a256bc5a51c32b1f4d75b50440a", + "0x907a37bbaa0404791a7e35df9d88a491d096004461ae82c452d2c03a866ffd62c14ff2d66e5bda245126fd1124205ba9", + "0xa889073f601c573e596d10e203c01f793c1ea39406f9d6014ac4c5931ee19a467ada74562b787bfed5989bbf9290ac05", + "0x80fcf75be569eb58bce7eb94a35cbf12034804690f9b33bf148b81e0821665b23be368b295dcc6060d74efbf6baf37b7", + "0x895f0488bdd058df7c788f696d45545a50849f52c8fd50f1a1f75181d797a9adb3ebefcc12af83b66066470e90294fc6", + "0xb61214722a3d06e81515a445e3c786e750fe377b73cd7bb6923d3a62c2ad7baf47314c9bae1f31697c2d7e2b7630b623", + "0xb74a7c292b4484751f728c8d7f911e6cd0b78cff289923dafb9021a9334f0c79637ec5be115ea24717c88952f95c3a50", + "0x86e04697941a53043321ea118cebb78dc3fae7b456d609df68e529fb1ee55d1b5ae0c95c8e2f77ad6ee7595f442030c5", + "0xb0f5682dcae083882c8900dacae5ad172e80c7f05e35aab48a3fa6660ef01ab690fc935fe38b2660ba36796b7baa6122", + "0x8006ac05e8bd66612470da61255f08cc4cdee7c67ebf32c1581dfd77f8e931eb79265d6842dcc76a590c82383689dd2d", + "0xb645776da9577a5bba177eef60ee791566fd068e970af7c22a655a2dab656130fd90b088016d39bc8c2db8d6792254ab", + "0xb05b98b8ef7abeb852809b9b63efc22aaf0e3d042071cd003d0f9921962ffd26ed38cf6a4c7e3f9d3643544cb49b37fc", + "0xb2eeac34480fac83a32dfc044cbfdc9c40a99d20083ee918ea5a569674c3013437fb5cfa6aa76f3afa8c64af01da0d18", + "0x814857e17b2a0eaa5aa6e4f7fc894c8437bd537efb294e79fd253ec4d3fbe3b3d10f142e687325506111f54e8c78162c", + "0x9039996cd20e7c643c50fbf8018593c506a2d8eea53c7283a81cd7349f9a8688515e717f2de7d8e4940feece69be4b38", + "0xa12abe96060ffb93e5fe6dc2cda1c311e142ab8e0813364c90cfa679d62607b90afa3e4a241ee93431d8d650802c7675", + "0xae8bd19bc84b4ea9acb9b657d7e45932da268c70c4b34fda06f6259040923133e453fbbb0ce01f59b3d0b899c46065bc", + "0x8f914bf119a21c0876dc6b8f915a624f6f57695f7d40ef54a909d2c52a8c2a3be149812577ba93d401a862e3874f1562", + "0xae2e8553e79cbfa501bf7b02e412fd06466695d36aced47666220da549aa217c0bb0c8deed16c4698faa6fc320d418c8", + "0x8170bcf105a2c95ade043ed57a49fec99f20b610aec00d3db9e0912ba0965773a275d9102cb40c6757fe7ef9cc7ad6f9", + "0x913518a56ed2bc43d8673d10e3aa9975f1d5a589b04d183f965a736ba5d1d0cd30a1a120673917f8969d906fa8042a5b", + "0x860aa1307100d28a9c44cc5144f04a3ee426074a0864fc6e1c2b3f4bb7a8579e7473612dcf4357bd59d6560f96d34480", + "0xacd6aadaa1d0c97319755de1a1f51c338614e44dddc6ae7a4ed73767c669604eae8c69c568f188040a4f13e758ddfd23", + "0x94608153254e937e7a487258b28873d791947fa757e5e7dd5695f082e89e342285bd8e16081962ea1d8bf9c52fc11785", + "0x8c1d556949b6be9dbbdd340be745822ea63a2cf0fc8cdd98852153119f436f395d275258af238c5ff90664caa219068d", + "0x9395c50a8bbf4b92c185cbd4893691716aacb5ccb04ba2365562265519946e40f8f9f85c610e2dcef27bb3bb7ca6e58e", + "0xab00e0ef0a8671dc4ca5405f2e1148c3f6d0b2ec05d4ca259ea0be447d7294dd7c428323d1e8c35de8aa14300aa93128", + "0x8e896c950980f95f27e07382407b3e2e80777d84ff39607f415fbdfd38fca2b6283bf6ac439402b7406b9f3bcc03a157", + "0x9201be6baf9bb80fbfa7ebc2981dc2cd9254a59fc4e0a6543d5ae49987898b7469a3c82edd612dde54ce20d57c22c40f", + "0x8916ab4162e0ec64e23818635cc051ac4dfbc33094f054553290ed9af2f42de1fc5c95b11de952152f7a7063e82fe42f", + "0xa388fac3702958236d888a1a3ecdd9d431e865a1b2ca3a742d720a706c7c8ec52430e0b915c2e81976d30d85396e6d53", + "0xb2a826652ab208b93fa6357a0d83cfd834864b99dd3fac1831ef16d17ebb85381b881604521012fbb8e147f372350444", + "0x8a5154ec390033ec78cc79584004dede9ff49b4e41197d6445441d7f31d2236f3939fda0e0373285ec1ac641252f941d", + "0xa9cfce6adeff4cc6bca9b8dd690d85de27ebe12eed2fdb484ac1c781894f63147fcec4bfacc8b1c9d8be60b1e3915623", + "0x957fcaab055e2d13398b11eb4fd83ebf4de0f1b89d0e549df3856ef4c3cf9c89ae0965c17a49465ed8004627607e6cc4", + "0xa1ab48b49df0dd884bbc57052e787d7dd05346eb153e067f4dd9baa1e18d93133a5431301da13c241e37ee5fab6909c7", + "0x8263d488e99ea018733ce1012e7b8c15278bcbeb0a77696ea4589c439874ac08811083b00441f08ee6ac5250d1655f54", + "0x8cfd73effdbf9105e5a679040466280f03c02da94368222a05d83fd756d4c2ae341b73039cfe60746cd384599b850214", + "0x8260a905558e367e64ee72fd5cd751b36582fab1e9545a1c8d5e01ff0c2e4ce4c5cb3d9bcc7ea6a9f95b8b275c58e9f0", + "0xa9276fcf28f2f0a898e10acf96010714a09db508a10fce3a598bc0a55a6ecc9244fde28df1dd12fa1c5f5b844c58beee", + "0xb04b41fb22534c6ef5130af51f7727e99c8a498e89db9795154a15853a2b46f21e6f5ffacdf60149bb791bd4ed813045", + "0xad576e25e30c0c6f3440d317b08cd765985a84dc5adc5544fb2f24210ffa5f8b3322edd66f3be0fd940d0d9d1a39333f", + "0x97ae568d5726ed1de5c9314f2a5c00623226c944b764782130b67bf59c4b0055fb052ad0736b5a9bb094608302df396d", + "0x8b637092659202ce77a3214f71da8dc030a97f9744a2537057696515d2a44da2d78b2c326a2624e9d5d9377d6db7a885", + "0xb0f170fd80f236e8dd9ed7795128ccd91c34a42d602b3284b3e562df995af4c46323a0568c72cdd98565396f4bb24b3c", + "0xb8cad0f66815b6d2bdac76a93e0b15aaa74b87f7b53967eb8efcfb714f326b149aa01b57b5d6b41daa4266a54baa3dae", + "0xabb3972fca3444ee8109ca8c4f5f370f596a2e1d9d2badaf7b643e6894cd11dcdeec8f9b3a46554fc27069bc45604aa2", + "0x83faed8abbc86fc218c3fec62c34ebe10d967fac6f441c082ff61d4656b548e2a09c474541c8dfbe8793ca3c2d406ef2", + "0xacc8c55b2e751fbf6dbe203192f8a0964234c197232ebde2aa27ab57f703545550e192376a58bb7d3d29fbd7f5c25673" + ], + "sigs": [ + "0xa3d7a4d1cdc4b258527d1a4444f9f55526caea4a490471b14e10c068cb2a00dfd91fa811a40b715fd1587d12bdfac20e06ea6ff4ca11fd6ff4354f727399aa80227b842653c76a8b4687f26a53d5cd9559413c4de666eba4198e6acefe69d26c", + "0xb039c9efb0e929479e7ad05807ced0fa6c910457dcc2f9bcfa4959408b141ebc2dd9f65d09550d08999d400ee871d2cb03c2b9569ed4af45dc63a04dffbca65f6dc5ceb386ee6d060b6509898bb0a8a0b83d84bd577d63070dbc30ce9f3d6333", + "0xb775cbe8aaad3ab0f4bc3c729402c5ba0b20b89196e4b742c440f90b8f370a94a5060c12e5f678087ca5a8371e40460b076b0ab2391335a7aa4419c79e30e9f641c05176bbda7a25333beecdac793e59c0470cafb6b7cace39dbcb16901c665f", + "0x8dc0bdb6e82211334126c4b87a3ca854746ffcc75f47f5439d547cf91f85fef488277b9c47b1d3fa23988e73750896d61415179ea0f5bd5a925241abd3bd20d380373172faca772797ff9726d9689d653438524cc3ad3cdd5e474c6a59b8ba90", + "0x8a5fe46216b6547273e9b21e66a0b72cbd32ff6646345d8a5a3a9dc440fa26570c4a1a170bffab04c838089cfdda956f0523967b225f89c9d258c1f737e4960d45cc0e9cd6ed7575a9c139835ae79f667d8cdd85339e81966741bef7884df361", + "0xa70a3e450fea84c2256b018887cc026c3ed5543016c63f22b171c0ba12a2ce2fa9bfa99cf3574a78434dd7cf73cd31a604dc0ee1c3782ca53481784b106dbaa5d05fc824e677e0c48b40aec348e29165d10a3fa65b5603f9a543005d7fff8339", + "0x889f97d3973bacd2cc020a29c6ca418fd4a0e24a7d39a4a50c6c6a6e10c655f293ee257bbf3803c2d72697efea5ea0f314b8d70b71ffca80b339478578b3f9a305558a567e401d42d62c027886bafb385b5d898e42030b984fb3c781f1ec4994", + "0x93f64658893da0b1526484180c8fafa91938aad43377aaf8cae31f97e6d62e95a9c24fae6c9916901fc9d254d827ce1902a3dd4427801273eb348097d6558de1f27c048714c400f5f65a3fd5338d9f3e5351afcfc657116f66b1db53162a9ef4", + "0x8502f77c5f757c501cff8f77a9d2dce891ee3b0da85b50b0064966202295e51ff23a30a6cc41c8ce70b7e8561881499715e655c1640494d3d0a4125b3d311c65a9eb34192e63eb977bf1e051621e396d447a21b9d8b8f67a2737c03f4b49f3a9", + "0xb5e087b4c70fb0bea9ec426bb63be66f978ed99eeb25648e2c08ea0d7559e3df0aeb43249e8f38522e18e969dc81a7750f74dcf30ab8ca58202c174e1a68e05f78e9d8cea9ff494ed2ef9b21e42a301bd588a16d03c7b8e02d37e48defe9e4e9", + "0x99fb3986581b393fe9746aebf95855f9923928a283d5c2c80631958d8ce07bf9f39ab18b951d792f67c869e15aab2eed152cd529a99666d52e273fa9e90023cea15d533bead009e305b2430afabf96966953c82e8b479180ccdfa78fda495ab6", + "0x82ca1abf61270f66e27b8a8c928ab3c307f41a83bf32262164fc8bda57257bc7f9af6d371f2b52f20a29a6eedfb7ab8807742379d42eca935ee38c5f3a6838b295f31e7bb1e4ce10b29927227238d27ef7906b96813fbc971b7638e41c6671ef", + "0x997ffcf34c8bb39ad5d857786158d1510d3d1a322cc3ee99af7f2f6dec8f5079e9ca32dbe550257137fd36a456b28d29005aa9f2915946e61532154e67d1d32d9748147254fa14c16df9f2364fb59c2948f985d24c0515ff743335390337ce56", + "0xa9bad4ba43332489026646a6c402dee11a8a8a727dfab289749f1bedfd8ca80a93ce5f14ff054a74e06ec84bd3b6ae07003bc5b990260781e312489b5d38847de50ffc547d912aca1ac5d4447c95378ce43a80898b798a25ecde5320f597b8d4", + "0xa4786e7dde882ccd56e018098531e7c1f4a91161f2d837a694a86cee2f5eabf72557f6cd57d2da1de62281b36241c81907db12323c5ae9094b4f7d3277b30f2a7695d117f534092057987b352aa6d79934b652cfec38f22fd7c58073d1414f32", + "0x9404cc61283a139df3d36a32866067b09ce9f959738d0e0b12ec0071c72655b10b230b087900f4e3495958ee8fa2ca4f058ff19bd45ba0561fec64fa92682a8ce6c04b4a49f4de5a54d19c46ebf19cf1629fe7e8425980a5111e696a76ef1f71", + "0x949e0e1fba55cb9dd8c9ba74676b96248f17915e80d7cb809b76daab54c4e376e6871ab428fea03657b6b4e76c33b1030f1cf1f8eea2088210399d615db8178e0f7a587f489704bf0e2fd1e87c143e6a49a4c084781545e2ca9e049cc64f9663", + "0xabe627f1f6cf6b7f17f58d68c8475d50602a364ad7eac1de57384798543a10c58ffa45937d30cf73d495d94c9acc381612d4b26e7d9a5595960958cc4cb2ee7df31768014052913effd46a6c6d3a70db55de0820f078447f10afada49feef116", + "0x988d243e0a41ed4dcd21f7da9bf044bc8cec638b4e1e2bf2fcf1963082fa5020c2ad6ce395e757ac6eb7b39fdcae12df14cc6ffdfac63e40c5ac798a88211e3963295e335c57d42608884b71fb2af3e923d7a0156f9e37c6295090f3aafd32b9", + "0x98fef656f534220164902ac367b3f3a27d822297f73958f96a4a2cf8c5376098b1873f441be0500c593b81126b025d8f002621c0e36a9fb7c85749db810eb0ddaf12ec8c2f618588fe05a400e1a1d46b32d1565779cf4609a6ff7b28fd3dfce1", + "0x8b48140114bf074b7141454e64dd19a3e98c723e83ac6f0069dd391f8e4e2cd7160a80493da6257a25f0c753519db77509b30a80211eb696ea1ac65f54520ef416e4bdadd05618c56213a4d76836da675d252044032b587d1b4127232369ffa5", + "0xa27d89711c43c963241f9c0f7c15ab280e00ef41e9906127badfb4ab77250ec180fb9ed98bbc0c6fdc9924f54afcb28312f601717a3ed8f9537cbb80c3c8bb79bd6b1552599858720fff82e72d11d2762ef0b769d9b798d81236fe5413045be6", + "0x85f7aa2be46d8202bfabdbd691a1d1c4706db3dfc7c1390e7bc7c1e2997f3b7d35df9945db1a39eb5c1ae9486041ea6911c938ebcc45c1eeb1edfe0f7c63d8923d756fc1e4a12b59773366e6f9f37a9b154d131f35a738ef511b808f4301a576", + "0x850422d1c03d62598ed5d0c1098647b37879e4a5cde1a1fd9aec375a06261bbf0b98d54264809260ebc00defc051375f0d68369a74c24c56a34dd03263d643a94c7eecd04920ae4dd12eb28ab6020ecc022a87ac12941589561ea4ed73adcb3b", + "0xb56619203fae2767e3af29c0ebb679dbcde1d3caf770609d907d6f58d6db153dc34eb6d8a2287302af662adb749c2eb7198d85a048da7a606a7359d10f1423a861bcf2c004e5effec8456a8ac90a8f4bd3a7ca449918c78d562be33908bdabd9", + "0xa624dc4f52ab15a450a4e7549fbf7a0a211b478631167981c8c45d5331bcf7d32e8daa7b37f138e1747e4cf4466c2c0d0d114c8fabd0c3a7b26b4328bfb4470874f68d5fd8055227fcdb2536286a94e9d2b728861256df9d10b3920edd3fdb66", + "0x92db1185bbbeb5dbca647b85942b3ee9034aa2d117f51246c6e822e70085602b5bfa9a0891e57bd89d191067905974b8145b8ccbda616f9d207134687ec432f6dbac8e8ec03ff97d07e9559e0ec7fb0b813cc7b1286c038c634bc22619aa5fd5", + "0xa96ad58b0682b47f516cbf9d5a7a26bf09d1b6eb1328a48eba2105e1cbb4a950ec99f75e7c483d83ad704e3e78760a94020e585830a3f6744e708708db99e7f290c5bef280678975a4feba98854a3fbda03f07672fa819a3a72fedf9faed6c39", + "0xa614e2d148986aec93df9db0691293fbfb794b974b1362064b6adbf6900fe4def2c3bed0f5be0fcb63cc93879011cbe602cf2b32df5532256c9332c66fe329b3d182b6975c2e0d1ae454752c6be5aacbbcc903c1c46f960dfd1c2ec2e03adec1", + "0xb4503455b142066d7bbe54fa6413c43d899373e7f30f6b4ccc9a1fda292d6175d0b550009c07f86c165e9e88ee017d1605c2b24e979ff6cc90e929064e532d0f60f80eefe472727169b3120c996edf82d3c27a143687740a7ed0f9501750aaec", + "0x99b37fcf4e0df33ebdebd8ecf5524533a6130abb049be5cfcaa8e65ffe0e2c9096191aed89390272896f03f067375115015ec5e6f3697678aa7657d28d05f8b7d5ac4b32a0b6122589cfd9b25f052a3624c2c27bda6160547616fe95a6a1b380", + "0xab1572872feefb5b343d2e12f1ad3138b0e05236da2fd000f46dff33b5fbb31f50a7c225f06f2a0f70896ba952f6b7f8117cd67bd1103662b5d804d50477b7b059a37c8f657597ed3a9a76782b2c73ec2a2a55ae5b8cf6cad580f9d5b7d0672d", + "0xa52bb35767a8f64cd16ddc405ace8e7e16efd189bf1a1137edf596e39662abb207452449a521af41bee63f824e618c09100e7dbd0391276014730be738b22d8fb9ce0bac516d973403aa7f5bbf741f09e8f91845588ddf6fe8fc59dd4f34483e", + "0x8b6696533a539713df95869493931dcf1046ae9c70f1d1579e6bc332d5dbb991ae816dadc522e7a8b918e455c4971e970692b36dc98fd96cf40a64d0ad2a9f81e4512f10b3e40060d2a3ebd2ca748c8602ce78d7f0f34a25434bcc98366d9deb", + "0x81ad53333e69a23c0e19c49e846339c01ea062207e8821b9434b95cf9c5360b354261a94bb8a980ee79cfa221130996e13dc3d7b691b997d410d761dbfaf2f7a79ab3c04835c75229ce4ebcb629c4c120ec071b5893e45a12229139bb29b9631", + "0xb8e5d81411a00670513c939b19ca4b2f0228225f79b8c2d8116afc7d85897596e22e366d8d6db0abb24761c073e5a57509c6f0e0481388c24a4d67006bbefc9fbacc792a274a66ec03f4ced478c26a474aa38d87c5c0e6f6ca93c461308e087b", + "0x967817f9d49e5023aef6418a698e3d6e876e5f5b5dd6325cdd0a7895e16bb5482563c2b16db9aac0d417901e20c998a80c5ac46dcc1afd985d80becfa0d679075f7dcf96f4f35159d9d000d5f873041dc93f3806be67c8f70cf61dea256fbec7", + "0x8a90e4a276c55e5efadc15d7b5ebd7e2d0d33fe07fe8434b4d8987c7233c48aaa5d63cd2ebecaf7a9228a3e80e9439e711ca376c8e07f25f53c7aad29fff6871f9ef2baa7571609ae6260878cacd590869612657125e81a32a903589baaab880", + "0x85b86070c3d9234c483914033dc677736324516bfa500c89dee0cce80393ecbd126a0f0014d13820c8a8622c98691d56136d78a1b90da9bbc9d9e6cf419ed8c8c928bb0a2935aba6d40c77a87fdccbf5882dd4ce04a69eb4ebf9fd1b9f94683e", + "0xa6f8cc212d171a73d11b34bc5ef21f8380b6b7ffb6e467449e9d2a4875955ab5b63ebbc1460c6a51cc688544f7c4a04e0bb686cd9984c13e91c3a9bc179afcf4ef42401cb69587215bbddd810b4a7e825e01204c27b5aecdc85d9a23ff0f6209", + "0xa48c324d1d8e15817708d9f3f5827cf3fc57b313459ac8d5dc85003ce880ddf99b94bdd66bcbb7de1fe1aeb7cda9274b16962f12583d9d29c0f3191d211793bd3bfbde7c6044f861b8334035066dc70a8bfb84ac4caf2575dbfcd7bcecc97c32", + "0xaf80b49938f7faf36e15861a4b08473d4121eb1dec27bde35016387f337b65648c0df9e71d078e765db966a7536b063b07f4e386b7f6edef40047d4c6d6474bb96d7098899d46079abf5fc58c43fe2fc23ec3c11b234f813bba89b32abf77b1c", + "0xa098c5f95f0c7ab69c0b667998cdbc5fe27829dc609b87df474c1132e4e4308020c010cafc6ddfb9be43cbb8ada620f816644ac6932b69ad7f64655d164447437f66a6c509a09ffabb727f576426a9885599ed1eeec7e3c1b6579bafdbab09ca", + "0x99c356f901140fed8068f0e85901835da17f57c040e5b37b76f910bfcdbe674fa2fd838740cfce0faf72e8dda57b9d9500ecec4333972f938b1b231d726ac5af5819aaa0c4b928279339dbc12c650af334aa17bd57a8a9450a0eb56b1498da8d", + "0xa0165884bdf85e4b1bd48b6b9a126f1c59e96ec25c4a8673d6a16c4a7845eee9371ae5550703d057537c2f4742ff608318308dd849d8e1324afa47b83c42febfa91c7245501197bd796a158aeff1ac08f454983af4454026db91cebe0e7bb6d7", + "0xb8aa6b884e084ca19601402c95c6ef2bd4bdd46f8a8c9e52e774554567c3447e975d0cb2550f4ac059b867c1f22bff2b132098009e180fd708b03415b0d820307dc8ca6f2d92a0d2eed74cd341601fe83eb5deda6734507fb3423b2be1b26439", + "0xa41a3b53869f07f9e687caaf04c6baf616db3463577c1c1c5ec353cad49108d2d9c35fbe5dae1a71b6d37c9b395c6e13115f6a2d00aad6012a878ee99caf359663a17d0f1233aee7bd5d9c4b8c04abd6c71e00fbdf7deb3ca78becf9359b69d7", + "0x94548b1605b651d336f63dd65b6e87b43f8ad7c1c0ff473050405512a96c3ee259dca018375e15b0cfcc87481b4befa51924d57d5a4ba0f394ce44d7883e49d7ceafc323f908a3eec10bef2be4f3ae52d34c05922c2a13d170901d3ac6002efd", + "0x954e4a376904420a49009f3ad59155726cea3eff1da97de9709d5d601924d17a0a2df442afa861f2d1084cc913efe44318240621d70d4d03f24dc557ed0fb731bac4e5efb0e2fcbbc2c4d7003ad9cc045737bbb5ec7c11c4ac86a25ee3694a5b", + "0x87d4b8b2f5e07c4116ba4c6e9317105122111557a7af6b3fe7c72800c5abedf5ccd69b03210fde0a3e864c3136e835b50ffefc885f6801e93ab004743b16e4689af31745fcd0bff77b2ca629e209d88b2f7ded4e3efa617f35c35786aeeb5556", + "0x91648c2dbb36a218ad1af074d7180522473c628cea775c67a3d1acfd677e334840286b47435556f51b56b95e07c8d8ea03d7101cc1bbeb296df081f476808bc8278d23473eb46db679e8a16ec75d0de07ddeac0d0f947f2539ed58bf62aff8af", + "0x8e33116965971e068a22c57bfe538c32661b9befb07a07229ab615f642b9df5881876138b9115d8bdc4ca5cf194717b512b27c03efe91933cff2527192bd029998a487fed8aac9dd994ec65083ec00820f1ef1ff97175d4a48db49439610a0e1", + "0x830c88932496512388ae7a8414f3d7800224dbb7b81fc9936a957cae568c41ba742a31e7b442dd478fc096d6243816940f97a6bcfa086d1ba21044221c2002ae499fe2c31277587e71aa0a8a2504b531a2b8778ffe4e6faa0914c1c27d15e6ae", + "0xb9259b92a8292b6467901ab370665d5952a856adad235f492a798fc2917908da6372c62b63aade2d56f3107b2afaf79512f676d584bb80ecc7fa836266eca67ad82d6d9355b94339253621c8f509c09b606ce48bb286e7d3dea629d6bac6caa8", + "0x9614a5e9f0d60eec5b8d020c93e5ea8d445983567f1bfba515349797a4d501589a677b1f288576b6dc9c7e2614d5ffab07c1b9e15cda252ff6b8b11bf53326ded5cecdf1f6087eb03100409f5d75a3ee74a414f79f28d832dc64f60ec42e2fee", + "0xb48fabe033f721cee4bdff5fd1e9f9dffaa721259319f183ca8d78697db7f3b1ecbd6d5d5f24aa3d42c9c6749bbf32900529a5f9f2c1c7e085efb20a473b638d52d4581cf7b0cda7f0262b54e25b885dead4be58690e9c3b867a95dbc7c6869f", + "0x817f779dcd5569aa110fbaf9e8963ae849d8e548f8872d2b4b2d43c37261dcd512b9b481b9f7024f0f6e1d9451e7c5f9169c2c2048597fa5ad63e6a35bd69e39a76a654844ebb5782d5621576630f462ad9743d198de476c7fbca6bbe10b3283", + "0xb74f3a9d6d75273ca760e99549195f5c33cce712765d35ec67fd562faf70223e3fad4a6c6831da015ef19189b25adad611142b21512068a9a1d0946517575bef41b7c6a6e1f5fb61bd5c1e6e388a0f4513f2b86f0fbc025979000c5b6c271807", + "0x86e3e776bc8dff9779f1cafde4ba2bbd4da85e3b970080701a712d810a564d08f5536fba49999de8f576f6748c1759d10e7958e25152c0216e92628ce72400354b9d712b910c2a15d08cfbe13565f20b09b9d4614e5c368485ab7b09c3a818b6", + "0x8591865a724dd0d548469e98354d0d6fb09e7c820d565e2b9a3af28433cac17ed6279f95345f101052eebb8170bc8e2514aba7bb94daf49c648143327afe55ad8998beaeb95df062c53690348282505fd80626a36686907f0acfd0ef729b4cd0", + "0x84fcfb0e0d1569ce2e839d55ffdd2d11c33a8827fec60f05f81cf1d0ecde6a2e258e0fc979bcc90c2153c23a416ec5e30a0f445deb3719f0fa33f602ca7dbdcaa0baf81d2bd88636a3ccea243c0dc2a665e47277f67b8be334126492ed5f2203", + "0x91819a776c6181e6fd33f87a07cc8800ab9d8a8c873e0b2c4f510f8ca8638f15a64d308c1c61754fa90ffed9962d0d79111c754ce2c38ff7aabaa38a8a42dd6bcd5a6f739dbde2ab7d3674278362f7fe63af708412a9cdc9ce7e17aa00fe9332", + "0x874dc3fb5dd5d5af5847300ad807d01e87d5f7def473e05bda39cdb97107910bba8d3d7b1e954eb8e96b1246751da252121579fee2fcc4b135ae4f38acb0a04976e69e290ad712995fa7bd2d7067d8de9f8631204f2196380ff1807c6ebbcc90", + "0xa2a7c083404efa593d083754bdee537deceff3582f57bac18b01832986ff665fb6c5a42802b9c63c77704764feeace0d0a6a3b2549d8aca62f57d53da3c5b8dab3960c99691def3b6a01b51d212777254b11e671c025e9e937adf61e01156253", + "0xaa4d425833053e7bd4e91011400ec1a12f1f38f7ee9cb0e6220b5741af76d8fbf82470c72bb7630e928fac6bb74b7c8203792acf176d2fccddd6286a61cbffda368368081eeb8c41863a189c9f9490f36114e4a483b6f347ae9d9b6f16589cca", + "0x83d03426d6f417bc7163d49894592740e4c56145c1b7b5e26905fafb6acf6d3c1bcb4bd6c129ea1032b968804262761513e68c525976fcb59303bafe412ffbbcf0874b4a9960445b5be3135ec4be948915055c80f8b92be14aeb6b49b17aa2ab", + "0x8d88ac7d0fb9aa70d48b6c904952dad4f6327c56d9b6ede44c84acdf07718c9e016967946cb77c476076d09a3e06ec440118fa8738f7481c3f5c474502c2b85569f18353c4d277d66d1d2dbf058a9107160e82d835368b5cdc7a4ee6ec529076", + "0x8be625f77a7fe1445ebc5ea57a4ff75deeb6e4e6052a1a30ea1e64d1e2fd0d6f511e07f8ccade8dd279deb95cde05e8b13a3c0ec999cc2661b7db07e0d1ef61d88c87a49c444a011a90e25e217ab6f7e5d7db3d2211de8e0e76855eabb5e24ee", + "0xad9bb1d3f7e4b3e91fed2748abe460a212713e84504d9558601bb21f2bb23c285fb399180bc262426838fc45e7e4cca617ae601c1b4865dbacaf65b943dbd0677d8b36221796f2a6d902305f6c2657bc4ea3c802d80eb920d4daf661dec92e00", + "0xaa9de70f417aef054203d2a8862cbd63e9dd7ed93b340477983c9cc22a51184b455798e327b63f688809cf5b3560f68e11727017d3d3050b12cef4c85260c46293603c19ffb86a22dd1c7dd67df8f041a0f006ab2311b4c3172851f137733ad8", + "0x8038ba46df5a133b352a80c8c88ed390c5cfbb9ef610605cbeb79275baf1d77b5f76884ef758700b439d8778c989e2480e733bffd13a6b11dd6f8f706014de2b1404074aeb748cf4f0f7b10fb5fd32436597a8312d3c8a93bc39cb95c05c33b9", + "0x821e3319dd1491bc19ab88c941ec514271cdbfd408313fe7aa252d78d0cd8ba10992d5465b2e97a877125ca8af0b6ccb1747cf969b690118bf97e61b46ab06ccc4e74e841deab12ce9e58653b2f61085470a9d4f0fc1f8ee55843171fc2e946c", + "0x89e08e321e000ff1bea17093465b90536829cebee546392fb509c012df790d2b2cca85fb8bedce5d480bb86f439e556209443e33fbea92e9e03b70d34d99cbb7260c2e8fd8d3c9a82bbdb387539fbd96fa5b79e00e8150fb42ef3680260db4a7", + "0xa0cdd13e0ea283a20cc9acb86617dac5bf919c2b6692f89104bb521c0a2ac1539596e3c71eb29c5c5d2b9c09758005a50a6bc6b36f4612fbb798d830312222029b5d14a50a1e76af98f9965449afaa3bbb7ac1b2851f765606fd994b3a1ed4a9", + "0xb360e2995b41d1a517abdf69a2164c358dba90498e95902d08c61a0aa02472fbab59f9a4b0f63b09a84e8a6b823fc2c8088a0c0227dcea3e48a15258ad2b38c4d1b9307e08bad039f6e8c4c6804feaf8939da0268a44acc67b8225220e5b37c4", + "0x81703b663c191818698a3ba04a28cd819ac929e8291ad7f621126db480f0231f07a977f95f6ef218761b6e5a39815a150fc2b43e6ac41e3c6ff4ea8f9178a4e351489827ed5bb9a6952d6b13a4490c70295f4c031dd8bc862d0d67b2f00b1c7c", + "0x8511e9b1a9e84d799585b65e797ce0f20e1917c2a43af6fc1864cc323df34f7dc22e28be1c5d794353d5f44787483c1b16716c95c33aef8376b468bd7c5fae1efc14071776beff156960362cd4323280e8bb8af35ae62af083ae0ef33d8af1de", + "0xa8c75cbc07700c5b0f61e2b641b1d0bb6c27de9ff2ac0a13de94968981c99dbb50fc949a99131b013d06f35d6c575ecb18ecc18f8cb67b7b3f6400b879767fb03083d6ecc93fdb0118d0c96afbbb1d66bc0bbabe97390e957feeb3f9a43a48b6", + "0xaa5b7e1390dba902660585eb4d73dbbbbbcfc5a907742619028ddaed03434079f11325395ddd762f1c4ee4cad5841b26009f881604c691f0f59e768d55e4e323542a35b053614fdce8b22f1fdfe99dbd439bb9a6d9144aefc318c3c462445199", + "0xaeaa3b42b764b2d32a9e22cd033d5bd55459c8bf5e49fee7adca9ef419419bf8966597590b29bcfaff97c7d914addac612841d1b65ec0f71e36c48d9dc2bb490521bcf529567eb1f48362b7dbdfbb50eac259824dbc3e02d9a157ed1e475f8f0", + "0xae6cccb9b0f04425e49567ebd2575c7cbf0aa468a9f9d215498e84249347504fca089aeb027f8a64f9dc470b852d984207e5b3223791a4994c9fb910177a9bc256b811424f8a529803b1e75870a57067e703147588b19a8e2d0e5e95482cc9a2", + "0xb3dc07415fe72fa44fb937ff56ae2eee6bcf92ca9084a3268cc1f8ee5a6aec1490cde1a8f8e5984a2776f23730a710b201191fb92fa973b9ad1d2634d6b9c2688b1b26ef99e7a2364241b42c15d37e623f947327e0169291747a84b8206443d9", + "0x873bc1051d8f1b63fb78584c5dc9168f6b0a97fb87b299f286113232a866f13c2aea762835dd763d390c44226a1df78004d14e7f1fc62ec8fef372d35a5b71570e2d0c07159c3bddc6192d8ccb8c64798425ec9e0db4e990126b19b01c0b0b22", + "0xb06609f4af7e42d68cf9d33fc2df773f56ca81b9760a1423bfa536d65c654652a20a8885b5e023d5473e413cd0d0e9c40c33d4683da1fa612863e22100b9e461166c2a91d266ce349d6c284a89fa0ef2e778c92abb8041c4c4447af025760913", + "0xb8bfec6041b1a7c0b916fe9345a7ac0d8364356f2a701f11e17a55eb3a05b00b369d7dda2982c993e190b7851e3436d80517aa438789e295a1c5ea6c83262e6d68af878c6e61e06386353c387ededd0c33c4eafdb71b14868741462a461ffe77", + "0x925d27a577a20225f823c1763f378d6812848505011bb33a2b19d71f51a25ea965745316689c4e01890b486cae7420e510d5b36607e3f4b78b9d0b8b97fa5079d3cb476a5e034ff91f7200a5630a57224015917ee8358b1eee43d19636b27a70", + "0x8ddbc495fef00e735f7de5417c5ebf98815fa35291d14eddb25193e5be6142c6280345fc2895e6d310c14ce62bdb672509f83dac4c2f6509700d0f1783c02e32f1111ef607a3089954d5bcea23ee0383af907783c0cae875c68083e485218f2f", + "0x880de89458a87f6b3f9ba36267aac8b9bdf71eee03165bb4e1943ee05259745214a977c664632a68bca4cee06dc09f650561d0299a41ada35174d7e70b8624de56137d989475a10d1ff34ea37a3800ff411854bf3cc1b83e32b9ee00632de424", + "0xafbd312518ccb9bf2ee4d2830ee2f18c190b98d10d174106feb6272779f1719b415ed032bb3d3380fb82eff9955f953f17027a41b25228e3ae6aa33b35d4f53bc2814ac8e6b72d530b78db912798593201457368a6e9f2db51d88baf745d5533", + "0x8dd1162cfd94387441cb9fe2a808b500cb8208a569dfa8bf52cc6a04ecc525cc8a926b7e17981e72db033b0c64592c6e15d3714057dcd02b55f87b13f416025d64d58d6e767ec2626e7f83689c35443e24f0c9252153b4d211802a3b095eab67", + "0x99e2c60e8a3108fe47c4ce64739cbd3cef41bfe94978633f977be90892cdd1cecaf48bef2f8d6a7cf69935f43b99c64f153223b50779b434469224d79d7860b5d87c23ec20390b2db81f846ff50f39049b4276dc7b919dd7bc0a50bce6004e79", + "0x865f0ec8ca9601641e244e1edaeaf3f7f9478bafceff09e379a78bbc69d00a4edbe38cd0ba2ea72c0cb667c7420056bd0ffb30f4c0e82d6cf2f12d2463adafce4f5c9079167fac24c1ba01a61b319969765d6aad634f5df8269d5e0cdf710a27", + "0x97f111d32b6ad0ce9f9a421faa61e9c12b7c1695276a8367602560bbbc4e03ac476753ce67068ba17779a21e353e3e911827b3b3e43bcd2cacf0b3325b391a9506524baed4c3a9717c877e1217633c41f77db920eafd0e920aee95ada381a96b", + "0x84e1f46ac0f3bc7475964ccff438719a817ae3815a2c01c9bdeb22cfc1e29d0bc16bf36fb87c0a4f9b86975a94f6cbc6032404956b8f56a88a4eb8e7b075d0c599d07c6b90de7fa6796b31e4d0a983cdb4aa5e4bc1866a0fa4f440abfb8856fb", + "0xa9fbee5b0757d1828179cfb1fd91a93112d1ea98450f28b6672fa2de3c95c27c089ce703e225cf7fad9c34d4af104257164fc1c49af81c477facebcaf493872692b0203a18c21ff2f360721d3bc5cc66982bd241669115ab00420001d7084c7b", + "0xb86c96e6e4bb19311f30c002f0ad392c95e8f16c097a52e88e9639a714d5fb70d8a470e8bfba6ffb6977fc7d4117446005d4c469ec8db23e8f1f7c353b7b3647c62b7ece3b9a1a469467d7d399332f0bd855ef30b9554e93ee16aae606bcdc52", + "0x80c6e7933435b9e4eb25847978f0914fd24e3da157d8e6e434b86a4d6fe5388cd951544a08e980f560bd2daf03d589650315dcc5b2e845eddda2c9b8f9154273907610936adb48b64452cf0226a0446ff7fb4e137c6e18659c40d5cc0c7ba4eb", + "0x901208eb5525e1c0031e252783652f89e3a358e02d6e331f3a58c71e24d851a298005efd2e7b3dd4512140ad56015fe3071fd5e61aa2d2adafb4f339b1468e21e33572c639eef8919d98bed4cc8caaef5dba47d8a9bb0916793ca5bfa242130b", + "0x87fc840c7e515c142c410bf69ce60ed124182dac8d83357dcbbee854043de116b94d2f36e02ea87881c8816196f704e506db3f9d2fbff8d514ee003c15b05c1406a0a6d7b123e4064e2db26fbf9a41b6bffe054e121b59f7e37c7ec72cf9e8bd", + "0xa1abea12c7ebc7fc372436e08fc9f96ce92138518876ecacbd13a0c18dab8815eabd55b6f690cbbf8bdccf8b8fc278f206113ea3c44d4aa148ff2b1ae21372e7f73e80d347b49f5633ea3ef89eaf0eecac8de1c9c8495f7a8566a93766baeb01" + ], + "agg_sigs": "0xb2e06596f82478080aa09e275b51dce0effced876d0e5d8685cd87ec5e050a3742079e785d64b7006274053d8229245316165317f058204022c9e2fe675e5e975325660c0a716587a14cc558b780619353147f31f71f11a0cccc1da8ee91d3e0", + "agg_keys": "0x82bbb37b3c0d236bf0f3cf6ca03c503f068018f3c054c044923ce12c22bde534d5877f681fe5517ae42cc51c26dbbe4a" +} \ No newline at end of file diff --git a/scripts/generate_fixtures.py b/scripts/generate_fixtures.py new file mode 100644 index 00000000..2f6d8101 --- /dev/null +++ b/scripts/generate_fixtures.py @@ -0,0 +1,55 @@ +import secrets +from time import time + +from py_ecc.optimized_bls12_381 import ( + field_modulus as q, + G1, + G2, + add, + multiply, + pairing, +) +from py_ecc import bls +import json + + +from eth_utils import encode_hex +from constants import ( + data_path, + privkeys, + domain, + msg, +) + + +print("Gen pub keys") +pubkeys = [bls.privtopub(key) for key in privkeys] + +print("Signing") +sigs = [bls.sign(message_hash=msg, privkey=key, domain=domain) for key in privkeys] +print("Agg sigs") +agg_sigs = bls.aggregate_signatures(sigs) +print("Agg keys") +agg_keys = bls.aggregate_pubkeys(pubkeys) + + +def convert(value): + if isinstance(value, list) and isinstance(value[0], bytes): + return [encode_hex(v) for v in value] + elif isinstance(value, bytes): + return encode_hex(value) + else: + return value + + +d = { + "pubkeys": pubkeys, + "sigs": sigs, + "agg_sigs": agg_sigs, + "agg_keys": agg_keys, +} +d_converted = {k: convert(v) for k, v in d.items()} + +if __name__ == '__main__': + with open(data_path, "w") as f: + json.dump(d_converted, f, indent=4)