diff --git a/.hmy/02c8ff0b88f313717bc3a627d2f8bb172ba3ad3bb9ba3ecb8eed4b7c878653d3d4faf769876c528b73f343967f74a917.key b/.hmy/02c8ff0b88f313717bc3a627d2f8bb172ba3ad3bb9ba3ecb8eed4b7c878653d3d4faf769876c528b73f343967f74a917.key new file mode 100644 index 000000000..46af3732a --- /dev/null +++ b/.hmy/02c8ff0b88f313717bc3a627d2f8bb172ba3ad3bb9ba3ecb8eed4b7c878653d3d4faf769876c528b73f343967f74a917.key @@ -0,0 +1 @@ +e859f90f6cb272e078c5601ba6f921e53a881422928b10240aa50c5868af3db6f4fbbb30d91b232a8c0a1000355b8da9b510c0bb6eea36ba17a5ed8df875656e6e3467728c830e51ddfee1e736f986438e9d79ed56bc8f3d0e7734ec \ No newline at end of file diff --git a/.hmy/16513c487a6bb76f37219f3c2927a4f281f9dd3fd6ed2e3a64e500de6545cf391dd973cc228d24f9bd01efe94912e714.key b/.hmy/16513c487a6bb76f37219f3c2927a4f281f9dd3fd6ed2e3a64e500de6545cf391dd973cc228d24f9bd01efe94912e714.key new file mode 100644 index 000000000..001fd3cc2 --- /dev/null +++ b/.hmy/16513c487a6bb76f37219f3c2927a4f281f9dd3fd6ed2e3a64e500de6545cf391dd973cc228d24f9bd01efe94912e714.key @@ -0,0 +1 @@ +dd11eabd17b257220f9523efd6524f12b7c1356f21667a87fe1b8c630bdf9f7d247087f85a8f661a7ef8ccde6e6287d54361aa2287fdf258321a1cc1d885b45a3b636a23e40aec0357dbd699c82a36e07fff9ca6fd85f79652320113 \ No newline at end of file diff --git a/.hmy/1c1fb28d2de96e82c3d9b4917eb54412517e2763112a3164862a6ed627ac62e87ce274bb4ea36e6a61fb66a15c263a06.key b/.hmy/1c1fb28d2de96e82c3d9b4917eb54412517e2763112a3164862a6ed627ac62e87ce274bb4ea36e6a61fb66a15c263a06.key new file mode 100644 index 000000000..8bb0cf950 --- /dev/null +++ b/.hmy/1c1fb28d2de96e82c3d9b4917eb54412517e2763112a3164862a6ed627ac62e87ce274bb4ea36e6a61fb66a15c263a06.key @@ -0,0 +1 @@ +ef98515555a78fd211906a3eeaf2aca18452c48665b258b5e6a1600693ff65e8a3b6d6a3b1efd0775a297824d42d0454f4ae49789a8bc05bc2ff89b3eaa768754db6d2290fa013a6b6e42eeca8fa45a14c73192081fdd0820673ad17 \ No newline at end of file diff --git a/.hmy/2d3d4347c5a7398fbfa74e01514f9d0fcd98606ea7d245d9c7cfc011d472c2edc36c738b78bd115dda9d25533ddfe301.key b/.hmy/2d3d4347c5a7398fbfa74e01514f9d0fcd98606ea7d245d9c7cfc011d472c2edc36c738b78bd115dda9d25533ddfe301.key new file mode 100644 index 000000000..c8e442848 --- /dev/null +++ b/.hmy/2d3d4347c5a7398fbfa74e01514f9d0fcd98606ea7d245d9c7cfc011d472c2edc36c738b78bd115dda9d25533ddfe301.key @@ -0,0 +1 @@ +8ec21daae97cf60451250b08307df26f9d453860f3e98b4b8244d06846018a4f02c1183373bdf21d64c7ed203821df8e6026975c886ec3f3451127011696ffd8f591457ff12a1fa169b202944156408744374f89654d0d9367984dc0 \ No newline at end of file diff --git a/.hmy/2d61379e44a772e5757e27ee2b3874254f56073e6bd226eb8b160371cc3c18b8c4977bd3dcb71fd57dc62bf0e143fd08.key b/.hmy/2d61379e44a772e5757e27ee2b3874254f56073e6bd226eb8b160371cc3c18b8c4977bd3dcb71fd57dc62bf0e143fd08.key new file mode 100644 index 000000000..d1b7c2266 --- /dev/null +++ b/.hmy/2d61379e44a772e5757e27ee2b3874254f56073e6bd226eb8b160371cc3c18b8c4977bd3dcb71fd57dc62bf0e143fd08.key @@ -0,0 +1 @@ +b9a18c5f14b14ac6a648a792265d28f81dab207b7367573b83c4a206e01e1bd238f3a0416c66554254a77a473dec0e68bd8bf30185c91b12b07d634e53fd3f7a059eaeca39ff2b67bc848eb05869fc05255121d53c1f0a11bf4f511d \ No newline at end of file diff --git a/.hmy/40379eed79ed82bebfb4310894fd33b6a3f8413a78dc4d43b98d0adc9ef69f3285df05eaab9f2ce5f7227f8cb920e809.key b/.hmy/40379eed79ed82bebfb4310894fd33b6a3f8413a78dc4d43b98d0adc9ef69f3285df05eaab9f2ce5f7227f8cb920e809.key new file mode 100644 index 000000000..68e946ba8 --- /dev/null +++ b/.hmy/40379eed79ed82bebfb4310894fd33b6a3f8413a78dc4d43b98d0adc9ef69f3285df05eaab9f2ce5f7227f8cb920e809.key @@ -0,0 +1 @@ +cdaa7ee86f59aa4bd326af635a899afb21b204882b1e911f5e5a250c76c044d1ccfbb15772d26e36ee9ffe6c290bdebfe49ac1cf1989c913f3d06c76d4c20ebf8ba4a00644405064e51ce2fbdc14c35892393c84e4cc98ca5f2780e6 \ No newline at end of file diff --git a/.hmy/4235d4ae2219093632c61db4f71ff0c32bdb56463845f8477c2086af1fe643194d3709575707148cad4f835f2fc4ea05.key b/.hmy/4235d4ae2219093632c61db4f71ff0c32bdb56463845f8477c2086af1fe643194d3709575707148cad4f835f2fc4ea05.key new file mode 100644 index 000000000..01d98ae81 --- /dev/null +++ b/.hmy/4235d4ae2219093632c61db4f71ff0c32bdb56463845f8477c2086af1fe643194d3709575707148cad4f835f2fc4ea05.key @@ -0,0 +1 @@ +c3e2375e1f3d09399c96215861fd4f231e2ec9fd6ec9a8e1143efaff862893542610eacfcf93a76b359fc0a4644a41ffbae7e3d3f580d816231252e28f41633e297796baa3ddd94b9ef2b183ab2b678c675950ef3fbe64dc80e2a680 \ No newline at end of file diff --git a/.hmy/49d15743b36334399f9985feb0753430a2b287b2d68b84495bbb15381854cbf01bca9d1d9f4c9c8f18509b2bfa6bd40f.key b/.hmy/49d15743b36334399f9985feb0753430a2b287b2d68b84495bbb15381854cbf01bca9d1d9f4c9c8f18509b2bfa6bd40f.key new file mode 100644 index 000000000..15783eb34 --- /dev/null +++ b/.hmy/49d15743b36334399f9985feb0753430a2b287b2d68b84495bbb15381854cbf01bca9d1d9f4c9c8f18509b2bfa6bd40f.key @@ -0,0 +1 @@ +2feddeb82936401a582b4d48aa7bc62f1ccabcad430ee9e70ca682392767a8a162d17f691cc22089f434c76c790e57ad0ce93a61aa070b87f802f42d84ac02d3d33cc4baa4a643eeb53b19c4105ba01e2dd7a3cccb75b0678cc71d21 \ No newline at end of file diff --git a/.hmy/52ecce5f64db21cbe374c9268188f5d2cdd5bec1a3112276a350349860e35fb81f8cfe447a311e0550d961cf25cb988d.key b/.hmy/52ecce5f64db21cbe374c9268188f5d2cdd5bec1a3112276a350349860e35fb81f8cfe447a311e0550d961cf25cb988d.key new file mode 100644 index 000000000..ace2cba40 --- /dev/null +++ b/.hmy/52ecce5f64db21cbe374c9268188f5d2cdd5bec1a3112276a350349860e35fb81f8cfe447a311e0550d961cf25cb988d.key @@ -0,0 +1 @@ +10f1173239fc903360055a2ffe37948cddbb2b199f66572af56e623b6681c100f2fc71b08cef8fd59c0a784047f321543d81aee9a2d493214c31e72852c5d1c8f350baf4d8667fec16f520680fc59371a0f874ffcc9cd5c824291ff5 \ No newline at end of file diff --git a/.hmy/576d3c48294e00d6be4a22b07b66a870ddee03052fe48a5abbd180222e5d5a1f8946a78d55b025de21635fd743bbad90.key b/.hmy/576d3c48294e00d6be4a22b07b66a870ddee03052fe48a5abbd180222e5d5a1f8946a78d55b025de21635fd743bbad90.key new file mode 100644 index 000000000..48bbb2432 --- /dev/null +++ b/.hmy/576d3c48294e00d6be4a22b07b66a870ddee03052fe48a5abbd180222e5d5a1f8946a78d55b025de21635fd743bbad90.key @@ -0,0 +1 @@ +837cdffcc049ba89931d570e4be38bfef513df65d8dd277b0da8e62adf8c23b3c5229a2a4b36aa2c90c17d490dd5f95869365ebc4429d1efc784d25a64db246870d4bb4831d98ec02317ea88b76491a7fdfd2fa5e10f267e8f3989d9 \ No newline at end of file diff --git a/.hmy/63f479f249c59f0486fda8caa2ffb247209489dae009dfde6144ff38c370230963d360dffd318cfb26c213320e89a512.key b/.hmy/63f479f249c59f0486fda8caa2ffb247209489dae009dfde6144ff38c370230963d360dffd318cfb26c213320e89a512.key new file mode 100644 index 000000000..19ece66c5 --- /dev/null +++ b/.hmy/63f479f249c59f0486fda8caa2ffb247209489dae009dfde6144ff38c370230963d360dffd318cfb26c213320e89a512.key @@ -0,0 +1 @@ +3866b51e59955446f625063edc6a6f352662e92224ce78a2921e7699d478ace9d1c7a3c7c1932a81c5d7fc677e9c7620fe414a0b8e852bc075d600455e8b07b0918296e2914a656764e438e6978623f23ae63207ef4b377aac478048 \ No newline at end of file diff --git a/.hmy/65f55eb3052f9e9f632b2923be594ba77c55543f5c58ee1454b9cfd658d25e06373b0f7d42a19c84768139ea294f6204.key b/.hmy/65f55eb3052f9e9f632b2923be594ba77c55543f5c58ee1454b9cfd658d25e06373b0f7d42a19c84768139ea294f6204.key new file mode 100644 index 000000000..e4772c1d0 --- /dev/null +++ b/.hmy/65f55eb3052f9e9f632b2923be594ba77c55543f5c58ee1454b9cfd658d25e06373b0f7d42a19c84768139ea294f6204.key @@ -0,0 +1 @@ +56e7156cfa4151f7beb62d94f92bf08f0544cc35aa65eec1c68f0db99fdef68dd0cc354ba61e949dd962100216155e86052272965b7063d8ebb9a6c7be9c35ab421415f12d05dc0c719b6ac2b3ec20fedc267fbf6a4f022925bc45bf \ No newline at end of file diff --git a/.hmy/678ec9670899bf6af85b877058bea4fc1301a5a3a376987e826e3ca150b80e3eaadffedad0fedfa111576fa76ded980c.key b/.hmy/678ec9670899bf6af85b877058bea4fc1301a5a3a376987e826e3ca150b80e3eaadffedad0fedfa111576fa76ded980c.key new file mode 100644 index 000000000..bfca37192 --- /dev/null +++ b/.hmy/678ec9670899bf6af85b877058bea4fc1301a5a3a376987e826e3ca150b80e3eaadffedad0fedfa111576fa76ded980c.key @@ -0,0 +1 @@ +926454b15914a0d0a18686173dcee027bd6cb3911866f360a3b383b240431c75130e2f3b3697f5117e072a6c7fc39dcdeb8b1e790034e844b070867740d5eb2d918b649701490e56aecdb7ef22c335d6300a103719c98bb094aec530 \ No newline at end of file diff --git a/.hmy/68ae289d73332872ec8d04ac256ca0f5453c88ad392730c5741b6055bc3ec3d086ab03637713a29f459177aaa8340615.key b/.hmy/68ae289d73332872ec8d04ac256ca0f5453c88ad392730c5741b6055bc3ec3d086ab03637713a29f459177aaa8340615.key new file mode 100644 index 000000000..c81d9506f --- /dev/null +++ b/.hmy/68ae289d73332872ec8d04ac256ca0f5453c88ad392730c5741b6055bc3ec3d086ab03637713a29f459177aaa8340615.key @@ -0,0 +1 @@ +d2e561f8184c1e2ab98a77c82cec7aa6ee2d729ce7664c35784299245c5a2f98afeda45049ff55ac19ad7fe8c9a13d57fd2f250b4a0bcba9146f01d789ce8fbab4433ca09fbf3f6d476f7832a62539c4c12ac7fa5ce37d535c1d21e9 \ No newline at end of file diff --git a/.hmy/776f3b8704f4e1092a302a60e84f81e476c212d6f458092b696df420ea19ff84a6179e8e23d090b9297dc041600bc100.key b/.hmy/776f3b8704f4e1092a302a60e84f81e476c212d6f458092b696df420ea19ff84a6179e8e23d090b9297dc041600bc100.key new file mode 100644 index 000000000..ef304bc27 --- /dev/null +++ b/.hmy/776f3b8704f4e1092a302a60e84f81e476c212d6f458092b696df420ea19ff84a6179e8e23d090b9297dc041600bc100.key @@ -0,0 +1 @@ +dbbf69ebbe21d0da28bbf96294171b17644f40bce2bd38470b9345c75811b9685587b0acf9b1806b48a28e7cc56e5e4daad281d2950612beaeef607e8aa71bbc33ed91f76c170b1efe6691a4038ab3b149ac771279ee9ea90b501444 \ No newline at end of file diff --git a/.hmy/86dc2fdc2ceec18f6923b99fd86a68405c132e1005cf1df72dca75db0adfaeb53d201d66af37916d61f079f34f21fb96.key b/.hmy/86dc2fdc2ceec18f6923b99fd86a68405c132e1005cf1df72dca75db0adfaeb53d201d66af37916d61f079f34f21fb96.key new file mode 100644 index 000000000..02d5cceb3 --- /dev/null +++ b/.hmy/86dc2fdc2ceec18f6923b99fd86a68405c132e1005cf1df72dca75db0adfaeb53d201d66af37916d61f079f34f21fb96.key @@ -0,0 +1 @@ +2d531f231ea393b00d1e74887135dbc6144ccbb683438b7f1b7b9a217ca890ef82ba0a2fad7c103f31ac46cc6cbf073d4489726b3069af3414c930234d284453292cd1a5c14baf884a1f074fe4f70856c2e454e0da1f6acd1d745671 \ No newline at end of file diff --git a/.hmy/95117937cd8c09acd2dfae847d74041a67834ea88662a7cbed1e170350bc329e53db151e5a0ef3e712e35287ae954818.key b/.hmy/95117937cd8c09acd2dfae847d74041a67834ea88662a7cbed1e170350bc329e53db151e5a0ef3e712e35287ae954818.key new file mode 100644 index 000000000..0bfd3cdd4 --- /dev/null +++ b/.hmy/95117937cd8c09acd2dfae847d74041a67834ea88662a7cbed1e170350bc329e53db151e5a0ef3e712e35287ae954818.key @@ -0,0 +1 @@ +5ea6f866b075e1c42d2a0aa72862f5161b45e4e5064f87f12c241d43425cdce6f785697d3a7dc40a7b17222543390dac8e4908e71c44a7180f86bda6930b1df96d59adb70f24756c4c4430325b6a2ba36364870dd768d55a4a0c86e1 \ No newline at end of file diff --git a/.hmy/a547a9bf6fdde4f4934cde21473748861a3cc0fe8bbb5e57225a29f483b05b72531f002f8187675743d819c955a86100.key b/.hmy/a547a9bf6fdde4f4934cde21473748861a3cc0fe8bbb5e57225a29f483b05b72531f002f8187675743d819c955a86100.key new file mode 100644 index 000000000..8796853c6 --- /dev/null +++ b/.hmy/a547a9bf6fdde4f4934cde21473748861a3cc0fe8bbb5e57225a29f483b05b72531f002f8187675743d819c955a86100.key @@ -0,0 +1 @@ +764e55fb6b84617d188846e274152ca564b8b013cfe661661bd7c6681fdae3b000ef96c0654cdd7ff8755d32768e3770c4137e9d08c5ea7c8083705f41aae761bc03737cf316382f51c63d9e335a4c6a2d770e190ce5306cdca7821a \ No newline at end of file diff --git a/.hmy/b179c4fdc0bee7bd0b6698b792837dd13404d3f985b59d4a9b1cd0641a76651e271518b61abbb6fbebd4acf963358604.key b/.hmy/b179c4fdc0bee7bd0b6698b792837dd13404d3f985b59d4a9b1cd0641a76651e271518b61abbb6fbebd4acf963358604.key new file mode 100644 index 000000000..a5e389cdd --- /dev/null +++ b/.hmy/b179c4fdc0bee7bd0b6698b792837dd13404d3f985b59d4a9b1cd0641a76651e271518b61abbb6fbebd4acf963358604.key @@ -0,0 +1 @@ +4f10ae42aefd0acfc50cc2a5874eff7ecd98c8a2a6bb9fa7f35f7e23a71211a24d8428b13472558000193d03077afdc5d534e0a91e0113114d141783db621499f7866bcf56300befd2a60408e56d9908069cc51e2216113f050c3d3e \ No newline at end of file diff --git a/.hmy/blspass.txt b/.hmy/blspass.txt new file mode 100644 index 000000000..e69de29bb diff --git a/.hmy/c4e4708b6cf2a2ceeb59981677e9821eebafc5cf483fb5364a28fa604cc0ce69beeed40f3f03815c9e196fdaec5f1097.key b/.hmy/c4e4708b6cf2a2ceeb59981677e9821eebafc5cf483fb5364a28fa604cc0ce69beeed40f3f03815c9e196fdaec5f1097.key new file mode 100644 index 000000000..143714bb3 --- /dev/null +++ b/.hmy/c4e4708b6cf2a2ceeb59981677e9821eebafc5cf483fb5364a28fa604cc0ce69beeed40f3f03815c9e196fdaec5f1097.key @@ -0,0 +1 @@ +b3dae95cb93d7081949f19fa14b682254b52034de91020394a7df5bc87c0629ff73e3fc8ad760d911ea9fb488587d3bc36520e936d85e29bfa303db66dacc56728191906b686fc5ea73a63efb83c423f01e150b6737bd07c4763155c \ No newline at end of file diff --git a/.hmy/ca86e551ee42adaaa6477322d7db869d3e203c00d7b86c82ebee629ad79cb6d57b8f3db28336778ec2180e56a8e07296.key b/.hmy/ca86e551ee42adaaa6477322d7db869d3e203c00d7b86c82ebee629ad79cb6d57b8f3db28336778ec2180e56a8e07296.key new file mode 100644 index 000000000..91686a9cc --- /dev/null +++ b/.hmy/ca86e551ee42adaaa6477322d7db869d3e203c00d7b86c82ebee629ad79cb6d57b8f3db28336778ec2180e56a8e07296.key @@ -0,0 +1 @@ +f7255c1a11961a9dd4f7b0776c6113fc479829880abe05a16322099b651d5b31b829f63794d9c89fe7e9fc9729f7a722b566b77ca3f50824895b4ce26779ecfcfe6e50908f7fd26b101d34f0addb0b6cab5d2d48e82c7db9964dd09d \ No newline at end of file diff --git a/.hmy/e751ec995defe4931273aaebcb2cd14bf37e629c554a57d3f334c37881a34a6188a93e76113c55ef3481da23b7d7ab09.key b/.hmy/e751ec995defe4931273aaebcb2cd14bf37e629c554a57d3f334c37881a34a6188a93e76113c55ef3481da23b7d7ab09.key new file mode 100644 index 000000000..0d06c4960 --- /dev/null +++ b/.hmy/e751ec995defe4931273aaebcb2cd14bf37e629c554a57d3f334c37881a34a6188a93e76113c55ef3481da23b7d7ab09.key @@ -0,0 +1 @@ +8e1c2ffc67eeb241e00f5a87a280cb1705f38dd5e21a727aaccf1f82f60256ff9b7e409e2a059fcaae2f7b41a76ef58149d25fe9c47626ca1df012661d344d9f8a25d817183c55e8be840f5a155e7374cf1044e0abbaa23e6ac0c041 \ No newline at end of file diff --git a/.hmy/eca09c1808b729ca56f1b5a6a287c6e1c3ae09e29ccf7efa35453471fcab07d9f73cee249e2b91f5ee44eb9618be3904.key b/.hmy/eca09c1808b729ca56f1b5a6a287c6e1c3ae09e29ccf7efa35453471fcab07d9f73cee249e2b91f5ee44eb9618be3904.key new file mode 100644 index 000000000..0f6106d32 --- /dev/null +++ b/.hmy/eca09c1808b729ca56f1b5a6a287c6e1c3ae09e29ccf7efa35453471fcab07d9f73cee249e2b91f5ee44eb9618be3904.key @@ -0,0 +1 @@ +e32f49038a6eddd0734bc444789ee24cee3ca53f10f9fab44c103099ce0cb3d6978f524cdacbf5b1d4d99e8cca7c3ffe0ebc7f9bc256b9a47b0b3b5a09f821718ee948e28bd3e6392f113a79f9a1a1bfc7b743b2dc06a8a1dc9dd1e9 \ No newline at end of file diff --git a/.hmy/ee2474f93cba9241562efc7475ac2721ab0899edf8f7f115a656c0c1f9ef8203add678064878d174bb478fa2e6630502.key b/.hmy/ee2474f93cba9241562efc7475ac2721ab0899edf8f7f115a656c0c1f9ef8203add678064878d174bb478fa2e6630502.key new file mode 100644 index 000000000..72b595d46 --- /dev/null +++ b/.hmy/ee2474f93cba9241562efc7475ac2721ab0899edf8f7f115a656c0c1f9ef8203add678064878d174bb478fa2e6630502.key @@ -0,0 +1 @@ +04708dbccd097c7f1278b51f6e72a8dead4f913c55dbc412f5d4519ed67d8fb56944c719a544fe724f0648ac9a74875d5458855e7bb434eaae0249f3b6fafbf311147de2f1e64e0394043e55c6cec92ce28af61dda93da6bf65523d3 \ No newline at end of file diff --git a/.hmy/f47238daef97d60deedbde5302d05dea5de67608f11f406576e363661f7dcbc4a1385948549b31a6c70f6fde8a391486.key b/.hmy/f47238daef97d60deedbde5302d05dea5de67608f11f406576e363661f7dcbc4a1385948549b31a6c70f6fde8a391486.key new file mode 100644 index 000000000..9493091fa --- /dev/null +++ b/.hmy/f47238daef97d60deedbde5302d05dea5de67608f11f406576e363661f7dcbc4a1385948549b31a6c70f6fde8a391486.key @@ -0,0 +1 @@ +2ddd1d3d707da7a1a790aa1c3712c7457eaf63430cdefbd8988602369b112a4b2bde7d1e9769a6e980dc168ed337021bec96ba72607272ba6efdac603bda0d601e0e757384ed92b83f7a99efe412d08d13a9540e654e57aa9f702553 \ No newline at end of file diff --git a/.hmy/fc4b9c535ee91f015efff3f32fbb9d32cdd9bfc8a837bb3eee89b8fff653c7af2050a4e147ebe5c7233dc2d5df06ee0a.key b/.hmy/fc4b9c535ee91f015efff3f32fbb9d32cdd9bfc8a837bb3eee89b8fff653c7af2050a4e147ebe5c7233dc2d5df06ee0a.key new file mode 100644 index 000000000..cbf1aa99b --- /dev/null +++ b/.hmy/fc4b9c535ee91f015efff3f32fbb9d32cdd9bfc8a837bb3eee89b8fff653c7af2050a4e147ebe5c7233dc2d5df06ee0a.key @@ -0,0 +1 @@ +0eb52e17542aac608b63b714b4f00e620c47743524c9367c9d0c2cb770c727c81167f0b5e94c59c9c0e68864407ca4c64922f6b23a22cb93fa260486d17d67faab495acc567ee41adadffe36632e00d36a903f26cbc60055c5c681ad \ No newline at end of file diff --git a/.hmy/keystore/one103q7qe5t2505lypvltkqtddaef5tzfxwsse4z7.key b/.hmy/keystore/one103q7qe5t2505lypvltkqtddaef5tzfxwsse4z7.key new file mode 100644 index 000000000..945157bf2 --- /dev/null +++ b/.hmy/keystore/one103q7qe5t2505lypvltkqtddaef5tzfxwsse4z7.key @@ -0,0 +1 @@ +{"address":"7c41e0668b551f4f902cfaec05b5bdca68b124ce","crypto":{"cipher":"aes-128-ctr","ciphertext":"79c01b348e247ced69c60419504201b05e4cb0a0c13e7553800f24d3a6adad18","cipherparams":{"iv":"3a237dfa5d7a061794af8b31d96ce403"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"11b96c6d74f8a1c2518fa7a0c703c0c87755d165d2a52cc866ea18b366505606"},"mac":"7e3abf588d1735e6b54e1903d710fe13bd0c019f9348f078d7228e4ca76f4872"},"id":"b2ac0bab-6bdb-46d1-8c43-56829dc94631","version":3} \ No newline at end of file diff --git a/.hmy/keystore/one129r9pj3sk0re76f7zs3qz92rggmdgjhtwge62k.key b/.hmy/keystore/one129r9pj3sk0re76f7zs3qz92rggmdgjhtwge62k.key new file mode 100644 index 000000000..0eae5a208 --- /dev/null +++ b/.hmy/keystore/one129r9pj3sk0re76f7zs3qz92rggmdgjhtwge62k.key @@ -0,0 +1 @@ +{"address":"514650ca30b3c79f693e14220115434236d44aeb","crypto":{"cipher":"aes-128-ctr","ciphertext":"0a2720560f336d9fe97cb2a64f252efe516bca298e0b26368b05fb0b4a9a2acf","cipherparams":{"iv":"d55a4720d1d3a06eddfbadda834002aa"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"64664051f661b74e44f92c9020fb68fe229131aba70b7d0acbcb3482c57d50e4"},"mac":"238dbfccc29d99c645059bd6d2089a40e1ecc452d005dc6d3282dce1f8d351f8"},"id":"1c717ad7-2911-4fda-9c6a-acd550fe80eb","version":3} \ No newline at end of file diff --git a/.hmy/keystore/one12fuf7x9rgtdgqg7vgq0962c556m3p7afsxgvll.key b/.hmy/keystore/one12fuf7x9rgtdgqg7vgq0962c556m3p7afsxgvll.key new file mode 100644 index 000000000..47c069ffb --- /dev/null +++ b/.hmy/keystore/one12fuf7x9rgtdgqg7vgq0962c556m3p7afsxgvll.key @@ -0,0 +1 @@ +{"address":"52789f18a342da8023cc401e5d2b14a6b710fba9","crypto":{"cipher":"aes-128-ctr","ciphertext":"24f6c820536b43b40ab22b186bf8699eea1d7a50a44f7b2bfc4eae32aa98dd46","cipherparams":{"iv":"6c99649be303bd1624e8c84ca0510977"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"57a48fb838b517d66cef2a6676e31312ee77a43d6e3d6c53c83a38bb6fbcfc71"},"mac":"ce6701dd969ee7ef0bcaf2ba17b846d4bcf7029ce70b0bba422003445e4418f1"},"id":"899cdaaa-2d2f-4012-850f-bbbf83d028dc","version":3} \ No newline at end of file diff --git a/.hmy/keystore/one1658znfwf40epvy7e46cqrmzyy54h4n0qa73nep.key b/.hmy/keystore/one1658znfwf40epvy7e46cqrmzyy54h4n0qa73nep.key new file mode 100644 index 000000000..4fe48fdba --- /dev/null +++ b/.hmy/keystore/one1658znfwf40epvy7e46cqrmzyy54h4n0qa73nep.key @@ -0,0 +1 @@ +{"address":"d50e29a5c9abf21613d9aeb001ec44252b7acde0","crypto":{"cipher":"aes-128-ctr","ciphertext":"3b217e377a14a88c7130a55429c4b0002c726c24bcf5489054677f60e0814df9","cipherparams":{"iv":"9d4e1c1ab09df4a0dca430ae71d0d31b"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"3d13946010c0fe14227651cfa3d403f37622b8e4237a064e428e114d012a6d3b"},"mac":"f60c48c710169fc7049661c4835797f04bc520c47e8636b6313c35fbd0f16624"},"id":"9be4b1ae-2e66-4bfc-a9a6-57b62e5c518e","version":3} \ No newline at end of file diff --git a/.hmy/keystore/one16qsd5ant9v94jrs89mruzx62h7ekcfxmduh2rx.key b/.hmy/keystore/one16qsd5ant9v94jrs89mruzx62h7ekcfxmduh2rx.key new file mode 100644 index 000000000..ef2535020 --- /dev/null +++ b/.hmy/keystore/one16qsd5ant9v94jrs89mruzx62h7ekcfxmduh2rx.key @@ -0,0 +1 @@ +{"address":"d020da766b2b0b590e072ec7c11b4abfb36c24db","crypto":{"cipher":"aes-128-ctr","ciphertext":"69afd94411d350fe17a182063d633753eac63fcc894bdc06a383da2684220405","cipherparams":{"iv":"84c9cc99b6c788f09c5b367fa7312c3f"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"d9a8670a5bacc3697ea4d75f549ed88997263abb2811e61bc7b1584a432e9c78"},"mac":"d511c9fcc18814411f2ff4b276e3dd85b30842e8931b8603ebf3f086b369d8b7"},"id":"7579047b-803b-4ad8-8de5-3f3e2a2b3875","version":3} \ No newline at end of file diff --git a/.hmy/keystore/one1a0x3d6xpmr6f8wsyaxd9v36pytvp48zckswvv9.key b/.hmy/keystore/one1a0x3d6xpmr6f8wsyaxd9v36pytvp48zckswvv9.key new file mode 100644 index 000000000..2b9b20718 --- /dev/null +++ b/.hmy/keystore/one1a0x3d6xpmr6f8wsyaxd9v36pytvp48zckswvv9.key @@ -0,0 +1 @@ +{"address":"ebcd16e8c1d8f493ba04e99a56474122d81a9c58","crypto":{"cipher":"aes-128-ctr","ciphertext":"3c025fbb64ab0e76ef45e51995a286d2e867a37c60f4592962d90ab6ff93d597","cipherparams":{"iv":"7ec4278813d1e5e6e3c25203758bb666"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"5fee1817a7e15e8c7f03776573337c12826f3d5ee63258a544a98dbacf661eb9"},"mac":"71058b6e4edcd3dfb23a73e965ba29eebc50bfe186b259923cf3f3f6d7d0e318"},"id":"b029e616-9264-4408-9cf5-991796b81115","version":3} \ No newline at end of file diff --git a/.hmy/keystore/one1a50tun737ulcvwy0yvve0pvu5skq0kjargvhwe.key b/.hmy/keystore/one1a50tun737ulcvwy0yvve0pvu5skq0kjargvhwe.key new file mode 100644 index 000000000..2dff27a54 --- /dev/null +++ b/.hmy/keystore/one1a50tun737ulcvwy0yvve0pvu5skq0kjargvhwe.key @@ -0,0 +1 @@ +{"address":"ed1ebe4fd1f73f86388f231997859ca42c07da5d","crypto":{"cipher":"aes-128-ctr","ciphertext":"35d3f8a387ebb5afa840a6cff8266f3cad95076ab5e5e0d86478245bd9752832","cipherparams":{"iv":"1ddd2682b0f73968b038fc7c4a68533a"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"7abb28f154862fba917551aadb472a9a2f81d26e4b5cb526432bee7a95f4f32e"},"mac":"85c8467dc2c48faf24aaf6487158644022d9802de5cff310603539b186bc8dc7"},"id":"7f9f263b-3c79-4ec1-ba41-05dc6330d66b","version":3} \ No newline at end of file diff --git a/.hmy/keystore/one1d2rngmem4x2c6zxsjjz29dlah0jzkr0k2n88wc.key b/.hmy/keystore/one1d2rngmem4x2c6zxsjjz29dlah0jzkr0k2n88wc.key new file mode 100644 index 000000000..2d9f83edc --- /dev/null +++ b/.hmy/keystore/one1d2rngmem4x2c6zxsjjz29dlah0jzkr0k2n88wc.key @@ -0,0 +1 @@ +{"address":"6a87346f3ba9958d08d09484a2b7fdbbe42b0df6","crypto":{"cipher":"aes-128-ctr","ciphertext":"83d2056e2fec434980d431fbb7b0b30802cebfa6e8db50d645574e9027c8ccac","cipherparams":{"iv":"116ae1984a3b739a90c77e7c402ab120"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"41cdc2deb8c9febe1fd20ff3de284049c30b9dc888ff4510d08db7fb43577e01"},"mac":"3a56d6522d54c473b0a7de5cfc8104184ed5c1e29d24aeca5b4c6dbf4929f7e0"},"id":"a2394479-a0a0-4deb-b7ca-9393b555c008","version":3} \ No newline at end of file diff --git a/.hmy/keystore/one1d7jfnr6yraxnrycgaemyktkmhmajhp8kl0yahv.key b/.hmy/keystore/one1d7jfnr6yraxnrycgaemyktkmhmajhp8kl0yahv.key new file mode 100644 index 000000000..e2019e281 --- /dev/null +++ b/.hmy/keystore/one1d7jfnr6yraxnrycgaemyktkmhmajhp8kl0yahv.key @@ -0,0 +1 @@ +{"address":"6fa4998f441f4d319308ee764b2edbbefb2b84f6","crypto":{"cipher":"aes-128-ctr","ciphertext":"ed887b19ad9303ff7ee2d14906f808fc2cf3562d2b3e72ffa490b47a70ed1359","cipherparams":{"iv":"981b0640c5131c65afc2b66b54d180d5"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"96e51a7764ae05648e4690686b8b4e547fc11640d274f95ae4b3778cf84bde15"},"mac":"5d0d28d5f2907a17c6d228431b1fca42ff2976939d7d9e8a3d77b963df91e0e4"},"id":"7afbda0d-f126-4914-b157-c1de9d9d737e","version":3} \ No newline at end of file diff --git a/.hmy/keystore/one1est2gxcvavmtnzc7mhd73gzadm3xxcv5zczdtw.key b/.hmy/keystore/one1est2gxcvavmtnzc7mhd73gzadm3xxcv5zczdtw.key new file mode 100644 index 000000000..cf773b841 --- /dev/null +++ b/.hmy/keystore/one1est2gxcvavmtnzc7mhd73gzadm3xxcv5zczdtw.key @@ -0,0 +1 @@ +{"address":"cc16a41b0ceb36b98b1edddbe8a05d6ee2636194","crypto":{"cipher":"aes-128-ctr","ciphertext":"6d7230bf642757bef746e720a9598803748ce99bc7052ee502dfd992eb160f59","cipherparams":{"iv":"081dec8badd657b1cf0d8c1c748379ad"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"254cecddedc1e238d83c4064fac06ae92467d0ddf882b2c506c951f494967b36"},"mac":"73e67e5781943ee42e73892ca3c3e1e9624a2d1ec6881716fcf3f16f249d9d75"},"id":"c87bc580-938a-43d9-b700-af6360fbd6aa","version":3} \ No newline at end of file diff --git a/.hmy/keystore/one1ghkz3frhske7emk79p7v2afmj4a5t0kmjyt4s5.key b/.hmy/keystore/one1ghkz3frhske7emk79p7v2afmj4a5t0kmjyt4s5.key new file mode 100644 index 000000000..adcc29abe --- /dev/null +++ b/.hmy/keystore/one1ghkz3frhske7emk79p7v2afmj4a5t0kmjyt4s5.key @@ -0,0 +1 @@ +{"address":"45ec28a47785b3eceede287cc5753b957b45bedb","crypto":{"cipher":"aes-128-ctr","ciphertext":"59c1afb834b16c43dbf5a4835b1d8b6f582117a57063549140fbe4e72cc74429","cipherparams":{"iv":"93b78a71d41f1f7aba1c94aecf19f805"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"efb906bfb11889ddd6515f95f344bfdf8c0b037d9157dd875ca4ffb4906ecc47"},"mac":"af60f7e0c4f6129ce1fbc62007123071468d053c05c97936a74525a6ffb379ff"},"id":"952d11bc-c497-4b64-9446-a69471e9852e","version":3} \ No newline at end of file diff --git a/.hmy/keystore/one1ljznytjyn269azvszjlcqvpcj6hjm822yrcp2e.key b/.hmy/keystore/one1ljznytjyn269azvszjlcqvpcj6hjm822yrcp2e.key new file mode 100644 index 000000000..608540c4d --- /dev/null +++ b/.hmy/keystore/one1ljznytjyn269azvszjlcqvpcj6hjm822yrcp2e.key @@ -0,0 +1 @@ +{"address":"fc85322e449ab45e899014bf80303896af2d9d4a","crypto":{"cipher":"aes-128-ctr","ciphertext":"ef0bb981004178d80d281df4436aedaea7604cc53ab9d6b1c36f9ee2ba07b3cd","cipherparams":{"iv":"1937fbc73f2e2d33fd3857b99f20aa5a"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"f80f9e88a62798bc509fc96ebfe5969c817296f17cc0550c43ffab55bd328cbe"},"mac":"f18b6803eac0f1cb92fef62c3792ce05ea2f4b773a57ab90897ea81ef273dd67"},"id":"c3724130-3461-47a9-9fa7-1109e5e49375","version":3} \ No newline at end of file diff --git a/.hmy/keystore/one1m6m0ll3q7ljdqgmth2t5j7dfe6stykucpj2nr5.key b/.hmy/keystore/one1m6m0ll3q7ljdqgmth2t5j7dfe6stykucpj2nr5.key new file mode 100644 index 000000000..9a8c056e4 --- /dev/null +++ b/.hmy/keystore/one1m6m0ll3q7ljdqgmth2t5j7dfe6stykucpj2nr5.key @@ -0,0 +1 @@ +{"address":"deb6fffe20f7e4d0236bba974979a9cea0b25b98","crypto":{"cipher":"aes-128-ctr","ciphertext":"a4db960531c5f6a12d6ecde28c24d5f16ddf0e2c37e55ee83720273df60ecfab","cipherparams":{"iv":"09488c65d1e7d8bc8429933b293f5c39"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"dcae38d68672588326801538d772362efce0c24d327a247f35cbdca998608c9b"},"mac":"f2d49678a3e8e0efecd30aa277f6337a9d22d21efcbc5f621c3e7da5e13fd67d"},"id":"1ee3efb9-db6b-446a-8745-23fe595e7ad0","version":3} \ No newline at end of file diff --git a/.hmy/keystore/one1p7ht2d4kl8ve7a8jxw746yfnx4wnfxtp8jqxwe.key b/.hmy/keystore/one1p7ht2d4kl8ve7a8jxw746yfnx4wnfxtp8jqxwe.key new file mode 100644 index 000000000..a17696993 --- /dev/null +++ b/.hmy/keystore/one1p7ht2d4kl8ve7a8jxw746yfnx4wnfxtp8jqxwe.key @@ -0,0 +1 @@ +{"address":"0faeb536b6f9d99f74f233bd5d1133355d349961","crypto":{"cipher":"aes-128-ctr","ciphertext":"4633b6fea4bdefd32ad6342c97c720d6de4209b9a5a941465758238d6925baee","cipherparams":{"iv":"54e8120f6e24993639135ce4c8c17b90"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"5968c0feb65d7e124c675bdc6781917a5f60a6bbe1f3d9b52baadf3d0b4815a9"},"mac":"32d312829ac7b130467422610a7b2f705724338972ba26421b7bac4cf9801802"},"id":"24427081-a7b9-4fde-94f9-afdde2f7d693","version":3} \ No newline at end of file diff --git a/.hmy/keystore/one1pdv9lrdwl0rg5vglh4xtyrv3wjk3wsqket7zxy.key b/.hmy/keystore/one1pdv9lrdwl0rg5vglh4xtyrv3wjk3wsqket7zxy.key new file mode 100644 index 000000000..9d9cbb132 --- /dev/null +++ b/.hmy/keystore/one1pdv9lrdwl0rg5vglh4xtyrv3wjk3wsqket7zxy.key @@ -0,0 +1 @@ +{"address":"0b585f8daefbc68a311fbd4cb20d9174ad174016","crypto":{"cipher":"aes-128-ctr","ciphertext":"1d5212df709bc0c3788d16d6eb382a0efe09d6375b46193ca150de57e13a63fc","cipherparams":{"iv":"ef0021e70de7b9c5e1fffab85aa4e767"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"74cb54fc249fc554a8e9eccc2249f5d8cb68480e958af8793507e5551cbe28e7"},"mac":"da6ee1a747cdab9205d9f7471c34e98c6a9ee2b07965d3290bf7e8ef6e7064b1"},"id":"f80c88e5-b36e-4204-8bc9-4a0a3b296acf","version":3} \ No newline at end of file diff --git a/.hmy/keystore/one1pf75h0t4am90z8uv3y0dgunfqp4lj8wr3t5rsp.key b/.hmy/keystore/one1pf75h0t4am90z8uv3y0dgunfqp4lj8wr3t5rsp.key new file mode 100644 index 000000000..77936c9d9 --- /dev/null +++ b/.hmy/keystore/one1pf75h0t4am90z8uv3y0dgunfqp4lj8wr3t5rsp.key @@ -0,0 +1 @@ +{"address":"0a7d4bbd75eecaf11f8c891ed47269006bf91dc3","crypto":{"cipher":"aes-128-ctr","ciphertext":"1341024ae7d676370a05a3598d79adc103779d172f16d89a72cc4b449fd6de80","cipherparams":{"iv":"29285ac7513225b04f265f60a11da619"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"1ae76b7984e5f7baa0e67fdd24721025b7e6e2530d79c42b3a2afc8bac8c7410"},"mac":"4460558fe35cd6c2be1ba51d305da021ccef0b7297b8b26d4e33e9f2e46d2904"},"id":"19506dea-0c8d-40ff-97ca-81ccac068c1b","version":3} \ No newline at end of file diff --git a/.hmy/keystore/one1r4zyyjqrulf935a479sgqlpa78kz7zlcg2jfen.key b/.hmy/keystore/one1r4zyyjqrulf935a479sgqlpa78kz7zlcg2jfen.key new file mode 100644 index 000000000..0047a3869 --- /dev/null +++ b/.hmy/keystore/one1r4zyyjqrulf935a479sgqlpa78kz7zlcg2jfen.key @@ -0,0 +1 @@ +{"address":"1d44424803e7d258d3b5f160807c3df1ec2f0bf8","crypto":{"cipher":"aes-128-ctr","ciphertext":"2d8133e01e3a3566c0cc3b16b6b4d40437d9a13c0c969a10cd1e0dc40a59f6df","cipherparams":{"iv":"692ec015f202a9cf8f3951e3f7771ab2"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"faf7cf29d64ea042b29b8220c9910d8d8ee989fb36e92e533f9fc61f43c8f8d7"},"mac":"1f7a64fbbb1f0dd7732771e52bd775989e627e15c2bd0317215c01d826110fd7"},"id":"b067e90d-5e97-410e-a20c-91aee87ad4e1","version":3} \ No newline at end of file diff --git a/.hmy/keystore/one1spshr72utf6rwxseaz339j09ed8p6f8ke370zj.key b/.hmy/keystore/one1spshr72utf6rwxseaz339j09ed8p6f8ke370zj.key new file mode 100644 index 000000000..9d7a5901d --- /dev/null +++ b/.hmy/keystore/one1spshr72utf6rwxseaz339j09ed8p6f8ke370zj.key @@ -0,0 +1 @@ +{"address":"806171f95c5a74371a19e8a312c9e5cb4e1d24f6","crypto":{"cipher":"aes-128-ctr","ciphertext":"7ab03cb710ac9b623756f90ffedd1953ec588040fef688e2273d0dfd895ead63","cipherparams":{"iv":"f898400903878543a2643cf50b1c0c59"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"09b87b6de8b3c5628ae20629b571f76afcee209b1658cad1eb51a0439d8e83a4"},"mac":"77fbd8d3244caa6bed5026b88fbdd6c49a88dbe0de572b3e54512e4a73fd28ab"},"id":"8730054b-72d5-4bfe-9235-ee9b671eeca3","version":3} \ No newline at end of file diff --git a/.hmy/keystore/one1uyshu2jgv8w465yc8kkny36thlt2wvel89tcmg.key b/.hmy/keystore/one1uyshu2jgv8w465yc8kkny36thlt2wvel89tcmg.key new file mode 100644 index 000000000..bcb2a6592 --- /dev/null +++ b/.hmy/keystore/one1uyshu2jgv8w465yc8kkny36thlt2wvel89tcmg.key @@ -0,0 +1 @@ +{"address":"e1217e2a4861dd5d50983dad32474bbfd6a7333f","crypto":{"cipher":"aes-128-ctr","ciphertext":"e72fbeb5d7eb21753a37ed234cf75b2072c7affa949c854b5ef8c24ab232b731","cipherparams":{"iv":"9df55b283ed837430a947786b66e69aa"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"3111c6b914ab658c97edef7db0069f4381f88089f930fad45f8cc28bccbc3579"},"mac":"e4fa036d3d708eb2aee5461baf462b46f6594e6510c076fb33f15876e7585052"},"id":"f759e357-61a6-4b00-b3a5-dfeb4b388663","version":3} \ No newline at end of file diff --git a/.hmy/keystore/one1z05g55zamqzfw9qs432n33gycdmyvs38xjemyl.key b/.hmy/keystore/one1z05g55zamqzfw9qs432n33gycdmyvs38xjemyl.key new file mode 100644 index 000000000..8179bc209 --- /dev/null +++ b/.hmy/keystore/one1z05g55zamqzfw9qs432n33gycdmyvs38xjemyl.key @@ -0,0 +1 @@ +{"address":"13e88a505dd804971410ac5538c504c376464227","crypto":{"cipher":"aes-128-ctr","ciphertext":"694b24ef862aa81153ef15aae2de5bff545dccda73fae1ead8c25d0bcfb79e4c","cipherparams":{"iv":"960d32ebf3fde022d5eb5a591a0e92f6"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"2a13a84c729472772170eac13d580578bb40c95456dc1863eac6495c54f95b96"},"mac":"8720e6860217fb91fd10c9e8f4c2f44de6f9034e3e9fe8dd14be9b2ecd80528a"},"id":"c4ee8751-112f-4538-b010-07163775bdf3","version":3} \ No newline at end of file diff --git a/.hmy/wallet.ini b/.hmy/wallet.ini index ba7fd59ef..d873fb57e 100644 --- a/.hmy/wallet.ini +++ b/.hmy/wallet.ini @@ -21,11 +21,17 @@ rpc = s3.t.hmny.io:14555 [local] bootnode = /ip4/127.0.0.1/tcp/19876/p2p/Qmc1V6W7BwX8Ugb42Ti8RnXF1rY5PF7nnZ6bKBryCgi6cv -shards = 1 +shards = 2 [local.shard0.rpc] rpc = 127.0.0.1:14555 +rpc = 127.0.0.1:14557 +rpc = 127.0.0.1:14559 + +[local.shard1.rpc] rpc = 127.0.0.1:14556 +rpc = 127.0.0.1:14558 +rpc = 127.0.0.1:14560 [devnet] bootnode = /ip4/100.26.90.187/tcp/9871/p2p/Qmdfjtk6hPoyrH1zVD9PEH4zfWLo38dP2mDvvKXfh3tnEv diff --git a/README.md b/README.md index 3b63cd83f..c79fcf56a 100644 --- a/README.md +++ b/README.md @@ -60,27 +60,23 @@ You can run the script `./scripts/go_executable_build.sh` to build all the exec ### Build individual executables -Initialize BLS -``` -source scripts/setup_bls_build_flags.sh -``` - Harmony server / main node: -``` -go build -o bin/harmony cmd/harmony/main.go +```bash +./scripts/go_executable_build.sh harmony + ``` Wallet: -``` -go build -o bin/wallet cmd/client/wallet/main.go +```bash +./scripts/go_executable_build.sh wallet ``` Tx Generator: -``` -go build -o bin/txgen cmd/client/txgen/main.go +```bash +./scripts/go_executable_build.sh txgen ``` ## Usage @@ -89,12 +85,24 @@ You may build the src/harmony.go locally and run local test. ### Running local test -The deploy.sh script creates a local environment of Harmony blockchain devnet based on the configuration file. +The debug.sh script calls test/deploy.sh script to create a local environment of Harmony blockchain devnet based on the configuration file. The configuration file configures number of nodes and their IP/Port. -The script starts one local beacon chain node, the blockchain nodes, and run a transactional generator program which generates and sends simulated transactions to the local blockchain. +The script starts 2 shards and 7 nodes in each shard. + +```bash +./test/debug.sh +``` + +### Test local blockchain +```bash +source scripts/setup_bls_build_flags.sh +./bin/wallet list +./bin/wallet -p local balances +``` +### Terminate the local blockchain ```bash -./test/deploy.sh ./test/configs/beaconchain40.txt +./test/kill_nodes.sh ``` ## Testing diff --git a/api/client/client.go b/api/client/client.go index 41e9de0d2..2c7f6a15c 100644 --- a/api/client/client.go +++ b/api/client/client.go @@ -1,9 +1,7 @@ package client import ( - "github.com/ethereum/go-ethereum/log" "github.com/harmony-one/harmony/core/types" - "github.com/harmony-one/harmony/internal/utils" "github.com/harmony-one/harmony/p2p" ) @@ -12,8 +10,6 @@ type Client struct { ShardID uint32 // ShardID UpdateBlocks func([]*types.Block) // Closure function used to sync new block with the leader. Once the leader finishes the consensus on a new block, it will send it to the clients. Clients use this method to update their blockchain - log log.Logger // Log utility - // The p2p host used to send/receive p2p messages host p2p.Host } @@ -23,7 +19,5 @@ func NewClient(host p2p.Host, shardID uint32) *Client { client := Client{} client.host = host client.ShardID = shardID - // Logger - client.log = utils.GetLogInstance() return &client } diff --git a/api/client/service/server.go b/api/client/service/server.go index 14f42d8d4..6f3def841 100644 --- a/api/client/service/server.go +++ b/api/client/service/server.go @@ -9,7 +9,6 @@ import ( proto "github.com/harmony-one/harmony/api/client/service/proto" "github.com/harmony-one/harmony/core/state" common2 "github.com/harmony-one/harmony/internal/common" - "github.com/harmony-one/harmony/internal/ctxerror" "github.com/harmony-one/harmony/internal/utils" "google.golang.org/grpc" @@ -70,7 +69,7 @@ func (s *Server) Start(ip, port string) (*grpc.Server, error) { proto.RegisterClientServiceServer(grpcServer, s) go func() { if err := grpcServer.Serve(lis); err != nil { - ctxerror.Warn(utils.GetLogger(), err, "grpcServer.Serve() failed") + utils.Logger().Warn().Err(err).Msg("grpcServer.Serve() failed") } }() return grpcServer, nil diff --git a/api/proto/discovery/pingpong.go b/api/proto/discovery/pingpong.go index dc74b4ca7..db899644c 100644 --- a/api/proto/discovery/pingpong.go +++ b/api/proto/discovery/pingpong.go @@ -111,7 +111,7 @@ func GetPingMessage(payload []byte) (*PingMessageType, error) { err := decoder.Decode(ping) if err != nil { - utils.GetLogInstance().Error("[GetPingMessage] Decode", "error", err) + utils.Logger().Error().Err(err).Msg("[GetPingMessage] Decode") return nil, fmt.Errorf("Decode Ping Error") } @@ -129,7 +129,7 @@ func GetPongMessage(payload []byte) (*PongMessageType, error) { err := decoder.Decode(pong) if err != nil { - utils.GetLogInstance().Error("[GetPongMessage] Decode", "error", err) + utils.Logger().Error().Err(err).Msg("[GetPongMessage] Decode") return nil, fmt.Errorf("Decode Pong Error") } @@ -144,7 +144,7 @@ func (p PingMessageType) ConstructPingMessage() []byte { encoder := gob.NewEncoder(byteBuffer) err := encoder.Encode(p) if err != nil { - utils.GetLogInstance().Error("[ConstructPingMessage] Encode", "error", err) + utils.Logger().Error().Err(err).Msg("[ConstructPingMessage] Encode") return nil } return byteBuffer.Bytes() @@ -158,7 +158,7 @@ func (p PongMessageType) ConstructPongMessage() []byte { encoder := gob.NewEncoder(byteBuffer) err := encoder.Encode(p) if err != nil { - utils.GetLogInstance().Error("[ConstructPongMessage] Encode", "error", err) + utils.Logger().Error().Err(err).Msg("[ConstructPongMessage] Encode") return nil } return byteBuffer.Bytes() diff --git a/api/proto/message/server.go b/api/proto/message/server.go index acb55be9b..ae6739382 100644 --- a/api/proto/message/server.go +++ b/api/proto/message/server.go @@ -10,7 +10,6 @@ import ( "net" "github.com/ethereum/go-ethereum/crypto" - "github.com/harmony-one/harmony/internal/ctxerror" "github.com/harmony-one/harmony/internal/utils" "google.golang.org/grpc" @@ -45,11 +44,11 @@ func (s *Server) Process(ctx context.Context, message *Message) (*Response, erro key, err := crypto.HexToECDSA(priKey) if err != nil { - utils.GetLogInstance().Error("Error when HexToECDSA") + utils.Logger().Error().Msg("Error when HexToECDSA") } address := crypto.PubkeyToAddress(key.PublicKey) - utils.GetLogInstance().Info("Enter:", "amount", amount, "for address", address) + utils.Logger().Info().Int64("amount", amount).Bytes("address", address[:]).Msg("Enter") if err := s.CreateTransactionForEnterMethod(amount, priKey); err != nil { return nil, ErrEnterMethod } @@ -60,7 +59,7 @@ func (s *Server) Process(ctx context.Context, message *Message) (*Response, erro for _, balance := range balances { stringBalances = append(stringBalances, balance.String()) } - utils.GetLogInstance().Info("getPlayers", "players", players, "balances", stringBalances) + utils.Logger().Info().Strs("players", players).Strs("balances", stringBalances).Msg("getPlayers") ret := &Response{ Response: &Response_LotteryResponse{ LotteryResponse: &LotteryResponse{ @@ -91,7 +90,7 @@ func (s *Server) Start() (*grpc.Server, error) { RegisterClientServiceServer(s.server, s) go func() { if err := s.server.Serve(lis); err != nil { - ctxerror.Warn(utils.GetLogger(), err, "server.Serve() failed") + utils.Logger().Warn().Err(err).Msg("server.Serve() failed") } }() return s.server, nil diff --git a/api/proto/node/node.go b/api/proto/node/node.go index 89baecee5..3ee002b6c 100644 --- a/api/proto/node/node.go +++ b/api/proto/node/node.go @@ -104,8 +104,7 @@ func SerializeBlockchainSyncMessage(blockchainSyncMessage *BlockchainSyncMessage encoder := gob.NewEncoder(&result) err := encoder.Encode(blockchainSyncMessage) if err != nil { - utils.GetLogger().Crit("Error", err) - panic(err) + utils.Logger().Error().Err(err).Msg("Failed to serialize blockchain sync message") } return result.Bytes() } @@ -116,7 +115,7 @@ func DeserializeBlockchainSyncMessage(d []byte) (*BlockchainSyncMessage, error) decoder := gob.NewDecoder(bytes.NewReader(d)) err := decoder.Decode(&blockchainSyncMessage) if err != nil { - utils.GetLogger().Crit("Error", err) + utils.Logger().Error().Err(err).Msg("Failed to deserialize blockchain sync message") } return &blockchainSyncMessage, err } @@ -166,7 +165,7 @@ func ConstructEpochShardStateMessage(epochShardState types.EpochShardState) []by encoder := gob.NewEncoder(byteBuffer) err := encoder.Encode(epochShardState) if err != nil { - utils.GetLogInstance().Error("[ConstructEpochShardStateMessage] Encode", "error", err) + utils.Logger().Error().Err(err).Msg("[ConstructEpochShardStateMessage] Encode") return nil } return byteBuffer.Bytes() @@ -181,7 +180,7 @@ func DeserializeEpochShardStateFromMessage(payload []byte) (*types.EpochShardSta err := decoder.Decode(epochShardState) if err != nil { - utils.GetLogInstance().Error("[GetEpochShardStateFromMessage] Decode", "error", err) + utils.Logger().Error().Err(err).Msg("[GetEpochShardStateFromMessage] Decode") return nil, fmt.Errorf("Decode epoch shard state Error") } diff --git a/api/service/blockproposal/service.go b/api/service/blockproposal/service.go index 14ef89238..ad163d9bb 100644 --- a/api/service/blockproposal/service.go +++ b/api/service/blockproposal/service.go @@ -40,10 +40,10 @@ func (s *Service) Run(stopChan chan struct{}, stoppedChan chan struct{}) { // StopService stops block proposal service. func (s *Service) StopService() { - utils.GetLogInstance().Info("Stopping block proposal service.") + utils.Logger().Info().Msg("Stopping block proposal service.") s.stopChan <- struct{}{} <-s.stoppedChan - utils.GetLogInstance().Info("Role conversion stopped.") + utils.Logger().Info().Msg("Role conversion stopped.") } // NotifyService notify service diff --git a/api/service/config.go b/api/service/config.go index 84a3fd58a..4fcb94247 100644 --- a/api/service/config.go +++ b/api/service/config.go @@ -16,7 +16,6 @@ type NodeConfig struct { Client p2p.GroupID // the client group ID of the shard IsClient bool // whether this node is a client node, such as wallet/txgen IsBeacon bool // whether this node is a beacon node or not - IsLeader bool // whether this node is a leader or not ShardID uint32 // shardID of this node Actions map[p2p.GroupID]p2p.ActionType // actions on the groups } diff --git a/api/service/consensus/service.go b/api/service/consensus/service.go index 44b80f80c..86b04d22a 100644 --- a/api/service/consensus/service.go +++ b/api/service/consensus/service.go @@ -25,7 +25,7 @@ func New(blockChannel chan *types.Block, consensus *consensus.Consensus, startCh // StartService starts consensus service. func (s *Service) StartService() { - utils.GetLogInstance().Info("[consensus/service] Starting consensus service.") + utils.Logger().Info().Msg("[consensus/service] Starting consensus service.") s.stopChan = make(chan struct{}) s.stoppedChan = make(chan struct{}) s.consensus.Start(s.blockChannel, s.stopChan, s.stoppedChan, s.startChan) @@ -34,10 +34,10 @@ func (s *Service) StartService() { // StopService stops consensus service. func (s *Service) StopService() { - utils.GetLogInstance().Info("Stopping consensus service.") + utils.Logger().Info().Msg("Stopping consensus service.") s.stopChan <- struct{}{} <-s.stoppedChan - utils.GetLogInstance().Info("Consensus service stopped.") + utils.Logger().Info().Msg("Consensus service stopped.") } // NotifyService notify service diff --git a/api/service/discovery/service.go b/api/service/discovery/service.go index 67f886903..31cdaca01 100644 --- a/api/service/discovery/service.go +++ b/api/service/discovery/service.go @@ -42,16 +42,16 @@ func New(h p2p.Host, config service.NodeConfig, peerChan chan p2p.Peer, addPeer // StartService starts discovery service. func (s *Service) StartService() { - utils.GetLogInstance().Info("Starting discovery service.") + utils.Logger().Info().Msg("Starting discovery service") s.Init() s.Run() } // StopService shutdowns discovery service. func (s *Service) StopService() { - utils.GetLogInstance().Info("Shutting down discovery service.") + utils.Logger().Info().Msg("Shutting down discovery service") s.stopChan <- struct{}{} - utils.GetLogInstance().Info("discovery service stopped.") + utils.Logger().Info().Msg("discovery service stopped") } // NotifyService receives notification from service manager @@ -59,11 +59,11 @@ func (s *Service) NotifyService(params map[string]interface{}) { data := params["peer"] action, ok := data.(p2p.GroupAction) if !ok { - utils.GetLogInstance().Error("Wrong data type passed to NotifyService") + utils.Logger().Error().Msg("Wrong data type passed to NotifyService") return } - utils.GetLogInstance().Info("[DISCOVERY]", "got notified", action) + utils.Logger().Info().Interface("got notified", action).Msg("[DISCOVERY]") s.actionChan <- action } @@ -77,7 +77,7 @@ func (s *Service) contactP2pPeers() { pingMsg := proto_discovery.NewPingMessage(s.host.GetSelfPeer(), s.config.IsClient) - utils.GetLogInstance().Info("Constructing Ping Message", "myPing", pingMsg) + utils.Logger().Info().Interface("myPing", pingMsg).Msg("Constructing Ping Message") msgBuf := host.ConstructP2pMessage(byte(0), pingMsg.ConstructPingMessage()) s.sentPingMessage(s.config.ShardGroupID, msgBuf) @@ -85,7 +85,7 @@ func (s *Service) contactP2pPeers() { select { case peer, ok := <-s.peerChan: if !ok { - utils.GetLogInstance().Debug("[DISCOVERY] No More Peer!") + utils.Logger().Debug().Msg("[DISCOVERY] No More Peer!") break } // TODO (leo) this one assumes all peers received in the channel are beacon chain node @@ -97,9 +97,9 @@ func (s *Service) contactP2pPeers() { } // Add to outgoing peer list // s.host.AddOutgoingPeer(peer) - // utils.GetLogInstance().Debug("[DISCOVERY]", "add outgoing peer", peer) + // utils.Logger().Debug().Interface("add outgoing peer", peer).Msg("[DISCOVERY]") case <-s.stopChan: - utils.GetLogInstance().Debug("[DISCOVERY] stop pinging ...") + utils.Logger().Debug().Msg("[DISCOVERY] stop pinging ...") return case action := <-s.actionChan: s.config.Actions[action.Name] = action.Action @@ -135,13 +135,13 @@ func (s *Service) sentPingMessage(g p2p.GroupID, msgBuf []byte) { err = s.host.SendMessageToGroups([]p2p.GroupID{s.config.ShardGroupID}, msgBuf) } if err != nil { - utils.GetLogInstance().Error("Failed to send ping message", "group", g) + utils.Logger().Error().Str("group", string(g)).Msg("Failed to send ping message") } } // Init is to initialize for discoveryService. func (s *Service) Init() { - utils.GetLogInstance().Info("Init discovery service") + utils.Logger().Info().Msg("Init discovery service") } // SetMessageChan sets up message channel to service. diff --git a/api/service/explorer/service.go b/api/service/explorer/service.go index 13f9a13a6..868601983 100644 --- a/api/service/explorer/service.go +++ b/api/service/explorer/service.go @@ -59,18 +59,18 @@ func New(selfPeer *p2p.Peer, GetNodeIDs func() []libp2p_peer.ID, GetAccountBalan // StartService starts explorer service. func (s *Service) StartService() { - utils.GetLogInstance().Info("Starting explorer service.") + utils.Logger().Info().Msg("Starting explorer service.") s.Init(true) s.server = s.Run() } // StopService shutdowns explorer service. func (s *Service) StopService() { - utils.GetLogInstance().Info("Shutting down explorer service.") + utils.Logger().Info().Msg("Shutting down explorer service.") if err := s.server.Shutdown(context.Background()); err != nil { - utils.GetLogInstance().Error("Error when shutting down explorer server", "error", err) + utils.Logger().Error().Err(err).Msg("Error when shutting down explorer server") } else { - utils.GetLogInstance().Info("Shutting down explorer server successufully") + utils.Logger().Info().Msg("Shutting down explorer server successufully") } } @@ -79,7 +79,7 @@ func GetExplorerPort(nodePort string) string { if port, err := strconv.Atoi(nodePort); err == nil { return fmt.Sprintf("%d", port-explorerPortDifference) } - utils.GetLogInstance().Error("error on parsing.") + utils.Logger().Error().Msg("error on parsing.") return "" } @@ -115,11 +115,11 @@ func (s *Service) Run() *http.Server { s.router.Path("/shard").HandlerFunc(s.GetExplorerShard) // Do serving now. - utils.GetLogInstance().Info("Listening on ", "port: ", GetExplorerPort(s.Port)) + utils.Logger().Info().Str("port", GetExplorerPort(s.Port)).Msg("Listening") server := &http.Server{Addr: addr, Handler: s.router} go func() { if err := server.ListenAndServe(); err != nil { - ctxerror.Warn(utils.GetLogger(), err, "server.ListenAndServe()") + utils.Logger().Warn().Err(err).Msg("server.ListenAndServe()") } }() return server @@ -141,7 +141,7 @@ func (s *Service) ReadBlocksFromDB(from, to int) []*types.Block { } block := new(types.Block) if rlp.DecodeBytes(data, block) != nil { - utils.GetLogInstance().Error("Error on getting from db") + utils.Logger().Error().Msg("Error on getting from db") os.Exit(1) } blocks = append(blocks, block) @@ -160,8 +160,7 @@ func (s *Service) GetExplorerBlocks(w http.ResponseWriter, r *http.Request) { } defer func() { if err := json.NewEncoder(w).Encode(data.Blocks); err != nil { - ctxerror.Warn(utils.WithCallerSkip(utils.GetLogInstance(), 1), err, - "cannot JSON-encode blocks") + utils.Logger().Warn().Err(err).Msg("cannot JSON-encode blocks") } }() @@ -171,8 +170,7 @@ func (s *Service) GetExplorerBlocks(w http.ResponseWriter, r *http.Request) { db := s.storage.GetDB() fromInt, err := strconv.Atoi(from) if err != nil { - ctxerror.Warn(utils.GetLogger(), err, "invalid from parameter", - "from", from) + utils.Logger().Warn().Err(err).Str("from", from).Msg("invalid from parameter") return } var toInt int @@ -188,7 +186,7 @@ func (s *Service) GetExplorerBlocks(w http.ResponseWriter, r *http.Request) { toInt, err = strconv.Atoi(to) } if err != nil { - ctxerror.Warn(utils.GetLogger(), err, "invalid to parameter", "to", to) + utils.Logger().Warn().Err(err).Str("to", to).Msg("invalid to parameter") return } @@ -240,8 +238,7 @@ func (s *Service) GetExplorerTransaction(w http.ResponseWriter, r *http.Request) data := &Data{} defer func() { if err := json.NewEncoder(w).Encode(data.TX); err != nil { - ctxerror.Warn(utils.WithCallerSkip(utils.GetLogInstance(), 1), err, - "cannot JSON-encode TX") + utils.Logger().Warn().Err(err).Msg("cannot JSON-encode TX") } }() if id == "" { @@ -250,12 +247,12 @@ func (s *Service) GetExplorerTransaction(w http.ResponseWriter, r *http.Request) db := s.storage.GetDB() bytes, err := db.Get([]byte(GetTXKey(id))) if err != nil { - ctxerror.Warn(utils.GetLogger(), err, "cannot read TX", "id", id) + utils.Logger().Warn().Err(err).Str("id", id).Msg("cannot read TX") return } tx := new(Transaction) if rlp.DecodeBytes(bytes, tx) != nil { - utils.GetLogger().Warn("cannot convert data from DB", "id", id) + utils.Logger().Warn().Str("id", id).Msg("cannot convert data from DB") return } data.TX = *tx @@ -267,7 +264,7 @@ func (s *Service) GetExplorerAddress(w http.ResponseWriter, r *http.Request) { id := r.FormValue("id") key := GetAddressKey(id) - utils.GetLogInstance().Info("Querying address", "address", id) + utils.Logger().Info().Str("address", id).Msg("Querying address") data := &Data{} defer func() { if err := json.NewEncoder(w).Encode(data.Address); err != nil { @@ -292,11 +289,11 @@ func (s *Service) GetExplorerAddress(w http.ResponseWriter, r *http.Request) { db := s.storage.GetDB() bytes, err := db.Get([]byte(key)) if err != nil { - ctxerror.Warn(utils.GetLogger(), err, "cannot read address from db", "id", id) + utils.Logger().Warn().Err(err).Str("id", id).Msg("cannot read address from db") return } if err = rlp.DecodeBytes(bytes, &data.Address); err != nil { - utils.GetLogger().Warn("cannot convert data from DB", "id", id) + utils.Logger().Warn().Str("id", id).Msg("cannot convert data from DB") return } } @@ -305,7 +302,7 @@ func (s *Service) GetExplorerAddress(w http.ResponseWriter, r *http.Request) { func (s *Service) GetExplorerNodeCount(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") if err := json.NewEncoder(w).Encode(len(s.GetNodeIDs())); err != nil { - ctxerror.Warn(utils.GetLogger(), err, "cannot JSON-encode node count") + utils.Logger().Warn().Msg("cannot JSON-encode node count") } } @@ -319,7 +316,7 @@ func (s *Service) GetExplorerShard(w http.ResponseWriter, r *http.Request) { }) } if err := json.NewEncoder(w).Encode(Shard{Nodes: nodes}); err != nil { - ctxerror.Warn(utils.GetLogger(), err, "cannot JSON-encode shard info") + utils.Logger().Warn().Msg("cannot JSON-encode shard info") } } diff --git a/api/service/explorer/storage.go b/api/service/explorer/storage.go index 5b3b2c136..981e3c764 100644 --- a/api/service/explorer/storage.go +++ b/api/service/explorer/storage.go @@ -67,11 +67,11 @@ func (storage *Storage) Init(ip, port string, remove bool) { if remove { var err = os.RemoveAll(dbFileName) if err != nil { - utils.GetLogInstance().Error(err.Error()) + utils.Logger().Error().Err(err).Msg("Failed to remove existing database files") } } if storage.db, err = ethdb.NewLDBDatabase(dbFileName, 0, 0); err != nil { - utils.GetLogInstance().Error(err.Error()) + utils.Logger().Error().Err(err).Msg("Failed to create new database") } } @@ -82,7 +82,7 @@ func (storage *Storage) GetDB() *ethdb.LDBDatabase { // Dump extracts information from block and index them into lvdb for explorer. func (storage *Storage) Dump(block *types.Block, height uint64) { - utils.GetLogInstance().Info("Dumping block ", "block height", height) + utils.Logger().Info().Uint64("block height", height).Msg("Dumping block") if block == nil { return } @@ -90,17 +90,17 @@ func (storage *Storage) Dump(block *types.Block, height uint64) { batch := storage.db.NewBatch() // Update block height. if err := batch.Put([]byte(BlockHeightKey), []byte(strconv.Itoa(int(height)))); err != nil { - ctxerror.Warn(utils.GetLogger(), err, "cannot batch block height") + utils.Logger().Warn().Err(err).Msg("cannot batch block height") } // Store block. blockData, err := rlp.EncodeToBytes(block) if err == nil { if err := batch.Put([]byte(GetBlockKey(int(height))), blockData); err != nil { - ctxerror.Warn(utils.GetLogger(), err, "cannot batch block data") + utils.Logger().Warn().Err(err).Msg("cannot batch block data") } } else { - utils.GetLogInstance().Debug("Failed to serialize block ", "error", err) + utils.Logger().Error().Err(err).Msg("Failed to serialize block") } // Store txs @@ -123,10 +123,10 @@ func (storage *Storage) UpdateTXStorage(batch ethdb.Batch, explorerTransaction * if data, err := rlp.EncodeToBytes(explorerTransaction); err == nil { key := GetTXKey(tx.Hash().Hex()) if err := batch.Put([]byte(key), data); err != nil { - ctxerror.Warn(utils.GetLogger(), err, "cannot batch TX") + utils.Logger().Warn().Err(err).Msg("cannot batch TX") } } else { - utils.GetLogInstance().Error("EncodeRLP transaction error") + utils.Logger().Error().Msg("EncodeRLP transaction error") } } @@ -146,18 +146,19 @@ func (storage *Storage) UpdateAddressStorage(batch ethdb.Batch, adr string, expl if err == nil { address.Balance.Add(address.Balance, tx.Value()) } else { - utils.GetLogInstance().Error("Failed to error", "err", err) + utils.Logger().Error().Err(err).Msg("Failed to error") } } else { address.Balance = tx.Value() } address.ID = adr address.TXs = append(address.TXs, explorerTransaction) - if encoded, err := rlp.EncodeToBytes(address); err == nil { + encoded, err := rlp.EncodeToBytes(address) + if err == nil { if err := batch.Put([]byte(key), encoded); err != nil { - ctxerror.Warn(utils.GetLogger(), err, "cannot batch address") + utils.Logger().Warn().Err(err).Msg("cannot batch address") } } else { - utils.GetLogInstance().Error("Can not encode address account.") + utils.Logger().Error().Err(err).Msg("cannot encode address account") } } diff --git a/api/service/explorer/structs.go b/api/service/explorer/structs.go index 60f521124..bcec2fa7f 100644 --- a/api/service/explorer/structs.go +++ b/api/service/explorer/structs.go @@ -92,7 +92,7 @@ func GetTransaction(tx *types.Transaction, accountBlock *types.Block) *Transacti } msg, err := tx.AsMessage(types.HomesteadSigner{}) if err != nil { - utils.GetLogger().Error("Error when parsing tx into message", "err", err) + utils.Logger().Error().Err(err).Msg("Error when parsing tx into message") } return &Transaction{ ID: tx.Hash().Hex(), diff --git a/api/service/manager.go b/api/service/manager.go index f9f35e9c3..a97a32f8e 100644 --- a/api/service/manager.go +++ b/api/service/manager.go @@ -105,12 +105,12 @@ func (m *Manager) GetServices() map[Type]Interface { // Register registers new service to service store. func (m *Manager) Register(t Type, service Interface) { - utils.GetLogInstance().Info("Register Service", "service", t) + utils.Logger().Info().Int("service", int(t)).Msg("Register Service") if m.services == nil { m.services = make(map[Type]Interface) } if _, ok := m.services[t]; ok { - utils.GetLogInstance().Error("This service is already included: ", "servie", t) + utils.Logger().Error().Int("servie", int(t)).Msg("This service is already included") return } m.services[t] = service @@ -140,7 +140,7 @@ func (m *Manager) SendAction(action *Action) { // TakeAction is how service manager handles the action. func (m *Manager) TakeAction(action *Action) { if m.services == nil { - utils.GetLogInstance().Error("Service store is not initialized.") + utils.Logger().Error().Msg("Service store is not initialized") return } if service, ok := m.services[action.ServiceType]; ok { @@ -167,7 +167,7 @@ func (m *Manager) StartServiceManager() chan *Action { return } case <-time.After(WaitForStatusUpdate): - utils.GetLogInstance().Info("Waiting for new action.") + utils.Logger().Info().Msg("Waiting for new action") } } }() diff --git a/api/service/networkinfo/service.go b/api/service/networkinfo/service.go index a85fcd6d2..c4734e599 100644 --- a/api/service/networkinfo/service.go +++ b/api/service/networkinfo/service.go @@ -79,7 +79,7 @@ func New(h p2p.Host, rendezvous p2p.GroupID, peerChan chan p2p.Peer, bootnodes u func (s *Service) StartService() { err := s.Init() if err != nil { - utils.GetLogInstance().Error("Service Init Failed", "error", err) + utils.Logger().Error().Err(err).Msg("Service Init Failed") return } s.Run() @@ -88,11 +88,11 @@ func (s *Service) StartService() { // Init initializes role conversion service. func (s *Service) Init() error { - utils.GetLogInstance().Info("Init networkinfo service") + utils.Logger().Info().Msg("Init networkinfo service") // Bootstrap the DHT. In the default configuration, this spawns a Background // thread that will refresh the peer table every five minutes. - utils.GetLogInstance().Debug("Bootstrapping the DHT") + utils.Logger().Debug().Msg("Bootstrapping the DHT") if err := s.dht.Bootstrap(ctx); err != nil { return fmt.Errorf("error bootstrap dht: %s", err) } @@ -111,10 +111,10 @@ func (s *Service) Init() error { defer wg.Done() for i := 0; i < ConnectionRetry; i++ { if err := s.Host.GetP2PHost().Connect(ctx, *peerinfo); err != nil { - utils.GetLogInstance().Warn("can't connect to bootnode", "error", err, "try", i) + utils.Logger().Warn().Err(err).Int("try", i).Msg("can't connect to bootnode") time.Sleep(waitInRetry) } else { - utils.GetLogInstance().Info("connected to bootnode", "node", *peerinfo, "try", i) + utils.Logger().Info().Int("try", i).Interface("node", *peerinfo).Msg("connected to bootnode") // it is okay if any bootnode is connected connected = true break @@ -129,10 +129,10 @@ func (s *Service) Init() error { } // We use a rendezvous point "shardID" to announce our location. - utils.GetLogInstance().Info("Announcing ourselves...", "Rendezvous", string(s.Rendezvous)) + utils.Logger().Info().Str("Rendezvous", string(s.Rendezvous)).Msg("Announcing ourselves...") s.discovery = libp2pdis.NewRoutingDiscovery(s.dht) libp2pdis.Advertise(ctx, s.discovery, string(s.Rendezvous)) - utils.GetLogInstance().Info("Successfully announced!") + utils.Logger().Info().Msg("Successfully announced!") return nil } @@ -141,7 +141,7 @@ func (s *Service) Init() error { func (s *Service) Run() { defer close(s.stoppedChan) if s.discovery == nil { - utils.GetLogInstance().Error("discovery is not initialized") + utils.Logger().Error().Msg("discovery is not initialized") return } @@ -157,12 +157,12 @@ func (s *Service) DoService() { return case <-tick.C: libp2pdis.Advertise(ctx, s.discovery, string(s.Rendezvous)) - utils.GetLogInstance().Info("Successfully announced!", "Rendezvous", string(s.Rendezvous)) + utils.Logger().Info().Str("Rendezvous", string(s.Rendezvous)).Msg("Successfully announced!") default: var err error s.peerInfo, err = s.discovery.FindPeers(ctx, string(s.Rendezvous)) if err != nil { - utils.GetLogInstance().Error("FindPeers", "error", err) + utils.Logger().Error().Err(err).Msg("FindPeers") return } @@ -175,18 +175,22 @@ func (s *Service) DoService() { func (s *Service) findPeers() { _, cgnPrefix, err := net.ParseCIDR("100.64.0.0/10") if err != nil { - utils.GetLogInstance().Error("can't parse CIDR", "error", err) + utils.Logger().Error().Err(err).Msg("can't parse CIDR") return } for peer := range s.peerInfo { if peer.ID != s.Host.GetP2PHost().ID() && len(peer.ID) > 0 { - // utils.GetLogInstance().Info("Found Peer", "peer", peer.ID, "addr", peer.Addrs, "my ID", s.Host.GetP2PHost().ID()) + // utils.Logger().Info(). + // Interface("peer", peer.ID). + // Interface("addr", peer.Addrs). + // Interface("my ID", s.Host.GetP2PHost().ID()). + // Msg("Found Peer") if err := s.Host.GetP2PHost().Connect(ctx, peer); err != nil { - utils.GetLogInstance().Warn("can't connect to peer node", "error", err, "peer", peer) + utils.Logger().Warn().Err(err).Interface("peer", peer).Msg("can't connect to peer node") // break if the node can't connect to peers, waiting for another peer break } else { - utils.GetLogInstance().Info("connected to peer node", "peer", peer) + utils.Logger().Info().Interface("peer", peer).Msg("connected to peer node") } // figure out the public ip/port var ip, port string @@ -204,30 +208,30 @@ func (s *Service) findPeers() { } } p := p2p.Peer{IP: ip, Port: port, PeerID: peer.ID, Addrs: peer.Addrs} - utils.GetLogInstance().Info("Notify peerChan", "peer", p) + utils.Logger().Info().Interface("peer", p).Msg("Notify peerChan") if s.peerChan != nil { s.peerChan <- p } } } - utils.GetLogInstance().Info("PeerInfo Channel Closed.") + utils.Logger().Info().Msg("PeerInfo Channel Closed") return } // StopService stops network info service. func (s *Service) StopService() { - utils.GetLogInstance().Info("Stopping network info service.") + utils.Logger().Info().Msg("Stopping network info service") defer s.cancel() if !s.started { - utils.GetLogInstance().Info("Service didn't started. Exit.") + utils.Logger().Info().Msg("Service didn't started. Exit") return } s.stopChan <- struct{}{} <-s.stoppedChan - utils.GetLogInstance().Info("Network info service stopped.") + utils.Logger().Info().Msg("Network info service stopped") } // NotifyService notify service diff --git a/api/service/randomness/service.go b/api/service/randomness/service.go index 8fb11513b..3b788b02e 100644 --- a/api/service/randomness/service.go +++ b/api/service/randomness/service.go @@ -29,10 +29,10 @@ func (s *Service) StartService() { // StopService stops randomness generation service. func (s *Service) StopService() { - utils.GetLogInstance().Info("Stopping random generation service.") + utils.Logger().Info().Msg("Stopping random generation service") s.stopChan <- struct{}{} <-s.stoppedChan - utils.GetLogInstance().Info("Random generation stopped.") + utils.Logger().Info().Msg("Random generation stopped") } // NotifyService notify service diff --git a/api/service/resharding/service.go b/api/service/resharding/service.go index 2cb04571d..c15660bdd 100644 --- a/api/service/resharding/service.go +++ b/api/service/resharding/service.go @@ -47,7 +47,7 @@ func (s *Service) Run(stopChan chan struct{}, stoppedChan chan struct{}) { for { select { default: - utils.GetLogInstance().Info("Running role conversion") + utils.Logger().Info().Msg("Running role conversion") // TODO: Write some logic here. s.DoService() case <-stopChan: @@ -75,10 +75,10 @@ func (s *Service) DoService() { // StopService stops role conversion service. func (s *Service) StopService() { - utils.GetLogInstance().Info("Stopping role conversion service.") + utils.Logger().Info().Msg("Stopping role conversion service") s.stopChan <- struct{}{} <-s.stoppedChan - utils.GetLogInstance().Info("Role conversion stopped.") + utils.Logger().Info().Msg("Role conversion stopped") } // NotifyService notify service diff --git a/api/service/staking/service.go b/api/service/staking/service.go index e96b9d4dc..cb0383fbd 100644 --- a/api/service/staking/service.go +++ b/api/service/staking/service.go @@ -24,7 +24,6 @@ import ( "github.com/harmony-one/harmony/core" "github.com/harmony-one/harmony/core/types" common2 "github.com/harmony-one/harmony/internal/common" - "github.com/harmony-one/harmony/internal/ctxerror" "github.com/harmony-one/harmony/internal/genesis" hmykey "github.com/harmony-one/harmony/internal/keystore" "github.com/harmony-one/harmony/internal/utils" @@ -73,7 +72,7 @@ func New(host p2p.Host, account accounts.Account, beaconChain *core.BlockChain, // StartService starts staking service. func (s *Service) StartService() { - utils.GetLogger().Info("Start Staking Service") + utils.Logger().Info().Msg("Start Staking Service") s.Run() } @@ -108,20 +107,20 @@ func (s *Service) IsStaked() bool { // DoService does staking. func (s *Service) DoService() { - utils.GetLogInstance().Info("Trying to send a staking transaction.") + utils.Logger().Info().Msg("Trying to send a staking transaction.") // TODO: no need to sync beacon chain to stake //if s.beaconChain == nil { - // utils.GetLogInstance().Info("Can not send a staking transaction because of nil beacon chain.") + // utils.Logger().Info().Msg("Can not send a staking transaction because of nil beacon chain.") // return //} if msg := s.createStakingMessage(); msg == nil { - utils.GetLogInstance().Error("Can not create staking transaction") + utils.Logger().Error().Msg("Can not create staking transaction") } else if err := s.host.SendMessageToGroups([]p2p.GroupID{p2p.GroupIDBeacon}, host.ConstructP2pMessage(byte(17), msg)); err != nil { - ctxerror.Warn(utils.GetLogger(), err, "cannot send staking message") + utils.Logger().Warn().Err(err).Msg("cannot send staking message") } else { - utils.GetLogInstance().Info("Sent staking transaction to the network.") + utils.Logger().Info().Msg("Sent staking transaction to the network.") } } @@ -129,17 +128,17 @@ func (s *Service) getStakingInfo() *proto.StakingContractInfoResponse { address := s.account.Address state, err := s.beaconChain.State() if err != nil { - utils.GetLogInstance().Error("error to get beacon chain state when getting staking info") + utils.Logger().Error().Msg("error to get beacon chain state when getting staking info") return nil } balance := state.GetBalance(address) if balance == common.Big0 { - utils.GetLogInstance().Error("account balance empty when getting staking info") + utils.Logger().Error().Msg("account balance empty when getting staking info") return nil } nonce := state.GetNonce(address) if nonce == 0 { - utils.GetLogInstance().Error("nonce zero when getting staking info") + utils.Logger().Error().Msg("nonce zero when getting staking info") return nil } return &proto.StakingContractInfoResponse{ @@ -181,7 +180,7 @@ func constructStakingMessage(ts types.Transactions) []byte { return data } } - utils.GetLogInstance().Error("Error when creating staking message", "error", err) + utils.Logger().Error().Err(err).Msg("Error when creating staking message") return nil } @@ -192,12 +191,12 @@ func (s *Service) createRawStakingMessage() []byte { abi, err := abi.JSON(strings.NewReader(contracts.StakeLockContractABI)) if err != nil { - utils.GetLogInstance().Error("Failed to generate staking contract's ABI", "error", err) + utils.Logger().Error().Err(err).Msg("Failed to generate staking contract's ABI") } // TODO: the bls address should be signed by the bls private key blsPubKeyBytes := s.blsPublicKey.Serialize() if len(blsPubKeyBytes) != 96 { - utils.GetLogInstance().Error("Wrong bls pubkey size", "size", len(blsPubKeyBytes)) + utils.Logger().Error().Int("size", len(blsPubKeyBytes)).Msg("Wrong bls pubkey size") return []byte{} } blsPubKeyPart1 := [32]byte{} @@ -209,7 +208,7 @@ func (s *Service) createRawStakingMessage() []byte { bytesData, err := abi.Pack("lock", blsPubKeyPart1, blsPubKeyPart2, blsPubKeyPart3) if err != nil { - utils.GetLogInstance().Error("Failed to generate ABI function bytes data", "error", err) + utils.Logger().Error().Err(err).Msg("Failed to generate ABI function bytes data") } tx := types.NewTransaction( @@ -240,10 +239,10 @@ func (s *Service) createStakingMessage() []byte { // StopService stops staking service. func (s *Service) StopService() { - utils.GetLogInstance().Info("Stopping staking service.") + utils.Logger().Info().Msg("Stopping staking service.") s.stopChan <- struct{}{} <-s.stoppedChan - utils.GetLogInstance().Info("Role conversion stopped.") + utils.Logger().Info().Msg("Role conversion stopped.") } // NotifyService notify service diff --git a/api/service/syncing/downloader/client.go b/api/service/syncing/downloader/client.go index ba359efa9..20b3e2302 100644 --- a/api/service/syncing/downloader/client.go +++ b/api/service/syncing/downloader/client.go @@ -24,10 +24,10 @@ func ClientSetup(ip, port string) *Client { var err error client.conn, err = grpc.Dial(fmt.Sprintf(ip+":"+port), client.opts...) if err != nil { - utils.GetLogInstance().Info("[SYNC] client.go:ClientSetup fail to dial: ", "IP", ip, "error", err) + utils.Logger().Error().Err(err).Str("ip", ip).Msg("[SYNC] client.go:ClientSetup fail to dial") return nil } - utils.GetLogInstance().Info("[SYNC] grpc connect successfully", "IP", ip) + utils.Logger().Info().Str("ip", ip).Msg("[SYNC] grpc connect successfully") client.dlClient = pb.NewDownloaderClient(client.conn) return &client } @@ -36,7 +36,7 @@ func ClientSetup(ip, port string) *Client { func (client *Client) Close() { err := client.conn.Close() if err != nil { - utils.GetLogInstance().Info("[SYNC] unable to close connection ") + utils.Logger().Info().Msg("[SYNC] unable to close connection") } } @@ -47,7 +47,7 @@ func (client *Client) GetBlockHashes(startHash []byte, size uint32) *pb.Download request := &pb.DownloaderRequest{Type: pb.DownloaderRequest_HEADER, BlockHash: startHash, Size: size} response, err := client.dlClient.Query(ctx, request) if err != nil { - utils.GetLogInstance().Info("[SYNC] GetBlockHashes query failed", "error", err) + utils.Logger().Error().Err(err).Msg("[SYNC] GetBlockHashes query failed") } return response } @@ -64,7 +64,7 @@ func (client *Client) GetBlocks(hashes [][]byte) *pb.DownloaderResponse { } response, err := client.dlClient.Query(ctx, request) if err != nil { - utils.GetLogInstance().Info("[SYNC] downloader/client.go:GetBlocks query failed.", "error", err) + utils.Logger().Error().Err(err).Msg("[SYNC] downloader/client.go:GetBlocks query failed") } return response } @@ -81,7 +81,7 @@ func (client *Client) Register(hash []byte, ip, port string) *pb.DownloaderRespo request.Port = port response, err := client.dlClient.Query(ctx, request) if err != nil || response == nil { - utils.GetLogInstance().Info("[SYNC] client.go:Register failed.", "error", err, "response", response) + utils.Logger().Error().Err(err).Interface("response", response).Msg("[SYNC] client.go:Register failed") } return response } @@ -103,7 +103,7 @@ func (client *Client) PushNewBlock(selfPeerHash [20]byte, blockHash []byte, time response, err := client.dlClient.Query(ctx, request) if err != nil { - utils.GetLogInstance().Info("[SYNC] unable to send new block to unsync node", "error", err) + utils.Logger().Error().Err(err).Msg("[SYNC] unable to send new block to unsync node") } return response } @@ -115,7 +115,7 @@ func (client *Client) GetBlockChainHeight() *pb.DownloaderResponse { request := &pb.DownloaderRequest{Type: pb.DownloaderRequest_BLOCKHEIGHT} response, err := client.dlClient.Query(ctx, request) if err != nil { - utils.GetLogInstance().Info("[SYNC] unable to get blockchain height", "error", err) + utils.Logger().Error().Err(err).Msg("[SYNC] unable to get blockchain height") } return response } diff --git a/api/service/syncing/downloader/server.go b/api/service/syncing/downloader/server.go index 1d1085d07..fb3548681 100644 --- a/api/service/syncing/downloader/server.go +++ b/api/service/syncing/downloader/server.go @@ -6,7 +6,6 @@ import ( "net" pb "github.com/harmony-one/harmony/api/service/syncing/downloader/proto" - "github.com/harmony-one/harmony/internal/ctxerror" "github.com/harmony-one/harmony/internal/utils" "google.golang.org/grpc" @@ -44,7 +43,7 @@ func (s *Server) Start(ip, port string) (*grpc.Server, error) { pb.RegisterDownloaderServer(grpcServer, s) go func() { if err := grpcServer.Serve(lis); err != nil { - ctxerror.Warn(utils.GetLogger(), err, "[SYNC] (*grpc.Server).Serve failed") + utils.Logger().Warn().Err(err).Msg("[SYNC] (*grpc.Server).Serve failed") } }() diff --git a/api/service/syncing/syncing.go b/api/service/syncing/syncing.go index 69976a857..fd45bf9e8 100644 --- a/api/service/syncing/syncing.go +++ b/api/service/syncing/syncing.go @@ -169,7 +169,10 @@ func (ss *StateSync) AddNewBlock(peerHash []byte, block *types.Block) { pc.mux.Lock() defer pc.mux.Unlock() pc.newBlocks = append(pc.newBlocks, block) - utils.GetLogInstance().Debug("[SYNC] new block received", "total", len(pc.newBlocks), "blockHeight", block.NumberU64()) + utils.Logger().Debug(). + Int("total", len(pc.newBlocks)). + Uint64("blockHeight", block.NumberU64()). + Msg("[SYNC] new block received") } // CreateTestSyncPeerConfig used for testing. @@ -207,7 +210,11 @@ func (peerConfig *SyncPeerConfig) GetBlocks(hashes [][]byte) ([][]byte, error) { // CreateSyncConfig creates SyncConfig for StateSync object. func (ss *StateSync) CreateSyncConfig(peers []p2p.Peer, isBeacon bool) error { - utils.GetLogInstance().Debug("[SYNC] CreateSyncConfig: len of peers", "len", len(peers), "isBeacon", isBeacon) + utils.Logger().Debug(). + Int("len", len(peers)). + Bool("isBeacon", isBeacon). + Msg("[SYNC] CreateSyncConfig: len of peers") + if len(peers) == 0 { return ctxerror.New("[SYNC] no peers to connect to") } @@ -230,7 +237,10 @@ func (ss *StateSync) CreateSyncConfig(peers []p2p.Peer, isBeacon bool) error { }(peer) } wg.Wait() - utils.GetLogInstance().Info("[SYNC] Finished making connection to peers.", "len", len(ss.syncConfig.peers), "isBeacon", isBeacon) + utils.Logger().Info(). + Int("len", len(ss.syncConfig.peers)). + Bool("isBeacon", isBeacon). + Msg("[SYNC] Finished making connection to peers") return nil } @@ -304,7 +314,10 @@ func (sc *SyncConfig) GetBlockHashesConsensusAndCleanUp() bool { return CompareSyncPeerConfigByblockHashes(sc.peers[i], sc.peers[j]) == -1 }) maxFirstID, maxCount := sc.getHowManyMaxConsensus() - utils.GetLogInstance().Info("[SYNC] block consensus hashes", "maxFirstID", maxFirstID, "maxCount", maxCount) + utils.Logger().Info(). + Int("maxFirstID", maxFirstID). + Int("maxCount", maxCount). + Msg("[SYNC] block consensus hashes") if float64(maxCount) >= ConsensusRatio*float64(len(sc.peers)) { sc.cleanUpPeers(maxFirstID) return true @@ -326,7 +339,10 @@ func (ss *StateSync) GetConsensusHashes(startHash []byte, size uint32) bool { return } if len(response.Payload) > int(size+1) { - utils.GetLogInstance().Warn("[SYNC] GetConsensusHashes: receive more blockHahses than request!", "requestSize", size, "respondSize", len(response.Payload)) + utils.Logger().Warn(). + Uint32("requestSize", size). + Int("respondSize", len(response.Payload)). + Msg("[SYNC] GetConsensusHashes: receive more blockHahses than request!") peerConfig.blockHashes = response.Payload[:size+1] } else { peerConfig.blockHashes = response.Payload @@ -339,13 +355,13 @@ func (ss *StateSync) GetConsensusHashes(startHash []byte, size uint32) bool { break } if count > TimesToFail { - utils.GetLogInstance().Info("[SYNC] GetConsensusHashes: reached retry limit") + utils.Logger().Info().Msg("[SYNC] GetConsensusHashes: reached retry limit") return false } count++ time.Sleep(SleepTimeAfterNonConsensusBlockHashes) } - utils.GetLogInstance().Info("[SYNC] Finished getting consensus block hashes.") + utils.Logger().Info().Msg("[SYNC] Finished getting consensus block hashes") return true } @@ -354,14 +370,17 @@ func (ss *StateSync) generateStateSyncTaskQueue(bc *core.BlockChain) { ss.syncConfig.ForEachPeer(func(configPeer *SyncPeerConfig) (brk bool) { for id, blockHash := range configPeer.blockHashes { if err := ss.stateSyncTaskQueue.Put(SyncBlockTask{index: id, blockHash: blockHash}); err != nil { - ctxerror.Warn(utils.GetLogger(), err, "cannot add task", - "taskIndex", id, "taskBlock", hex.EncodeToString(blockHash)) + utils.Logger().Warn(). + Err(err). + Int("taskIndex", id). + Str("taskBlock", hex.EncodeToString(blockHash)). + Msg("cannot add task") } } brk = true return }) - utils.GetLogInstance().Info("[SYNC] Finished generateStateSyncTaskQueue", "length", ss.stateSyncTaskQueue.Len()) + utils.Logger().Info().Int64("length", ss.stateSyncTaskQueue.Len()).Msg("[SYNC] Finished generateStateSyncTaskQueue") } // downloadBlocks downloads blocks from state sync task queue. @@ -376,7 +395,7 @@ func (ss *StateSync) downloadBlocks(bc *core.BlockChain) { for !stateSyncTaskQueue.Empty() { task, err := ss.stateSyncTaskQueue.Poll(1, time.Millisecond) if err == queue.ErrTimeout || len(task) == 0 { - utils.GetLogInstance().Debug("[SYNC] ss.stateSyncTaskQueue poll timeout", "error", err) + utils.Logger().Error().Err(err).Msg("[SYNC] ss.stateSyncTaskQueue poll timeout") break } syncTask := task[0].(SyncBlockTask) @@ -384,14 +403,16 @@ func (ss *StateSync) downloadBlocks(bc *core.BlockChain) { payload, err := peerConfig.GetBlocks([][]byte{syncTask.blockHash}) if err != nil || len(payload) == 0 { count++ - utils.GetLogInstance().Debug("[SYNC] GetBlocks failed", "failNumber", count) + utils.Logger().Error().Err(err).Int("failNumber", count).Msg("[SYNC] GetBlocks failed") if count > TimesToFail { break } if err := ss.stateSyncTaskQueue.Put(syncTask); err != nil { - ctxerror.Warn(utils.GetLogger(), err, "cannot add task", - "taskIndex", syncTask.index, - "taskBlock", hex.EncodeToString(syncTask.blockHash)) + utils.Logger().Warn(). + Err(err). + Int("taskIndex", syncTask.index). + Str("taskBlock", hex.EncodeToString(syncTask.blockHash)). + Msg("cannot add task") } continue } @@ -402,14 +423,16 @@ func (ss *StateSync) downloadBlocks(bc *core.BlockChain) { if err != nil { count++ - utils.GetLogInstance().Debug("[SYNC] downloadBlocks: failed to DecodeBytes from received new block") + utils.Logger().Error().Err(err).Msg("[SYNC] downloadBlocks: failed to DecodeBytes from received new block") if count > TimesToFail { break } if err := ss.stateSyncTaskQueue.Put(syncTask); err != nil { - ctxerror.Warn(utils.GetLogger(), err, "cannot add task", - "taskIndex", syncTask.index, - "taskBlock", hex.EncodeToString(syncTask.blockHash)) + utils.Logger().Warn(). + Err(err). + Int("taskIndex", syncTask.index). + Str("taskBlock", hex.EncodeToString(syncTask.blockHash)). + Msg("cannot add task") } continue } @@ -421,7 +444,7 @@ func (ss *StateSync) downloadBlocks(bc *core.BlockChain) { return }) wg.Wait() - utils.GetLogInstance().Info("[SYNC] Finished downloadBlocks.") + utils.Logger().Info().Msg("[SYNC] Finished downloadBlocks") } // CompareBlockByHash compares two block by hash, it will be used in sort the blocks @@ -475,7 +498,12 @@ func (ss *StateSync) getMaxConsensusBlockFromParentHash(parentHash common.Hash) return CompareBlockByHash(candidateBlocks[i], candidateBlocks[j]) == -1 }) maxFirstID, maxCount := GetHowManyMaxConsensus(candidateBlocks) - utils.GetLogInstance().Debug("[SYNC] Find block with matching parenthash", "parentHash", parentHash, "hash", candidateBlocks[maxFirstID].Hash(), "maxCount", maxCount) + hash := candidateBlocks[maxFirstID].Hash() + utils.Logger().Debug(). + Bytes("parentHash", parentHash[:]). + Bytes("hash", hash[:]). + Int("maxCount", maxCount). + Msg("[SYNC] Find block with matching parenthash") return candidateBlocks[maxFirstID] } @@ -500,21 +528,24 @@ func (ss *StateSync) getBlockFromLastMileBlocksByParentHash(parentHash common.Ha } func (ss *StateSync) updateBlockAndStatus(block *types.Block, bc *core.BlockChain, worker *worker.Worker) bool { - utils.GetLogInstance().Info("[SYNC] Current Block", "blockHex", bc.CurrentBlock().Hash().Hex()) + utils.Logger().Info().Str("blockHex", bc.CurrentBlock().Hash().Hex()).Msg("[SYNC] Current Block") _, err := bc.InsertChain([]*types.Block{block}) if err != nil { - utils.GetLogInstance().Debug("[SYNC] Error adding new block to blockchain", "Error", err) + utils.Logger().Error().Err(err).Msg("[SYNC] Error adding new block to blockchain") - utils.GetLogInstance().Debug("[SYNC] Rolling back current block!", "block", bc.CurrentBlock()) + utils.Logger().Debug().Interface("block", bc.CurrentBlock()).Msg("[SYNC] Rolling back current block!") bc.Rollback([]common.Hash{bc.CurrentBlock().Hash()}) return false } ss.syncMux.Lock() if err := worker.UpdateCurrent(block.Header().Coinbase); err != nil { - ctxerror.Warn(utils.GetLogger(), err, "[SYNC] (*Worker).UpdateCurrent failed") + utils.Logger().Warn().Err(err).Msg("[SYNC] (*Worker).UpdateCurrent failed") } ss.syncMux.Unlock() - utils.GetLogInstance().Info("[SYNC] new block added to blockchain", "blockHeight", bc.CurrentBlock().NumberU64(), "blockHex", bc.CurrentBlock().Hash().Hex()) + utils.Logger().Info(). + Uint64("blockHeight", bc.CurrentBlock().NumberU64()). + Str("blockHex", bc.CurrentBlock().Hash().Hex()). + Msg("[SYNC] new block added to blockchain") return true } @@ -578,7 +609,7 @@ func (ss *StateSync) generateNewState(bc *core.BlockChain, worker *worker.Worker func (ss *StateSync) ProcessStateSync(startHash []byte, size uint32, bc *core.BlockChain, worker *worker.Worker) { // Gets consensus hashes. if !ss.GetConsensusHashes(startHash, size) { - utils.GetLogInstance().Debug("[SYNC] ProcessStateSync unable to reach consensus on ss.GetConsensusHashes") + utils.Logger().Debug().Msg("[SYNC] ProcessStateSync unable to reach consensus on ss.GetConsensusHashes") return } ss.generateStateSyncTaskQueue(bc) @@ -603,26 +634,34 @@ func (peerConfig *SyncPeerConfig) registerToBroadcast(peerHash []byte, ip, port // return number of successful registration func (ss *StateSync) RegisterNodeInfo() int { registrationNumber := RegistrationNumber - utils.GetLogInstance().Debug("[SYNC] node registration to peers", - "registrationNumber", registrationNumber, - "activePeerNumber", len(ss.syncConfig.peers)) + utils.Logger().Debug(). + Int("registrationNumber", registrationNumber). + Int("activePeerNumber", len(ss.syncConfig.peers)). + Msg("[SYNC] node registration to peers") count := 0 ss.syncConfig.ForEachPeer(func(peerConfig *SyncPeerConfig) (brk bool) { + logger := utils.Logger().With().Str("peerPort", peerConfig.port).Str("peerIP", peerConfig.ip).Logger() if count >= registrationNumber { brk = true return } if peerConfig.ip == ss.selfip && peerConfig.port == GetSyncingPort(ss.selfport) { - utils.GetLogInstance().Debug("[SYNC] skip self", "peerport", peerConfig.port, "selfport", ss.selfport, "selfsyncport", GetSyncingPort(ss.selfport)) + logger.Debug(). + Str("selfport", ss.selfport). + Str("selfsyncport", GetSyncingPort(ss.selfport)). + Msg("[SYNC] skip self") return } err := peerConfig.registerToBroadcast(ss.selfPeerHash[:], ss.selfip, ss.selfport) if err != nil { - utils.GetLogInstance().Debug("[SYNC] register failed to peer", "ip", peerConfig.ip, "port", peerConfig.port, "selfPeerHash", ss.selfPeerHash) + logger.Debug(). + Bytes("selfPeerHash", ss.selfPeerHash[:]). + Msg("[SYNC] register failed to peer") return } - utils.GetLogInstance().Debug("[SYNC] register success", "ip", peerConfig.ip, "port", peerConfig.port) + + logger.Debug().Msg("[SYNC] register success") count++ return }) @@ -638,7 +677,7 @@ func (ss *StateSync) getMaxPeerHeight() uint64 { go func() { defer wg.Done() //debug - //utils.GetLogInstance().Warn("[Sync] getMaxPeerHeight", "IP", peerConfig.ip, "Port", peerConfig.port) + // utils.Logger().Warn().Str("IP", peerConfig.ip).Str("Port", peerConfig.port).Msg("[Sync] getMaxPeerHeight") response := peerConfig.client.GetBlockChainHeight() ss.syncMux.Lock() if response != nil && maxHeight < response.BlockHeight { @@ -663,7 +702,11 @@ func (ss *StateSync) IsSameBlockchainHeight(bc *core.BlockChain) (uint64, bool) func (ss *StateSync) IsOutOfSync(bc *core.BlockChain) bool { otherHeight := ss.getMaxPeerHeight() currentHeight := bc.CurrentBlock().NumberU64() - utils.GetLogInstance().Debug("[SYNC] Checking sync status", "OtherHeight", otherHeight, "MyHeight", currentHeight, "IsOutOfSync", currentHeight+inSyncThreshold < otherHeight) + utils.Logger().Debug(). + Uint64("OtherHeight", otherHeight). + Uint64("MyHeight", currentHeight). + Bool("IsOutOfSync", currentHeight+inSyncThreshold < otherHeight). + Msg("[SYNC] Checking sync status") return currentHeight+inSyncThreshold < otherHeight } @@ -676,7 +719,7 @@ func (ss *StateSync) SyncLoop(bc *core.BlockChain, worker *worker.Worker, willJo otherHeight := ss.getMaxPeerHeight() currentHeight := bc.CurrentBlock().NumberU64() if currentHeight >= otherHeight { - utils.GetLogInstance().Info("[SYNC] Node is now IN SYNC!") + utils.Logger().Info().Msg("[SYNC] Node is now IN SYNC!") break } startHash := bc.CurrentBlock().Hash() diff --git a/cmd/bootnode/main.go b/cmd/bootnode/main.go index 5eef5612f..2b0a4fd8a 100644 --- a/cmd/bootnode/main.go +++ b/cmd/bootnode/main.go @@ -51,10 +51,7 @@ func main() { // Logging setup utils.SetLogContext(*port, *ip) utils.SetLogVerbosity(log.Lvl(*verbosity)) - filename := fmt.Sprintf("%v/bootnode-%v-%v.log", *logFolder, *ip, *port) - if err := utils.AddLogFile(filename, *logMaxSize); err != nil { - panic(err) - } + utils.AddLogFile(fmt.Sprintf("%v/bootnode-%v-%v.log", *logFolder, *ip, *port), *logMaxSize) privKey, _, err := utils.LoadKeyFromFile(*keyFile) if err != nil { diff --git a/cmd/client/txgen/main.go b/cmd/client/txgen/main.go index 81cdb345b..73e4807f4 100644 --- a/cmd/client/txgen/main.go +++ b/cmd/client/txgen/main.go @@ -106,8 +106,9 @@ func setUpTXGen() *node.Node { consensusObj.SetStakeInfoFinder(gsif) consensusObj.ChainReader = txGen.Blockchain() consensusObj.PublicKeys = nil + genesisShardingConfig := core.ShardingSchedule.InstanceForEpoch(big.NewInt(core.GenesisEpoch)) startIdx := 0 - endIdx := startIdx + core.GenesisShardSize + endIdx := startIdx + genesisShardingConfig.NumNodesPerShard() for _, acct := range genesis.HarmonyAccounts[startIdx:endIdx] { pub := &bls2.PublicKey{} if err := pub.DeserializeHexStr(acct.BlsPublicKey); err != nil { @@ -128,6 +129,7 @@ func setUpTXGen() *node.Node { return txGen } + func main() { flag.Var(&utils.BootNodes, "bootnodes", "a list of bootnode multiaddress") flag.Parse() diff --git a/cmd/client/wallet/generated_wallet.ini.go b/cmd/client/wallet/generated_wallet.ini.go index 786bfb8eb..b1ed56eff 100644 --- a/cmd/client/wallet/generated_wallet.ini.go +++ b/cmd/client/wallet/generated_wallet.ini.go @@ -24,11 +24,17 @@ rpc = s3.t.hmny.io:14555 [local] bootnode = /ip4/127.0.0.1/tcp/19876/p2p/Qmc1V6W7BwX8Ugb42Ti8RnXF1rY5PF7nnZ6bKBryCgi6cv -shards = 1 +shards = 2 [local.shard0.rpc] rpc = 127.0.0.1:14555 +rpc = 127.0.0.1:14557 +rpc = 127.0.0.1:14559 + +[local.shard1.rpc] rpc = 127.0.0.1:14556 +rpc = 127.0.0.1:14558 +rpc = 127.0.0.1:14560 [devnet] bootnode = /ip4/100.26.90.187/tcp/9871/p2p/Qmdfjtk6hPoyrH1zVD9PEH4zfWLo38dP2mDvvKXfh3tnEv diff --git a/cmd/client/wallet/main.go b/cmd/client/wallet/main.go index 65dd96c34..3c86ffd2f 100644 --- a/cmd/client/wallet/main.go +++ b/cmd/client/wallet/main.go @@ -794,35 +794,47 @@ func FetchBalance(address common.Address) []*AccountState { defer wg.Done() balance := big.NewInt(0) var nonce uint64 - result[uint32(shardID)] = &AccountState{balance, 0} - LOOP: - for j := 0; j < len(walletProfile.RPCServer[shardID]); j++ { - for retry := 0; retry < rpcRetry; retry++ { - server := walletProfile.RPCServer[shardID][j] - client, err := clientService.NewClient(server.IP, server.Port) - if err != nil { - continue - } - - log.Debug("FetchBalance", "server", server) - response, err := client.GetBalance(address) - if err != nil { - log.Info("failed to get balance, retrying ...") - time.Sleep(200 * time.Millisecond) - continue + var wgShard sync.WaitGroup + wgShard.Add(len(walletProfile.RPCServer[shardID])) + + var mutexAccountState = &sync.Mutex{} + + for rpcServerID := 0; rpcServerID < len(walletProfile.RPCServer[shardID]); rpcServerID++ { + go func(rpcServerID int) { + for retry := 0; retry < rpcRetry; retry++ { + + server := walletProfile.RPCServer[shardID][rpcServerID] + client, err := clientService.NewClient(server.IP, server.Port) + if err != nil { + continue + } + + log.Debug("FetchBalance", "server", server) + response, err := client.GetBalance(address) + if err != nil { + log.Info("failed to get balance, retrying ...") + time.Sleep(200 * time.Millisecond) + continue + } + log.Debug("FetchBalance", "response", response) + respBalance := big.NewInt(0) + respBalance.SetBytes(response.Balance) + + mutexAccountState.Lock() + if balance.Cmp(respBalance) < 0 { + balance.SetBytes(response.Balance) + nonce = response.Nonce + } + mutexAccountState.Unlock() + break } - log.Debug("FetchBalance", "response", response) - respBalance := big.NewInt(0) - respBalance.SetBytes(response.Balance) - if balance.Cmp(respBalance) < 0 { - balance.SetBytes(response.Balance) - nonce = response.Nonce - } - break LOOP - } + wgShard.Done() + }(rpcServerID) } + wgShard.Wait() + result[shardID] = &AccountState{balance, nonce} }(shardID) } diff --git a/cmd/harmony/main.go b/cmd/harmony/main.go index 3b901207b..667ad3712 100644 --- a/cmd/harmony/main.go +++ b/cmd/harmony/main.go @@ -4,6 +4,7 @@ import ( "encoding/hex" "flag" "fmt" + "math/big" "math/rand" "os" "path" @@ -14,17 +15,16 @@ import ( "github.com/ethereum/go-ethereum/log" "github.com/harmony-one/bls/ffi/go/bls" - "github.com/harmony-one/harmony/accounts/keystore" "github.com/harmony-one/harmony/consensus" "github.com/harmony-one/harmony/core" "github.com/harmony-one/harmony/internal/blsgen" "github.com/harmony-one/harmony/internal/common" nodeconfig "github.com/harmony-one/harmony/internal/configs/node" + shardingconfig "github.com/harmony-one/harmony/internal/configs/sharding" "github.com/harmony-one/harmony/internal/ctxerror" "github.com/harmony-one/harmony/internal/genesis" hmykey "github.com/harmony-one/harmony/internal/keystore" "github.com/harmony-one/harmony/internal/memprofiling" - "github.com/harmony-one/harmony/internal/profiler" "github.com/harmony-one/harmony/internal/shardchain" "github.com/harmony-one/harmony/internal/utils" "github.com/harmony-one/harmony/node" @@ -86,7 +86,7 @@ var ( // isExplorer indicates this node is a node to serve explorer isExplorer = flag.Bool("is_explorer", false, "true means this node is a node to serve explorer") // networkType indicates the type of the network - networkType = flag.String("network_type", "mainnet", "type of the network: mainnet, testnet, devnet...") + networkType = flag.String("network_type", "mainnet", "type of the network: mainnet, testnet, devnet, localnet") // blockPeriod indicates the how long the leader waits to propose a new block. blockPeriod = flag.Int("block_period", 8, "how long in second the leader waits to propose a new block.") // isNewNode indicates this node is a new node @@ -100,21 +100,17 @@ var ( blsPass = flag.String("blspass", "", "The file containing passphrase to decrypt the encrypted bls file.") blsPassphrase string + // Sharding configuration parameters for devnet + devnetNumShards = flag.Uint("dn_num_shards", 2, "number of shards for -network_type=devnet (default: 2)") + devnetShardSize = flag.Int("dn_shard_size", 10, "number of nodes per shard for -network_type=devnet (default 10)") + devnetHarmonySize = flag.Int("dn_hmy_size", -1, "number of Harmony-operated nodes per shard for -network_type=devnet; negative (default) means equal to -dn_shard_size") + // logConn logs incoming/outgoing connections logConn = flag.Bool("log_conn", false, "log incoming/outgoing connections") keystoreDir = flag.String("keystore", hmykey.DefaultKeyStoreDir, "The default keystore directory") - // -nopass is false by default. The keyfile must be encrypted. - hmyNoPass = flag.Bool("nopass", false, "No passphrase for the key (testing only)") - // -pass takes on "pass:password", "env:var", "file:pathname", - // "fd:number", or "stdin" form. - // See “PASS PHRASE ARGUMENTS” section of openssl(1) for details. - hmyPass = flag.String("pass", "", "how to get passphrase for the key") - - ks *keystore.KeyStore - genesisAccount *genesis.DeployAccount - accountIndex int + genesisAccount = &genesis.DeployAccount{} // logging verbosity verbosity = flag.Int("verbosity", 5, "Logging verbosity: 0=silent, 1=error, 2=warn, 3=info, 4=debug, 5=detail (default: 5)") @@ -123,18 +119,10 @@ var ( dbDir = flag.String("db_dir", "", "blockchain database directory") // Disable view change. - disableViewChange = flag.Bool("disable_view_change", false, - "Do not propose view change (testing only)") + disableViewChange = flag.Bool("disable_view_change", false, "Do not propose view change (testing only)") ) func initSetup() { - flag.Var(&utils.BootNodes, "bootnodes", "a list of bootnode multiaddress (delimited by ,)") - flag.Parse() - - nodeconfig.SetVersion(fmt.Sprintf("Harmony (C) 2019. %v, version %v-%v (%v %v)", path.Base(os.Args[0]), version, commit, builtBy, builtAt)) - if *versionFlag { - printVersion() - } // maybe request passphrase for bls key. passphraseForBls() @@ -142,10 +130,8 @@ func initSetup() { // Configure log parameters utils.SetLogContext(*port, *ip) utils.SetLogVerbosity(log.Lvl(*verbosity)) - filename := fmt.Sprintf("%v/validator-%v-%v.log", *logFolder, *ip, *port) - if err := utils.AddLogFile(filename, *logMaxSize); err != nil { - panic(err) - } + utils.AddLogFile(fmt.Sprintf("%v/validator-%v-%v.log", *logFolder, *ip, *port), *logMaxSize) + if *onlyLogTps { matchFilterHandler := log.MatchFilterHandler("msg", "TPS Report", utils.GetLogInstance().GetHandler()) utils.GetLogInstance().SetHandler(matchFilterHandler) @@ -175,13 +161,6 @@ func initSetup() { utils.BootNodes = bootNodeAddrs } - if !*isExplorer { // Explorer node doesn't need the following setup - setupECDSAKeys() - } else { - genesisAccount = &genesis.DeployAccount{} - genesisAccount.ShardID = uint32(*shardID) - } - // Set up manual call for garbage collection. if *enableGC { memprofiling.MaybeCallGCPeriodically() @@ -202,34 +181,40 @@ func passphraseForBls() { blsPassphrase = passphrase } -func setupECDSAKeys() { - ks = hmykey.GetHmyKeyStore() - - // TODO: lc try to enable multiple staking accounts per node - accountIndex, genesisAccount = setUpConsensusKeyAndReturnIndex(nodeconfig.GetDefaultConfig()) +func setupGenesisAccount() (isLeader bool) { + genesisShardingConfig := core.ShardingSchedule.InstanceForEpoch(big.NewInt(core.GenesisEpoch)) + pubKey := setUpConsensusKey(nodeconfig.GetDefaultConfig()) + + reshardingEpoch := genesisShardingConfig.ReshardingEpoch() + if reshardingEpoch != nil && len(reshardingEpoch) > 0 { + for _, epoch := range reshardingEpoch { + config := core.ShardingSchedule.InstanceForEpoch(epoch) + isLeader, genesisAccount = config.FindAccount(pubKey.SerializeToHexStr()) + if genesisAccount != nil { + break + } + } + } else { + isLeader, genesisAccount = genesisShardingConfig.FindAccount(pubKey.SerializeToHexStr()) + } - genesisAccount.ShardID = uint32(accountIndex % core.GenesisShardNum) + if genesisAccount == nil { + fmt.Printf("cannot find your BLS key in the genesis/FN tables: %s\n", pubKey.SerializeToHexStr()) + os.Exit(100) + } fmt.Printf("My Genesis Account: %v\n", *genesisAccount) - // Set up manual call for garbage collection. - if *enableGC { - memprofiling.MaybeCallGCPeriodically() - } + return isLeader } -func setUpConsensusKeyAndReturnIndex(nodeConfig *nodeconfig.ConfigType) (int, *genesis.DeployAccount) { +func setUpConsensusKey(nodeConfig *nodeconfig.ConfigType) *bls.PublicKey { consensusPriKey, err := blsgen.LoadBlsKeyWithPassPhrase(*blsKeyFile, blsPassphrase) if err != nil { fmt.Printf("error when loading bls key, err :%v\n", err) os.Exit(100) } pubKey := consensusPriKey.GetPublicKey() - index, acc := genesis.IsBlsPublicKeyIndex(pubKey.SerializeToHexStr()) - if index < 0 { - fmt.Printf("cannot find your BLS key in the genesis/FN tables: %s\n", pubKey.SerializeToHexStr()) - os.Exit(100) - } // Consensus keys are the BLS12-381 keys used to sign consensus messages nodeConfig.ConsensusPriKey, nodeConfig.ConsensusPubKey = consensusPriKey, consensusPriKey.GetPublicKey() @@ -237,43 +222,17 @@ func setUpConsensusKeyAndReturnIndex(nodeConfig *nodeconfig.ConfigType) (int, *g fmt.Println("error to get consensus keys.") os.Exit(100) } - return index, acc + return pubKey } -func createGlobalConfig() *nodeconfig.ConfigType { +func createGlobalConfig(isLeader bool) *nodeconfig.ConfigType { var err error - var myShardID uint32 - - nodeConfig := nodeconfig.GetDefaultConfig() + nodeConfig := nodeconfig.GetShardConfig(genesisAccount.ShardID) if !*isExplorer { - // Specified Shard ID override calculated Shard ID - if *shardID >= 0 { - utils.GetLogInstance().Info("ShardID Override", "original", genesisAccount.ShardID, "override", *shardID) - genesisAccount.ShardID = uint32(*shardID) - } - - if !*isNewNode { - nodeConfig = nodeconfig.GetShardConfig(uint32(genesisAccount.ShardID)) - } else { - myShardID = 0 // This should be default value as new node doesn't belong to any shard. - if *shardID >= 0 { - utils.GetLogInstance().Info("ShardID Override", "original", myShardID, "override", *shardID) - myShardID = uint32(*shardID) - nodeConfig = nodeconfig.GetShardConfig(myShardID) - } - } - // Set up consensus keys. - setUpConsensusKeyAndReturnIndex(nodeConfig) - - // P2p private key is used for secure message transfer between p2p nodes. - nodeConfig.P2pPriKey, _, err = utils.LoadKeyFromFile(*keyFile) - if err != nil { - panic(err) - } + setUpConsensusKey(nodeConfig) } else { - nodeConfig = nodeconfig.GetShardConfig(uint32(*shardID)) nodeConfig.ConsensusPriKey = &bls.SecretKey{} // set dummy bls key for consensus object } @@ -283,27 +242,28 @@ func createGlobalConfig() *nodeconfig.ConfigType { nodeConfig.SetNetworkType(nodeconfig.Mainnet) case nodeconfig.Testnet: nodeConfig.SetNetworkType(nodeconfig.Testnet) + case nodeconfig.Localnet: + nodeConfig.SetNetworkType(nodeconfig.Localnet) case nodeconfig.Devnet: nodeConfig.SetNetworkType(nodeconfig.Devnet) default: panic(fmt.Sprintf("invalid network type: %s", *networkType)) } + // P2p private key is used for secure message transfer between p2p nodes. + nodeConfig.P2pPriKey, _, err = utils.LoadKeyFromFile(*keyFile) + if err != nil { + panic(err) + } nodeConfig.SelfPeer = p2p.Peer{IP: *ip, Port: *port, ConsensusPubKey: nodeConfig.ConsensusPubKey} - if accountIndex < core.GenesisShardNum && !*isExplorer && !*leaderOverride { // The first node in a shard is the leader at genesis + if isLeader && !*isExplorer && !*leaderOverride { // The first node in a shard is the leader at genesis nodeConfig.Leader = nodeConfig.SelfPeer nodeConfig.StringRole = "leader" } else { nodeConfig.StringRole = "validator" } - // P2p private key is used for secure message transfer between p2p nodes. - nodeConfig.P2pPriKey, _, err = utils.LoadKeyFromFile(*keyFile) - if err != nil { - panic(err) - } - nodeConfig.Host, err = p2pimpl.NewHost(&nodeConfig.SelfPeer, nodeConfig.P2pPriKey) if *logConn && nodeConfig.GetNetworkType() != nodeconfig.Mainnet { nodeConfig.Host.GetP2PHost().Network().Notify(utils.NewConnLogger(utils.GetLogInstance())) @@ -340,6 +300,11 @@ func setUpConsensusAndNode(nodeConfig *nodeconfig.ConfigType) *node.Node { } currentConsensus.SetCommitDelay(commitDelay) currentConsensus.MinPeers = *minPeers + + if *isNewNode { + currentConsensus.SetMode(consensus.Listening) + } + if *disableViewChange { currentConsensus.DisableViewChangeForTestingOnly() } @@ -368,49 +333,37 @@ func setUpConsensusAndNode(nodeConfig *nodeconfig.ConfigType) *node.Node { nodeConfig.SetIsBeacon(true) if nodeConfig.StringRole == "leader" { currentNode.NodeConfig.SetRole(nodeconfig.BeaconLeader) - currentNode.NodeConfig.SetIsLeader(true) } else { currentNode.NodeConfig.SetRole(nodeconfig.BeaconValidator) - currentNode.NodeConfig.SetIsLeader(false) } currentNode.NodeConfig.SetShardGroupID(p2p.GroupIDBeacon) currentNode.NodeConfig.SetClientGroupID(p2p.GroupIDBeaconClient) } else { if nodeConfig.StringRole == "leader" { currentNode.NodeConfig.SetRole(nodeconfig.ShardLeader) - currentNode.NodeConfig.SetIsLeader(true) } else { currentNode.NodeConfig.SetRole(nodeconfig.ShardValidator) - currentNode.NodeConfig.SetIsLeader(false) } currentNode.NodeConfig.SetShardGroupID(p2p.NewGroupIDByShardID(p2p.ShardID(nodeConfig.ShardID))) currentNode.NodeConfig.SetClientGroupID(p2p.NewClientGroupIDByShardID(p2p.ShardID(nodeConfig.ShardID))) } } else { if *isNewNode { - currentNode.NodeConfig.SetRole(nodeconfig.NewNode) - currentNode.NodeConfig.SetClientGroupID(p2p.GroupIDBeaconClient) - currentNode.NodeConfig.SetBeaconGroupID(p2p.GroupIDBeacon) - if *shardID > -1 { - // I will be a validator (single leader is fixed for now) + if nodeConfig.ShardID == 0 { // Beacon chain + nodeConfig.SetIsBeacon(true) + currentNode.NodeConfig.SetRole(nodeconfig.BeaconValidator) + currentNode.NodeConfig.SetShardGroupID(p2p.GroupIDBeacon) + currentNode.NodeConfig.SetClientGroupID(p2p.GroupIDBeaconClient) + } else { currentNode.NodeConfig.SetRole(nodeconfig.ShardValidator) - currentNode.NodeConfig.SetIsLeader(false) currentNode.NodeConfig.SetShardGroupID(p2p.NewGroupIDByShardID(p2p.ShardID(nodeConfig.ShardID))) currentNode.NodeConfig.SetClientGroupID(p2p.NewClientGroupIDByShardID(p2p.ShardID(nodeConfig.ShardID))) } - } else if *isExplorer { + } + if *isExplorer { currentNode.NodeConfig.SetRole(nodeconfig.ExplorerNode) - currentNode.NodeConfig.SetIsLeader(false) currentNode.NodeConfig.SetShardGroupID(p2p.NewGroupIDByShardID(p2p.ShardID(*shardID))) currentNode.NodeConfig.SetClientGroupID(p2p.NewClientGroupIDByShardID(p2p.ShardID(*shardID))) - } else if nodeConfig.StringRole == "leader" { - currentNode.NodeConfig.SetRole(nodeconfig.ShardLeader) - currentNode.NodeConfig.SetIsLeader(true) - currentNode.NodeConfig.SetShardGroupID(p2p.GroupIDUnknown) - } else { - currentNode.NodeConfig.SetRole(nodeconfig.ShardValidator) - currentNode.NodeConfig.SetIsLeader(false) - currentNode.NodeConfig.SetShardGroupID(p2p.GroupIDUnknown) } } currentNode.NodeConfig.ConsensusPubKey = nodeConfig.ConsensusPubKey @@ -453,18 +406,55 @@ func setUpConsensusAndNode(nodeConfig *nodeconfig.ConfigType) *node.Node { } func main() { - initSetup() - nodeConfig := createGlobalConfig() - - // Start Profiler for leader if profile argument is on - if nodeConfig.StringRole == "leader" && (*profile || *metricsReportURL != "") { - prof := profiler.GetProfiler() - prof.Config(nodeConfig.ShardID, *metricsReportURL) - if *profile { - prof.Start() + flag.Var(&utils.BootNodes, "bootnodes", "a list of bootnode multiaddress (delimited by ,)") + flag.Parse() + + nodeconfig.SetVersion(fmt.Sprintf("Harmony (C) 2019. %v, version %v-%v (%v %v)", path.Base(os.Args[0]), version, commit, builtBy, builtAt)) + if *versionFlag { + printVersion() + } + + switch *networkType { + case nodeconfig.Mainnet: + core.ShardingSchedule = shardingconfig.MainnetSchedule + case nodeconfig.Testnet: + core.ShardingSchedule = shardingconfig.TestnetSchedule + case nodeconfig.Localnet: + core.ShardingSchedule = shardingconfig.LocalnetSchedule + case nodeconfig.Devnet: + if *devnetHarmonySize < 0 { + *devnetHarmonySize = *devnetShardSize } + // TODO (leo): use a passing list of accounts here + devnetConfig, err := shardingconfig.NewInstance( + uint32(*devnetNumShards), *devnetShardSize, *devnetHarmonySize, genesis.HarmonyAccounts, genesis.FoundationalNodeAccounts, nil) + if err != nil { + _, _ = fmt.Fprintf(os.Stderr, "invalid devnet sharding config: %s", + err) + os.Exit(1) + } + core.ShardingSchedule = shardingconfig.NewFixedSchedule(devnetConfig) + } + + initSetup() + + // Set up manual call for garbage collection. + if *enableGC { + memprofiling.MaybeCallGCPeriodically() } + + isLeader := false + if !*isExplorer { // Explorer node doesn't need the following setup + isLeader = setupGenesisAccount() + } + if *shardID >= 0 { + utils.GetLogInstance().Info("ShardID Override", "original", genesisAccount.ShardID, "override", *shardID) + genesisAccount.ShardID = uint32(*shardID) + } + + nodeConfig := createGlobalConfig(isLeader) currentNode := setUpConsensusAndNode(nodeConfig) + //if consensus.ShardID != 0 { // go currentNode.SupportBeaconSyncing() //} diff --git a/cmd/hmyclient/main.go b/cmd/hmyclient/main.go new file mode 100644 index 000000000..cd3b2a2c4 --- /dev/null +++ b/cmd/hmyclient/main.go @@ -0,0 +1,65 @@ +package main + +import ( + "context" + "fmt" + "math/big" + "time" + + "github.com/ethereum/go-ethereum/rpc" + "github.com/harmony-one/harmony/hmyclient" +) + +// newRPCClient creates a rpc client with specified node URL. +func newRPCClient(url string) *rpc.Client { + client, err := rpc.Dial(url) + if err != nil { + fmt.Errorf("Failed to connect to Ethereum node: %v", err) + } + return client +} + +func main() { + ctx, cancelFn := context.WithTimeout(context.Background(), 10*time.Second) + defer cancelFn() + rpcClient := newRPCClient("http://localhost:9500") + if rpcClient == nil { + fmt.Errorf("Failed to create rpc client") + } + client := hmyclient.NewClient(rpcClient) + if client == nil { + fmt.Errorf("Failed to create client") + } + + networkID, err := client.NetworkID(ctx) + if err != nil { + fmt.Errorf("Failed to get net_version: %v", err) + } + fmt.Printf("net_version: %v\n", networkID) + + blockNumber, err := client.BlockNumber(ctx) + if err != nil { + fmt.Errorf("Failed to get hmy_blockNumber: %v", err) + } + fmt.Printf("hmy_blockNumber: %v\n", blockNumber) + + block, err := client.BlockByNumber(ctx, new(big.Int).SetUint64(uint64(blockNumber))) + if err != nil { + fmt.Errorf("Failed to get hmy_getBlockByNumber %v: %v", blockNumber, err) + } + fmt.Printf("hmy_getBlockByNumber(%v):\n", blockNumber) + fmt.Printf("number: %v\n", block.Number().Text(16)) + fmt.Printf("hash: %v\n", block.Hash().String()) + fmt.Printf("parentHash: %v\n", block.ParentHash().String()) + fmt.Printf("timestamp: %v\n", block.Time().Text(16)) + fmt.Printf("size: %v\n", block.Size()) + fmt.Printf("miner: %v\n", block.Coinbase().String()) + fmt.Printf("receiptsRoot: %v\n", block.ReceiptHash().String()) + fmt.Printf("transactionsRoot: %v\n", block.TxHash().String()) + + block, err = client.BlockByNumber(ctx, nil) + if err != nil { + fmt.Errorf("Failed to get block: %v", err) + } + fmt.Printf("hmy_getBlockByNumber(latest): %v", block) +} diff --git a/consensus/consensus.go b/consensus/consensus.go index 519e58bfb..37fd2c190 100644 --- a/consensus/consensus.go +++ b/consensus/consensus.go @@ -11,7 +11,6 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/log" "github.com/harmony-one/bls/ffi/go/bls" "github.com/harmony-one/harmony/common/denominations" @@ -21,7 +20,6 @@ import ( "github.com/harmony-one/harmony/core/types" bls_cosi "github.com/harmony-one/harmony/crypto/bls" common2 "github.com/harmony-one/harmony/internal/common" - nodeconfig "github.com/harmony-one/harmony/internal/configs/node" "github.com/harmony-one/harmony/internal/ctxerror" "github.com/harmony-one/harmony/internal/genesis" "github.com/harmony-one/harmony/internal/memprofiling" @@ -99,6 +97,9 @@ type Consensus struct { // the publickey of leader LeaderPubKey *bls.PublicKey + // number of publickeys of previous epoch + numPrevPubKeys int + viewID uint64 // Blockhash - 32 byte @@ -203,6 +204,11 @@ func (consensus *Consensus) Quorum() int { return len(consensus.PublicKeys)*2/3 + 1 } +// PreviousQuorum returns the quorum size of previous epoch +func (consensus *Consensus) PreviousQuorum() int { + return consensus.numPrevPubKeys*2/3 + 1 +} + // RewardThreshold returns the threshold to stop accepting commit messages // when leader receives enough signatures for block reward func (consensus *Consensus) RewardThreshold() int { @@ -236,13 +242,6 @@ func New(host p2p.Host, ShardID uint32, leader p2p.Peer, blsPriKey *bls.SecretKe // pbft timeout consensus.consensusTimeout = createTimeout() - selfPeer := host.GetSelfPeer() - if leader.Port == selfPeer.Port && leader.IP == selfPeer.IP { - nodeconfig.GetDefaultConfig().SetIsLeader(true) - } else { - nodeconfig.GetDefaultConfig().SetIsLeader(false) - } - consensus.prepareSigs = map[string]*bls.Sign{} consensus.commitSigs = map[string]*bls.Sign{} @@ -253,9 +252,9 @@ func New(host p2p.Host, ShardID uint32, leader p2p.Peer, blsPriKey *bls.SecretKe if blsPriKey != nil { consensus.priKey = blsPriKey consensus.PubKey = blsPriKey.GetPublicKey() - utils.GetLogInstance().Info("my pubkey is", "pubkey", consensus.PubKey.SerializeToHexStr()) + utils.Logger().Info().Str("publicKey", consensus.PubKey.SerializeToHexStr()).Msg("My Public Key") } else { - utils.GetLogInstance().Error("the bls key is nil") + utils.Logger().Error().Msg("the bls key is nil") return nil, fmt.Errorf("nil bls key, aborting") } @@ -283,8 +282,6 @@ func New(host p2p.Host, ShardID uint32, leader p2p.Peer, blsPriKey *bls.SecretKe func accumulateRewards( bc consensus_engine.ChainReader, state *state.DB, header *types.Header, ) error { - logger := header.Logger(utils.GetLogInstance()) - getLogger := func() log.Logger { return utils.WithCallerSkip(logger, 1) } blockNum := header.Number.Uint64() if blockNum == 0 { // Epoch block has no parent to reward. @@ -356,10 +353,11 @@ func accumulateRewards( totalAmount = new(big.Int).Add(totalAmount, diff) last = cur } - getLogger().Debug("【Block Reward] Successfully paid out block reward", - "NumAccounts", numAccounts, - "TotalAmount", totalAmount, - "Signers", signers) + header.Logger(utils.Logger()).Debug(). + Str("NumAccounts", numAccounts.String()). + Str("TotalAmount", totalAmount.String()). + Strs("Signers", signers). + Msg("[Block Reward] Successfully paid out block reward") return nil } @@ -379,9 +377,7 @@ func (f *GenesisStakeInfoFinder) FindStakeInfoByNodeKey( ) []*structs.StakeInfo { var pk types.BlsPublicKey if err := pk.FromLibBLSPublicKey(key); err != nil { - ctxerror.Log15(utils.GetLogInstance().Warn, ctxerror.New( - "cannot convert BLS public key", - ).WithCause(err)) + utils.Logger().Warn().Err(err).Msg("cannot convert BLS public key") return nil } l, _ := f.byNodeKey[pk] diff --git a/consensus/consensus_leader_msg.go b/consensus/consensus_leader_msg.go index 2ea0545c9..17583dbdb 100644 --- a/consensus/consensus_leader_msg.go +++ b/consensus/consensus_leader_msg.go @@ -25,7 +25,7 @@ func (consensus *Consensus) constructAnnounceMessage() []byte { marshaledMessage, err := consensus.signAndMarshalConsensusMessage(message) if err != nil { - utils.GetLogInstance().Error("Failed to sign and marshal the Announce message", "error", err) + utils.Logger().Error().Err(err).Msg("Failed to sign and marshal the Announce message") } return proto.ConstructConsensusMessage(marshaledMessage) } @@ -60,7 +60,7 @@ func (consensus *Consensus) constructPreparedMessage() ([]byte, *bls.Sign) { marshaledMessage, err := consensus.signAndMarshalConsensusMessage(message) if err != nil { - utils.GetLogInstance().Error("Failed to sign and marshal the Prepared message", "error", err) + utils.Logger().Error().Err(err).Msg("Failed to sign and marshal the Prepared message") } return proto.ConstructConsensusMessage(marshaledMessage), aggSig } @@ -93,7 +93,7 @@ func (consensus *Consensus) constructCommittedMessage() ([]byte, *bls.Sign) { marshaledMessage, err := consensus.signAndMarshalConsensusMessage(message) if err != nil { - utils.GetLogInstance().Error("Failed to sign and marshal the Committed message", "error", err) + utils.Logger().Error().Err(err).Msg("Failed to sign and marshal the Committed message") } return proto.ConstructConsensusMessage(marshaledMessage), aggSig } diff --git a/consensus/consensus_service.go b/consensus/consensus_service.go index adf5ebaa4..25bcff70b 100644 --- a/consensus/consensus_service.go +++ b/consensus/consensus_service.go @@ -10,11 +10,11 @@ import ( "github.com/harmony-one/harmony/crypto/hash" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/rlp" protobuf "github.com/golang/protobuf/proto" "github.com/harmony-one/bls/ffi/go/bls" libp2p_peer "github.com/libp2p/go-libp2p-peer" + "github.com/rs/zerolog" "golang.org/x/crypto/sha3" msg_pb "github.com/harmony-one/harmony/api/proto/message" @@ -22,7 +22,6 @@ import ( "github.com/harmony-one/harmony/core/state" "github.com/harmony-one/harmony/core/types" bls_cosi "github.com/harmony-one/harmony/crypto/bls" - nodeconfig "github.com/harmony-one/harmony/internal/configs/node" "github.com/harmony-one/harmony/internal/ctxerror" "github.com/harmony-one/harmony/internal/profiler" "github.com/harmony-one/harmony/internal/utils" @@ -73,7 +72,7 @@ func (consensus *Consensus) SealHash(header *types.Header) (hash common.Hash) { header.Time, header.Extra, }); err != nil { - ctxerror.Warn(utils.GetLogger(), err, "rlp.Encode failed") + utils.Logger().Warn().Err(err).Msg("rlp.Encode failed") } hasher.Sum(hash[:0]) return hash @@ -109,7 +108,9 @@ func (consensus *Consensus) populateMessageFields(request *msg_pb.ConsensusReque // sender address request.SenderPubkey = consensus.PubKey.Serialize() - consensus.getLogger().Debug("[populateMessageFields]", "SenderKey", consensus.PubKey.SerializeToHexStr()) + consensus.getLogger().Debug(). + Str("senderKey", consensus.PubKey.SerializeToHexStr()). + Msg("[populateMessageFields]") } // Signs the consensus message and returns the marshaled message. @@ -158,12 +159,11 @@ func (consensus *Consensus) GetViewID() uint64 { // DebugPrintPublicKeys print all the PublicKeys in string format in Consensus func (consensus *Consensus) DebugPrintPublicKeys() { + var keys []string for _, k := range consensus.PublicKeys { - str := fmt.Sprintf("%s", hex.EncodeToString(k.Serialize())) - utils.GetLogInstance().Debug("pk:", "string", str) + keys = append(keys, hex.EncodeToString(k.Serialize())) } - - utils.GetLogInstance().Debug("PublicKeys:", "#", len(consensus.PublicKeys)) + utils.Logger().Debug().Strs("PublicKeys", keys).Int("count", len(keys)).Msgf("Debug Public Keys") } // UpdatePublicKeys updates the PublicKeys variable, protected by a mutex @@ -171,16 +171,16 @@ func (consensus *Consensus) UpdatePublicKeys(pubKeys []*bls.PublicKey) int { consensus.pubKeyLock.Lock() consensus.PublicKeys = append(pubKeys[:0:0], pubKeys...) consensus.CommitteePublicKeys = map[string]bool{} - utils.GetLogInstance().Info("My Committee") - for _, pubKey := range consensus.PublicKeys { - utils.GetLogInstance().Info("Member", "BlsPubKey", pubKey.SerializeToHexStr()) + utils.Logger().Info().Msg("My Committee updated") + for i, pubKey := range consensus.PublicKeys { + utils.Logger().Info().Int("index", i).Str("BlsPubKey", pubKey.SerializeToHexStr()).Msg("Member") consensus.CommitteePublicKeys[pubKey.SerializeToHexStr()] = true } // TODO: use pubkey to identify leader rather than p2p.Peer. consensus.leader = p2p.Peer{ConsensusPubKey: pubKeys[0]} consensus.LeaderPubKey = pubKeys[0] - utils.GetLogInstance().Info("My Leader", "info", consensus.LeaderPubKey.SerializeToHexStr()) + utils.Logger().Info().Str("info", consensus.LeaderPubKey.SerializeToHexStr()).Msg("My Leader") consensus.pubKeyLock.Unlock() // reset states after update public keys consensus.ResetState() @@ -267,8 +267,7 @@ func (consensus *Consensus) VerifySeal(chain consensus_engine.ChainReader, heade if err != nil { return ctxerror.New("[VerifySeal] Unable to deserialize the LastCommitSignature and LastCommitBitmap in Block Header").WithCause(err) } - // TODO: use the quorum of last block instead - if count := utils.CountOneBits(mask.Bitmap); count < consensus.Quorum() { + if count := utils.CountOneBits(mask.Bitmap); count < consensus.PreviousQuorum() { return ctxerror.New("[VerifySeal] Not enough signature in LastCommitSignature from Block Header", "need", consensus.Quorum(), "got", count) } @@ -377,7 +376,9 @@ func (consensus *Consensus) GetViewIDSigsArray() []*bls.Sign { // ResetState resets the state of the consensus func (consensus *Consensus) ResetState() { - consensus.getLogger().Debug("[ResetState] Resetting consensus state", "Phase", consensus.phase) + consensus.getLogger().Debug(). + Str("Phase", consensus.phase.String()). + Msg("[ResetState] Resetting consensus state") consensus.switchPhase(Announce, true) consensus.blockHash = [32]byte{} consensus.blockHeader = []byte{} @@ -396,7 +397,7 @@ func (consensus *Consensus) ResetState() { // Returns a string representation of this consensus func (consensus *Consensus) String() string { var duty string - if nodeconfig.GetDefaultConfig().IsLeader() { + if consensus.IsLeader() { duty = "LDR" // leader } else { duty = "VLD" // validator @@ -472,6 +473,16 @@ func (consensus *Consensus) SetViewID(height uint64) { consensus.viewID = height } +// SetMode sets the mode of consensus +func (consensus *Consensus) SetMode(mode Mode) { + consensus.mode.SetMode(mode) +} + +// Mode returns the mode of consensus +func (consensus *Consensus) Mode() Mode { + return consensus.mode.Mode() +} + // RegisterPRndChannel registers the channel for receiving randomness preimage from DRG protocol func (consensus *Consensus) RegisterPRndChannel(pRndChannel chan []byte) { consensus.PRndChannel = pRndChannel @@ -494,8 +505,14 @@ func (consensus *Consensus) checkViewID(msg *PbftMessage) error { consensus.LeaderPubKey = msg.SenderPubkey consensus.ignoreViewIDCheck = false consensus.consensusTimeout[timeoutConsensus].Start() - utils.GetLogger().Debug("viewID and leaderKey override", "viewID", consensus.viewID, "leaderKey", consensus.LeaderPubKey.SerializeToHexStr()[:20]) - utils.GetLogger().Debug("Start consensus timer", "viewID", consensus.viewID, "block", consensus.blockNum) + utils.Logger().Debug(). + Uint64("viewID", consensus.viewID). + Str("leaderKey", consensus.LeaderPubKey.SerializeToHexStr()[:20]). + Msg("viewID and leaderKey override") + utils.Logger().Debug(). + Uint64("viewID", consensus.viewID). + Uint64("block", consensus.blockNum). + Msg("Start consensus timer") return nil } else if msg.ViewID > consensus.viewID { return consensus_engine.ErrViewIDNotMatch @@ -543,11 +560,11 @@ func readSignatureBitmapByPublicKeys(recvPayload []byte, publicKeys []*bls.Publi } mask, err := bls_cosi.NewMask(publicKeys, nil) if err != nil { - utils.GetLogInstance().Warn("onNewView unable to setup mask for prepared message", "err", err) + utils.Logger().Warn().Err(err).Msg("onNewView unable to setup mask for prepared message") return nil, nil, errors.New("unable to setup mask from payload") } if err := mask.SetMask(bitmap); err != nil { - ctxerror.Warn(utils.GetLogger(), err, "mask.SetMask failed") + utils.Logger().Warn().Err(err).Msg("mask.SetMask failed") } return &aggSig, mask, nil } @@ -557,13 +574,14 @@ func (consensus *Consensus) reportMetrics(block types.Block) { timeElapsed := endTime.Sub(startTime) numOfTxs := len(block.Transactions()) tps := float64(numOfTxs) / timeElapsed.Seconds() - utils.GetLogInstance().Info("TPS Report", - "numOfTXs", numOfTxs, - "startTime", startTime, - "endTime", endTime, - "timeElapsed", timeElapsed, - "TPS", tps, - "consensus", consensus) + utils.Logger().Info(). + Int("numOfTXs", numOfTxs). + Time("startTime", startTime). + Time("endTime", endTime). + Dur("timeElapsed", endTime.Sub(startTime)). + Float64("TPS", tps). + Interface("consensus", consensus). + Msg("TPS Report") // Post metrics profiler := profiler.GetProfiler() @@ -588,20 +606,15 @@ func (consensus *Consensus) reportMetrics(block types.Block) { profiler.LogMetrics(metrics) } -// logger returns a sub-logger with consensus contexts added. -func (consensus *Consensus) logger(logger log.Logger) log.Logger { - return logger.New( - "myBlock", consensus.blockNum, - "myViewID", consensus.viewID, - "phase", consensus.phase, - "mode", consensus.mode.Mode(), - ) -} - // getLogger returns logger for consensus contexts added -func (consensus *Consensus) getLogger() log.Logger { - logger := consensus.logger(utils.GetLogInstance()) - return logger +func (consensus *Consensus) getLogger() *zerolog.Logger { + logger := utils.Logger().With(). + Uint64("myBlock", consensus.blockNum). + Uint64("myViewID", consensus.viewID). + Interface("phase", consensus.phase). + Str("mode", consensus.mode.Mode().String()). + Logger() + return &logger } // retrieve corresponding blsPublicKey from Coinbase Address @@ -644,10 +657,12 @@ func (consensus *Consensus) updateConsensusInformation() { consensus.SetViewID(header.ViewID.Uint64() + 1) leaderPubKey, err := consensus.getLeaderPubKeyFromCoinbase(header) if err != nil || leaderPubKey == nil { - consensus.getLogger().Debug("[SYNC] Unable to get leaderPubKey from coinbase", "error", err) + consensus.getLogger().Debug().Err(err).Msg("[SYNC] Unable to get leaderPubKey from coinbase") consensus.ignoreViewIDCheck = true } else { - consensus.getLogger().Debug("[SYNC] Most Recent LeaderPubKey Updated Based on BlockChain", "leaderPubKey", leaderPubKey.SerializeToHexStr()) + consensus.getLogger().Debug(). + Str("leaderPubKey", leaderPubKey.SerializeToHexStr()). + Msg("[SYNC] Most Recent LeaderPubKey Updated Based on BlockChain") consensus.LeaderPubKey = leaderPubKey } } @@ -681,3 +696,12 @@ func (consensus *Consensus) RecoveryBlockNumber(shardID uint32) uint64 { } return 0 } + +// IsLeader check if the node is a leader or not by comparing the public key of +// the node with the leader public key +func (consensus *Consensus) IsLeader() bool { + if consensus.PubKey != nil && consensus.LeaderPubKey != nil { + return consensus.PubKey.IsEqual(consensus.LeaderPubKey) + } + return false +} diff --git a/consensus/consensus_test.go b/consensus/consensus_test.go index 24a7972f0..24cd4acd2 100644 --- a/consensus/consensus_test.go +++ b/consensus/consensus_test.go @@ -4,7 +4,6 @@ import ( "testing" "github.com/harmony-one/harmony/crypto/bls" - nodeconfig "github.com/harmony-one/harmony/internal/configs/node" "github.com/harmony-one/harmony/internal/utils" "github.com/harmony-one/harmony/p2p" "github.com/harmony-one/harmony/p2p/p2pimpl" @@ -25,10 +24,6 @@ func TestNew(test *testing.T) { test.Errorf("Consensus Id is initialized to the wrong value: %d", consensus.viewID) } - if !nodeconfig.GetDefaultConfig().IsLeader() { - test.Error("Consensus should belong to a leader") - } - if consensus.ReadySignal == nil { test.Error("Consensus ReadySignal should be initialized") } diff --git a/consensus/consensus_v2.go b/consensus/consensus_v2.go index ace1ba1af..02d76ef50 100644 --- a/consensus/consensus_v2.go +++ b/consensus/consensus_v2.go @@ -4,6 +4,7 @@ import ( "bytes" "encoding/binary" "encoding/hex" + "math/big" "time" "github.com/ethereum/go-ethereum/common" @@ -12,8 +13,8 @@ import ( "github.com/harmony-one/bls/ffi/go/bls" "github.com/harmony-one/harmony/api/proto" msg_pb "github.com/harmony-one/harmony/api/proto/message" + "github.com/harmony-one/harmony/core" "github.com/harmony-one/harmony/core/types" - nodeconfig "github.com/harmony-one/harmony/internal/configs/node" "github.com/harmony-one/harmony/internal/ctxerror" "github.com/harmony-one/harmony/internal/utils" "github.com/harmony-one/harmony/p2p" @@ -28,7 +29,7 @@ func (consensus *Consensus) handleMessageUpdate(payload []byte) { msg := &msg_pb.Message{} err := protobuf.Unmarshal(payload, msg) if err != nil { - utils.GetLogger().Error("Failed to unmarshal message payload.", "err", err, "consensus", consensus) + utils.Logger().Error().Err(err).Interface("consensus", consensus).Msg("Failed to unmarshal message payload.") return } @@ -38,16 +39,25 @@ func (consensus *Consensus) handleMessageUpdate(payload []byte) { return } + // listening mode only listening to committed message + if consensus.mode.Mode() == Listening && msg.Type != msg_pb.MessageType_COMMITTED { + return + } + if msg.Type == msg_pb.MessageType_VIEWCHANGE || msg.Type == msg_pb.MessageType_NEWVIEW { if msg.GetViewchange() != nil && msg.GetViewchange().ShardId != consensus.ShardID { - consensus.getLogger().Warn("Received view change message from different shard", - "myShardId", consensus.ShardID, "receivedShardId", msg.GetViewchange().ShardId) + consensus.getLogger().Warn(). + Uint32("myShardId", consensus.ShardID). + Uint32("receivedShardId", msg.GetViewchange().ShardId). + Msg("Received view change message from different shard") return } } else { if msg.GetConsensus() != nil && msg.GetConsensus().ShardId != consensus.ShardID { - consensus.getLogger().Warn("Received consensus message from different shard", - "myShardId", consensus.ShardID, "receivedShardId", msg.GetConsensus().ShardId) + consensus.getLogger().Warn(). + Uint32("myShardId", consensus.ShardID). + Uint32("receivedShardId", msg.GetConsensus().ShardId). + Msg("Received consensus message from different shard") return } } @@ -68,7 +78,6 @@ func (consensus *Consensus) handleMessageUpdate(payload []byte) { case msg_pb.MessageType_NEWVIEW: consensus.onNewView(msg) } - } // TODO: move to consensus_leader.go later @@ -79,12 +88,12 @@ func (consensus *Consensus) announce(block *types.Block) { // prepare message and broadcast to validators encodedBlock, err := rlp.EncodeToBytes(block) if err != nil { - consensus.getLogger().Debug("[Announce] Failed encoding block") + consensus.getLogger().Debug().Msg("[Announce] Failed encoding block") return } encodedBlockHeader, err := rlp.EncodeToBytes(block.Header()) if err != nil { - consensus.getLogger().Debug("[Announce] Failed encoding block header") + consensus.getLogger().Debug().Msg("[Announce] Failed encoding block header") return } @@ -98,61 +107,82 @@ func (consensus *Consensus) announce(block *types.Block) { _ = protobuf.Unmarshal(msgPayload, msg) pbftMsg, err := ParsePbftMessage(msg) if err != nil { - consensus.getLogger().Warn("[Announce] Unable to parse pbft message", "error", err) + consensus.getLogger().Warn().Err(err).Msg("[Announce] Unable to parse pbft message") return } consensus.PbftLog.AddMessage(pbftMsg) - consensus.getLogger().Debug("[Announce] Added Announce message in pbftLog", "MsgblockHash", pbftMsg.BlockHash, "MsgViewID", pbftMsg.ViewID, "MsgBlockNum", pbftMsg.BlockNum) + consensus.getLogger().Debug(). + Str("MsgblockHash", pbftMsg.BlockHash.Hex()). + Uint64("MsgViewID", pbftMsg.ViewID). + Uint64("MsgBlockNum", pbftMsg.BlockNum). + Msg("[Announce] Added Announce message in pbftLog") consensus.PbftLog.AddBlock(block) // Leader sign the block hash itself consensus.prepareSigs[consensus.PubKey.SerializeToHexStr()] = consensus.priKey.SignHash(consensus.blockHash[:]) if err := consensus.prepareBitmap.SetKey(consensus.PubKey, true); err != nil { - consensus.getLogger().Warn("[Announce] Leader prepareBitmap SetKey failed", "error", err) + consensus.getLogger().Warn().Err(err).Msg("[Announce] Leader prepareBitmap SetKey failed") return } // Construct broadcast p2p message if err := consensus.host.SendMessageToGroups([]p2p.GroupID{p2p.NewGroupIDByShardID(p2p.ShardID(consensus.ShardID))}, host.ConstructP2pMessage(byte(17), msgToSend)); err != nil { - consensus.getLogger().Warn("[Announce] Cannot send announce message", "groupID", p2p.NewGroupIDByShardID(p2p.ShardID(consensus.ShardID))) + consensus.getLogger().Warn(). + Str("groupID", string(p2p.NewGroupIDByShardID(p2p.ShardID(consensus.ShardID)))). + Msg("[Announce] Cannot send announce message") } else { - consensus.getLogger().Info("[Announce] Sent Announce Message!!", "BlockHash", block.Hash(), "BlockNum", block.NumberU64()) + consensus.getLogger().Info(). + Str("BlockHash", block.Hash().Hex()). + Uint64("BlockNum", block.NumberU64()). + Msg("[Announce] Sent Announce Message!!") } - consensus.getLogger().Debug("[Announce] Switching phase", "From", consensus.phase, "To", Prepare) + consensus.getLogger().Debug(). + Str("From", consensus.phase.String()). + Str("To", Prepare.String()). + Msg("[Announce] Switching phase") consensus.switchPhase(Prepare, true) } func (consensus *Consensus) onAnnounce(msg *msg_pb.Message) { - consensus.getLogger().Debug("[OnAnnounce] Receive announce message") - if consensus.PubKey.IsEqual(consensus.LeaderPubKey) && consensus.mode.Mode() == Normal { + consensus.getLogger().Debug().Msg("[OnAnnounce] Receive announce message") + if consensus.IsLeader() && consensus.mode.Mode() == Normal { return } senderKey, err := consensus.verifySenderKey(msg) if err != nil { - consensus.getLogger().Debug("[OnAnnounce] VerifySenderKey failed", "error", err) + consensus.getLogger().Error().Err(err).Msg("[OnAnnounce] VerifySenderKey failed") return } if !senderKey.IsEqual(consensus.LeaderPubKey) && consensus.mode.Mode() == Normal && !consensus.ignoreViewIDCheck { - consensus.getLogger().Warn("[OnAnnounce] SenderKey not match leader PubKey", "senderKey", senderKey.SerializeToHexStr(), "leaderKey", consensus.LeaderPubKey.SerializeToHexStr()) + consensus.getLogger().Warn(). + Str("senderKey", senderKey.SerializeToHexStr()). + Str("leaderKey", consensus.LeaderPubKey.SerializeToHexStr()). + Msg("[OnAnnounce] SenderKey not match leader PubKey") return } if err = verifyMessageSig(senderKey, msg); err != nil { - consensus.getLogger().Debug("[OnAnnounce] Failed to verify leader signature", "error", err) + consensus.getLogger().Error().Err(err).Msg("[OnAnnounce] Failed to verify leader signature") return } recvMsg, err := ParsePbftMessage(msg) if err != nil { - consensus.getLogger().Debug("[OnAnnounce] Unparseable leader message", "error", err, "MsgBlockNum", recvMsg.BlockNum) + consensus.getLogger().Error(). + Err(err). + Uint64("MsgBlockNum", recvMsg.BlockNum). + Msg("[OnAnnounce] Unparseable leader message") return } // TODO: remove it after shard0 fix if consensus.NeedsBlockRecovery(recvMsg.BlockNum) { - consensus.getLogger().Debug("[OnAnnounce] Announce message Added", "MsgViewID", recvMsg.ViewID, "MsgBlockNum", recvMsg.BlockNum) + consensus.getLogger().Debug(). + Uint64("MsgViewID", recvMsg.ViewID). + Uint64("MsgBlockNum", recvMsg.BlockNum). + Msg("[OnAnnounce] Announce message Added") consensus.PbftLog.AddMessage(recvMsg) consensus.mutex.Lock() defer consensus.mutex.Unlock() @@ -166,17 +196,27 @@ func (consensus *Consensus) onAnnounce(msg *msg_pb.Message) { var headerObj types.Header err = rlp.DecodeBytes(blockHeader, &headerObj) if err != nil { - consensus.getLogger().Warn("[OnAnnounce] Unparseable block header data", "error", err, "MsgBlockNum", recvMsg.BlockNum) + consensus.getLogger().Warn(). + Err(err). + Uint64("MsgBlockNum", recvMsg.BlockNum). + Msg("[OnAnnounce] Unparseable block header data") return } if recvMsg.BlockNum < consensus.blockNum || recvMsg.BlockNum != headerObj.Number.Uint64() { - consensus.getLogger().Debug("[OnAnnounce] BlockNum not match", "MsgBlockNum", recvMsg.BlockNum, "BlockNum", headerObj.Number) + consensus.getLogger().Debug(). + Uint64("MsgBlockNum", recvMsg.BlockNum). + Str("BlockNum", headerObj.Number.String()). + Msg("[OnAnnounce] BlockNum not match") return } if consensus.mode.Mode() == Normal { if err = consensus.VerifyHeader(consensus.ChainReader, &headerObj, true); err != nil { - consensus.getLogger().Warn("[OnAnnounce] Block content is not verified successfully", "error", err, "inChain", consensus.ChainReader.CurrentHeader().Number, "MsgBlockNum", headerObj.Number) + consensus.getLogger().Warn(). + Err(err). + Str("inChain", consensus.ChainReader.CurrentHeader().Number.String()). + Str("MsgBlockNum", headerObj.Number.String()). + Msg("[OnAnnounce] Block content is not verified successfully") return } } @@ -184,14 +224,21 @@ func (consensus *Consensus) onAnnounce(msg *msg_pb.Message) { logMsgs := consensus.PbftLog.GetMessagesByTypeSeqView(msg_pb.MessageType_ANNOUNCE, recvMsg.BlockNum, recvMsg.ViewID) if len(logMsgs) > 0 { if logMsgs[0].BlockHash != recvMsg.BlockHash { - consensus.getLogger().Debug("[OnAnnounce] Leader is malicious", "leaderKey", consensus.LeaderPubKey.SerializeToHexStr()) + consensus.getLogger().Debug(). + Str("leaderKey", consensus.LeaderPubKey.SerializeToHexStr()). + Msg("[OnAnnounce] Leader is malicious") consensus.startViewChange(consensus.viewID + 1) } - consensus.getLogger().Debug("[OnAnnounce] Announce message received again", "leaderKey", consensus.LeaderPubKey.SerializeToHexStr()) + consensus.getLogger().Debug(). + Str("leaderKey", consensus.LeaderPubKey.SerializeToHexStr()). + Msg("[OnAnnounce] Announce message received again") //return } - consensus.getLogger().Debug("[OnAnnounce] Announce message Added", "MsgViewID", recvMsg.ViewID, "MsgBlockNum", recvMsg.BlockNum) + consensus.getLogger().Debug(). + Uint64("MsgViewID", recvMsg.ViewID). + Uint64("MsgBlockNum", recvMsg.BlockNum). + Msg("[OnAnnounce] Announce message Added") consensus.PbftLog.AddMessage(recvMsg) consensus.mutex.Lock() @@ -201,13 +248,16 @@ func (consensus *Consensus) onAnnounce(msg *msg_pb.Message) { // we have already added message and block, skip check viewID and send prepare message if is in ViewChanging mode if consensus.mode.Mode() == ViewChanging { - consensus.getLogger().Debug("[OnAnnounce] Still in ViewChanging Mode, Exiting !!") + consensus.getLogger().Debug().Msg("[OnAnnounce] Still in ViewChanging Mode, Exiting !!") return } if consensus.checkViewID(recvMsg) != nil { if consensus.mode.Mode() == Normal { - consensus.getLogger().Debug("[OnAnnounce] ViewID check failed", "MsgViewID", recvMsg.ViewID, "msgBlockNum", recvMsg.BlockNum) + consensus.getLogger().Debug(). + Uint64("MsgViewID", recvMsg.ViewID). + Uint64("MsgBlockNum", recvMsg.BlockNum). + Msg("[OnAnnounce] ViewID check failed") } return } @@ -222,44 +272,54 @@ func (consensus *Consensus) prepare() { msgToSend := consensus.constructPrepareMessage() // TODO: this will not return immediatey, may block if err := consensus.host.SendMessageToGroups([]p2p.GroupID{p2p.NewGroupIDByShardID(p2p.ShardID(consensus.ShardID))}, host.ConstructP2pMessage(byte(17), msgToSend)); err != nil { - consensus.getLogger().Warn("[OnAnnounce] Cannot send prepare message") + consensus.getLogger().Warn().Err(err).Msg("[OnAnnounce] Cannot send prepare message") } else { - consensus.getLogger().Info("[OnAnnounce] Sent Prepare Message!!", "BlockHash", hex.EncodeToString(consensus.blockHash[:])) - } - consensus.getLogger().Debug("[Announce] Switching Phase", "From", consensus.phase, "To", Prepare) + consensus.getLogger().Info(). + Str("BlockHash", hex.EncodeToString(consensus.blockHash[:])). + Msg("[OnAnnounce] Sent Prepare Message!!") + } + consensus.getLogger().Debug(). + Str("From", consensus.phase.String()). + Str("To", Prepare.String()). + Msg("[Announce] Switching Phase") consensus.switchPhase(Prepare, true) } // TODO: move to consensus_leader.go later func (consensus *Consensus) onPrepare(msg *msg_pb.Message) { - if !consensus.PubKey.IsEqual(consensus.LeaderPubKey) { + if !consensus.IsLeader() { return } senderKey, err := consensus.verifySenderKey(msg) if err != nil { - consensus.getLogger().Debug("[OnPrepare] VerifySenderKey failed", "error", err) + consensus.getLogger().Error().Err(err).Msg("[OnPrepare] VerifySenderKey failed") return } if err = verifyMessageSig(senderKey, msg); err != nil { - consensus.getLogger().Debug("[OnPrepare] Failed to verify sender's signature", "error", err) + consensus.getLogger().Error().Err(err).Msg("[OnPrepare] Failed to verify sender's signature") return } recvMsg, err := ParsePbftMessage(msg) if err != nil { - consensus.getLogger().Debug("[OnPrepare] Unparseable validator message", "error", err) + consensus.getLogger().Error().Err(err).Msg("[OnPrepare] Unparseable validator message") return } if recvMsg.ViewID != consensus.viewID || recvMsg.BlockNum != consensus.blockNum { - consensus.getLogger().Debug("[OnPrepare] Message ViewId or BlockNum not match", - "MsgViewID", recvMsg.ViewID, "MsgBlockNum", recvMsg.BlockNum) + consensus.getLogger().Debug(). + Uint64("MsgViewID", recvMsg.ViewID). + Uint64("MsgBlockNum", recvMsg.BlockNum). + Msg("[OnPrepare] Message ViewId or BlockNum not match") return } if !consensus.PbftLog.HasMatchingViewAnnounce(consensus.blockNum, consensus.viewID, recvMsg.BlockHash) { - consensus.getLogger().Debug("[OnPrepare] No Matching Announce message", "MsgblockHash", recvMsg.BlockHash, "MsgBlockNum", recvMsg.BlockNum) + consensus.getLogger().Debug(). + Uint64("MsgViewID", recvMsg.ViewID). + Uint64("MsgBlockNum", recvMsg.BlockNum). + Msg("[OnPrepare] No Matching Announce message") //return } @@ -271,15 +331,16 @@ func (consensus *Consensus) onPrepare(msg *msg_pb.Message) { consensus.mutex.Lock() defer consensus.mutex.Unlock() + logger := consensus.getLogger().With().Str("validatorPubKey", validatorPubKey).Logger() if len(prepareSigs) >= consensus.Quorum() { // already have enough signatures - consensus.getLogger().Debug("[OnPrepare] Received Additional Prepare Message", "ValidatorPubKey", validatorPubKey) + logger.Debug().Msg("[OnPrepare] Received Additional Prepare Message") return } // proceed only when the message is not received before _, ok := prepareSigs[validatorPubKey] if ok { - consensus.getLogger().Debug("[OnPrepare] Already Received prepare message from the validator", "ValidatorPubKey", validatorPubKey) + logger.Debug().Msg("[OnPrepare] Already Received prepare message from the validator") return } @@ -287,24 +348,25 @@ func (consensus *Consensus) onPrepare(msg *msg_pb.Message) { var sign bls.Sign err = sign.Deserialize(prepareSig) if err != nil { - consensus.getLogger().Error("[OnPrepare] Failed to deserialize bls signature", "ValidatorPubKey", validatorPubKey) + consensus.getLogger().Error().Err(err).Msg("[OnPrepare] Failed to deserialize bls signature") return } if !sign.VerifyHash(recvMsg.SenderPubkey, consensus.blockHash[:]) { - consensus.getLogger().Error("[OnPrepare] Received invalid BLS signature", "ValidatorPubKey", validatorPubKey) + consensus.getLogger().Error().Msg("[OnPrepare] Received invalid BLS signature") return } - consensus.getLogger().Info("[OnPrepare] Received New Prepare Signature", "NumReceivedSoFar", len(prepareSigs), "validatorPubKey", validatorPubKey, "PublicKeys", len(consensus.PublicKeys)) + logger = logger.With().Int("NumReceivedSoFar", len(prepareSigs)).Int("PublicKeys", len(consensus.PublicKeys)).Logger() + logger.Info().Msg("[OnPrepare] Received New Prepare Signature") prepareSigs[validatorPubKey] = &sign // Set the bitmap indicating that this validator signed. if err := prepareBitmap.SetKey(recvMsg.SenderPubkey, true); err != nil { - consensus.getLogger().Warn("[OnPrepare] prepareBitmap.SetKey failed", "error", err) + consensus.getLogger().Warn().Err(err).Msg("[OnPrepare] prepareBitmap.SetKey failed") return } if len(prepareSigs) >= consensus.Quorum() { - consensus.getLogger().Debug("[OnPrepare] Received Enough Prepare Signatures", "NumReceivedSoFar", len(prepareSigs), "PublicKeys", len(consensus.PublicKeys)) + logger.Debug().Msg("[OnPrepare] Received Enough Prepare Signatures") // Construct and broadcast prepared message msgToSend, aggSig := consensus.constructPreparedMessage() consensus.aggregatedPrepareSig = aggSig @@ -315,7 +377,7 @@ func (consensus *Consensus) onPrepare(msg *msg_pb.Message) { _ = protobuf.Unmarshal(msgPayload, msg) pbftMsg, err := ParsePbftMessage(msg) if err != nil { - consensus.getLogger().Warn("[OnPrepare] Unable to parse pbft message", "error", err) + consensus.getLogger().Warn().Err(err).Msg("[OnPrepare] Unable to parse pbft message") return } consensus.PbftLog.AddMessage(pbftMsg) @@ -326,47 +388,56 @@ func (consensus *Consensus) onPrepare(msg *msg_pb.Message) { commitPayload := append(blockNumHash, consensus.blockHash[:]...) consensus.commitSigs[consensus.PubKey.SerializeToHexStr()] = consensus.priKey.SignHash(commitPayload) if err := consensus.commitBitmap.SetKey(consensus.PubKey, true); err != nil { - consensus.getLogger().Debug("[OnPrepare] Leader commit bitmap set failed") + consensus.getLogger().Debug().Msg("[OnPrepare] Leader commit bitmap set failed") return } if err := consensus.host.SendMessageToGroups([]p2p.GroupID{p2p.NewGroupIDByShardID(p2p.ShardID(consensus.ShardID))}, host.ConstructP2pMessage(byte(17), msgToSend)); err != nil { - consensus.getLogger().Warn("[OnPrepare] Cannot send prepared message") + consensus.getLogger().Warn().Msg("[OnPrepare] Cannot send prepared message") } else { - consensus.getLogger().Debug("[OnPrepare] Sent Prepared Message!!", "BlockHash", consensus.blockHash, "BlockNum", consensus.blockNum) + consensus.getLogger().Debug(). + Bytes("BlockHash", consensus.blockHash[:]). + Uint64("BlockNum", consensus.blockNum). + Msg("[OnPrepare] Sent Prepared Message!!") } - consensus.getLogger().Debug("[OnPrepare] Switching phase", "From", consensus.phase, "To", Commit) + consensus.getLogger().Debug(). + Str("From", consensus.phase.String()). + Str("To", Commit.String()). + Msg("[OnPrepare] Switching phase") consensus.switchPhase(Commit, true) } return } func (consensus *Consensus) onPrepared(msg *msg_pb.Message) { - consensus.getLogger().Debug("[OnPrepared] Received Prepared message") - if consensus.PubKey.IsEqual(consensus.LeaderPubKey) && consensus.mode.Mode() == Normal { + consensus.getLogger().Debug().Msg("[OnPrepared] Received Prepared message") + if consensus.IsLeader() && consensus.mode.Mode() == Normal { return } senderKey, err := consensus.verifySenderKey(msg) if err != nil { - consensus.getLogger().Debug("[OnPrepared] VerifySenderKey failed", "error", err) + consensus.getLogger().Debug().Err(err).Msg("[OnPrepared] VerifySenderKey failed") return } if !senderKey.IsEqual(consensus.LeaderPubKey) && consensus.mode.Mode() == Normal && !consensus.ignoreViewIDCheck { - consensus.getLogger().Warn("[OnPrepared] SenderKey not match leader PubKey") + consensus.getLogger().Warn().Msg("[OnPrepared] SenderKey not match leader PubKey") return } if err := verifyMessageSig(senderKey, msg); err != nil { - consensus.getLogger().Debug("[OnPrepared] Failed to verify sender's signature", "error", err) + consensus.getLogger().Debug().Err(err).Msg("[OnPrepared] Failed to verify sender's signature") return } recvMsg, err := ParsePbftMessage(msg) if err != nil { - consensus.getLogger().Debug("[OnPrepared] Unparseable validator message", "error", err) + consensus.getLogger().Debug().Err(err).Msg("[OnPrepared] Unparseable validator message") return } - consensus.getLogger().Info("[OnPrepared] Received prepared message", "MsgBlockNum", recvMsg.BlockNum, "MsgViewID", recvMsg.ViewID) + consensus.getLogger().Info(). + Uint64("MsgBlockNum", recvMsg.BlockNum). + Uint64("MsgViewID", recvMsg.ViewID). + Msg("[OnPrepared] Received prepared message") // TODO: remove it after fix if consensus.NeedsBlockRecovery(recvMsg.BlockNum) { @@ -374,13 +445,20 @@ func (consensus *Consensus) onPrepared(msg *msg_pb.Message) { var blockObj types.Block err = rlp.DecodeBytes(block, &blockObj) if err != nil { - consensus.getLogger().Warn("[OnPrepared] Unparseable block header data", "error", err, "MsgBlockNum", recvMsg.BlockNum) + consensus.getLogger().Warn(). + Err(err). + Uint64("MsgBlockNum", recvMsg.BlockNum). + Msg("[OnPrepared] Unparseable block header data") return } consensus.PbftLog.AddBlock(&blockObj) recvMsg.Block = []byte{} // save memory space consensus.PbftLog.AddMessage(recvMsg) - consensus.getLogger().Debug("[OnPrepared] Prepared message and block added", "MsgViewID", recvMsg.ViewID, "MsgBlockNum", recvMsg.BlockNum, "blockHash", recvMsg.BlockHash) + consensus.getLogger().Debug(). + Uint64("MsgViewID", recvMsg.ViewID). + Uint64("MsgBlockNum", recvMsg.BlockNum). + Bytes("blockHash", recvMsg.BlockHash[:]). + Msg("[OnPrepared] Prepared message and block added") // add block field blockPayload := make([]byte, len(block)) @@ -394,19 +472,25 @@ func (consensus *Consensus) onPrepared(msg *msg_pb.Message) { msgToSend := consensus.constructCommitMessage(commitPayload) if err := consensus.host.SendMessageToGroups([]p2p.GroupID{p2p.NewGroupIDByShardID(p2p.ShardID(consensus.ShardID))}, host.ConstructP2pMessage(byte(17), msgToSend)); err != nil { - consensus.getLogger().Warn("[OnPrepared] Cannot send commit message!!") + consensus.getLogger().Warn(). + Msg("[OnPrepared] Cannot send commit message!!") } else { - consensus.getLogger().Info("[OnPrepared] Sent Commit Message!!", "BlockHash", consensus.blockHash, "BlockNum", consensus.blockNum) + consensus.getLogger().Info(). + Bytes("BlockHash", consensus.blockHash[:]). + Uint64("BlockNum", consensus.blockNum). + Msg("[OnPrepared] Sent Commit Message!!") } - consensus.getLogger().Debug("[OnPrepared] Switching phase", "From", consensus.phase, "To", Commit) + consensus.getLogger().Debug(). + Str("From", string(consensus.phase)). + Str("To", string(Commit)). + Msg("[OnPrepared] Switching phase") consensus.switchPhase(Commit, true) return } if recvMsg.BlockNum < consensus.blockNum { - consensus.getLogger().Debug("Old Block Received, ignoring!!", - "MsgBlockNum", recvMsg.BlockNum) + consensus.getLogger().Debug().Uint64("MsgBlockNum", recvMsg.BlockNum).Msg("Old Block Received, ignoring!!") return } @@ -414,17 +498,23 @@ func (consensus *Consensus) onPrepared(msg *msg_pb.Message) { blockHash := recvMsg.BlockHash aggSig, mask, err := consensus.ReadSignatureBitmapPayload(recvMsg.Payload, 0) if err != nil { - consensus.getLogger().Error("ReadSignatureBitmapPayload failed!!", "error", err) + consensus.getLogger().Error().Err(err).Msg("ReadSignatureBitmapPayload failed!!") return } if count := utils.CountOneBits(mask.Bitmap); count < consensus.Quorum() { - consensus.getLogger().Debug("Not enough signatures in the Prepared msg", "Need", consensus.Quorum(), "Got", count) + consensus.getLogger().Debug(). + Int("Need", consensus.Quorum()). + Int("Got", count). + Msg("Not enough signatures in the Prepared msg") return } if !aggSig.VerifyHash(mask.AggregatePublic, blockHash[:]) { myBlockHash := common.Hash{} myBlockHash.SetBytes(consensus.blockHash[:]) - consensus.getLogger().Warn("[OnPrepared] failed to verify multi signature for prepare phase", "MsgBlockHash", recvMsg.BlockHash, "myBlockHash", myBlockHash) + consensus.getLogger().Warn(). + Uint64("MsgBlockNum", recvMsg.BlockNum). + Uint64("MsgViewID", recvMsg.ViewID). + Msg("[OnPrepared] failed to verify multi signature for prepare phase") return } @@ -433,26 +523,40 @@ func (consensus *Consensus) onPrepared(msg *msg_pb.Message) { var blockObj types.Block err = rlp.DecodeBytes(block, &blockObj) if err != nil { - consensus.getLogger().Warn("[OnPrepared] Unparseable block header data", "error", err, "MsgBlockNum", recvMsg.BlockNum) + consensus.getLogger().Warn(). + Err(err). + Uint64("MsgBlockNum", recvMsg.BlockNum). + Msg("[OnPrepared] Unparseable block header data") return } if blockObj.NumberU64() != recvMsg.BlockNum || recvMsg.BlockNum < consensus.blockNum { - consensus.getLogger().Warn("[OnPrepared] BlockNum not match", "MsgBlockNum", recvMsg.BlockNum, "blockNum", blockObj.NumberU64()) + consensus.getLogger().Warn(). + Uint64("MsgBlockNum", recvMsg.BlockNum). + Uint64("blockNum", blockObj.NumberU64()). + Msg("[OnPrepared] BlockNum not match") return } if blockObj.Header().Hash() != recvMsg.BlockHash { - consensus.getLogger().Warn("[OnPrepared] BlockHash not match", "MsgBlockNum", recvMsg.BlockNum, "MsgBlockHash", recvMsg.BlockHash, "blockObjHash", blockObj.Header().Hash()) + consensus.getLogger().Warn(). + Uint64("MsgBlockNum", recvMsg.BlockNum). + Bytes("MsgBlockHash", recvMsg.BlockHash[:]). + Str("blockObjHash", blockObj.Header().Hash().Hex()). + Msg("[OnPrepared] BlockHash not match") return } if consensus.mode.Mode() == Normal { if err := consensus.VerifyHeader(consensus.ChainReader, blockObj.Header(), true); err != nil { - consensus.getLogger().Warn("[OnPrepared] Block header is not verified successfully", "error", err, "inChain", consensus.ChainReader.CurrentHeader().Number, "MsgBlockNum", blockObj.Header().Number) + consensus.getLogger().Warn(). + Err(err). + Str("inChain", consensus.ChainReader.CurrentHeader().Number.String()). + Str("MsgBlockNum", blockObj.Header().Number.String()). + Msg("[OnPrepared] Block header is not verified successfully") return } if consensus.BlockVerifier == nil { // do nothing } else if err := consensus.BlockVerifier(&blockObj); err != nil { - consensus.getLogger().Info("[OnPrepared] Block verification failed", "error", err) + consensus.getLogger().Error().Err(err).Msg("[OnPrepared] Block verification failed") return } } @@ -460,26 +564,34 @@ func (consensus *Consensus) onPrepared(msg *msg_pb.Message) { consensus.PbftLog.AddBlock(&blockObj) recvMsg.Block = []byte{} // save memory space consensus.PbftLog.AddMessage(recvMsg) - consensus.getLogger().Debug("[OnPrepared] Prepared message and block added", "MsgViewID", recvMsg.ViewID, "MsgBlockNum", recvMsg.BlockNum, "blockHash", recvMsg.BlockHash) + consensus.getLogger().Debug(). + Uint64("MsgViewID", recvMsg.ViewID). + Uint64("MsgBlockNum", recvMsg.BlockNum). + Bytes("blockHash", recvMsg.BlockHash[:]). + Msg("[OnPrepared] Prepared message and block added") consensus.mutex.Lock() defer consensus.mutex.Unlock() consensus.tryCatchup() if consensus.mode.Mode() == ViewChanging { - consensus.getLogger().Debug("[OnPrepared] Still in ViewChanging mode, Exiting !!") + consensus.getLogger().Debug().Msg("[OnPrepared] Still in ViewChanging mode, Exiting!!") return } if consensus.checkViewID(recvMsg) != nil { if consensus.mode.Mode() == Normal { - consensus.getLogger().Debug("[OnPrepared] ViewID check failed", "MsgViewID", recvMsg.ViewID, "MsgBlockNum", recvMsg.BlockNum) + consensus.getLogger().Debug(). + Uint64("MsgViewID", recvMsg.ViewID). + Uint64("MsgBlockNum", recvMsg.BlockNum). + Msg("[OnPrepared] ViewID check failed") } return } if recvMsg.BlockNum > consensus.blockNum { - consensus.getLogger().Debug("[OnPrepared] Future Block Received, ignoring!!", - "MsgBlockNum", recvMsg.BlockNum) + consensus.getLogger().Debug(). + Uint64("MsgBlockNum", recvMsg.BlockNum). + Msg("[OnPrepared] Future Block Received, ignoring!!") return } @@ -510,12 +622,18 @@ func (consensus *Consensus) onPrepared(msg *msg_pb.Message) { } if err := consensus.host.SendMessageToGroups([]p2p.GroupID{p2p.NewGroupIDByShardID(p2p.ShardID(consensus.ShardID))}, host.ConstructP2pMessage(byte(17), msgToSend)); err != nil { - consensus.getLogger().Warn("[OnPrepared] Cannot send commit message!!") + consensus.getLogger().Warn().Msg("[OnPrepared] Cannot send commit message!!") } else { - consensus.getLogger().Info("[OnPrepared] Sent Commit Message!!", "BlockHash", consensus.blockHash, "BlockNum", consensus.blockNum) + consensus.getLogger().Info(). + Uint64("BlockNum", consensus.blockNum). + Bytes("BlockHash", consensus.blockHash[:]). + Msg("[OnPrepared] Sent Commit Message!!") } - consensus.getLogger().Debug("[OnPrepared] Switching phase", "From", consensus.phase, "To", Commit) + consensus.getLogger().Debug(). + Str("From", consensus.phase.String()). + Str("To", Commit.String()). + Msg("[OnPrepared] Switching phase") consensus.switchPhase(Commit, true) return @@ -523,38 +641,47 @@ func (consensus *Consensus) onPrepared(msg *msg_pb.Message) { // TODO: move it to consensus_leader.go later func (consensus *Consensus) onCommit(msg *msg_pb.Message) { - if !consensus.PubKey.IsEqual(consensus.LeaderPubKey) { + if !consensus.IsLeader() { return } senderKey, err := consensus.verifySenderKey(msg) if err != nil { - consensus.getLogger().Debug("[OnCommit] VerifySenderKey Failed", "error", err) + consensus.getLogger().Debug().Err(err).Msg("[OnCommit] VerifySenderKey Failed") return } if err = verifyMessageSig(senderKey, msg); err != nil { - consensus.getLogger().Debug("[OnCommit] Failed to verify sender's signature", "error", err) + consensus.getLogger().Debug().Err(err).Msg("[OnCommit] Failed to verify sender's signature") return } recvMsg, err := ParsePbftMessage(msg) if err != nil { - consensus.getLogger().Debug("[OnCommit] Parse pbft message failed", "error", err) + consensus.getLogger().Debug().Err(err).Msg("[OnCommit] Parse pbft message failed") return } if recvMsg.ViewID != consensus.viewID || recvMsg.BlockNum != consensus.blockNum { - consensus.getLogger().Debug("[OnCommit] BlockNum/viewID not match", "MsgViewID", recvMsg.ViewID, "MsgBlockNum", recvMsg.BlockNum, "ValidatorPubKey", recvMsg.SenderPubkey.SerializeToHexStr()) + consensus.getLogger().Debug(). + Uint64("MsgViewID", recvMsg.ViewID). + Uint64("MsgBlockNum", recvMsg.BlockNum). + Str("ValidatorPubKey", recvMsg.SenderPubkey.SerializeToHexStr()). + Msg("[OnCommit] BlockNum/viewID not match") return } if !consensus.PbftLog.HasMatchingAnnounce(consensus.blockNum, recvMsg.BlockHash) { - consensus.getLogger().Debug("[OnCommit] Cannot find matching blockhash", "MsgBlockHash", recvMsg.BlockHash, "MsgBlockNum", recvMsg.BlockNum) + consensus.getLogger().Debug(). + Bytes("MsgBlockHash", recvMsg.BlockHash[:]). + Uint64("MsgBlockNum", recvMsg.BlockNum). + Msg("[OnCommit] Cannot find matching blockhash") return } if !consensus.PbftLog.HasMatchingPrepared(consensus.blockNum, recvMsg.BlockHash) { - consensus.getLogger().Debug("[OnCommit] Cannot find matching prepared message", "blockHash", recvMsg.BlockHash) + consensus.getLogger().Debug(). + Bytes("blockHash", recvMsg.BlockHash[:]). + Msg("[OnCommit] Cannot find matching prepared message") return } @@ -565,8 +692,9 @@ func (consensus *Consensus) onCommit(msg *msg_pb.Message) { consensus.mutex.Lock() defer consensus.mutex.Unlock() + logger := consensus.getLogger().With().Str("validatorPubKey", validatorPubKey).Logger() if !consensus.IsValidatorInCommittee(recvMsg.SenderPubkey) { - consensus.getLogger().Error("[OnCommit] Invalid validator", "validatorPubKey", validatorPubKey) + logger.Error().Msg("[OnCommit] Invalid validator") return } @@ -576,7 +704,7 @@ func (consensus *Consensus) onCommit(msg *msg_pb.Message) { // proceed only when the message is not received before _, ok := commitSigs[validatorPubKey] if ok { - consensus.getLogger().Debug("[OnCommit] Already received commit message from the validator", "validatorPubKey", validatorPubKey) + logger.Debug().Msg("[OnCommit] Already received commit message from the validator") return } @@ -586,22 +714,24 @@ func (consensus *Consensus) onCommit(msg *msg_pb.Message) { var sign bls.Sign err = sign.Deserialize(commitSig) if err != nil { - consensus.getLogger().Debug("[OnCommit] Failed to deserialize bls signature", "validatorPubKey", validatorPubKey) + logger.Debug().Msg("[OnCommit] Failed to deserialize bls signature") return } blockNumHash := make([]byte, 8) binary.LittleEndian.PutUint64(blockNumHash, recvMsg.BlockNum) commitPayload := append(blockNumHash, recvMsg.BlockHash[:]...) + logger = logger.With().Uint64("MsgViewID", recvMsg.ViewID).Uint64("MsgBlockNum", recvMsg.BlockNum).Logger() if !sign.VerifyHash(recvMsg.SenderPubkey, commitPayload) { - consensus.getLogger().Error("[OnCommit] Cannot verify commit message", "MsgViewID", recvMsg.ViewID, "MsgBlockNum", recvMsg.BlockNum) + logger.Error().Msg("[OnCommit] Cannot verify commit message") return } - consensus.getLogger().Info("[OnCommit] Received new commit message", "numReceivedSoFar", len(commitSigs), "MsgViewID", recvMsg.ViewID, "MsgBlockNum", recvMsg.BlockNum, "validatorPubKey", validatorPubKey) + logger = logger.With().Int("numReceivedSoFar", len(commitSigs)).Logger() + logger.Info().Msg("[OnCommit] Received new commit message") commitSigs[validatorPubKey] = &sign // Set the bitmap indicating that this validator signed. if err := commitBitmap.SetKey(recvMsg.SenderPubkey, true); err != nil { - consensus.getLogger().Warn("[OnCommit] commitBitmap.SetKey failed", "error", err) + consensus.getLogger().Warn().Err(err).Msg("[OnCommit] commitBitmap.SetKey failed") return } @@ -609,10 +739,10 @@ func (consensus *Consensus) onCommit(msg *msg_pb.Message) { rewardThresholdIsMet := len(commitSigs) >= consensus.RewardThreshold() if !quorumWasMet && quorumIsMet { - consensus.getLogger().Info("[OnCommit] 2/3 Enough commits received", "NumCommits", len(commitSigs)) + logger.Info().Msg("[OnCommit] 2/3 Enough commits received") go func(viewID uint64) { time.Sleep(2 * time.Second) - consensus.getLogger().Debug("[OnCommit] Commit Grace Period Ended", "NumCommits", len(commitSigs)) + logger.Debug().Msg("[OnCommit] Commit Grace Period Ended") consensus.commitFinishChan <- viewID }(consensus.viewID) } @@ -620,13 +750,13 @@ func (consensus *Consensus) onCommit(msg *msg_pb.Message) { if rewardThresholdIsMet { go func(viewID uint64) { consensus.commitFinishChan <- viewID - consensus.getLogger().Info("[OnCommit] 90% Enough commits received", "NumCommits", len(commitSigs)) + logger.Info().Msg("[OnCommit] 90% Enough commits received") }(consensus.viewID) } } func (consensus *Consensus) finalizeCommits() { - consensus.getLogger().Info("[Finalizing] Finalizing Block", "NumCommits", len(consensus.commitSigs)) + consensus.getLogger().Info().Int("NumCommits", len(consensus.commitSigs)).Msg("[Finalizing] Finalizing Block") beforeCatchupNum := consensus.blockNum beforeCatchupViewID := consensus.viewID @@ -641,7 +771,7 @@ func (consensus *Consensus) finalizeCommits() { _ = protobuf.Unmarshal(msgPayload, msg) pbftMsg, err := ParsePbftMessage(msg) if err != nil { - consensus.getLogger().Warn("[FinalizeCommits] Unable to parse pbft message", "error", err) + consensus.getLogger().Warn().Err(err).Msg("[FinalizeCommits] Unable to parse pbft message") return } consensus.PbftLog.AddMessage(pbftMsg) @@ -650,19 +780,26 @@ func (consensus *Consensus) finalizeCommits() { // find correct block content block := consensus.PbftLog.GetBlockByHash(consensus.blockHash) if block == nil { - consensus.getLogger().Warn("[FinalizeCommits] Cannot find block by hash", "blockHash", hex.EncodeToString(consensus.blockHash[:])) + consensus.getLogger().Warn(). + Str("blockHash", hex.EncodeToString(consensus.blockHash[:])). + Msg("[FinalizeCommits] Cannot find block by hash") return } consensus.tryCatchup() if consensus.blockNum-beforeCatchupNum != 1 { - consensus.getLogger().Warn("[FinalizeCommits] Leader cannot provide the correct block for committed message", "beforeCatchupBlockNum", beforeCatchupNum) + consensus.getLogger().Warn(). + Uint64("beforeCatchupBlockNum", beforeCatchupNum). + Msg("[FinalizeCommits] Leader cannot provide the correct block for committed message") return } // if leader success finalize the block, send committed message to validators if err := consensus.host.SendMessageToGroups([]p2p.GroupID{p2p.NewGroupIDByShardID(p2p.ShardID(consensus.ShardID))}, host.ConstructP2pMessage(byte(17), msgToSend)); err != nil { - consensus.getLogger().Warn("[Finalizing] Cannot send committed message", "error", err) + consensus.getLogger().Warn().Err(err).Msg("[Finalizing] Cannot send committed message") } else { - consensus.getLogger().Info("[Finalizing] Sent Committed Message", "BlockHash", consensus.blockHash, "BlockNum", consensus.blockNum) + consensus.getLogger().Info(). + Bytes("BlockHash", consensus.blockHash[:]). + Uint64("BlockNum", consensus.blockNum). + Msg("[Finalizing] Sent Committed Message") } consensus.reportMetrics(*block) @@ -675,56 +812,95 @@ func (consensus *Consensus) finalizeCommits() { if consensus.consensusTimeout[timeoutBootstrap].IsActive() { consensus.consensusTimeout[timeoutBootstrap].Stop() - consensus.getLogger().Debug("[Finalizing] Start consensus timer; stop bootstrap timer only once") + consensus.getLogger().Debug().Msg("[Finalizing] Start consensus timer; stop bootstrap timer only once") } else { - consensus.getLogger().Debug("[Finalizing] Start consensus timer") + consensus.getLogger().Debug().Msg("[Finalizing] Start consensus timer") } consensus.consensusTimeout[timeoutConsensus].Start() - consensus.getLogger().Info("HOORAY!!!!!!! CONSENSUS REACHED!!!!!!!", "BlockNum", beforeCatchupNum, "ViewId", beforeCatchupViewID, "BlockHash", block.Hash(), "index", consensus.getIndexOfPubKey(consensus.PubKey)) + consensus.getLogger().Info(). + Uint64("BlockNum", beforeCatchupNum). + Uint64("ViewId", beforeCatchupViewID). + Str("BlockHash", block.Hash().String()). + Int("index", consensus.getIndexOfPubKey(consensus.PubKey)). + Msg("HOORAY!!!!!!! CONSENSUS REACHED!!!!!!!") // Send signal to Node so the new block can be added and new round of consensus can be triggered consensus.ReadySignal <- struct{}{} } func (consensus *Consensus) onCommitted(msg *msg_pb.Message) { - consensus.getLogger().Debug("[OnCommitted] Receive committed message") + consensus.getLogger().Debug().Msg("[OnCommitted] Receive committed message") + + // TODO: this is temp hack for update new node's committee information; remove it after staking and resharding finished + if consensus.mode.Mode() == Listening { + recvMsg, err := ParsePbftMessage(msg) + if err != nil { + consensus.getLogger().Warn().Msg("[OnCommitted] unable to parse msg") + return + } + // check whether the block is the last block of epoch + if core.ShardingSchedule.IsLastBlock(recvMsg.BlockNum) { + epoch := core.ShardingSchedule.CalcEpochNumber(recvMsg.BlockNum) + nextEpoch := new(big.Int).Add(epoch, common.Big1) + pubKeys := core.GetPublicKeys(nextEpoch, consensus.ShardID) + if len(pubKeys) == 0 { + consensus.getLogger().Info().Msg("[OnCommitted] PublicKeys is Empty, Cannot update public keys") + return + } + consensus.getLogger().Info().Int("numKeys", len(pubKeys)).Msg("[OnCommitted] Update Shard Info and PublicKeys") - if consensus.PubKey.IsEqual(consensus.LeaderPubKey) && consensus.mode.Mode() == Normal { + for _, key := range pubKeys { + if key.IsEqual(consensus.PubKey) { + consensus.getLogger().Info().Uint64("blockNum", recvMsg.BlockNum).Msg("[OnCommitted] Successfully updated public keys for next epoch") + consensus.UpdatePublicKeys(pubKeys) + consensus.mode.SetMode(Normal) + } + } + } + return + } + + if consensus.IsLeader() && consensus.mode.Mode() == Normal { return } senderKey, err := consensus.verifySenderKey(msg) if err != nil { - consensus.getLogger().Warn("[OnCommitted] verifySenderKey failed", "error", err) + consensus.getLogger().Warn().Err(err).Msg("[OnCommitted] verifySenderKey failed") return } if !senderKey.IsEqual(consensus.LeaderPubKey) && consensus.mode.Mode() == Normal && !consensus.ignoreViewIDCheck { - consensus.getLogger().Warn("[OnCommitted] senderKey not match leader PubKey") + consensus.getLogger().Warn().Msg("[OnCommitted] senderKey not match leader PubKey") return } if err = verifyMessageSig(senderKey, msg); err != nil { - consensus.getLogger().Warn("[OnCommitted] Failed to verify sender's signature", "error", err) + consensus.getLogger().Warn().Err(err).Msg("[OnCommitted] Failed to verify sender's signature") return } recvMsg, err := ParsePbftMessage(msg) if err != nil { - consensus.getLogger().Warn("[OnCommitted] unable to parse msg", "error", err) + consensus.getLogger().Warn().Msg("[OnCommitted] unable to parse msg") return } // TODO: remove it after fix if consensus.NeedsBlockRecovery(recvMsg.BlockNum) { consensus.PbftLog.AddMessage(recvMsg) - consensus.getLogger().Debug("[OnCommitted] Committed message added", "MsgViewID", recvMsg.ViewID, "MsgBlockNum", recvMsg.BlockNum) + consensus.getLogger().Debug(). + Uint64("MsgViewID", recvMsg.ViewID). + Uint64("MsgBlockNum", recvMsg.BlockNum). + Msg("[OnCommitted] Committed message added") consensus.tryCatchup() if consensus.consensusTimeout[timeoutBootstrap].IsActive() { consensus.consensusTimeout[timeoutBootstrap].Stop() - consensus.getLogger().Debug("[OnCommitted] Start consensus timer; stop bootstrap timer only once") + consensus.getLogger().Debug(). + Msg("[OnCommitted] Start consensus timer; stop bootstrap timer only once") } else { - consensus.getLogger().Debug("[OnCommitted] Start consensus timer") + consensus.getLogger().Debug(). + Msg("[OnCommitted] Start consensus timer") } consensus.consensusTimeout[timeoutConsensus].Start() return @@ -732,19 +908,24 @@ func (consensus *Consensus) onCommitted(msg *msg_pb.Message) { } if recvMsg.BlockNum < consensus.blockNum { - consensus.getLogger().Info("[OnCommitted] Received Old Blocks!!", "MsgBlockNum", recvMsg.BlockNum) + consensus.getLogger().Info(). + Uint64("MsgBlockNum", recvMsg.BlockNum). + Msg("[OnCommitted] Received Old Blocks!!") return } aggSig, mask, err := consensus.ReadSignatureBitmapPayload(recvMsg.Payload, 0) if err != nil { - consensus.getLogger().Error("[OnCommitted] readSignatureBitmapPayload failed", "error", err) + consensus.getLogger().Error().Err(err).Msg("[OnCommitted] readSignatureBitmapPayload failed") return } // check has 2f+1 signatures if count := utils.CountOneBits(mask.Bitmap); count < consensus.Quorum() { - consensus.getLogger().Warn("[OnCommitted] Not enough signature in committed msg", "need", consensus.Quorum(), "got", count) + consensus.getLogger().Warn(). + Int("need", consensus.Quorum()). + Int("got", count). + Msg("[OnCommitted] Not enough signature in committed msg") return } @@ -752,13 +933,18 @@ func (consensus *Consensus) onCommitted(msg *msg_pb.Message) { binary.LittleEndian.PutUint64(blockNumBytes, recvMsg.BlockNum) commitPayload := append(blockNumBytes, recvMsg.BlockHash[:]...) if !aggSig.VerifyHash(mask.AggregatePublic, commitPayload) { - consensus.getLogger().Error("[OnCommitted] Failed to verify the multi signature for commit phase", "MsgBlockNum", recvMsg.BlockNum) + consensus.getLogger().Error(). + Uint64("MsgBlockNum", recvMsg.BlockNum). + Msg("[OnCommitted] Failed to verify the multi signature for commit phase") return } consensus.PbftLog.AddMessage(recvMsg) consensus.ChainReader.WriteLastCommits(recvMsg.Payload) - consensus.getLogger().Debug("[OnCommitted] Committed message added", "MsgViewID", recvMsg.ViewID, "MsgBlockNum", recvMsg.BlockNum) + consensus.getLogger().Debug(). + Uint64("MsgViewID", recvMsg.ViewID). + Uint64("MsgBlockNum", recvMsg.BlockNum). + Msg("[OnCommitted] Committed message added") consensus.mutex.Lock() defer consensus.mutex.Unlock() @@ -767,7 +953,7 @@ func (consensus *Consensus) onCommitted(msg *msg_pb.Message) { consensus.commitBitmap = mask if recvMsg.BlockNum-consensus.blockNum > consensusBlockNumBuffer { - consensus.getLogger().Debug("[OnCommitted] out of sync", "MsgBlockNum", recvMsg.BlockNum) + consensus.getLogger().Debug().Uint64("MsgBlockNum", recvMsg.BlockNum).Msg("[OnCommitted] out of sync") go func() { select { case consensus.blockNumLowChan <- struct{}{}: @@ -788,15 +974,15 @@ func (consensus *Consensus) onCommitted(msg *msg_pb.Message) { consensus.tryCatchup() if consensus.mode.Mode() == ViewChanging { - consensus.getLogger().Debug("[OnCommitted] Still in ViewChanging mode, Exiting !!") + consensus.getLogger().Debug().Msg("[OnCommitted] Still in ViewChanging mode, Exiting!!") return } if consensus.consensusTimeout[timeoutBootstrap].IsActive() { consensus.consensusTimeout[timeoutBootstrap].Stop() - consensus.getLogger().Debug("[OnCommitted] Start consensus timer; stop bootstrap timer only once") + consensus.getLogger().Debug().Msg("[OnCommitted] Start consensus timer; stop bootstrap timer only once") } else { - consensus.getLogger().Debug("[OnCommitted] Start consensus timer") + consensus.getLogger().Debug().Msg("[OnCommitted] Start consensus timer") } consensus.consensusTimeout[timeoutConsensus].Start() return @@ -828,7 +1014,7 @@ func (consensus *Consensus) LastCommitSig() ([]byte, []byte, error) { // try to catch up if fall behind func (consensus *Consensus) tryCatchup() { - consensus.getLogger().Info("[TryCatchup] commit new blocks") + consensus.getLogger().Info().Msg("[TryCatchup] commit new blocks") // if consensus.phase != Commit && consensus.mode.Mode() == Normal { // return // } @@ -839,9 +1025,11 @@ func (consensus *Consensus) tryCatchup() { break } if len(msgs) > 1 { - consensus.getLogger().Error("[TryCatchup] DANGER!!! we should only get one committed message for a given blockNum", "numMsgs", len(msgs)) + consensus.getLogger().Error(). + Int("numMsgs", len(msgs)). + Msg("[TryCatchup] DANGER!!! we should only get one committed message for a given blockNum") } - consensus.getLogger().Info("[TryCatchup] committed message found") + consensus.getLogger().Info().Msg("[TryCatchup] committed message found") block := consensus.PbftLog.GetBlockByHash(msgs[0].BlockHash) if block == nil { @@ -849,7 +1037,7 @@ func (consensus *Consensus) tryCatchup() { } if consensus.NeedsBlockRecovery(block.NumberU64()) && block.NumberU64() == consensus.ChainReader.CurrentHeader().Number.Uint64() { - consensus.getLogger().Info("[TryCatchup] Skip Commit ReProposeBlock") + consensus.getLogger().Info().Msg("[TryCatchup] Skip Commit ReProposeBlock") consensus.blockNum = block.NumberU64() + 1 consensus.viewID = msgs[0].ViewID + 1 consensus.ResetState() @@ -857,7 +1045,7 @@ func (consensus *Consensus) tryCatchup() { } if consensus.NeedsBlockRecovery(block.NumberU64()) && block.NumberU64() != consensus.ChainReader.CurrentHeader().Number.Uint64() { - consensus.getLogger().Info("[TryCatchup] Commit ReProposeBlock") + consensus.getLogger().Info().Msg("[TryCatchup] Commit ReProposeBlock") consensus.blockNum = block.NumberU64() + 1 consensus.viewID = msgs[0].ViewID + 1 consensus.OnConsensusDone(block) @@ -868,43 +1056,58 @@ func (consensus *Consensus) tryCatchup() { if consensus.BlockVerifier == nil { // do nothing } else if err := consensus.BlockVerifier(block); err != nil { - consensus.getLogger().Info("[TryCatchup]block verification faied") + consensus.getLogger().Info().Msg("[TryCatchup]block verification faied") return } if block.ParentHash() != consensus.ChainReader.CurrentHeader().Hash() { - consensus.getLogger().Debug("[TryCatchup] parent block hash not match") + consensus.getLogger().Debug().Msg("[TryCatchup] parent block hash not match") break } - consensus.getLogger().Info("[TryCatchup] block found to commit") + consensus.getLogger().Info().Msg("[TryCatchup] block found to commit") preparedMsgs := consensus.PbftLog.GetMessagesByTypeSeqHash(msg_pb.MessageType_PREPARED, msgs[0].BlockNum, msgs[0].BlockHash) msg := consensus.PbftLog.FindMessageByMaxViewID(preparedMsgs) if msg == nil { break } - consensus.getLogger().Info("[TryCatchup] prepared message found to commit") + consensus.getLogger().Info().Msg("[TryCatchup] prepared message found to commit") consensus.blockHash = [32]byte{} consensus.blockNum = consensus.blockNum + 1 consensus.viewID = msgs[0].ViewID + 1 consensus.LeaderPubKey = msgs[0].SenderPubkey - consensus.getLogger().Info("[TryCatchup] Adding block to chain") + consensus.getLogger().Info().Msg("[TryCatchup] Adding block to chain") consensus.OnConsensusDone(block) consensus.ResetState() + if core.IsEpochLastBlock(block) { + consensus.numPrevPubKeys = len(consensus.PublicKeys) + nextEpoch := new(big.Int).Add(block.Header().Epoch, common.Big1) + pubKeys := core.GetPublicKeys(nextEpoch, block.Header().ShardID) + if len(pubKeys) != 0 { + consensus.getLogger().Info().Msg("[TryCatchup] PublicKeys is Updated") + consensus.UpdatePublicKeys(pubKeys) + } + } + select { case consensus.VerifiedNewBlock <- block: default: - consensus.getLogger().Info("[TryCatchup] consensus verified block send to chan failed", "blockHash", block.Hash()) + consensus.getLogger().Info(). + Str("blockHash", block.Hash().String()). + Msg("[TryCatchup] consensus verified block send to chan failed") continue } break } if currentBlockNum < consensus.blockNum { - consensus.getLogger().Info("[TryCatchup] Catched up!", "From", currentBlockNum, "To", consensus.blockNum) + consensus.getLogger().Info(). + Uint64("From", currentBlockNum). + Uint64("To", consensus.blockNum). + Msg("[TryCatchup] Catched up!") consensus.switchPhase(Announce, true) } // catup up and skip from view change trap @@ -920,39 +1123,41 @@ func (consensus *Consensus) tryCatchup() { // Start waits for the next new block and run consensus func (consensus *Consensus) Start(blockChannel chan *types.Block, stopChan chan struct{}, stoppedChan chan struct{}, startChannel chan struct{}) { go func() { - if nodeconfig.GetDefaultConfig().IsLeader() { - consensus.getLogger().Info("[ConsensusMainLoop] Waiting for consensus start", "time", time.Now()) + if consensus.IsLeader() { + consensus.getLogger().Info().Time("time", time.Now()).Msg("[ConsensusMainLoop] Waiting for consensus start") <-startChannel - if nodeconfig.GetDefaultConfig().IsLeader() { - // send a signal to indicate it's ready to run consensus - // this signal is consumed by node object to create a new block and in turn trigger a new consensus on it - go func() { - consensus.ReadySignal <- struct{}{} - }() - } + // send a signal to indicate it's ready to run consensus + // this signal is consumed by node object to create a new block and in turn trigger a new consensus on it + go func() { + consensus.getLogger().Info().Time("time", time.Now()).Msg("[ConsensusMainLoop] Send ReadySignal") + consensus.ReadySignal <- struct{}{} + }() } - consensus.getLogger().Info("[ConsensusMainLoop] Consensus started", "time", time.Now()) + consensus.getLogger().Info().Time("time", time.Now()).Msg("[ConsensusMainLoop] Consensus started") defer close(stoppedChan) ticker := time.NewTicker(3 * time.Second) consensus.consensusTimeout[timeoutBootstrap].Start() - consensus.getLogger().Debug("[ConsensusMainLoop] Start bootstrap timeout (only once)", "viewID", consensus.viewID, "block", consensus.blockNum) + consensus.getLogger().Debug(). + Uint64("viewID", consensus.viewID). + Uint64("block", consensus.blockNum). + Msg("[ConsensusMainLoop] Start bootstrap timeout (only once)") for { select { case <-ticker.C: for k, v := range consensus.consensusTimeout { - if consensus.mode.Mode() == Syncing { + if consensus.mode.Mode() == Syncing || consensus.mode.Mode() == Listening { v.Stop() } if !v.CheckExpire() { continue } if k != timeoutViewChange { - consensus.getLogger().Debug("[ConsensusMainLoop] Ops Consensus Timeout!!!") + consensus.getLogger().Debug().Msg("[ConsensusMainLoop] Ops Consensus Timeout!!!") consensus.startViewChange(consensus.viewID + 1) break } else { - consensus.getLogger().Debug("[ConsensusMainLoop] Ops View Change Timeout!!!") + consensus.getLogger().Debug().Msg("[ConsensusMainLoop] Ops View Change Timeout!!!") viewID := consensus.mode.ViewID() consensus.startViewChange(viewID + 1) break @@ -960,15 +1165,17 @@ func (consensus *Consensus) Start(blockChannel chan *types.Block, stopChan chan } case <-consensus.syncReadyChan: consensus.updateConsensusInformation() - consensus.getLogger().Info("Node is in sync") + consensus.getLogger().Info().Msg("Node is in sync") case <-consensus.syncNotReadyChan: consensus.SetBlockNum(consensus.ChainReader.CurrentHeader().Number.Uint64() + 1) consensus.mode.SetMode(Syncing) - consensus.getLogger().Info("Node is out of sync") + consensus.getLogger().Info().Msg("Node is out of sync") case newBlock := <-blockChannel: - consensus.getLogger().Info("[ConsensusMainLoop] Received Proposed New Block!", "MsgBlockNum", newBlock.NumberU64()) + consensus.getLogger().Info(). + Uint64("MsgBlockNum", newBlock.NumberU64()). + Msg("[ConsensusMainLoop] Received Proposed New Block!") if consensus.ShardID == 0 { // TODO ek/rj - re-enable this after fixing DRand //if core.IsEpochBlock(newBlock) { // Only beacon chain do randomness generation @@ -990,7 +1197,9 @@ func (consensus *Consensus) Start(blockChannel chan *types.Block, stopChan chan if err == nil { // Verify the randomness _ = blockHash - consensus.getLogger().Info("[ConsensusMainLoop] Adding randomness into new block", "rnd", rnd) + consensus.getLogger().Info(). + Bytes("rnd", rnd[:]). + Msg("[ConsensusMainLoop] Adding randomness into new block") // newBlock.AddVdf([258]byte{}) // TODO(HB): add real vdf } else { //consensus.getLogger().Info("Failed to get randomness", "error", err) @@ -998,7 +1207,12 @@ func (consensus *Consensus) Start(blockChannel chan *types.Block, stopChan chan } startTime = time.Now() - consensus.getLogger().Debug("[ConsensusMainLoop] STARTING CONSENSUS", "numTxs", len(newBlock.Transactions()), "consensus", consensus, "startTime", startTime, "publicKeys", len(consensus.PublicKeys)) + consensus.getLogger().Debug(). + Int("numTxs", len(newBlock.Transactions())). + Interface("consensus", consensus). + Time("startTime", startTime). + Int("publicKeys", len(consensus.PublicKeys)). + Msg("[ConsensusMainLoop] STARTING CONSENSUS") consensus.announce(newBlock) case msg := <-consensus.MsgChan: diff --git a/consensus/consensus_validator_msg.go b/consensus/consensus_validator_msg.go index 0eaa14934..c8a613a64 100644 --- a/consensus/consensus_validator_msg.go +++ b/consensus/consensus_validator_msg.go @@ -27,7 +27,7 @@ func (consensus *Consensus) constructPrepareMessage() []byte { marshaledMessage, err := consensus.signAndMarshalConsensusMessage(message) if err != nil { - utils.GetLogInstance().Error("Failed to sign and marshal the Prepare message", "error", err) + utils.Logger().Error().Err(err).Msg("Failed to sign and marshal the Prepare message") } return proto.ConstructConsensusMessage(marshaledMessage) } @@ -53,7 +53,7 @@ func (consensus *Consensus) constructCommitMessage(commitPayload []byte) []byte marshaledMessage, err := consensus.signAndMarshalConsensusMessage(message) if err != nil { - utils.GetLogInstance().Error("Failed to sign and marshal the Commit message", "error", err) + utils.Logger().Error().Err(err).Msg("Failed to sign and marshal the Commit message") } return proto.ConstructConsensusMessage(marshaledMessage) } diff --git a/consensus/consensus_viewchange_msg.go b/consensus/consensus_viewchange_msg.go index 5a09b15fc..77b580fa0 100644 --- a/consensus/consensus_viewchange_msg.go +++ b/consensus/consensus_viewchange_msg.go @@ -42,13 +42,16 @@ func (consensus *Consensus) constructViewChangeMessage() []byte { vcMsg.Payload = append(msgToSign[:0:0], msgToSign...) } - consensus.getLogger().Debug("[constructViewChangeMessage]", "m1Payload", vcMsg.Payload, "pubKey", consensus.PubKey.SerializeToHexStr()) + consensus.getLogger().Debug(). + Bytes("m1Payload", vcMsg.Payload). + Str("pubKey", consensus.PubKey.SerializeToHexStr()). + Msg("[constructViewChangeMessage]") sign := consensus.priKey.SignHash(msgToSign) if sign != nil { vcMsg.ViewchangeSig = sign.Serialize() } else { - utils.GetLogger().Error("unable to serialize m1/m2 view change message signature") + utils.Logger().Error().Msg("unable to serialize m1/m2 view change message signature") } viewIDBytes := make([]byte, 8) @@ -57,12 +60,12 @@ func (consensus *Consensus) constructViewChangeMessage() []byte { if sign1 != nil { vcMsg.ViewidSig = sign1.Serialize() } else { - utils.GetLogger().Error("unable to serialize viewID signature") + utils.Logger().Error().Msg("unable to serialize viewID signature") } marshaledMessage, err := consensus.signAndMarshalConsensusMessage(message) if err != nil { - utils.GetLogInstance().Error("[constructViewChangeMessage] failed to sign and marshal the viewchange message", "error", err) + utils.Logger().Error().Err(err).Msg("[constructViewChangeMessage] failed to sign and marshal the viewchange message") } return proto.ConstructConsensusMessage(marshaledMessage) } @@ -86,7 +89,7 @@ func (consensus *Consensus) constructNewViewMessage() []byte { vcMsg.Payload = consensus.m1Payload sig2arr := consensus.GetNilSigsArray() - consensus.getLogger().Debug("[constructNewViewMessage] M2 (NIL) type signatures", "len", len(sig2arr)) + consensus.getLogger().Debug().Int("len", len(sig2arr)).Msg("[constructNewViewMessage] M2 (NIL) type signatures") if len(sig2arr) > 0 { m2Sig := bls_cosi.AggregateSig(sig2arr) vcMsg.M2Aggsigs = m2Sig.Serialize() @@ -94,7 +97,7 @@ func (consensus *Consensus) constructNewViewMessage() []byte { } sig3arr := consensus.GetViewIDSigsArray() - consensus.getLogger().Debug("[constructNewViewMessage] M3 (ViewID) type signatures", "len", len(sig3arr)) + consensus.getLogger().Debug().Int("len", len(sig3arr)).Msg("[constructNewViewMessage] M3 (ViewID) type signatures") // even we check here for safty, m3 type signatures must >= 2f+1 if len(sig3arr) > 0 { m3Sig := bls_cosi.AggregateSig(sig3arr) @@ -104,7 +107,7 @@ func (consensus *Consensus) constructNewViewMessage() []byte { marshaledMessage, err := consensus.signAndMarshalConsensusMessage(message) if err != nil { - utils.GetLogInstance().Error("[constructNewViewMessage] failed to sign and marshal the new view message", "error", err) + utils.Logger().Error().Err(err).Msg("[constructNewViewMessage] failed to sign and marshal the new view message") } return proto.ConstructConsensusMessage(marshaledMessage) } diff --git a/consensus/pbft_log.go b/consensus/pbft_log.go index d84606a90..267e750ab 100644 --- a/consensus/pbft_log.go +++ b/consensus/pbft_log.go @@ -257,26 +257,26 @@ func ParseViewChangeMessage(msg *msg_pb.Message) (*PbftMessage, error) { pubKey, err := bls_cosi.BytesToBlsPublicKey(vcMsg.SenderPubkey) if err != nil { - utils.GetLogInstance().Warn("ParseViewChangeMessage failed to parse senderpubkey", "error", err) + utils.Logger().Warn().Err(err).Msg("ParseViewChangeMessage failed to parse senderpubkey") return nil, err } leaderKey, err := bls_cosi.BytesToBlsPublicKey(vcMsg.LeaderPubkey) if err != nil { - utils.GetLogInstance().Warn("ParseViewChangeMessage failed to parse leaderpubkey", "error", err) + utils.Logger().Warn().Err(err).Msg("ParseViewChangeMessage failed to parse leaderpubkey") return nil, err } vcSig := bls.Sign{} err = vcSig.Deserialize(vcMsg.ViewchangeSig) if err != nil { - utils.GetLogInstance().Warn("ParseViewChangeMessage failed to deserialize the viewchange signature", "error", err) + utils.Logger().Warn().Err(err).Msg("ParseViewChangeMessage failed to deserialize the viewchange signature") return nil, err } vcSig1 := bls.Sign{} err = vcSig1.Deserialize(vcMsg.ViewidSig) if err != nil { - utils.GetLogInstance().Warn("ParseViewChangeMessage failed to deserialize the viewid signature", "error", err) + utils.Logger().Warn().Err(err).Msg("ParseViewChangeMessage failed to deserialize the viewid signature") return nil, err } pbftMsg.SenderPubkey = pubKey @@ -303,7 +303,7 @@ func (consensus *Consensus) ParseNewViewMessage(msg *msg_pb.Message) (*PbftMessa pubKey, err := bls_cosi.BytesToBlsPublicKey(vcMsg.SenderPubkey) if err != nil { - utils.GetLogInstance().Warn("ParseViewChangeMessage failed to parse senderpubkey", "error", err) + utils.Logger().Warn().Err(err).Msg("ParseViewChangeMessage failed to parse senderpubkey") return nil, err } pbftMsg.SenderPubkey = pubKey @@ -312,12 +312,12 @@ func (consensus *Consensus) ParseNewViewMessage(msg *msg_pb.Message) (*PbftMessa m3Sig := bls.Sign{} err = m3Sig.Deserialize(vcMsg.M3Aggsigs) if err != nil { - utils.GetLogInstance().Warn("ParseViewChangeMessage failed to deserialize the multi signature for M3 viewID signature", "error", err) + utils.Logger().Warn().Err(err).Msg("ParseViewChangeMessage failed to deserialize the multi signature for M3 viewID signature") return nil, err } m3mask, err := bls_cosi.NewMask(consensus.PublicKeys, nil) if err != nil { - utils.GetLogInstance().Warn("ParseViewChangeMessage failed to create mask for multi signature", "error", err) + utils.Logger().Warn().Err(err).Msg("ParseViewChangeMessage failed to create mask for multi signature") return nil, err } m3mask.SetMask(vcMsg.M3Bitmap) @@ -329,12 +329,12 @@ func (consensus *Consensus) ParseNewViewMessage(msg *msg_pb.Message) (*PbftMessa m2Sig := bls.Sign{} err = m2Sig.Deserialize(vcMsg.M2Aggsigs) if err != nil { - utils.GetLogInstance().Warn("ParseViewChangeMessage failed to deserialize the multi signature for M2 aggregated signature", "error", err) + utils.Logger().Warn().Err(err).Msg("ParseViewChangeMessage failed to deserialize the multi signature for M2 aggregated signature") return nil, err } m2mask, err := bls_cosi.NewMask(consensus.PublicKeys, nil) if err != nil { - utils.GetLogInstance().Warn("ParseViewChangeMessage failed to create mask for multi signature", "error", err) + utils.Logger().Warn().Err(err).Msg("ParseViewChangeMessage failed to create mask for multi signature") return nil, err } m2mask.SetMask(vcMsg.M2Bitmap) diff --git a/consensus/view_change.go b/consensus/view_change.go index 8fc0d4425..fda4d31d4 100644 --- a/consensus/view_change.go +++ b/consensus/view_change.go @@ -33,6 +33,7 @@ const ( Normal Mode = iota ViewChanging Syncing + Listening ) // PbftMode contains mode and viewID of viewchanging @@ -55,6 +56,8 @@ func (mode Mode) String() string { return "ViewChanging" } else if mode == Syncing { return "Sycning" + } else if mode == Listening { + return "Listening" } return "Unknown" } @@ -120,7 +123,9 @@ func (consensus *Consensus) switchPhase(desirePhase PbftPhase, override bool) { func (consensus *Consensus) GetNextLeaderKey() *bls.PublicKey { idx := consensus.getIndexOfPubKey(consensus.LeaderPubKey) if idx == -1 { - consensus.getLogger().Warn("GetNextLeaderKey: currentLeaderKey not found", "key", consensus.LeaderPubKey.SerializeToHexStr()) + consensus.getLogger().Warn(). + Str("key", consensus.LeaderPubKey.SerializeToHexStr()). + Msg("GetNextLeaderKey: currentLeaderKey not found") } idx = (idx + 1) % len(consensus.PublicKeys) return consensus.PublicKeys[idx] @@ -137,7 +142,9 @@ func (consensus *Consensus) getIndexOfPubKey(pubKey *bls.PublicKey) int { // ResetViewChangeState reset the state for viewchange func (consensus *Consensus) ResetViewChangeState() { - consensus.getLogger().Debug("[ResetViewChangeState] Resetting view change state", "Phase", consensus.phase) + consensus.getLogger().Debug(). + Str("Phase", consensus.phase.String()). + Msg("[ResetViewChangeState] Resetting view change state") consensus.mode.SetMode(Normal) bhpBitmap, _ := bls_cosi.NewMask(consensus.PublicKeys, nil) nilBitmap, _ := bls_cosi.NewMask(consensus.PublicKeys, nil) @@ -173,20 +180,26 @@ func (consensus *Consensus) startViewChange(viewID uint64) { diff := viewID - consensus.viewID duration := time.Duration(int64(diff) * int64(viewChangeDuration)) - consensus.getLogger().Info("[startViewChange]", "ViewChangingID", viewID, "timeoutDuration", duration, "NextLeader", consensus.LeaderPubKey.SerializeToHexStr()) + consensus.getLogger().Info(). + Uint64("ViewChangingID", viewID). + Dur("timeoutDuration", duration). + Str("NextLeader", consensus.LeaderPubKey.SerializeToHexStr()). + Msg("[startViewChange]") msgToSend := consensus.constructViewChangeMessage() consensus.host.SendMessageToGroups([]p2p.GroupID{p2p.NewGroupIDByShardID(p2p.ShardID(consensus.ShardID))}, host.ConstructP2pMessage(byte(17), msgToSend)) consensus.consensusTimeout[timeoutViewChange].SetDuration(duration) consensus.consensusTimeout[timeoutViewChange].Start() - consensus.getLogger().Debug("[startViewChange] start view change timer", "ViewChangingID", consensus.mode.ViewID()) + consensus.getLogger().Debug(). + Uint64("ViewChangingID", consensus.mode.ViewID()). + Msg("[startViewChange] start view change timer") } func (consensus *Consensus) onViewChange(msg *msg_pb.Message) { recvMsg, err := ParseViewChangeMessage(msg) if err != nil { - consensus.getLogger().Warn("[onViewChange] Unable To Parse Viewchange Message") + consensus.getLogger().Warn().Msg("[onViewChange] Unable To Parse Viewchange Message") return } newLeaderKey := recvMsg.LeaderPubkey @@ -195,33 +208,44 @@ func (consensus *Consensus) onViewChange(msg *msg_pb.Message) { } if len(consensus.viewIDSigs) >= consensus.Quorum() { - consensus.getLogger().Debug("[onViewChange] Received Enough View Change Messages", "have", len(consensus.viewIDSigs), "need", consensus.Quorum(), "validatorPubKey", recvMsg.SenderPubkey.SerializeToHexStr()) + consensus.getLogger().Debug(). + Int("have", len(consensus.viewIDSigs)). + Int("need", consensus.Quorum()). + Str("validatorPubKey", recvMsg.SenderPubkey.SerializeToHexStr()). + Msg("[onViewChange] Received Enough View Change Messages") return } senderKey, err := consensus.verifyViewChangeSenderKey(msg) if err != nil { - consensus.getLogger().Debug("[onViewChange] VerifySenderKey Failed", "error", err) + consensus.getLogger().Debug().Err(err).Msg("[onViewChange] VerifySenderKey Failed") return } // TODO: if difference is only one, new leader can still propose the same committed block to avoid another view change if consensus.blockNum > recvMsg.BlockNum { - consensus.getLogger().Debug("[onViewChange] Message BlockNum Is Low", "MsgBlockNum", recvMsg.BlockNum) + consensus.getLogger().Debug(). + Uint64("MsgBlockNum", recvMsg.BlockNum). + Msg("[onViewChange] Message BlockNum Is Low") return } if consensus.blockNum < recvMsg.BlockNum { - consensus.getLogger().Warn("[onViewChange] New Leader Has Lower Blocknum", "MsgBlockNum", recvMsg.BlockNum) + consensus.getLogger().Warn(). + Uint64("MsgBlockNum", recvMsg.BlockNum). + Msg("[onViewChange] New Leader Has Lower Blocknum") return } if consensus.mode.Mode() == ViewChanging && consensus.mode.ViewID() > recvMsg.ViewID { - consensus.getLogger().Warn("[onViewChange] ViewChanging ID Is Low", "MyViewChangingID", consensus.mode.ViewID(), "MsgViewChangingID", recvMsg.ViewID) + consensus.getLogger().Warn(). + Uint64("MyViewChangingID", consensus.mode.ViewID()). + Uint64("MsgViewChangingID", recvMsg.ViewID). + Msg("[onViewChange] ViewChanging ID Is Low") return } if err = verifyMessageSig(senderKey, msg); err != nil { - consensus.getLogger().Debug("[onViewChange] Failed To Verify Sender's Signature", "error", err) + consensus.getLogger().Debug().Err(err).Msg("[onViewChange] Failed To Verify Sender's Signature") return } @@ -236,11 +260,11 @@ func (consensus *Consensus) onViewChange(msg *msg_pb.Message) { preparedMsgs := consensus.PbftLog.GetMessagesByTypeSeq(msg_pb.MessageType_PREPARED, recvMsg.BlockNum) preparedMsg := consensus.PbftLog.FindMessageByMaxViewID(preparedMsgs) if preparedMsg == nil { - consensus.getLogger().Debug("[onViewChange] add my M2(NIL) type messaage") + consensus.getLogger().Debug().Msg("[onViewChange] add my M2(NIL) type messaage") consensus.nilSigs[consensus.PubKey.SerializeToHexStr()] = consensus.priKey.SignHash(NIL) consensus.nilBitmap.SetKey(consensus.PubKey, true) } else { - consensus.getLogger().Debug("[onViewChange] add my M1 type messaage") + consensus.getLogger().Debug().Msg("[onViewChange] add my M1 type messaage") msgToSign := append(preparedMsg.BlockHash[:], preparedMsg.Payload...) consensus.bhpSigs[consensus.PubKey.SerializeToHexStr()] = consensus.priKey.SignHash(msgToSign) consensus.bhpBitmap.SetKey(consensus.PubKey, true) @@ -259,50 +283,63 @@ func (consensus *Consensus) onViewChange(msg *msg_pb.Message) { if len(recvMsg.Payload) == 0 { _, ok := consensus.nilSigs[senderKey.SerializeToHexStr()] if ok { - consensus.getLogger().Debug("[onViewChange] Already Received M2 message from validator", "validatorPubKey", senderKey.SerializeToHexStr()) + consensus.getLogger().Debug(). + Str("validatorPubKey", senderKey.SerializeToHexStr()). + Msg("[onViewChange] Already Received M2 message from validator") return } if !recvMsg.ViewchangeSig.VerifyHash(senderKey, NIL) { - consensus.getLogger().Warn("[onViewChange] Failed To Verify Signature For M2 Type Viewchange Message") + consensus.getLogger().Warn().Msg("[onViewChange] Failed To Verify Signature For M2 Type Viewchange Message") return } - consensus.getLogger().Debug("[onViewChange] Add M2 (NIL) type message", "validatorPubKey", senderKey.SerializeToHexStr()) + consensus.getLogger().Debug(). + Str("validatorPubKey", senderKey.SerializeToHexStr()). + Msg("[onViewChange] Add M2 (NIL) type message") consensus.nilSigs[senderKey.SerializeToHexStr()] = recvMsg.ViewchangeSig consensus.nilBitmap.SetKey(recvMsg.SenderPubkey, true) // Set the bitmap indicating that this validator signed. } else { // m1 type message _, ok := consensus.bhpSigs[senderKey.SerializeToHexStr()] if ok { - consensus.getLogger().Debug("[onViewChange] Already Received M1 Message From the Validator", "validatorPubKey", senderKey.SerializeToHexStr()) + consensus.getLogger().Debug(). + Str("validatorPubKey", senderKey.SerializeToHexStr()). + Msg("[onViewChange] Already Received M1 Message From the Validator") return } if !recvMsg.ViewchangeSig.VerifyHash(recvMsg.SenderPubkey, recvMsg.Payload) { - consensus.getLogger().Warn("[onViewChange] Failed to Verify Signature for M1 Type Viewchange Message") + consensus.getLogger().Warn().Msg("[onViewChange] Failed to Verify Signature for M1 Type Viewchange Message") return } // first time receive m1 type message, need verify validity of prepared message if len(consensus.m1Payload) == 0 || !bytes.Equal(consensus.m1Payload, recvMsg.Payload) { if len(recvMsg.Payload) <= 32 { - consensus.getLogger().Debug("[onViewChange] M1 RecvMsg Payload Not Enough Length", "len", len(recvMsg.Payload)) + consensus.getLogger().Debug(). + Int("len", len(recvMsg.Payload)). + Msg("[onViewChange] M1 RecvMsg Payload Not Enough Length") return } blockHash := recvMsg.Payload[:32] aggSig, mask, err := consensus.ReadSignatureBitmapPayload(recvMsg.Payload, 32) if err != nil { - consensus.getLogger().Error("[onViewChange] M1 RecvMsg Payload Read Error", "error", err) + consensus.getLogger().Error().Err(err).Msg("[onViewChange] M1 RecvMsg Payload Read Error") return } // check has 2f+1 signature in m1 type message if count := utils.CountOneBits(mask.Bitmap); count < consensus.Quorum() { - consensus.getLogger().Debug("[onViewChange] M1 Payload Not Have Enough Signature", "need", consensus.Quorum(), "have", count) + consensus.getLogger().Debug(). + Int("need", consensus.Quorum()). + Int("have", count). + Msg("[onViewChange] M1 Payload Not Have Enough Signature") return } // Verify the multi-sig for prepare phase if !aggSig.VerifyHash(mask.AggregatePublic, blockHash[:]) { - consensus.getLogger().Warn("[onViewChange] failed to verify multi signature for m1 prepared payload", "blockHash", blockHash) + consensus.getLogger().Warn(). + Bytes("blockHash", blockHash). + Msg("[onViewChange] failed to verify multi signature for m1 prepared payload") return } @@ -316,11 +353,13 @@ func (consensus *Consensus) onViewChange(msg *msg_pb.Message) { preparedMsg.Payload = make([]byte, len(recvMsg.Payload)-32) copy(preparedMsg.Payload[:], recvMsg.Payload[32:]) preparedMsg.SenderPubkey = consensus.PubKey - consensus.getLogger().Info("[onViewChange] New Leader Prepared Message Added") + consensus.getLogger().Info().Msg("[onViewChange] New Leader Prepared Message Added") consensus.PbftLog.AddMessage(&preparedMsg) } } - consensus.getLogger().Debug("[onViewChange] Add M1 (prepared) type message", "validatorPubKey", senderKey.SerializeToHexStr()) + consensus.getLogger().Debug(). + Str("validatorPubKey", senderKey.SerializeToHexStr()). + Msg("[onViewChange] Add M1 (prepared) type message") consensus.bhpSigs[senderKey.SerializeToHexStr()] = recvMsg.ViewchangeSig consensus.bhpBitmap.SetKey(recvMsg.SenderPubkey, true) // Set the bitmap indicating that this validator signed. } @@ -328,19 +367,28 @@ func (consensus *Consensus) onViewChange(msg *msg_pb.Message) { // check and add viewID (m3 type) message signature _, ok := consensus.viewIDSigs[senderKey.SerializeToHexStr()] if ok { - consensus.getLogger().Debug("[onViewChange] Already Received M3(ViewID) message from the validator", "senderKey.SerializeToHexStr()", senderKey.SerializeToHexStr()) + consensus.getLogger().Debug(). + Str("validatorPubKey", senderKey.SerializeToHexStr()). + Msg("[onViewChange] Already Received M3(ViewID) message from the validator") return } viewIDHash := make([]byte, 8) binary.LittleEndian.PutUint64(viewIDHash, recvMsg.ViewID) if !recvMsg.ViewidSig.VerifyHash(recvMsg.SenderPubkey, viewIDHash) { - consensus.getLogger().Warn("[onViewChange] Failed to Verify M3 Message Signature", "MsgViewID", recvMsg.ViewID) + consensus.getLogger().Warn(). + Uint64("MsgViewID", recvMsg.ViewID). + Msg("[onViewChange] Failed to Verify M3 Message Signature") return } - consensus.getLogger().Debug("[onViewChange] Add M3 (ViewID) type message", "validatorPubKey", senderKey.SerializeToHexStr()) + consensus.getLogger().Debug(). + Str("validatorPubKey", senderKey.SerializeToHexStr()). + Msg("[onViewChange] Add M3 (ViewID) type message") consensus.viewIDSigs[senderKey.SerializeToHexStr()] = recvMsg.ViewidSig consensus.viewIDBitmap.SetKey(recvMsg.SenderPubkey, true) // Set the bitmap indicating that this validator signed. - consensus.getLogger().Debug("[onViewChange]", "numSigs", len(consensus.viewIDSigs), "needed", consensus.Quorum()) + consensus.getLogger().Debug(). + Int("numSigs", len(consensus.viewIDSigs)). + Int("needed", consensus.Quorum()). + Msg("[onViewChange]") // received enough view change messages, change state to normal consensus if len(consensus.viewIDSigs) >= consensus.Quorum() { @@ -352,12 +400,15 @@ func (consensus *Consensus) onViewChange(msg *msg_pb.Message) { consensus.ReadySignal <- struct{}{} }() } else { - consensus.getLogger().Debug("[OnViewChange] Switching phase", "From", consensus.phase, "To", Commit) + consensus.getLogger().Debug(). + Str("From", consensus.phase.String()). + Str("To", Commit.String()). + Msg("[OnViewChange] Switching phase") consensus.switchPhase(Commit, true) copy(consensus.blockHash[:], consensus.m1Payload[:32]) aggSig, mask, err := consensus.ReadSignatureBitmapPayload(recvMsg.Payload, 32) if err != nil { - consensus.getLogger().Error("[onViewChange] ReadSignatureBitmapPayload Fail", "error", err) + consensus.getLogger().Error().Err(err).Msg("[onViewChange] ReadSignatureBitmapPayload Fail") return } consensus.aggregatedPrepareSig = aggSig @@ -369,48 +420,57 @@ func (consensus *Consensus) onViewChange(msg *msg_pb.Message) { commitPayload := append(blockNumBytes, consensus.blockHash[:]...) consensus.commitSigs[consensus.PubKey.SerializeToHexStr()] = consensus.priKey.SignHash(commitPayload) if err = consensus.commitBitmap.SetKey(consensus.PubKey, true); err != nil { - consensus.getLogger().Debug("[OnViewChange] New Leader commit bitmap set failed") + consensus.getLogger().Debug().Msg("[OnViewChange] New Leader commit bitmap set failed") return } } consensus.mode.SetViewID(recvMsg.ViewID) msgToSend := consensus.constructNewViewMessage() - consensus.getLogger().Warn("[onViewChange] Sent NewView Message", "len(M1Payload)", len(consensus.m1Payload), "M1Payload", consensus.m1Payload) + consensus.getLogger().Warn(). + Int("payloadSize", len(consensus.m1Payload)). + Bytes("M1Payload", consensus.m1Payload). + Msg("[onViewChange] Sent NewView Message") consensus.host.SendMessageToGroups([]p2p.GroupID{p2p.NewGroupIDByShardID(p2p.ShardID(consensus.ShardID))}, host.ConstructP2pMessage(byte(17), msgToSend)) consensus.viewID = recvMsg.ViewID consensus.ResetViewChangeState() consensus.consensusTimeout[timeoutViewChange].Stop() consensus.consensusTimeout[timeoutConsensus].Start() - consensus.getLogger().Debug("[onViewChange] New Leader Start Consensus Timer and Stop View Change Timer", "viewChangingID", consensus.mode.ViewID()) - consensus.getLogger().Debug("[onViewChange] I am the New Leader", "myKey", consensus.PubKey.SerializeToHexStr(), "viewID", consensus.viewID, "block", consensus.blockNum) + consensus.getLogger().Debug(). + Uint64("viewChangingID", consensus.mode.ViewID()). + Msg("[onViewChange] New Leader Start Consensus Timer and Stop View Change Timer") + consensus.getLogger().Debug(). + Str("myKey", consensus.PubKey.SerializeToHexStr()). + Uint64("viewID", consensus.viewID). + Uint64("block", consensus.blockNum). + Msg("[onViewChange] I am the New Leader") } } // TODO: move to consensus_leader.go later func (consensus *Consensus) onNewView(msg *msg_pb.Message) { - consensus.getLogger().Debug("[onNewView] Received NewView Message") + consensus.getLogger().Debug().Msg("[onNewView] Received NewView Message") senderKey, err := consensus.verifyViewChangeSenderKey(msg) if err != nil { - consensus.getLogger().Warn("[onNewView] VerifySenderKey Failed", "error", err) + consensus.getLogger().Warn().Err(err).Msg("[onNewView] VerifySenderKey Failed") return } recvMsg, err := consensus.ParseNewViewMessage(msg) if err != nil { - consensus.getLogger().Warn("[onNewView] Unable to Parse NewView Message", "error", err) + consensus.getLogger().Warn().Err(err).Msg("[onNewView] Unable to Parse NewView Message") return } if err = verifyMessageSig(senderKey, msg); err != nil { - consensus.getLogger().Error("[onNewView] Failed to Verify New Leader's Signature", "error", err) + consensus.getLogger().Error().Err(err).Msg("[onNewView] Failed to Verify New Leader's Signature") return } consensus.vcLock.Lock() defer consensus.vcLock.Unlock() if recvMsg.M3AggSig == nil || recvMsg.M3Bitmap == nil { - consensus.getLogger().Error("[onNewView] M3AggSig or M3Bitmap is nil") + consensus.getLogger().Error().Msg("[onNewView] M3AggSig or M3Bitmap is nil") return } m3Sig := recvMsg.M3AggSig @@ -420,21 +480,28 @@ func (consensus *Consensus) onNewView(msg *msg_pb.Message) { binary.LittleEndian.PutUint64(viewIDBytes, recvMsg.ViewID) // check total number of sigs >= 2f+1 if count := utils.CountOneBits(m3Mask.Bitmap); count < consensus.Quorum() { - consensus.getLogger().Debug("[onNewView] Not Have Enough M3 (ViewID) Signature", "need", consensus.Quorum(), "have", count) + consensus.getLogger().Debug(). + Int("need", consensus.Quorum()). + Int("have", count). + Msg("[onNewView] Not Have Enough M3 (ViewID) Signature") return } if !m3Sig.VerifyHash(m3Mask.AggregatePublic, viewIDBytes) { - consensus.getLogger().Warn("[onNewView] Unable to Verify Aggregated Signature of M3 (ViewID) payload", "m3Sig", m3Sig.SerializeToHexStr(), "m3Mask", m3Mask.Bitmap, "MsgViewID", recvMsg.ViewID) + consensus.getLogger().Warn(). + Str("m3Sig", m3Sig.SerializeToHexStr()). + Bytes("m3Mask", m3Mask.Bitmap). + Uint64("MsgViewID", recvMsg.ViewID). + Msg("[onNewView] Unable to Verify Aggregated Signature of M3 (ViewID) payload") return } m2Mask := recvMsg.M2Bitmap if recvMsg.M2AggSig != nil { - consensus.getLogger().Debug("[onNewView] M2AggSig (NIL) is Not Empty") + consensus.getLogger().Debug().Msg("[onNewView] M2AggSig (NIL) is Not Empty") m2Sig := recvMsg.M2AggSig if !m2Sig.VerifyHash(m2Mask.AggregatePublic, NIL) { - consensus.getLogger().Warn("[onNewView] Unable to Verify Aggregated Signature of M2 (NIL) payload") + consensus.getLogger().Warn().Msg("[onNewView] Unable to Verify Aggregated Signature of M2 (NIL) payload") return } } @@ -442,18 +509,18 @@ func (consensus *Consensus) onNewView(msg *msg_pb.Message) { // check when M3 sigs > M2 sigs, then M1 (recvMsg.Payload) should not be empty if m2Mask == nil || m2Mask.Bitmap == nil || (m2Mask != nil && m2Mask.Bitmap != nil && utils.CountOneBits(m3Mask.Bitmap) > utils.CountOneBits(m2Mask.Bitmap)) { if len(recvMsg.Payload) <= 32 { - consensus.getLogger().Debug("[onNewView] M1 (prepared) Type Payload Not Have Enough Length") + consensus.getLogger().Debug().Msg("[onNewView] M1 (prepared) Type Payload Not Have Enough Length") return } // m1 is not empty, check it's valid blockHash := recvMsg.Payload[:32] aggSig, mask, err := consensus.ReadSignatureBitmapPayload(recvMsg.Payload, 32) if err != nil { - consensus.getLogger().Error("[onNewView] ReadSignatureBitmapPayload Failed", "error", err) + consensus.getLogger().Error().Err(err).Msg("[onNewView] ReadSignatureBitmapPayload Failed") return } if !aggSig.VerifyHash(mask.AggregatePublic, blockHash) { - consensus.getLogger().Warn("[onNewView] Failed to Verify Signature for M1 (prepare) message") + consensus.getLogger().Warn().Msg("[onNewView] Failed to Verify Signature for M1 (prepare) message") return } copy(consensus.blockHash[:], blockHash) @@ -478,7 +545,10 @@ func (consensus *Consensus) onNewView(msg *msg_pb.Message) { // change view and leaderKey to keep in sync with network if consensus.blockNum != recvMsg.BlockNum { - consensus.getLogger().Debug("[onNewView] New Leader Changed", "newLeaderKey", consensus.LeaderPubKey.SerializeToHexStr(), "MsgBlockNum", recvMsg.BlockNum) + consensus.getLogger().Debug(). + Str("newLeaderKey", consensus.LeaderPubKey.SerializeToHexStr()). + Uint64("MsgBlockNum", recvMsg.BlockNum). + Msg("[onNewView] New Leader Changed") return } @@ -490,16 +560,21 @@ func (consensus *Consensus) onNewView(msg *msg_pb.Message) { commitPayload := append(blockNumHash, consensus.blockHash[:]...) msgToSend := consensus.constructCommitMessage(commitPayload) - consensus.getLogger().Info("onNewView === commit") + consensus.getLogger().Info().Msg("onNewView === commit") consensus.host.SendMessageToGroups([]p2p.GroupID{p2p.NewGroupIDByShardID(p2p.ShardID(consensus.ShardID))}, host.ConstructP2pMessage(byte(17), msgToSend)) - consensus.getLogger().Debug("[OnViewChange] Switching phase", "From", consensus.phase, "To", Commit) + consensus.getLogger().Debug(). + Str("From", consensus.phase.String()). + Str("To", Commit.String()). + Msg("[OnViewChange] Switching phase") consensus.switchPhase(Commit, true) } else { consensus.ResetState() - consensus.getLogger().Info("onNewView === announce") + consensus.getLogger().Info().Msg("onNewView === announce") } - consensus.getLogger().Debug("new leader changed", "newLeaderKey", consensus.LeaderPubKey.SerializeToHexStr()) - consensus.getLogger().Debug("validator start consensus timer and stop view change timer") + consensus.getLogger().Debug(). + Str("newLeaderKey", consensus.LeaderPubKey.SerializeToHexStr()). + Msg("new leader changed") + consensus.getLogger().Debug().Msg("validator start consensus timer and stop view change timer") consensus.consensusTimeout[timeoutConsensus].Start() consensus.consensusTimeout[timeoutViewChange].Stop() } diff --git a/core/blockchain.go b/core/blockchain.go index ca7265334..cca52ae65 100644 --- a/core/blockchain.go +++ b/core/blockchain.go @@ -68,14 +68,6 @@ const ( commitsCacheLimit = 10 epochCacheLimit = 10 - // BlocksPerEpoch is the number of blocks in one epoch - // currently set to small number for testing - // in future, this need to be adjusted dynamically instead of constant - // TODO ek – inflate to disable resharding until we can 1) fix shard - // state mutation bug and 2) implement key passphrase recycle across - // process restart (exec) for shard migration - BlocksPerEpoch = 1000000000000 - // BlockChainVersion ensures that an incompatible database forces a resync from scratch. BlockChainVersion = 3 ) @@ -236,13 +228,14 @@ func (bc *BlockChain) ValidateNewBlock(block *types.Block) error { } // IsEpochBlock returns whether this block is the first block of an epoch. +// TODO: lc this is not used func IsEpochBlock(block *types.Block) bool { - return block.NumberU64()%BlocksPerEpoch == 0 + return block.NumberU64()%ShardingSchedule.BlocksPerEpoch() == 0 } // IsEpochLastBlock returns whether this block is the last block of an epoch. func IsEpochLastBlock(block *types.Block) bool { - return block.NumberU64()%BlocksPerEpoch == BlocksPerEpoch-1 + return ShardingSchedule.IsLastBlock(block.NumberU64()) } func (bc *BlockChain) getProcInterrupt() bool { @@ -256,20 +249,23 @@ func (bc *BlockChain) loadLastState() error { head := rawdb.ReadHeadBlockHash(bc.db) if head == (common.Hash{}) { // Corrupt or empty database, init from scratch - utils.GetLogger().Warn("Empty database, resetting chain") + utils.Logger().Warn().Msg("Empty database, resetting chain") return bc.Reset() } // Make sure the entire head block is available currentBlock := bc.GetBlockByHash(head) if currentBlock == nil { // Corrupt or empty database, init from scratch - utils.GetLogger().Warn("Head block missing, resetting chain", "hash", head) + utils.Logger().Warn().Bytes("hash", head.Bytes()).Msg("Head block missing, resetting chain") return bc.Reset() } // Make sure the state associated with the block is available if _, err := state.New(currentBlock.Root(), bc.stateCache); err != nil { // Dangling block without a state associated, init from scratch - utils.GetLogger().Warn("Head state missing, repairing chain", "number", currentBlock.Number(), "hash", currentBlock.Hash()) + utils.Logger().Warn(). + Str("number", currentBlock.Number().String()). + Str("hash", currentBlock.Hash().Hex()). + Msg("Head state missing, repairing chain") if err := bc.repair(¤tBlock); err != nil { return err } @@ -301,9 +297,24 @@ func (bc *BlockChain) loadLastState() error { blockTd := bc.GetTd(currentBlock.Hash(), currentBlock.NumberU64()) fastTd := bc.GetTd(currentFastBlock.Hash(), currentFastBlock.NumberU64()) - utils.GetLogger().Info("Loaded most recent local header", "number", currentHeader.Number, "hash", currentHeader.Hash(), "td", headerTd, "age", common.PrettyAge(time.Unix(currentHeader.Time.Int64(), 0))) - utils.GetLogger().Info("Loaded most recent local full block", "number", currentBlock.Number(), "hash", currentBlock.Hash(), "td", blockTd, "age", common.PrettyAge(time.Unix(currentBlock.Time().Int64(), 0))) - utils.GetLogger().Info("Loaded most recent local fast block", "number", currentFastBlock.Number(), "hash", currentFastBlock.Hash(), "td", fastTd, "age", common.PrettyAge(time.Unix(currentFastBlock.Time().Int64(), 0))) + utils.Logger().Info(). + Str("number", currentHeader.Number.String()). + Str("hash", currentHeader.Hash().Hex()). + Str("td", headerTd.String()). + Str("age", common.PrettyAge(time.Unix(currentHeader.Time.Int64(), 0)).String()). + Msg("Loaded most recent local header") + utils.Logger().Info(). + Str("number", currentBlock.Number().String()). + Str("hash", currentBlock.Hash().Hex()). + Str("td", blockTd.String()). + Str("age", common.PrettyAge(time.Unix(currentBlock.Time().Int64(), 0)).String()). + Msg("Loaded most recent local full block") + utils.Logger().Info(). + Str("number", currentFastBlock.Number().String()). + Str("hash", currentFastBlock.Hash().Hex()). + Str("td", fastTd.String()). + Str("age", common.PrettyAge(time.Unix(currentFastBlock.Time().Int64(), 0)).String()). + Msg("Loaded most recent local fast block") return nil } @@ -313,7 +324,7 @@ func (bc *BlockChain) loadLastState() error { // though, the head may be further rewound if block bodies are missing (non-archive // nodes after a fast sync). func (bc *BlockChain) SetHead(head uint64) error { - utils.GetLogger().Warn("Rewinding blockchain", "target", head) + utils.Logger().Warn().Uint64("target", head).Msg("Rewinding blockchain") bc.mu.Lock() defer bc.mu.Unlock() @@ -379,7 +390,10 @@ func (bc *BlockChain) FastSyncCommitHead(hash common.Hash) error { bc.currentBlock.Store(block) bc.mu.Unlock() - utils.GetLogger().Info("Committed new head block", "number", block.Number(), "hash", hash) + utils.Logger().Info(). + Str("number", block.Number().String()). + Str("hash", hash.Hex()). + Msg("Committed new head block") return nil } @@ -481,7 +495,10 @@ func (bc *BlockChain) repair(head **types.Block) error { for { // Abort if we've rewound to a head block that does have associated state if _, err := state.New((*head).Root(), bc.stateCache); err == nil { - utils.GetLogger().Info("Rewound blockchain to past state", "number", (*head).Number(), "hash", (*head).Hash()) + utils.Logger().Info(). + Str("number", (*head).Number().String()). + Str("hash", (*head).Hash().Hex()). + Msg("Rewound blockchain to past state") return nil } // Otherwise rewind one block and recheck state availability there @@ -502,7 +519,7 @@ func (bc *BlockChain) ExportN(w io.Writer, first uint64, last uint64) error { if first > last { return fmt.Errorf("export failed: first (%d) is greater than last (%d)", first, last) } - utils.GetLogger().Info("Exporting batch of blocks", "count", last-first+1) + utils.Logger().Info().Uint64("count", last-first+1).Msg("Exporting batch of blocks") start, reported := time.Now(), time.Now() for nr := first; nr <= last; nr++ { @@ -514,7 +531,10 @@ func (bc *BlockChain) ExportN(w io.Writer, first uint64, last uint64) error { return err } if time.Since(reported) >= statsReportLimit { - utils.GetLogger().Info("Exporting blocks", "exported", block.NumberU64()-first, "elapsed", common.PrettyDuration(time.Since(start))) + utils.Logger().Info(). + Uint64("exported", block.NumberU64()-first). + Str("elapsed", common.PrettyDuration(time.Since(start)).String()). + Msg("Exporting blocks") reported = time.Now() } } @@ -730,9 +750,13 @@ func (bc *BlockChain) Stop() { if number := bc.CurrentBlock().NumberU64(); number > offset { recent := bc.GetBlockByNumber(number - offset) - utils.GetLogger().Info("Writing cached state to disk", "block", recent.Number(), "hash", recent.Hash(), "root", recent.Root()) + utils.Logger().Info(). + Str("block", recent.Number().String()). + Str("hash", recent.Hash().Hex()). + Str("root", recent.Root().Hex()). + Msg("Writing cached state to disk") if err := triedb.Commit(recent.Root(), true); err != nil { - utils.GetLogger().Error("Failed to commit recent state trie", "err", err) + utils.Logger().Error().Err(err).Msg("Failed to commit recent state trie") } } } @@ -740,10 +764,10 @@ func (bc *BlockChain) Stop() { triedb.Dereference(bc.triegc.PopItem().(common.Hash)) } if size, _ := triedb.Size(); size != 0 { - utils.GetLogger().Error("Dangling trie nodes after full cleanup") + utils.Logger().Error().Msg("Dangling trie nodes after full cleanup") } } - utils.GetLogger().Info("Blockchain manager stopped") + utils.Logger().Info().Msg("Blockchain manager stopped") } func (bc *BlockChain) procFutureBlocks() { @@ -846,8 +870,13 @@ func (bc *BlockChain) InsertReceiptChain(blockChain types.Blocks, receiptChain [ // Do a sanity check that the provided chain is actually ordered and linked for i := 1; i < len(blockChain); i++ { if blockChain[i].NumberU64() != blockChain[i-1].NumberU64()+1 || blockChain[i].ParentHash() != blockChain[i-1].Hash() { - utils.GetLogger().Error("Non contiguous receipt insert", "number", blockChain[i].Number(), "hash", blockChain[i].Hash(), "parent", blockChain[i].ParentHash(), - "prevnumber", blockChain[i-1].Number(), "prevhash", blockChain[i-1].Hash()) + utils.Logger().Error(). + Str("number", blockChain[i].Number().String()). + Str("hash", blockChain[i].Hash().Hex()). + Str("parent", blockChain[i].ParentHash().Hex()). + Str("prevnumber", blockChain[i-1].Number().String()). + Str("prevhash", blockChain[i-1].Hash().Hex()). + Msg("Non contiguous receipt insert") return 0, fmt.Errorf("non contiguous insert: item %d is #%d [%x…], item %d is #%d [%x…] (parent [%x…])", i-1, blockChain[i-1].NumberU64(), blockChain[i-1].Hash().Bytes()[:4], i, blockChain[i].NumberU64(), blockChain[i].Hash().Bytes()[:4], blockChain[i].ParentHash().Bytes()[:4]) } @@ -912,15 +941,15 @@ func (bc *BlockChain) InsertReceiptChain(blockChain types.Blocks, receiptChain [ } bc.mu.Unlock() - context := []interface{}{ - "count", stats.processed, "elapsed", common.PrettyDuration(time.Since(start)), - "number", head.Number(), "hash", head.Hash(), "age", common.PrettyAge(time.Unix(head.Time().Int64(), 0)), - "size", common.StorageSize(bytes), - } - if stats.ignored > 0 { - context = append(context, []interface{}{"ignored", stats.ignored}...) - } - utils.GetLogger().Info("Imported new block receipts", context...) + utils.Logger().Info(). + Int32("count", stats.processed). + Str("elapsed", common.PrettyDuration(time.Since(start)).String()). + Str("age", common.PrettyAge(time.Unix(head.Time().Int64(), 0)).String()). + Str("head", head.Number().String()). + Str("hash", head.Hash().Hex()). + Str("size", common.StorageSize(bytes).String()). + Int32("ignored", stats.ignored). + Msg("Imported new block receipts") return 0, nil } @@ -989,7 +1018,11 @@ func (bc *BlockChain) WriteBlockWithState(block *types.Block, receipts []*types. // If we're exceeding limits but haven't reached a large enough memory gap, // warn the user that the system is becoming unstable. if chosen < lastWrite+triesInMemory && bc.gcproc >= 2*bc.cacheConfig.TrieTimeLimit { - utils.GetLogger().Info("State in memory for too long, committing", "time", bc.gcproc, "allowance", bc.cacheConfig.TrieTimeLimit, "optimum", float64(chosen-lastWrite)/triesInMemory) + utils.Logger().Info(). + Dur("time", bc.gcproc). + Dur("allowance", bc.cacheConfig.TrieTimeLimit). + Float64("optimum", float64(chosen-lastWrite)/triesInMemory). + Msg("State in memory for too long, committing") } // Flush an entire trie and restart the counters triedb.Commit(header.Root, true) @@ -1057,15 +1090,16 @@ func (bc *BlockChain) InsertChain(chain types.Blocks) (int, error) { if err == nil { for idx, block := range chain { header := block.Header() - header.Logger(utils.GetLogger()).Info("added block to chain", - "segmentIndex", idx, - "parentHash", header.ParentHash) + header.Logger(utils.Logger()).Info(). + Int("segmentIndex", idx). + Str("parentHash", header.ParentHash.Hex()). + Msg("added block to chain") + if header.ShardStateHash != (common.Hash{}) { epoch := new(big.Int).Add(header.Epoch, common.Big1) err = bc.WriteShardStateBytes(epoch, header.ShardState) if err != nil { - ctxerror.Log15(header.Logger(utils.GetLogger()).Warn, - ctxerror.New("cannot store shard state").WithCause(err)) + header.Logger(utils.Logger()).Warn().Err(err).Msg("cannot store shard state") } } } @@ -1085,8 +1119,13 @@ func (bc *BlockChain) insertChain(chain types.Blocks) (int, []interface{}, []*ty for i := 1; i < len(chain); i++ { if chain[i].NumberU64() != chain[i-1].NumberU64()+1 || chain[i].ParentHash() != chain[i-1].Hash() { // Chain broke ancestry, log a message (programming error) and skip insertion - utils.GetLogger().Error("Non contiguous block insert", "number", chain[i].Number(), "hash", chain[i].Hash(), - "parent", chain[i].ParentHash(), "prevnumber", chain[i-1].Number(), "prevhash", chain[i-1].Hash()) + utils.Logger().Error(). + Str("number", chain[i].Number().String()). + Str("hash", chain[i].Hash().Hex()). + Str("parent", chain[i].ParentHash().Hex()). + Str("prevnumber", chain[i-1].Number().String()). + Str("prevhash", chain[i-1].Hash().Hex()). + Msg("Non contiguous block insert") return 0, nil, nil, fmt.Errorf("non contiguous insert: item %d is #%d [%x…], item %d is #%d [%x…] (parent [%x…])", i-1, chain[i-1].NumberU64(), chain[i-1].Hash().Bytes()[:4], i, chain[i].NumberU64(), chain[i].Hash().Bytes()[:4], chain[i].ParentHash().Bytes()[:4]) @@ -1126,7 +1165,7 @@ func (bc *BlockChain) insertChain(chain types.Blocks) (int, []interface{}, []*ty for i, block := range chain { // If the chain is terminating, stop processing blocks if atomic.LoadInt32(&bc.procInterrupt) == 1 { - utils.GetLogger().Debug("Premature abort during blocks processing") + utils.Logger().Debug().Msg("Premature abort during blocks processing") break } // Wait for the block's verification to complete @@ -1230,11 +1269,17 @@ func (bc *BlockChain) insertChain(chain types.Blocks) (int, []interface{}, []*ty if err != nil { return i, events, coalescedLogs, err } + logger := utils.Logger().With(). + Str("number", block.Number().String()). + Str("hash", block.Hash().Hex()). + Int("uncles", len(block.Uncles())). + Int("txs", len(block.Transactions())). + Uint64("gas", block.GasUsed()). + Str("elapsed", common.PrettyDuration(time.Since(bstart)).String()). + Logger() switch status { case CanonStatTy: - utils.GetLogger().Info("Inserted new block", "number", block.Number(), "hash", block.Hash(), "uncles", len(block.Uncles()), - "txs", len(block.Transactions()), "gas", block.GasUsed(), "elapsed", common.PrettyDuration(time.Since(bstart))) - + logger.Info().Msg("Inserted new block") coalescedLogs = append(coalescedLogs, logs...) blockInsertTimer.UpdateSince(bstart) events = append(events, ChainEvent{block, block.Hash(), logs}) @@ -1244,9 +1289,7 @@ func (bc *BlockChain) insertChain(chain types.Blocks) (int, []interface{}, []*ty bc.gcproc += proctime case SideStatTy: - utils.GetLogger().Debug("Inserted forked block", "number", block.Number(), "hash", block.Hash(), "elapsed", - common.PrettyDuration(time.Since(bstart)), "txs", len(block.Transactions()), "gas", block.GasUsed(), "uncles", len(block.Uncles())) - + logger.Debug().Msg("Inserted forked block") blockInsertTimer.UpdateSince(bstart) events = append(events, ChainSideEvent{block}) } @@ -1290,23 +1333,30 @@ func (st *insertStats) report(chain []*types.Block, index int, cache common.Stor end = chain[index] txs = countTransactions(chain[st.lastIndex : index+1]) ) - context := []interface{}{ - "blocks", st.processed, "txs", txs, "mgas", float64(st.usedGas) / 1000000, - "elapsed", common.PrettyDuration(elapsed), "mgasps", float64(st.usedGas) * 1000 / float64(elapsed), - "number", end.Number(), "hash", end.Hash(), - } + + context := utils.Logger().With(). + Int("blocks", st.processed). + Int("txs", txs). + Float64("mgas", float64(st.usedGas)/1000000). + Str("elapsed", common.PrettyDuration(elapsed).String()). + Float64("mgasps", float64(st.usedGas)*1000/float64(elapsed)). + Str("number", end.Number().String()). + Str("hash", end.Hash().Hex()). + Str("cache", cache.String()) + if timestamp := time.Unix(end.Time().Int64(), 0); time.Since(timestamp) > time.Minute { - context = append(context, []interface{}{"age", common.PrettyAge(timestamp)}...) + context = context.Str("age", common.PrettyAge(timestamp).String()) } - context = append(context, []interface{}{"cache", cache}...) if st.queued > 0 { - context = append(context, []interface{}{"queued", st.queued}...) + context = context.Int("queued", st.queued) } if st.ignored > 0 { - context = append(context, []interface{}{"ignored", st.ignored}...) + context = context.Int("ignored", st.ignored) } - utils.GetLogger().Info("Imported new chain segment", context...) + + logger := context.Logger() + logger.Info().Msg("Imported new chain segment") *st = insertStats{startTime: now, lastIndex: index + 1} } @@ -1392,14 +1442,25 @@ func (bc *BlockChain) reorg(oldBlock, newBlock *types.Block) error { } // Ensure the user sees large reorgs if len(oldChain) > 0 && len(newChain) > 0 { - logFn := utils.GetLogger().Debug + logEvent := utils.Logger().Debug() if len(oldChain) > 63 { - logFn = utils.GetLogger().Warn + logEvent = utils.Logger().Warn() } - logFn("Chain split detected", "number", commonBlock.Number(), "hash", commonBlock.Hash(), - "drop", len(oldChain), "dropfrom", oldChain[0].Hash(), "add", len(newChain), "addfrom", newChain[0].Hash()) + logEvent. + Str("number", commonBlock.Number().String()). + Str("hash", commonBlock.Hash().Hex()). + Int("drop", len(oldChain)). + Str("dropfrom", oldChain[0].Hash().Hex()). + Int("add", len(newChain)). + Str("addfrom", newChain[0].Hash().Hex()). + Msg("Chain split detected") } else { - utils.GetLogger().Error("Impossible reorg, please file an issue", "oldnum", oldBlock.Number(), "oldhash", oldBlock.Hash(), "newnum", newBlock.Number(), "newhash", newBlock.Hash()) + utils.Logger().Error(). + Str("oldnum", oldBlock.Number().String()). + Str("oldhash", oldBlock.Hash().Hex()). + Str("newnum", newBlock.Number().String()). + Str("newhash", newBlock.Hash().Hex()). + Msg("Impossible reorg, please file an issue") } // Insert the new chain, taking care of the proper incremental order var addedTxs types.Transactions @@ -1494,7 +1555,7 @@ func (bc *BlockChain) reportBlock(block *types.Block, receipts types.Receipts, e for _, receipt := range receipts { receiptString += fmt.Sprintf("\t%v\n", receipt) } - utils.GetLogger().Error(fmt.Sprintf(` + utils.Logger().Error().Msgf(` ########## BAD BLOCK ######### Chain config: %v @@ -1504,7 +1565,7 @@ Hash: 0x%x Error: %v ############################## -`, bc.chainConfig, block.Number(), block.Hash(), receiptString, err)) +`, bc.chainConfig, block.Number(), block.Hash(), receiptString, err) } // InsertHeaderChain attempts to insert the given header chain in to the local @@ -1683,12 +1744,16 @@ func (bc *BlockChain) WriteShardState( func (bc *BlockChain) WriteShardStateBytes( epoch *big.Int, shardState []byte, ) error { + decodeShardState := types.ShardState{} + if err := rlp.DecodeBytes(shardState, &decodeShardState); err != nil { + return err + } err := rawdb.WriteShardStateBytes(bc.db, epoch, shardState) if err != nil { return err } cacheKey := string(epoch.Bytes()) - bc.shardStateCache.Add(cacheKey, shardState) + bc.shardStateCache.Add(cacheKey, decodeShardState) return nil } @@ -1741,7 +1806,8 @@ func (bc *BlockChain) GetVrfByNumber(number uint64) [32]byte { // GetShardState returns the shard state for the given epoch, // creating one if needed. func (bc *BlockChain) GetShardState( - epoch *big.Int, stakeInfo *map[common.Address]*structs.StakeInfo, + epoch *big.Int, + stakeInfo *map[common.Address]*structs.StakeInfo, ) (types.ShardState, error) { shardState, err := bc.ReadShardState(epoch) if err == nil { // TODO ek – distinguish ErrNotFound @@ -1755,7 +1821,7 @@ func (bc *BlockChain) GetShardState( if err != nil { return nil, err } - utils.GetLogger().Debug("saved new shard state", "epoch", epoch) + utils.Logger().Debug().Str("epoch", epoch.String()).Msg("saved new shard state") return shardState, nil } @@ -1802,3 +1868,8 @@ func (bc *BlockChain) StoreEpochBlockNumber( func (bc *BlockChain) ChainDB() ethdb.Database { return bc.db } + +// GetVMConfig returns the block chain VM config. +func (bc *BlockChain) GetVMConfig() *vm.Config { + return &bc.vmConfig +} diff --git a/core/chain_indexer.go b/core/chain_indexer.go index fe87963ae..ca5435df7 100644 --- a/core/chain_indexer.go +++ b/core/chain_indexer.go @@ -27,7 +27,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/event" - "github.com/ethereum/go-ethereum/log" + "github.com/rs/zerolog" "github.com/harmony-one/harmony/core/rawdb" "github.com/harmony-one/harmony/core/types" @@ -92,7 +92,7 @@ type ChainIndexer struct { throttling time.Duration // Disk throttling to prevent a heavy upgrade from hogging resources - log log.Logger + log *zerolog.Logger lock sync.RWMutex } @@ -100,6 +100,7 @@ type ChainIndexer struct { // chain segments of a given size after certain number of confirmations passed. // The throttling parameter might be used to prevent database thrashing. func NewChainIndexer(chainDb ethdb.Database, indexDb ethdb.Database, backend ChainIndexerBackend, section, confirm uint64, throttling time.Duration, kind string) *ChainIndexer { + logger := utils.Logger().With().Str("type", kind).Logger() c := &ChainIndexer{ chainDb: chainDb, indexDb: indexDb, @@ -109,7 +110,7 @@ func NewChainIndexer(chainDb ethdb.Database, indexDb ethdb.Database, backend Cha sectionSize: section, confirmsReq: confirm, throttling: throttling, - log: utils.GetLogInstance().New("type", kind), + log: &logger, } // Initialize database dependent fields and start the updater c.loadValidSections() @@ -283,7 +284,11 @@ func (c *ChainIndexer) newHead(head uint64, reorg bool) { // syncing reached the checkpoint, verify section head syncedHead := rawdb.ReadCanonicalHash(c.chainDb, c.checkpointSections*c.sectionSize-1) if syncedHead != c.checkpointHead { - c.log.Error("Synced chain does not match checkpoint", "number", c.checkpointSections*c.sectionSize-1, "expected", c.checkpointHead, "synced", syncedHead) + c.log.Error(). + Uint64("number", c.checkpointSections*c.sectionSize-1). + Str("expected", c.checkpointHead.Hex()). + Str("synced", syncedHead.Hex()). + Msg("Synced chain does not match checkpoint") return } } @@ -320,7 +325,7 @@ func (c *ChainIndexer) updateLoop() { if time.Since(updated) > 8*time.Second { if c.knownSections > c.storedSections+1 { updating = true - c.log.Info("Upgrading chain index", "percentage", c.storedSections*100/c.knownSections) + c.log.Info().Uint64("percentage", c.storedSections*100/c.knownSections).Msg("Upgrading chain index") } updated = time.Now() } @@ -340,7 +345,7 @@ func (c *ChainIndexer) updateLoop() { return default: } - c.log.Error("Section processing failed", "error", err) + c.log.Error().Err(err).Msg("Section processing failed") } c.lock.Lock() @@ -350,16 +355,16 @@ func (c *ChainIndexer) updateLoop() { c.setValidSections(section + 1) if c.storedSections == c.knownSections && updating { updating = false - c.log.Info("Finished upgrading chain index") + c.log.Info().Msg("Finished upgrading chain index") } c.cascadedHead = c.storedSections*c.sectionSize - 1 for _, child := range c.children { - c.log.Trace("Cascading chain index update", "head", c.cascadedHead) + c.log.Warn().Uint64("head", c.cascadedHead).Msg("Cascading chain index update") child.newHead(c.cascadedHead, false) } } else { // If processing failed, don't retry until further notification - c.log.Debug("Chain index processing failed", "section", section, "err", err) + c.log.Debug().Err(err).Uint64("section", section).Msg("Chain index processing failed") c.knownSections = c.storedSections } } @@ -382,7 +387,7 @@ func (c *ChainIndexer) updateLoop() { // held while processing, the continuity can be broken by a long reorg, in which // case the function returns with an error. func (c *ChainIndexer) processSection(section uint64, lastHead common.Hash) (common.Hash, error) { - c.log.Trace("Processing new chain section", "section", section) + c.log.Warn().Uint64("section", section).Msg("Processing new chain section") // Reset and partial processing diff --git a/core/genesis.go b/core/genesis.go index 5b6538454..6e5e5fe1d 100644 --- a/core/genesis.go +++ b/core/genesis.go @@ -162,10 +162,10 @@ func SetupGenesisBlock(db ethdb.Database, genesis *Genesis) (*params.ChainConfig stored := rawdb.ReadCanonicalHash(db, 0) if (stored == common.Hash{}) { if genesis == nil { - utils.GetLogger().Info("Writing default main-net genesis block") + utils.Logger().Info().Msg("Writing default main-net genesis block") genesis = DefaultGenesisBlock() } else { - utils.GetLogger().Info("Writing custom genesis block") + utils.Logger().Info().Msg("Writing custom genesis block") } block, err := genesis.Commit(db) return genesis.Config, block.Hash(), err @@ -183,7 +183,7 @@ func SetupGenesisBlock(db ethdb.Database, genesis *Genesis) (*params.ChainConfig newcfg := genesis.configOrDefault(stored) storedcfg := rawdb.ReadChainConfig(db, stored) if storedcfg == nil { - utils.GetLogger().Warn("Found genesis block without chain config") + utils.Logger().Warn().Msg("Found genesis block without chain config") rawdb.WriteChainConfig(db, stored, newcfg) return newcfg, stored, nil } @@ -225,7 +225,7 @@ func (g *Genesis) configOrDefault(ghash common.Hash) *params.ChainConfig { // to the given database (or discards it if nil). func (g *Genesis) ToBlock(db ethdb.Database) *types.Block { if db == nil { - utils.GetLogInstance().Error("db should be initialized") + utils.Logger().Error().Msg("db should be initialized") os.Exit(1) } statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) @@ -240,7 +240,7 @@ func (g *Genesis) ToBlock(db ethdb.Database) *types.Block { root := statedb.IntermediateRoot(false) shardStateBytes, err := rlp.EncodeToBytes(g.ShardState) if err != nil { - utils.GetLogInstance().Error("failed to rlp-serialize genesis shard state") + utils.Logger().Error().Msg("failed to rlp-serialize genesis shard state") os.Exit(1) } head := &types.Header{ @@ -281,7 +281,7 @@ func (g *Genesis) Commit(db ethdb.Database) (*types.Block, error) { err := rawdb.WriteShardStateBytes(db, block.Header().Epoch, block.Header().ShardState) if err != nil { - utils.GetLogger().Crit("Failed to store genesis shard state", "err", err) + utils.Logger().Error().Err(err).Msg("Failed to store genesis shard state") } config := g.Config diff --git a/core/headerchain.go b/core/headerchain.go index f57dd3315..3cc28f17a 100644 --- a/core/headerchain.go +++ b/core/headerchain.go @@ -144,7 +144,7 @@ func (hc *HeaderChain) WriteHeader(header *types.Header) (status WriteStatus, er // Irrelevant of the canonical status, write the td and header to the database //if err := hc.WriteTd(hash, number, externTd); err != nil { - // // utils.GetLogger().Crit("Failed to write header total difficulty", "err", err) + // // utils.Logger().Error().Err(err).Msg("Failed to write header total difficulty") // //} //rawdb.WriteHeader(hc.chainDb, header) @@ -207,8 +207,13 @@ func (hc *HeaderChain) ValidateHeaderChain(chain []*types.Header, checkFreq int) for i := 1; i < len(chain); i++ { if chain[i].Number.Uint64() != chain[i-1].Number.Uint64()+1 || chain[i].ParentHash != chain[i-1].Hash() { // Chain broke ancestry, log a message (programming error) and skip insertion - utils.GetLogger().Error("Non contiguous header insert", "number", chain[i].Number, "hash", chain[i].Hash(), - "parent", chain[i].ParentHash, "prevnumber", chain[i-1].Number, "prevhash", chain[i-1].Hash()) + utils.Logger().Error(). + Str("number", chain[i].Number.String()). + Str("hash", chain[i].Hash().Hex()). + Str("parent", chain[i].ParentHash.Hex()). + Str("prevnumber", chain[i-1].Number.String()). + Str("prevhash", chain[i-1].Hash().Hex()). + Msg("Non contiguous header insert") return 0, fmt.Errorf("non contiguous insert: item %d is #%d [%x…], item %d is #%d [%x…] (parent [%x…])", i-1, chain[i-1].Number, chain[i-1].Hash().Bytes()[:4], i, chain[i].Number, chain[i].Hash().Bytes()[:4], chain[i].ParentHash[:4]) @@ -233,7 +238,7 @@ func (hc *HeaderChain) ValidateHeaderChain(chain []*types.Header, checkFreq int) //for i, _ := range chain { // // If the chain is terminating, stop processing blocks // if hc.procInterrupt() { - // utils.GetLogger().Debug("Premature abort during headers verification") + // utils.Logger().Debug().Msg("Premature abort during headers verification") // return 0, errors.New("aborted") // } // @@ -261,7 +266,7 @@ func (hc *HeaderChain) InsertHeaderChain(chain []*types.Header, writeHeader WhCa for i, header := range chain { // Short circuit insertion if shutting down if hc.procInterrupt() { - utils.GetLogger().Debug("Premature abort during headers import") + utils.Logger().Debug().Msg("Premature abort during headers import") return i, errors.New("aborted") } // If the header's already known, skip it, otherwise store @@ -277,17 +282,20 @@ func (hc *HeaderChain) InsertHeaderChain(chain []*types.Header, writeHeader WhCa // Report some public statistics so the user has a clue what's going on last := chain[len(chain)-1] - context := []interface{}{ - "count", stats.processed, "elapsed", common.PrettyDuration(time.Since(start)), - "number", last.Number, "hash", last.Hash(), - } + context := utils.Logger().With(). + Int("count", stats.processed). + Str("elapsed", common.PrettyDuration(time.Since(start)).String()). + Str("number", last.Number.String()). + Str("hash", last.Hash().Hex()) + if timestamp := time.Unix(last.Time.Int64(), 0); time.Since(timestamp) > time.Minute { - context = append(context, []interface{}{"age", common.PrettyAge(timestamp)}...) + context = context.Str("age", common.PrettyAge(timestamp).String()) } if stats.ignored > 0 { - context = append(context, []interface{}{"ignored", stats.ignored}...) + context = context.Int("ignored", stats.ignored) } - utils.GetLogger().Info("Imported new block headers", context...) + logger := context.Logger() + logger.Info().Msg("Imported new block headers") return 0, nil } diff --git a/core/rawdb/accessors_chain.go b/core/rawdb/accessors_chain.go index 8d150f1ff..07037720e 100644 --- a/core/rawdb/accessors_chain.go +++ b/core/rawdb/accessors_chain.go @@ -41,14 +41,14 @@ func ReadCanonicalHash(db DatabaseReader, number uint64) common.Hash { // WriteCanonicalHash stores the hash assigned to a canonical block number. func WriteCanonicalHash(db DatabaseWriter, hash common.Hash, number uint64) { if err := db.Put(headerHashKey(number), hash.Bytes()); err != nil { - utils.GetLogger().Crit("Failed to store number to hash mapping", "err", err) + utils.Logger().Error().Msg("Failed to store number to hash mapping") } } // DeleteCanonicalHash removes the number to hash canonical mapping. func DeleteCanonicalHash(db DatabaseDeleter, number uint64) { if err := db.Delete(headerHashKey(number)); err != nil { - utils.GetLogger().Crit("Failed to delete number to hash mapping", "err", err) + utils.Logger().Error().Msg("Failed to delete number to hash mapping") } } @@ -74,7 +74,7 @@ func ReadHeadHeaderHash(db DatabaseReader) common.Hash { // WriteHeadHeaderHash stores the hash of the current canonical head header. func WriteHeadHeaderHash(db DatabaseWriter, hash common.Hash) { if err := db.Put(headHeaderKey, hash.Bytes()); err != nil { - utils.GetLogger().Crit("Failed to store last header's hash", "err", err) + utils.Logger().Error().Msg("Failed to store last header's hash") } } @@ -90,7 +90,7 @@ func ReadHeadBlockHash(db DatabaseReader) common.Hash { // WriteHeadBlockHash stores the head block's hash. func WriteHeadBlockHash(db DatabaseWriter, hash common.Hash) { if err := db.Put(headBlockKey, hash.Bytes()); err != nil { - utils.GetLogger().Crit("Failed to store last block's hash", "err", err) + utils.Logger().Error().Msg("Failed to store last block's hash") } } @@ -106,7 +106,7 @@ func ReadHeadFastBlockHash(db DatabaseReader) common.Hash { // WriteHeadFastBlockHash stores the hash of the current fast-sync head block. func WriteHeadFastBlockHash(db DatabaseWriter, hash common.Hash) { if err := db.Put(headFastBlockKey, hash.Bytes()); err != nil { - utils.GetLogger().Crit("Failed to store last fast block's hash", "err", err) + utils.Logger().Error().Msg("Failed to store last fast block's hash") } } @@ -124,7 +124,7 @@ func ReadFastTrieProgress(db DatabaseReader) uint64 { // retrieving it across restarts. func WriteFastTrieProgress(db DatabaseWriter, count uint64) { if err := db.Put(fastTrieProgressKey, new(big.Int).SetUint64(count).Bytes()); err != nil { - utils.GetLogger().Crit("Failed to store fast sync trie progress", "err", err) + utils.Logger().Error().Msg("Failed to store fast sync trie progress") } } @@ -150,7 +150,7 @@ func ReadHeader(db DatabaseReader, hash common.Hash, number uint64) *types.Heade } header := new(types.Header) if err := rlp.Decode(bytes.NewReader(data), header); err != nil { - utils.GetLogger().Error("Invalid block header RLP", "hash", hash, "err", err) + utils.Logger().Error().Err(err).Str("hash", hash.Hex()).Msg("Invalid block header RLP") return nil } return header @@ -167,26 +167,26 @@ func WriteHeader(db DatabaseWriter, header *types.Header) { ) key := headerNumberKey(hash) if err := db.Put(key, encoded); err != nil { - utils.GetLogger().Crit("Failed to store hash to number mapping", "err", err) + utils.Logger().Error().Msg("Failed to store hash to number mapping") } // Write the encoded header data, err := rlp.EncodeToBytes(header) if err != nil { - utils.GetLogger().Crit("Failed to RLP encode header", "err", err) + utils.Logger().Error().Msg("Failed to RLP encode header") } key = headerKey(number, hash) if err := db.Put(key, data); err != nil { - utils.GetLogger().Crit("Failed to store header", "err", err) + utils.Logger().Error().Msg("Failed to store header") } } // DeleteHeader removes all block header data associated with a hash. func DeleteHeader(db DatabaseDeleter, hash common.Hash, number uint64) { if err := db.Delete(headerKey(number, hash)); err != nil { - utils.GetLogger().Crit("Failed to delete header", "err", err) + utils.Logger().Error().Msg("Failed to delete header") } if err := db.Delete(headerNumberKey(hash)); err != nil { - utils.GetLogger().Crit("Failed to delete hash to number mapping", "err", err) + utils.Logger().Error().Msg("Failed to delete hash to number mapping") } } @@ -199,7 +199,7 @@ func ReadBodyRLP(db DatabaseReader, hash common.Hash, number uint64) rlp.RawValu // WriteBodyRLP stores an RLP encoded block body into the database. func WriteBodyRLP(db DatabaseWriter, hash common.Hash, number uint64, rlp rlp.RawValue) { if err := db.Put(blockBodyKey(number, hash), rlp); err != nil { - utils.GetLogger().Crit("Failed to store block body", "err", err) + utils.Logger().Error().Msg("Failed to store block body") } } @@ -219,7 +219,7 @@ func ReadBody(db DatabaseReader, hash common.Hash, number uint64) *types.Body { } body := new(types.Body) if err := rlp.Decode(bytes.NewReader(data), body); err != nil { - utils.GetLogger().Error("Invalid block body RLP", "hash", hash, "err", err) + utils.Logger().Error().Err(err).Str("hash", hash.Hex()).Msg("Invalid block body RLP") return nil } return body @@ -229,7 +229,7 @@ func ReadBody(db DatabaseReader, hash common.Hash, number uint64) *types.Body { func WriteBody(db DatabaseWriter, hash common.Hash, number uint64, body *types.Body) { data, err := rlp.EncodeToBytes(body) if err != nil { - utils.GetLogger().Crit("Failed to RLP encode body", "err", err) + utils.Logger().Error().Msg("Failed to RLP encode body") } WriteBodyRLP(db, hash, number, data) } @@ -237,7 +237,7 @@ func WriteBody(db DatabaseWriter, hash common.Hash, number uint64, body *types.B // DeleteBody removes all block body data associated with a hash. func DeleteBody(db DatabaseDeleter, hash common.Hash, number uint64) { if err := db.Delete(blockBodyKey(number, hash)); err != nil { - utils.GetLogger().Crit("Failed to delete block body", "err", err) + utils.Logger().Error().Msg("Failed to delete block body") } } @@ -249,7 +249,7 @@ func ReadTd(db DatabaseReader, hash common.Hash, number uint64) *big.Int { } td := new(big.Int) if err := rlp.Decode(bytes.NewReader(data), td); err != nil { - utils.GetLogger().Error("Invalid block total difficulty RLP", "hash", hash, "err", err) + utils.Logger().Error().Err(err).Str("hash", hash.Hex()).Msg("Invalid block total difficulty RLP") return nil } return td @@ -259,17 +259,17 @@ func ReadTd(db DatabaseReader, hash common.Hash, number uint64) *big.Int { func WriteTd(db DatabaseWriter, hash common.Hash, number uint64, td *big.Int) { data, err := rlp.EncodeToBytes(td) if err != nil { - utils.GetLogger().Crit("Failed to RLP encode block total difficulty", "err", err) + utils.Logger().Error().Msg("Failed to RLP encode block total difficulty") } if err := db.Put(headerTDKey(number, hash), data); err != nil { - utils.GetLogger().Crit("Failed to store block total difficulty", "err", err) + utils.Logger().Error().Msg("Failed to store block total difficulty") } } // DeleteTd removes all block total difficulty data associated with a hash. func DeleteTd(db DatabaseDeleter, hash common.Hash, number uint64) { if err := db.Delete(headerTDKey(number, hash)); err != nil { - utils.GetLogger().Crit("Failed to delete block total difficulty", "err", err) + utils.Logger().Error().Msg("Failed to delete block total difficulty") } } @@ -283,7 +283,7 @@ func ReadReceipts(db DatabaseReader, hash common.Hash, number uint64) types.Rece // Convert the receipts from their storage form to their internal representation storageReceipts := []*types.ReceiptForStorage{} if err := rlp.DecodeBytes(data, &storageReceipts); err != nil { - utils.GetLogger().Error("Invalid receipt array RLP", "hash", hash, "err", err) + utils.Logger().Error().Err(err).Str("hash", hash.Hex()).Msg("Invalid receipt array RLP") return nil } receipts := make(types.Receipts, len(storageReceipts)) @@ -302,18 +302,18 @@ func WriteReceipts(db DatabaseWriter, hash common.Hash, number uint64, receipts } bytes, err := rlp.EncodeToBytes(storageReceipts) if err != nil { - utils.GetLogger().Crit("Failed to encode block receipts", "err", err) + utils.Logger().Error().Msg("Failed to encode block receipts") } // Store the flattened receipt slice if err := db.Put(blockReceiptsKey(number, hash), bytes); err != nil { - utils.GetLogger().Crit("Failed to store block receipts", "err", err) + utils.Logger().Error().Msg("Failed to store block receipts") } } // DeleteReceipts removes all receipt data associated with a block hash. func DeleteReceipts(db DatabaseDeleter, hash common.Hash, number uint64) { if err := db.Delete(blockReceiptsKey(number, hash)); err != nil { - utils.GetLogger().Crit("Failed to delete block receipts", "err", err) + utils.Logger().Error().Msg("Failed to delete block receipts") } } @@ -349,7 +349,7 @@ func WriteBlock(db DatabaseWriter, block *types.Block) { epochBlockNum := block.Number() writeOne := func() { if err := WriteEpochBlockNumber(db, epoch, epochBlockNum); err != nil { - ctxerror.Log15(utils.GetLogInstance().Error, err) + utils.Logger().Error().Err(err).Msg("Failed to write epoch block number") } } // A block may be a genesis block AND end-of-epoch block at the same time. @@ -443,8 +443,7 @@ func WriteShardStateBytes( "epoch", epoch, ).WithCause(err) } - utils.GetLogger().Info("wrote sharding state", - "epoch", epoch, "numShards", len(data)) + utils.Logger().Info().Str("epoch", epoch.String()).Int("numShards", len(data)).Msg("wrote sharding state") return nil } diff --git a/core/rawdb/accessors_indexes.go b/core/rawdb/accessors_indexes.go index b5c33904c..409fff167 100644 --- a/core/rawdb/accessors_indexes.go +++ b/core/rawdb/accessors_indexes.go @@ -33,7 +33,7 @@ func ReadTxLookupEntry(db DatabaseReader, hash common.Hash) (common.Hash, uint64 } var entry TxLookupEntry if err := rlp.DecodeBytes(data, &entry); err != nil { - utils.GetLogger().Error("Invalid transaction lookup entry RLP", "hash", hash, "err", err) + utils.Logger().Error().Err(err).Bytes("hash", hash.Bytes()).Msg("Invalid transaction lookup entry RLP") return common.Hash{}, 0, 0 } return entry.BlockHash, entry.BlockIndex, entry.Index @@ -50,10 +50,10 @@ func WriteTxLookupEntries(db DatabaseWriter, block *types.Block) { } data, err := rlp.EncodeToBytes(entry) if err != nil { - utils.GetLogger().Crit("Failed to encode transaction lookup entry", "err", err) + utils.Logger().Error().Err(err).Msg("Failed to encode transaction lookup entry") } if err := db.Put(txLookupKey(tx.Hash()), data); err != nil { - utils.GetLogger().Crit("Failed to store transaction lookup entry", "err", err) + utils.Logger().Error().Err(err).Msg("Failed to store transaction lookup entry") } } } @@ -72,7 +72,11 @@ func ReadTransaction(db DatabaseReader, hash common.Hash) (*types.Transaction, c } body := ReadBody(db, blockHash, blockNumber) if body == nil || len(body.Transactions) <= int(txIndex) { - utils.GetLogger().Error("Transaction referenced missing", "number", blockNumber, "hash", blockHash, "index", txIndex) + utils.Logger().Error(). + Uint64("number", blockNumber). + Str("hash", blockHash.Hex()). + Uint64("index", txIndex). + Msg("Transaction referenced missing") return nil, common.Hash{}, 0, 0 } return body.Transactions[txIndex], blockHash, blockNumber, txIndex @@ -87,7 +91,11 @@ func ReadReceipt(db DatabaseReader, hash common.Hash) (*types.Receipt, common.Ha } receipts := ReadReceipts(db, blockHash, blockNumber) if len(receipts) <= int(receiptIndex) { - utils.GetLogger().Error("Receipt refereced missing", "number", blockNumber, "hash", blockHash, "index", receiptIndex) + utils.Logger().Error(). + Uint64("number", blockNumber). + Str("hash", blockHash.Hex()). + Uint64("index", receiptIndex). + Msg("Receipt refereced missing") return nil, common.Hash{}, 0, 0 } return receipts[receiptIndex], blockHash, blockNumber, receiptIndex @@ -103,6 +111,6 @@ func ReadBloomBits(db DatabaseReader, bit uint, section uint64, head common.Hash // section and bit index. func WriteBloomBits(db DatabaseWriter, bit uint, section uint64, head common.Hash, bits []byte) { if err := db.Put(bloomBitsKey(bit, section, head), bits); err != nil { - utils.GetLogger().Crit("Failed to store bloom bits", "err", err) + utils.Logger().Error().Err(err).Msg("Failed to store bloom bits") } } diff --git a/core/rawdb/accessors_metadata.go b/core/rawdb/accessors_metadata.go index 25ddb1f21..1d1d9bb3e 100644 --- a/core/rawdb/accessors_metadata.go +++ b/core/rawdb/accessors_metadata.go @@ -40,7 +40,7 @@ func ReadDatabaseVersion(db DatabaseReader) int { func WriteDatabaseVersion(db DatabaseWriter, version int) { enc, _ := rlp.EncodeToBytes(version) if err := db.Put(databaseVerisionKey, enc); err != nil { - utils.GetLogger().Crit("Failed to store the database version", "err", err) + utils.Logger().Error().Err(err).Msg("Failed to store the database version") } } @@ -52,7 +52,7 @@ func ReadChainConfig(db DatabaseReader, hash common.Hash) *params.ChainConfig { } var config params.ChainConfig if err := json.Unmarshal(data, &config); err != nil { - utils.GetLogger().Error("Invalid chain config JSON", "hash", hash, "err", err) + utils.Logger().Error().Err(err).Bytes("hash", hash.Bytes()).Msg("Invalid chain config JSON") return nil } return &config @@ -65,10 +65,10 @@ func WriteChainConfig(db DatabaseWriter, hash common.Hash, cfg *params.ChainConf } data, err := json.Marshal(cfg) if err != nil { - utils.GetLogger().Crit("Failed to JSON encode chain config", "err", err) + utils.Logger().Error().Err(err).Msg("Failed to JSON encode chain config") } if err := db.Put(configKey(hash), data); err != nil { - utils.GetLogger().Crit("Failed to store chain config", "err", err) + utils.Logger().Error().Err(err).Msg("Failed to store chain config") } } @@ -83,7 +83,7 @@ func ReadPreimage(db DatabaseReader, hash common.Hash) []byte { func WritePreimages(db DatabaseWriter, number uint64, preimages map[common.Hash][]byte) { for hash, preimage := range preimages { if err := db.Put(preimageKey(hash), preimage); err != nil { - utils.GetLogger().Crit("Failed to store trie preimage", "err", err) + utils.Logger().Error().Err(err).Msg("Failed to store trie preimage") } } preimageCounter.Inc(int64(len(preimages))) diff --git a/core/resharding.go b/core/resharding.go index 0996f9a94..2caaeb7d5 100644 --- a/core/resharding.go +++ b/core/resharding.go @@ -2,6 +2,7 @@ package core import ( "encoding/binary" + "encoding/hex" "errors" "math/big" "math/rand" @@ -13,22 +14,14 @@ import ( "github.com/harmony-one/harmony/contracts/structs" "github.com/harmony-one/harmony/core/types" common2 "github.com/harmony-one/harmony/internal/common" + shardingconfig "github.com/harmony-one/harmony/internal/configs/sharding" "github.com/harmony-one/harmony/internal/ctxerror" - "github.com/harmony-one/harmony/internal/genesis" "github.com/harmony-one/harmony/internal/utils" ) const ( // GenesisEpoch is the number of the genesis epoch. GenesisEpoch = 0 - // FirstEpoch is the number of the first epoch. - FirstEpoch = 1 - // GenesisShardNum is the number of shard at genesis - GenesisShardNum = 4 - // GenesisShardSize is the size of each shard at genesis - GenesisShardSize = 150 - // GenesisShardHarmonyNodes is the number of harmony node at each shard - GenesisShardHarmonyNodes = 112 // CuckooRate is the percentage of nodes getting reshuffled in the second step of cuckoo resharding. CuckooRate = 0.1 ) @@ -65,7 +58,7 @@ func (ss *ShardingState) assignNewNodes(newNodeList []types.NodeID) { if id < len(ss.shardState) { ss.shardState[id].NodeList = append(ss.shardState[id].NodeList, nid) } else { - utils.GetLogInstance().Error("assignNewNodes", "index out of range", len(ss.shardState), "id", id) + utils.Logger().Error().Int("id", id).Int("shardState Count", len(ss.shardState)).Msg("assignNewNodes index out of range") } } } @@ -123,7 +116,7 @@ func (ss *ShardingState) Reshard(newNodeList []types.NodeID, percent float64) { // Put leader back if len(leaders) < ss.numShards { - utils.GetLogInstance().Error("Not enough leaders to assign to shards") + utils.Logger().Error().Msg("Not enough leaders to assign to shards") } for i := 0; i < ss.numShards; i++ { ss.shardState[i].NodeList = append([]types.NodeID{leaders[i]}, ss.shardState[i].NodeList...) @@ -142,20 +135,22 @@ func Shuffle(list []types.NodeID) { } // GetBlockNumberFromEpoch calculates the block number where epoch sharding information is stored +// TODO lc - use ShardingSchedule function func GetBlockNumberFromEpoch(epoch uint64) uint64 { - number := epoch * uint64(BlocksPerEpoch) // currently we use the first block in each epoch + number := epoch * ShardingSchedule.BlocksPerEpoch() // currently we use the first block in each epoch return number } // GetLastBlockNumberFromEpoch calculates the last block number for the given // epoch. TODO ek – this is a temp hack. +// TODO lc - use ShardingSchedule function func GetLastBlockNumberFromEpoch(epoch uint64) uint64 { - return (epoch+1)*BlocksPerEpoch - 1 + return (epoch+1)*ShardingSchedule.BlocksPerEpoch() - 1 } // GetEpochFromBlockNumber calculates the epoch number the block belongs to func GetEpochFromBlockNumber(blockNumber uint64) uint64 { - return blockNumber / uint64(BlocksPerEpoch) + return ShardingSchedule.CalcEpochNumber(blockNumber).Uint64() } // GetShardingStateFromBlockChain will retrieve random seed and shard map from beacon chain for given a epoch @@ -191,7 +186,7 @@ func CalculateNewShardState( WithCause(err) } newNodeList := ss.UpdateShardingState(stakeInfo) - utils.GetLogInstance().Info("Cuckoo Rate", "percentage", CuckooRate) + utils.Logger().Info().Float64("percentage", CuckooRate).Msg("Cuckoo Rate") ss.Reshard(newNodeList, CuckooRate) return ss.shardState, nil } @@ -223,38 +218,82 @@ func (ss *ShardingState) UpdateShardingState(stakeInfo *map[common.Address]*stru return newAddresses } +// TODO ek – shardingSchedule should really be part of a general-purpose network +// configuration. We are OK for the time being, +// until the day we should let one node process join multiple networks. + +// ShardingSchedule is the sharding configuration schedule. +// Depends on the type of the network. Defaults to the mainnet schedule. +var ShardingSchedule shardingconfig.Schedule = shardingconfig.MainnetSchedule + // GetInitShardState returns the initial shard state at genesis. func GetInitShardState() types.ShardState { - utils.GetLogInstance().Info("Generating Genesis Shard State.") + return GetShardState(big.NewInt(GenesisEpoch)) +} + +// GetShardState returns the shard state based on epoch number +func GetShardState(epoch *big.Int) types.ShardState { + utils.Logger().Info().Int64("epoch", epoch.Int64()).Msg("Get Shard State of Epoch.") + shardingConfig := ShardingSchedule.InstanceForEpoch(epoch) + shardNum := int(shardingConfig.NumShards()) + shardHarmonyNodes := shardingConfig.NumHarmonyOperatedNodesPerShard() + shardSize := shardingConfig.NumNodesPerShard() + hmyAccounts := shardingConfig.HmyAccounts() + fnAccounts := shardingConfig.FnAccounts() + shardState := types.ShardState{} - for i := 0; i < GenesisShardNum; i++ { + for i := 0; i < shardNum; i++ { com := types.Committee{ShardID: uint32(i)} - for j := 0; j < GenesisShardHarmonyNodes; j++ { - index := i + j*GenesisShardNum // The initial account to use for genesis nodes + for j := 0; j < shardHarmonyNodes; j++ { + index := i + j*shardNum // The initial account to use for genesis nodes pub := &bls.PublicKey{} - pub.DeserializeHexStr(genesis.HarmonyAccounts[index].BlsPublicKey) + pub.DeserializeHexStr(hmyAccounts[index].BlsPublicKey) pubKey := types.BlsPublicKey{} pubKey.FromLibBLSPublicKey(pub) // TODO: directly read address for bls too - curNodeID := types.NodeID{common2.ParseAddr(genesis.HarmonyAccounts[index].Address), pubKey} + curNodeID := types.NodeID{common2.ParseAddr(hmyAccounts[index].Address), pubKey} com.NodeList = append(com.NodeList, curNodeID) } // add FN runner's key - for j := GenesisShardHarmonyNodes; j < GenesisShardSize; j++ { - index := i + (j-GenesisShardHarmonyNodes)*GenesisShardNum + for j := shardHarmonyNodes; j < shardSize; j++ { + index := i + (j-shardHarmonyNodes)*shardNum pub := &bls.PublicKey{} - pub.DeserializeHexStr(genesis.FoundationalNodeAccounts[index].BlsPublicKey) + pub.DeserializeHexStr(fnAccounts[index].BlsPublicKey) pubKey := types.BlsPublicKey{} pubKey.FromLibBLSPublicKey(pub) // TODO: directly read address for bls too - curNodeID := types.NodeID{common2.ParseAddr(genesis.FoundationalNodeAccounts[index].Address), pubKey} + curNodeID := types.NodeID{common2.ParseAddr(fnAccounts[index].Address), pubKey} com.NodeList = append(com.NodeList, curNodeID) } shardState = append(shardState, com) } return shardState } + +// GetPublicKeys returns the publickeys given epoch and shardID +func GetPublicKeys(epoch *big.Int, shardID uint32) []*bls.PublicKey { + shardState := GetShardState(epoch) + + // Update validator public keys + committee := shardState.FindCommitteeByID(shardID) + if committee == nil { + utils.Logger().Warn().Uint32("shardID", shardID).Uint64("epoch", epoch.Uint64()).Msg("Cannot find committee") + return nil + } + pubKeys := []*bls.PublicKey{} + for _, node := range committee.NodeList { + pubKey := &bls.PublicKey{} + pubKeyBytes := node.BlsPublicKey[:] + err := pubKey.Deserialize(pubKeyBytes) + if err != nil { + utils.Logger().Warn().Str("pubKeyBytes", hex.EncodeToString(pubKeyBytes)).Msg("Cannot Deserialize pubKey") + return nil + } + pubKeys = append(pubKeys, pubKey) + } + return pubKeys +} diff --git a/core/state_transition.go b/core/state_transition.go index 36a8cb86a..c2fccc6aa 100644 --- a/core/state_transition.go +++ b/core/state_transition.go @@ -214,7 +214,7 @@ func (st *StateTransition) TransitionDb() (ret []byte, usedGas uint64, failed bo ret, st.gas, vmerr = evm.Call(sender, st.to(), st.data, st.gas, st.value) } if vmerr != nil { - utils.GetLogger().Debug("VM returned with error", "err", vmerr) + utils.Logger().Debug().Err(vmerr).Msg("VM returned with error") // The only possible consensus-error would be if there wasn't // sufficient balance to make the transfer happen. The first // balance transfer may never fail. diff --git a/core/tx_journal.go b/core/tx_journal.go index fcde20bb1..6392e83e8 100644 --- a/core/tx_journal.go +++ b/core/tx_journal.go @@ -83,7 +83,7 @@ func (journal *txJournal) load(add func([]*types.Transaction) []error) error { loadBatch := func(txs types.Transactions) { for _, err := range add(txs) { if err != nil { - utils.GetLogger().Debug("Failed to add journaled transaction", "err", err) + utils.Logger().Error().Err(err).Msg("Failed to add journaled transaction") dropped++ } } @@ -112,7 +112,10 @@ func (journal *txJournal) load(add func([]*types.Transaction) []error) error { batch = batch[:0] } } - utils.GetLogger().Info("Loaded local transaction journal", "transactions", total, "dropped", dropped) + utils.Logger().Info(). + Int("transactions", total). + Int("dropped", dropped). + Msg("Loaded local transaction journal") return failure } @@ -161,7 +164,10 @@ func (journal *txJournal) rotate(all map[common.Address]types.Transactions) erro return err } journal.writer = sink - utils.GetLogger().Info("Regenerated local transaction journal", "transactions", journaled, "accounts", len(all)) + utils.Logger().Info(). + Int("transactions", journaled). + Int("accounts", len(all)). + Msg("Regenerated local transaction journal") return nil } diff --git a/core/tx_list.go b/core/tx_list.go index 22f5439bb..0939f5ffb 100644 --- a/core/tx_list.go +++ b/core/tx_list.go @@ -486,7 +486,7 @@ func (l *txPricedList) Underpriced(tx *types.Transaction, local *accountSet) boo } // Check if the transaction is underpriced or not if len(*l.items) == 0 { - utils.GetLogger().Error("Pricing query for empty pool") // This cannot happen, print to catch programming errors + utils.Logger().Error().Msg("Pricing query for empty pool") // This cannot happen, print to catch programming errors return false } cheapest := []*types.Transaction(*l.items)[0] diff --git a/core/tx_pool.go b/core/tx_pool.go index 8e543d885..ef10cb834 100644 --- a/core/tx_pool.go +++ b/core/tx_pool.go @@ -164,15 +164,24 @@ var DefaultTxPoolConfig = TxPoolConfig{ func (config *TxPoolConfig) sanitize() TxPoolConfig { conf := *config if conf.Rejournal < time.Second { - utils.GetLogger().Warn("Sanitizing invalid txpool journal time", "provided", conf.Rejournal, "updated", time.Second) + utils.Logger().Warn(). + Dur("provided", conf.Rejournal). + Dur("updated", time.Second). + Msg("Sanitizing invalid txpool journal time") conf.Rejournal = time.Second } if conf.PriceLimit < 1 { - utils.GetLogger().Warn("Sanitizing invalid txpool price limit", "provided", conf.PriceLimit, "updated", DefaultTxPoolConfig.PriceLimit) + utils.Logger().Warn(). + Uint64("provided", conf.PriceLimit). + Uint64("updated", DefaultTxPoolConfig.PriceLimit). + Msg("Sanitizing invalid txpool price limit") conf.PriceLimit = DefaultTxPoolConfig.PriceLimit } if conf.PriceBump < 1 { - utils.GetLogger().Warn("Sanitizing invalid txpool price bump", "provided", conf.PriceBump, "updated", DefaultTxPoolConfig.PriceBump) + utils.Logger().Warn(). + Uint64("provided", conf.PriceBump). + Uint64("updated", DefaultTxPoolConfig.PriceBump). + Msg("Sanitizing invalid txpool price bump") conf.PriceBump = DefaultTxPoolConfig.PriceBump } return conf @@ -236,7 +245,7 @@ func NewTxPool(config TxPoolConfig, chainconfig *params.ChainConfig, chain block } pool.locals = newAccountSet(pool.signer) for _, addr := range config.Locals { - utils.GetLogger().Info("Setting new local account", "address", addr) + utils.Logger().Info().Interface("address", addr).Msg("Setting new local account") pool.locals.add(addr) } pool.priced = newTxPricedList(pool.all) @@ -247,10 +256,10 @@ func NewTxPool(config TxPoolConfig, chainconfig *params.ChainConfig, chain block pool.journal = newTxJournal(config.Journal) if err := pool.journal.load(pool.AddLocals); err != nil { - utils.GetLogger().Warn("Failed to load transaction journal", "err", err) + utils.Logger().Warn().Err(err).Msg("Failed to load transaction journal") } if err := pool.journal.rotate(pool.local()); err != nil { - utils.GetLogger().Warn("Failed to rotate transaction journal", "err", err) + utils.Logger().Warn().Err(err).Msg("Failed to rotate transaction journal") } } // Subscribe events from blockchain @@ -311,7 +320,11 @@ func (pool *TxPool) loop() { pool.mu.RUnlock() if pending != prevPending || queued != prevQueued || stales != prevStales { - utils.GetLogger().Debug("Transaction pool status report", "executable", pending, "queued", queued, "stales", stales) + utils.Logger().Debug(). + Int("executable", pending). + Int("queued", queued). + Int("stales", stales). + Msg("Transaction pool status report") prevPending, prevQueued, prevStales = pending, queued, stales } @@ -337,7 +350,7 @@ func (pool *TxPool) loop() { if pool.journal != nil { pool.mu.Lock() if err := pool.journal.rotate(pool.local()); err != nil { - utils.GetLogger().Warn("Failed to rotate local tx journal", "err", err) + utils.Logger().Warn().Err(err).Msg("Failed to rotate local tx journal") } pool.mu.Unlock() } @@ -366,7 +379,7 @@ func (pool *TxPool) reset(oldHead, newHead *types.Header) { newNum := newHead.Number.Uint64() if depth := uint64(math.Abs(float64(oldNum) - float64(newNum))); depth > 64 { - utils.GetLogger().Debug("Skipping deep transaction reorg", "depth", depth) + utils.Logger().Debug().Uint64("depth", depth).Msg("Skipping deep transaction reorg") } else { // Reorg seems shallow enough to pull in all transactions into memory var discarded, included types.Transactions @@ -378,26 +391,38 @@ func (pool *TxPool) reset(oldHead, newHead *types.Header) { for rem.NumberU64() > add.NumberU64() { discarded = append(discarded, rem.Transactions()...) if rem = pool.chain.GetBlock(rem.ParentHash(), rem.NumberU64()-1); rem == nil { - utils.GetLogger().Error("Unrooted old chain seen by tx pool", "block", oldHead.Number, "hash", oldHead.Hash()) + utils.Logger().Error(). + Str("block", oldHead.Number.String()). + Str("hash", oldHead.Hash().Hex()). + Msg("Unrooted old chain seen by tx pool") return } } for add.NumberU64() > rem.NumberU64() { included = append(included, add.Transactions()...) if add = pool.chain.GetBlock(add.ParentHash(), add.NumberU64()-1); add == nil { - utils.GetLogger().Error("Unrooted new chain seen by tx pool", "block", newHead.Number, "hash", newHead.Hash()) + utils.Logger().Error(). + Str("block", newHead.Number.String()). + Str("hash", newHead.Hash().Hex()). + Msg("Unrooted new chain seen by tx pool") return } } for rem.Hash() != add.Hash() { discarded = append(discarded, rem.Transactions()...) if rem = pool.chain.GetBlock(rem.ParentHash(), rem.NumberU64()-1); rem == nil { - utils.GetLogger().Error("Unrooted old chain seen by tx pool", "block", oldHead.Number, "hash", oldHead.Hash()) + utils.Logger().Error(). + Str("block", oldHead.Number.String()). + Str("hash", oldHead.Hash().Hex()). + Msg("Unrooted old chain seen by tx pool") return } included = append(included, add.Transactions()...) if add = pool.chain.GetBlock(add.ParentHash(), add.NumberU64()-1); add == nil { - utils.GetLogger().Error("Unrooted new chain seen by tx pool", "block", newHead.Number, "hash", newHead.Hash()) + utils.Logger().Error(). + Str("block", newHead.Number.String()). + Str("hash", newHead.Hash().Hex()). + Msg("Unrooted new chain seen by tx pool") return } } @@ -410,7 +435,7 @@ func (pool *TxPool) reset(oldHead, newHead *types.Header) { } statedb, err := pool.chain.StateAt(newHead.Root) if err != nil { - utils.GetLogger().Error("Failed to reset txpool state", "err", err) + utils.Logger().Error().Err(err).Msg("Failed to reset txpool state") return } pool.currentState = statedb @@ -418,7 +443,7 @@ func (pool *TxPool) reset(oldHead, newHead *types.Header) { pool.currentMaxGas = newHead.GasLimit // Inject any transactions discarded due to reorgs - utils.GetLogger().Debug("Reinjecting stale transactions", "count", len(reinject)) + utils.Logger().Debug().Int("count", len(reinject)).Msg("Reinjecting stale transactions") //senderCacher.recover(pool.signer, reinject) pool.addTxsLocked(reinject, false) @@ -450,7 +475,7 @@ func (pool *TxPool) Stop() { if pool.journal != nil { pool.journal.close() } - utils.GetLogger().Info("Transaction pool stopped") + utils.Logger().Info().Msg("Transaction pool stopped") } // SubscribeNewTxsEvent registers a subscription of NewTxsEvent and @@ -477,7 +502,7 @@ func (pool *TxPool) SetGasPrice(price *big.Int) { for _, tx := range pool.priced.Cap(price, pool.locals) { pool.removeTx(tx.Hash(), false) } - utils.GetLogger().Info("Transaction pool price threshold updated", "price", price) + utils.Logger().Info().Str("price", price.String()).Msg("Transaction pool price threshold updated") } // State returns the virtual managed state of the transaction pool. @@ -620,15 +645,16 @@ func (pool *TxPool) validateTx(tx *types.Transaction, local bool) error { // whitelisted, preventing any associated transaction from being dropped out of // the pool due to pricing constraints. func (pool *TxPool) add(tx *types.Transaction, local bool) (bool, error) { + logger := utils.Logger().With().Stack().Logger() // If the transaction is already known, discard it hash := tx.Hash() if pool.all.Get(hash) != nil { - utils.GetLogger().Trace("Discarding already known transaction", "hash", hash) + logger.Warn().Str("hash", hash.Hex()).Msg("Discarding already known transaction") return false, fmt.Errorf("known transaction: %x", hash) } // If the transaction fails basic validation, discard it if err := pool.validateTx(tx, local); err != nil { - utils.GetLogger().Trace("Discarding invalid transaction", "hash", hash, "err", err) + logger.Warn().Err(err).Str("hash", hash.Hex()).Msg("Discarding invalid transaction") invalidTxCounter.Inc(1) return false, err } @@ -636,14 +662,20 @@ func (pool *TxPool) add(tx *types.Transaction, local bool) (bool, error) { if uint64(pool.all.Count()) >= pool.config.GlobalSlots+pool.config.GlobalQueue { // If the new transaction is underpriced, don't accept it if !local && pool.priced.Underpriced(tx, pool.locals) { - utils.GetLogger().Trace("Discarding underpriced transaction", "hash", hash, "price", tx.GasPrice()) + logger.Warn(). + Str("hash", hash.Hex()). + Str("price", tx.GasPrice().String()). + Msg("Discarding underpriced transaction") underpricedTxCounter.Inc(1) return false, ErrUnderpriced } // New transaction is better than our worse ones, make room for it drop := pool.priced.Discard(pool.all.Count()-int(pool.config.GlobalSlots+pool.config.GlobalQueue-1), pool.locals) for _, tx := range drop { - utils.GetLogger().Trace("Discarding freshly underpriced transaction", "hash", tx.Hash(), "price", tx.GasPrice()) + logger.Warn(). + Str("hash", tx.Hash().Hex()). + Str("price", tx.GasPrice().String()). + Msg("Discarding freshly underpriced transaction") underpricedTxCounter.Inc(1) pool.removeTx(tx.Hash(), false) } @@ -667,7 +699,11 @@ func (pool *TxPool) add(tx *types.Transaction, local bool) (bool, error) { pool.priced.Put(tx) pool.journalTx(from, tx) - utils.GetLogger().Trace("Pooled new executable transaction", "hash", hash, "from", from, "to", tx.To()) + logger.Warn(). + Str("hash", tx.Hash().Hex()). + Interface("from", from). + Interface("to", tx.To()). + Msg("Pooled new executable transaction") // We've directly injected a replacement transaction, notify subsystems // go pool.txFeed.Send(NewTxsEvent{types.Transactions{tx}}) @@ -682,13 +718,17 @@ func (pool *TxPool) add(tx *types.Transaction, local bool) (bool, error) { // Mark local addresses and journal local transactions if local { if !pool.locals.contains(from) { - utils.GetLogger().Info("Setting new local account", "address", from) + utils.Logger().Info().Interface("address", from).Msg("Setting new local account") pool.locals.add(from) } } pool.journalTx(from, tx) - utils.GetLogger().Trace("Pooled new future transaction", "hash", hash, "from", from, "to", tx.To()) + logger.Warn(). + Str("hash", hash.Hex()). + Interface("from", from). + Interface("to", tx.To()). + Msg("Pooled new future transaction") return replace, nil } @@ -736,7 +776,7 @@ func (pool *TxPool) journalTx(from common.Address, tx *types.Transaction) { return } if err := pool.journal.insert(tx); err != nil { - utils.GetLogger().Warn("Failed to journal local transaction", "err", err) + utils.Logger().Warn().Err(err).Msg("Failed to journal local transaction") } } @@ -933,6 +973,7 @@ func (pool *TxPool) removeTx(hash common.Hash, outofbound bool) { func (pool *TxPool) promoteExecutables(accounts []common.Address) { // Track the promoted transactions to broadcast them at once var promoted []*types.Transaction + logger := utils.Logger().With().Stack().Logger() // Gather all the accounts potentially needing updates if accounts == nil { @@ -950,7 +991,7 @@ func (pool *TxPool) promoteExecutables(accounts []common.Address) { // Drop all transactions that are deemed too old (low nonce) for _, tx := range list.Forward(pool.currentState.GetNonce(addr)) { hash := tx.Hash() - utils.GetLogger().Trace("Removed old queued transaction", "hash", hash) + logger.Warn().Str("hash", hash.Hex()).Msg("Removed old queued transaction") pool.all.Remove(hash) pool.priced.Removed() } @@ -958,7 +999,7 @@ func (pool *TxPool) promoteExecutables(accounts []common.Address) { drops, _ := list.Filter(pool.currentState.GetBalance(addr), pool.currentMaxGas) for _, tx := range drops { hash := tx.Hash() - utils.GetLogger().Trace("Removed unpayable queued transaction", "hash", hash) + logger.Warn().Str("hash", hash.Hex()).Msg("Removed unpayable queued transaction") pool.all.Remove(hash) pool.priced.Removed() queuedNofundsCounter.Inc(1) @@ -967,7 +1008,7 @@ func (pool *TxPool) promoteExecutables(accounts []common.Address) { for _, tx := range list.Ready(pool.pendingState.GetNonce(addr)) { hash := tx.Hash() if pool.promoteTx(addr, hash, tx) { - utils.GetLogger().Trace("Promoting queued transaction", "hash", hash) + logger.Warn().Str("hash", hash.Hex()).Msg("Promoting queued transaction") promoted = append(promoted, tx) } } @@ -978,7 +1019,7 @@ func (pool *TxPool) promoteExecutables(accounts []common.Address) { pool.all.Remove(hash) pool.priced.Removed() queuedRateLimitCounter.Inc(1) - utils.GetLogger().Trace("Removed cap-exceeding queued transaction", "hash", hash) + logger.Warn().Str("hash", hash.Hex()).Msg("Removed cap-exceeding queued transaction") } } // Delete the entire queue entry if it became empty. @@ -1031,7 +1072,7 @@ func (pool *TxPool) promoteExecutables(accounts []common.Address) { if nonce := tx.Nonce(); pool.pendingState.GetNonce(offenders[i]) > nonce { pool.pendingState.SetNonce(offenders[i], nonce) } - utils.GetLogger().Trace("Removed fairness-exceeding pending transaction", "hash", hash) + logger.Warn().Str("hash", hash.Hex()).Msg("Removed fairness-exceeding pending transaction") } pending-- } @@ -1053,7 +1094,7 @@ func (pool *TxPool) promoteExecutables(accounts []common.Address) { if nonce := tx.Nonce(); pool.pendingState.GetNonce(addr) > nonce { pool.pendingState.SetNonce(addr, nonce) } - utils.GetLogger().Trace("Removed fairness-exceeding pending transaction", "hash", hash) + logger.Warn().Str("hash", hash.Hex()).Msg("Removed fairness-exceeding pending transaction") } pending-- } @@ -1108,13 +1149,15 @@ func (pool *TxPool) promoteExecutables(accounts []common.Address) { // are moved back into the future queue. func (pool *TxPool) demoteUnexecutables() { // Iterate over all accounts and demote any non-executable transactions + logger := utils.Logger().With().Stack().Logger() + for addr, list := range pool.pending { nonce := pool.currentState.GetNonce(addr) // Drop all transactions that are deemed too old (low nonce) for _, tx := range list.Forward(nonce) { hash := tx.Hash() - utils.GetLogger().Trace("Removed old pending transaction", "hash", hash) + logger.Warn().Str("hash", hash.Hex()).Msg("Removed old pending transaction") pool.all.Remove(hash) pool.priced.Removed() } @@ -1122,21 +1165,21 @@ func (pool *TxPool) demoteUnexecutables() { drops, invalids := list.Filter(pool.currentState.GetBalance(addr), pool.currentMaxGas) for _, tx := range drops { hash := tx.Hash() - utils.GetLogger().Trace("Removed unpayable pending transaction", "hash", hash) + logger.Warn().Str("hash", hash.Hex()).Msg("Removed unpayable pending transaction") pool.all.Remove(hash) pool.priced.Removed() pendingNofundsCounter.Inc(1) } for _, tx := range invalids { hash := tx.Hash() - utils.GetLogger().Trace("Demoting pending transaction", "hash", hash) + logger.Warn().Str("hash", hash.Hex()).Msg("Demoting pending transaction") pool.enqueueTx(hash, tx) } // If there's a gap in front, alert (should never happen) and postpone all transactions if list.Len() > 0 && list.txs.Get(nonce) == nil { for _, tx := range list.Cap(0) { hash := tx.Hash() - utils.GetLogger().Error("Demoting invalidated transaction", "hash", hash) + logger.Error().Str("hash", hash.Hex()).Msg("Demoting invalidated transaction") pool.enqueueTx(hash, tx) } } diff --git a/core/types/block.go b/core/types/block.go index ae19d6d73..3026b1c5d 100644 --- a/core/types/block.go +++ b/core/types/block.go @@ -29,8 +29,8 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/rlp" + "github.com/rs/zerolog" "golang.org/x/crypto/sha3" "github.com/harmony-one/harmony/internal/utils" @@ -69,7 +69,7 @@ func (n *BlockNonce) UnmarshalText(input []byte) error { return hexutil.UnmarshalFixedText("BlockNonce", input, n[:]) } -// Header represents a block header in the Ethereum blockchain. +// Header represents a block header in the Harmony blockchain. type Header struct { ParentHash common.Hash `json:"parentHash" gencodec:"required"` Coinbase common.Address `json:"miner" gencodec:"required"` @@ -118,13 +118,15 @@ func (h *Header) Size() common.StorageSize { } // Logger returns a sub-logger with block contexts added. -func (h *Header) Logger(logger log.Logger) log.Logger { - return logger.New( - "blockHash", h.Hash(), - "blockShard", h.ShardID, - "blockEpoch", h.Epoch, - "blockNumber", h.Number, - ) +func (h *Header) Logger(logger *zerolog.Logger) *zerolog.Logger { + nlogger := logger. + With(). + Str("blockHash", h.Hash().Hex()). + Uint32("blockShard", h.ShardID). + Str("blockEpoch", h.Epoch.String()). + Str("blockNumber", h.Number.String()). + Logger() + return &nlogger } // GetShardState returns the deserialized shard state object. @@ -175,9 +177,10 @@ type Block struct { // SetLastCommitSig sets the last block's commit group signature. func (b *Block) SetLastCommitSig(sig []byte, signers []byte) { if len(sig) != len(b.header.LastCommitSignature) { - utils.GetLogInstance().Warn("SetLastCommitSig: sig size mismatch", - "srcLen", len(sig), - "dstLen", len(b.header.LastCommitSignature)) + utils.Logger().Warn(). + Int("srcLen", len(sig)). + Int("dstLen", len(b.header.LastCommitSignature)). + Msg("SetLastCommitSig: sig size mismatch") } copy(b.header.LastCommitSignature[:], sig[:]) b.header.LastCommitBitmap = append(signers[:0:0], signers...) @@ -436,7 +439,7 @@ func (b *Block) Hash() common.Hash { //if hash := b.hash.Load(); hash != nil { // return hash.(common.Hash) //} - //b.Logger(utils.GetLogger()).Debug("finalizing and caching block hash") + // b.Logger(utils.Logger()).Debug().Msg("finalizing and caching block hash") v := b.header.Hash() b.hash.Store(v) return v @@ -507,6 +510,6 @@ func (b *Block) AddShardState(shardState ShardState) error { } // Logger returns a sub-logger with block contexts added. -func (b *Block) Logger(logger log.Logger) log.Logger { +func (b *Block) Logger(logger *zerolog.Logger) *zerolog.Logger { return b.header.Logger(logger) } diff --git a/core/types/transaction.go b/core/types/transaction.go index 9e8ed1651..12ae4a06e 100644 --- a/core/types/transaction.go +++ b/core/types/transaction.go @@ -46,14 +46,14 @@ type Transaction struct { } type txdata struct { - AccountNonce uint64 `json:"nonce" gencodec:"required"` - Price *big.Int `json:"gasPrice" gencodec:"required"` - GasLimit uint64 `json:"gas" gencodec:"required"` - ShardID uint32 `json:"shardID" gencodec:"required"` - ToShardID uint32 `json:"toShardID" rlp:"nil"` // for cross-shard tx's destination shard ID; nil means intra-shard tx - Recipient *common.Address `json:"to" rlp:"nil"` // nil means contract creation - Amount *big.Int `json:"value" gencodec:"required"` - Payload []byte `json:"input" gencodec:"required"` + AccountNonce uint64 `json:"nonce" gencodec:"required"` + Price *big.Int `json:"gasPrice" gencodec:"required"` + GasLimit uint64 `json:"gas" gencodec:"required"` + ShardID uint32 `json:"shardID" gencodec:"required"` + ToShardID uint32 `json:"toShardID" gencodec:"required"` + Recipient *common.Address `json:"to" rlp:"nil"` // nil means contract creation + Amount *big.Int `json:"value" gencodec:"required"` + Payload []byte `json:"input" gencodec:"required"` // Signature values V *big.Int `json:"v" gencodec:"required"` diff --git a/core/types/transaction_signing.go b/core/types/transaction_signing.go index cfacc79aa..cafa6674e 100644 --- a/core/types/transaction_signing.go +++ b/core/types/transaction_signing.go @@ -218,6 +218,7 @@ func (fs FrontierSigner) Hash(tx *Transaction) common.Hash { tx.data.Price, tx.data.GasLimit, tx.data.ShardID, + tx.data.ToShardID, tx.data.Recipient, tx.data.Amount, tx.data.Payload, diff --git a/core/vm/evm.go b/core/vm/evm.go index acee46efe..15d3138c9 100644 --- a/core/vm/evm.go +++ b/core/vm/evm.go @@ -169,6 +169,11 @@ func (evm *EVM) Cancel() { atomic.StoreInt32(&evm.abort, 1) } +// Cancelled returns true if Cancel has been called +func (evm *EVM) Cancelled() bool { + return atomic.LoadInt32(&evm.abort) == 1 +} + // Interpreter returns the current interpreter func (evm *EVM) Interpreter() Interpreter { return evm.interpreter diff --git a/drand/drand_leader.go b/drand/drand_leader.go index eecd6f50d..f7ff9a98b 100644 --- a/drand/drand_leader.go +++ b/drand/drand_leader.go @@ -44,7 +44,7 @@ func (dRand *DRand) WaitForEpochBlock(blockChannel chan *types.Block, stopChan c start := time.Now() vdf.Execute() duration := time.Now().Sub(start) - utils.GetLogInstance().Info("VDF computation finished", "time spent", duration.String()) + utils.Logger().Info().Dur("duration", duration).Msg("VDF computation finished") output := <-outputChannel rndBytes := [64]byte{} // The first 32 bytes are the randomness and the last 32 bytes are the hash of the block where the corresponding pRnd was generated @@ -64,7 +64,7 @@ func (dRand *DRand) WaitForEpochBlock(blockChannel chan *types.Block, stopChan c } func (dRand *DRand) init(epochBlock *types.Block) { - utils.GetLogInstance().Debug("INITING DRAND") + utils.Logger().Debug().Msg("INITING DRAND") dRand.ResetState() // Copy over block hash and block header data blockHash := epochBlock.Hash() @@ -77,7 +77,10 @@ func (dRand *DRand) init(epochBlock *types.Block) { (*dRand.vrfs)[dRand.SelfAddress] = append(rand[:], proof...) - utils.GetLogInstance().Info("[DRG] sent init", "msg", msgToSend, "leader.PubKey", dRand.leader.ConsensusPubKey) + utils.Logger().Info(). + Bytes("msg", msgToSend). + Str("leader.PubKey", dRand.leader.ConsensusPubKey.SerializeToHexStr()). + Msg("[DRG] sent init") dRand.host.SendMessageToGroups([]p2p.GroupID{p2p.NewGroupIDByShardID(p2p.ShardID(dRand.ShardID))}, host.ConstructP2pMessage(byte(17), msgToSend)) } @@ -87,12 +90,14 @@ func (dRand *DRand) ProcessMessageLeader(payload []byte) { err := protobuf.Unmarshal(payload, message) if err != nil { - utils.GetLogInstance().Error("Failed to unmarshal message payload.", "err", err, "dRand", dRand) + utils.Logger().Error().Err(err).Interface("dRand", dRand).Msg("Failed to unmarshal message payload") } if message.GetDrand().ShardId != dRand.ShardID { - utils.GetLogInstance().Warn("Received drand message from different shard", - "myShardId", dRand.ShardID, "receivedShardId", message.GetDrand().ShardId) + utils.Logger().Warn(). + Uint32("myShardId", dRand.ShardID). + Uint32("receivedShardId", message.GetDrand().ShardId). + Msg("Received drand message from different shard") return } @@ -100,15 +105,21 @@ func (dRand *DRand) ProcessMessageLeader(payload []byte) { case msg_pb.MessageType_DRAND_COMMIT: dRand.processCommitMessage(message) default: - utils.GetLogInstance().Error("Unexpected message type", "msgType", message.Type, "dRand", dRand) + utils.Logger().Error(). + Uint32("msgType", uint32(message.Type)). + Interface("dRand", dRand). + Msg("Unexpected message type") } } // ProcessMessageValidator dispatches validator's consensus message. func (dRand *DRand) processCommitMessage(message *msg_pb.Message) { - utils.GetLogInstance().Info("[DRG] Leader received commit") + utils.Logger().Info().Msg("[DRG] Leader received commit") if message.Type != msg_pb.MessageType_DRAND_COMMIT { - utils.GetLogInstance().Error("Wrong message type received", "expected", msg_pb.MessageType_DRAND_COMMIT, "got", message.Type) + utils.Logger().Error(). + Uint32("expected", uint32(msg_pb.MessageType_DRAND_COMMIT)). + Uint32("got", uint32(message.Type)). + Msg("Wrong message type received") return } @@ -119,26 +130,28 @@ func (dRand *DRand) processCommitMessage(message *msg_pb.Message) { senderPubKey, err := bls.BytesToBlsPublicKey(drandMsg.SenderPubkey) if err != nil { - utils.GetLogInstance().Debug("Failed to deserialize BLS public key", "error", err) + utils.Logger().Debug().Err(err).Msg("Failed to deserialize BLS public key") return } validatorAddress := senderPubKey.SerializeToHexStr() if !dRand.IsValidatorInCommittee(validatorAddress) { - utils.GetLogInstance().Error("Invalid validator", "validatorAddress", validatorAddress) + utils.Logger().Error().Str("validatorAddress", validatorAddress).Msg("Invalid validator") return } vrfs := dRand.vrfs if len((*vrfs)) >= ((len(dRand.PublicKeys))/3 + 1) { - utils.GetLogInstance().Debug("Received additional randomness commit message", "validatorAddress", validatorAddress) + utils.Logger().Debug(). + Str("validatorAddress", validatorAddress).Msg("Received additional randomness commit message") return } // Verify message signature err = verifyMessageSig(senderPubKey, message) if err != nil { - utils.GetLogInstance().Warn("[DRAND] failed to verify the message signature", "Error", err, "PubKey", senderPubKey) + utils.Logger().Debug(). + Err(err).Str("PubKey", senderPubKey.SerializeToHexStr()).Msg("[DRAND] failed to verify the message signature") return } @@ -151,18 +164,31 @@ func (dRand *DRand) processCommitMessage(message *msg_pb.Message) { expectedRand, err := vrfPubKey.ProofToHash(dRand.blockHash[:], proof) if err != nil || !bytes.Equal(expectedRand[:], rand) { - utils.GetLogInstance().Error("[DRAND] Failed to verify the VRF", "error", err, "validatorAddress", validatorAddress, "expectedRand", expectedRand, "receivedRand", rand) + utils.Logger().Error(). + Err(err). + Str("validatorAddress", validatorAddress). + Bytes("expectedRand", expectedRand[:]). + Bytes("receivedRand", rand[:]). + Msg("[DRAND] Failed to verify the VRF") return } - utils.GetLogInstance().Debug("Received new VRF commit", "numReceivedSoFar", len((*vrfs)), "validatorAddress", validatorAddress, "PublicKeys", len(dRand.PublicKeys)) + utils.Logger().Debug(). + Int("numReceivedSoFar", len((*vrfs))). + Str("validatorAddress", validatorAddress). + Int("PublicKeys", len(dRand.PublicKeys)). + Msg("Received new VRF commit") (*vrfs)[validatorAddress] = drandMsg.Payload dRand.bitmap.SetKey(senderPubKey, true) // Set the bitmap indicating that this validator signed. if len((*vrfs)) >= ((len(dRand.PublicKeys))/3 + 1) { // Construct pRand and initiate consensus on it - utils.GetLogInstance().Debug("[DRAND] {BINGO} Received enough randomness commit", "numReceivedSoFar", len((*vrfs)), "validatorAddress", validatorAddress, "PublicKeys", len(dRand.PublicKeys)) + utils.Logger().Debug(). + Int("numReceivedSoFar", len((*vrfs))). + Str("validatorAddress", validatorAddress). + Int("PublicKeys", len(dRand.PublicKeys)). + Msg("[DRAND] {BINGO} Received enough randomness commit") pRnd := [32]byte{} // Bitwise XOR on all the submitted vrfs diff --git a/drand/drand_leader_msg.go b/drand/drand_leader_msg.go index 64479f362..4a5a4c975 100644 --- a/drand/drand_leader_msg.go +++ b/drand/drand_leader_msg.go @@ -23,7 +23,7 @@ func (dRand *DRand) constructInitMessage() []byte { // Don't need the payload in init message marshaledMessage, err := dRand.signAndMarshalDRandMessage(message) if err != nil { - utils.GetLogInstance().Error("Failed to sign and marshal the init message", "error", err) + utils.Logger().Error().Err(err).Msg("Failed to sign and marshal the init message") } return proto.ConstructDRandMessage(marshaledMessage) } diff --git a/drand/drand_validator.go b/drand/drand_validator.go index 52cb68899..8c8165df5 100644 --- a/drand/drand_validator.go +++ b/drand/drand_validator.go @@ -14,7 +14,7 @@ func (dRand *DRand) ProcessMessageValidator(payload []byte) { err := protobuf.Unmarshal(payload, message) if err != nil { - utils.GetLogInstance().Error("Failed to unmarshal message payload.", "err", err, "dRand", dRand) + utils.Logger().Error().Interface("dRand", dRand).Err(err).Msg("Failed to unmarshal message payload") } switch message.Type { @@ -23,14 +23,20 @@ func (dRand *DRand) ProcessMessageValidator(payload []byte) { case msg_pb.MessageType_DRAND_COMMIT: // do nothing on the COMMIT message, as it is intended to send to leader default: - utils.GetLogInstance().Error("Unexpected message type", "msgType", message.Type, "dRand", dRand) + utils.Logger().Error(). + Interface("dRand", dRand). + Uint32("msgType", uint32(message.Type)). + Msg("Unexpected message type") } } // ProcessMessageValidator dispatches validator's consensus message. func (dRand *DRand) processInitMessage(message *msg_pb.Message) { if message.Type != msg_pb.MessageType_DRAND_INIT { - utils.GetLogInstance().Error("Wrong message type received", "expected", msg_pb.MessageType_DRAND_INIT, "got", message.Type) + utils.Logger().Error(). + Uint32("expected", uint32(msg_pb.MessageType_DRAND_INIT)). + Uint32("got", uint32(message.Type)). + Msg("Wrong message type received") return } @@ -39,10 +45,10 @@ func (dRand *DRand) processInitMessage(message *msg_pb.Message) { // Verify message signature err := verifyMessageSig(dRand.leader.ConsensusPubKey, message) if err != nil { - utils.GetLogInstance().Warn("[DRG] Failed to verify the message signature", "Error", err) + utils.Logger().Warn().Err(err).Msg("[DRG] Failed to verify the message signature") return } - utils.GetLogInstance().Debug("[DRG] verify the message signature Succeeded") + utils.Logger().Debug().Msg("[DRG] verify the message signature Succeeded") // TODO: check the blockHash is the block hash of last block of last epoch. blockHash := drandMsg.BlockHash diff --git a/drand/drand_validator_msg.go b/drand/drand_validator_msg.go index f1790cdf7..c022afb6d 100644 --- a/drand/drand_validator_msg.go +++ b/drand/drand_validator_msg.go @@ -26,7 +26,7 @@ func (dRand *DRand) constructCommitMessage(vrf [32]byte, proof []byte) []byte { drandMsg.Payload = append(drandMsg.Payload, (*dRand.vrfPubKey).Serialize()...) marshaledMessage, err := dRand.signAndMarshalDRandMessage(message) if err != nil { - utils.GetLogInstance().Error("Failed to sign and marshal the commit message", "error", err) + utils.Logger().Error().Err(err).Msg("Failed to sign and marshal the commit message") } return proto.ConstructDRandMessage(marshaledMessage) } diff --git a/go.mod b/go.mod index 3a5eedb6e..4a113761e 100644 --- a/go.mod +++ b/go.mod @@ -44,6 +44,7 @@ require ( github.com/pkg/errors v0.8.1 github.com/rjeczalik/notify v0.9.2 github.com/rs/cors v1.6.0 // indirect + github.com/rs/zerolog v1.14.3 github.com/shirou/gopsutil v2.18.12+incompatible github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a // indirect github.com/stretchr/testify v1.3.0 @@ -57,6 +58,7 @@ require ( google.golang.org/grpc v1.21.1 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 gopkg.in/ini.v1 v1.42.0 + gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect gopkg.in/urfave/cli.v1 v1.20.0 // indirect ) diff --git a/hmy/api_backend.go b/hmy/api_backend.go index 143ccd333..b3363c53a 100644 --- a/hmy/api_backend.go +++ b/hmy/api_backend.go @@ -3,9 +3,11 @@ package hmy import ( "context" "errors" + "math/big" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/common/math" "github.com/ethereum/go-ethereum/core/bloombits" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/event" @@ -16,6 +18,7 @@ import ( "github.com/harmony-one/harmony/core" "github.com/harmony-one/harmony/core/state" "github.com/harmony-one/harmony/core/types" + "github.com/harmony-one/harmony/core/vm" ) // APIBackend An implementation of internal/hmyapi/Backend. Full client. @@ -206,3 +209,20 @@ func (b *APIBackend) GetBalance(address common.Address) (*hexutil.Big, error) { func (b *APIBackend) NetVersion() uint64 { return b.hmy.NetVersion() } + +// GetEVM returns a new EVM entity +func (b *APIBackend) GetEVM(ctx context.Context, msg core.Message, state *state.DB, header *types.Header) (*vm.EVM, func() error, error) { + // TODO(ricl): The code is borrowed from [go-ethereum](https://github.com/ethereum/go-ethereum/blob/40cdcf8c47ff094775aca08fd5d94051f9cf1dbb/les/api_backend.go#L114) + // [question](https://ethereum.stackexchange.com/q/72977/54923) + // Might need to reconsider the SetBalance behavior + state.SetBalance(msg.From(), math.MaxBig256) + vmError := func() error { return nil } + + context := core.NewEVMContext(msg, header, b.hmy.BlockChain(), nil) + return vm.NewEVM(context, state, b.hmy.blockchain.Config(), *b.hmy.blockchain.GetVMConfig()), vmError, nil +} + +// RPCGasCap returns the gas cap of rpc +func (b *APIBackend) RPCGasCap() *big.Int { + return b.hmy.RPCGasCap // TODO(ricl): should be hmy.config.RPCGasCap +} diff --git a/hmy/backend.go b/hmy/backend.go index c43704eec..16c1067e6 100644 --- a/hmy/backend.go +++ b/hmy/backend.go @@ -33,6 +33,10 @@ type Harmony struct { // aka network version, which is used to identify which network we are using networkID uint64 + // TODO(ricl): put this into config object + // TODO(ricl): this is never set. Will result in nil pointer bug + // RPCGasCap is the global gas cap for eth-call variants. + RPCGasCap *big.Int `toml:",omitempty"` } // NodeAPI is the list of functions from node used to call rpc apis. diff --git a/hmyclient/hmyclient.go b/hmyclient/hmyclient.go new file mode 100644 index 000000000..73f20075b --- /dev/null +++ b/hmyclient/hmyclient.go @@ -0,0 +1,130 @@ +package hmyclient + +import ( + "context" + "encoding/json" + "fmt" + "math/big" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/rpc" + "github.com/harmony-one/harmony/core/types" +) + +// Client defines typed wrappers for the Ethereum RPC API. +type Client struct { + c *rpc.Client +} + +// Dial connects a client to the given URL. +func Dial(rawurl string) (*Client, error) { + return dialContext(context.Background(), rawurl) +} + +func dialContext(ctx context.Context, rawurl string) (*Client, error) { + c, err := rpc.DialContext(ctx, rawurl) + if err != nil { + return nil, err + } + return NewClient(c), nil +} + +// NewClient creates a client that uses the given RPC client. +func NewClient(c *rpc.Client) *Client { + return &Client{c} +} + +// Close closes the client +func (c *Client) Close() { + c.c.Close() +} + +// BlockNumber returns the block height. +func (c *Client) BlockNumber(ctx context.Context) (hexutil.Uint64, error) { + var raw json.RawMessage + err := c.c.CallContext(ctx, &raw, "hmy_blockNumber") + if err != nil { + return 0, err + } else if len(raw) == 0 { + return 0, ethereum.NotFound + } + var blockNumber hexutil.Uint64 + if err := json.Unmarshal(raw, &blockNumber); err != nil { + return 0, err + } + return blockNumber, nil +} + +// BlockByHash returns the given full block. +// +// Note that loading full blocks requires two requests. Use HeaderByHash +// if you don't need all transactions or uncle headers. +func (c *Client) BlockByHash(ctx context.Context, hash common.Hash) (*types.Block, error) { + return c.getBlock(ctx, "hmy_getBlockByHash", hash, true) +} + +// BlockByNumber returns a block from the current canonical chain. If number is nil, the +// latest known block is returned. +// +// Note that loading full blocks requires two requests. Use HeaderByNumber +// if you don't need all transactions or uncle headers. +func (c *Client) BlockByNumber(ctx context.Context, number *big.Int) (*types.Block, error) { + return c.getBlock(ctx, "hmy_getBlockByNumber", toBlockNumArg(number), true) +} + +// NetworkID returns the network ID (also known as the chain ID) for this chain. +func (c *Client) NetworkID(ctx context.Context) (*big.Int, error) { + version := new(big.Int) + var ver string + if err := c.c.CallContext(ctx, &ver, "net_version"); err != nil { + return nil, err + } + if _, ok := version.SetString(ver, 10); !ok { + return nil, fmt.Errorf("invalid net_version result %q", ver) + } + return version, nil +} + +func (c *Client) getBlock(ctx context.Context, method string, args ...interface{}) (*types.Block, error) { + var raw json.RawMessage + err := c.c.CallContext(ctx, &raw, method, args...) + if err != nil { + return nil, err + } else if len(raw) == 0 { + return nil, ethereum.NotFound + } + // Decode header and transactions. + var head *types.Header + var body rpcBlock + if err := json.Unmarshal(raw, &head); err != nil { + return nil, err + } + if err := json.Unmarshal(raw, &body); err != nil { + return nil, err + } + // Quick-verify transaction. This mostly helps with debugging the server. + if head.TxHash == types.EmptyRootHash && len(body.Transactions) > 0 { + return nil, fmt.Errorf("server returned non-empty transaction list but block header indicates no transactions") + } + if head.TxHash != types.EmptyRootHash && len(body.Transactions) == 0 { + return nil, fmt.Errorf("server returned empty transaction list but block header indicates transactions") + } + // Fill the sender cache of transactions in the block. + txs := make([]*types.Transaction, len(body.Transactions)) + for i, tx := range body.Transactions { + if tx.From != nil { + setSenderFromServer(tx.tx, *tx.From, body.Hash) + } + txs[i] = tx.tx + } + return types.NewBlockWithHeader(head).WithBody(txs, []*types.Header{}), nil +} + +func toBlockNumArg(number *big.Int) string { + if number == nil { + return "latest" + } + return hexutil.EncodeBig(number) +} diff --git a/hmyclient/signer.go b/hmyclient/signer.go new file mode 100644 index 000000000..3ab6070e8 --- /dev/null +++ b/hmyclient/signer.go @@ -0,0 +1,42 @@ +package hmyclient + +import ( + "errors" + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/harmony-one/harmony/core/types" +) + +var errNotCached = errors.New("sender not cached") + +// senderFromServer is a types.Signer that remembers the sender address returned by the RPC +// server. It is stored in the transaction's sender address cache to avoid an additional +// request in TransactionSender. +type senderFromServer struct { + addr common.Address + blockhash common.Hash +} + +func setSenderFromServer(tx *types.Transaction, addr common.Address, block common.Hash) { + // Use types.Sender for side-effect to store our signer into the cache. + types.Sender(&senderFromServer{addr, block}, tx) +} +func (s *senderFromServer) Equal(other types.Signer) bool { + os, ok := other.(*senderFromServer) + return ok && os.blockhash == s.blockhash +} + +func (s *senderFromServer) Sender(tx *types.Transaction) (common.Address, error) { + if s.blockhash == (common.Hash{}) { + return common.Address{}, errNotCached + } + return s.addr, nil +} + +func (s *senderFromServer) Hash(tx *types.Transaction) common.Hash { + panic("can't sign with senderFromServer") +} +func (s *senderFromServer) SignatureValues(tx *types.Transaction, sig []byte) (R, S, V *big.Int, err error) { + panic("can't sign with senderFromServer") +} diff --git a/hmyclient/type.go b/hmyclient/type.go new file mode 100644 index 000000000..dffa64bcf --- /dev/null +++ b/hmyclient/type.go @@ -0,0 +1,23 @@ +package hmyclient + +import ( + "github.com/ethereum/go-ethereum/common" + "github.com/harmony-one/harmony/core/types" +) + +type rpcBlock struct { + Hash common.Hash `json:"hash"` + Transactions []rpcTransaction `json:"transactions"` + UncleHashes []common.Hash `json:"uncles"` +} + +type rpcTransaction struct { + tx *types.Transaction + txExtraInfo +} + +type txExtraInfo struct { + BlockNumber *string `json:"blockNumber,omitempty"` + BlockHash *common.Hash `json:"blockHash,omitempty"` + From *common.Address `json:"from,omitempty"` +} diff --git a/internal/configs/node/config.go b/internal/configs/node/config.go index 5425c2a76..d544ffa9d 100644 --- a/internal/configs/node/config.go +++ b/internal/configs/node/config.go @@ -60,9 +60,10 @@ type NetworkType string // Constants for NetworkType const ( - Mainnet = "mainnet" - Testnet = "testnet" - Devnet = "devnet" + Mainnet = "mainnet" + Testnet = "testnet" + Devnet = "devnet" + Localnet = "localnet" ) // Network is the type of Harmony network @@ -83,7 +84,6 @@ type ConfigType struct { group p2p.GroupID // the group ID of the shard (note: for beacon chain node, the beacon and shard group are the same) client p2p.GroupID // the client group ID of the shard isClient bool // whether this node is a client node, such as wallet/txgen - isLeader bool // whether this node is a leader or not isBeacon bool // whether this node is beacon node doing consensus or not ShardID uint32 // ShardID of this node role Role // Role of the node @@ -145,7 +145,7 @@ func GetDefaultConfig() *ConfigType { } func (conf *ConfigType) String() string { - return fmt.Sprintf("%s/%s/%s:%v,%v,%v:%v", conf.beacon, conf.group, conf.client, conf.isClient, conf.IsBeacon(), conf.isLeader, conf.ShardID) + return fmt.Sprintf("%s/%s/%s:%v,%v,%v", conf.beacon, conf.group, conf.client, conf.isClient, conf.IsBeacon(), conf.ShardID) } // SetBeaconGroupID set the groupID for beacon group @@ -168,11 +168,6 @@ func (conf *ConfigType) SetIsClient(b bool) { conf.isClient = b } -// SetIsLeader set the isLeader configuration -func (conf *ConfigType) SetIsLeader(b bool) { - conf.isLeader = b -} - // SetIsBeacon sets the isBeacon configuration func (conf *ConfigType) SetIsBeacon(b bool) { conf.isBeacon = b @@ -213,11 +208,6 @@ func (conf *ConfigType) IsBeacon() bool { return conf.isBeacon } -// IsLeader returns the isLeader configuration -func (conf *ConfigType) IsLeader() bool { - return conf.isLeader -} - // Role returns the role func (conf *ConfigType) Role() Role { return conf.role diff --git a/internal/configs/node/config_test.go b/internal/configs/node/config_test.go index 058822ca3..9b53c75e5 100644 --- a/internal/configs/node/config_test.go +++ b/internal/configs/node/config_test.go @@ -13,20 +13,10 @@ func TestNodeConfigSingleton(t *testing.T) { // get the singleton variable c := GetShardConfig(Global) - c.SetIsLeader(true) - - if !c.IsLeader() { - t.Errorf("IsLeader = %v, expected = %v", c.IsLeader(), true) - } - c.SetBeaconGroupID(p2p.GroupIDBeacon) d := GetShardConfig(Global) - if !d.IsLeader() { - t.Errorf("IsLeader = %v, expected = %v", d.IsLeader(), true) - } - g := d.GetBeaconGroupID() if g != p2p.GroupIDBeacon { diff --git a/internal/configs/sharding/fixedschedule.go b/internal/configs/sharding/fixedschedule.go new file mode 100644 index 000000000..96ff0ecf0 --- /dev/null +++ b/internal/configs/sharding/fixedschedule.go @@ -0,0 +1,39 @@ +package shardingconfig + +import ( + "math/big" +) + +const ( + // VLBPE is a Very Large Block Per Epoch + VLBPE = 1000000000000 +) + +type fixedSchedule struct { + instance Instance +} + +// InstanceForEpoch returns the fixed sharding configuration instance regardless +// the given epoch. +func (s fixedSchedule) InstanceForEpoch(epoch *big.Int) Instance { + return s.instance +} + +func (s fixedSchedule) BlocksPerEpoch() uint64 { + return VLBPE +} + +func (s fixedSchedule) CalcEpochNumber(blockNum uint64) *big.Int { + return big.NewInt(int64(blockNum / s.BlocksPerEpoch())) +} + +func (s fixedSchedule) IsLastBlock(blockNum uint64) bool { + blocks := s.BlocksPerEpoch() + return blockNum%blocks == blocks-1 +} + +// NewFixedSchedule returns a sharding configuration schedule that uses the +// given config instance for all epochs. Useful for testing. +func NewFixedSchedule(instance Instance) Schedule { + return fixedSchedule{instance: instance} +} diff --git a/internal/configs/sharding/instance.go b/internal/configs/sharding/instance.go new file mode 100644 index 000000000..6fe672e4a --- /dev/null +++ b/internal/configs/sharding/instance.go @@ -0,0 +1,120 @@ +package shardingconfig + +import ( + "math/big" + + "github.com/harmony-one/harmony/internal/ctxerror" + "github.com/harmony-one/harmony/internal/genesis" +) + +type instance struct { + numShards uint32 + numNodesPerShard int + numHarmonyOperatedNodesPerShard int + hmyAccounts []genesis.DeployAccount + fnAccounts []genesis.DeployAccount + reshardingEpoch []*big.Int +} + +// NewInstance creates and validates a new sharding configuration based +// upon given parameters. +func NewInstance( + numShards uint32, numNodesPerShard, numHarmonyOperatedNodesPerShard int, + hmyAccounts []genesis.DeployAccount, + fnAccounts []genesis.DeployAccount, + reshardingEpoch []*big.Int, +) (Instance, error) { + if numShards < 1 { + return nil, ctxerror.New("sharding config must have at least one shard", + "numShards", numShards) + } + if numNodesPerShard < 1 { + return nil, ctxerror.New("each shard must have at least one node", + "numNodesPerShard", numNodesPerShard) + } + if numHarmonyOperatedNodesPerShard < 0 { + return nil, ctxerror.New("Harmony-operated nodes cannot be negative", + "numHarmonyOperatedNodesPerShard", numHarmonyOperatedNodesPerShard) + } + if numHarmonyOperatedNodesPerShard > numNodesPerShard { + return nil, ctxerror.New(""+ + "number of Harmony-operated nodes cannot exceed "+ + "overall number of nodes per shard", + "numHarmonyOperatedNodesPerShard", numHarmonyOperatedNodesPerShard, + "numNodesPerShard", numNodesPerShard) + } + return instance{ + numShards: numShards, + numNodesPerShard: numNodesPerShard, + numHarmonyOperatedNodesPerShard: numHarmonyOperatedNodesPerShard, + hmyAccounts: hmyAccounts, + fnAccounts: fnAccounts, + reshardingEpoch: reshardingEpoch, + }, nil +} + +// MustNewInstance creates a new sharding configuration based upon +// given parameters. It panics if parameter validation fails. +// It is intended to be used for static initialization. +func MustNewInstance( + numShards uint32, numNodesPerShard, numHarmonyOperatedNodesPerShard int, + hmyAccounts []genesis.DeployAccount, + fnAccounts []genesis.DeployAccount, + reshardingEpoch []*big.Int, +) Instance { + sc, err := NewInstance( + numShards, numNodesPerShard, numHarmonyOperatedNodesPerShard, hmyAccounts, fnAccounts, reshardingEpoch) + if err != nil { + panic(err) + } + return sc +} + +// NumShards returns the number of shards in the network. +func (sc instance) NumShards() uint32 { + return sc.numShards +} + +// NumNodesPerShard returns number of nodes in each shard. +func (sc instance) NumNodesPerShard() int { + return sc.numNodesPerShard +} + +// NumHarmonyOperatedNodesPerShard returns number of nodes in each shard +// that are operated by Harmony. +func (sc instance) NumHarmonyOperatedNodesPerShard() int { + return sc.numHarmonyOperatedNodesPerShard +} + +// HmyAccounts returns the list of Harmony accounts +func (sc instance) HmyAccounts() []genesis.DeployAccount { + return sc.hmyAccounts +} + +// FnAccounts returns the list of Foundational Node accounts +func (sc instance) FnAccounts() []genesis.DeployAccount { + return sc.fnAccounts +} + +// FindAccount returns the deploy account based on the blskey, and if the account is a leader +// or not in the bootstrapping process. +func (sc instance) FindAccount(blsPubKey string) (bool, *genesis.DeployAccount) { + for i, item := range sc.hmyAccounts { + if item.BlsPublicKey == blsPubKey { + item.ShardID = uint32(i) % sc.numShards + return uint32(i) < sc.numShards, &item + } + } + for i, item := range sc.fnAccounts { + if item.BlsPublicKey == blsPubKey { + item.ShardID = uint32(i) % sc.numShards + return false, &item + } + } + return false, nil +} + +// ReshardingEpoch returns the list of epoch number +func (sc instance) ReshardingEpoch() []*big.Int { + return sc.reshardingEpoch +} diff --git a/internal/configs/sharding/localnet.go b/internal/configs/sharding/localnet.go new file mode 100644 index 000000000..e4008bb8b --- /dev/null +++ b/internal/configs/sharding/localnet.go @@ -0,0 +1,64 @@ +package shardingconfig + +import ( + "math/big" + + "github.com/harmony-one/harmony/internal/genesis" +) + +// LocalnetSchedule is the local testnet sharding +// configuration schedule. +var LocalnetSchedule localnetSchedule + +type localnetSchedule struct{} + +const ( + localnetV1Epoch = 1 + localnetV2Epoch = 2 + + localnetEpochBlock1 = 36 + twoOne = 11 +) + +func (localnetSchedule) InstanceForEpoch(epoch *big.Int) Instance { + switch { + case epoch.Cmp(big.NewInt(localnetV2Epoch)) >= 0: + return localnetV2 + case epoch.Cmp(big.NewInt(localnetV1Epoch)) >= 0: + return localnetV1 + default: // genesis + return localnetV0 + } +} + +func (localnetSchedule) BlocksPerEpoch() uint64 { + return twoOne +} + +func (ls localnetSchedule) CalcEpochNumber(blockNum uint64) *big.Int { + blocks := ls.BlocksPerEpoch() + switch { + case blockNum >= localnetEpochBlock1: + return big.NewInt(int64((blockNum-localnetEpochBlock1)/blocks) + 1) + default: + return big.NewInt(0) + } +} + +func (ls localnetSchedule) IsLastBlock(blockNum uint64) bool { + blocks := ls.BlocksPerEpoch() + switch { + case blockNum < localnetEpochBlock1-1: + return false + case blockNum == localnetEpochBlock1-1: + return true + default: + return ((blockNum-localnetEpochBlock1)%blocks == blocks-1) + } +} + +var localnetReshardingEpoch = []*big.Int{big.NewInt(0), big.NewInt(localnetV1Epoch), big.NewInt(localnetV2Epoch)} + +var localnetV0 = MustNewInstance(2, 7, 5, genesis.LocalHarmonyAccounts, genesis.LocalFnAccounts, localnetReshardingEpoch) +var localnetV1 = MustNewInstance(2, 7, 5, genesis.LocalHarmonyAccountsV1, genesis.LocalFnAccountsV1, localnetReshardingEpoch) +var localnetV2 = MustNewInstance(2, 10, 4, genesis.LocalHarmonyAccountsV2, genesis.LocalFnAccountsV2, localnetReshardingEpoch) diff --git a/internal/configs/sharding/mainnet.go b/internal/configs/sharding/mainnet.go new file mode 100644 index 000000000..f87e09795 --- /dev/null +++ b/internal/configs/sharding/mainnet.go @@ -0,0 +1,60 @@ +package shardingconfig + +import ( + "math/big" + + "github.com/harmony-one/harmony/internal/genesis" +) + +const ( + mainnetEpochBlock1 = 294912 // 18 * 2^14 + blocksPerShard = 16384 // 2^14 +) + +// MainnetSchedule is the mainnet sharding configuration schedule. +var MainnetSchedule mainnetSchedule + +type mainnetSchedule struct{} + +func (mainnetSchedule) InstanceForEpoch(epoch *big.Int) Instance { + switch { + //case epoch.Cmp(big.NewInt(1000)) >= 0: + // return mainnet6400 + //case epoch.Cmp(big.NewInt(100)) >= 0: + // return mainnetV2 + default: // genesis + return mainnetV0 + } +} + +func (mainnetSchedule) BlocksPerEpoch() uint64 { + return blocksPerShard +} + +func (ms mainnetSchedule) CalcEpochNumber(blockNum uint64) *big.Int { + blocks := ms.BlocksPerEpoch() + switch { + case blockNum >= mainnetEpochBlock1: + return big.NewInt(int64((blockNum-mainnetEpochBlock1)/blocks) + 1) + default: + return big.NewInt(0) + } +} + +func (ms mainnetSchedule) IsLastBlock(blockNum uint64) bool { + blocks := ms.BlocksPerEpoch() + switch { + case blockNum < mainnetEpochBlock1-1: + return false + case blockNum == mainnetEpochBlock1-1: + return true + default: + return ((blockNum-mainnetEpochBlock1)%blocks == blocks-1) + } +} + +var mainnetReshardingEpoch = make([]*big.Int, 0) +var mainnetV0 = MustNewInstance(4, 150, 112, genesis.HarmonyAccounts, genesis.FoundationalNodeAccounts, mainnetReshardingEpoch) + +//var mainnetV2 = MustNewInstance(8, 200, 100) +//var mainnet6400 = MustNewInstance(16, 400, 50) diff --git a/internal/configs/sharding/shardingconfig.go b/internal/configs/sharding/shardingconfig.go new file mode 100644 index 000000000..e556366fb --- /dev/null +++ b/internal/configs/sharding/shardingconfig.go @@ -0,0 +1,49 @@ +// Package shardingconfig defines types and utilities that deal with Harmony +// sharding configuration schedule. +package shardingconfig + +import ( + "math/big" + + "github.com/harmony-one/harmony/internal/genesis" +) + +// Schedule returns the sharding configuration instance for the given +// epoch. +type Schedule interface { + InstanceForEpoch(epoch *big.Int) Instance + + // BlocksPerEpoch returns the number of blocks per each Epoch + BlocksPerEpoch() uint64 + + // CalcEpochNumber returns the epoch number based on the block number + CalcEpochNumber(blockNum uint64) *big.Int + + // IsLastBlock check if the block is the last block in the epoch + IsLastBlock(blockNum uint64) bool +} + +// Instance is one sharding configuration instance. +type Instance interface { + // NumShards returns the number of shards in the network. + NumShards() uint32 + + // NumNodesPerShard returns number of nodes in each shard. + NumNodesPerShard() int + + // NumHarmonyOperatedNodesPerShard returns number of nodes in each shard + // that are operated by Harmony. + NumHarmonyOperatedNodesPerShard() int + + // HmyAccounts returns a list of Harmony accounts + HmyAccounts() []genesis.DeployAccount + + // FnAccounts returns a list of Foundational node accounts + FnAccounts() []genesis.DeployAccount + + // FindAccount returns the deploy account based on the blskey + FindAccount(blsPubKey string) (bool, *genesis.DeployAccount) + + // ReshardingEpoch returns a list of Epoch while off-chain resharding happens + ReshardingEpoch() []*big.Int +} diff --git a/internal/configs/sharding/testnet.go b/internal/configs/sharding/testnet.go new file mode 100644 index 000000000..c30027122 --- /dev/null +++ b/internal/configs/sharding/testnet.go @@ -0,0 +1,65 @@ +package shardingconfig + +import ( + "math/big" + + "github.com/harmony-one/harmony/internal/genesis" +) + +// TestnetSchedule is the long-running public testnet sharding +// configuration schedule. +var TestnetSchedule testnetSchedule + +type testnetSchedule struct{} + +const ( + testnetV1Epoch = 1 + testnetV2Epoch = 2 + + testnetEpochBlock1 = 78 + threeOne = 111 +) + +func (testnetSchedule) InstanceForEpoch(epoch *big.Int) Instance { + switch { + case epoch.Cmp(big.NewInt(testnetV2Epoch)) >= 0: + return testnetV2 + case epoch.Cmp(big.NewInt(testnetV1Epoch)) >= 0: + return testnetV1 + default: // genesis + return testnetV0 + } +} + +func (testnetSchedule) BlocksPerEpoch() uint64 { + // 8 seconds per block, roughly 86400 blocks, around one day + return threeOne +} + +func (ts testnetSchedule) CalcEpochNumber(blockNum uint64) *big.Int { + blocks := ts.BlocksPerEpoch() + switch { + case blockNum >= testnetEpochBlock1: + return big.NewInt(int64((blockNum-testnetEpochBlock1)/blocks) + 1) + default: + return big.NewInt(0) + } +} + +func (ts testnetSchedule) IsLastBlock(blockNum uint64) bool { + blocks := ts.BlocksPerEpoch() + switch { + case blockNum < testnetEpochBlock1-1: + return false + case blockNum == testnetEpochBlock1-1: + return true + default: + return ((blockNum-testnetEpochBlock1)%blocks == blocks-1) + } +} + +var testnetReshardingEpoch = []*big.Int{big.NewInt(0), big.NewInt(testnetV1Epoch), big.NewInt(testnetV2Epoch)} + +var testnetV0 = MustNewInstance(2, 150, 150, genesis.TNHarmonyAccounts, genesis.TNFoundationalAccounts, testnetReshardingEpoch) +var testnetV1 = MustNewInstance(2, 160, 150, genesis.TNHarmonyAccounts, genesis.TNFoundationalAccounts, testnetReshardingEpoch) +var testnetV2 = MustNewInstance(2, 170, 150, genesis.TNHarmonyAccounts, genesis.TNFoundationalAccounts, testnetReshardingEpoch) diff --git a/internal/genesis/foundational.go b/internal/genesis/foundational.go index ded403d46..e98d4eac0 100644 --- a/internal/genesis/foundational.go +++ b/internal/genesis/foundational.go @@ -1,7 +1,7 @@ package genesis // FoundationalNodeAccounts are the accounts for the foundational nodes at genesis. -var FoundationalNodeAccounts = [...]DeployAccount{ +var FoundationalNodeAccounts = []DeployAccount{ {Index: "0", Address: "one1y0xcf40fg65n2ehm8fx5vda4thrkymhpg45ecj", BlsPublicKey: "9e70e8d76851f6e8dc648255acdd57bb5c49cdae7571aed43f86e9f140a6343caed2ffa860919d03e0912411fee4850a"}, {Index: "1", Address: "one18lp2w7ghhuajdpzl8zqeddza97u92wtkfcwpjk", BlsPublicKey: "fce3097d9fc234d34d6eaef3eecd0365d435d1118f69f2da1ed2a69ba725270771572e40347c222aca784cb973307b11"}, {Index: "2", Address: "one1tqa46jj9ut8zu20jm3kqv3f5fwkeq964t496mx", BlsPublicKey: "edb61007e99af30191098f2cd6f787e2f53fb595bf63fcb4d31a386e7070f7a4fdcefd3e896080a665dc19fecbafc306"}, diff --git a/internal/genesis/genesis.go b/internal/genesis/genesis.go index 07ba1def7..e8d7c96f4 100644 --- a/internal/genesis/genesis.go +++ b/internal/genesis/genesis.go @@ -7,7 +7,6 @@ import ( "strings" "github.com/ethereum/go-ethereum/crypto" - "github.com/harmony-one/harmony/internal/common" "github.com/harmony-one/harmony/internal/utils" ) @@ -35,39 +34,6 @@ func BeaconAccountPriKey() *ecdsa.PrivateKey { return prikey } -// FindAccount find the DeployAccount based on the account address, and the account index -// the account address could be from HarmonyAccounts or from FoundationalNodeAccounts -// the account index can be used to determin the shard of the account -func FindAccount(address string) (int, *DeployAccount) { - addr := common.ParseAddr(address) - for i, acc := range HarmonyAccounts { - if addr == common.ParseAddr(acc.Address) { - return i, &acc - } - } - for i, acc := range FoundationalNodeAccounts { - if addr == common.ParseAddr(acc.Address) { - return i + 8, &acc - } - } - return 0, nil -} - -// IsBlsPublicKeyIndex returns index and DeployAccount. -func IsBlsPublicKeyIndex(blsPublicKey string) (int, *DeployAccount) { - for i, item := range HarmonyAccounts { - if item.BlsPublicKey == blsPublicKey { - return i, &item - } - } - for i, item := range FoundationalNodeAccounts { - if item.BlsPublicKey == blsPublicKey { - return i + 8, &item - } - } - return -1, nil -} - // GenesisBeaconAccountPriKey is the private key of genesis beacon account. var GenesisBeaconAccountPriKey = BeaconAccountPriKey() diff --git a/internal/genesis/harmony.go b/internal/genesis/harmony.go index 958328a17..c739576bd 100644 --- a/internal/genesis/harmony.go +++ b/internal/genesis/harmony.go @@ -1,7 +1,7 @@ package genesis // HarmonyAccounts are the accounts for the initial genesis nodes hosted by Harmony. -var HarmonyAccounts = [...]DeployAccount{ +var HarmonyAccounts = []DeployAccount{ {Index: " 0 ", Address: "one1gh043zc95e6mtutwy5a2zhvsxv7lnlklkj42ux", BlsPublicKey: "ca23704be46ce9c4704681ac9c08ddc644f1858a5c28ce236e1b5d9dee67c1f5a28075b5ef089adeffa8a372c1762007"}, {Index: " 1 ", Address: "one1u0kt4ng2x9c0zl0jv57rwj4rvw8fhem2vqksdv", BlsPublicKey: "c6c008ec354ac776fce5c24ce46d5a9897449b66d91d8bbe2ca0249f1e1fce1a5577cf6f91067b060ee20114ac726297"}, {Index: " 2 ", Address: "one1xdnm2fj6hyk7e49af2h9dmudkdlta9q354094e", BlsPublicKey: "f9a835dac43236ded1899257c904da922a9a86242ccced1f782eed8f9df6732c0d44f56280d2ca1689db878c2f14d285"}, diff --git a/internal/genesis/localnodes.go b/internal/genesis/localnodes.go new file mode 100644 index 000000000..863e84956 --- /dev/null +++ b/internal/genesis/localnodes.go @@ -0,0 +1,73 @@ +package genesis + +// LocalHarmonyAccounts are the accounts for the initial genesis nodes used for local test. +var LocalHarmonyAccounts = []DeployAccount{ + {Index: " 0 ", Address: "one1pdv9lrdwl0rg5vglh4xtyrv3wjk3wsqket7zxy", BlsPublicKey: "65f55eb3052f9e9f632b2923be594ba77c55543f5c58ee1454b9cfd658d25e06373b0f7d42a19c84768139ea294f6204"}, + {Index: " 1 ", Address: "one1m6m0ll3q7ljdqgmth2t5j7dfe6stykucpj2nr5", BlsPublicKey: "40379eed79ed82bebfb4310894fd33b6a3f8413a78dc4d43b98d0adc9ef69f3285df05eaab9f2ce5f7227f8cb920e809"}, + {Index: " 2 ", Address: "one12fuf7x9rgtdgqg7vgq0962c556m3p7afsxgvll", BlsPublicKey: "02c8ff0b88f313717bc3a627d2f8bb172ba3ad3bb9ba3ecb8eed4b7c878653d3d4faf769876c528b73f343967f74a917"}, + {Index: " 3 ", Address: "one16qsd5ant9v94jrs89mruzx62h7ekcfxmduh2rx", BlsPublicKey: "ee2474f93cba9241562efc7475ac2721ab0899edf8f7f115a656c0c1f9ef8203add678064878d174bb478fa2e6630502"}, + {Index: " 4 ", Address: "one1pf75h0t4am90z8uv3y0dgunfqp4lj8wr3t5rsp", BlsPublicKey: "e751ec995defe4931273aaebcb2cd14bf37e629c554a57d3f334c37881a34a6188a93e76113c55ef3481da23b7d7ab09"}, + {Index: " 5 ", Address: "one1est2gxcvavmtnzc7mhd73gzadm3xxcv5zczdtw", BlsPublicKey: "776f3b8704f4e1092a302a60e84f81e476c212d6f458092b696df420ea19ff84a6179e8e23d090b9297dc041600bc100"}, + {Index: " 6 ", Address: "one1spshr72utf6rwxseaz339j09ed8p6f8ke370zj", BlsPublicKey: "2d61379e44a772e5757e27ee2b3874254f56073e6bd226eb8b160371cc3c18b8c4977bd3dcb71fd57dc62bf0e143fd08"}, + {Index: " 7 ", Address: "one1a0x3d6xpmr6f8wsyaxd9v36pytvp48zckswvv9", BlsPublicKey: "c4e4708b6cf2a2ceeb59981677e9821eebafc5cf483fb5364a28fa604cc0ce69beeed40f3f03815c9e196fdaec5f1097"}, + {Index: " 8 ", Address: "one1d2rngmem4x2c6zxsjjz29dlah0jzkr0k2n88wc", BlsPublicKey: "86dc2fdc2ceec18f6923b99fd86a68405c132e1005cf1df72dca75db0adfaeb53d201d66af37916d61f079f34f21fb96"}, + {Index: " 9 ", Address: "one1658znfwf40epvy7e46cqrmzyy54h4n0qa73nep", BlsPublicKey: "49d15743b36334399f9985feb0753430a2b287b2d68b84495bbb15381854cbf01bca9d1d9f4c9c8f18509b2bfa6bd40f"}, +} + +// LocalFnAccounts are the accounts for the initial FN used for local test. +var LocalFnAccounts = []DeployAccount{ + {Index: " 0 ", Address: "one1a50tun737ulcvwy0yvve0pvu5skq0kjargvhwe", BlsPublicKey: "52ecce5f64db21cbe374c9268188f5d2cdd5bec1a3112276a350349860e35fb81f8cfe447a311e0550d961cf25cb988d"}, + {Index: " 1 ", Address: "one1uyshu2jgv8w465yc8kkny36thlt2wvel89tcmg", BlsPublicKey: "a547a9bf6fdde4f4934cde21473748861a3cc0fe8bbb5e57225a29f483b05b72531f002f8187675743d819c955a86100"}, + {Index: " 2 ", Address: "one103q7qe5t2505lypvltkqtddaef5tzfxwsse4z7", BlsPublicKey: "678ec9670899bf6af85b877058bea4fc1301a5a3a376987e826e3ca150b80e3eaadffedad0fedfa111576fa76ded980c"}, + {Index: " 3 ", Address: "one129r9pj3sk0re76f7zs3qz92rggmdgjhtwge62k", BlsPublicKey: "63f479f249c59f0486fda8caa2ffb247209489dae009dfde6144ff38c370230963d360dffd318cfb26c213320e89a512"}, +} + +// LocalHarmonyAccountsV1 are the accounts for the initial genesis nodes used for local test. +var LocalHarmonyAccountsV1 = []DeployAccount{ + {Index: " 0 ", Address: "one1pdv9lrdwl0rg5vglh4xtyrv3wjk3wsqket7zxy", BlsPublicKey: "65f55eb3052f9e9f632b2923be594ba77c55543f5c58ee1454b9cfd658d25e06373b0f7d42a19c84768139ea294f6204"}, + {Index: " 1 ", Address: "one1m6m0ll3q7ljdqgmth2t5j7dfe6stykucpj2nr5", BlsPublicKey: "40379eed79ed82bebfb4310894fd33b6a3f8413a78dc4d43b98d0adc9ef69f3285df05eaab9f2ce5f7227f8cb920e809"}, + {Index: " 2 ", Address: "one12fuf7x9rgtdgqg7vgq0962c556m3p7afsxgvll", BlsPublicKey: "02c8ff0b88f313717bc3a627d2f8bb172ba3ad3bb9ba3ecb8eed4b7c878653d3d4faf769876c528b73f343967f74a917"}, + {Index: " 3 ", Address: "one16qsd5ant9v94jrs89mruzx62h7ekcfxmduh2rx", BlsPublicKey: "ee2474f93cba9241562efc7475ac2721ab0899edf8f7f115a656c0c1f9ef8203add678064878d174bb478fa2e6630502"}, + {Index: " 4 ", Address: "one1pf75h0t4am90z8uv3y0dgunfqp4lj8wr3t5rsp", BlsPublicKey: "e751ec995defe4931273aaebcb2cd14bf37e629c554a57d3f334c37881a34a6188a93e76113c55ef3481da23b7d7ab09"}, + {Index: " 5 ", Address: "one1est2gxcvavmtnzc7mhd73gzadm3xxcv5zczdtw", BlsPublicKey: "776f3b8704f4e1092a302a60e84f81e476c212d6f458092b696df420ea19ff84a6179e8e23d090b9297dc041600bc100"}, + {Index: " 6 ", Address: "one1spshr72utf6rwxseaz339j09ed8p6f8ke370zj", BlsPublicKey: "2d61379e44a772e5757e27ee2b3874254f56073e6bd226eb8b160371cc3c18b8c4977bd3dcb71fd57dc62bf0e143fd08"}, + {Index: " 7 ", Address: "one1a0x3d6xpmr6f8wsyaxd9v36pytvp48zckswvv9", BlsPublicKey: "c4e4708b6cf2a2ceeb59981677e9821eebafc5cf483fb5364a28fa604cc0ce69beeed40f3f03815c9e196fdaec5f1097"}, + {Index: " 8 ", Address: "one1d2rngmem4x2c6zxsjjz29dlah0jzkr0k2n88wc", BlsPublicKey: "86dc2fdc2ceec18f6923b99fd86a68405c132e1005cf1df72dca75db0adfaeb53d201d66af37916d61f079f34f21fb96"}, + {Index: " 9 ", Address: "one1658znfwf40epvy7e46cqrmzyy54h4n0qa73nep", BlsPublicKey: "49d15743b36334399f9985feb0753430a2b287b2d68b84495bbb15381854cbf01bca9d1d9f4c9c8f18509b2bfa6bd40f"}, +} + +// LocalFnAccountsV1 are the accounts for the initial FN used for local test. +var LocalFnAccountsV1 = []DeployAccount{ + {Index: " 0 ", Address: "one1a50tun737ulcvwy0yvve0pvu5skq0kjargvhwe", BlsPublicKey: "4235d4ae2219093632c61db4f71ff0c32bdb56463845f8477c2086af1fe643194d3709575707148cad4f835f2fc4ea05"}, + {Index: " 1 ", Address: "one1uyshu2jgv8w465yc8kkny36thlt2wvel89tcmg", BlsPublicKey: "a547a9bf6fdde4f4934cde21473748861a3cc0fe8bbb5e57225a29f483b05b72531f002f8187675743d819c955a86100"}, + {Index: " 2 ", Address: "one103q7qe5t2505lypvltkqtddaef5tzfxwsse4z7", BlsPublicKey: "678ec9670899bf6af85b877058bea4fc1301a5a3a376987e826e3ca150b80e3eaadffedad0fedfa111576fa76ded980c"}, + {Index: " 3 ", Address: "one129r9pj3sk0re76f7zs3qz92rggmdgjhtwge62k", BlsPublicKey: "63f479f249c59f0486fda8caa2ffb247209489dae009dfde6144ff38c370230963d360dffd318cfb26c213320e89a512"}, +} + +// LocalHarmonyAccountsV2 are the accounts for the initial genesis nodes used for local test. +var LocalHarmonyAccountsV2 = []DeployAccount{ + {Index: " 0 ", Address: "one1pdv9lrdwl0rg5vglh4xtyrv3wjk3wsqket7zxy", BlsPublicKey: "65f55eb3052f9e9f632b2923be594ba77c55543f5c58ee1454b9cfd658d25e06373b0f7d42a19c84768139ea294f6204"}, + {Index: " 1 ", Address: "one1m6m0ll3q7ljdqgmth2t5j7dfe6stykucpj2nr5", BlsPublicKey: "40379eed79ed82bebfb4310894fd33b6a3f8413a78dc4d43b98d0adc9ef69f3285df05eaab9f2ce5f7227f8cb920e809"}, + {Index: " 2 ", Address: "one12fuf7x9rgtdgqg7vgq0962c556m3p7afsxgvll", BlsPublicKey: "02c8ff0b88f313717bc3a627d2f8bb172ba3ad3bb9ba3ecb8eed4b7c878653d3d4faf769876c528b73f343967f74a917"}, + {Index: " 3 ", Address: "one16qsd5ant9v94jrs89mruzx62h7ekcfxmduh2rx", BlsPublicKey: "ee2474f93cba9241562efc7475ac2721ab0899edf8f7f115a656c0c1f9ef8203add678064878d174bb478fa2e6630502"}, + {Index: " 4 ", Address: "one1pf75h0t4am90z8uv3y0dgunfqp4lj8wr3t5rsp", BlsPublicKey: "e751ec995defe4931273aaebcb2cd14bf37e629c554a57d3f334c37881a34a6188a93e76113c55ef3481da23b7d7ab09"}, + {Index: " 5 ", Address: "one1est2gxcvavmtnzc7mhd73gzadm3xxcv5zczdtw", BlsPublicKey: "776f3b8704f4e1092a302a60e84f81e476c212d6f458092b696df420ea19ff84a6179e8e23d090b9297dc041600bc100"}, + {Index: " 6 ", Address: "one1spshr72utf6rwxseaz339j09ed8p6f8ke370zj", BlsPublicKey: "2d61379e44a772e5757e27ee2b3874254f56073e6bd226eb8b160371cc3c18b8c4977bd3dcb71fd57dc62bf0e143fd08"}, + {Index: " 7 ", Address: "one1a0x3d6xpmr6f8wsyaxd9v36pytvp48zckswvv9", BlsPublicKey: "c4e4708b6cf2a2ceeb59981677e9821eebafc5cf483fb5364a28fa604cc0ce69beeed40f3f03815c9e196fdaec5f1097"}, +} + +// LocalFnAccountsV2 are the accounts for the initial FN used for local test. +var LocalFnAccountsV2 = []DeployAccount{ + {Index: " 0 ", Address: "one1a50tun737ulcvwy0yvve0pvu5skq0kjargvhwe", BlsPublicKey: "52ecce5f64db21cbe374c9268188f5d2cdd5bec1a3112276a350349860e35fb81f8cfe447a311e0550d961cf25cb988d"}, + {Index: " 1 ", Address: "one1uyshu2jgv8w465yc8kkny36thlt2wvel89tcmg", BlsPublicKey: "1c1fb28d2de96e82c3d9b4917eb54412517e2763112a3164862a6ed627ac62e87ce274bb4ea36e6a61fb66a15c263a06"}, + {Index: " 2 ", Address: "one103q7qe5t2505lypvltkqtddaef5tzfxwsse4z7", BlsPublicKey: "b179c4fdc0bee7bd0b6698b792837dd13404d3f985b59d4a9b1cd0641a76651e271518b61abbb6fbebd4acf963358604"}, + {Index: " 3 ", Address: "one129r9pj3sk0re76f7zs3qz92rggmdgjhtwge62k", BlsPublicKey: "63f479f249c59f0486fda8caa2ffb247209489dae009dfde6144ff38c370230963d360dffd318cfb26c213320e89a512"}, + {Index: " 4 ", Address: "one1d2rngmem4x2c6zxsjjz29dlah0jzkr0k2n88wc", BlsPublicKey: "16513c487a6bb76f37219f3c2927a4f281f9dd3fd6ed2e3a64e500de6545cf391dd973cc228d24f9bd01efe94912e714"}, + {Index: " 5 ", Address: "one1658znfwf40epvy7e46cqrmzyy54h4n0qa73nep", BlsPublicKey: "576d3c48294e00d6be4a22b07b66a870ddee03052fe48a5abbd180222e5d5a1f8946a78d55b025de21635fd743bbad90"}, + {Index: " 6 ", Address: "one1ghkz3frhske7emk79p7v2afmj4a5t0kmjyt4s5", BlsPublicKey: "eca09c1808b729ca56f1b5a6a287c6e1c3ae09e29ccf7efa35453471fcab07d9f73cee249e2b91f5ee44eb9618be3904"}, + {Index: " 7 ", Address: "one1d7jfnr6yraxnrycgaemyktkmhmajhp8kl0yahv", BlsPublicKey: "f47238daef97d60deedbde5302d05dea5de67608f11f406576e363661f7dcbc4a1385948549b31a6c70f6fde8a391486"}, + {Index: " 8 ", Address: "one1r4zyyjqrulf935a479sgqlpa78kz7zlcg2jfen", BlsPublicKey: "fc4b9c535ee91f015efff3f32fbb9d32cdd9bfc8a837bb3eee89b8fff653c7af2050a4e147ebe5c7233dc2d5df06ee0a"}, + {Index: " 9 ", Address: "one1p7ht2d4kl8ve7a8jxw746yfnx4wnfxtp8jqxwe", BlsPublicKey: "ca86e551ee42adaaa6477322d7db869d3e203c00d7b86c82ebee629ad79cb6d57b8f3db28336778ec2180e56a8e07296"}, + {Index: " 10 ", Address: "one1z05g55zamqzfw9qs432n33gycdmyvs38xjemyl", BlsPublicKey: "95117937cd8c09acd2dfae847d74041a67834ea88662a7cbed1e170350bc329e53db151e5a0ef3e712e35287ae954818"}, + {Index: " 11 ", Address: "one1ljznytjyn269azvszjlcqvpcj6hjm822yrcp2e", BlsPublicKey: "68ae289d73332872ec8d04ac256ca0f5453c88ad392730c5741b6055bc3ec3d086ab03637713a29f459177aaa8340615"}, +} diff --git a/internal/genesis/tn_harmony.go b/internal/genesis/tn_harmony.go new file mode 100644 index 000000000..fe2633532 --- /dev/null +++ b/internal/genesis/tn_harmony.go @@ -0,0 +1,1009 @@ +package genesis + +// TNHarmonyAccounts are the accounts for the initial genesis nodes hosted by Harmony for testnet. +var TNHarmonyAccounts = []DeployAccount{ + {Index: "0", Address: "one1yc06ghr2p8xnl2380kpfayweguuhxdtupkhqzw", BlsPublicKey: "e7f54994bc5c02edeeb178ce2d34db276a893bab5c59ac3d7eb9f077c893f9e31171de6236ba0e21be415d8631e45b91"}, + {Index: "1", Address: "one1wh4p0kuc7unxez2z8f82zfnhsg4ty6dupqyjt2", BlsPublicKey: "4bf54264c1bfa68ca201f756e882f49e1e8aaa5ddf42deaf4690bc3977497e245af40f3ad4003d7a6121614f13033b0b"}, + {Index: "2", Address: "one1shzkj8tty2wu230wsjc7lp9xqkwhch2ea7sjhc", BlsPublicKey: "e212c4c5cd8e078aedd34c300ae500c5bd5fd036231d1c9dcc8400337919a59ebd47523faa209fc0d873ead492621f88"}, + {Index: "3", Address: "one1vjywuur8ckddmc4dsyx6qdgf590eu07ag9fg4a", BlsPublicKey: "b7aec767534872af7c905da7318cddf2248b0834ec1d64944ad725878cca0833f14cd3b2f7f01b6f041d573fe67ec299"}, + {Index: "4", Address: "one1puj38zamhlu89enzcdjw6rlhlqtyp2c675hjg5", BlsPublicKey: "99d0835797ca0683fb7b1d14a882879652ddcdcfe0d52385ffddf8012ee804d92e5c05a56c9d7fc663678e36a158a28c"}, + {Index: "5", Address: "one1x6meu5tqzuz0dyseju80zd2c2ftumnm0l06h4t", BlsPublicKey: "f441b75470919983ba18a0525b1c101af42cae052c6d50f74d1553eebbe78ef226849c5e5a7fb2ba563eec6b20380c00"}, + {Index: "6", Address: "one1z0udzslh8pn082pnfhg9jx6ekwsem88v24k2v5", BlsPublicKey: "9f5f8c5dbe12d14ae8468828754c4db3f2129c69de88baee4e361e38000aed54da204591bbcdeeeb571ffff81e9ade02"}, + {Index: "7", Address: "one1mmnz9gyuuasz529mmtzc32cs7vpvadd05tp7uj", BlsPublicKey: "3434351415d20b3b4a5014b9aca44703dfef332e50e008a59ca8d1f9bb41b0ea695fb74a0f9e346138a429d08c24c793"}, + {Index: "8", Address: "one1dpm37ppsgvepjfyvsamas25md280ctgmcfjlfx", BlsPublicKey: "8a211eb5e9334341fd2498fb5d6b922b4a0984d6a4ea0b5631c1904de5fe21fd6889c9c032d862546ca50a5c41294b0c"}, + {Index: "9", Address: "one1mrprl7pxuqpzp0a84d5kd2zenpt578rr4d68ru", BlsPublicKey: "2e9aa982036860eccb0880702c5d71665761f8d4e6ab5f3d8c3aee25b3e68a2c7eaa3cd85972c7f9a3c19d3fed3d5d01"}, + {Index: "10", Address: "one13uqaxe8wr2j3azj7sytv59ua0ff322auh270mc", BlsPublicKey: "b9486167ab9087ab818dc4ce026edb5bf216863364c32e42df2af03c5ced1ad181e7d12f0e6dd5307a73b62247608611"}, + {Index: "11", Address: "one13yp54e9kynzw57g42878vhtrzu2hfw3nn8gy83", BlsPublicKey: "88b4da322731de51da65e6d2faba85782fa517002f6177c19932c10767cc6cef922ee17f7e46ff00424b8ffe4afeb291"}, + {Index: "12", Address: "one1gzf2cmv607r64nths76ur3z5rkdl9n2ucnaw66", BlsPublicKey: "1833721b78797a16b1987734d05b08b9444e24075fda50ff2acc7b8a6d8e0aef0829bcb11e3b9df7466cf8a39e4e4101"}, + {Index: "13", Address: "one1q6vjpxdx2wvaysahjxm0qkt03uq8xyjgkdskfe", BlsPublicKey: "6ed606f323da02b0e18d64a87a1b42641d847c15e9e11596e77d87d34f26679785fb4e76d270dc9d14bb539f02157501"}, + {Index: "14", Address: "one1l4dp4ksy85fzchlr5pgdp5we0lpc8dsyzga6y5", BlsPublicKey: "bb058f47d3d66e21d67d7a0b0ab0dcd87e037e590ce47ae9470afef8f682a5ac79fcf3f79b89ecb0769cc1ae62ac9290"}, + {Index: "15", Address: "one1v8hcjxmstels4q02fxd7as8jszal9t69zchntf", BlsPublicKey: "15e5b5b1b455d8814d8986f9fd00bd64e897506c8e958bbbfd6f43e2302837ab625096f19f05b751fceac5caf387f483"}, + {Index: "16", Address: "one12zlfzd2tyfngcghslrmv57xmn7ec4cqct32sks", BlsPublicKey: "8c95e04a4826d4d80ef16183f13aa5d14eb3c96d2755407e15c440bb4edd6e4636a82e47975385c6223ba24759561103"}, + {Index: "17", Address: "one127rxx6l0234y5ke8daffgvjrfa3zxcyajq36j5", BlsPublicKey: "021926136495a0adcdda5af0602cb4b4ce6d6529cfd451b844728a0e4e424f2a78879a8b5d5e4b3e42127f95f2e2858b"}, + {Index: "18", Address: "one1mwr4d2awwcx7f2n3c90lykt6r6sjv4agfn8k7m", BlsPublicKey: "1bf1ca37df49190578391d3c34cdb62cc9b2c88ebf5bbbe72a41db8da5236576fdb4513973045f23633a6ddd5a52488a"}, + {Index: "19", Address: "one173kc6tzq8mjafpjzme4u4rdhf3pn3j8cwesl2m", BlsPublicKey: "c2f66a6948be4f2747f5938091898357f96839a8a6766c1be80f989fd1e85fb7eb9b744aad6d6597445bc09d5ef7a916"}, + {Index: "20", Address: "one1yd8hywc5rhas63l2mn9a49hg8znfnha2zntunc", BlsPublicKey: "a2b1b534c94bf19a92551f1d32d62b802be6996458f65b0baeb081c9972b34d72310e675fc7797b9c860d8cc223cee8f"}, + {Index: "21", Address: "one120lxth0nlgk3nhusnhcaht83p8346m5uku235n", BlsPublicKey: "3a6c844cd65fa07dbbd6b256a6c04be4f9031aa0043b37e5897a5bbfa35ad32dac3e308e04b17962dff07685e2c2180c"}, + {Index: "22", Address: "one17u39z7sus7ntng6mxmart9t9w7lr956qu02gjc", BlsPublicKey: "68b97efd30c635af5053e4fddf88f2c00f437ed3d24d88f4b369ec6761a3b315a9e01c80116bef5c854583784a7eec89"}, + {Index: "23", Address: "one1x48lqucxl5pn3956p7fx5vphszg6tylp9ty766", BlsPublicKey: "d975f041ebb45e2ebc6b04d2dab55a9c8d8cebf51ffa107015d9b3d58bdc6b421ca4a455ca6b6dcc4b159e13ddd2ea11"}, + {Index: "24", Address: "one1taefmq49nv5k0rkr2kj4xv8n3a75m4vm6pvzg2", BlsPublicKey: "f248bd21d67f0b2cd0dd2c06446c557fc35737873857c000698ae391b607ca8ed8df00a79d9dcace1b0ce05492fc9789"}, + {Index: "25", Address: "one1wnkg99y40gq9thp9h2velmefxsncm24rq65l8z", BlsPublicKey: "4cf88358365733859717ccabc63c73a6ec01a03f07fef266342bfec2f1d57c14b543b9995c3a66b8a737db3a9b60920a"}, + {Index: "26", Address: "one14h2358zxau3ptqmsfyrm65hr7emd5v6q2fvgum", BlsPublicKey: "b23aedbf896bf55b2787828c0488721ac8e8012eebcb3ca31ea0cb33596e98121eba8912904bdebe71ac77f7db6f1491"}, + {Index: "27", Address: "one1hg4fnfu0g4v9fhk4nryluy7ylvf03dash5tufz", BlsPublicKey: "3a3efa9fce3b6a826b94a0abdc0f161d962c0c0dd40d9375e4306d017c76d3c0cbc367d387233883b1f872cf6f906193"}, + {Index: "28", Address: "one17hlq693v48gy9snnhvd7cuvl8g9nkakgaf3pya", BlsPublicKey: "ba27796a04c1e4d2cb2d946ac520c2b41589517cb9ae22e64718086c1b13bec1c3d1d78c274d4ffafd78e1b66705e496"}, + {Index: "29", Address: "one19pv470fqeujmgckqm5h7q3ykhfsyarj2u5rlp3", BlsPublicKey: "3a3d6481bb95279254ad74649e65e31a18818c56da38c3623af86e5527cc7bce62f84187f10c9b6c30fd485196501518"}, + {Index: "30", Address: "one1uq442dvnqlk07cl2mtddxhd2mmuhlejxz2k5nx", BlsPublicKey: "0e1b7c7e68ff780fab2ffaf9fe3875e69673be3664b49b95d96ada91477435c401b03b8471dfb277d643884b33593c82"}, + {Index: "31", Address: "one14ahhzt6zkcuwlkevgqa8j08axreakrqassnhyr", BlsPublicKey: "ec4bd019cf23b921ea4f96a2916f072168b2a7cc8ce87673dd2623b87177944a3f0c5ba6ae0802eec6f4b7f195e91417"}, + {Index: "32", Address: "one1qlcc76thenzwgzy8x780dehygjdq6sef3czmxn", BlsPublicKey: "ee855bbeca8885cc9c335196af420eb7224e22c8647ca8b418c2b67d25c86cbd4a7435bf3905614ca21fd28bae28e408"}, + {Index: "33", Address: "one1x0dhlrhjvz06w49uw3mtmje2hymnlfla7pgszv", BlsPublicKey: "b5b179083e949a56db6a33f107bca5069fbc91f2de054e181b5cf5d792ccf52460b996e6626f3908c6093c4dd823810b"}, + {Index: "34", Address: "one1snuv9rgy4edcwaraf6tfk9wng3l29frpca8lk2", BlsPublicKey: "bbfa74d121b05e38c962af9c241336311d282abde49b7cda6826a53e1a44e62a75689ee71b68136af2b9e0425c16d903"}, + {Index: "35", Address: "one1keh8p8dw84jx5srnyvft3peckmgaurvuljhxzc", BlsPublicKey: "f52d35cc78db3eff64392b7746445af76680550c54c23c2ab59bca348b967ca6ad4e6419f67e9cdd3e6496e6e9dd0718"}, + {Index: "36", Address: "one1drrv46y50uqym5nn7pxrj5sx4qzn6qesewqk3q", BlsPublicKey: "e6c33ada02e808fa7c2dd98734648cbb03c30d39e5c5deb5baae89c4b89e3b2356aff11cb94c35d7d955e14e131b4a18"}, + {Index: "37", Address: "one1rc9t0anqzzwl7yepmyvlu3eafx94927aw4umwt", BlsPublicKey: "81ce2082507783d0882a0e816a7063a2c5ae2aaf186dfa157038262b911d55c2916bb113d7bcaf59426059ac9fc8cb91"}, + {Index: "38", Address: "one1frjlthpzmft0ufhlh5xjqw52xddxy3fyk7s02k", BlsPublicKey: "0c199a6a45e4388d92c6be4a7047dc09ba6a74ace4ea46c014f0239ae6943d3c1d07486ad77de0bba628e7f76ec69691"}, + {Index: "39", Address: "one197tkyzudh4swfnfwj249s3qy2jfjh7nu3slvr9", BlsPublicKey: "f43a6eb6ea542bde832eab829e42d733c4685793d844b4be5bffec10ebe74c3ca680f0efaef6c9f57f7fe589505ada05"}, + {Index: "40", Address: "one1n7puxkjd7mr6gr09ascyrd5z30mj23exwr3ypa", BlsPublicKey: "d13e1d260791bda54201d77ff44bab65e628e82a8d96e3804bb2852dc1459ecb59cd788c04a3f1fd3e2c6a5fc3242b84"}, + {Index: "41", Address: "one1js0e3rw0qpy3r2x26n8xp9ja7qwgxj6ht064v2", BlsPublicKey: "90404f04db155afc0444210b83a1f6acb29e0c479a31222afe7827b643067754817af06fbda99600d5afcc0dfd510c89"}, + {Index: "42", Address: "one156l87txy4262muvmq3qcndwwlzt5tlk58uqvmy", BlsPublicKey: "ff6eae041955e6ce5f6e9ece59c7aa3f5d0c66ea8023cbf4afa1354565424d353718f1281d2b758ee3aff0b769e0c285"}, + {Index: "43", Address: "one1xuxwzhaf7tmp850dckr2pxqjffh3m6gm24h59g", BlsPublicKey: "62c430b232e99d9e1a45e4653f9849096184487d327570e9173a990f122a0f757131e864cf822ce68eee431e4f86d509"}, + {Index: "44", Address: "one147r29htvd2fy3l82arvsuqc8szqy6py35aedex", BlsPublicKey: "ead2f549dd09e8486b2b4095a67dddf4473b06fa003ccc6404afae5f5d56b632ccf2f8aae134c8156691e4953ea57c00"}, + {Index: "45", Address: "one125s9c4ukzrk7jwg5t6xk7h0hfyhzy2qte4w6rl", BlsPublicKey: "77eda15c99154cb2db50e744de82ed1a4ffeedf4849b0039d3ccbf35f080171f2b3cf4364da177448edbffc52741a313"}, + {Index: "46", Address: "one1nv2kkpmppsl3u4f3artyy24c9ptykkmmc643v6", BlsPublicKey: "351f04e4329c8e3a49ea956b8d85307a8eaf56849f20c0006e7b59346922c3e038a1fee4bd7cbf1b34551a0270b40710"}, + {Index: "47", Address: "one1p5jp6psqfy4hg3arswsxpyfxnrmrj64te3tuxu", BlsPublicKey: "8f657775630e2f58fe7fc679fd5827705eb19ad1ea47c78d3d5ac544ddc8d2fa0aa542bafd350d4eb7e9c822a89e3006"}, + {Index: "48", Address: "one14rujvdv383r90s2qer05jf5zwk5n4slr5h5syr", BlsPublicKey: "cc29030fd7888a9f2aa1176ae972787a87295aae79149e83e2113e4d71f49d473fa3bd89e8db968b8a42141d4673e918"}, + {Index: "49", Address: "one17p07x854ztdm5w029ksluq8l4wv3hagpwl5zxh", BlsPublicKey: "adaa3dd1e0dbf11b0b365c214cde3ca4296639f5229cf66ab6fa917d4861b0c94b342000cee62b142cf04fcd37c15909"}, + {Index: "50", Address: "one1mg5sc0lc0ps9qmal5fprk3788f09rwdqxehsnq", BlsPublicKey: "2c6281268374475e94f9e8dd8a078c21d6a3bf1be2b3e2dc4b1b497f89d881ac7cce008b18810adfa432fc4c617fd505"}, + {Index: "51", Address: "one12lh0hgsken9x7c6h6rwlmwk7j3fpl8rm9ws5pu", BlsPublicKey: "425240abe5de3d1878bed335d91e2ffc4e41606c45fb5a6edd4ede1b3f255fc4cf23f530a7160ac027ad42fb0f200e89"}, + {Index: "52", Address: "one14e5ffwdejnt7njgq54d9w8gltwrggdusyw7y5p", BlsPublicKey: "d69c70aa8e43853487760533ad1cbeb9f8e91d409ede23f5db9e0038528bd9914ecd8710afe187bb303cc345a52f0b93"}, + {Index: "53", Address: "one1j987tf0cvwhr3vy2sly655alw9tn6z44s770ww", BlsPublicKey: "1d0a25f0bd77dde3cf1771f47eb6fe7d2fd0adc49db119c2f237b5241428c90482fff18c698d98f07e69163dc6f13f15"}, + {Index: "54", Address: "one1y6t8yy8xmfxg9ztrsgyhjtddxd70wwhwhr5fp4", BlsPublicKey: "eaac5d8c859a2d65cea6a0af223aa2bca77cbaa9d91902defe170e3212e57157ef187853b664993702944e460e53a40d"}, + {Index: "55", Address: "one1t9ummhthtnfez6m0523tyu86psmr78v733smfx", BlsPublicKey: "ab7df3e38a8423c31f8dd40d2952667bff711c9d00f717e528ffc661d1d26c3b431f403eb1c360a767fc8ad7fe2b3991"}, + {Index: "56", Address: "one1fcm35f8e9xc3f7c4tu3sm7ygkh338f2v2sxzyl", BlsPublicKey: "24044191bcc50e6f43dc21d052c88885aadc0c693675d9a418d00d1afd98286658812f17b612658fc433e8eb619b5c00"}, + {Index: "57", Address: "one17vetq77teeeczufa68fkpx8vc0wc2tzfmfnh5e", BlsPublicKey: "796743dcc97e1d08ba9d76fa68137931d694d19e1de8cf2b0dfe53118e8d1078c62fd72498536432d13186a808e29a80"}, + {Index: "58", Address: "one1krus0q388f6yg6peea0mjwm4x42gvyyd5urn48", BlsPublicKey: "a4a75bfc607dd1bee6d60454309bb5fb4c9a48805bc514f29e56c5766e391545bc8d750011c6d1f4b12218adc7c15e95"}, + {Index: "59", Address: "one1xg9tvmlgnhphfcn0j7t46eswyl6hucshg8th8a", BlsPublicKey: "35088a568fad16adc7b96e0f5923c3dc6793d9090f0640b9bf5abb7b8f1bd5294dd8552518cac466ca85211c7d71120e"}, + {Index: "60", Address: "one1hgukx4hwsqu5h5j6yr963u83hrgwzdnrull69q", BlsPublicKey: "a8a8e45413f6134373652c3901265da161804551434f89e427a0f51f8a47bcc6b8537d8ede28178796e4a1abc5a1da19"}, + {Index: "61", Address: "one1zc9t45u2uege2rr0fu5jn323vw6zknmme2szhw", BlsPublicKey: "38de540c3df944e2982dda39f9a8d4ed69d0a23852580f7d818654d6ef9b0e1defdcfca3b33d36dcf04789659cc2878a"}, + {Index: "62", Address: "one1cpjqcv99r42m03xxvrflr549lqq6ktx7rddzkx", BlsPublicKey: "2d24f086b9cf9a7f3e934a9bf4bd9355a0aaf3b21c03d74725fe8253d01888bfa839eaafe5a99a41678d1d4750f2eb92"}, + {Index: "63", Address: "one172alesnh6vana3ndwkhgu4nfazl9e5cwvnxtwl", BlsPublicKey: "5f7a2faeaa55f46a2b07164bc33a2d2569e05316b8c5f8d4757545342aeae8cde5cf30970aad748aa424871940b5818c"}, + {Index: "64", Address: "one10muk9x4cuztjtxh097ghcftxhrscv4ranlm6eg", BlsPublicKey: "8e8b42296aef2ba1aed7e6a64b8734a0bd12a55c2c32d1a893129d0b3c0d04b2c2d778d5929cd8b460bc987141080a83"}, + {Index: "65", Address: "one1ae378sq38g2nhdaa5lupsxk2ady3yp5desqqf9", BlsPublicKey: "4cca9a46d70dfe380b41dcb2251303949e5cd38f6b567beb890cc05a36d2d9e7292f34743d2e0fb86fec134f6619bd88"}, + {Index: "66", Address: "one18ppxuzlyke23r22x5n46cjrf22fx58gl7ezy8e", BlsPublicKey: "402bd06197d11e1c9095f0f545b77614dca1c6a27fbcb03ffe95943746e6f475dec37fa50e6c1c5633dff91a4d349b09"}, + {Index: "67", Address: "one1gf2akkuad0sgmwwgta5d0q82g848z4rrmgm6ar", BlsPublicKey: "60011df3157bf63ae57646acca376f1f9898d80b80102f998aa241af7444e958651ecf29d143f3dd9107a5cc213eda10"}, + {Index: "68", Address: "one1ux7ll2z008k7z8we84qvvsxkkedvuvuzprm9z7", BlsPublicKey: "ce387d71bce300b4c5dd352b8ba03558a36a97b83728e5b64e70b9b0d0555bc22d7a76d4f382165ba15e4ce03d855492"}, + {Index: "69", Address: "one16c5uajv6et2mauy4rlqwne4wfu8cpzzuwsujsw", BlsPublicKey: "640bcc532b507981a832d3dce3d2f86d66b314a9d6cf4e6644629ce83786c6deaf9ec52ed15f9e08df695d6417a0ad8a"}, + {Index: "70", Address: "one1ka7t672qv8ndpjq2gqns27wu3j3gtlt7w0vkhz", BlsPublicKey: "62ad52f6050101549fdb9f2288d670b83d0fbf38682df561b13ee3358b2a49d822d956ac79ec2567920cdf814c534485"}, + {Index: "71", Address: "one1r6thhh5qzpyk58ddcguv5jhq6k6jh4lqhmwnqk", BlsPublicKey: "e2b812729d73a3e4538ec19cc2a8ba694660dc6eca53531026b6e6a3d119de7de43ed994771457211f581600c7488c05"}, + {Index: "72", Address: "one16ykp3hk3648dcu8rggrvwppfnkwytvs9ke583g", BlsPublicKey: "72e41c1af140e33d13e145e658c67657cc273a823fc96ba5a0d054c6b6187af759b59151412fcdec84b559aaea0df994"}, + {Index: "73", Address: "one1560f54xsnyntxrrxrunjx5q4r2pxp264zs3n60", BlsPublicKey: "867ae6f88a5edecd6d89df05d94e08785971b4611ccda62944a7773f5cdcd6f2d86af8364fc7670d38a18109b2416413"}, + {Index: "74", Address: "one1ny4hhenxk84qw7st4w5kdrk5jhc569cns04s9q", BlsPublicKey: "d610c0b5788fbe3678a4a707836782bfb4dc613c73f8c2597fbd195e20c19dcff32d1131b7d298bddf89fabb74526901"}, + {Index: "75", Address: "one1c8p90nmarr90j8vevhq9588a4pxh0tqctfmxeq", BlsPublicKey: "c47e65a0100104f29fdb034feeaa78e266092ae778a5be066c24682c351e994c7f8958a9fe3ce5feaaa64227fdeb120e"}, + {Index: "76", Address: "one1hzqu37h6mnfw3kk29w3r65xgjj2zz5evepuu8u", BlsPublicKey: "03406acec541e0e0d7cbcb7c0502b4901d09b4f563fe0db4cf3e3d18038373f71eb3f720d9d9c66244364bfd7ef09217"}, + {Index: "77", Address: "one1tmxc9n45jnwrm2rlyjpy7g7gwuxayf06t934ef", BlsPublicKey: "97cdc70b67de97170e13ecb83b4b892107766f4b66d17cc292008253ecc755d1b4cfbd71f8daae8eaff1bb235c77b203"}, + {Index: "78", Address: "one1zwk07x6wlervgf3e4r7k0u7mlahnts5659f2q0", BlsPublicKey: "6d8faf3a0ff828bfc59702755c8e84d1e4dbd434d798c56bfa4772aa22254ae4643d6b4a9d385941780b848e1aed6007"}, + {Index: "79", Address: "one19usg0jpgp0rkkexxw57zdwf20c32mrmhdcdj53", BlsPublicKey: "6aec97cccb934f6c50c60737be830c92f480f2fd1106c0f9c910dfee0cfa458dded98e6618a500bc4f9b833c1ab20e95"}, + {Index: "80", Address: "one1rr93xyelu3r86spc2wv6pe79xuvj6z8hdjlktg", BlsPublicKey: "b54a2260f9b8c8903d39af9957685752a5bd4e48329f1a4b476dd871e99aa7e9c05682e44a3f739dbb1713bc824d3799"}, + {Index: "81", Address: "one1ct89upkpkpv5scmj3rvfw8sucqkygve2e9tg8h", BlsPublicKey: "74c363ec65b03997fb38382a270ee1498556c229f48f6300b6bea3f7d6a515b57805922f40ade8c98ada9eb084e52e0f"}, + {Index: "82", Address: "one18cgh0khhkrkxm537lkr8tymfvkd9xwfm58da6h", BlsPublicKey: "ecbd8b1059ee6f83aaf54e1ba32a07a900e2a9c66b32038c4ea73edd9be7533aa7a950004dfc49bfe1e8bb6dfc813703"}, + {Index: "83", Address: "one184u853scm64f6fhaka93p4eqk25dr292gvdzx4", BlsPublicKey: "14d6fe69da4f7c85d15f06b6b93fe456a6a68cdfdabac18d395520444295bb616eda8c63d32df7ee17815b276e8c0b00"}, + {Index: "84", Address: "one1ynftpycaceu06hz9c7v0hydu7qezx0vs8tvgmp", BlsPublicKey: "0a21f76b002c3d2ebdf9e9a761c8a26774f306d2e0eed329cd9c814efe0cda9cbd10d9b5cf04f30bbf0030d359c5a705"}, + {Index: "85", Address: "one1syp0s8wvss25rusyf4v8y709vdadfrym4kk9uk", BlsPublicKey: "c74ebd61d4503cc23f794d0c4af3f1388ed4c3c2a3bd02283df9d03a7389b106a58cbfce102d7d489260995ba9e12d91"}, + {Index: "86", Address: "one1qrs6mmvll5h7mfhr3f8rxwlf627hhpfetheau5", BlsPublicKey: "1e083cc85229ffcb9fc6743bb91ead11b64be410e15b3af13c80b3c9bd51c99bb2ad48acd9ee4ca2c2fe3c07d8307b8d"}, + {Index: "87", Address: "one103frfx3zmeymel7uyrkd3t48gup2hkalknmj9j", BlsPublicKey: "072de8125621916a6f02fcd6a0a451ecbb3379b050c6b4098b2b0014f0afd7a4ad14112b3b4b221e16c31d6cb7665b11"}, + {Index: "88", Address: "one1j7x8ha4frwlgfnp9et8cncy4ptjy2sygpyv23z", BlsPublicKey: "bf22387e4ce19adfdd8df61754022c14f4a31d690404ec2eef81740da2787628fce0d28165db021e00cee34058156002"}, + {Index: "89", Address: "one18wdjw3yxhr7958f54s223mc7m303fd6vexlves", BlsPublicKey: "61a79903bd1660e847a9cb3ae42229471d8bfbda5e937b17f0ec01105dd04447848b23f81948d23215a0d4c3a6d43a95"}, + {Index: "90", Address: "one1maygq3glp3t4d0u54hxpxpv8f8z4ss5hj0d2jz", BlsPublicKey: "8ff6bd3176fc9f1b7b01642e3b1895e559b8cc449436d6e6490e7f4c0f75477859887bc227c0bac22882e185fbe3bc8e"}, + {Index: "91", Address: "one18nnc68jyhjpr7w8kh9arq5j2026zhwt69pjvde", BlsPublicKey: "3074c2c46a0396d6720b4612a0641e29b13263eb4237ddfaa2317db99b8c0fd7e37a6b035c996265e82dd5c8286eb708"}, + {Index: "92", Address: "one10zw75ytwku6ek5hlxu8mnet49uwvd6zu5mukdf", BlsPublicKey: "80f6efd3d3f539434a994727b4e35410e0e3666d3d865e431d5d03e18a67c5a0f02142e8a8a24257e3bdf318a1d4ff14"}, + {Index: "93", Address: "one1pwx3vtwaxdetlx5kzcqhuc26hfc4fc9cp0stgx", BlsPublicKey: "851194219e2df66dc33203dcb3344b88ab6ff248236bf67422b5c9b5478e5c2f0a424050b4c5901d6bcb72ee03219c05"}, + {Index: "94", Address: "one1csh9mh0w0589aszjt05nx4grxleq28xyugv357", BlsPublicKey: "fc72bc2ec7505ea90b70a309e8b93bf4c0ef5e44bc14023fcb766f2e083f37f03ce94dd83728a918a0685a199c1d8214"}, + {Index: "95", Address: "one14xn25dqus5wgs9nkeuzm7uyf3rjqr5s7w72rv8", BlsPublicKey: "e92333fd7866a3802e902b18b72f97df92627869a8222d3dde533e07948e43ea3d9bd969ee7967b872bf6c0327e6ba80"}, + {Index: "96", Address: "one13nnamdlwxyqhdlscq9qfe5npedhamv7wj388d2", BlsPublicKey: "e27e4452d716fac92c46c4e0636ab05e1389a79c17555e2ba4e896ee9696be5e213b3b1ae9e2980eafd4425af3730d8f"}, + {Index: "97", Address: "one1ta3p2h0hqc42dglgyzey9xua8kkds7y8n3h573", BlsPublicKey: "e99c10f7969f3845cb467e23f0a5095d372198c834bb2efa1c0bb220d67bacc85d2637486e52f8acd5dccff36580de0f"}, + {Index: "98", Address: "one1ccwx2ru35zevvve6we8q5amy4hvggpj4n97f8f", BlsPublicKey: "9fd7463748f72c1a219ccd8e0e3388e7c5f8c426260d78baabd8c5ca172950661410d7a84ed25669edf9419ffa657618"}, + {Index: "99", Address: "one1j6hg78slrsvq93n7xa0w7t857pu4vw4lmalnv9", BlsPublicKey: "10cb9229e88524b0fdd9659467e15528ae79330f06d0ae541827b77dca49f2a81bac0f849b07b78b4fac5142a0aee083"}, + {Index: "100", Address: "one1gstn0y39xlman2z5xmhszmgcltwdtyha8zvcet", BlsPublicKey: "2658879e6dd8dbaf5b3f4d4c6efbf077df88b7a2cfa9ff80e392c56b178dafa68a78d073183dd0921e07294865c2d399"}, + {Index: "101", Address: "one1452w86hryya3ktnjxuevsttqlc835svje6sqym", BlsPublicKey: "d9c0750bf91ef22ece0fad07c6bd11a6f3c65615835a65c480c308560994485d4b27c2a62cdf90d0fb2d4f436845c914"}, + {Index: "102", Address: "one15wgxmsrzuh7qedcha0ry907nddn7y4mj9y4ja9", BlsPublicKey: "edd60bdf97109cb71cbe69d387a55b2d6d9cc61bb753b76dc179235b3a40f83931bc4e71960ed30b75309924bab1338b"}, + {Index: "103", Address: "one10cwk8hfq5nr4u20jht35flukvtceunxcu8mw7y", BlsPublicKey: "b72bb57bb2e03beba80a03ec24ef3ebd9c91bdcef202ab0eb8c82119273c73e294330c6e1ba2ccb7d5fc6923f7784687"}, + {Index: "104", Address: "one1tpmtxkvv9ryn3ruy7evqkpslp83erutywhvwf9", BlsPublicKey: "eeab83dfea9753a4c00cec1d2a08722c544fb7cae7914fc09e84d6fef1e6a4c5fd8a1f1dcb9a028f509776423f074801"}, + {Index: "105", Address: "one158lxgxleyvm70a0tjlcc39um3yuf0jejlr3qlg", BlsPublicKey: "fb5c286f0ad78e1c029b874d96ee251c6761facf4279e95fe566af08221a1d05e1da580b9babe4f8a2f38ff0c5543c8f"}, + {Index: "106", Address: "one18cmx6dd52d5l42jtjyufvetv3s8lpl8rqhatwm", BlsPublicKey: "5099821a4a20c9450bc778c638214d429f1dd66993f22761c669d9fe1e67caa11f45113bcebab971c32baa8000938a94"}, + {Index: "107", Address: "one12a9taz0rphrfvde06af0w9hklt5efn79jk70jg", BlsPublicKey: "5b2456a10ed7538205aed36254eec816ceed1862eaaaa2771dbf4086ca907e6f99d9d21074391f2e4bfc3633b38c7b82"}, + {Index: "108", Address: "one1vy5k5l58pa09hhz37vjw704zwdydak86wg6vdj", BlsPublicKey: "42c100b423e14387862fa419d81b430c9c6068d665e8a21737e293f49e41739795567176ab18070066a216eadb808808"}, + {Index: "109", Address: "one1shfeyla0stmwrhf37yqck9wt3p49c3l7vcsqr0", BlsPublicKey: "174c95f97ff6b98e4f840bd84d05f735cc195d5d1caffc79a1335c9deaf85bee3b01184b0f741c32f22daa004c140401"}, + {Index: "110", Address: "one17mqrkzczel7zct0wkjkanlurupzmsazezsmglk", BlsPublicKey: "b3c646cc7658407f1af0583a009ed26fcc623fc06753eb7d064aaae8ab8aa65a1bccb806afe65230d543b1982f4ec18a"}, + {Index: "111", Address: "one140tj68zjnmdyhf6d9pst7m3gxgxn6kvknrfhwn", BlsPublicKey: "55ee5b8742f2e35a7b0f02d9ee644d18046ab988c2e82810f39fed22ba02bc5db9a72c8a2a0a0d6e9f89a3ea09e1440e"}, + {Index: "112", Address: "one1h8gvhr650aydxdlzdlwz64gu4knps3fxmchxa6", BlsPublicKey: "5b3ef6640ca195940bb9d3bc2a2d39401f2eba94185c6900e420a3cd6add8d6fd1a4d117d1e3640343e61bca12504218"}, + {Index: "113", Address: "one1tn99d8rgsnum67vhekdf8a7p7fgfwkufm7d85f", BlsPublicKey: "3e5225758b977065903eae1e655a5f83a36c0b10c8fd5902bb9e6b1c51e6c3a6b846a21b43b2d6ef2df4e59fb2433009"}, + {Index: "114", Address: "one132vlefu93my3zvug2nsr9xk9n0a34ktc5q0nj0", BlsPublicKey: "a9f21c11d1fe66a6e85c90c9143bd0e060d48eeff9942e0d248c4367ad6449f36f57ac6157db17ea0ffa1c71912b2e05"}, + {Index: "115", Address: "one1sy8vg3lxqez80c83ed845hf39mjjm8yhv0vdzh", BlsPublicKey: "c68ca2df8c1c386b57368df035efd4eed561e760e0556665bb04da2cd41219db5a27b5f6dea0294a91eab93ae03d8302"}, + {Index: "116", Address: "one169lk4c9qt57luh7zws5ap5swhz68kp0n9xvk6r", BlsPublicKey: "f3a65597fefc025493b00dbff904182b4e1da1c88f2743eb0690bc9db7bbabc3cf283cf7e98f4695e967d5418fd1ce94"}, + {Index: "117", Address: "one1yu60r73fzhhadnj3hj3ndhpyk32lmlj53hkag8", BlsPublicKey: "bc55cd376184cb98e32b80aedcb1fe913fc96de7b881ef75f7119b23674291a1bd50f8c3a4d4739c9a3d1d55e6386b18"}, + {Index: "118", Address: "one183427xs6t55drhcupj02lulspy0j62zuhjrwl2", BlsPublicKey: "8d8c423024d8d6dcd3c50a5c1d6dd9336699513c6cf688ac19c7078aaedc36d124be4b49fed421b6ec08819e68d3510f"}, + {Index: "119", Address: "one1y3rrv8s2f6jyjvtyr6c5u37074z90gwnjadfuf", BlsPublicKey: "17759b3d922b64a8beac8b15acf05eb83ad587c7f7fd006ac9c5a187e0f40c0ad5155bc5af385cf72b0643931be39011"}, + {Index: "120", Address: "one1e4mxt302t0qzu4rv845w5wytj32zavtwd74jxv", BlsPublicKey: "7be311771a048d5af5e5efd7cd15f42a46007bd750cddb8f6fa3af78a8c777016de975b7dcc5d9b5ebbc37eb2fe40390"}, + {Index: "121", Address: "one1ql6phmg2g39clwyjafyl8wrff7fucz606t6fvc", BlsPublicKey: "ba17088f82e461ace61eec13b48463b8bebef8046a2362fd9c0e302a0331228233c7ad6811d151f63e01db36c1093a83"}, + {Index: "122", Address: "one17dl5r7rudn25zzvl0h3hmfxltpanyg9xzwq4u3", BlsPublicKey: "81b108eb1563c68a2fd9188f7384644578f64d228051563374413e45cd3f919bc9bcfa072345906c2e8feb6e77b0500c"}, + {Index: "123", Address: "one1f0qz3ss7sy5l42rk30ysvuzt5xystpc8n9r7lt", BlsPublicKey: "700f3c77d8c8a624c84e08ee239a3e568896da3b01fe00e0c85ff27709b6d24b628de87ec70be0da4e086fe228ad1203"}, + {Index: "124", Address: "one1mvcu6j7qdka04vs57hup4wk96sn2v6sgfjugyk", BlsPublicKey: "a7f807366c66db84af904ac45e7c3c21232020f2b2793911941cd6ef296e0d65679b7a084d135f5fed1fd48455e3bb18"}, + {Index: "125", Address: "one1kt70l3ml2zc42gl5hjc7zzwd6jq074d9j75mlq", BlsPublicKey: "d0e195470ca4c459b6f7c0492d61391d932942750930f799d228f3e1b5e3dd0b5fcf6bed78603ade716ea34a8d48b688"}, + {Index: "126", Address: "one1jcrdgeegyy7f7pyadl55tth7a9y0jsz8l45x8x", BlsPublicKey: "7c880b17c5cec63bebc634ad4530ea32e4632b7b73085f5d9948c333ae3963cf4e448d29b194a2e304b68736c2b3a903"}, + {Index: "127", Address: "one1ey5g7cg4de9qrrhscj5dqlj5nzlt0ckr50jf4v", BlsPublicKey: "fcacc28fdc2bacd2ea3f6b3bda853553522ed5cf1a335f67930ea7c7d981ec3f33ce00d1b4b30438287a77ec043b478f"}, + {Index: "128", Address: "one157vjwjc6vfmarfl0ky9lqgg8e9kc5pj90r4e7m", BlsPublicKey: "6420aeb6ffdbc7c03ab9d895b78090c6a4b8e1c8752d782cdf918c1fdea4b8991e3c1d2ee7a9037f9d0dc5a223353104"}, + {Index: "129", Address: "one18cc4525fec9tszzj2pz4595kgjtk9lgxu4jn4v", BlsPublicKey: "d29861a76fa113d9a684ebf28d396168289b8060911c93127f6895fe83ad8389bcee7224e12fd5f2c8539df5758a3295"}, + {Index: "130", Address: "one1u4j6cx85a06lcwpw78znvlfrnktwk7c90kekjw", BlsPublicKey: "f6211dea58b0962894d9f8a01624531b7e67d2de83da3ea4e02249ad688321a6be04c10cda4dfd8c052e70fe8da9e801"}, + {Index: "131", Address: "one18tq0tgr08d563y5cnajshk58eplvc58d4cv0le", BlsPublicKey: "7edc5e823ab766382c0d517cf914f5cd5b5297697fdfdc329de8e7b1c5da0fba121eb9c51cc2089cf9494986e02f0596"}, + {Index: "132", Address: "one1a8g96lxwec4gme3egxtyswc6rmrp6lqpnc8l9h", BlsPublicKey: "d2756594a894175bcffa03ce8a945e8c73f8149e3a4acf0695a206b70a9a4c5782a16199f590ee1cdafb50a45488e518"}, + {Index: "133", Address: "one1xvwufx4ftgfh0ukc8v5m3rlxnv92psckyu0ajx", BlsPublicKey: "7fbb6848ada45d21158cd47dd0e905da355b896aa79d3feab91072bbcfdd675cadfe1d2c602f574a3ca87ea0f8a02993"}, + {Index: "134", Address: "one1lurjmvx6x97zp3px92xnsj8dzucjgvsrkd3hxg", BlsPublicKey: "43b2f306fce3ca62eb8dd7fe7305aabbd391cdae7b9edc11af3b0753b6715217f24678a4b604646478a08fd24c83c18e"}, + {Index: "135", Address: "one1889l6h6wdg2tpytklll3kwhh6fg7fuytr08g87", BlsPublicKey: "eb84135858022bc149ebd50d7726640a63a32e8e866876ede8f9b7ef173dfd9d6d67615e2583b991652be28b56b40904"}, + {Index: "136", Address: "one122gvgxe4n03r8ym9z7eh663xzvg5tlypwsjvq9", BlsPublicKey: "1e2b98c8eaac6624d64eff5c54d3dba9e7ad05b272df59deafbc8d8263ccc0beb0cfd3564d47c40300411a894a090398"}, + {Index: "137", Address: "one1pxrdn7v29v4mlfkyd8wjxemkcg297ayh6zfj5w", BlsPublicKey: "7a4bf72fa2ba2cf188ac20f764960a3f31dbfcecf6f49f0d2f4a66ea9262bb62587e3df998651a32f8bdbb383e968a19"}, + {Index: "138", Address: "one1me4jz7cq0940m0ndm4tm29mkjxy0s37fvxc60s", BlsPublicKey: "929d436cccbb46229f3405e57ebd44cb9b2987e1d8cfe48455738a9f2f8f77438771f53478a71dc247a857686c28b60a"}, + {Index: "139", Address: "one1vjqvaztxkz5uax7n0vtl68vf0h84auk32mnku4", BlsPublicKey: "adae1b2b42dda88bff05db56f861463e49be90bf3f6956315f02b7c73685bc56735c0b5e350e7e754003ce7a81cbd907"}, + {Index: "140", Address: "one1vukpxrquce3wf3956p83vrr9cy09fzwqknc3wy", BlsPublicKey: "155ab740a5bc220bb786fda4af7ce6ffa9deffddcc492e75f14ca6f3a170ed9f3ae3725b256acc6fcbfac753ec17a314"}, + {Index: "141", Address: "one1gxqw2gqhpaepnwtm0n3rka847z7pplmqe4vyf8", BlsPublicKey: "a08abc8479ea3a37b3b2039691a4ee66ec6c8e5fa9bc130f2fff0000f0e747b7e47679d9b3a5be11ccb4132f701c158d"}, + {Index: "142", Address: "one1kuxv839lkdxu67nkd9hur6375j75fwsd3sx06e", BlsPublicKey: "50c3565ad3275e660a97ef29dae9d335f77871cfd5c09ee5c5f61306781c0478988ed1ca45e5c151a0fa5d483346de92"}, + {Index: "143", Address: "one16ry8jvh0ety8a2nwrfucu90yx7tqcrtx69d5c2", BlsPublicKey: "8797872afec84adf180f58425ce897ac3830cc102c872a304689a4fdcfb1bec157f1a9e9e3fb46afdbffd766cd53ca81"}, + {Index: "144", Address: "one17cwjwxarj9qu8xn5dsvvjel7dgljes023q94j8", BlsPublicKey: "2d5edcee1cd1d4d921a31443b1872b333dc2293f543dd299f9061e6d0fe0731f814ba0b1c01f1fd41067ae6c3b79ee8c"}, + {Index: "145", Address: "one106008xe48l0zed8d9ndw2r63t57f3krkmrvk4y", BlsPublicKey: "89b148689cbe78bf3214f2b8b63094ec09cab741b3db3cca9ffe9c6345f7a81a801c053f4ad49045556b5079bf846e8d"}, + {Index: "146", Address: "one147gt90wmev6yn8ehdpc4gwlyv69vhs6krw4h2g", BlsPublicKey: "3dd2bd713a00bfe2d876abb54a4bc0caae30ae439e1a3c5555ba328560a8cb7187ea5f8b55f5d3cf2d8bf8180d220599"}, + {Index: "147", Address: "one1p6ar8evexwgjlm8jxhkxn8j5zt56mmfqxqdp5u", BlsPublicKey: "0937c6fb3ddf4b14d07cec04b41ea291006a9a9852c982f8ff96a605d87849ae360f95979a17066780be15e70cb57194"}, + {Index: "148", Address: "one1wxpv9sktrf0edgluv02uk6htyr66ejtwj8zn8h", BlsPublicKey: "5fe37ab6c92c1831956193db7526faf507df51071196dc9e882bdc5084fd2446a7a88d656bb7db09595fa9849c837c08"}, + {Index: "149", Address: "one14axlme3eg6h9fzklxnc5d9rcz0d6s5ujhjj0f8", BlsPublicKey: "e4f6913240790b74c26a8ddf571942ee55ae0a5ac99958d96253fd7a334afee39226434b0c960e77df48b860afb5850f"}, + {Index: "150", Address: "one1ge6pya9h8qhgrekyyknj7y99ytey59fvpghhfd", BlsPublicKey: "a6d5b93b3a6e8b37a9f89c70b65a9160e95d9b8342c058990dad2cce2cfea98b2c0671b3b4490d605f64c2b5db3f0604"}, + {Index: "151", Address: "one1526d4epuj3zfjaghd67c8ftt2zuk86wz2c65jr", BlsPublicKey: "0c9d3e30ce69ed358016e54c47d0643c2e417441c15612158ef52a06d609784b030b31d352252520a14058abdc514196"}, + {Index: "152", Address: "one1zht3qjk8yqyscarpp7qn6hw25evq88prf5eq0z", BlsPublicKey: "de3610efe5f0de74f6959bf6c592b1493642f6dfd36cba4fdd55da9c4f4e13965e5af4fc092a01f325642977d3eae591"}, + {Index: "153", Address: "one1xffq8x9d70c0p98xwvxyrj7kp5ewnu8264jrvr", BlsPublicKey: "3664120aa99f98a215819b4a4adffc59450f5ad73da7a7594dd9cc2633fad63ad9692b580326575a99250700a77d7717"}, + {Index: "154", Address: "one1xsuduu9sr29wh8f53q4xsahxq49tc957n76p8x", BlsPublicKey: "3a060baa590e5161514cec9dca5535d962cd88734aa632362789184405c48d97b2462a5095ab3d7df99a4c30119fa98d"}, + {Index: "155", Address: "one17smduhavjxefdcez28g42vn9jcd34rl7gc8xca", BlsPublicKey: "a9d7d93036874d9f2402ee13c7d7a52c6a7b6780daa6e18f7e1bbcad6ca5a6f443bc8538514a73a6695f2f07b7b2a095"}, + {Index: "156", Address: "one1q03x7vl08584568kyl0fr2a7sqmwd5sslsaeey", BlsPublicKey: "069e433b4112cda534bf4171d33c13a832dbcbf8222afacb701b2e00bd2303ff107d2bc75ba02185e48958aeba7a7697"}, + {Index: "157", Address: "one1rpns9uf9hllhfw4lh4dlstnpj9u7mln0jnga88", BlsPublicKey: "1cab62faf3d8ac5b96128268b300d26c95aa492b65dbd1ea65bf4156005ede6b472a6fc46487a0c1ad957f8c8aefca88"}, + {Index: "158", Address: "one1k2lmj0xcs8tjftp4zy7zkrvt809rppcr5vaj3m", BlsPublicKey: "60aae7000932b498084255484f94c394159650817095a2ca097f2031d63b04decfa24d659655241792276f14f64fa294"}, + {Index: "159", Address: "one1trqytvary3w6mtshkkmed8sp5r6sr8d6anvm56", BlsPublicKey: "546794217d78eb628fcc90b567c4e18eb9a7b110838d640412fb2f0f52c934b90cf33f698357c27088d741401a1f6d95"}, + {Index: "160", Address: "one1qvggj8v4p3c7tv6g7p25d5rn7n6224m37vf46u", BlsPublicKey: "eba18d034fff2aa8c80f4ebd470bb6a6df17a4b7439fff24b3d11423729b1632b8cc6b9d55eeee54053e0efc39079a83"}, + {Index: "161", Address: "one148phcgwxtnzt6mumyx22v826qhna2w3fltrdjn", BlsPublicKey: "9615c1cdd31dc8688234fc6d0a22a545ab61e4157c04fb7a3a62cb65c92dee10d5752fb616d2f43e3082bae36a3b3701"}, + {Index: "162", Address: "one19e35cj6nqhcp9jdwvl7s55m3ewuuz39y25q343", BlsPublicKey: "2255ba8eb8702e261b2f6a83bd006acc52ff84c38ba27b8c4316c797b0e64fb98912b6149dde5a4ce20dce59a98cbd17"}, + {Index: "163", Address: "one1fq8k05hl8n23fqh5vckm4euqzp9qrsaffxyf3g", BlsPublicKey: "2c122510f37368284b928ba8a3ea5952a5ef2cdca402f4e7baa6ba119f5e80d46226589bef6d0792ee460b27963b200d"}, + {Index: "164", Address: "one1350akxgsz928ayg7znjt995z4sx2zxc5slsvpv", BlsPublicKey: "b814e7bccaa54c71a5f3b4caa5df62851fd6f2dd793cc35777fde7f1a152b51b9031b8598ae5a0f17f852d0e53fce985"}, + {Index: "165", Address: "one10dnzglhyfk4w6deej676x6jmyu5yyu89xuq3az", BlsPublicKey: "5a7c53b8dad0128e7b82e933831b69f3d0e6131e9134d1f77c9c7ef39122532b2b95d8d0b61678aff262be8cc194a311"}, + {Index: "166", Address: "one1jcc433fr3jq8fzkhy65s2x90j7xs8dwc8j3p56", BlsPublicKey: "e2ef4c57946133ef1b7224d9f6231acf30f0b072e03e898cd47f89224f67ef5f3871a72a4083d779cc654194dfcc9295"}, + {Index: "167", Address: "one1v88zkwrvde8f7kqgslseepmx9lur48swzklxvu", BlsPublicKey: "7d2e13d160d3f6b092232e2085dd601259517ba7030a460c309103b6b0104b5ed45c2491118bccb2e526828c2dc20299"}, + {Index: "168", Address: "one17mxsjte94udtazmuw5rnu8agyhreh2xtqrdgh3", BlsPublicKey: "d750d86e3bc3b8d30233f3e2dfbb030024c6ff2e7b19008573dda0f04a24b451964c7f2941376a4d0171947aa0688817"}, + {Index: "169", Address: "one1q92u0uudr36wchdfdjsay5vr9c7uyuj5axnzhv", BlsPublicKey: "65fbaa5ca06b764009700455e515525e4f2298f7338e867d285b86501f19e79ab38351b99914ff3318efd688d82fe886"}, + {Index: "170", Address: "one1gd3zvqu8zu2gdr8dj5xg2svs38mll6y3x3tp0z", BlsPublicKey: "0af34c4b01a15cca0f5e7a83f8b6842c5d310d3e4699d845fbb639700e4f12a08538ace99ac3bd98a1adc4418b20ac92"}, + {Index: "171", Address: "one1y4c3dcrm98c7faya8rxaq9kthdq2usft2cax04", BlsPublicKey: "8f4113299afb54e9301c0b10216a19555ddca1cb723b84102af59fcbe97e3efc746383e6edb0c68414cd9265e781e48d"}, + {Index: "172", Address: "one1xkasceahy2l6m74c6fg23lmmu9sleaslhhu7xl", BlsPublicKey: "39bed4042a321b0367477368d056a6431439b8d71bf5f06b016a0fa7746626ccef6e05157f51f6fc90199ecf8a1af998"}, + {Index: "173", Address: "one1qwhhg9g57j2w3wpg82xhr6vcaarl9a32hja32a", BlsPublicKey: "6f064aaaf557ef56495ee6efa175ef050144d619fec89fb06893634c02773704d673712ca15c1b54806379405f31bb18"}, + {Index: "174", Address: "one1sqgsvkqdudjq8dgn3fnujwrnqp6hzvd9zxdeh9", BlsPublicKey: "ee5a268eb1cd4700d2797dcf6c068ae7a48ef19495bf9c43570e71734eec23c8e3c3fab4f044e092e85c4dc712c29f8e"}, + {Index: "175", Address: "one1zgvy4fqk9p9hdx0h2kg50rn7x9vd7lsna402rv", BlsPublicKey: "02b7698e95e30a87dee5e579926da604de094569c88f443e9ad0aae0be380b400ce26d50b983b6ea5730277f51fb1e10"}, + {Index: "176", Address: "one1x8p7rjmmhl9sj99ayw2cqw5ltc7zg3z2qwev89", BlsPublicKey: "e215ebfefc9b1746990adec617b4094f25512f5f16d3cd715d67da7cb6a7aabb7df1f8f1134b0a8d85608d5144cc188c"}, + {Index: "177", Address: "one1karxh750c4nhms7grkvpjg5jkx5ha46talrftv", BlsPublicKey: "b08bc8548a1f59646d9b610d7cffeaa97c1d441721b2f0079cafd60a39437b2fbe2bda27b295fa03d3a2a72265e4da12"}, + {Index: "178", Address: "one1qrj56s26jdh9lxew4daqv3zaunwxzjxfpprww9", BlsPublicKey: "8e85ca728c071af97586b178d906dd27a652b426b8bd2c5e15149700741ee605310a3981232c9f6aca1a37274539948e"}, + {Index: "179", Address: "one1yydwspunkzd6sq00un5vqzvm5upkzghf02sqp7", BlsPublicKey: "fea15bbff10be9e6f33f14f43c1b2528977f0d18bd6fc0159856b02ee7137f434e57e7b22f0ef64f70444ab18360510d"}, + {Index: "180", Address: "one1ww2q88ddl770cd9ecz4ns9l09uk2lxhtvpxaw2", BlsPublicKey: "7a7bc5fb7ac3a6d43e878614023eb19dbee4815be85e09fa61d70325da73ae4569163d8903a561cd52bc1c8e8b4fa816"}, + {Index: "181", Address: "one1n9l8t79mh3e5p3c7snc0djhwqd2k53g3zc4qhk", BlsPublicKey: "b2d4bfb9e9fe003e3da1ce160fc5c870a56ce62162f15451ec090ae6ebee202ec02201f289f012d5b95f5cefc60d2393"}, + {Index: "182", Address: "one1xwkfgmfpfymm5swqaykjdghthglxhqnam7alkj", BlsPublicKey: "49dd6dd4ef0e6bfb0bead3a654065e87e2210741ab874e1754f231ba57e8d9a465a043a89e97b57a8aa5c47a29042311"}, + {Index: "183", Address: "one1mlt0q68evxnrsv5arzdvcx4pas82pwtwt5atms", BlsPublicKey: "433fb7cf8de65597910ab38775088f1914d455f175b8756b5db09e5458bde3fd558df77a05805d6c5bb34700eca9750b"}, + {Index: "184", Address: "one1dlghky0u7zepxhaf8cke0grt3laalx0mny7hk0", BlsPublicKey: "45b7a484e7a5c91bbbe881e4422c288e61deeb58e3dab1729dfbe921d150b9083947ba84a2a07b89866777d47f8d7d06"}, + {Index: "185", Address: "one13hd4y3r7gj2pz3q0q96ge89u25hmtt32qe44we", BlsPublicKey: "8f95764298fa08f6624b7acc9731899778158d6264e42341ba55ac2918ed5d05cba452ebafead2a04100e2bf24a69216"}, + {Index: "186", Address: "one1f8qa9hg7xrhtugl3z9ehz52nm7geahq9ec7tvy", BlsPublicKey: "02db18796e500aa4f47ec4ec4751f4966520ce4aadb486d669f8b3720a67378624a3efd3d5d5b40835d490309cf25b18"}, + {Index: "187", Address: "one1z9wpsxp386xgsguw0prdeeejv2x3c5k2vjvmmp", BlsPublicKey: "d907cccd503f35eababd60448a61e0f46e102a773737da10c1405d47e38efeef4a3b2085fb93dc6bf82036b4194c8199"}, + {Index: "188", Address: "one17t782h3rmy2qana3dcrwee3aj9kuuky7xy89gy", BlsPublicKey: "f6dcead63386972fb00c26c7aefda614b8c58bc33c05d488df9bfef361c1dcced0088b245acb411b52a36ed287051215"}, + {Index: "189", Address: "one14v3wag50fy5ktk699saa7nh5nsx9t8v82xqt4q", BlsPublicKey: "f1136f1223d144c6a5fe164899b0e917359483dd407ad490bbcc9480881e12c27071e3c1342a2d636fde0ea30117c980"}, + {Index: "190", Address: "one1snyvqh9ycsgggd63ak48cfzxh9pjh6z6asgx45", BlsPublicKey: "8c4898c2169a3ef716acc91d93d3baaf6525501805b57382b301700133041709cf096283db63c441ebff24871daeb607"}, + {Index: "191", Address: "one1e75zkmps2ejefrdfcsm32dcp7yxlw0w3ejk66m", BlsPublicKey: "0d5e7b6c437e5fcb5fced2079730f014463328abd1531a2659cdefaeb6f1868d04d60340f197c32758af9e7a65094018"}, + {Index: "192", Address: "one1v8cknaa9thd4flwy35jetxs6n8etmxz5c3fw0f", BlsPublicKey: "9be18d5826d38991e5357e997fe9e90337fedb56fb62d9e8e9c610c682b00da11b3045df59181657bb70a762d9b72b0b"}, + {Index: "193", Address: "one1qylhnvy2xh6wdpfpd59daycycr2p3a8spp2yja", BlsPublicKey: "2d4f5ad7342266143fb02318e01d4893d61f454ceab21f2f6eb04d15db8ecff2df4e51bebce01a2fb70b585bdab9e019"}, + {Index: "194", Address: "one1lk66lw76w8wae84syg8z8evkkstceu2y4yal9t", BlsPublicKey: "5c23b91453afbb88216ec57c0e32dcdc6d4d07b70577f897f6628b91f10436fb191be1a541b3f13d38231e457ba63019"}, + {Index: "195", Address: "one1752w2pvtrf08lkl6xxe72qymghdsmps9xh22hd", BlsPublicKey: "8243b76cad6a310a13c683cc21ab8dfce70f8fb6461cb1204cd6d6dd50a857c6d4015e117b5488767aedd2c402ad6f07"}, + {Index: "196", Address: "one15g47h7p2n6x3e99mvw7772qvpscp940xl56q0q", BlsPublicKey: "0f4a33e3b0babad97efea55b7c10991ebdf08ef8a41bbd95c9bca4b79c92d771d8606a3763a1d6ebf349ec5cb87f818f"}, + {Index: "197", Address: "one1srvmjsfcaz7gzws2tetakeq2qulkdgt6uyhnx4", BlsPublicKey: "ccf1141f8e55cba6c42ab2d14cbb87a277ff9be29c9ba5604a9e3e2fec92fd74db0d5e9dd62da1d75df86cc0350fdb10"}, + {Index: "198", Address: "one152x2rmk904wyd5pdcfu3k6dpw3d5k8m846teed", BlsPublicKey: "c8c3900195ee579cfcde7613c0533612352518d4eb92df707429205da0b5b9689e32dcf16313833de7c786afe33ff481"}, + {Index: "199", Address: "one1ha5md3wdn5d384z9dg5r25t60jcvlnu75yd63d", BlsPublicKey: "1873d459e1d967f049d099697eae8aa4e03fed24cb192223e198d827f3599a00eac64f0ce5a69875834ecc57e8e23f8a"}, + {Index: "200", Address: "one1xm038usqmxxqk37c65xzxm6dmnh0jx3hzw7qug", BlsPublicKey: "8aadc4f5814eda286b21d29131ac2a4b6bba88db783ca6d010e8257b01e72ad0706c241823c999ffd005f05a84f5010a"}, + {Index: "201", Address: "one1qtx2g3c7v5le80we2rqcr06srpfeecc793l39f", BlsPublicKey: "a7a3fef9449204c26de34129d30793c5adcc9ddb5aa1e02bad8bbe5662db336ab5538ee3e1156785486c4a75ca68b211"}, + {Index: "202", Address: "one1d2qhs8szjysqjc8g9r37ntjepckqd49jz6u3r8", BlsPublicKey: "101d7a9cd312bb80362e97d8b979566f9732a142938cb373a5ba7249bfd07591d2f95f54a28b54b6f0caf7736c48d70b"}, + {Index: "203", Address: "one167n2jp95fdv5zfa7f853cy4uxelg72cg8urdx7", BlsPublicKey: "3194b7c24ca63b5ea4546f20003c68124df61caf4305f052fc6a31d058aeaaff8b48d532a7824352ca7918a3f1be3b81"}, + {Index: "204", Address: "one1z78c9cdm0jf6ehnr29chmdju7zjrrqnptezvuc", BlsPublicKey: "b09fe381c3ef6469c48383452bae6a3516dcbfcf75ff600a2c14913db67b29528e93726b930f44fd91ce40471d4dc489"}, + {Index: "205", Address: "one1wl9j0xql3zpcxqpll2glcurhfgz80falrfh6p9", BlsPublicKey: "57f5c8b59f8295e6afdb94ff313a4d4bee0f6007a31f0cd9b3d38003c8649be6754eb64ba5cb1d876f811eb9c546748c"}, + {Index: "206", Address: "one14ugvm9ll32lmzwkehdgyymqfu3lsj28d4v50kw", BlsPublicKey: "a77967462bea74b9eb96608ee0e4e4ba444da7a3708da2f8f60f8ff53878adcb0cf25a38d8caddeb3be3b4a35e35fe0d"}, + {Index: "207", Address: "one19374l4mhca096w4d9ea0ser8hnenehty3r956z", BlsPublicKey: "acb484265281f4f956f4b73221d1fb3df8f78adecfd59e693f961d0de46b1790c4d2d12856c35bdc733ebdf0da134d85"}, + {Index: "208", Address: "one1cutkphswm7chuqs3vn075ke349p0sttnwlg0w9", BlsPublicKey: "71a9210e4dcedce7b6edd49faa44e4d81d77ce5cfe56f55d8b7927e2ab0795c2152aab02829d702a774dbb00ae8dc689"}, + {Index: "209", Address: "one19y6dvwd3nekjz50qu4j3szyxgxa9szdpgg7tz2", BlsPublicKey: "0767bb9a049801c923cda79b4c7d856f8f3d08cfcff44a6c44011851e253ea0d5c6b9588a6d25a4ff7c8dcbb7fc85014"}, + {Index: "210", Address: "one1v2uej54cftkn50glc242paxx78h5y8wspckqkp", BlsPublicKey: "7fe71878cee72268dfbd7685b74bca34fa70a47c85ca3730e4597468a0ad98a60b8a0b750732cfa88b91e03014c5ac11"}, + {Index: "211", Address: "one13mem2dl6r5h4lmhraev6s89hduv3uw3hyus62u", BlsPublicKey: "3943095fcd433157cbc609e5293462f4ecd22fbb7b9a961c4075b3fa93471b59611a1bb05c0323c46201badef5aaf20e"}, + {Index: "212", Address: "one1jkh5xl75q3uvhzrhn8te8s45cax5cylmfevwzs", BlsPublicKey: "f4354e218f74d3d629586cb361d28025b4d8d2387eb173c49c86912f7f8e20f13c214f3351466a6140a4ee0071efdb8a"}, + {Index: "213", Address: "one1yq8lrm39kr4npaegh8yy50knpvq5v5peacjaa7", BlsPublicKey: "e617dfca58f3d9bd90ed7c6cbf10e6a7f934bb6cb7efc37c4a385a17863eacebbe24be414191aaeca6693d37f9a90694"}, + {Index: "214", Address: "one1yqc3j0nne0ej2ltzp75s0024ycu9lw66qj4u2x", BlsPublicKey: "8320cf7b0e9f2f692502059160b2f402c988641b51070977ab15b02131aa1166a5b484a9c7f24b95abd04313b89b8284"}, + {Index: "215", Address: "one1ell2hapgcx82t7tuhs3ns5hx3xva3pk3zkl0cs", BlsPublicKey: "7b864402962aeec98f6e48554492b9cb843e9c021fc6d5a7785b77f02ddf97434af174ef741e704682454d223d9d540f"}, + {Index: "216", Address: "one1gd779hwtavem599jj3c6teypmujz7fcd2d6an4", BlsPublicKey: "f9a0be6a719e2c5ba86029f912fdcfbbbcfc7ff3c400e1e6e681e7ec01da214b597a03bfd0ed0d3f351c7036282aea97"}, + {Index: "217", Address: "one1q5vu3luhw94fyuwjn73txdng75jhx8styzt6dz", BlsPublicKey: "48fae61bbceab47fd3b96e434baaeeb08989d88dfa64ab01fe271b36cb303ba94d9c3bf6d96e7a6553dac7c855c26816"}, + {Index: "218", Address: "one1y2a3q4dfscukyzun5m0f46v892r2z8s0fs3fkd", BlsPublicKey: "4af2bd9f1e91b9c7db1f6d239a0c76006e8d8d1219468a49d4c06893f15cc6844d5826083bb0f06d4f9af80e38e0b002"}, + {Index: "219", Address: "one1qs9ex5dpurl0dg725thhc2ctfhqkwwpyu93d7c", BlsPublicKey: "bdc7aebade466490e3d0df97db1dcdf5edb546270d00276a44f34e3aead12303a898daee58621420151a1145cef06095"}, + {Index: "220", Address: "one1ewcqfq293nczc2eegfgxmagjyvqdyrwnn589a5", BlsPublicKey: "e89ddf72bb2010e07a1ea1ad39371cba9f5a96b5ece7a1ebf69b9cf9967d37a4cd287ae923fc52f66a282297e11a3385"}, + {Index: "221", Address: "one1xgjj7wpa3xn7c4lw2hq0jjfqdgmrae57eyn2k8", BlsPublicKey: "744336d151fa5ad71eb2c25c01e20c5069f4daf6c69b4e4be5297fb6427f23826b21502490acf155a0d0985d25f2f006"}, + {Index: "222", Address: "one1vatwuf8nfqsuy9ngx6sp7nuc2n8k4ap6e95u4e", BlsPublicKey: "49f9c2b3d90aa7dd1ead32ce40cf90864cc6420f5f11b136f35d58753838756f991561fc1350b5b7facdcc4c1d88ba88"}, + {Index: "223", Address: "one1qjnl85066hx9xqh3nshwpnh86ww9sgkw4xvey0", BlsPublicKey: "80792a400e45ebdb18ff22d32a8de95b4766e40b8047d8d9836ecfdb075e5548e159e6bae372cdd6454b52409d4f5019"}, + {Index: "224", Address: "one1et8t27ecvmhwgpegqegh9hk7x569uz7jn6gl9n", BlsPublicKey: "20b6f747fdf027718fccb8c48fb92b499c88d1b49e9dcfebb53107c2aec6b9de2bbe1b965e22a725b137462756bf2a84"}, + {Index: "225", Address: "one1w9qw7ns03e4mwcp35rgmtfd6aa3u5648y7x8rl", BlsPublicKey: "324373e3b6602a678b01aa235717d739e746a4c9e864821440181921c1d32c74102e8ce63a2b36938a2bcabc6795bb87"}, + {Index: "226", Address: "one1ut4j646lvwnulh8xrquydgruv78kj6y729usv9", BlsPublicKey: "709436c0e1279784f04c0ca89c756e56a06c233c0b23981979b8ab4b6221cb5e80f1db3927cc20fa4722e813d836bd0e"}, + {Index: "227", Address: "one1zrvdq2c2a2drj5haqjynfage0474s47txrt3ay", BlsPublicKey: "93dfa2125c6dd207049b770b341056f2f6d25738eb0f005799a0be80d9fec75f7f44f8ade70a523b1793bd2ca69ba919"}, + {Index: "228", Address: "one1elprtp5jt7cxqgrglh8udnjwkvj6wlglwj5tlr", BlsPublicKey: "f91a95836cb60e04c629ed9c17044baf79828b5a979af44e0387951aa1ecbe4f0e90adda104b954f149489abd3856c19"}, + {Index: "229", Address: "one16rl6vaavfg7jtya0h4la66rzn3drya8ml9qhja", BlsPublicKey: "3e5d1203314089e1952a2b4709b96db2084a57a7d08c24e936e459a2e49c182027f5dc7c2da8517eed4b7b2d95f82611"}, + {Index: "230", Address: "one1cja0up3a8n5drn2pd6xqnvk2ad3hs36h0wud02", BlsPublicKey: "26cc0428d872e26130f13f34e5d25769654ade0967fa65dba79392d23666f75569b20d2c1e83f3e80e57863aaa6a7f91"}, + {Index: "231", Address: "one1l7frg2thyd5m9ar8k7m2hggy4stgxt35ywjnh5", BlsPublicKey: "54beb67b89b78dac97d6951919d8af883ef70750681d3912563ee5ce3dae9e1a11612200496c920f1deeff3d5eb3d60c"}, + {Index: "232", Address: "one1yd0yfndupvklpjjsr0ltghum0745k8zw2h8ef7", BlsPublicKey: "2a45879b3e789658cca5288d4a4cba48a6df111eba9d7d0287dd264c1a240ad7486627a0025e946c7cb5ebeb8fda448d"}, + {Index: "233", Address: "one16mv753g2r2hqjmj2tnplvkawjw2g3v4rdx4yuf", BlsPublicKey: "5eb082f818ea3c5a3b49079d8d86d8d43cec0863e4226d1c7facdf9537e17c5ebdcb53450cafd47d6c4ed0c51b7c2214"}, + {Index: "234", Address: "one1skvxygr3ucahupnhjpxa730p8vdf66yu6w0kfx", BlsPublicKey: "3c86845628ac45dcdbfb23b012ef050895434cb69ec033bf13530f9674c2531a8035d4333b33860a8d28f4b0386a5c99"}, + {Index: "235", Address: "one1ues47twpjfs2t04c7gx39xr4q3rtqye92u7cld", BlsPublicKey: "712f9b1417f829949313e70740a23d20bbb9af2017e16e1d9482ba8a99541f84cea857625a188f6cdfe10beb6089740d"}, + {Index: "236", Address: "one1n34qcc4f7f4lhz9xjj5x08ckvru6g925tk5ua4", BlsPublicKey: "e53407496e6c807be3e583c45b49b5a00c8c0550ced7fdadab9139109002625107035a5885f9d097a68791db48ecc803"}, + {Index: "237", Address: "one15km5kskvaeel09wkutm9e73wm46vqkpf5stta7", BlsPublicKey: "e252c0d265ced4afda60d841f491d75093f25bb6f22a772d833ffc331695fee6db89686effb9d96e9e8b00a59d4b3f8a"}, + {Index: "238", Address: "one16uw39hpfhyy8hq6cxkhjq5wsfdykg8udr26uku", BlsPublicKey: "6963a4a6283d8f7150aef2b2ca05cd15bf43c77a9e42dd544caf869ece8292510ca2e255d675407e14429bfb00335a92"}, + {Index: "239", Address: "one1fzr4q27wuv54sw3edu93y8etquj5vs0vshacyc", BlsPublicKey: "3166f4502e3a7b1a1ccf24a56044d2ac4f1ae42b01b807fcb7583c9d0c56b46b3516cf5d3bcacdcb063da72a24c0d392"}, + {Index: "240", Address: "one12yc9vj2khexm79k5taf54qx3smskv4m3p492px", BlsPublicKey: "20422b4b31182cea60bf49f209962f4010c17acb6a85a0f58e45b35bd5a1729230ee42ded2a5780d0ac4305342ab5192"}, + {Index: "241", Address: "one16wp9x4kqa2ym6ndmqmsd7485dvc5dtcuzgg7nl", BlsPublicKey: "ba646ceb7f8cd28baf05a4b52219fa16b5d50d169ba4a7586f8fb1548b91e4b730ba12768c448e5fed17c062b0c0620a"}, + {Index: "242", Address: "one1g677l6q4rju5lx07rdsplzf0z6t6dz37ghx5sz", BlsPublicKey: "812b65b160799631ae42a9245b4554e2dbc9a1eb92dbbdcc870854738bea3e7853ebdb44cb87255e8585296b235c038d"}, + {Index: "243", Address: "one1rt3l8n3f70zrxkg6pseuj3j83d0vtypp558430", BlsPublicKey: "8d77df7d1d3a84b0b39d8a7d84acce2d344ab995aa38b859a6226df74e34429c770386fa447c83401ac418ad835d338d"}, + {Index: "244", Address: "one1ae8l97q5s84x7t655kyujqyhn5sqearkd6pdsw", BlsPublicKey: "a26ed2145537856f6b01df34078b58c0b9471a021362facb44172d9d2ac056550b1c1f2d3e15ddaa27c62ef3654cde19"}, + {Index: "245", Address: "one17s6hlu5guzxfqawt24thllyyyqk7wmgp5yxp9c", BlsPublicKey: "6fd768f97109b775304b80eb983ec87ddb150a778ed1e1455aeec8aaac75ca7c7f225c6effbc9d241598ae5c1f6cfb12"}, + {Index: "246", Address: "one1rurk26mg2ukhx070mvj87ls0skd5wpl4afjcnl", BlsPublicKey: "aeea97d7b25be2f64a7359c522de18e340a87dc6f6c80042624b313cb98aa789db8909a8b95b5ac34f8dc3d894250a94"}, + {Index: "247", Address: "one15525dqtky4yaa9xv6whvh3kdrrqjtl0ep6peqn", BlsPublicKey: "0e830f8778ef4aa35db59749311327667a5732788c798e863f52f992e173e0e8b96f478ebcf6319593ab43d54b3d1608"}, + {Index: "248", Address: "one1383z4fyxflzthw8692q294nqs9t6yvzns2rzcy", BlsPublicKey: "8e1c60f5e9df807bd55544856bdb9c30fe5f3dd401eb751ded813448c83e9021116da6260de31d35c5bdc49e5de72300"}, + {Index: "249", Address: "one128hen39hw08xp4tcd6ezq38yrfp6z08kvqtudj", BlsPublicKey: "e4bd8d926d3591b6cc69128093f5679a610664f439a3d3bc8d6d148acf7f503873fae116af58146a179af9d223648c16"}, + {Index: "250", Address: "one18haty53c8763w2udp239fmvyag5t49050k5mxz", BlsPublicKey: "48d9bacca984e3e4f8a9a4fffd15628349d0a8a0fe6c1c3bbb7b26a5fbfdfa2ca6aaef97165a11e0d5469297644efb89"}, + {Index: "251", Address: "one18t4zrxp8tkkapuhk5mesmur3pz3cvg0054upqd", BlsPublicKey: "c088a928ee8be8c7a0a0c84503329c82dc27d0041229516fe791fab35c0bb3157ccf2520388782d593cb6f41f9b67800"}, + {Index: "252", Address: "one1q7qwlyt9n92anszzjx2ju835wd5j67a7eqmg3p", BlsPublicKey: "4867cd276eec3ae81b3018837230ecb6e3c29cbe092b0654646fff9339384a36e84a7fc6fd07c0628f07bf8f19293b12"}, + {Index: "253", Address: "one1wvvz6j57k78y7602l5tqyt5e2d73r7529l5pq6", BlsPublicKey: "c7bfedf7e50b6430beb68701c6ff66fdf11a76fe700e00a2919472bdd6d189ea08003c9eef9eb1f6e7b3d5541d3f3387"}, + {Index: "254", Address: "one1yq6err36fqgn5kx33e5ss448qmnwzzgp2dx6kp", BlsPublicKey: "2b26498b419ac8403f3420527539bbf652002fcba7e0de49bcca5743d4d7d125fc8a8b242bb6cc9642ab505f62e88804"}, + {Index: "255", Address: "one1jmxkszj8m26xk22trfk9yz3a7fgqup2lxamers", BlsPublicKey: "3916bf14d9b8606ae0dd9bb9ba4bbf3af25437ed1f59749c34066848b81f324a88791ae30b087c0659cdd3d70dfbfe80"}, + {Index: "256", Address: "one18axnqezp7dsdy9c6cdqzyff4tc2ga04t3nqwtv", BlsPublicKey: "7f164a9658dd23f0fb720512d884b7026f308e8b013ebe78eef2813ee7ad6d3cf93199010f0498d5f57286f2d87b1584"}, + {Index: "257", Address: "one1ggnmhza69qvrx6k6jsaarq6njjklhnq3fzehg3", BlsPublicKey: "ecd1c4f5ae8cadc6e6cb795f17da3cb2f82350f9f844a63d916ce2827896c6374948123491e559dbbda3225b4f3ea88b"}, + {Index: "258", Address: "one15f6hjtj566mjrsrjk20vnqhjp4dlsavvm3j8xe", BlsPublicKey: "4ebcd176c50204783a94f78923104b5a8eb16dc94902f49f471a3ab835bb264452241f50d51448483db766d1592e0081"}, + {Index: "259", Address: "one1xc0q55l7avuecyy3mpsxgm2ywrfla5vcyjsxy4", BlsPublicKey: "6f199d41bb39c8a4097c39cdda9ffaf31d83cdeca4c26a395f0dd794b0989c945f71b4918a49467e3264221677f66f85"}, + {Index: "260", Address: "one1g8k69s3aa2fgxtsc8rtms2vjnfl7hsuu69clcr", BlsPublicKey: "132d6f375a43aabd42f8bdc7e214fbe5db5cc32af75fcf33e93c7778f9b1fd21a1c9802631af71177ec5d6206e627506"}, + {Index: "261", Address: "one15fz8wntd6msjcv3dw6vks7ytmjl587jkg63hg7", BlsPublicKey: "2068391afe58a74cf3c9c5e8e680e9e4079b23d2634a74683b759d79ae4cee98ccc15faad6438203ffbc0efe88565710"}, + {Index: "262", Address: "one1njufwmsmqg3nulyvd69wxnjrar3vpu2fh3ex5l", BlsPublicKey: "39ecb667ad3e3c34d5a2b1697a6061860476320ad7f834ff51ff4aa7e5e081194fff0ac4dd14ce5899bbb4d746f12287"}, + {Index: "263", Address: "one1q2968ruuldcqhh2uuwy8vuj4s6n0cd30wfrhqv", BlsPublicKey: "100caf554ff39e6210eba0117bb48b9e29c06e82cc5adb6255e43db2f5a1b9d89e276b037c6eeb4d364a9f0c0f816e0f"}, + {Index: "264", Address: "one13a2awyra0prhrdnkd9v989g672l7mxzgh7t3df", BlsPublicKey: "031f6160b0d713aeeb1508ec21615eedf68d7d4ddcd5fb10a2194cf17da916afb4e403a6a445f786920eb11b8ed77209"}, + {Index: "265", Address: "one17t6wr4gum7rvurc3vyrq672qn9fq9c4ppre9r2", BlsPublicKey: "79b83e2d0a17ea2121c4bee3dea30bd9f9f0c7a184835a58d23ba335c5452e6414b5e2c567a38b121477894dd1eee907"}, + {Index: "266", Address: "one1jqw93gtp8e83fmfy0a7gpaw948suw7k2hvcpx8", BlsPublicKey: "6c30399bb8d1ca7e352d254c710fe502dff7eab63826226ad59fd02a29ad7c6e50ecb97295ad972f8706e3608fe65a91"}, + {Index: "267", Address: "one1mv5lyucrvvjwd649ut8g0sdwlakjqa6kxuey2q", BlsPublicKey: "9f5a3afa3aea6fb337fbc84de2093da906ba4900e662087c37962e6726702954cdefef1d715e5e76b2aebd99e634668d"}, + {Index: "268", Address: "one1cw97ddtaculrfdfdtnce59fqxv7enwll8danp9", BlsPublicKey: "9266cf2c4bb38f7e3d8fb8bb93fd8a1f76d31fa1180abf56d2d4ac97e359608497f4093690cdcfbb1c9c628c07b2a908"}, + {Index: "269", Address: "one12w54rah6rdfjr236aext53ux7qtrkwhu5kmwnm", BlsPublicKey: "c145e5bf02eb5cb5bab7ad4eb17cfa5dc17c41637445a0fd1ca16b35f2581b54c85ee9e85c5d06512d3e3701f066a809"}, + {Index: "270", Address: "one1yp73vhq5u92hkaz2ajx3y5mqn6dyq6lv5j72dk", BlsPublicKey: "04c77dd92e90527f691b4cac259c1c5cd20fdacf63c384c2ff712898bcfdfa6115ebcad953b45834d182b945bfd74480"}, + {Index: "271", Address: "one1l02n60v3xjxftc3hcp3e38z8gvu97f8f40gasg", BlsPublicKey: "0a54938a7a1c3a84a1c1bf2ceabf689e2bad38491adaca6064f1bf7cf2f96cacb28db0c6aaa3c7042ecebacfb5c4f589"}, + {Index: "272", Address: "one1543gh8ytzn533tq7qhpvs9s470ah0efq4tahd3", BlsPublicKey: "a3078595a45542ef848d64dd9acd7e2c4bd2adc44c019b0b8bea76e05d942a9868b32b3d0af305c605bb7a479f8cc001"}, + {Index: "273", Address: "one18uxsl9fpgc4f9s3leyg07uljjyv6awc6rl7hcs", BlsPublicKey: "5422b3ede3c8952c461ba8e23590d1239d0b0d0cc94c435d0a8c1c178a763d4dab5e76ae2141ca49b4e744f074d39413"}, + {Index: "274", Address: "one1j86vpfw0tckhzt60z8lpync5gzrcdl27xurwwx", BlsPublicKey: "1b815f7d2f4273b10135b8399b8f2021cfc176f41c00fd40a062eac458f929fb1e8ddfc8f38cb08f603a6ee3e15a2195"}, + {Index: "275", Address: "one1el80kkxzg0f46udaz802hlen0gdjscrumhgkr9", BlsPublicKey: "0caa9cffa2db7d8755052eaa7cecd03243f1c3c0c2b10944bb00b78c8c9547d93c3cbbcd08f3496d18a94f44f2831507"}, + {Index: "276", Address: "one14re4jwuuaxlcad565arng4rgshvdfzzrfkh4af", BlsPublicKey: "5209f43174586c64bab82370f24749a0a7c00eff79fbb25d538ee98ae6d76908b560eb339086e95b3f0413313f660a14"}, + {Index: "277", Address: "one193v3s0wdc0z4p6ttcy6kdcat5lhmuqgdasn7l5", BlsPublicKey: "5d66f1ebde76b3961784cd048f6a4498e1aa5c2873c45f4982d6a2f91fd365c42f501141393a370f7feca5637f804c07"}, + {Index: "278", Address: "one1utr6mmzwff7d5tnqsklqjup2zn5ghn4ghenthy", BlsPublicKey: "730dfa5caff6eab8202be4a86e62d025f8f5f7cb9d2c1a4781aee5c95b72c9d144e9cff8a3084d2451d26fcc20a4be90"}, + {Index: "279", Address: "one1fjm6lfteq3ksk0mark4pjydqrcgzeflxnhn6d9", BlsPublicKey: "0bf0b90657b9530f17101233e4ec422497f7f0a25740b1d075c60557b106b21898a41ed36184b44ecb3b2a4e1171c18b"}, + {Index: "280", Address: "one10zmkj772le7m9k05qh4t4dagudtqy3a80xjrut", BlsPublicKey: "b88e9d097d501616804a13fb60af504c791cedf72fabe8408999c9794eba772803419c60ccd97933ba1e37b49c261202"}, + {Index: "281", Address: "one198v9cs29xuz9hy0qv47adl4nypsvdhsdwunwmt", BlsPublicKey: "061281c0a60d30593ac6f1091e303aeedb581a330c2eb092238615c3aa1054576163feaf27c85f4063677020575eb58e"}, + {Index: "282", Address: "one10u093ejqppphv2gxysrfmsl02upnsr5mle5uvn", BlsPublicKey: "c76a3e27f95505a33ea437a2e789374d1d8d16a96bbd1aa44bfd3b2bfbccd337c0f3354fd6a988c8fae7a41895fb0484"}, + {Index: "283", Address: "one1vamwg934t68qq577dfpwhs8kmgun3f7pp68p5l", BlsPublicKey: "410214631a9a776ff16de1987d620b520d530f11dc09a85f5569efb084814093200c47ca41a7934381aa2ec16bd6588d"}, + {Index: "284", Address: "one1m5ntnjc3gsecar05w82d8naetu343t36cqcyre", BlsPublicKey: "9711347055a31f36d3dbb16133ae37e28cafa73d4a23bdd63db215b3096b253b1435bd789f8c1503ab48f4981581f905"}, + {Index: "285", Address: "one1fe90frvlxl03cqgk338z487yny0f4x6wf0322q", BlsPublicKey: "b1add675bfdbf7ceca01bbb142d76e5384ccbf87025b9540ed550622ae7168a2d1660f0eca3c909ea40c79d285dd3994"}, + {Index: "286", Address: "one1mfmwjpx2u5949m3ukkve7a8tvry9amkg9h78zx", BlsPublicKey: "e829ea79a6f9c1f5c5fcc7960615793ac1f5de5c6b4ca2f996aea5a3a4242bdf0d09d622a447d8fb9a230a6771be1f81"}, + {Index: "287", Address: "one19yg0g836cvqpwt0fxfgdk96s9v6h79nmjj70h6", BlsPublicKey: "96db0723e519d0726d0de2af29667213284f11a77a350943b0cde599a92f76b2a53ae656f3b24819ef56429dac08810f"}, + {Index: "288", Address: "one18cgw8wt4069zf9ssc3l3ma2wwyafq5lpch9akq", BlsPublicKey: "2de016929946cf3a795a99ac946ce96d8f1547458d01bc76bc1cb4cff82f109d19b4d66afa3131afb48a2c37bb679792"}, + {Index: "289", Address: "one1uxg3ah44mq3cskhqrxq4hp4enf9g2t9pxs4rgn", BlsPublicKey: "8aedbd7059e0fa82ba6d6a1561f277d136ba94a545a36358127bf175fe1c9cc759286f7ec8224c1d768420bac0f59901"}, + {Index: "290", Address: "one1ruqazd9qfjynq7gkq30lyphs3z3d53a6tfxjrm", BlsPublicKey: "6f520525795b085bbd694529a7265c3d435e0f8754fd88d15feb9ff4ec04ca782ee72650eb147be13363abcb5cd90902"}, + {Index: "291", Address: "one1pljy44h79lc8jl42run64kkszfazj2n33g3d25", BlsPublicKey: "8bc3922cdacfd6b811aa4f66eeda19b50bea77a6dd9d0f5f80820d877624e03d1bac00b8727afb3dfa648f2ea6f1ae19"}, + {Index: "292", Address: "one19lycefdkw4f8qms2un5hl0440shd20cv2w8dce", BlsPublicKey: "0e727b1732fa45869e5ffeb13bbaaa869294abc78be15ef096e39bcc601ba1b94c49fa6f9c199a0985fe4f885c3d0007"}, + {Index: "293", Address: "one1rrmh5gje343lh2rt7fz2fdpduz786xd0yvtyqh", BlsPublicKey: "bce2a930e4972f4397bd86bd92710d7b3b540a5ae17eebbc352919db1cb9c845590c39bef538deab3063ac648ac56105"}, + {Index: "294", Address: "one1kr5s0atszhjgkaxx604u3fdsv5ltk6u3llly6t", BlsPublicKey: "50703c01af5e944752770dea8c6c77f12bd11c855f8d9f4581d3359d9bd7579e0a7eb45ae9543c744eb03c81eab89786"}, + {Index: "295", Address: "one1lr9ep2cawf6sj8j0k23uagm59ajkpl9rmr7wsr", BlsPublicKey: "83cc3d74e0db1bc8d62bac4df1c2c5827f18f822498f8296cd5410c7e77159e45bee4a0e81e9c09fcfa25b0d730a7f81"}, + {Index: "296", Address: "one1hjc5crdv8aajupyekn00xrywr0hsmwy9984hls", BlsPublicKey: "e2cbd26c48bd87ae89b90cbeeca38efd2d21fda61f6df30ee31eea591a2626988ff6a05d5e047a960d4a83ee8f10f197"}, + {Index: "297", Address: "one153ts9f9updsxcffvp2jm2vdx7zjcc7x0mes8tj", BlsPublicKey: "b73620c7162448fb50c66b36bee4bda80ab865388b2c85dc9f6d9271ab584ebc3e0bf41bc7368470cdac3fd8f0ea0489"}, + {Index: "298", Address: "one1a2gjhr0rcgmeva3xgsms0l6wfnw9a8ekq8dhk0", BlsPublicKey: "857a7563047c96f4a260abd5e6aeeb4f18fb1f5770c9a9affb1ce99c408ebdde44cbec1d50a98eccb0452c2cc0e07308"}, + {Index: "299", Address: "one1njs8xn86jujh8yrgyugg6nwxtesx54j0gk4x6w", BlsPublicKey: "c1987c12343000a15e6e17d4de2eb43bd69897b907d04de2f628d59c45267985709088f5f0981fa8da5c05f80bf4a402"}, + {Index: "300", Address: "one1xk2wd37g3xhl7wqcnr9sf50w09rm4arn2cqpp8", BlsPublicKey: "f6fdacf9708ccf6b9dc4a9293dacb2cb0d2aa51180cb07f001a1c681211b87d06737c32234639f7fc04bab775f36a503"}, + {Index: "301", Address: "one1mj2yy2rju6ru3ltw68yl0ngvapscz5y7em9juz", BlsPublicKey: "a443ecb669182791c8bf684dbf27584b0cc1628e830feca733d42d32fb11a6f56a212bd6a9e1c55edc9f04872d2f0b83"}, + {Index: "302", Address: "one1tlrqhurlqv9ln28uu8st2zjjt9cajszk72yh73", BlsPublicKey: "fde1fa12c200b24442efb08d3715dfeac18414715174745baab78b6181ba8cba1f4d25a88e424b8b9b2b8b8d5237da8b"}, + {Index: "303", Address: "one178ugfal8ekldl0nwtwgrfm7kj3wpdnwul8869u", BlsPublicKey: "c1a799eca2400cf83a7357a644645e90408e5b947d134f46550c523c0f7acabab9550965bfd9d239fbf5eba57a730787"}, + {Index: "304", Address: "one1jdfya2qhz7cs6pva8y6nt95j4e9ck9gxjg0yuj", BlsPublicKey: "128be6950dfaf151a7bc9ae862954a338f650f6760bd8361e43654efcd07ef1ca876dae37d525b43efdcface7a243695"}, + {Index: "305", Address: "one1tzkhagxlwnmgfcaeh94vajr346wvd5w023lw46", BlsPublicKey: "ada770f143632c957f80ce3b5f9905e56b61fbfe6ccba42adcf8b88587ab93b882a5d2ac8b439e03d6963bfb5535cc06"}, + {Index: "306", Address: "one166u26rz8q5vz733ftvpqfhhz5h4cq7xj9rjaxr", BlsPublicKey: "0e4842b8fd4a5eba6851d04250f5c93281e6e34031a4e3bfffcb94286914a963a7ccfdeba48a87d20f6d0083df8fa608"}, + {Index: "307", Address: "one1n7vkak8fgv0mqsem5n8qp54686fyy7ce63dh3z", BlsPublicKey: "2c22c678f5a8148d00012fe2bfc94ed5de92eab1ca7b0331ffa25b089919a9784bd51221c7a7a42170b3d8938c093b0c"}, + {Index: "308", Address: "one1h3tqkc2qfl3c0g6q59ke4e0j7xyl0rk7m777f0", BlsPublicKey: "112a8320e686e0eae1dd2db6dd47c407c0e9a8f6cf37a8a52a55c9a4dfa020d269c1f144ce28c1454b9ae3cf132c2e0a"}, + {Index: "309", Address: "one1vfcxp9gcrf4s9eypf9zs9k0frx4asp38gq0hxu", BlsPublicKey: "9eb73ba9b0f0f8202632a272f2c3d8270f8f0ee39d44b3d174fac2741e603f020f47fe3c7f9ba982deb42702ff7a9c04"}, + {Index: "310", Address: "one1y635l9mnfz4cf3xn6sszerff2t7eqzjj0te5zj", BlsPublicKey: "40ae771098a00585fab1d1e00ae2ced6f5e37165f729e5bc1ed910882bb6bc18646adf15c00c24da2681c642e212ba99"}, + {Index: "311", Address: "one1m95cwp47745zaaw37nmwjr9ut9p9nkpwmyru9y", BlsPublicKey: "4878acf3d107127825f55ab5c0bad6f0191db0a3b37eee586ac7610e50ff99887d290abba54fe85fab88af6c9ceda583"}, + {Index: "312", Address: "one10ez7kqzq8kv849uppwm6sv8jr0cyuz09k0urfm", BlsPublicKey: "e44dd4511a5a7014f28dd0bc1a59435a93825f37071c72dcaa388d06cc74e31939c63ccc2dfd89e26fc672fcb53d7481"}, + {Index: "313", Address: "one1evukps9565d2epnmm087nctyvfl47da8ry34zg", BlsPublicKey: "f395ec04b0a4c56c134947708e1b4812cc34fb427cbdec44433977f9b666357548c06802160eef1c437601415cc4e68c"}, + {Index: "314", Address: "one1g7ppvnk5w4e4mt9jzsxfpmukm28c7uhnsayazu", BlsPublicKey: "64ee1ad74fd8941fa601be01e32866674eb0ef0c225ec9f98e637d9269f870a2f7c5f79ed5f6247d9940bb52475d4603"}, + {Index: "315", Address: "one1yflchzwdc4zal7q306sdjkrx2wf9jchnee5qv4", BlsPublicKey: "6ceca5ba3a5f3bcf5061de7a3af80176847f77acc47bd96cd6696208edc5508bedc085658bb74d825bf5721e60c9770e"}, + {Index: "316", Address: "one1y50frtlq59v2ga8qghdzh84yd0662uvctsav94", BlsPublicKey: "9c1378cf004ab9f00c8732bce6c17148596a920cc09ca624be84377e760cc3162a6d94560c61f2cb70bf1f6603aabf80"}, + {Index: "317", Address: "one1splf6alpsl3gnf95ur74f5ma5kpqv9tdx2e2gk", BlsPublicKey: "471383f9839f88c62617985d9529b03444b2a24bee8d98b1a8217860e0ec461448da368bc44be618716ab993e48ea10a"}, + {Index: "318", Address: "one1tv9wslmgwjz9a5gsrwpst9qup22xrxr4rs66gq", BlsPublicKey: "58ab22522baed384038b389a5448527651c99369661a21b66d455ae5a569b57d8bcf89dae4182f0a93ae1bccb162d093"}, + {Index: "319", Address: "one1emr394fep07txj6pd44zyceytk3rshppfwjuv6", BlsPublicKey: "90af588b40540eca1b3b98c7efbff89aab45a60f897c667437e000ceb95db472c101bc91c9273eb6d7a52f9309a66102"}, + {Index: "320", Address: "one1g2rhdk5wz4vhyq0jxrpq9fd0feuvgy8cufja65", BlsPublicKey: "ab48fb17a605de3442c664b7e1c0126f672c311364243778140ce7b96a38e12b39356c2d433eeed4018bb287dd408e17"}, + {Index: "321", Address: "one1s2dy5r8g9yxuknhzfswkwja8yma6e6hf2cvkna", BlsPublicKey: "d95da4c441b9805cb52c6d55df7e97f8869dbbaaa8b163a81b626cdc9d63ab8ed74d1a2f8e66e02dfb41888e44af3691"}, + {Index: "322", Address: "one1v270h40rr5a24mj7p4dg6qsqpzupuldskqjn2y", BlsPublicKey: "db3aaa6762d72c2f7e795d0a6a1bc8acd975ac8c858928465e10ca92f03920918cfa3b29d3b96a14480cabc7fa3ec917"}, + {Index: "323", Address: "one1tu0yppg7dxcnu8s0snf4nrcqpfzzftpn2eex4y", BlsPublicKey: "bebab6428392f1e1996028d0b6268bf4374b99b1ea30876dc638fb32b238be1c034b543a8292c9a5c6f99b64ed196e0d"}, + {Index: "324", Address: "one16gv978smepnddxhjvyfdnpmh4qfuygp5jjdvse", BlsPublicKey: "dc2cef9bb822bb2bc2c36ff05793b2df39546cfbc1018c6713fcb56ffbd99b7c7db96788da9899deab4831ca293ed892"}, + {Index: "325", Address: "one1wfqfgwk5yxeqkh9g5cqud4mk7gsnzdszwspe09", BlsPublicKey: "b55e5c7b138f0da4eb3978df8f110c8f082a2dfb548c2a4c3bcfa5691f2ca27f432b580f286bfbad0bdeec6eaa2b9b0b"}, + {Index: "326", Address: "one1sma85cxapr7hxvvvsqwhefe2l7s87fq3vu24wl", BlsPublicKey: "f924ad8f0d837b7fd11524c4b67fd886c65813034c6f861b4bbda19aac6471f4644db89201c8d34e90b80d16a9dd010c"}, + {Index: "327", Address: "one1q9pge35wenhhsvk9wnp5hzl2kjh9qfuyxujvy5", BlsPublicKey: "75d1fc0303271e2eabc4f94997de80f52b7ef24276245756b8fd619472bd4359f17460ee16e47f671bf09a7c60326916"}, + {Index: "328", Address: "one1nd2dfvhnw7xmvfg8yuqe0tjwwkg2u7qz0tlls6", BlsPublicKey: "6ba667bb92e5a555c575507010dd0ce5868eadddd51cf8e15c38b5a82dee0cd96c88f518fde7fb64ed3d88934cc83f13"}, + {Index: "329", Address: "one1ul7l0x4alhaqk6mf9stsmwlymlhzgj8c2w7hup", BlsPublicKey: "8041f098f4992ac32c01fcaa89322d36df01c239e19eed460cde7f83066676946c6f169ad6d5c2a86622a66a20fb2582"}, + {Index: "330", Address: "one1xg9szp32fvdzvn8zh8p8csj8p9fwujrypnq5sy", BlsPublicKey: "c67f4ff1e3ad9d0b0098aead774689c3c61c5510a9a7ad1017feb4ce38af6de693693e8f6d3c367804532b288cc90994"}, + {Index: "331", Address: "one1jlk30cvjugcwtaz6eypmlyxx35m2tyzfuat2ft", BlsPublicKey: "4e970c644c13489b1e9e9dbb0e70b3e21e5e72c5fa75faa4ad3826abc288c85b3440b51acc1a0528999bf1b082c28519"}, + {Index: "332", Address: "one1d4qkj84vdzcy6x8xsvxj5hr2v6nzzhvtnzw0hp", BlsPublicKey: "f36fdc24362add141d51a1331b70610c3b9c150b49c8643807b0b3e854542b2de3f75347d148360e76b9b8f033d14688"}, + {Index: "333", Address: "one1q0mletkc5v8ptmcq5cntgl8nr7un2zg6mjrgmw", BlsPublicKey: "1acd46f28bfb94ab6297a3be17c68cc41ed4dd29f99c3428ebf8122f6152e2066bee65cb0b1d170f5d1232edfd2b1104"}, + {Index: "334", Address: "one17elq4kfj2397djacumjdkf7y0jw7tkhkkh9f3u", BlsPublicKey: "39d839665964e9f0fce2479b9ceb44a8b0075df6807c9934e67eab40591173f7033fd56bffc8f4d541e1f8b6227efd83"}, + {Index: "335", Address: "one1eyv0qagq9x4th759jfg9cdu83tjyrgwnkjuysh", BlsPublicKey: "8d8fc6203e2595e0eb688e05e0abbb5b98c28b1bbb4710a250aab3fb3ab30883d6f49180ce2b568bd3e7bf9c0e983916"}, + {Index: "336", Address: "one1q9fz8u03kpdjakr5mp3mzdezaptxwtkp0ql5ls", BlsPublicKey: "6cf570a5c3232faa0b3f564e62e6aa2b80f5d1f678dc323dc0d954a8a543433f705cec4e327b2cbafa7c533a66b7a48b"}, + {Index: "337", Address: "one1fgxw9r528crt4593lla95g2ss6sxujkwml26fp", BlsPublicKey: "42a6e782a88301a6abaef1d230f982f6392c145803b8fbe21923d014c45cfcf6bc3959d5097e4ece48f4bd47e688ad07"}, + {Index: "338", Address: "one1u4ds23vywkdg7gd9udr203pt20k2rcjv6rrl6h", BlsPublicKey: "daa99209e92a05cd8c252d21b3ead9d389c207ecaece14f5988d64cad6c6e60bbf9b9ffad31beda4c8d52bc41f3a480d"}, + {Index: "339", Address: "one1msghamtyqgsfcx2jx0uxqdzk2skfhulrl63hmp", BlsPublicKey: "e3fdf1f226799fa83bae0122d9a684b6e7ea248e90156016f108c835e6bce8ea02c5e53eb5bf32c6a1e02a5fb0a2f306"}, + {Index: "340", Address: "one1htjdlhaf9qvdcxqhprfk6szwylkgw9ncdyedfw", BlsPublicKey: "8a57bf4487ff1d7aee1a70de444db72e223a5071fadd79d93881252bda09d565318dbc71ebae7054f79c708449155f97"}, + {Index: "341", Address: "one1s5xvysyky7xd99uxenj3njxk4krurz3e7fwhy9", BlsPublicKey: "1a837bcd5b70471080e96009b3f2f90b77979b5feabf361a5938adf66a4c3e12bc72dcfa1f95ae7ce26eed064185fc8a"}, + {Index: "342", Address: "one1ywhm9jxr66w872q57svdhhgcww6cy6t3u6qn40", BlsPublicKey: "5ff1db6e87f7bb39a89dac06f87072b64fa128cc5f148c0d9f4208d320910a38a64bfa476d230484372da099fce21213"}, + {Index: "343", Address: "one10k5wn53mj4nefdp6nyuqgf2ef7jxnvd0sl0umt", BlsPublicKey: "4054c0fbcd6d674faa1a14857d0e9c118e0290a0d8e6589317a70e79dd104c6f73b87120d9928d7791c787b3c197eb88"}, + {Index: "344", Address: "one1vr62ntjw5n0aehrsgtnlvsjjdt6kv02ejpww93", BlsPublicKey: "7d379c71a1621b4267a537f9a5e33e40448dd30be2b829fc091549b6fbe418e7b085119e85f2ad7d4fcfb59ca4ea2616"}, + {Index: "345", Address: "one1d5y3ahe0swze3ftaqpenqvafnxdesgzgglsvee", BlsPublicKey: "8bdf2150b80d07252c5de333be29a47ffda1304479ec2b7840f6ed7a45fcaf1d76133770d72e8edca925c52ed27a2e91"}, + {Index: "346", Address: "one192p6dnagxkk62agrghzxjq7zmn6vr7sa7gal9s", BlsPublicKey: "9cecda5df246287b31af744b3c90556587f175b59910c68af7b3a985ddd8ca9555be8efa312314d764a82203109fa095"}, + {Index: "347", Address: "one106nm2j30640z7egauhj2z09c9k854mnvrd5cql", BlsPublicKey: "763f5fa1b81fcd88b64cb9505b49111845761618e60aa761e54d3fad8141f085207a97cf436287ba4ac2ea9178d93200"}, + {Index: "348", Address: "one1qvmhm4jnallx4lju2zwcxtg755zkr89jlkgr3f", BlsPublicKey: "811cb6c08f4cdd878697168f62ca3b4795abf7ab35d673357848e993e9440d9fd59afd7d6702391e090d0269206f0504"}, + {Index: "349", Address: "one1wnwjn9dtvccrpplxmgkg7l4w27ttem4efmmerj", BlsPublicKey: "43a63ccc3cf7f3090351e82613ce838f89a527580067a485de85a8c64bc9cb61e4e7c52a35c8bdc19eaa60529d021f89"}, + {Index: "350", Address: "one196tlnc6wvgfnnpa4r833rnluxajwy9fn9eq4aq", BlsPublicKey: "b38328467868c5fb892d51e1162e21d31e473a2f1a8554b2c8a7b66be01223ce0da418af06d0662b4e495411f8e1ae90"}, + {Index: "351", Address: "one1hhvd7rwpm8ujeh83u5csx6rgsevlhp8unrffh6", BlsPublicKey: "0a105baa5f3118569e0f7eeabedd3c05d1c10266b844fc464dc96dd45d16c6b3bebb5a0d3f96fcc1840c394565eb7e14"}, + {Index: "352", Address: "one1asmcnesemku5nwq84e2drfptuwe97f68lq3zhj", BlsPublicKey: "b0b11c2efbf5f3e8c08c79a0310d5ebdf7422defe93ef09d8ffa0856bd245e820701369848c5c1a8231fb966f9be2a0b"}, + {Index: "353", Address: "one12mryn6hynnerl400cd5fm4yewrgvy9yuh5df66", BlsPublicKey: "4a78fa1ab764cff315ab7eabd4bdd95ec630ab46c97b1ef70f238f3f896b40a54e8ab653da165d4440d76de51cfbc210"}, + {Index: "354", Address: "one1t599se5986cxgqs9dr9km5zrtdssn86jyjf6tf", BlsPublicKey: "43a23ef4d63687c18a5fa676b402b5ea727ac60457bfdce8c93f3659f8ac2d3e9c13941f8382b401902a6210bb87fa81"}, + {Index: "355", Address: "one1t9ejh0gth5encgx83z9n3z4hnpphrvczrlangz", BlsPublicKey: "157e0216572bc9bf7299408a57d35d82467883b690ed4c3c4fe09d0288714b99f92963692a94378b0f53c576aec5228f"}, + {Index: "356", Address: "one1d5g8s4aq6zlauv9aaa5spn244n3cvurwrk4alf", BlsPublicKey: "f3df755d9dcae5ef279ca17b4a21bcb43679716411d79329fdc2b5219baf9d6ddc9dfe89a7d3a71121ac46f2caf82291"}, + {Index: "357", Address: "one13xrs7668dm0x4a8r77kg2x2zrwjxxe94uv82ky", BlsPublicKey: "6dadca1ed0539302c52b58f1e8e70bf259b30c9d22a8e676b3cbc57ed9caa891946a6090d1a050e4945f7c7b821e0294"}, + {Index: "358", Address: "one1ahekslqh45v4j0c5epd7xusqsmtq8ht3l9jkz3", BlsPublicKey: "817b5c673fe40d52e599ffa8939c4776c4e359e8466368ababc98aad592b58371d18f26630103da5a3c06d3b76024514"}, + {Index: "359", Address: "one1wvdlx5stdq2ye3cq5dp9qdkneytfryxvhvz4cn", BlsPublicKey: "ddfa0daadd98693a6396a0fbcec45c8b4250f903d5215afb2c473339ecf934cc69bc6d0d48bda7f9503956211dba7e0c"}, + {Index: "360", Address: "one1vhg4w7av4t2dusvag7uppqukdqgutv7vj50820", BlsPublicKey: "66164cc56e86775c18768e1b4bcfcd782800cfe7ea9c9e08cb3f4efbd52f3abc729985ea3ca0dd59aac8cc15e36bc70e"}, + {Index: "361", Address: "one1cmn2sjttv73qgnsr4cc9rrhtes8zw8ydt7m9xm", BlsPublicKey: "6aa36a2ced5b9f4f83726b26aac75488775a437e404b837b3bb88d9f51570942ce93da0f38ef7e6ee84fb7afefc2c78f"}, + {Index: "362", Address: "one1peuml4w9mydefctd74zsxpgl3n74jq0yuc0krw", BlsPublicKey: "0ef8f5ee8f885109e94da73496a17cf02f0241c38fe723bf6a7a177acfe4476abca26ad9adc0f03f8f4eefb95ef78c15"}, + {Index: "363", Address: "one1tedhn7kgyssrm35hqjnpx6algnsz6m7w4jsa2y", BlsPublicKey: "fe5315f1edc67f35d262eca1b5fa68519086a36e5d7e3b310ff06aafcb19e9e73631bf0b2154e4ceb28ddeb6da09e280"}, + {Index: "364", Address: "one1u8f5zdqmn7vw8lwaddglqdzc5mrx59maadhp7g", BlsPublicKey: "b761328b0643945f1975130321d405a02d0948d7ae6b0eb80d709e24965d3d70cec3f6042aeb5a07f1c3ffa477563e87"}, + {Index: "365", Address: "one1pmpd95sqd7rldq6n8d2f5z0d4zn47mhww9k5qr", BlsPublicKey: "aada780e27cddcbd727529c323c97d45ec756c4e3878d94b20c128daefe9c8bf03f425367ae430e268a4553d72337198"}, + {Index: "366", Address: "one1wuwlucfk0lyvyhts3l84ec8wxzyecarmasv8q3", BlsPublicKey: "34e940e00c2631b843e1097d7b33c1f9769ab3ff4447a6f7db89091d326a5d2aad62bd9401e6217e0a88d045caa8390e"}, + {Index: "367", Address: "one1xjzsawk9p85qvy4aepqvkpkntxlv0ncjanth9l", BlsPublicKey: "797fe476dae692a7a8f6aa7cd51c66540357315a4b2296dbca9152a1f17679f81dbb4f50c4d51875319b5184bd8a8395"}, + {Index: "368", Address: "one1h2quxmxqcw9stl8cfw07sejw5wh74z8gag9rfn", BlsPublicKey: "522cabf09fc31c7a5a8c37ebb242db8cdadcee47ca21c19613bc7129edce1e0ec0906221ad97850394112b9d96a3a286"}, + {Index: "369", Address: "one1gwdahhe5mm006dx7kjkrwnu7t3qa4uwvuqhr9r", BlsPublicKey: "e3eae20b23dcb2a8232d1c3a5f529371881d132519ec4bb64e1950f4d20dd3e6d0bd5a6a2b07ca58d343aab8b3dc9c8d"}, + {Index: "370", Address: "one1tp9lc0rgqhw3um0ktfy6ntrj5twutfnwk339m9", BlsPublicKey: "0d2f638cb6a18621fe9f29aa2ca0e6f2bbfa0f67b6b54d71e87833537145047455f4b028ac54b259ff46c27fd707ee03"}, + {Index: "371", Address: "one1k4ykpnacr56puye5qvkpdvpacruv37g0tt5xtz", BlsPublicKey: "081fa0d7a6a6395b54b879cec9a81f3a37265c5e10dceb5ee0e7b0ce08946ca1b499e4dd9b678c03db23dc0c10021805"}, + {Index: "372", Address: "one1k2je523cgk8lzgyhqfthdx7239hnfft2yqaxhx", BlsPublicKey: "722acbccf9a8a047088610dd520266e16fd4ff0a8fbeaa0dab7040b3d17d8b1569ceabeb2ab742c12a4775358be14f15"}, + {Index: "373", Address: "one1pk84lclhx3mhtkxysyv78d5rmexcu6ps6vyurh", BlsPublicKey: "c9b5a19fe70eac56278637275b80f0a6045ff922e86904836b21dd10894ce3c8a867ca784b971c5adda4f749cadda682"}, + {Index: "374", Address: "one1zvd3v4nx5ek2fykhh540j3mf8d0zqh3qkj6k4c", BlsPublicKey: "29a3fffa6aa36bc0bea1c013894aaf97e9730004aec3d7aa5b474aa62e04da2e68098c78d0f84f069147161412db0485"}, + {Index: "375", Address: "one1hg007ywc9a0dd9nqz674sgytvk2t8mxzuemgut", BlsPublicKey: "d44faece9e7ccac4a5025693f4b63183ab2d891c62d3bf9fc21bbcbf35a17f03d57c12ae1ede4fb02f3311e8ebd68d8d"}, + {Index: "376", Address: "one1fstudnv3kj4ayhmhhkqnh3rdkh8yyntz0jkpc0", BlsPublicKey: "000421a9ea6f9d0fc1b3fbd1352a5182beca978475528a8e40a07580266b089ce171319821d565a6f0b5714b1e8dbe00"}, + {Index: "377", Address: "one1jw7a0v80tdluhtvtpqewt6422cvhtrnchrumww", BlsPublicKey: "c4b452323485ff97e5dd9f9833a2e9fa9591911af6eeb3176d82863aa41bfa7f0dcb0c4b912919ffe0f638a2c8c43a07"}, + {Index: "378", Address: "one1zjym64k57pzvl8t8fcydl68p623h2jvsm8mztx", BlsPublicKey: "f686c1dd39c039360f950de7bd0ea2c405b95332a2af41fa1b311448484cb98261f1a6c4cbb36d61fba40b0113046c96"}, + {Index: "379", Address: "one1acezne8pg0chp64r8kckq22ng8sxfmc6gukgt0", BlsPublicKey: "8aa013e982e626228c1d6920736fe0e4dc7b14213aec9b1cb2328e8e4d4be709b7d8d44b1c842ac95182148bde73c994"}, + {Index: "380", Address: "one1y50u0ynaeqgfseygz283czrx7m2hge7089ujjf", BlsPublicKey: "1d7f77081a79c7f813652939b49a3236ef68481822a607a2ac4a50844d590fb9b2d6a78caa374d5daff91654b42f1f82"}, + {Index: "381", Address: "one1k079zvk08uehvth3cny99r88fhpjkyadmm8584", BlsPublicKey: "a2c7932cec7b8ae33a94e7308a74d2d5411fb65b970e41e5916172ddca9e06bed36ededfa31eea3d9c8f28213c2a4d91"}, + {Index: "382", Address: "one1g6s2fe67zadz3us268whwv6ay8uppymrjuwq45", BlsPublicKey: "68d86785cc03103dc037dff250271e3ec83d30f822676fef92ceb5803a3ec2ec5764ecbe474a5d5f9fb16b1f55a97817"}, + {Index: "383", Address: "one1l4tee9k8rjz5llf5x98r7xstvzg5m07p6hwgdp", BlsPublicKey: "428a7dfb579bed664287d09b0adb8a888ebe16c5eeb93427dcde214ecec84b0ba594843dc45336cfb43b08ca26a83490"}, + {Index: "384", Address: "one1aglcgxynflye2px0q7yg7hdfjfqr5nlrr0euar", BlsPublicKey: "a176167bb3f1283043a354bcbfcf3e0825a61dc52a497b0068e258205ee7a0ef5021b0110fc37c8ecd09763c893aed0c"}, + {Index: "385", Address: "one1tnw0m523h9xawutv3rtuet5y0gaec8lc3v8gz3", BlsPublicKey: "57875495e203174d6bb07e0ddcbb6bf7f0624103351ffb8183830ce6239a93c5a8b2172e95af71440611f30696d6a18f"}, + {Index: "386", Address: "one1lnxk4c0qf6ytzmskn3krv7t44hnkd9fmjgnt6e", BlsPublicKey: "b935654106581d48863c4303f68f6fa5a238d9e1d881c166fe17daba91ff8a1b9d95d661317424ca0891258895825519"}, + {Index: "387", Address: "one1lnfsdlh6dwmht906dhjdeakxhnuxcq7cyz4pqw", BlsPublicKey: "ae8c9f09a2d7fa08b487d5de3c8f6e645f5f489f57fefbef5a1d5fd0a87fd5665e86def5ff12eecc857dea2447550b8b"}, + {Index: "388", Address: "one1pqkqjnwefqryzwpxtpfh5yer2d5x2md3qpduq5", BlsPublicKey: "da2ac15815f0fcfeb70a3f9e2bc9f1942d3bffff6faca15489eff019883e1fc7b45d67cb2fd7b16c9879d0bc11609412"}, + {Index: "389", Address: "one1yx68pwsn3x43ha7ndf5wyg2lx3ph67e6ucerl4", BlsPublicKey: "027ffdd3d9819fa0af64ba7c9daa6a309434e63ed06c05ca51debfac10a0368d3f60cc588db5af7d5bfd14594b159314"}, + {Index: "390", Address: "one15j0dkusdx8hyu6cq279wcqly2fnt3a9gy5s8gy", BlsPublicKey: "edc5acd1fea116428224dbe5851f4c70007112d343bfea751985f56f1358f5829f43752b8e1065d46a33f4b69f3dc00b"}, + {Index: "391", Address: "one1aj67q3pe8tx2wy65ztj62fgsyt9c2k3m5het23", BlsPublicKey: "9c330ce448138054d59378580d81cc799b9e4c56b66c70cc7d733cbcd675c3e020a606541e34eb1f2e4fc6f5bbf4ac95"}, + {Index: "392", Address: "one198kasdj0cagqjvmeydx30w0eghnqy3ugnvanxt", BlsPublicKey: "9396e9ab4b75fe7ba8d7ff972d4cd8cad4b321a7716133afadfbfec29747bd753c9bc3a6c1117fe01d1d486dee820f00"}, + {Index: "393", Address: "one1trgw58gs092uq4dflr8frmq3rv3fnmhnscylqe", BlsPublicKey: "83d2f6e34950501412c733bdcb1b51ba35988528f81ec85c1de5b4cc122d20d39ec043bd850ac78288c1e64d97c15b0c"}, + {Index: "394", Address: "one17dp3cvfanjmc3a325gcw6jq4fe49j5jpv5f9lg", BlsPublicKey: "d715d497123ee56065ec24f5a5695d85e41a8f02cc3231cd9bf43b856acb571c54ce79864de761b4e090971cd82f2017"}, + {Index: "395", Address: "one16kjswz7kuc3d8u20ww9c0cz5usty70sllsatmu", BlsPublicKey: "e48e67a7b15ccb64a73917ceba44035cfd6f14e2c9e5d12fd1c7215f5adb449214a78f9eceb09d2e91e6ee0e1b869582"}, + {Index: "396", Address: "one1zdyaqav3452xmfpwa206wdrtjmnhmrxgru8zxv", BlsPublicKey: "59fc18e251e66cd2c6250d3e2bfb693c8c7c0193e0aa28d7aa6a6d15e802ff3dc6650f386941afcc602060fe85e7df16"}, + {Index: "397", Address: "one1kkvxzgzgea6z9zyxs8cy8cxspgstj27zyarddp", BlsPublicKey: "c3ed2e64d701999fd35b740405c82bc4f6d487d8c782b47ecb1e451e14c6c9fe7c762d299fc71533a0faef978610cb93"}, + {Index: "398", Address: "one1k9wkcsq0pvrudl8q5t67fnw2hy250f60qfh5gc", BlsPublicKey: "71f048d115a970f3f5189772f7bdc7bf7fb56fba7677af2440b2e345b3ceec55d214382704f9f9347af202ea98617787"}, + {Index: "399", Address: "one1dalcepcuxyh5nzah6a8j9ejfxr7hewpcn929hq", BlsPublicKey: "7ce470084c89fa4966be1524d7ef445d41c9a6bdfb2ee4cd2b4781b05d2d83a8ac12dca451819df327e88f820b832605"}, + {Index: "400", Address: "one102p25rre0grvnd7fj3een54u0xstruwxhc8f8v", BlsPublicKey: "eb57d3ae9632087a556565e967cc8c5492576f582e0d180353fbe9d4e23961d06eb5d739f53c5dd8803abd3de3c95900"}, + {Index: "401", Address: "one1seuz3mkn037dp3sa65w8h0vfv80cju0qpthxqm", BlsPublicKey: "daa4c51059ca0c61db6b0db5efc380b5951ac02914af17461147686f647998ed8ef89f62569f87eb3a08510ea2460403"}, + {Index: "402", Address: "one1ztmk8ywm5ypr7y2hcrp05r9263n7dgznjy37kk", BlsPublicKey: "c153f060db868639702ae2df0aff30e1966959df6208a921d4dda59e7df4d9f6db0a303c1c35d9b1616ab9a74db3c195"}, + {Index: "403", Address: "one164m0smpxswlmlpfawjvp62zqdjyrkfanp0h5sk", BlsPublicKey: "1aafe8f933f258f946127e7ab56a7d9630a35538a54c61ea5fd37a999d39f104efc0986f207f63c6f180f2d65e353518"}, + {Index: "404", Address: "one1de69hpqjm3tlesychcmuwgg7u90d4ds4d0djvr", BlsPublicKey: "cbbd81263607d99cf78db09508a0b7576e74bd27e75363e3c521e1576ef0cef01d6c907619f9eccca832ad2e85546d97"}, + {Index: "405", Address: "one14lv42q3h0288yn290u77xav9qmntvks0j7mc5g", BlsPublicKey: "659b7a1216317dd84e7c1a7f7122712b90ac3b1b41fd4d2390996fc74081451f950731de42422131b7c3b56f2e294b03"}, + {Index: "406", Address: "one10eu65l9g4weladqfvrnf3vqqu3vd8yn0v5xnn3", BlsPublicKey: "b2f58205853cb485e88bc5eb127d14f38e6ce788a634612f8532b9db5ec3d2563cd35f68c3d8f4e3a263b42410ea8003"}, + {Index: "407", Address: "one1nqc79vnur702wjnfu76smkg9r848cvvvm77jql", BlsPublicKey: "cb385bdc4812f295ab101405a9a4b2d6cad3a4bf87f06f572dcf16d534187aad749b3d608113bff89557665872054516"}, + {Index: "408", Address: "one10nh4agyhdf75jk97fgrczjf7hkm5s9vaz5zrq5", BlsPublicKey: "737f5cc5e4d81b3f2924cef34979c61ae8f5585e5a22940c0a699acbe7223da3bc7b740b7186d006789d83835833ea8c"}, + {Index: "409", Address: "one1h4ql04xwkzparr3h89qug4q02ghvdl8x77fyzz", BlsPublicKey: "eb6e0d394632ccc2c42413b11a89a02f8e149bed1bad107d88fb3b191b65cedaaed8b1061df15d0944bda86ac9ec2505"}, + {Index: "410", Address: "one1e9c8f6kyre3wtsjughd3fetpx4mca3l8rmacu6", BlsPublicKey: "7edca3de5dcb59bffd659f129efedb7da13f7b20d8d36ccb8abb2a718ac9e44a27ad8e19a65762634106a5ac5a601785"}, + {Index: "411", Address: "one1jdgeqed0slawnl7840v0yc3dgr4d8zgmjvumw4", BlsPublicKey: "bd2ffec46c520f9c96a386e239304bcbebbcca8139bc241a2a7b51e12a9ff08b237dba0e81b3350ac05f64f47a214901"}, + {Index: "412", Address: "one1uzxek0zr2a0mtgk7nm593mvsg3zkpa4p6dxhdv", BlsPublicKey: "7aaaeb629f84b0924d755121a31a97c77c4d1784f68a79ab7d42809a8f72d88064b1390a503c6e671b51c734f3e9fd09"}, + {Index: "413", Address: "one14k5cywc9w3tf4ej5c3pdcyr9wkxzcskwj7dnsu", BlsPublicKey: "9d159a7c052ef2dff1bef59659b0912573faa08f7157fbd96f2d15b63ac48c7c8c798406b3399a968f49e0da4fad0081"}, + {Index: "414", Address: "one1ndyyfhrjhkd6m2d4shxzzcfmmd36g0y5gxhtav", BlsPublicKey: "fff1425277b14b3d89fd9b8eabd21564bf8a36bbe785852449489088d6d10544f6df12fff7e1e3df6b40550794397b91"}, + {Index: "415", Address: "one12zt4w9t6ak9rzu59zpz5uj8mljmk2j6wxm58pz", BlsPublicKey: "809c72adbe5c83d164945cbe758e60da725395cff72f72eed5245b36ab779b002e9f1b5aeb3f0ad052c4b64a6b64c183"}, + {Index: "416", Address: "one14yfgwmwa8t65uzv2ylj2lwea3dce93ja0l9fkl", BlsPublicKey: "233c0ec56a712f3711ba47c389455bf17b260fa1828fea4a8f41586557dd46765735addbaf55661319304bdac0519d0d"}, + {Index: "417", Address: "one19jjcwlgxrqtvp24t7tnesjukus7k9s6a5v7slg", BlsPublicKey: "17b761a9ab2722ccfd0554c56c6eb1640389149a21b3daa964af94fdcfe949f2e97c6f144e1af20545e04642e4649717"}, + {Index: "418", Address: "one1d2uzmy5d2uk0erudsfn5895y84x9eu9j8azry9", BlsPublicKey: "8bf4044cf70c45335ad98cb3450bd35636749fd54b8dba73093c80b25242989082c5ff7c4a7cdf830bc5ad318197bf0e"}, + {Index: "419", Address: "one1mfmp7l4jc435q0rn48j2zvz7gqwp5tytfj26sj", BlsPublicKey: "208136dcf85e4efa3c5e21e8576720db339cc53934ce87b046a398e29b95280518552da77d0d695b88175a8ae0175e8e"}, + {Index: "420", Address: "one1zkrrtuqda3ky8tdh394vr6dl7p99ket0e9rurd", BlsPublicKey: "59ccb8a8340841f2100ab499f4470cb190c41c6c82e5cb62ce1572815f8651087b871fd67271efd32e8e508545932288"}, + {Index: "421", Address: "one1y6sg355acgx89ehza7vhta5hswxp2wlsvs5y9h", BlsPublicKey: "afc0cfba050e90c9371157e5036a68d4484950c87ffb79eedb227504ffea97f361b2b9c2304e7c47f2b228094db9578c"}, + {Index: "422", Address: "one10nldft4f2qxkfjwxmmkqvfucmqqgayga5qe8p4", BlsPublicKey: "381649d41c8f5d667e6737439f62aef3cebfa82e7f8b3d72634d6d72d177f54d2f7de5c36bfa85986ede4282a8361715"}, + {Index: "423", Address: "one1yg0h0vphfpql4ktrkcyh9fl46ajnqesmn4xaey", BlsPublicKey: "19abfc752b9292a5106c4054d66e1b1afb93e3ab61336251e00db98eb5ede8f58221fd20815d2cb59d046085f7654694"}, + {Index: "424", Address: "one1r4g5grjua8ksgstc7qc2sm8nc0fcln6gj4fa2j", BlsPublicKey: "1ffb0b13dd540aece62befaba6493c61bee1c71f3b5b312d0445f4399a155c5d5a4e46350f35e9fea39f36a88c51f80c"}, + {Index: "425", Address: "one1drzf0fmaq3un7089d2ul6gga4jthcjg79ppkfc", BlsPublicKey: "dac08c8670e4cd6c76d9396dc86f5b7f621c8f829d37f0eb5b9f7738519aa15c2887598db06b10df5c28a938f0048015"}, + {Index: "426", Address: "one162apeck4845xdurrpq88ddtwgxe0440v7gkw6h", BlsPublicKey: "757708574ee58370d6d3f5b874ffdf9a0eb850cc92101de0dfd435cb6003556f8a3ac112517ca94ba1203b35e43a2f8f"}, + {Index: "427", Address: "one1c83svmlgwx3g54af73jfhqfymeu530hywnh3jd", BlsPublicKey: "27fb696657c24ff0d0d1f4e505ac0daaa1d2810113eaedc23a32e828725aa74de5514e617fb7081180227ac50327a508"}, + {Index: "428", Address: "one1ep0dnp627nm66f45sejasedwfaqlkaau2mlwfe", BlsPublicKey: "8666169f5e764f396b9a9e6e3cdc43e8ef39877f333464d400e58eb047b895fc0f4370810564f671328a9c3eba790682"}, + {Index: "429", Address: "one1fph7jvdqwf092vls7vfey6qzml33rlj9zgjhvm", BlsPublicKey: "5eb110b4edbf437ec1efd9bfd4e2041f1fe21cea7617fe87f1c2d868daedc2612c1b348fd3895038dd8c0fd0856d1094"}, + {Index: "430", Address: "one1rk8q0lw8alf6pftr76qc3y4rp9929npc80fsxe", BlsPublicKey: "7b503533027dd40ef93891f3b88679fd599bc47df2f2a34c4943fc76126d2bd4c24d55c15637b5b73a452ad25552e519"}, + {Index: "431", Address: "one1cxyz9y3k05e545hu28uwwdlcz9nu4vqvjaxpu2", BlsPublicKey: "711d6fb00d366f66f7a98e5c5bd7b7ae8e8a65477f759ed8a26064dcabbc6f86c79c3968555f3322711f6f5162192793"}, + {Index: "432", Address: "one1nw8p9329trme5wx520cuq3yd4ad0sfndjzkfsa", BlsPublicKey: "7233d0bdf44cadc82e218d7cf8bbeac1e579d546bb83ae3b1ac8c0841d72846755a5a001f43a7cf053f78ba9b476c611"}, + {Index: "433", Address: "one1hp2j4njqyu2skkg5lftl2rsreqkzgt3nr8a3cq", BlsPublicKey: "3ea65f918555b1047f87c1e26038eca63a9fabc44a5c6c1fa7c1fc845d790b31fc183cc97d304718027efbd224500697"}, + {Index: "434", Address: "one1ptt4436sask06ypau6rt66lnrg0anhh07kpy2r", BlsPublicKey: "a23ea4ce6ee3d6f2e0695cb841f81e682588d562c5c47c321a2ee8565c5950199341fa80530a93897320a60e1097f808"}, + {Index: "435", Address: "one1n307jp9k8xhtjvw6fce8z2w355xev3g6un8uhf", BlsPublicKey: "2a3b165e1c552c64f0f93735c463c2bf646aa3cbaf698a02fe0839f9ce54eacc6e81cc51579f23894b253c4279cf6602"}, + {Index: "436", Address: "one1jf9l6k5mgjvrfgdcxw27nljchudsdr5rmwacg4", BlsPublicKey: "510ef860407195e3ebebcf437a39201a553f63fb4bdefd3e557576391f261e9d4ea9850a7fd48166f83248d32e22e011"}, + {Index: "437", Address: "one1gddcwggqlxnfj7mup8h2xz45h5leguxfqf34mj", BlsPublicKey: "8206e63d81c89eaa88d7a8384c50daee6033fe9995609d9101bded6b7bc4da3965e024c52cbc5475c38217925653e200"}, + {Index: "438", Address: "one1tm8y0q6vsfmxdtn4g8xw7xyuhqvcmgt8s6f2nv", BlsPublicKey: "2b3d7449de91abf7de645380944928eaa3714938640b05c0ab391a11332b8fb95eeca45ff6ba61ed05df15f8337ded17"}, + {Index: "439", Address: "one1rchse5gezd898q27ew6a8qf2xwx62y8cawl8sh", BlsPublicKey: "2b5f9afcd9854e6fe5b822c78f59f44aae9c46b14c04bbacc5bd0f25bab7a3b2847339fe101ad8c4d2ad258ea8b97b81"}, + {Index: "440", Address: "one17p25nw8zupqnyse02fqu6lt7xg29psz3wcv73f", BlsPublicKey: "77543094895b5707265736392bb2b19c2f8fb9feacdbe99c8bcd8597b6118a4d2615a00e28974da27b434f59d2f00f0b"}, + {Index: "441", Address: "one1uy3cmj9vqdx95q0np3qvuscs5u63zpkrc4fe0x", BlsPublicKey: "35800ebbc6d92574c87db72e30e24c5ab99b40fef5f5ea476396b8172b6d01a390d9859a732514c87fac1f893def718b"}, + {Index: "442", Address: "one170t2n65lxj5aq22592hx8gvy69ek5g3l03x9f8", BlsPublicKey: "8f390edc6c12e5b9cdaea12f66cec1439c96e972157be861934205725be383bfdd7862cf73245a36abc0be4b58567413"}, + {Index: "443", Address: "one1kf3p33gr4cnn6m53x7xgxe0lxtcf4z56vmgzyz", BlsPublicKey: "34e3b248eb174b48105c1219098d6ce161e625aad888dcaea44ba1a8147bb1a8579452411d0c323676a2b63ec02bff88"}, + {Index: "444", Address: "one153gu54r7ssqsap2sgr0re3h0spyq3t58wgfqxu", BlsPublicKey: "2a72d09c9683e159c83f48dac5c8138af63215650f58e2c73f0f6981d5dde1e48bacd64f586404bc379add15d1940983"}, + {Index: "445", Address: "one12ad74qp48gdydzgua8z9zzz5hnlmwt2j8ktzyq", BlsPublicKey: "f9707815a8e08a0123f33cb9399f37da4cb1dad7c20757d7b5656f4e1f5f6495157ccdda3599c7ef813395bc63b89103"}, + {Index: "446", Address: "one16ne0jy0jtc2a5y648jgrt3zknxgd2vhngczfrq", BlsPublicKey: "af5125e8a28ac486ae70c1121a337b29283e08cf867f1386d65a8c651a3f662785aee9840aeedc0004049e628676fb8d"}, + {Index: "447", Address: "one1kjl6xrcxwrz4hg9jfvwntz43umykq78vj266ke", BlsPublicKey: "2f4d4fc79894150a05e70bd778f3b8bd250c7018dd411a07ebd310aa01eaa84d54237772d9412744cafa5dfbc2fcd515"}, + {Index: "448", Address: "one15ukp3jmd9tfcqc36368q8mdkyckk6p0the0ejj", BlsPublicKey: "f1bbaec9c4d9e896aee09b0de25e593aca88d8468ee690396746530ffbe7b372d0377aee21ae91ca9def48d39d73ec97"}, + {Index: "449", Address: "one10aqss34janxpj2y8h4taltkdv6wjqnzcl9667t", BlsPublicKey: "409d33aa47607bc566a15a32f3569fa520e3a590408940791b9e854d1be60214416c652e9c687bc6c2e5f903e63ca218"}, + {Index: "450", Address: "one14mgrygqp283ang7vh75c6csavf3fj05q89l9fx", BlsPublicKey: "af7d5fcd2ae5df29f748fd382e063ece71084c2f2f3a8bf7c46107f2b2d62b6dc8551f3c4bfaaa6c9b6bed92ea9c2417"}, + {Index: "451", Address: "one1xykchhsufdqxs2elkhkmwrsqz2f5tqyfwhkfaz", BlsPublicKey: "97d6dfecdfde31e256a010e163b4a820e40847147938fa3b59ccb329703dc3aae0e87b852835597f62dff496da695087"}, + {Index: "452", Address: "one1uqxjlku548nj9sw7rkfepayu2r9r2c4jyns2a6", BlsPublicKey: "af68df3f815d23edc86f4d90d9c1eeaf51e68fe1ec1a9b4b53b7d7887a1660b38d95fda59f6ebbd0bb7a753bcb47d68c"}, + {Index: "453", Address: "one10ylkx9guzz9f4rvkyy6dk3yz0z5as9qpy5972w", BlsPublicKey: "bc18e9e300df55a13ef096fb359d80863c571562e4ddd8902472671bde1975938d48ecc60948fb28f14e8485e535f115"}, + {Index: "454", Address: "one1cx2hz9ktj2y55xttm5prynzqmqj85aa6j4vn4x", BlsPublicKey: "ba9be46400df5a92ca4431e162f28f515fbaf7ac8c5f9b9f95cd9350796c51df17a2bedfcab257880d9ac704bcfab216"}, + {Index: "455", Address: "one1vsznmjf32hvrew8scskp97sl80xf630d78r43w", BlsPublicKey: "ba523c63742ed28f0d8e3cab5d2503a93f3292d4f48f7013f6cb93029ba63482e1a476525c2ff226b3590622af76a787"}, + {Index: "456", Address: "one1ly0cc87chyjm2f76zdrx0qmanvxhsjfrquezwx", BlsPublicKey: "8878279ca22d9613ccce50b8aeef6ff3565394d6e98037fc175f7bf3aa695daffefd93a40e50ac49412ac31a2b04e38f"}, + {Index: "457", Address: "one1rg4mjnae9lxaq0h4gyedq73dx2n56s3tpaxrdf", BlsPublicKey: "3714d9ba6818470ccd16173fb40924848f39d7910874319b359675a78d4b6aa1dbf8080223a4536745d37ac4abd2b893"}, + {Index: "458", Address: "one1y65plk0vthjyjzu9mlv4wjq88ug59tznmsfwgt", BlsPublicKey: "37c3589bc37d49b50b019ed194230d564e0b2b9ef144b29db7801a9ea9237cabae7a097ac4c97e19423d8ce268a8e001"}, + {Index: "459", Address: "one1dtmnzmtwq32dnxruuufcgwmp8dg2dvur5edrw6", BlsPublicKey: "ecff773fc644e5ce4007d7f2b86da66d5eb61f16337b149bba8e6dc4e9eebee5175b40b9602facf4e23d4ce20ec7b905"}, + {Index: "460", Address: "one1zlgxlc6awgcdlcfydadxk3flkakyqu7mku7x0k", BlsPublicKey: "d6fc56a4d175eecfcf6407ac58c4275c2cbe0503936718cbd47c39db1ec25881692df79a12be5760d38d75820a61378b"}, + {Index: "461", Address: "one1nhg0j352jkrzx5afc2fvh5mxqy6h4msetmnca2", BlsPublicKey: "f8d21b82e13d06865c1a10230d02964b0aab4cbc71e17f72749d5c26aa86bb167b8f92a912c3d857ed31b827d26d9e02"}, + {Index: "462", Address: "one1asuwzh0lf6m7wwst560refa6ygn2g909rwk7d3", BlsPublicKey: "293fedcaaba97ba504b6741d66d55904d57d0dc5f4d11dddd913c9d44cb406e1cd31a2ca12f931c8f8ccde322961b310"}, + {Index: "463", Address: "one10nqxcgn3586gprqwekdwal0f7zkhjde42e8sm3", BlsPublicKey: "fe010abbda83b0e7d3a7937e65a5bfca8c5323e0feba9c5fbf9bf9d3e3359e5c30a2673a2b64dd4236e09b6740648000"}, + {Index: "464", Address: "one12225v7t5j458yj5v6ukqx9pvhpegdeyn8kgqg5", BlsPublicKey: "3585d9edf85dcb2b52e7028e8d283b1102199d28978ad1cb566c40737532c1cfbbded9a052950b570a8ef910da8ccc88"}, + {Index: "465", Address: "one1lf7ldft38p99m7wnv8usdr6er07myl9cl70h4e", BlsPublicKey: "51a160d544640097d96512ddf78e6bb062a1a87c234701dcf0ad3dbece63e2e0c63aaf03be52845280d518b762570e12"}, + {Index: "466", Address: "one1waskvmndu72xn5725ku5qzvlpznje9zy5jdu0q", BlsPublicKey: "03bb35d7194e4fd5f2606d0e3ba838c3da5a4ec73af1f82a6b1f1d07cb7d58fa567be55761de828218a9214dd2109a0e"}, + {Index: "467", Address: "one1uz2l8d5aflfayhyx3nk2p6j2fmkh9w23gj2zr3", BlsPublicKey: "133257c37bf004f525daf16fb88b2e2a0254059a25f9d875e651c5e596c1e5e84b858b824477dcfebd0e032f49c2a584"}, + {Index: "468", Address: "one16t65yvmatadh593vf3tn9unhzqyz2ks45jte05", BlsPublicKey: "62a667644f6a329ed331970ef4484bbb3655b01a7772115095d60a3ce57a1efa759aba2297b3ef17bd2b76f66152a687"}, + {Index: "469", Address: "one13dz0xsvtutq3ddv2vkga2e9tuxma8cxw4xmr5s", BlsPublicKey: "c6ebf22219c0462e711e0e72645cc7d6c4a45217d75da1fef486a5cdb6d4ac937e08c29003c9db07667386d7c8267916"}, + {Index: "470", Address: "one1eklx0qy777vh6ja0n8as2lg4wefcruecxwlm9q", BlsPublicKey: "34d08cbabacd7f166fa349483aff5a9295355a7c9c998c447492ccdeb14adee2a56f89e47c771604e1b6b9e1ea440602"}, + {Index: "471", Address: "one1fqv8rp7egy0au9ll7mwk8txwgrq96tkpd3yvyr", BlsPublicKey: "6bf405140bd7f4b2e33ba67b1450e7863ac9e16c60a71bdebe073a7b0464f8bc78a185c78049ce078e47fe3a4c9bfb99"}, + {Index: "472", Address: "one1uld6wxym8h7qj0us5twnq0vyddywr75jnnm0qd", BlsPublicKey: "63adab1cc4b237269e40838d039eb6ef3135e74e1865679181f0184135263c50260bb16a5908e85c496d6053efb4bd99"}, + {Index: "473", Address: "one1fc7nt3jfpsney4y5mt83vwt7tgdugn0es39hk3", BlsPublicKey: "cb49bfb77fcbb72685750c57401eb1b7ea816cd30078b22a1558a5a56986eecfd36e26893979f36e826d199112076b94"}, + {Index: "474", Address: "one1unxtkxrfyxscus7td5d7es53vpkyd5tez4xfra", BlsPublicKey: "8f06f2763b0f4881194204b83ba9f59a4c9240566d63f0d4d9398ffab89b9e815886bd877f62dd318515dfda5a16e00b"}, + {Index: "475", Address: "one1myrlg5h6rxyt29z4dfkcx9zlpp94yv0c4vduqu", BlsPublicKey: "a985115268612af45032ce3cb10548b15923cb18db86ce15cab5b6609b0906ee7501f3b63c0cdb65faad1e01991e0c87"}, + {Index: "476", Address: "one17y9lz2jtj38k0lfxd5w2u6fr596x5rxuyhahgk", BlsPublicKey: "977a1ef78bf03f8c843b33a613bfe049a7a9e85f6721fb99c5b971bd378106b5153c078131faa9876fb4d2519333ab94"}, + {Index: "477", Address: "one1uz3nu50a2rdzw0n3uxj6x8cz708wgzluvqa950", BlsPublicKey: "2c6386f2974f2536cb6c740f1ae7430f31dcb219b2330b1db531a4f61db57561b6ac376239f83ce9b7a33637c8b0d798"}, + {Index: "478", Address: "one126gl40y4rt3we6fkqd2d3frf4p88levuqfkgmu", BlsPublicKey: "6c095636504f88db7667df1f59db4ad10683de130b873f7a241769e496af6bb24b93ad6b7141d21230047ba4ece5c192"}, + {Index: "479", Address: "one15w45pkmtuqxwc50870ksy2wp0fywmlrkus0z65", BlsPublicKey: "b7f3f701751f63679c9b52b3e8d373030ffac489f78c049d84575137d89a3af2250612150326d086eb99c0f6ec701b91"}, + {Index: "480", Address: "one1hz4etxcmrw03sx0877fjwngf0vj2dae0uktm5r", BlsPublicKey: "0429ea4345fc629758f22946da1fca5646d8140ef598733733208eba886c07e261257ad98dd1b741d3f7e7153cdf9417"}, + {Index: "481", Address: "one1ng0m8z49uj3q93jl9ekf20anakw4afzsr9fcku", BlsPublicKey: "5b2cc8a4c61b030ab0c972b6ba91e1a967f49eef2f764ef521322fe1e979a5ab6067fd21da70b5383d5ab22c00cbe916"}, + {Index: "482", Address: "one14dklfcwfqsq5x5j4amh5wlk508ek3f2mkayes2", BlsPublicKey: "abf56fd676c8816e6e479f4dd40eef0e91bc5f41e7ca0178919f23d72587ba83672873f57beedb4d8f00107c58b7240d"}, + {Index: "483", Address: "one1dy4nmx7vqhnfe2cc6sgpm6uujkzv0jzeuwkjac", BlsPublicKey: "f2448f92d452e5ef78922ec5a6aeee1e735b43fca03248926e74c5d5d23f282135242ab5a77b41a17d41f11ed33ae190"}, + {Index: "484", Address: "one1j8pa8rr0hd644myuk0fnr20ffqqxgpkzcj5hgj", BlsPublicKey: "5cd87e156ba90ed77644a69bc5ce9264e730dea48fc47d586c91d6e570217e9c547dcda71c6f84c487ae285864eade8a"}, + {Index: "485", Address: "one1k43vq6trvqe9aemverz6puzm7f3gt03v9u80et", BlsPublicKey: "8de74b8f6e8b29d2710148d7c6638c571f59e77f63660f28b46b2ca1bb94536fa4e03fa0e09c8872ccf58a4313729f05"}, + {Index: "486", Address: "one184jetdjsxx0qerm9wuxat37qtchasyg7kwwz9m", BlsPublicKey: "a30f14278030287a8411dc167ffba7c766294be40b4966e69978740d00596baf525e5f84c372b38a45a2c31039747093"}, + {Index: "487", Address: "one1swkyc829yuhwfks8gv3xnpej023pacw0mn4u7u", BlsPublicKey: "095d67067cd3fbebbb646d487d8e7c3b23d5b21d8009c31996cb3d856b86515ce461bac13e0c3702cc738988ff30f88e"}, + {Index: "488", Address: "one1p2gat8jpn68rnrw3snfqr6cuec2henzg00fn08", BlsPublicKey: "cd1c94c961c583297b323010be91aa2e1e076bcb7683b547a4b90e4663687263e8bc446746e737ef3adbbc25ee932d94"}, + {Index: "489", Address: "one1x5tzp0gr8hjmj8sk38x4afujav6ynfjt4uevnn", BlsPublicKey: "0e04921cdec3ea47039695271b87eff91cdface5ddcdcde83a67543c2a9ce7cf787b7ee9779564cb0abe70381ad4ad98"}, + {Index: "490", Address: "one1yuufndygu96lc3jggy989z373n80k0rrlmw33k", BlsPublicKey: "85cf91df247e18a86450c49dcd6e0ec002faae459e71cf8cfbad91b822778ddb9828c85e4ddb2207a282ac98d1da1916"}, + {Index: "491", Address: "one1k3f934fcl5dx0f9g6rgap4qlasxytn0dycdtwc", BlsPublicKey: "106bb097dc3da7385adbe34411d3341306752951d29f6c63ada4b0d5900f1b83b8c1ee254c681bb64f20f97516f16117"}, + {Index: "492", Address: "one1hh02dgwnmyhenn366w6ltkxhcmd2d2rkaxdzzh", BlsPublicKey: "eab52bdd68a14c185672f59d19a472e0cb3e7ac6a2b8e3dfd1d273705dad92d943f7d0ae5402ff7fb7044e8ee4052b89"}, + {Index: "493", Address: "one14qk6qx5ur0ap2wc0sgvmh88p8nu2hjr4zss8c3", BlsPublicKey: "b324c5d5a76d4d228b34ea0f31b219e54fbff229cb93cb6af342ea131081544dd59a7fb65b4eb6bf443f4fe427b13b0d"}, + {Index: "494", Address: "one13cdrtldn5ud0yldqd4val8tzx30jjxnwervl0t", BlsPublicKey: "1529ee8202e431580296bd76e883c3a941c4d8d23576a952d1f202d32cbbaf4444feae9096d1d2e9f4d188321f194f01"}, + {Index: "495", Address: "one1f3s992svms3jle0wv2cdjcsm4hfn5mj5qvjc6a", BlsPublicKey: "3bdee48c8002e08f15c2f410abae76de4f8cb77fb894d1958663259a68a5350ca7ebc3f30821752008888c9dfb07c604"}, + {Index: "496", Address: "one1464krx2p72per30tu9hzdu4j3807439egxlqrq", BlsPublicKey: "06a16f6c98dd3859682e76a22f1a59ce3831ebf65da054c8948acb7ff997a5f42a6cca04bc4cc030cd5f67a9dec9e393"}, + {Index: "497", Address: "one1jd0tkd3f2jcgr8svx6kd08qxn8r5xk86jkscke", BlsPublicKey: "94eba7b382f8174f40adbf10f02126d8c2766114be62dafc65e43ba34e42108ae065903678dea0c4bedd41352b38af0b"}, + {Index: "498", Address: "one16jkzz2aqsr4vx57pa0uut7n3dmul52aqdg4sm5", BlsPublicKey: "f487b495ad433d8a95e312438cf8788060bfd8e1c2d82e2a615ef5e89a3e99200b6a80c40424e65fd685096f58802109"}, + {Index: "499", Address: "one19yefwy4yekcav6pwq6hjw3ajk7hswqz24a3kf7", BlsPublicKey: "e08ced673ddf08d1cbcfd55c8d225e076e3bd9ce8bb7a63ae28a1a4b5477c574347d73f287b41a2d7e951c996cfe7d19"}, + {Index: "500", Address: "one1jt80jwx2lmufykn7w0aktp77rd9p8qsjmgq7ve", BlsPublicKey: "4277ff21bae29827b04ed423f94e24fd19489e7f72c8e9da166cab3b80b6dde72ac1ea3e62bed24921002f99270e5e98"}, + {Index: "501", Address: "one170nahs9qp6wk8qkyllcg355kdr2mc5jdl3laev", BlsPublicKey: "7285a582b7eb21040076e4f1dd281f48cbde1b4450d179e47633edbb1e3072554ab329ffc2a560045388c4cc5f2d290e"}, + {Index: "502", Address: "one1e8nhcy9j9g8az7f36ue4c20gfc0j4t42v553jj", BlsPublicKey: "e62554eaa0b3f2e1c290d0bdeb757a5ca50e740b6de46cc250b537f005b8b5e7d6dcc69ebef015ec7f5b2bc852ab1d80"}, + {Index: "503", Address: "one1se0zhkf9pgy23tr7c9phmpukuexk3wk0hackyn", BlsPublicKey: "3ff2d62acae67746666b31960c67a25a84c0506a2f44dfffe218ffcc78223d41d46e72bbc790afa152d89df9bee4c110"}, + {Index: "504", Address: "one1nckkwqmh0046q6kdtscwpss586retx3je95gmc", BlsPublicKey: "09a66e8b5c29a55cc719f21e80ea8f6ce8c9128ab179d6ab7c80a2fae9b631f1b11ab51e343b91262aaf7bbeb391d218"}, + {Index: "505", Address: "one1c6evyglxl0aawn580s9hk5mykr7f9dd6lmqkff", BlsPublicKey: "e14c185c4080d2027a4fd7e782669ded556944da455a0ca6c4bb38a270444c6651310df5c02adddc25ab727149cb9811"}, + {Index: "506", Address: "one1u6x5kc3zqhyj74w7sq4758u2049d83qn0ykqjc", BlsPublicKey: "8ef0863c078f5fa387ca8117c5663cab421804df9c878735cc43b4091a29330ef51ffe8ab06f8042f04b78857c6dbc0f"}, + {Index: "507", Address: "one1phkyjk80aryr2dj80phtptrm43kxcvdxenzzem", BlsPublicKey: "86758bc4e7c8add216649143ebd30ef9cfa3b113c7e573c4ab351e7ece32236c353590d0ce649bc25bea61e5247a0d00"}, + {Index: "508", Address: "one1pp8h0qhpncj4vv0nsndwy0yjayqnuqmd24jet0", BlsPublicKey: "155e6941e6cb33afec6fd146895809b1cd507751fe3fd89593278d5edc5455616ed69b9787bd4f6d8e6c8ecbac638701"}, + {Index: "509", Address: "one1fz9w586ce9q4679zr4lpc9xxa7w4waq58lkrpk", BlsPublicKey: "75ef646f5f19e159621f1d4e1fac7d00c532e87c183bf9e29b383bcf98776c0d0274dc770b23e9321c6be628fce1d08f"}, + {Index: "510", Address: "one160r2hvj3l5trvws2u7mgdyn5uf57zu73ju6xz9", BlsPublicKey: "9664fd00e6215a6f92985c98c8ded526f253f9e321516973efd4c4f76d582467d46891ed8232ba1b3fb407fc376eb104"}, + {Index: "511", Address: "one1jre5mvuzy5v9j8ep442d33knc3jjgq6tkm27aq", BlsPublicKey: "77a81b65b4c3182f3ec0d94303c24a1f3767eb91b9f93e52d8561f09970f3ade8c1df86e083d6917a4b022b36aeef08c"}, + {Index: "512", Address: "one1wpeela9kfwm97w0vkvm9j7rxvg9mkfdzez4qlk", BlsPublicKey: "7a4ced916261ae82991c202bafa0802aebed65280552520cdbfa32b2331ebc84065ea3fa7ff51216c8dc474e4a195085"}, + {Index: "513", Address: "one1x0vycxkn54fzc8jcglxfqt983dj2ppt7g8l5s4", BlsPublicKey: "c58d29bd5114007b722a2620b47587f6b1daacaccddf7523e92cbe8e650d1c0f5f88650160778d52589dda36ac01318e"}, + {Index: "514", Address: "one1awc62g09lev2tx5ylmnqmja8enntgwgju9hxv0", BlsPublicKey: "c326b964bd7678ac277316ac7195e70e4d6bf7a49940fe7f0d8daee8be3a765eea9993c70891884e83f2c1e825633389"}, + {Index: "515", Address: "one1jsa650pyet82f3nprrave5p64jxd7w7gsjw5jh", BlsPublicKey: "253bf0bbdfbe79451bdf614ff1f31f96ad8af46876952a7c4b5a0425076188ad43773ac72494148ea7daef06ebdac000"}, + {Index: "516", Address: "one1tzuhcuypl98xuw73ut6pmg8s68wg3m994gt22s", BlsPublicKey: "6ff0b2cbdb167fc5e8012bf15aed46fd9ba7930cbb9ee52a861f028bd1d62fc7e733fa3e9af052db77f8d0fa281a9f10"}, + {Index: "517", Address: "one17sfqfap7rrlmc2kurhx9ysqm7srn4s02y5afsg", BlsPublicKey: "946bb415d1e8560004abace56ca1dd492a0532ae2e7d10bbf719354a2bb6fbbe52bd74f10df20698b9282caa994a040e"}, + {Index: "518", Address: "one1pfrskah2trpu7r2ydfvqp83h649uvd060cjua8", BlsPublicKey: "7e95d5e977fb371bc95f5b71828934552909877330ba79ac508673d2586ee8de993e49295bbf57e45f83cb9e5d85c804"}, + {Index: "519", Address: "one1ks0pmp4defs09pprj3cx55ksyfmmzfpc28ffcu", BlsPublicKey: "beea91aea9564f58f0b41d3a2ebf070ccca81f0519d8b70abed3f32eefcdca728b0b1243f7872181a45392b8d2429815"}, + {Index: "520", Address: "one1zt9tzr25u4k9lnxaelr4gd705ejp84yaf5n7gj", BlsPublicKey: "8ac279d281a334f1e52a8edee0b4eba4c7a6fcbf85176e38fd18fcf3be5a6f9b2438ecfafd7e22029f6dc4a93b379014"}, + {Index: "521", Address: "one1mytyyl92dtp6ajlka9y0zywwhg0q992xqg7v2k", BlsPublicKey: "90112ead73dcf618581285890bf0f053ab386f43f25f2aeed6a6177ab9b1950f1d905b59d6a5c3ba3fe01a0e7ef76104"}, + {Index: "522", Address: "one16vdjxd2la7ffs9eluug2udvf0sdq66d8a27a5a", BlsPublicKey: "92cde8cf5a45c44de5d59f4ef0e5bc6544183cc2e81ed4bf657ccc3dca047978490630918b5f8112fcbf9da17360bf94"}, + {Index: "523", Address: "one1ywj0yfulmtmehfupce0ygcnwtfxlxdaaxl6hph", BlsPublicKey: "fae1840d31b12b87335df866f4556897e09360c578f727aab5c74beec0fdce6fc11458010d7a22db14c81fb82ebeab85"}, + {Index: "524", Address: "one1tujj59xqf7p588ngynfk5f4vfx20gahhrlwhel", BlsPublicKey: "7b3eef196af72fa421eccb90f2a9dff941e0fb1ce4ee50f5daf31501a5c08385f6f24874ddf4a48d27b6441d85ad4688"}, + {Index: "525", Address: "one1wqf7p384reqajmukxfdvsl9ssl3h0jjhw28tyu", BlsPublicKey: "a27c68bf9ed2f29e09167028bda5caa6dcf027c78a1dce1af0a810c88bb6c63b90978967ac34f85d49534dcbcb9ff48a"}, + {Index: "526", Address: "one1fl8a9t5ffrdaet3q9w0h9ea9cuvrws22j0wmhf", BlsPublicKey: "78e9d77ddff244f45cd147f56afe549494e5661edc1d807db611e88527d6ebfaca4e7d54a83e7223b893208cd0f8f880"}, + {Index: "527", Address: "one1hh02kfk9hnc3psdfyvyv2spfw6cvxfmx3sxe0s", BlsPublicKey: "f6c442ae041b1da1d040ffeaf06828faebceca1ab84c2fef541e3c09356e49fa854ca32b6f72358c2a07dec9324c7b89"}, + {Index: "528", Address: "one1rjgjfgg02046ur4yw5t0s9rr6jdwthr3w2vjcm", BlsPublicKey: "5499b00cd74924c8b99bbda9cd843b2657d8d6295e5eaeb0e9def4399c11290092a67c68a96c76d2e01c298a39483e15"}, + {Index: "529", Address: "one10xv98qeu0rh3zu8pxpgh58hgcsq9wgfakkunjr", BlsPublicKey: "360124c1327b8e1c72c87113a8616c9965e9a66a2ae1613f7590ed101888a95d7a76d97d75c967cf7f85a57682100197"}, + {Index: "530", Address: "one1gpwhp5esamrlvwtxvyjkh9re505erghkqzvsgt", BlsPublicKey: "9517f371498eb94cf918a86fbca43dd1a1d709bc4e87acdee4ef0d3165a29d1b97684f77fb977b265614606c45cbbe10"}, + {Index: "531", Address: "one1v5dnggd3vyh2f8lxhdwm4tewyw203egwwrdjje", BlsPublicKey: "8b32ee5788de2026609ab6d3d56c6a2ba19077fc62cd93bc9462bd81a64ccaebe2bc7c361668bedc1ae03f67ec4d6209"}, + {Index: "532", Address: "one18adpsyayjy2s3rqzus052jk66955ruh8fd8h93", BlsPublicKey: "4be98cd6a58203d53fd8afe358db2832bc93adc79d78a662d265712f60550d816fdcb34e55a3ab03cacfe24a99052505"}, + {Index: "533", Address: "one13zn0rjchmnpnnrcymug70fyhsp3u9pkr37psnm", BlsPublicKey: "16b9c7d19234dfcbead1fa596c8e6b774819491288ee3132a05d46ee49921cad6f21fe832e28ffe86e0adc057dc98b0b"}, + {Index: "534", Address: "one18729s57ndrcp3v5tfxn8ceqsd73nxvlc0vwy5v", BlsPublicKey: "ce2f3e854ba0ba75fb7235f6db320802853225ab57f480c8c06f39ca42fe345e9bf7197cc5a06a07d3274f4ae01e8a83"}, + {Index: "535", Address: "one1q5f4h2t9yq88fgrpd662ktjffyymy02v7u89yp", BlsPublicKey: "3bde3a7832dfa7eac5947934773f7a4285b3104c697b4496ec214f80f05b950bed0791c731300579b4353c27984c3e98"}, + {Index: "536", Address: "one1d90s2asw8mwhvmurytxuu38xucmcxuv9ek0jx3", BlsPublicKey: "c06d115929b62b0838a30357eb9ecfd2638683307e41fb8cf28a4553988be59f8c645dd6ae921b5326fc7bf94be35d0b"}, + {Index: "537", Address: "one1x60rz6vxn33yewvhvgqad0x4vwtnv5566qadvd", BlsPublicKey: "ed9bcefe10445f79dcd98206c4642d631ad6f2ad7e73dcb6a9a31d997c11d3a7b7c0b4ad72fc370f29012e378e6bf610"}, + {Index: "538", Address: "one1yd672ssk083tkhxdsae4qm2x4ux6lreehwzffn", BlsPublicKey: "18bd9444750a0460b8e432842cc4827fc2ddb60b498ccc2ee3fe3fbe695dc3b85a88cc1a8e0ba462f730bfc0764d5417"}, + {Index: "539", Address: "one1p2wht4kgj2que8t2enywpemweruashs26lttta", BlsPublicKey: "bcb4d7952febd1c130b62cab40729670715a89e016bb07f1e23600a65755fe7a9e8cdead9a028d43a8a0db501c137b99"}, + {Index: "540", Address: "one18ml9svhzcxcp9ml3h4gp8cmnxeay6ljgqqjwq2", BlsPublicKey: "bf353f9b8f6297ee4a0687d742db8dee493972dff795e8be236b8505ca3edcc896f55ed169b98093d33b4eb6b3171a98"}, + {Index: "541", Address: "one17g3q79wxyzmrwjhu3hnejkrxrumg3jup25c7m5", BlsPublicKey: "e769227fe3abe015196f9534862abad5b8ef115645b840aa66432b0146b5e9fda6bfd674b23bebfeeff117ddba26b50a"}, + {Index: "542", Address: "one1evdp62m6lw8jeny32tvcfchrhe32tjvedhwxy3", BlsPublicKey: "b9c27f289273b169301e1c2e0cef61df58275c30d004f67a517c06c8a9b4ae4cc181c04218f12581613cc12dd94c8519"}, + {Index: "543", Address: "one1ndq407vzltynvravqesjwwe27y70cnj5r5s9kp", BlsPublicKey: "581cfd2f12694c03636dba3d4f511b5ed56acfbc82240234a1f6d0ca8926484bf87483e4b2c8dac6782a45233ee11a93"}, + {Index: "544", Address: "one1ktjlccqkzy8ksnfpu57rrps5dvqrrzj74ryzp4", BlsPublicKey: "c456350e40a0d2d13f7a0de89790a3cb4e51bdd325da6dd7dc1e1859d64e904f64e971c8729435db0cad61c3f5dbf20d"}, + {Index: "545", Address: "one1adxhf3jny2s4hkddhpcxps4wdg6tk3alcmh9ax", BlsPublicKey: "666d2a6b9d8336c97d9defabdfb6d1f4a82dd812cd07c2e9045a7f60e9fd999edce3d29dd5eef301cd0ac73792cebf13"}, + {Index: "546", Address: "one1x2uwspg0s9drhqcxhl0s7p90wrxkhllzffuwkw", BlsPublicKey: "89f017b7542cdc42e52e8d90e893054f6debfd629193ee94636a34399bc3a2da1739e5ce4c520e21e181114e8cffe601"}, + {Index: "547", Address: "one1me7nh5ed2yhhe8ljwj8xzz8j8mnlupkdh7mzlq", BlsPublicKey: "52fbe63333925f07b4317b0c658b0b57cf603a84a58e746ad1abd86be65f31ca067493632179ed7e3e70e6a849bb6a08"}, + {Index: "548", Address: "one1gz6mjfrn7jwghl0r7xctjgrj6x3u7jhq0dxx5e", BlsPublicKey: "3a2afaad51f43d07ebcc36a2b4cf3ab255274c6a85c230a3cc68fe524feeb8c052447d1d95f0204ff41e3d8c4be8d989"}, + {Index: "549", Address: "one12fmgrv45f7a5utwrqrd26txvas8gqtezkej364", BlsPublicKey: "8b988af5d8b558319e23a1af0bc553caaeaa753a03bdd1315db9ffbbd81bff6b553b3cc85f43972360d3064a77507006"}, + {Index: "550", Address: "one1mn5d335jykkymv5e454jg5x6uelr7etsg6gudg", BlsPublicKey: "803d55fc0d2867977af2fe9ccee505eeecece828b09d580fcef5eee83cbb91e3fa83c0bb9bb9cc044123d59547db398a"}, + {Index: "551", Address: "one1gphlgyu85fgjwc8fp4nd0g57hdas7qpn704uz6", BlsPublicKey: "105939fa5f67f937cf147e9a71d566241e01d168087886462e9ac9f8678ff784ab129daf94089c5765b380dc1d784e87"}, + {Index: "552", Address: "one1pjjlsuvyvmcuv0674c2hdlehpj26dpqlnaeyhr", BlsPublicKey: "ff7e5f8f6b661b10e3d8617834bf4eee8f388d6aa832073be772bb6c01810011cbb0e0c7282eeea613e88a26f82cd90f"}, + {Index: "553", Address: "one14n2e4ehhh63sk37y3sptzs8lcay9n8nv8cutwx", BlsPublicKey: "0ce3aa291bea2e26e0ea7667c31d433c043047b85b042d72e386e3d24e3a47c9540b7da12b3e82a94589ac80cbbf8888"}, + {Index: "554", Address: "one1smyg4yg8vzhqdd78vl0phlqmjgt2txkvul7r4w", BlsPublicKey: "1c52a644dea597a8e7c149df0167b472af28ec664cc7334c903052a47eac0d7533fc970a402c23eee7adbc85bb3f0798"}, + {Index: "555", Address: "one1ylm3rew5xfpcqzznzxw3wyfmvsqmg9q9yc40wx", BlsPublicKey: "b78bd1016acbf2b752fc82e5649198a18edd0a8dcfa939d738ebc95622b06e7ebb47c040073a077e0da8f0a77d6cc380"}, + {Index: "556", Address: "one1q2ykrsm3jl20nse6n95dpfakgfhepdph685jgg", BlsPublicKey: "6cf0012d95a820ee0b9ff2445709f7330b38a874920784ffbb349eab6a43f0b56486b6b35bc8e0b4316586a539a08795"}, + {Index: "557", Address: "one10yqh4s0l8xg9g47tylqdsx5fyr3wh7dwrpmfxr", BlsPublicKey: "a6b63c1ffe10707d6a021ee881dc0dcc21f6a8fecd9053c01d86a1c2413afd55f4d693e41aabaed8dfc2c2705589390d"}, + {Index: "558", Address: "one1nlh5tyyuhmhngge8t8khl6jfa4zjcdqcsc9mmr", BlsPublicKey: "21ac261331aec38ecfe85e0ef6e179de0f5544ebf9f0e54e2ed46ba0fba5de2483259695e53d3133276af0b16adda910"}, + {Index: "559", Address: "one1y8n4n0dqsryse2pxxefeew3r408q2kja6gwxlv", BlsPublicKey: "0098935e6de4c232a54f913638f58658f53a22fcee3b3d46bd8cc945e3db5b08fc8e7b95cfacd7984d281e1b3a2c8099"}, + {Index: "560", Address: "one1745pfacq0w8utftphx6ulq6evda38zdv7snexe", BlsPublicKey: "6686154a1875183a630b5d620972c50b286c0c250563a8521a85452725f0f10995c024a9af12ca207093d44ce86a5613"}, + {Index: "561", Address: "one14u3y80er3qz70afz3rrc0zuefhz00mcl0dagmm", BlsPublicKey: "8ea2266317425a7a71baf47b98d1224534a8730d11f9bed06992ba49ba599851a47d37ad4b210e79a8334cdad1940318"}, + {Index: "562", Address: "one1kp9vld04pzp2dfxx4wwferjqy94yumd2rsncck", BlsPublicKey: "09cf094729865edd68c24598466d59180aef46db8b24822070e06d070519441109baac25d3a6198104767e5c852c070a"}, + {Index: "563", Address: "one1835ceyrhmazaw60fx4kxvjzh3xj5y0zrv3trt5", BlsPublicKey: "dcdb2139d6429b52824ee02c72da470707b5889947b076469830ec1f88eff8904865dcaad6c548992bcfa6e962bdfb03"}, + {Index: "564", Address: "one1697g4jxxmcg95jzj8spc9vdmfgjr3g8fje64uk", BlsPublicKey: "01a846bed6cb6062a877f29b817daa9a94a861930562d2a68440b14dedc49d6ad47d0c2a393634e4512d2cb5ceaf3a81"}, + {Index: "565", Address: "one1499ut0n7y8zqv5ljpg8ys2v7jk65uw2t7685ce", BlsPublicKey: "7ff99300bd3fc9a4b53870de2f518904d9b752e133464f587db49e31a45973b49e79cc04f48464fccafa04271f138417"}, + {Index: "566", Address: "one1gq69u54xw28ttwjplfr7065dqmky59ea5m0mv5", BlsPublicKey: "e82401d1529e9db1906f94d7ca39eb9f34ae4c53f4878467c07e1d3530d69b1cf9422bf05d247d7742c482167875f312"}, + {Index: "567", Address: "one15632cw7sz2pxvz90qk8hkncvc80jyr3svgredn", BlsPublicKey: "9be4505f862fe7d3d2a492bc8b75bd05cdd99702e7fc29f9df2c0cb7e4f901a9a1ae73da5b34d6e1aa3f2889349e6c88"}, + {Index: "568", Address: "one1dqrytmxfpe463tzqt4ats26nmk54s6lt7j9mnl", BlsPublicKey: "76fecd0a20fd1d3fad6dde13b75c76c4ca9a17434075f50fd60cb6eb44dee27cfc4b62344e73fdb519c976c55b5bc20c"}, + {Index: "569", Address: "one1xsuam67qrtxekwakp2l7r62kwqvlwylqlrpq7a", BlsPublicKey: "168ad3c7b489c9970b78b82513ccd158fc755117deaff891ef505a973326e16da70e5d88ba07d7e8b03058878cdc7282"}, + {Index: "570", Address: "one129a2ptn9mhkxxndqf8h7jls7jmtvfu8en5425n", BlsPublicKey: "db596704d3d96ac060ab837365ed4c2f689f72b05d6412323448b4540be5280bf2ef87b08626a448e58e564a1dd81a81"}, + {Index: "571", Address: "one1zeydn45csf66zldt4m7rfpnr0hsxatha9hp2l8", BlsPublicKey: "05a056159a809e7c67c1635510c78529d80b108d87f0c3ff6255ac34c2695ddab3945a6188c95dbb93d1579601825990"}, + {Index: "572", Address: "one10mrdxc0tnxac59dm820dnz3a9kkplrhndxqquv", BlsPublicKey: "efbae74188c0e26b0eccc5434a32cb4a684c8f60bfb468da555fad5cb5c6ca472974193f65a64da86ecc38148a95a287"}, + {Index: "573", Address: "one1t05pftz5kr9a24lth8pa6g830n0jrm9ex40zdy", BlsPublicKey: "b206dcb8da89b0c4da55fa3f94c459aca3f730a1543c8e31889267df4892499feb5454c3466d71575bcd472eee686e98"}, + {Index: "574", Address: "one1d3ca4x4rz9m2j6ynktju8s9795j92qkdydt0zh", BlsPublicKey: "d56e5fe2d59c95432e19fac30ce745e3d699938c7e43e940718ce78820cfdcadd1149e4b9262589d6742f30f9b0cd285"}, + {Index: "575", Address: "one1uf697pksklwa48me34qwdgm52f3a40yx49cff6", BlsPublicKey: "44bb33e08aab87644139e4355719be9e513b646b2a4206f6d17eda725e49b7781f96b730c67ae124da9d387f897d000a"}, + {Index: "576", Address: "one1fhp4gtgpwc5htuvtnhcyaue827zgmanwyv456m", BlsPublicKey: "926baa496dd3b03d92a31d2bf66ee37264a29cb28f93305706b2258785cfa7e670d482266e2cbdd753e129ae575d2205"}, + {Index: "577", Address: "one14ffnje94s8ndt0m2r4rlsu6kd786c9346tpp96", BlsPublicKey: "e2bda64d39263b2a449542499378e3de55e20ed918b307aaade39bd4e34668582f905b411890c14e4ae1ba4d3b41b693"}, + {Index: "578", Address: "one1glgjct7aew598m05q50jza7ha4kwfdq345svca", BlsPublicKey: "df46f2ad132e6a46fc46bc37ce5285e1b070250156ea3731c583f8a8e2198f04a5ea28738ab0ffe387571c99ff5e3295"}, + {Index: "579", Address: "one1emsg8xtejrntjudztvq5mqsqv6u86ncyn9l6hv", BlsPublicKey: "27543bdcec4ba3ee9933700c2dcae655831282e73e575ccf12bb7607e719f20928c27976c1123bdd230ce8696bb02814"}, + {Index: "580", Address: "one1uw5hp7da6av9ahzj6jakkx2kdazlm8yld8hjqd", BlsPublicKey: "7652a5d13bf6631a87394173c0e049cc8b361d2d225052acbffed7b7a4b09fb3800a67296f4e5bc2ba36e0019ff1378e"}, + {Index: "581", Address: "one18xz3z8ectmcrcsd6g072ctzxhzdznrlcvhcxkn", BlsPublicKey: "75b7f5cdec94fef5e4966b41d943df8a22a745c021daced7d0e53ce025cc30e3c0772d3125fc9bd1b5e4fbc5e1ec8b80"}, + {Index: "582", Address: "one1xmn8kzvxvvacd22y3agqnjhwknyxqe2r4hpj8w", BlsPublicKey: "137bbf21dfb1b10a588b8fa1c4ee003c549ffb03b64a687933280523c543f5371229aa064bf6f64038d173088c2e460d"}, + {Index: "583", Address: "one1e67jyedfs37un34ccqh28ly4n39yy9kvv5sz0c", BlsPublicKey: "7f40d477d16790659c6c4fde90df035d9af258e6baeeff2a8113742369cad10daf5081b70a84ee8206abc8885b5ce70d"}, + {Index: "584", Address: "one19kh4ksucvw8n4ggdjfagj8npwkhg4wpvgd94h4", BlsPublicKey: "8a7a989390414b67d6456761d03b1dfb7ce7b4457498f8670bbca933a9aafbc42500211c41bb5904314e3792f5004c96"}, + {Index: "585", Address: "one1qvshu59ts3cjkuu6myl0f6mty5el3hpe9cj3hq", BlsPublicKey: "8c586c73e5b66c0f4ec5d52856a11059d04628a28d5a5e5a77a31d802f3ae4f8f4dffaf5e874a7ebb332c142ea73658e"}, + {Index: "586", Address: "one1wdqeya0fa92e7evk36gdnmdl37c3l6e7ra6yx2", BlsPublicKey: "c4912bcf848b83989615f796e68c1ef7b336f30881e7b505f0e302f4ac08ece8b5af2278e8e600ab6f810ba259aad282"}, + {Index: "587", Address: "one12cve0feygplcvy9xdppc2lgh3fh8quae0z24pp", BlsPublicKey: "22d0e336e8b09f509852cf8a35142f37ad71b1e009de92d7bb1c639c19bbd52ae432e44315165895e5482f61945f1f81"}, + {Index: "588", Address: "one1mv0cdc57vsmsh6srk2ma708k47aw8w9l7sfd8m", BlsPublicKey: "d3bf3eda279dee508fb46bb3f2ca2e9945febd2aa3acb1a195436ff94f38621619c71bf8a23df5d8440f17e07f5d330d"}, + {Index: "589", Address: "one1vz5s2g2tk7h9ndsf3p8e3qzaktal2uf2ejdudk", BlsPublicKey: "9b85215e2d4e862b70261b9b592a59c666f040bb2203c685e3c86407cfb1f45bf86678aaeb103594468acad6e7122a11"}, + {Index: "590", Address: "one1a0n7xyd58vqgkahsvcy9xurg8jyzv2eh304z5v", BlsPublicKey: "35cb15e8ffc48ec28784ec6a88930c9a0316b645107b4f96951d03f3ec3bb6590c53a6bc6f2dc6f84b532d8cc51b6094"}, + {Index: "591", Address: "one1mvhpmetxsfr4uf5h9k2nfqmvjgnx3yrxrlat7u", BlsPublicKey: "05ee0d0107b50b5b5d4f6476c89f193a39526c112ca891546d4f2a6d25592ab26bdc4574d338db717e399b7286df5299"}, + {Index: "592", Address: "one1hqylh6psjgfyu7d8um8jxjqwqsg74mrezwuadv", BlsPublicKey: "5d77bddf43647db38b91e7fc300aab4d1c27a5e88ce723465e6a21c5c8aad603222e817c9e14cbef0ba0d47303e0e60c"}, + {Index: "593", Address: "one1c8pkfs7a8tt002s4r7yqzn7hfqcelylytrthnd", BlsPublicKey: "23e0f8b85e00aa99599eab56d2f84085a55496d72cc3b16cd5529ba494ff363f7f09b3dc416870647e52a4af17b99686"}, + {Index: "594", Address: "one1qm432cws38l80rmf5fp3ttunvh05m2pgspc5qw", BlsPublicKey: "c9ee44d74ccd0b94693d7a2a37e17839133d6b46ddb4651947e07161aa9c372fd44c3ce08e4f3fcc957d90a598a8878d"}, + {Index: "595", Address: "one1ypjgz53q8jnamsc80ctugukl8ql0m6l2m038p5", BlsPublicKey: "b82f10012e24573f72084908b5227ea754e2ecbcc499adb6f4fe48763252b26d2aa6751d96ba2d62a37dda15de27c404"}, + {Index: "596", Address: "one1fz5qewdfk7utvu8qypty4etkked2tme4706umw", BlsPublicKey: "3cae8fac9c40a654727d9e23b5bc47de57ac685e095f70b6f73d794273d379bbc7ce17e10cfcdb9663ee1d170443890a"}, + {Index: "597", Address: "one1fkffgcwd62y3k0wude246dqvg2fz3mxzauqkml", BlsPublicKey: "7b163a2568af7a32b68add1a569dc3a19b2b94c6d8e2cf85df13fdf4f763885a1bf3aa6c9ffe7402550a825a2856f590"}, + {Index: "598", Address: "one182dws5escytqwtpktkn22m9f50akxy3j6qq2kt", BlsPublicKey: "1672c676bf13b0290e4bd6c75a3058fa3fcb350b51cc1a6d0213d1af1787c1751b60e7d64544fd30c3122989f135840a"}, + {Index: "599", Address: "one18q3le4pyy96l9k7sf47hev4njz4ej5jff22ugl", BlsPublicKey: "7a2b5058ac856a56151b4f297a7c6ba0fedba2218b302d9ddf95241f9e15395cc2e17c3718102919ae7405f76a969093"}, + {Index: "600", Address: "one1qrrnz8hvhhqua4777y7nwr4vq3zl3leefnxuht", BlsPublicKey: "999c59d119e41f0907c718f7dcd9d53804528603bc180dd27554954d359a4e6aaad97d0552d9efcf76403431434ee90a"}, + {Index: "601", Address: "one15azqmuwqyu8cv9hdk7336zaqj9z3mrvkj3r3dm", BlsPublicKey: "8557191c8de12ded15b7fad5ec3692c15299c2b50ad4693c3c42abf7717fd9e60667f927247dea01df86baa03ccb9791"}, + {Index: "602", Address: "one1fq38wfw33yqkyfv0exgpknfrf6ytq0yzyv8z2j", BlsPublicKey: "ff0ca405129d2022c89fe9d2d007e8b5c91eedb7c73bbde9a91a3b82af4f9b5caad2fd7af6fd55de1d38840cc03d5504"}, + {Index: "603", Address: "one1m4queepajccyq6ey3576g9lc9gz2ekkps8890n", BlsPublicKey: "33948b28139d2bd3934d5d98fe8c9734934ce9f76f05a685a31dbbe83df4c2fabe4c85e58323ead7f38d40483855348a"}, + {Index: "604", Address: "one1skqgx6zuh0eue2rfm0skp8n85jzs4dy7j5slzu", BlsPublicKey: "70e6ed8a3f257a899417af830922e06c9dfaf5be284d815f1bf066231e9e225ffed5ed4fd35b4abac7c399c1e76b5d85"}, + {Index: "605", Address: "one1j2q2mqw6258kqpy98l7yehkg57636nwxnzvzcg", BlsPublicKey: "44e960d052332e0f3595ac27e8189a618242968d9ac489feb0fb3ede2a3d7092f68bb5c612fafb8cad5bd025dca1f291"}, + {Index: "606", Address: "one14wda96npfxx94ynygt8lw03xnu5hna69tst6wf", BlsPublicKey: "fb5afc2bd5f3bd592b52eb9c46ea41aa9162e09873746ca0149194910018d6fdda074a9c6aa33207be438d5170a60a01"}, + {Index: "607", Address: "one15kwa65zeym6fnqtxsjh8xkdznu6cd6e992glfx", BlsPublicKey: "70bd66dc18a490b191a9341a58dfe54792a71f5ae8b725eb8e28d0298f0c443a36fa4accdfd283bf5cc55b048b0fea8c"}, + {Index: "608", Address: "one1ehx50dwkfv0r96wqg0fjdrm6rv7t26fdm2wa27", BlsPublicKey: "6dbe92febebd93a4a8e893cc5fb19cd9660bbaaf20c025780b9b68574b524e06be557d25649d6e1fcde5a9bffdc1ca82"}, + {Index: "609", Address: "one1k7u8jgnl0e4ym7xca3lr7hunzg7gxkqnswgleh", BlsPublicKey: "27fa85cf0a160ffdce8e2bace139705d320657a75182f7f66d7972a1dbff0519698cf13c147a398df7aad4dfe5184e0b"}, + {Index: "610", Address: "one1z8r9vg0fkldt424njvd2hvzcw7kw84rgneyw4g", BlsPublicKey: "7521ee3a271b391b8c4724d64203e03bf26de7f0d597438efb6957f7d3e6b79afd731c3b5e016ffb2ce0183b7460f103"}, + {Index: "611", Address: "one1mtsham0gauzg7l9y8hsmaaecdypady9gqj5nu0", BlsPublicKey: "c73fcf336832ffae6f1c356285a98a235c443031bffa035c9bd9966c3d26d9314938d60d94bd5fdb40959ef7a6108014"}, + {Index: "612", Address: "one16q6yv0fd4jfg40azwzzmhg2m70h4ecxcslz7xq", BlsPublicKey: "3ccf4c6eb612f33f2e37c628bd0dc2c612c06e07e46f9390f3bbaac635e982e026e84856018d3dd605e831cfeb623197"}, + {Index: "613", Address: "one163uh4nudkehqm0pvqph2u9mj8k9mpyn0mm4a2a", BlsPublicKey: "2628e27adf49b59a5ae47623aaac96c2d6dc53b708371f05d6781e34b9f6a53ee6386209559f9d2312ae83b34dfdbf82"}, + {Index: "614", Address: "one173dltxeal8daqpflcjqvn90mrt8m2axqrnula5", BlsPublicKey: "a8e7b4918d6ee7a1b9b8090b0d6df778310ca3c136c12e63279fab3e6495e91ed7c4fe4936a996f11b3e32859202e608"}, + {Index: "615", Address: "one1mpa9hz976lxlj3fudrsr0x9v0s6uscr45hrujk", BlsPublicKey: "a495dad878a8f2e571fa8ac15fdb53e7d0502614ea79215b1f8ed2765d8c6a10afaeb8e8a09718c2ab82399bec5d250b"}, + {Index: "616", Address: "one1vzt73gdujtcfm9ef9uuaxnzdjtryjp7fvdwvg0", BlsPublicKey: "29684b09c1d615b7c218123f9f919e825d32cc10391ac378b0182f4614a783582e25f0bfe5f48840148b8b49f5b80a80"}, + {Index: "617", Address: "one102j8wn9ll9tq4gsmh77z2y24jl5jydgry8zm8q", BlsPublicKey: "bbc1225d3f501bb7d11321d05fa2656c18dc2531ee761f35c0664298dc9c0d1ea1e273bcafb5128db6b226ef2d11bd0e"}, + {Index: "618", Address: "one122d7eestu6aadyg03x6m3rwsph83stmwchccv9", BlsPublicKey: "457d18751d90e35c260541cbc7c18d54fffae4efeb6d795ded7198cadf4cc6990960ecbb22a175bb2fb5d4f241ca0701"}, + {Index: "619", Address: "one1lfzgskuhn77js2sp7jswr6a4hnqhxwxvkts843", BlsPublicKey: "32de5aa2c98b0bd464d4c816b01ce201d965d280a12d69aae5d8e80b4c7ca0687054b299029d2290db8c98dc5c6f4f0f"}, + {Index: "620", Address: "one1fjjnxf7lc49f0wyhjap09lrj5gjn7pzkw5t6nf", BlsPublicKey: "068d8617c4e87cadefbaaf79457cf27b8b4e56b4195b91d3d75649be1338d2ca39e7c62d7057adf1cc720b7129831503"}, + {Index: "621", Address: "one12m0guqmrtqpvrr7lq5mr0ewl5hns7qp8len5qt", BlsPublicKey: "ff6e554e216b3ecf6edd6b63ce367244daea65d75d47bb35ac8e5b9294685a11f695abd10a07b540f3357a3b4076cf92"}, + {Index: "622", Address: "one134aheav445ljfhd0yflskka0ztrz9vn37k6qwp", BlsPublicKey: "7cdc68e417d944e977bce3e4e80e109f999dbf2a2a8506965dbfb893ac2a452618bdfb86c81a290b0953d2ec3c15ce0f"}, + {Index: "623", Address: "one15ypwdd8jp2artzakgutxrz2np40jhw6f4at00q", BlsPublicKey: "f7ac6f62209360df43c92f346549cfe01d0bf017d6a9e48e0988cf223c5b5888699e24bb8316209adb9c6aa85beece94"}, + {Index: "624", Address: "one1yw8flldy79utknfujku09cjgd3fcv0ktaqpder", BlsPublicKey: "fb39b4a9cfc970576bd249ab5a3a7a56eab320d876643b5989b5e10db0a99ae29ce393db949327d6433973154b794f96"}, + {Index: "625", Address: "one137xa78e80shyjcxhtqph40dxn554fh5dxcurcz", BlsPublicKey: "9f031f440711767e86f8486b7d36a047751af799414d128a9a2c625cbd55ed202092ccbd0384dec26e83da0b21ffdf80"}, + {Index: "626", Address: "one16xpsh7rsxphhwf73ydha96n0eju5zncuekhle3", BlsPublicKey: "d17cd75baa749228e94b7b9519cdcecad67603d6805b9e20a48259c8816af91a7503bc2c063ba029c3df21abb1f69007"}, + {Index: "627", Address: "one1escpclp8xpwwmxt5dx9ecndvmvp8736yu28zhz", BlsPublicKey: "e2659d4c0586b75e91a39740bff478e4fed4b3ccd3b2cd3b76632ed9778bd982ac3e85a94264cb2b71006c3ae89e2593"}, + {Index: "628", Address: "one1un0uyw6skh6wd2pykr46fjvx944yzeztepv7qq", BlsPublicKey: "a912fb53ca5c54f89cdf54dc0a2b756fde67f2196e68e3bc2bf8d4fcecf41ec56cd829b95d82bbc9b98eacd3ea57d119"}, + {Index: "629", Address: "one1xqugjfl28y0cauyrvaewpy0q785hwl6s0u8ucc", BlsPublicKey: "170ba955fe48508224c3a45d7503cb270666c4eacba2421f54d02a9c8ddd5feefa1022001799d6c9489db357af2dde91"}, + {Index: "630", Address: "one10vlrmj0asrt7jw0qpzf2wcuqdxql5lqk080hvx", BlsPublicKey: "dd61b9738d6ca22ff626dc2769c65d4641e6a93226965b8b1fdf70f8dbfabdcc774ebe0f49df7a1f0b32ee0708b27295"}, + {Index: "631", Address: "one1wuk9ec3l5jp9kruw7acl4g7644x3qhk2xz7x3u", BlsPublicKey: "32cc4cf173d7b176084296f01d8ca0d83b9cdf1dedb1ef0c76efcd896df4600345570623b111f34404d3b78db28beb97"}, + {Index: "632", Address: "one12af8nv8f486lrasftf3l34z4yvyl2tprnkgnmj", BlsPublicKey: "1273ec68e867e64f162a607f9399050481456f87bf74c74ed3d05c9de1e2215f9d63233d8eb2e0bd1254145556495a92"}, + {Index: "633", Address: "one1r920dfwwp4gvccezavug0rfxnr8l8l28z58qfe", BlsPublicKey: "3d3e20b893a895dce544d5bd6ae7df4b9c5210dec2c9f64c4573441575f2934fb4b43bbd10f064c9ea3f002634841592"}, + {Index: "634", Address: "one18htlletqhmgca2akukp53kpzg49t07u2uarqsn", BlsPublicKey: "92e9fe76460f707d1b7517d584c9af839923a67c94c65a856866d0adaf5c8d03617d24f4e7cdfdd1bca19e617cf9ff80"}, + {Index: "635", Address: "one10gnx5k8k9ghtkw8lz8sr7vuzh2kgr9shdvszvw", BlsPublicKey: "ef2ebe084238e031ba01ef5f4ff284aaecd6f4f915f44373f8c988008682f104c6c1733194f88b657749b83ebea87c05"}, + {Index: "636", Address: "one1fja3vr5w6jeahgctwarrwmxt05l7wsmxjgpz7y", BlsPublicKey: "022d7e39566b925f72cf30e0a9d08086860d1bb61ac8abaf4c8798a1b49f0ca8fb7bb12d993cb9e0b1295e0ad0cebe0e"}, + {Index: "637", Address: "one1dduhdqap0whfgug3aezl5gcxzwf73ahegn66rp", BlsPublicKey: "a9e029286435ccd8f1de2f79fe0f1707cfeef27bb976de2935743fca5fa7e37034d875ffd9f7707d840ba776bea6eb84"}, + {Index: "638", Address: "one1qkm47hsenhj44umk6pch38dfvf80c2cf9rd8lf", BlsPublicKey: "744abf3df7c55a90414d3c3f3c6f9664728099f71b989c12332ed1603b482ef75fa3081c98c1f9ee7c9e880cfabf3f16"}, + {Index: "639", Address: "one1p3tepg5y326nt9aaz5xlq5kpeqsv6mrf0kdjvk", BlsPublicKey: "88023dac631cee77cdaefd12563877c5ea81b95443a2f0e51d6080f407808d3b79d329e0c278bfa0d4fee732c5ff0792"}, + {Index: "640", Address: "one19c3w85vt2p468rrqsuuh3y8sp8a08r2r2t6d86", BlsPublicKey: "413ce27255f8de3cbebdaa3c807a6d42eb848ba363b7a0c383fb16ddef08e8ed7cf1be0a03c814dd6b5aa04cdd9f8f00"}, + {Index: "641", Address: "one12gqjqjtd7rk8xj939eyh6x90q8jsz5fzkepd5k", BlsPublicKey: "e4ae74aaffb6aaf49a0c4a53c9b61fae064cc9f3871fe7d6110ae2f833f9123ea41fadd4673a8b13cf1c82c73ea22a83"}, + {Index: "642", Address: "one1awsc0rl5f59apjt9sft9scv7j5xdwahwq49288", BlsPublicKey: "fd1358bb8aa6f7b98a0c68916d3e7e4fed15dac45f096ff192f97f09dec37ffa474364f29c0cd09ef9fd111625de0113"}, + {Index: "643", Address: "one12utvnvglxj0sy3uqd0rpkr907847l6dtc2hd43", BlsPublicKey: "067887346cd2090e34fdf4ff14bd7ae4d5d19e640362a3f3a9904a4c9d93b25dfc9aa1466c90367f12105ad1380ae30a"}, + {Index: "644", Address: "one1jkh83raasjjgy7ru5dngy79hqlpvnvhd27c56j", BlsPublicKey: "e734e35b5bc7b9bc22fc406fd67ddfbe497cbde3089f18e28b6735b1dcac578e11e58f3e13fbeedb10d5deed21972c15"}, + {Index: "645", Address: "one19w863r9up338j478vew5eva3nqfuvtvnnafgsc", BlsPublicKey: "965ba2399c0a6042d908b7b9f4a797cedc7b21ab92f2a61e8fd578a97197e6b3c84a08f987c4b479f379f6231eea9b17"}, + {Index: "646", Address: "one1aa84m6sp9fkw93xq2rw8zn9gkg2lvkv2759azf", BlsPublicKey: "6f402bfcc5dfb4ffe799944789c13669cc12b80d200b21cef1ab565b11eeba3dbbf6b0308c91af05dd1a1de81363540d"}, + {Index: "647", Address: "one1c03jeqf7h3f59tqf2hcvu6ztzjl698s9pxrwy0", BlsPublicKey: "ac2c8e27d64c1f3ae8a1c8d8e5f02c1a0cd8de4626229f073bcb0145ba4224834affa42d9eeba907f26b0bfd9e6bb711"}, + {Index: "648", Address: "one1sx5kcmj4lf92dshyvqep8hvt6pgku65twrqwhs", BlsPublicKey: "2d6d7652503b17d7974d9874aa3487d49f7dff9a164e06680539efd5ad5a9ecf909f69e18ee271086f681c10ca66d802"}, + {Index: "649", Address: "one1yqdemrhtpfglutnl5x44jt8reag0td629unmym", BlsPublicKey: "29eda99c29586e88cc582d1658dc41640a53cafdb04c3f33960f87520045b72cd7512249a82f2baa8288fe65f986c283"}, + {Index: "650", Address: "one1cc8l0wwlckjycrz52wukhqq6qdsyvvnr4d08x0", BlsPublicKey: "6eae4222a902b75e6646272f4f53b93e12a0b497cd01e9bbb09fd600c9fbceb1db77ea91a06b443bc72417b63c0cba90"}, + {Index: "651", Address: "one139pc7md4ryp06m89wp58ev3mg9jun2dw9s85hn", BlsPublicKey: "4406bd19ba55c061871e9992305e91ee45fe3d83d9871885cd356202467d4b93b970cbca2c79b590558253fe4d61bc05"}, + {Index: "652", Address: "one16xq4q5gh5y3hdh3glvhp6nf7kwzzdg666hmfam", BlsPublicKey: "17f8004ad091ad77a056c14a050df65baa886bc4ebdd2392fd29c273c8032c6a7d7f57b5c35b66aed15c07379b7b5599"}, + {Index: "653", Address: "one14qtcamz0wh7qnkj57zldye7tz0906wgdzz3esj", BlsPublicKey: "ff5ce4f569941cf9f849c5b5c3eb8112aa957fd738219b9963518345595f0874e1f92a467643df2079e2ff01aa82d995"}, + {Index: "654", Address: "one1upzunmjzynp3jpc007dcsgqe8tvhh32dcvajq2", BlsPublicKey: "bc344082fab7382581830b8e901e558fd2eaff1f50ceedbfc0219e9a011a84ee30c17f1cdc37464370d01d8c6e2e3b8e"}, + {Index: "655", Address: "one1u3l0j0jmzazrqajq2qqurp5z6sgldm6x2wp72h", BlsPublicKey: "2f3bd1047f24137b026c4da0d609134c909f716d52d18cf152c51f7928c72f6f64ad65f1196af449af8ca9f97de6c68f"}, + {Index: "656", Address: "one1zar68v4zpeweku5axn0ppzx8k7vct6l5earn37", BlsPublicKey: "7f65ef9e211d00025419bf61dc6ae5dcf7e57d506cd3008be139b60432b64de4fcd5457a0c0c9e57348f1b4ad0355c95"}, + {Index: "657", Address: "one1m6c7389n45ukfyftqgf286u42jwa3p90fhzr5j", BlsPublicKey: "b3b264526a9d6aafd86ac987a6ba7669c9ce80737a00263a87dd0aecc3baabac59bef47000d98e3481aea947836a2685"}, + {Index: "658", Address: "one14t9aqvv9t2tht82sxkakzps8fxuupksedtpl7a", BlsPublicKey: "966abec8f3742bd880d77c3455ce093f7d91e6ee718049637c819ea203bee8d7127635f8048caa407e1beb36560af194"}, + {Index: "659", Address: "one1qqsqgymm7f2z76ua5ys66xhpv2trgdnep98rwk", BlsPublicKey: "78fa3f3ce9f1b9392a931407fbf5ccb593502ff5377f31efd121c7b30a64aba60a88952f71b7b12db96b29f59e5d8c85"}, + {Index: "660", Address: "one1jqzk3gzjgf25mlgdcfl700333yrn6uw7mcmflr", BlsPublicKey: "851c4f9d7d3d471ef190ad30ca7cdfc71a749eebb0c68e5366b8b9385562c645d0b5af49dea8e0d54265e68d855b5313"}, + {Index: "661", Address: "one1j0rud43krgyflq8vw00fpddgu45zc8kl49r4l8", BlsPublicKey: "bc87f90bec6f30eb3b6f2dbe264c14ea0e82844f4c8179c35032dd6805696436cb28b8712e8b97ebf384fa561c96bf02"}, + {Index: "662", Address: "one172hxl4jdd6r22x05dzqaq9udrzx7x95jyk7cdy", BlsPublicKey: "de0260d5beba5bcbf9e24f7fdaffadfae70361ddf9dc75c5b103129436970db12a99094f1e317291c7b57374d2f88a80"}, + {Index: "663", Address: "one1gtz77w98agdyvxsq2dlx2d6j30mplk8vu2kz59", BlsPublicKey: "cdbe5152abd8fcdcebfc2fa474e601bb9f403204a89a48722f2fe51ee7591c6426644fe8377ccf85b2fdbc1d34648509"}, + {Index: "664", Address: "one1lkqyertdq9zvpy832u42wtsat9c0nzd5d8kxhl", BlsPublicKey: "42391388b0af0e44e77bd316661e08ecddee65b02251d70ab0c4732eb3b89ed4134825d557a636ec926d05a168734e0c"}, + {Index: "665", Address: "one1ukwyq204tjv8ev4uaq0chvchcpawkm8lgm33p5", BlsPublicKey: "00457307534c9dd884df9d8ab28882ea69c44fafcf5d9d69bfeb2cdd50c1c69f281c1bffe0290fdb38218d45a81d5d17"}, + {Index: "666", Address: "one1jffmcpqn8hw0mnyhadfkcx7sgw5s8l967qg3zk", BlsPublicKey: "2c686d9002d9000c1f9b5f0946bea936d7a12d96e3b65bdd20bc2e7c60b440c35abd14012b695066144506eb9e0d2806"}, + {Index: "667", Address: "one14rrtj5sjlad5qf6l2vstwpwq53xn6x5l08zsan", BlsPublicKey: "f446420b9bb57b669b05249741715a43ec9ced27b388cf20d4f8bca3aba1a30e6fc2249cbec55a64fa0dc2088a033b05"}, + {Index: "668", Address: "one1045ldeypn45hcrx7e6mrgm50thuwxr566tuudk", BlsPublicKey: "893e4b9d9b1328e8cb40cd65ef64c246263098c4b80a569049f60641e757a035981dd7d4f27063a19a488af8107f7a04"}, + {Index: "669", Address: "one1yqygm8d678y5he83uu5nphurzvkeyhkrmht8nc", BlsPublicKey: "f1415743e6b10308a121bb2a27d3925c59e2f842dd25988f3f3f6a641a3725841da555b1a4c30b57b1da7df448350f93"}, + {Index: "670", Address: "one1umvndwqxw7uz5lj22kd5y0cwv5trea54nf28vd", BlsPublicKey: "4a1c53770d8ac8946debb48a3d8e1c102a9a7b8574912c4c1d987f973f555b2c73b834dcaaa41c493dd9165611db4785"}, + {Index: "671", Address: "one16v32lezdex734mq6kw6ypcpaf3arws9pampylv", BlsPublicKey: "09868405da41dc3f4eac6ae2d684ea1574568d647c270bcc52cfcff442d70d461945d8c6a13263a2cc61103c0ee8a214"}, + {Index: "672", Address: "one10dey3mzjpfh8ugztwhx7rrwu5zulg4jr5na7cs", BlsPublicKey: "707868735b47ea6ce746ef16eed1e0970e3f9e0ae5fc136f26489be4cad53a0d0418cff7bc1e707b9b8f40ef31791509"}, + {Index: "673", Address: "one1f2g7gwulg77s6dakzfzk9e6c93ny2zk3ptd6vp", BlsPublicKey: "4411962c7973d2c8c7cc3c1397b707062bf9509d6b05aab82712e705c3c56abc92315abc671044f22cd8350e744a4c03"}, + {Index: "674", Address: "one1rywq3carjg6qkc9z76ldrjwgpmtkg9t0nzyg8l", BlsPublicKey: "496eec71d3233e5581e912b828e40b0695aae250a0655ad68ba9bbf55a9f740b0cf96afa271f641868df5b3f8daa7480"}, + {Index: "675", Address: "one1l6j9qhfdne82tcqzv3fvvjpadqpfjywjcp7066", BlsPublicKey: "19f4fcfc29ac2ba214b81099e3cfec7b8ee9ab83255ffdb1c3dd2c210475463039c836419c979a2c2188c0f7d18fc804"}, + {Index: "676", Address: "one1fml68s7gslw52tw4ah8g0fwg22lpaney77n0w2", BlsPublicKey: "3a4d7a55d1fe39f1cd2ed5becc29b44abbbdeae864edae11b451ba5e7153b149297764fa18eef36db451a514e1be1982"}, + {Index: "677", Address: "one1g0c060p4nsep2qh94gjukr07negax8dwkfvnes", BlsPublicKey: "472c8651cd57f3b145e969d785c9e1a61abf8c61c79ab0c78a43117b45409743eb0bca033db6ed24187b7e9f5e7b8a95"}, + {Index: "678", Address: "one1g73zm0qm38hlu7tj2c3wsrw05gczydw9f8j80j", BlsPublicKey: "479dc5380b8aa45d6cd1dc07cdc0890b3b2cc3578d27851aec95c3b4aab90d0434e1c26b77a08b32814797b0905c988c"}, + {Index: "679", Address: "one1wtcttxq4hmj393zyd4ytudyj4x5487gfwt03k8", BlsPublicKey: "1c480cd04395227d310c8ce61409948c45c2a3150ce31431e845bb3f8c74f4beef663f469df14c1488ae1ec241b4dd08"}, + {Index: "680", Address: "one1l3m7gqeeeerw4kyjzr34s5lqzqzvzts8hy66xq", BlsPublicKey: "dc8ccf289115f27e426c2fcf6b9463932df343cf6d2749c6b4b20246e15a0a4e8aa08ad0d9abb4e925a71e25a1e2a500"}, + {Index: "681", Address: "one10w5j3na74q6y6p8c6l3sfedfgqxn6d26gpx0am", BlsPublicKey: "7db017d75eed923535b4fcbacacdff030593521425b53ed118b4c44e0ca7223ae4baa16e304e42266fd05c987b597587"}, + {Index: "682", Address: "one1dkgz4dug5s4p2sumsgyexp4efw8dwdxca32y7l", BlsPublicKey: "d7d18f80eb486995dbaf8a2eb7f55b2123c2c05065c64b9b1bbf36328a5f96e1324e2e8996950e2fdbc77f9c944ab916"}, + {Index: "683", Address: "one1ytqklmdqjahahg2mndakpa9ugn756nxq8xkjsr", BlsPublicKey: "af65a1917ba8a051826447762ab1d0f539bb43ac774491e16f26444088ac7fed54a069b34c90d900e64118c6392c0c8f"}, + {Index: "684", Address: "one194xul530hnynhetd0njknyhggqptrt4wxtf0rm", BlsPublicKey: "ab55803ef0e274fe2d21938a58093fca4c798969c78c60ca314163bde19ca96bddaeab3db00501a73bafe53876825088"}, + {Index: "685", Address: "one1yv8zke203tzyvne8clhvm2jyh8hg7f0q4g5nh9", BlsPublicKey: "a030e03ad3ad082353b22757d43bf0b743b111fafac21a9af6299d9446b9207e9987ea20e795be15838aa7c3ecb2b600"}, + {Index: "686", Address: "one1ywxdxy53ffy4eumg256mpt559pxcxade388tls", BlsPublicKey: "f61092640fb28d0f5a1ef3def8351ed5acf87b14536d129d5fe50f05d9a781c1104074bf6507dcdcf0bbe68371218509"}, + {Index: "687", Address: "one1f4pg8th34ukayhrx32qang8xrv3k4ysa9padwd", BlsPublicKey: "e17ac7f9603d8042e73400bc876bad121eae5718f5cb6b1478cd82e76f72a438c2bdad394dbbff8118ca70d4bd05c313"}, + {Index: "688", Address: "one1p60vmtljggz6ljw6yg69ctt06kjwtj4yhhtgg0", BlsPublicKey: "17f0c67e75e3c7e8781b3aa06a12c76aeac01a7e94671248035abdd841fcdea8fd69bf7f55beca69430e9423b1dfc087"}, + {Index: "689", Address: "one1yt8mwpl6n9dsvu9zkrc467glcsx5zrucskuq0q", BlsPublicKey: "cc969cee1225a6e1f0006108e165d2923999825891a46ae80d6f29dcdc5de2707c54ab390f709e2b77954c2472583c14"}, + {Index: "690", Address: "one16tvdxaj28zy7h3yx8tq3rhlmq69sakr2sqn4ca", BlsPublicKey: "a31c7979337c37edab905f4a91296e507b91c182b16683ecfebd3c177e50d7dff6aad0ede217eca955ef5a05ee836f83"}, + {Index: "691", Address: "one1ye5eurm0fc0vn6xqhcx585zu2h42y8m63lvgls", BlsPublicKey: "cd0ca4aae8b243d543aea9d949a38357a805a2601f6a86a81b023eed74652ef218e13c6baf0f7ad10510ac8db299a408"}, + {Index: "692", Address: "one17sgme5f4m84689zc24m6car5kefk9y4rv56lwm", BlsPublicKey: "61015f9134f3cb7280d5776dfdae9ba97e9398072914450a8317426e215236593f7029ad7c84bc59267059236de44703"}, + {Index: "693", Address: "one1j87wffyazyqwc05ml2j7x4w79yse5krzackrdz", BlsPublicKey: "d2f653ca9bf2aef7a052b41c0eead886421267e1ae806372f96bfefe07c2e6d2aaed6508650fbdddd3e2c0259a5ee319"}, + {Index: "694", Address: "one14uy3vfjxjjvw82y05zf32uyw4gfsx3xgmzn66v", BlsPublicKey: "6e99a194e2510d433137a77d4152c86bfb5d33bff0d4b8db2ef1e5f4504d8e0a8e72188d79267cd0a00a09fbe7674e01"}, + {Index: "695", Address: "one1ku5q3x4f0a8d47dvntwj4hlghj0jahtvz3l0tq", BlsPublicKey: "7d1a4702a45480c10a180161cbd9c852a7916dde98b485b5717ecf48118dc2afc21f3922a3e7807ad53e77653cd47a05"}, + {Index: "696", Address: "one1mfjqfu7jz405m9zuxxf9rrupj2ad9pc77px9g7", BlsPublicKey: "0e4592299190b410d1854527c7cd567577d8621060fbb163786f8250c3566723ffd2e69ceab6065edeb91257a36f3814"}, + {Index: "697", Address: "one18nt5j595wdv6w4wgsh2yhy4ppuvz05e2gsaj92", BlsPublicKey: "435bcbb3b118d871c2a44cbb527e84feecf40f6a9e054b7d1db5fde98ebcd65b5fc1828c9681f291f095031d2d8b2b98"}, + {Index: "698", Address: "one1gvdhgasgjeeyxh8pn3ys3hfhc9hfw7lspsw67e", BlsPublicKey: "5e563649c75d93900819a6de312e056618ed5cc4df02df567bea9fa0f4f01626116fef82a4b5f934dc86009f0ad7b709"}, + {Index: "699", Address: "one1kunlvqpsvugmksjdzga5wmc7mxecgpx4gasfny", BlsPublicKey: "03a08d275f56d41b92ab7456baf5df44107cdae60ff8d280e854906642efe57b439d262fc23fc0907b88f698ce317911"}, + {Index: "700", Address: "one1eztuvqf0e8ezt507rqm29458sj2kfus8ea9wne", BlsPublicKey: "7686890f06a68cef60163b0130e263c75086adff5b0403ccfab86036049180985ef352f1274535dd0fc725f211a9140e"}, + {Index: "701", Address: "one1m8em00pnprguvr02hedzks6jdsursdlwy589ta", BlsPublicKey: "514369caef6a8fe9eeb66a673378d6f3fce15bdb51edf42ff7d170a32723f474f20d2f03315f16ff38a60ea5ff65f08d"}, + {Index: "702", Address: "one1qkqeujcen30tvj4rd5788a6998e9rzflvf6tdk", BlsPublicKey: "0fb34f4987b927505fe67160d78dffb7abb36bd7d8cf731a7ae018945dc4ff9c9c03cea4e32d070f9943937fc66f750f"}, + {Index: "703", Address: "one16k6z0ekkwsjlm50nzf3a32s332a5apxm5vfrgm", BlsPublicKey: "8306a5a9e805ee2034ab413338ca9662851dedfa9505d7f2ba5ce2bca0bf6b4f46421eecc4fc4c24a0a9cc6c7dffbf11"}, + {Index: "704", Address: "one148k28ujq3yw4mf3wxe3v0vmlmnn4ar6wapcuur", BlsPublicKey: "43c3b8c36c1e6300b476001a3632686179757af021be32b98b892555c88f1f1ef80862657a794127059618f70b945899"}, + {Index: "705", Address: "one1l7edxme0hx2ved3vtwmywek40nnjj9vkrqjm67", BlsPublicKey: "efc1a4520ac24316413cdf5f807f1356fcaaa62ebf71fcc0e1d1003a34a407aea116cda89e2240ddba36609e3481a913"}, + {Index: "706", Address: "one1sqd3x3x5uxfdlp09q32xa2rtqh246xnyagv7ss", BlsPublicKey: "51aa49e0e274120bb87584dd036019cec4b580e84054d109b48be506c571a6209e1cf163638e1c087b2eab2594b6ba09"}, + {Index: "707", Address: "one1s2lqnwsurlnfcxfqcmtjlz4jdxmm0a43a8jca5", BlsPublicKey: "bf8a568f83958bae536690ac63eb957bbb2cb839401f9c08c51fb2128f4e5b44dfe3426cbf648478de7c5a985ecf6097"}, + {Index: "708", Address: "one17xsfukg32gucn2tkdxrzz9dfxxjqsxlqp6l0ru", BlsPublicKey: "6c07da122b0458db9e413be016d623e16c9a5de149d55f7250464a1008d7b29966ebf512c3e48fb393ec326d4be4d101"}, + {Index: "709", Address: "one16y2ecg0nc303sl23ea5ms5fjx2d6tmdtykchqm", BlsPublicKey: "048d252625da3ade9806d2c1f7eaf09e0bf871dfa12b8181e5f29597dca4ead10f032812f6d687cad9fd39d6ed3e7219"}, + {Index: "710", Address: "one1a920jwn5dr030ptregta5d35k0atfzhc6hn560", BlsPublicKey: "151c224e4d5f609e6ebdd29e54fcb08d2132b27be05ffe1caf060eecda026b87ea79cadf99e5d550aa371747db0adb80"}, + {Index: "711", Address: "one1d0c048nqhtwya4ek9mnzfylhx54zeaccphvtsy", BlsPublicKey: "a1a5f2e45629e439f75d402069f675b0fee094c990582403962f3d913de1e3f3312e448f77c782c2569cacc48a7b7881"}, + {Index: "712", Address: "one1rfxy4uzdzpjlmhl8thnr4tazqqjyggkuc2jdyu", BlsPublicKey: "9f3e89a89505ee82db134e4e7b1a8a049999bdb3ed9ad9e6475c52d2ca026327dd25abff1c923254d0119988096fde95"}, + {Index: "713", Address: "one106jwr6swdqrsekdgq0exr7wpfllj2xmvwek252", BlsPublicKey: "4692faf5c8090bac182019873f7bd4afd5bc201913dc4456511bef508162bfd345dd3eeb31a9707950a4408853539d11"}, + {Index: "714", Address: "one1yr0788aee0ajtdw950hl2p42epslluexfxsv4d", BlsPublicKey: "360d21b43a01ae0bbf1807e2baf66a8efdad56c535de9f221a3ddfd37edc977d04756707d3339dff16939d38ad78f38d"}, + {Index: "715", Address: "one17ma4l5vz2hkhgyrll0mycr42ekjgvjmefcu97x", BlsPublicKey: "833340337a4305562084c7e845d7cb7aa410ec54ccffbf7631268a1f456015ab122613c6e3b322d66dc45ead2df42681"}, + {Index: "716", Address: "one1px79uzkrqnj69sxuk9uu4zrcccsvmrtq3jf0dj", BlsPublicKey: "1bb9342bb64847da0dedd5eff105007b7b483951a478edc38a8547e3bbbf9dbda1950f295b1de6ada3c3744f45642882"}, + {Index: "717", Address: "one1rxmdjxen4j5ynhg20pl07x0nreklt34pfqf7fp", BlsPublicKey: "943fac440c90229036b17eb4dea68559906ed7ea0f03c5e9d1edde73fe1393f9ada7076a6bd55f1e7b8a0e2f0d06b617"}, + {Index: "718", Address: "one1r3h84esqkrjz8fpz2hnze248n6vy7kktgk5q2g", BlsPublicKey: "9566c0c2278d2b037a27acbf26149d3f3e2af66517d08297cb57387d799bf3531362cda7f7116aeefea4cade1cdb5e02"}, + {Index: "719", Address: "one1v9cu8nr4pkkqrkm9qvgh3f7mqr753l3wjue5hg", BlsPublicKey: "73c3afe057376ef3a5f42f5f73865e1a51d97d66f3e1b92be0d3f3884ac04aac93e8bfe9b35aa720639facf0281b4b07"}, + {Index: "720", Address: "one1kj6zgk4dtvljysddpxku2zsly3e3d8cskwhcgl", BlsPublicKey: "145bc38e22ac8bb0e92be293f03608539eab4e2c80b4d1bf32832898162f1e1c3dcc25a3978821939bc13d4ec75c498f"}, + {Index: "721", Address: "one1ymeu0fxwjzxvwvsq0fx02ezg4v7ut20pajkjwr", BlsPublicKey: "7f62009198bbd6425fa9aa5a0652028858c1dbd3580e4ffe260afd3793cf3138cc0023ea454bba655dc2800fa65efa11"}, + {Index: "722", Address: "one1yd069w8dqgx5vtpkekl6w88s58ajpfsry6tptt", BlsPublicKey: "c66af608310183ab7340a8a5473e8fe0ebca0bb0a8c982f486e716f6c5978d54e8db61ac9f502c5e1c476fd5a47c4507"}, + {Index: "723", Address: "one153zq7r6yyj432924tve2fua2cstujgp0s68g44", BlsPublicKey: "a992a02c7f79a3e7233eda7f709ca5c342015e2b27f9c0d7fd8d0c2c3e97c4f5c581e54c47266fac2cb28c6d8fca5182"}, + {Index: "724", Address: "one1yue6wwrn95fdu8s5awer73s9q47em8rwung4t5", BlsPublicKey: "bd60eddaa55ac2870bbf4ed066e8f07600179544e0b0e30a42a615e2bfd96dac7fa172bf275a95b6dd2e7d0f19fde707"}, + {Index: "725", Address: "one1wed904zlnjj6y2vlymww5wckncpg2k3dmx57al", BlsPublicKey: "5a0daeac022ee2e86916c40911a6de77c23174f097786e48d318c293f3e1a2b7e58e035224a692009e3febf7aa595c0d"}, + {Index: "726", Address: "one1g6tawdfgrrdnzk6m9zhlcwqz4zd4r0m9nx5zl7", BlsPublicKey: "2fbc9c2048dff16f15d4bbe1898d9da415a1ade5f73d3ca87b5b97fe3932b3c8ea18845062faecc315deb5aa9e19c499"}, + {Index: "727", Address: "one122qhnq6cx56w6z7qfwq3gqsmcurd0ykec0lpv9", BlsPublicKey: "f827592a9c215949d5a966d9507e30d3414a2cb17946e41b97cd9325d86ecd26dd59abacee44ce44a0b341a531b0c38b"}, + {Index: "728", Address: "one1ve44t247k08803zhgzp4l9xwmtdusdffcq5amm", BlsPublicKey: "bdc7f217aa93af34cf38c3fb996fa90d9236e1d56888d25338e3e52cc321620e032a748f47b66a1992a97f333aa52112"}, + {Index: "729", Address: "one1fyff4d87yq4zq7g24mx43xftcrp9kshus0em9x", BlsPublicKey: "fa7a0cc89de6c0c30c93883958d29b393286aeeb83422d49b7afc2557749c17420739b7a7d3e064c98aefbdd1651b709"}, + {Index: "730", Address: "one1y6c7k5cnljmhcpapua4pfpm84qkx82gd5js3tc", BlsPublicKey: "b62cb6fa7e9675b3df8a87778aa974441a5869efecdea56e9880ae645e32fc03dc7257b869f2446074c6795f2f75128d"}, + {Index: "731", Address: "one1ph3snxgx5kyr2mshnnppfckr32yhzt2f3593ch", BlsPublicKey: "4c941bad185e3744876ce683410cbce6c49faa3a646a85a30b6fc90bca4a74f6db920daf5ec10e85e56896e4bb67760e"}, + {Index: "732", Address: "one1rrsq38h5mqe87cxkk96qdszn9j9c0zwhdna2u6", BlsPublicKey: "fe04a20acf69b00a3a60a23f18e18feb4bbc72495df659e82e3ae6003dc0e817babee134322aa29eb365698e0f917692"}, + {Index: "733", Address: "one1s75yszm3g4lgn9smtc5ahd0ecu6efw2aahw2xx", BlsPublicKey: "b8cacd2926b0b454516defea499f39606c4cd3d8a9e0736d47f20cd17bbadd7dba6e0b7740c15f98ce582b02d2107b01"}, + {Index: "734", Address: "one1933wr3jf34w85u4cjmylrjtjmmn9cx2nydlpys", BlsPublicKey: "ab00fe30529a5691b0960757c0401b8da100466d7fa93940c512cf79df7561c3e525c482ce6284c815ead4b815ac6699"}, + {Index: "735", Address: "one1hex8nkq43lahtr5573ss4zwyzgdlnw3xts3jmf", BlsPublicKey: "c8ce4ef3647114ca441b4b92cb127a4aa52684d0bf7899f53a8bd18cca5a79c411e3da85d14b2250a2f5ab016a148f00"}, + {Index: "736", Address: "one13rjz4cnj0e3y4ehpgstdvyzghfwevzfw7gl8pp", BlsPublicKey: "c5030bfa9c2fbbfc128850322d286c11f3d1198a9e653bdacf7c85afa2a47ee4a499c3102d4ea586821428ed1f00148a"}, + {Index: "737", Address: "one1wf3cz0gvaaqtffl5p2zwfr53kff80l7ql03rw0", BlsPublicKey: "d3c9737aa7625dd1f2285310ecc18e195d120617bbdb0ebd747288826376d150f436ef2aaa612a1df8c4a27a7c159307"}, + {Index: "738", Address: "one1vnvey6krkyyxmvyucsyj80eekk0hh7aftgtssw", BlsPublicKey: "9b6d1332eea1a89f04ceeaa1f1cb5e6987e8bd4f805c12c2e81b85362ff2069a5a77b2d9375add0fa266e2548298d315"}, + {Index: "739", Address: "one1kq4fcmhkm2v23f590lmxsm52x2075schtlt66g", BlsPublicKey: "d1453b6eba015a51537b2e33e17aa6d201c795b48c9bf820bba4eda60d10d9f02805e7c99059de8c13333c45488fc011"}, + {Index: "740", Address: "one1kzpuptdldx97tuj79y94a3wqnwts0t4k7wuccd", BlsPublicKey: "86e7cefa0144c52310a4f54b792155c488569ea5ce7e6d592cd11921225d0376ee2ec43c11b7364db337bcbbdefd6a8d"}, + {Index: "741", Address: "one1fgr7elakxc56lrhhgy43fw4tmmau9fjuk0xpz3", BlsPublicKey: "67736c9051f3ac79b9042e6d5e749c240e81466c88ea595caef7a11a0de9f3f909cbf8ef36662b85ceb8f5e062645793"}, + {Index: "742", Address: "one1j32pgyrsga80zelt6c5y0926zws43gua8jdkv9", BlsPublicKey: "bf3b788716fe205d2b890334d7874941d5846b594b84c237f0a6fa0a7ecd76a2dd221e522be33f97a053f391aa8e9f8a"}, + {Index: "743", Address: "one1utcpne74weuwzfa9e9mqvgf5en0jlclksttzqn", BlsPublicKey: "e27e5242520cf4f1da175d2d4d0f2102a0a6e5aaf09b00cf01352e1917b1fc31b53bc1b6d0febb1deb27307025106a81"}, + {Index: "744", Address: "one19euy6jq6cwy5h9kvkjts2f0cf2dejecwvem0eh", BlsPublicKey: "28bcbb11244240f3826600eb1a2b669864dfabf7e2bffb323ab0d295bff2b19227541fa53a367f39b6b7c77d90b7970f"}, + {Index: "745", Address: "one13tzds9hfyesjpltxthk3m8ytxvhflzx7rwwmu0", BlsPublicKey: "94648b7ea8a397e396aa91ececb6e530703952cf56846a1b237e38c5846b864be987d17301695bfe99489e9e32173691"}, + {Index: "746", Address: "one1ta660wuasuducnrathcgc9q45rwh8qmnd9a60k", BlsPublicKey: "90997946e3d02ad2af4eea7f6742c76d5d6f951933b2b84c690399b4c175bc6bc80a25d80859a4a0ebb618999473e418"}, + {Index: "747", Address: "one19yxk45z6xa0hxw6cc4a8sn54280fh44q2rxnnm", BlsPublicKey: "10eb7902224f835d994ed331faaa9e48843fc4a90a04bb8dc867af1fe69abbe68ba97e9401dafb11a90962d6fd504986"}, + {Index: "748", Address: "one1zg0znkwpnj9asz84ulr6uzw0p37na75y6zffen", BlsPublicKey: "c5044524556fa5e5627684b55e0d9b7b708b00b90a55819de3cf298f0980ed89bf5dcfd25fdcaf018b087fdc59519914"}, + {Index: "749", Address: "one1h8kt7ayedd6gk59t5ey0lw7e6yhhj237mcdxjc", BlsPublicKey: "486d1395a6122f892a844fdf9d791fd79a1387aa015c1cd4495d1569ce23ba395398bf38f5a504c36e1d315bbd498686"}, + {Index: "750", Address: "one1u26t062uhvm8405emegs2gfjfae45gs8xhchjv", BlsPublicKey: "b022201ba5766c73643e154b17fa002796d04a1b76f399b6201727c3703fc00d25623ee872bf1081db54806f6847e50e"}, + {Index: "751", Address: "one1g2dseuumerklxy26ruwn0cpydf67rjn3qtjfv2", BlsPublicKey: "0a74db6384ed1aed5a9fe916f2438121b9df186a01fa4b09c7e7db88fb252999202b7501538835813899771fba44a494"}, + {Index: "752", Address: "one1sqhz3y7cyh4eqx80ed98p8ku97k2r703r0z23z", BlsPublicKey: "aab88461bb38ea86c6805ce30c09953cb5a64eb981b6f03203119cebc6ac39859eaca628c9319bd3dec827806d594886"}, + {Index: "753", Address: "one1utg90u9pnlfxk2utdex9fugc4ftjkt3zwe4pes", BlsPublicKey: "982418d8bbedd883c31c4274899c7ed983e4c91f09720c7aea7bbcdf7f864eca39b94664ae80d8099a684b472a391a0c"}, + {Index: "754", Address: "one1apyxdc0zz8lqqqhk7ctp47a5jx2jnfhrmvcjnj", BlsPublicKey: "3fd37f9c4e4fb0d859695b08e684c5390fb4a4a4d40b8101c94192380de00e34e0d4a7c13aa11f31c27b0f59025c9e93"}, + {Index: "755", Address: "one1auntj7fe2xwha4e3pz5l85z6a20shsl3mka6cq", BlsPublicKey: "7105a96ad83a6bde4dd93159281ff5388b607e38331ba194c2e013b2ef49715ec71ae7a722d8683581ac987c99b5ef8b"}, + {Index: "756", Address: "one1kehx3sx8znuupmds4x83hwrvmd2gl66yzvndzq", BlsPublicKey: "8e769c36b2a498ae76be5e4dc990df0ad2a31d907ee98b428bd091886980a58e86f9422870631b5b6859a8846cba5795"}, + {Index: "757", Address: "one1jgtfkxmx6p25ly5fqpjvz9dc7fxup5s2684dcl", BlsPublicKey: "11f631ec5440622bdcf5d3ff8ebb8b288d75e72df455e6b0e18873e527d08a93b102eb98f63bc58ac606b4b23de1b018"}, + {Index: "758", Address: "one1dwnns6dzd3thha5xv2ugyffkhn8s70vkn3rnqt", BlsPublicKey: "580304111aeff1043d89628e51a928b00b0e8f169de9516557f30889e3bf9883935f20a3b3d4635766847a566c93ef14"}, + {Index: "759", Address: "one1t3q535u023w2yyudeajzqsfe4ad2egjvmeucjf", BlsPublicKey: "fd2b0cc99223c14daff808519c7c15efd409a1485190acb5967e8168b097796d02064939c380f6942c2b616d0725b408"}, + {Index: "760", Address: "one1lakx3at54z77xkmmg3haadqqztq803w2qp0aqu", BlsPublicKey: "1818c3a74de17ecc7751bac0a085aab726f903b157ef7dbcad35ff42585b644f7789d4c319ce3761335fbec444fd6310"}, + {Index: "761", Address: "one1p8jfp993r4es028lgaytyz940r2ja7mz0va9ry", BlsPublicKey: "eddf539809bb08f0d54bcd6e3522296110b493800af9a64fef050866c3a22fdec21c6522c77ae10d53946daea91a5808"}, + {Index: "762", Address: "one1qr6ckrgccjw6unkueslcd2sj58dgw0s5x9w2a5", BlsPublicKey: "b31d19a23b08058111d0fbf77a96be9fa9f20cc766865c0f3109c822a4695b0bed5536b6ae36f5e209f155b85bce5398"}, + {Index: "763", Address: "one100f4hf3eq3luhehnhj50h6zmk439f66zat9jlr", BlsPublicKey: "04f227a5a2c5fbf3881633e3185da69ffb887e8c7a91987566310f66241bf487855e4a6ae1146723be98aba5de695889"}, + {Index: "764", Address: "one1qt8jrrs50da8qh6nfc7v3y37dzky94wlt8ttsm", BlsPublicKey: "60dac143bf5e1383603e10bebe8adf9cbea58784c435b7c86ddbcb762ec51a7238c0d76e118dafa23ac1da191e988f0b"}, + {Index: "765", Address: "one1sjdze2qcc6zd8kfy3u80puyt324kqa45xfvxay", BlsPublicKey: "54d5a269780f56b59d45a1737f065a3477f53467a0f1aab9e1c4e61948b06527ab019e76fa26f057e1d6e6c2ad53c50b"}, + {Index: "766", Address: "one1ng26uhtefycm6yqu68s3hs562lrq5qgq9j6z9y", BlsPublicKey: "3f5af89a592ff103c023f2bafdc77ea94b26b5bb55e1aa438bcee02e7e6742505bfa539b67f3a7846ea014b7410ea293"}, + {Index: "767", Address: "one1jswndgnf83y0lqzuqylwxryeegdyv5ysxy7h0a", BlsPublicKey: "5a9dfe4359434acc8c9da6aadb8f60ccdbfc4919112fd55bd527b2a168571bb2664fd59600e8b7a74edcb0dbfbd08602"}, + {Index: "768", Address: "one1xk7xw45rx9xvqhjdddwefe36q467r64wctejpg", BlsPublicKey: "32a72f1c033418ad5dc7c49ef7b0608d6f23b81e1c8ca3c518029578934077b5c959c2bd5b2b7aad357b1653ab1f8488"}, + {Index: "769", Address: "one14z7racx00d5arj3dxldw3cqf0xlpnuvy2c40sx", BlsPublicKey: "c2688c5158bec3f08db5f2985e7f3fa500ee903c86d470bce5ac328afc8cbe7957eb56dc66bc91faabcf7cecb8b2928b"}, + {Index: "770", Address: "one1k5dupj98gsgn4c9h8nvnl6uuaz0mu4y7e45lys", BlsPublicKey: "4109c3a35369b8e3b5fe99c97fd19554215c24b5e264b1c223484af6099a2efbeeba390d1c0b259b78ae33606c626484"}, + {Index: "771", Address: "one1nphemqzpvr2p8zqhlendvchgty4y509ly3w04y", BlsPublicKey: "79a6c9361fb3f2a6563499cefd839e874ac80c40de40779c7940ff2ec65d9ae199acd904f63d841cb3641a6298dda618"}, + {Index: "772", Address: "one149vcuwyzk799mh2ynyn5knv6p596s526llf008", BlsPublicKey: "48dfe099d42b9d0f8372b97bf724af9a1e5e93d69e6062e6c98250c2d3cbb96d61a321e81e08b6b40dcb8eb64d29ce8e"}, + {Index: "773", Address: "one1mye2lfm48y053d0suyq0nuh82e3xat5rdfdwy5", BlsPublicKey: "541bf63e41338fa56944da29688d1e9903bfa739b079e3f12ea6acb93ad4c73a21e536899b3a13751cd8de38d80f0094"}, + {Index: "774", Address: "one16qjzwvpgs03shguqzsn6fcwxujrpajhhgl7akp", BlsPublicKey: "aa7b9881e323c929162a8ae3490cba4f9354c39007542c0299a0f87e3711bb128e2787423c32afb19bc0b36f21ac7d03"}, + {Index: "775", Address: "one14t6efaacpjda2rk0rtdqevde80kg3q0h000w73", BlsPublicKey: "3da541ab4c5464f899e9017af352a6a532feb96405f291afc123eb150af7bbc9ba791bcb300b12834dcf0929c131db13"}, + {Index: "776", Address: "one1e2t0uy2y8ylrljcnj9pmpqwtdtccasttta76g0", BlsPublicKey: "41ba8476df84d2598d78cba685b94a89044d46dffdf8d09c9690bd432ab83ca017330f3f821dd89db45f8db0d5170693"}, + {Index: "777", Address: "one1dhj6jwseudwfxc57l9zrdw3ld2kg8akvj5yx2w", BlsPublicKey: "fc94bdaeb692fc0e36a74a31961e8e7a88bb898ad649e8272c4f83d7267d49214f475899982ddc5a5e0f30a0edd7248d"}, + {Index: "778", Address: "one18zy93uf66gwarhq4qfqfpl3uatvnhhhy9pdrcn", BlsPublicKey: "88a8032abec54a9369304f007d53870cbe37f057ee719349c4505c2c0cdd8729b53e7c440291fe54ee651233cca43018"}, + {Index: "779", Address: "one103gjkkp04zg2wslzta4f8u7npfpgxun09grsgv", BlsPublicKey: "30c27f63aefec1161a979c08a3a919328484094a7a69968a3def6d4a82e92c208745ec9c8264ff4504958da641dcd917"}, + {Index: "780", Address: "one1xqtjy7r394psvl9y5v6g24xuhuu5neqvj27p7g", BlsPublicKey: "2b3e8f4d0c72e79d547a872e5c60c93954be64caf2c04f7770191d6026622d84ea3f5cb54ede5421cc612949c3ed2099"}, + {Index: "781", Address: "one1ahfuksexsqarzaqf5ey75dj5gtutegl5rffu2u", BlsPublicKey: "d868552e3fd0a8d5a1ee6dbfcbef513aff73d436757adfb2a32561a4a87b115b1d58d8cc47cfca3ba5059d7ea3b58d14"}, + {Index: "782", Address: "one1yz24t3n6yj4z0djtlfez8k3n8jsgtq0xmrnuyx", BlsPublicKey: "42869c48385b88230370de33e7305869337c401fb4a95e69bbd179400a404215ca00cc342ae3d5d2d1b692123b4a9313"}, + {Index: "783", Address: "one1px6xr0la6rn5pjz9ge4yxsejmf0hrz40el6q58", BlsPublicKey: "0bf69f656c3b75f3c7760dec635bf1a45be64d8fcd9008004adc3d647c4bc848656aece65243d8c796c3c08c9f2a2418"}, + {Index: "784", Address: "one1sg3qez5dmauttqrj9ca7rc04x7sxhf4hc5r7u3", BlsPublicKey: "55c873ec8e66797dfeaf62ffc3b3f076e1482d580cec89b90432038e28bb9892650c0c0f6872a2cb7b8d0f07142ae187"}, + {Index: "785", Address: "one1uuj8w8wwhm28qcl6cad0vv96nde4qqfmsjmnwa", BlsPublicKey: "e8afca301568e3439c9b1669d352ce4bb2cb8ed31c2bded99b4b49efe0e6ed0bc8996ae0e517771247d6b0e745163881"}, + {Index: "786", Address: "one1zc5rld9tsp78hctx68v3jy4zemy6x4zesu894t", BlsPublicKey: "fb0cd0027f775de9231949418e62d05cb45c7cfcc7470541b61c2a2cb61db2efa1335f2e911029faafb1e856a848c891"}, + {Index: "787", Address: "one17nz0xhhm3wfht4kpcs3fch3jy2zx0g0ehln53q", BlsPublicKey: "6889a0ff77cbeb1154fd1693c573761f73ba4d86fbbd7c8d91abbcc4b3c45a51b26d74374d37c5dd66988acdaa6ab50c"}, + {Index: "788", Address: "one1vcyf8ttwhc53zwwjsjzgrknevgan5c9t8tajeh", BlsPublicKey: "e59c174169f7e0d74f99dde863682dd19234a57f14c666702b268d94e1fa5a0402c6383a56b854285d7d3f1d71a92f16"}, + {Index: "789", Address: "one1nshplnjzttcryz3tdqegm2q069dfqh9mkvwtqw", BlsPublicKey: "2ca390d131aded8247ba58ee060752b90f81d169a3ef464f93ff2fce67425fa6dd2c7fa2f04e0a85266617d3cc6de819"}, + {Index: "790", Address: "one1s6fasgu7sk6z5c344l03tae2zre26zty43tpxk", BlsPublicKey: "3dbb49757a2808f6ad32b65f1efdfd64ad3a2142223a337576e3aa143ac2b80a16073d3b119753143ac7bdc446f93307"}, + {Index: "791", Address: "one14ec7ze5h35jz70k4rh7acjjyscqmd9w63gml6s", BlsPublicKey: "411dcbbb96f795981eb4af0d9bb623f414325457edd0e631992f7aaab58e4e303d005a7d7be2b5e5ad4f699cd89d1917"}, + {Index: "792", Address: "one150k2r6pudvq2y3ywlnqy98echdu2g0azd7y8a0", BlsPublicKey: "3c8045b47f45205607926577467f4eebaca3426e35cdf9ac1b8308895942221958a75c769abced37f75ebae64f3eaf8a"}, + {Index: "793", Address: "one12q8ddzscl3rsqyy4gaq96cqdhdtzdsr4wx8sw4", BlsPublicKey: "d234934bc8304b61335713caad81a74520e7be803df670037a895fee4c0ac9442449f78f9e38f1cf661c51f0429bb301"}, + {Index: "794", Address: "one1ye48x3nea4kxr6kv9klqp6k4mgknujqnsx93jr", BlsPublicKey: "7ba716f8786f64941908ec1dafe8b26ab33b4d7f41eb11e0cbe070702c2c16190ad32a39ef6d432a7be28291a7970101"}, + {Index: "795", Address: "one1zed7zzmf9nm9vuzlddfvhn7qvnzhj54fr9c54a", BlsPublicKey: "9249b3a63f59fc8a0f54b9d3572f0f0e3ab8e0453b12eb55bbb7cb71db7efa5adf8b5a2284fbc53c70668d2365675186"}, + {Index: "796", Address: "one1keydlc7usq34yzhm5p6j4gl67wynxngaeft7tz", BlsPublicKey: "703306d821cd8f4a56dc6b0c6985b16d2053f47fb11248b0a2eda0777649035c110b47fb74e9979957578d6689545911"}, + {Index: "797", Address: "one13q0waeceapq7ssv0cd877kh6j7mypvyt7f6v28", BlsPublicKey: "9d4303586374c884042fde3e4cdb7c2fe10a4e751f0713a758fd817bc69be8a3ff3c7e27033ada9bce2beeb918f23011"}, + {Index: "798", Address: "one1ke9p9fte2rnk0yxhxvuw7gvtu3sexux30gtrsn", BlsPublicKey: "df48618a4be620731783168aed5b675d427411a7d1c7a848dc4bf2c044cb5817ef954c36b83849103dbcb2609ee8400e"}, + {Index: "799", Address: "one1na97ttrcllnjd8rev4r8s9zfpzyr3kvqme3tu6", BlsPublicKey: "7751ee916ab0512ce980ae332f3c17fcc4fdf5616422bec512f807f42e860250ca38401186c573e896c3050b8fbd0117"}, +} + +// TNFoundationalAccounts are the accounts for the initial foundational nodes for testnet. +var TNFoundationalAccounts = []DeployAccount{ + {Index: " 0 ", Address: "one10fpryt7dpscl3m40laxajhp7ggrvl3v57jxdy6", BlsPublicKey: "00208598aa8d9daf9d4735da1bf6ba7946dae34f424000ff5bd14287866aec134cfb7d49c9ed0c8df6b1e0ca51c4f010"}, + {Index: " 1 ", Address: "one10ktlpgenwqlf4458e9lhszdcknckgfd66yrjcg", BlsPublicKey: "01be7f6a72830aa67a769771a775532d76fba6c860544734b91a5a876ebbc6e68cf0046eb4b6443ae29630f5cd0dde15"}, + {Index: " 2 ", Address: "one10praet6mm0l607umprwq66l760l7lpqesvh0le", BlsPublicKey: "022728ca2007d0eb0ac27f0bc36e8c3811558ad5e3d1868fdcbccf867e9776546cdbd2c4789feda447b92a62de9abf82"}, + {Index: " 3 ", Address: "one10s5n0xjjnn4g8mcpx54pekl6kqne30tvqslfk4", BlsPublicKey: "026657f081601b4c8e365cfa8fda091240281a89ef28b4577fb84daee7b25391e843c2de6f2afda0dbf42f2f4cedc08d"}, + {Index: " 4 ", Address: "one10z7jlkzlrvlwnz5ttw3zetwuvvndsmjd07w28q", BlsPublicKey: "045b4f4bdaf5449c24e7f274f306a2b3a20a06564ee7f4491487779c3070a717b14d6ab1c4e05ba44de0b3364020f398"}, + {Index: " 5 ", Address: "one123ulv4d6wvazjmjmhm5na7jdcayjvcj5v5y5we", BlsPublicKey: "04780fd5aa31578930af373e6a941c124377d4b5503f82928f152ad8bc348cd8c63320f49df9dcf1347d68f7c3363401"}, + {Index: " 6 ", Address: "one12pep2vmjrlny5u96ym9e05gzhtd37cr0frwgzq", BlsPublicKey: "053bc2790af7dda19f5a7bc12aa6acf6b81aa2f302ef29430c6cf3e6f70b22a72bd834bb18eb94ba6377bbfe35c99398"}, + {Index: " 7 ", Address: "one12sy02jy5ugzxe3m70e3f3nz8309qnsp3632u5k", BlsPublicKey: "06cf5262fbd034dc7621ea281cb5d9468f010ca0a7c7d61a7c8d906d0ae012e16d590b3e9976071e3b71345051cd1591"}, + {Index: " 8 ", Address: "one12y5xwhtyzftjslg000task3xvehuvrvsvxu5xn", BlsPublicKey: "07a9ecf33d646b8aafa6995c93688e2f8f05c9ebbd74c9fb9dd62cd70e8f8bbc1638670c60ee5d69e6dabbaad6a35502"}, + {Index: " 9 ", Address: "one137z0j5hn6uluqt7kg8edqtnuk465g5dfy4efl9", BlsPublicKey: "0a0d38183adbf0a4bbf7546745a6640233c39b274c56d877fbfb0cef8d2a26eb507e02c638c00b1c4a85ac7a1bb6640a"}, + {Index: " 10 ", Address: "one138cse8e9yt6lq4e4lhz5hu0vht064z8avd9cld", BlsPublicKey: "0ab05859ff4d02448272b62aaac71300b6fed30ee3cb12ed448c8305b0f62c5ae28b28860a2b151b841a67b63bfd0686"}, + {Index: " 11 ", Address: "one13awsjzclzvvd7yanzngkcagxl60rgx45zukphm", BlsPublicKey: "0afd6ffb393b400a53657faf980dab3d4b4fc5925deb8a50f872ce159afdd5201970670e6abd47f8dc59d80dbb895307"}, + {Index: " 12 ", Address: "one13e0wynsanuvjwjfy0ry7qycj4s6gy2k27w3kjh", BlsPublicKey: "0b90cdc0190e9a2689f89ffe459b9aa33b52c8f1b13aa136bed4a895e149287d88b49e341d29b36cb7326044ebf43595"}, + {Index: " 13 ", Address: "one13lgwu2pk8njft6f73ajamnj5mwzyj9ms2vezxs", BlsPublicKey: "0e543d91ce59f343a03d8d3f596ea82df93def74f6459aef77fc1e3547dd321894df55fbe57197cf5f12bc2ada91498e"}, + {Index: " 14 ", Address: "one13mq5qj84qvkfxxgfpe09tg4wp58a8jeufr9ccn", BlsPublicKey: "0f3c6493684070333b7a184e0ee76fd63a8880c87bddaf3469381d956a205e8b557fd7ea899177ead38d9bc8a377e113"}, + {Index: " 15 ", Address: "one13xydz403f9uaqmd0s43f62rsfy8a35zqfp47z9", BlsPublicKey: "1554790fce1d1636c7bfde9ccac008c42b08362de4b31225ab6fc4cd00089c94f06d9dc9eff47c4023d0317d990a8d99"}, + {Index: " 16 ", Address: "one147jjht4ce3dkhlc0y9e9zsu973nsdl99t3acsy", BlsPublicKey: "15562c6a0db02e39b20402d1f483ab7d1cd36b5fb3fbd55d37c2e36015272e10c0a3d0c1d632ab296d408adcee9b1e07"}, + {Index: " 17 ", Address: "one14fswva65ceynwqv5vuqylyh8du4q44a9ea0d76", BlsPublicKey: "1634a4e6247b3479c4a1e64d26c125820fd19e176bc265e5ebc7d3dc5803377a34d6d044137a978e561aaf1dc648f880"}, + {Index: " 18 ", Address: "one14prj0znw3p4paw2g96wrvd3h6s3ynnc76w8jd5", BlsPublicKey: "1b717919661b97e11808a52be9a6b58ae7807d6fe13a41e7e96af276cfd1eb2dcf06ed6b0a103278ce2c6e888268c98a"}, + {Index: " 19 ", Address: "one14ra0jvcxsr7a2q5q5jnzmkw9cwkc4k33uyy3hv", BlsPublicKey: "1dc639cfd18afa0043287a563695a5693f90e103881bf98673833c9cac7e1f382c839541848e3c8357ddba00f6db9d94"}, + {Index: " 20 ", Address: "one14s4euch3nzv7apv9yryc9heeznufn45e3el65p", BlsPublicKey: "203381fe273ccd9f8be473f8616374aed1b3190e19f35481eff3dfad76f2e1b206ff2174fea0d1f7bc64646e5d14228d"}, + {Index: " 21 ", Address: "one14x0rerjnzj4qu2fgy2j2yp2v60dj9hf9zv5skj", BlsPublicKey: "20d000f7aa4f25c71b37f0b54365138e06cb3866b439e984410c37880fcb276e4e3165d929b5be0d555eb46bf2fb0692"}, + {Index: " 22 ", Address: "one150gkw5mlt278jmmy0gu44rh8a07uplkl6xt3hs", BlsPublicKey: "221bc9545ebce05f4f2d2ff9ff7e684d859afc0f805bcba30c2f2da99634d3e41d02aac6d5fded0a635669a719f22284"}, + {Index: " 23 ", Address: "one154lagf6l9emrrp07pwh8gtpzwfjnadeewfjt78", BlsPublicKey: "22330a825b85df788d2aff2dfcf98bc1811774531d9b06709654e4de5f31fe0a64402368aba90e58c8765eb400336414"}, + {Index: " 24 ", Address: "one156m29gmjvudzktrq039adw87kfchg3d32fqjqs", BlsPublicKey: "2391dda126bbe79389e4c22179058e48bd77479ad2ac3467156da4eadf7248120ca736ddfa3f7025d7ad0deea583fe0d"}, + {Index: " 25 ", Address: "one1575dfufs8xrfh0wjzw2hr8yreyqrr0u8v9cv73", BlsPublicKey: "27a676c77f779f14f7eb8a7ff41a13ef831785c9b6e9da2e3c6b46d40eebb75a39325e80667ef73182c907a8ac94f58f"}, + {Index: " 26 ", Address: "one15gtf4gtuay7pm3kcm2j7grpaun7a6e9ls43t56", BlsPublicKey: "27faa2c1df7883222dc6bf9a96e792c0976dfd387fa792416257b125260f2e697d214cce80a6770873ec42e399abbf04"}, + {Index: " 27 ", Address: "one15s2t8q95v6gyva7efzrkug69wwf95f82sgd2ax", BlsPublicKey: "291264dbdfd5f27732cc878cae3de080ba4e68da98403b2ba45b4e054e97e658095b291643b98445fa29d25c41868b8b"}, + {Index: " 28 ", Address: "one15xv0mnsj4aa3hkkeelmrtwtdyjv6xlurtyk5ua", BlsPublicKey: "29980152992ac813ef10c4e810098eb66952e4d248a1918cb794bcfa3f748b55080689956f89c521808fe3163e3e0d0e"}, + {Index: " 29 ", Address: "one163rq8n292lesxgqrrzg7fk3638wcf0t6u7xkdl", BlsPublicKey: "2a3e7a8f3e5da124fa7d27f2293b3426e3a9bfaada68422ea027ac3981d4d1872df95d495b5766661adb6775b2ae1991"}, + {Index: " 30 ", Address: "one16dfphs8tzp9auzlyes7gpyzzfngkhnn97ufz5f", BlsPublicKey: "2b5bc51ea9d12f31da43867adc49847ad5b41a80e6331cfd1dc02e66fc2719b201fee2d15c82f11d8dbb6f667da3098e"}, + {Index: " 31 ", Address: "one16en575jyr99kw3xehw45050rvc45uuckm9uf6v", BlsPublicKey: "2b89f615cdb7ba5f1352aca79055a2032bcc3bb2e3e6b053e13e18c064598d40da9ecfd6898e03ccea2e570d70429e8e"}, + {Index: " 32 ", Address: "one16guln909kglp3shlmq9aj549amn6j5gejcxwpc", BlsPublicKey: "2c40dca8ffda509dac556e80efe39560fc306948aa6113e665a9b3033f712b6e879a2fac3e964202a0535e5cc406f918"}, + {Index: " 33 ", Address: "one16h8caxh4k3tfw2ejhesekdrga3fup938g4tp32", BlsPublicKey: "2cc0fd74c2479d76bc7fafe6fd5494600826dbc8e47585ac5664cc538f47502fccdf59b23638d1be89aba0542f12570c"}, + {Index: " 34 ", Address: "one16mecdl7fp54n96x8u3wwu9e0jjlqgukrwhvl56", BlsPublicKey: "2d4e5d474aa9b3605706a926c10486848ad90bc8ac428a6f645722cd8706ca79798c8bdcff95501402ec989fffab4699"}, + {Index: " 35 ", Address: "one16uthc5kt3j2hzxpkt294f8tgw3rurdsmajnycz", BlsPublicKey: "2e012efcb16543b2c7fdc40c717a0a52503a0f8ca00b2249becb4939c65826e13a7a0428ebd3af0fdffe78a858120a8e"}, + {Index: " 36 ", Address: "one17aljqpzuxgjsgq733mse45kvvrwlges5n8hpag", BlsPublicKey: "2f2208dc119ecad8fce5af29568201a5ba08d23b7965af36adba2632e1ea4f75f7b6d96570ed37d29feb49f0bed39189"}, + {Index: " 37 ", Address: "one17mdy833383xxtw6rlzdjlj9t5lg9ld70dyjwnw", BlsPublicKey: "2f34d72a223a4809e6b018972ab9a187e620041f5fd5318c305ca3afd65f48c7dedf07a5eb394faa6d8b1fe11e45e014"}, + {Index: " 38 ", Address: "one17nhau9quvr6492dkl54qenp5tsx8v2d7zd7hj7", BlsPublicKey: "2fc484f68313aa85e02bdf10378870e0db1461ffca898666f9fbe915beb8d1cf1d5194720f87fa443ec2596b4e219796"}, + {Index: " 39 ", Address: "one17p99ewy4qj080q7qct2wlghxvaaldxntteht58", BlsPublicKey: "30de06153a79d9dbd0b9ac5d901a2c3484992b3915c25b2436c8f76cdacb7f67d41891072528d0da2724a53d188cfe03"}, + {Index: " 40 ", Address: "one17rwqxmu35wsujwuvatvcle947m9ef0738yf2za", BlsPublicKey: "36e6ad37bb650c459d759fbc5c5dae47b15d63226e3adc3e28f05ea0e92cf40bcae799d8b4c07d7de0ffe333f01b800f"}, + {Index: " 41 ", Address: "one17vuvsgns854f2h24z6u5e2eq9ntmrclnkk08sk", BlsPublicKey: "371839335e678099a94664c642725cc6dcc2acbcab15799ce4786ec6ba08daf6fa7c9bde5339123b27269e40b4105198"}, + {Index: " 42 ", Address: "one17wmph9qgzuekegsq9t93heeap669egauvcqmzs", BlsPublicKey: "37a9bb77c40cda752c59e8eb5c6d5e3de5146681d62f782845ac3217eb89bc432b6a0176024be3ef022f406235632313"}, + {Index: " 43 ", Address: "one18074t853pluqqjcds0af56r8nxaw5vuknezquf", BlsPublicKey: "39315505585bab9691ac16d52f0915684cb7ee0e58e8a6b85f85dd148c91b26c6b6461970d04ba3a331b9c24edf72596"}, + {Index: " 44 ", Address: "one187wf7sds7kmkgdkwww9klzvf75pf9ktqlr67ln", BlsPublicKey: "393abb109882dbf10421733878953f8afd1f8d4d369a71b83b256db07096f4c22485fe0cc637e6687760c6ee5ce21890"}, + {Index: " 45 ", Address: "one189qm0lnzwyxtafsatrrxnt395450n8rry5n9jx", BlsPublicKey: "3d062022c5b5ba771e64162a4bf8953ae16c4e9d8df710582c8dbe1447781a0295127eb4965cff54845d5d49acfe5113"}, + {Index: " 46 ", Address: "one18ckk67sc2peq0rp9sdn8x9w7y872d8lmgm4tsp", BlsPublicKey: "3e36b1c18043b2b7c7f53862e025d818d19589f8bcb0a784bbe299d3ae728c756b0acf642ab146872c95a4a0c8bc9902"}, + {Index: " 47 ", Address: "one18cl0uufj0wdffm6dkdvndx62tcgtwypjjc7xmv", BlsPublicKey: "3e526eb07417fa1f612d1fb9470225275641451615bdb1db41266a386a0845c2c3cc337b40128fc4bcb6659153188604"}, + {Index: " 48 ", Address: "one18hanjgrhxjm47dnk3get55ulgc3qxy6d2ugy99", BlsPublicKey: "3f4eb10045907989db20c540929a6367d6d8f13f3ef2337f74c4059a5f96d4618b8419676193bd54edabdd728385e984"}, + {Index: " 49 ", Address: "one18j42km4f5jvr5jhat6kvekuapr8dd9agpwsh2t", BlsPublicKey: "40832d85ca9f18624eca493c360379a23e055e9269f67762427d6af378f95366d748530a3bc73fd24a3ac1cd1aeb4806"}, + {Index: " 50 ", Address: "one18knruhu3gjztyza7qrvvfl7kppc9k6zc5mjcs4", BlsPublicKey: "422d0d12ffc9454302fe07a7a90a0333bbaadea1312fef4fe085530f002d3a1602e2b19db0198f0052fb1155de4dec99"}, + {Index: " 51 ", Address: "one18kzqvudscz52s2zg0u93q9qfqfgycv9a06xtgg", BlsPublicKey: "42c4c0eb1d624a8257743a98ece0911d2db40a325f4bd6d33d8361f05d8b3c08259593c5b3bdad2bfcb8ec74d4e3090c"}, + {Index: " 52 ", Address: "one18n33hk58j55mdmjh0dj4e59yh25zd6vmternk9", BlsPublicKey: "42e642402db15443fc1623e71372a2303eaca3944ad72ff6ec91d4ca69099b7d22e9817ebc4783d663b56d1dbd04470b"}, + {Index: " 53 ", Address: "one19460hfcqwkxhsmhyx3jjusqjzxcq3xxzwhyur5", BlsPublicKey: "43423fa84db176b374716c6c90a587ed1e86b0fbc67a2fc035687e905f1ad8107b7659e060c0fb3f9e4c63543a2e6310"}, + {Index: " 54 ", Address: "one19kt30u08aewm8mf94dwatndl5fc49cyp2y9fum", BlsPublicKey: "4497b72383a0466ab33fb62c92e17f520bed54353b381630a801c1a1e0a97f01fd45b494f31d051dbb708d8d53241801"}, + {Index: " 55 ", Address: "one19lmqk9hxwc066xpgrgulvct626rdkkcqctky9j", BlsPublicKey: "474c63dd1cb6b5ff3de4fe5b2ce31054112a12c5281b18f3531038e989c9deb9f888ab08656fa441537fb26fc7392e00"}, + {Index: " 56 ", Address: "one19my90rv4hytaautkunxufvmxtwnf5h4tfxw86a", BlsPublicKey: "48b305461806e1f0530ae7e5bfbff60344ab960db198cb03953564f4d6bc1c48b2a16fad3e65b4cb80700ecbc6ae0e0e"}, + {Index: " 57 ", Address: "one19q6szrt638kzldrs9tfxvz2xzz7s0sj0yzfvl5", BlsPublicKey: "4a1c9d9b0af81565175508faa6d61595c2423d7cd4af3dc2050730af6d5bc61b7cc632660300522ad1cd1aa63a923387"}, + {Index: " 58 ", Address: "one19qckp8t245uuzn6824m0la5a53pap2m532scps", BlsPublicKey: "4b4d639ddd51341e786ad58e8779673619b7f7a792b49a9c00b9b2d42f99b6f990f1fabcc4bf00fde5993af5d1632e8d"}, + {Index: " 59 ", Address: "one19qgwmayzz7zg0440zkaq4mczzjr0v568vrk2du", BlsPublicKey: "4b5e42c3dd6fd4bfed341b491f5cad28c7e63c090003a42017a5df2a61faaa1ed17951938ce645c0a2f8c7fc2dba4497"}, + {Index: " 60 ", Address: "one19v75a952zt7k4rlcsp59yv36t0ruk24wwf2uda", BlsPublicKey: "4c471f30a387f05e777068af1d422599540499c30c42b8d9efcb92a9ce683cb9e0da2a74adc6547ce83a252b34dfd292"}, + {Index: " 61 ", Address: "one1a5ppj3xnzzrlnpjaq3rx823etfea04u2unlkh9", BlsPublicKey: "4cf70bb0da0092089858afa885659a6abe2ede9b3e93c7bbeec1daad2b2c57471041eed2eb843ddfc07cd0a7b39f260e"}, + {Index: " 62 ", Address: "one1c03tqs8rpfn5kq5djuzetkuj0nftsgr9qhxg8u", BlsPublicKey: "4d9a013af5ea0f52abc01b545e6e1eaf8814a0fae497ead7b51aabb2fbd1d27007dc34065da8c3b86c1435de9e0b0e88"}, + {Index: " 63 ", Address: "one1cfaz7eatrvxsdq6w0kdndr7euclnufdgq84t3r", BlsPublicKey: "4f472a1e9ad8eb9736b14391ae254450fe69ffb68d62df823356dffd2b7c95fa4c8b1880708629c166967822a73c0484"}, + {Index: " 64 ", Address: "one1cfcy25kjj0zr9da6hckhcvrad2f3czw62gxvpk", BlsPublicKey: "50b4ecec638c70e09c2dd215c26e5035a4df57d70f89994980e8bc7eebe5247e517c8f6a9be548e1c81be9859a797096"}, + {Index: " 65 ", Address: "one1chsrgtytd0c03kxny5qf0drvzwvqpnz3shtw3p", BlsPublicKey: "54251e93ae5c5623e5f7d654e1c244c52e0cc6841aa4480b1f1cde3fe29189e5f959e3f4e1c60101ec94c27afb254890"}, + {Index: " 66 ", Address: "one1clp5ugkk630wxjnky53luq0mkn2jttq93et2tj", BlsPublicKey: "54eb5f1f80d59f4b17c5ad786db8bec5469a4f0bccb216f5ef8e073962d23bc037fd23cbba6185b83e91b7e65191ae81"}, + {Index: " 67 ", Address: "one1d3jun2z0e0c9y7aa54shy33az7rrrtggzxvc9s", BlsPublicKey: "54f8e950425a263e112fee8b075b89861f66fb27ae3b75c0ec6542cfc205771a89741351c8cf9bb000e2dc2bed332a80"}, + {Index: " 68 ", Address: "one1de3mfz5mg873hc3jhkh0nkxmas8n6xanqtru30", BlsPublicKey: "55763872d42fe278fe6be9a239d0f8cf37c17ebf7e62f2e21c8e6785a58538dc2379848e4517bd4f4c69fb2bfc335684"}, + {Index: " 69 ", Address: "one1dgccdknj2fc56d5qlqey0ryg67yvxcsezh65sc", BlsPublicKey: "557f85691a8ec38934e94e3d36b687f708ba6fb8651c884127e707d9d74d72025ae34142436613b57f002ce272c8d687"}, + {Index: " 70 ", Address: "one1dj6rrdt4dqc7syk5h483yh3u56qsvtea6hrjk8", BlsPublicKey: "55bb6cc1b1597f14eb498c5093f4ae8d532ed64f291877a6015ed460797fc74c1a2e83b6f669daa2611c66c21ee55c82"}, + {Index: " 71 ", Address: "one1djrn5z0c4xqw9fsgztmr5qr0qtztu5wrukcnh5", BlsPublicKey: "56649e59c535ec2431121e0b6f53b707904821717c8ddcf673ca9a703820bb8890728c3b529053049788ecf49a8f9009"}, + {Index: " 72 ", Address: "one1dqk0rwy3ajv8acmu5a53uapf23lq8xxdhhz8ph", BlsPublicKey: "57c8d3d0568c72412ac555dc4b6351bbf45a3e61122e87b505f2e3bca26d83190c249ea12448a9917bdafdd0b5722b13"}, + {Index: " 73 ", Address: "one1dupu3kuz5l7xahntyvk0ajaydklydc0x7gpdzj", BlsPublicKey: "5aa481a8f7ed6f9a9ff779bd371381a1f28e05b9965fa1a15c26dce1dd36541c230f84964881ec1cde023cba0dcf8703"}, + {Index: " 74 ", Address: "one1dx58jezurl39wd20t57h7mlnhqgphnk56wj2ts", BlsPublicKey: "5b0d7e565995844997abf5e7f1b331b9a4ac5089beb274397934d0355591ae810d94129e86cfec867562e207509d7714"}, + {Index: " 75 ", Address: "one1e0nxf4573gyy8zqjfzv0xez6na2tc00lfka33d", BlsPublicKey: "5c2b9614f9a083d4ac41ad86a72900d7a11f47aad189335ca4ab71883ccb450027b3634a25e906e2f02c635a10539307"}, + {Index: " 76 ", Address: "one1e0uwlqwa5uuy88jzqd2cgc8sen937eu4fr6fjd", BlsPublicKey: "5c8ce8aa7f1c2d9b396b31d3994e1233b5718df9e6bfa9cf3f1f7f1fa5eec1c04bac99d3bc382a1db25fe4698e12e18c"}, + {Index: " 77 ", Address: "one1eeh2r7hhj7reu9y2rs77u3mz4fahjryy5tgz3k", BlsPublicKey: "5dd974d5879c02f7f83bdcb2662bfdba2d951167423d42d3edec4f2d7dea750768cfe0e1fe94b0e6ae2093c4c0e0fa98"}, + {Index: " 78 ", Address: "one1eztxev0kddmyt8hdqmwzjvmklfys9j2z2jjtrq", BlsPublicKey: "61646ec391f76d005240094319f19789d86b99f7329e147f014ee08bd9472522729612da11a0e3b447ef4aa22b704b87"}, + {Index: " 79 ", Address: "one1f0q4fw5uf95pm6fqtlcpgu8xdsws2c5acucrw5", BlsPublicKey: "62ccd79997ba7064bc6479972f92627c6c2a19eb112968b435504165f23952d260da8ffd8854c05a1e0a772159655f11"}, + {Index: " 80 ", Address: "one1f4xze436m32l9smvdte2v4kpxeja68zjahzqz3", BlsPublicKey: "678c813e04df2e07e1fef2a6b284b430aa33b394796a777372c81194455550b467196527c62b94a4d3ad4627bcaebd11"}, + {Index: " 81 ", Address: "one1f56ngjnyzvqdyhpy345533avdy2e9dxy32ukwv", BlsPublicKey: "68b2239a6381248a71b77db1b08aaa96c573e541af9bc27662555f48fe7fe8a86b71c6a0f3678247984f322dc3b6ba87"}, + {Index: " 82 ", Address: "one1fcskd69r72dxcz0xkwu3ss34r8f6eemnyhteyg", BlsPublicKey: "68e27dfcbc02216f4f11a2d97cbb2408e1c612de6f9ea7de39e8d945bc1c10c5075fe907b25cf145a4203d7da59dd291"}, + {Index: " 83 ", Address: "one1fhkth2tjfn0vyj0tdr6smnlgdl3ny0yelc8260", BlsPublicKey: "6e9c959a6e8e429f6399712244e79c95d209f0c178e3f405eea5fd8c3fbd9406a8c30c47457f0f6d6866d3716624c613"}, + {Index: " 84 ", Address: "one1fm5yvvwyfcms5anzn2ua70a0ufjaa4ul0acz9a", BlsPublicKey: "6f43136b412749202831a2f52bcc1885d1881d7f735d4b4dff722a25a8041aec68e32f70fd3473403fbb752866687703"}, + {Index: " 85 ", Address: "one1fq9jk4nmcvj3dpkyp9yw33lzq8q80lxhszsywu", BlsPublicKey: "732de52c070d76a4f76b9ac866cdf20dd9383b25fdf20f8d3cf37f5a158ad811761337b856510bf5e5f81ef4c5921d0f"}, + {Index: " 86 ", Address: "one1g32z86hagm742w3nnp5xezksm8x6d7nhgtm9v0", BlsPublicKey: "73c8f79898d9edd6f264bd8de4177d2d453046197c1277b82ec8a71a2155a613b5ac3d42d46ad480bf5169f814db0584"}, + {Index: " 87 ", Address: "one1g6e4d974c0cp425atgr30lynv084he2dhmpugs", BlsPublicKey: "7472e657756652124377e0b3ceb46f137f44014a33133ddc2d5983baa0ed25ab12eb27e7425fb009b62a7bd85e220f84"}, + {Index: " 88 ", Address: "one1ghngp9kr2jcexj05er42x0nk90s0ugdpj5jdap", BlsPublicKey: "7500ebfdccf1f562806e65e2c797a799eeaa07f6c4bb4ce2b7374a1d632903fb3741011374f79ac426c24387ac052288"}, + {Index: " 89 ", Address: "one1gnjfrczxd9p5v7ma7zegs39fdtnkckyh9ufpx0", BlsPublicKey: "7539ac32313f9965d5fe5ccbc1553872ddf4e0a4355a3c93cfa67a054e83dbdab89cb5fc6e010bab0ff1fce3877b0800"}, + {Index: " 90 ", Address: "one1grk092vg66rze3dk4mpxg6yq88360t4snpmvne", BlsPublicKey: "775637b9d60ef68714ac806038150ef0615472bf784f56ba74389efd6ebe58cb4ab56ad0c5722a73977add9ce3b3ad8e"}, + {Index: " 91 ", Address: "one1gvxsem4s92pln3ef7euvgm7h28sq4h7r02t6sa", BlsPublicKey: "77bf24ada33e846f1d991d61e6ba030a863ac2c5d6b87b5da44ccc4db0549cee5100761832449985ddadc0ba920e100f"}, + {Index: " 92 ", Address: "one1gyemvctn39p25nfpkuna5lf8kk5hh7acml0ft0", BlsPublicKey: "7bd86877fea3a70bfcd671333ffbc2bc6b117f36feb22535368fe230fc8407ffa5f2f744b17c483711f17cbda7bbd486"}, + {Index: " 93 ", Address: "one1gyyqw4xu8vapy9vhzr6vzqe8ptpcamtfzf4l5z", BlsPublicKey: "7c10942be3c2ce3b1d1360f8ed7f55ffbf0e2a47b402b5bf653ff1c8479bf8e7cf59034590055ebba92eb0a6dadcc181"}, + {Index: " 94 ", Address: "one1gzz4myqeafkzun9me9myxfxp9qpt0uydrsrphe", BlsPublicKey: "7d3fe8768fc9df46ab3674cc3cc2721d85c02a9d9b38a0b5ba4c9ad6a512189e52ab2d68758c2b21264f9807770c2184"}, + {Index: " 95 ", Address: "one1hja0uwgzzsy8c7lych80lwhqut7y4n4kmgf7lq", BlsPublicKey: "7de62b2ef31591c6ab0dbcdbb3132d9604b20c74cdb9af3626c2f3667f10768435ac12fc4b1d3bee8f9acd58de6f838c"}, + {Index: " 96 ", Address: "one1hpgaxrswz9cnyqcmt77gqw8x48wxt599gx9p8h", BlsPublicKey: "7e70d7d150ff7392d46120db7509ca6a1b613d572d70f85d89632f5102553fb042030a7679a0df70839f6534cd359d92"}, + {Index: " 97 ", Address: "one1hpha52ez2t3w2tw6ch5vmapzyca2kangfss9lu", BlsPublicKey: "7ee80fc150340f61425a19960457d44c1e917759c63d509f4b87e67d1b15b701767061ed9b4a1095831e62579fa56e93"}, + {Index: " 98 ", Address: "one1hpjmrnelkq50vjumwvw9vc7akpdgfrkg96kxrd", BlsPublicKey: "80e2a55ab8ccd2eb00aa7632ad25409d0bf6709ddbdf93c22c06e46c2d7b8bc7381390cd7afad70ff0ec3a1227910e8d"}, + {Index: " 99 ", Address: "one1htkxwkjf0h9q98cle0j5mackt2t4qzte49m7gy", BlsPublicKey: "81d484c9bcf58d39bc1de4673207923b1c154e003a25d9dd1d92e96dbd0642c53a39cea4c174e968f51d338439e58c8a"}, + {Index: " 100 ", Address: "one1huh6zdj5z3rqg4v83h9278wlatxy9a84f4hesd", BlsPublicKey: "8268ce2fb74becfae7a4152aa3febc688cc64d1d111ab51c0e2cf07ca7f53c7680bdf0a4e6d5ff3212abc12cec2b3411"}, + {Index: " 101 ", Address: "one1huvk4l72vv2c2504msukkdz4uwrtlue0z0xmcn", BlsPublicKey: "82bf1a81aaec8f34dfbb78c379892ca18f3b484bef2dba6a17f0bf8bd9ebb9a78d9be3c761bde21ad2be65e14a1e838b"}, + {Index: " 102 ", Address: "one1hv9mt2664tygfg4kfuure9jcqd6m6hdh9ath6n", BlsPublicKey: "83228f16da206cebeb34a988b77fb20b60564f1b7f3d74e09c472acafa528a8127505d8ef0ad574148d8cbd31953998f"}, + {Index: " 103 ", Address: "one1hw04sta9q35t7qzve7k33eyz78jjq7lurde544", BlsPublicKey: "8327848adc8edaa41585337ab0eeceaa9e4915b877bdc5441265bb870f518062d5eef1fdf905dcad842f2784e6e30a97"}, + {Index: " 104 ", Address: "one1hw5davzkyjvcms2gqld8u5jj2fm6ayexerxtpx", BlsPublicKey: "83505aac77d131beb8a0b79de1e583127deb187f7894717e10c3d039f5a0703af671b9b86f5a027e01f9202e9356a300"}, + {Index: " 105 ", Address: "one1hy0sjz52ju2adzwa49ld87vs5ad5gtyhkjane8", BlsPublicKey: "8595dbc7ed53b1705402ce6cf018a5d5cd54705195cac60889ea6c06c9836ce74b754b0313e58041ed1ca92155b7540c"}, + {Index: " 106 ", Address: "one1j0jw7nr8wfxkeh2wqsn7d2703k3ae0eyrhxm77", BlsPublicKey: "85ff4535b8ed7376161ec4b14931081c12b3447614f24323ce8ce57c575fd8f4fabaafe8d3aff024748e0d8885ee7a99"}, + {Index: " 107 ", Address: "one1jcya622p6sc7gaaj0euat78rcwzfj66hh9d74n", BlsPublicKey: "873fd8aa7253ddd56c86b580040cc406eeeff2c5529962fcfc718748339ef275572c46cbd86dcb24bbfd878eb6ef7091"}, + {Index: " 108 ", Address: "one1jfdph4qqmyv99jh40r9gk5uxmszhuaqwjy32hl", BlsPublicKey: "87d7d9d19cc4b69c1fbe24ac6b4b656f4623c04b7092be8c960569d070d1510c90db4ca1e8e2812180dee9a73c7db215"}, + {Index: " 109 ", Address: "one1jr9tck4ykd5lul389w92dcuyna8jf9mmw9u5jj", BlsPublicKey: "8b41b0212c2a0044409bf9c109573616206751da407ffa8364d0024d84c62f881ddc96f0afc3be90372ad5df0c1dd000"}, + {Index: " 110 ", Address: "one1jxk43gjny4mkpkr09fgvt4upzr7vxg35awq8s5", BlsPublicKey: "8ec51f2917bcade79911b522a60c035f4119b56cf4692fd59fe0be85812801e401b07224eb28708b2b3d53c2f65a7788"}, + {Index: " 111 ", Address: "one1k29qs8756jfdsmqnu5dsf6mzz9467gadm7x5up", BlsPublicKey: "8eef6d08ea12151600db6b6588c43125f3421684ba24930b613984fc983479a776202c0b9ed067f3c8f33901129e160d"}, + {Index: " 112 ", Address: "one1kgvqg9lppjdtydmy6daquuzxp249ldz7psmsss", BlsPublicKey: "9113611280fd3f66fb5204e2765956e91241dc88bbf9a3dc0c9843420a4f7cf636d00b9ffc1062c041b27b8694dd9980"}, + {Index: " 113 ", Address: "one1kjkgpcp6tl9m9arj3f9lfuj2w083pcpu3x9673", BlsPublicKey: "919623562c03c8a7d7289a495599dfe586ccc3c872b4d7ca4de727cda786cdac392764df937f6b01a4f7b6a7800f9c17"}, + {Index: " 114 ", Address: "one1kl6lyuml446myh545q7yzh8mfjvsfvxfgwx0l3", BlsPublicKey: "9214ac0a25656dd3a1da077efe3284f33be203f482bbb865110ea0d4860936d311d40c9fe043e3a2333408c1c03f3311"}, + {Index: " 115 ", Address: "one1kylxs6t736z64ykua7x24vzqzpggw6dgtds9y7", BlsPublicKey: "924abadef271373c56d4696d5973f3d2658a0525d462abcd803d9014d5ae5372a0d23e226ac18c2e03ab856a2abd7e8c"}, + {Index: " 116 ", Address: "one1l4lhmfv66mand292jq757alnqkekgk3jr2eqke", BlsPublicKey: "96194a2494adc9c512c97f3194e0cb03f97c1989f7ff5fd9a5317b6cd5e8a04081d5ef163ddc6c8cc7bbfb12a1f3d583"}, + {Index: " 117 ", Address: "one1l5gsfznr9ye2y97da88kge09fmc95egeklquh9", BlsPublicKey: "99ee38ab804170a7815d87a793a3df6c571bf745db2a66f7f3f1fb9f17ac2049f42aa7d44b2c9f83c1f775f9e11bf492"}, + {Index: " 118 ", Address: "one1lewvpen4999pkq9gxkady794mgxudzznxgz6h5", BlsPublicKey: "9a6bae33d9deabe9936c0579ccba00cbee9dee79d9933b7dc72ffb0fe36c3f1772af085f1efdc4c70cc721a2688d9595"}, + {Index: " 119 ", Address: "one1llasqcc5dkm445j2wwcu8n404au0skee595ssa", BlsPublicKey: "9b994095500bd800d8053fc6b3432d25360e9a468f28816619fe0121d3a7d988de337724620bef0db1d3a92ddee84b06"}, + {Index: " 120 ", Address: "one1lmx9uqp3a70ffal4k59yz2np70qjfz75wpn2vv", BlsPublicKey: "9d5f76c1ef21f3a3ac1b9a644216b30f76132a3c91152370de34f1a4f49af374bc0904bd24802272bd42e551bfd9810a"}, + {Index: " 121 ", Address: "one1lrfdms8fnwfz0f25kg0xk3z30y5qplx5352zzh", BlsPublicKey: "9ec02881bdc71f2ad81d75502951cc8e1e27d7e94e3cde1b886a94142e6b2c5062723b531667e7a292cf54ba47c2da91"}, + {Index: " 122 ", Address: "one1lx4thvkmz6dg2gu9cytw3uwfrndd9c36rrt5sf", BlsPublicKey: "9f87d6d616d8984f53eeceaacd35281286cbcaa6631f515bc1b215a037138b691551b7683a8b8de19c9917710286fc13"}, + {Index: " 123 ", Address: "one1m89z0kajx69c94xl66gks6yff677n43kaktcrp", BlsPublicKey: "9fc7666b90478e20ddb95c5d4530e995de6d028f345215748f6b38d435b27fb3cf3bd915326e8c46ad0bdbc6e0564d80"}, + {Index: " 124 ", Address: "one1m9x85qszuvjp6nqfrtv26mzwctl7fnjl4hl20w", BlsPublicKey: "a2485629d13820d64a4f5bfb48dc2af7c37b3074a0fd7420fa9a52dcd2afd9124af2947af5356dd55f99bedb06a61d17"}, + {Index: " 125 ", Address: "one1makqkzufgttvkelql0arflxjvp76347sv0wdtm", BlsPublicKey: "a3b12782b230d3b94309a8ddd2d6ccefe81f00eff1009839f68cf7a249c47599f219e6b5ff9a7441747eea13fe94e613"}, + {Index: " 126 ", Address: "one1mdtfee22se6zk2wekaqsnrf5u248xphqty73m0", BlsPublicKey: "a4cb07d145e2184e6f35bbfbe4896b32af137cb935ad0964dea3efe5e40b943c8ba1157d30732c587f192ab931a7b313"}, + {Index: " 127 ", Address: "one1mk53nyu6qp7k8nx9dsfuvjfvalrg4serw0eh4f", BlsPublicKey: "a915b06ce8fb5256c10978c920be9f04ae8b45e789731c35a7eb841ef3efbd9320fe0e34f219b8618d9921bd32fc1008"}, + {Index: " 128 ", Address: "one1mlrz8wydywhydu3kz9w2qlcm8628vt8thdzky2", BlsPublicKey: "a947dcac3559a7e798387f7a2e5bdd6d16534a6092f20b9d57bafbc348afbaa01195b14f8041ef6454c8fd9609ecfa90"}, + {Index: " 129 ", Address: "one1mpy0agngn90s9f69eg0g3r2l8u6r93fafsg2dg", BlsPublicKey: "aa957c9014921478d79f8165313b4ded4699d9ad3f9e912c2ba923f10d08834069fee25c0439f5cfd0c245a0db82ba96"}, + {Index: " 130 ", Address: "one1mzqj4r3lkdlzrd578l2zvv88nd4tyzjk36khvz", BlsPublicKey: "abc803d2b541ffe5e8cb88754512a7246700c301607442d6f352c23e6dccd83b43ac5114b4450c53db16be5b4bdf4e16"}, + {Index: " 131 ", Address: "one1n5g3lf7mcsf9726rt7zgegh98j2ku3ag60tx4q", BlsPublicKey: "ace5c293ae3f6afdce70b20d5a4452078579d41a1a92c29e3947c3970537ea0a62d5ff45688592b1bd87919548966a16"}, + {Index: " 132 ", Address: "one1n72fu6gxpfd74as7t3qgn93h2a28p5ps2v4f6y", BlsPublicKey: "ad0ba313b283bcf7cb74d9419b86f485b35bdd7170add0b30f053a36cbeeb92750323b23fc26175a8f29a957c1eee488"}, + {Index: " 133 ", Address: "one1nckzwr02lmxy2c7sm928d56fs66vqqzcuz5gcv", BlsPublicKey: "ad11e38500c1c5be0bc2a585d1460371aeb944c2e94a4cd6bdf294241b77cbd7ebb0355959f284dc997b6ec12746ce92"}, + {Index: " 134 ", Address: "one1ndq2yts78d6p2rz3auk7a97yx83k0dglxu67hf", BlsPublicKey: "ade18f934950941c9593d6a326ab75d5b03e081a95b3799676bc892dd4c1cc9e3836e847bfe00f05503a3e11e61d4a84"}, + {Index: " 135 ", Address: "one1nl276mxmxe3fhpdrf33ejyjrj9gpmhnmtahkff", BlsPublicKey: "adf3868c133d264510d21e345ef3f5e61fd5497a9e74f66fecbde7df6cb27cd1ae01ef7939badfaa6c6b100cb4462709"}, + {Index: " 136 ", Address: "one1nsz272vvdnmjejajm7ykw2xsr4jyvcdwsm2qm5", BlsPublicKey: "aebe89453145dd1e8bdcce40de08f5d4033276e1b62effd9f894822fc13a9a5f61ca21a9e92450aa459364a56c63e48c"}, + {Index: " 137 ", Address: "one1nx36hc6s72vxvfdpgy2pyqmrj776hxwxmtxpdr", BlsPublicKey: "afa76927c08525306632eece5ead8b4c4eb9d76a568a9a4f17e40e031e6638bdce807f3a1017b07ed7b264067cc74816"}, + {Index: " 138 ", Address: "one1nz7qzjeg4eps4uax6k7r84u0gv45c2njcka4hw", BlsPublicKey: "b044810dee3e999488c01f1d5d495a563b5b56556c97cccc1082f881fe7fcda9dea56ec745b4e3b02ba094ee61b19c13"}, + {Index: " 139 ", Address: "one1p4zxq8r2fpjcmucttv5cdrqhugrna5ztlknml3", BlsPublicKey: "b20fe52e9a4e80c74e767474904f12b78fd30636e709e485e0c9ce803760158c67569b3c866f0c598e46a86845eacb91"}, + {Index: " 140 ", Address: "one1pcur4duu7k3x2kcakrsllqs9k0n2fxaxcd42hu", BlsPublicKey: "b4eccdc14d00929a4e429c2561c91e52e1bda3ea334bc255ba007cf6f21370ec4c5300972ba1d7d496ed7faa7b3df50e"}, + {Index: " 141 ", Address: "one1pe7qcwhknq82fpkfslxcurpvtl0zlpwym8ysv6", BlsPublicKey: "b5a4c991045a2b578f06647fe71cb12c5abb2d62105d8f2f0c26a90fb559dce5e56305c883d80a993ba078a0c5a80f12"}, + {Index: " 142 ", Address: "one1pgwlexwnvh4akvwhzfc5lpxhwt3hkjxclqx8ma", BlsPublicKey: "b89c29eb424f6ee97013f567b2a459d4769884b7167d1f122b51f1f51d4013e79811783a928bf3ff44f05d6a5dd8070a"}, + {Index: " 143 ", Address: "one1pxxf3sq8nkqsekhhgj2he9k588v69mmgfag5vc", BlsPublicKey: "bb7393122c3ec70bf1b8168cd3f54e35935a5d6a72fcf3fc063f4b5a13caeeeaec7151d99e504d9b49a9f9e0626b3004"}, + {Index: " 144 ", Address: "one1q3c73k6gh060qmgl0krpawqrgpwmtvdz3ed4kw", BlsPublicKey: "bf6e71f70ab75cca48c9e06148004e10409cf22ffaa4ca303d0be41fdc93e6acc9d0722b0da3831b87b4e57690fb2209"}, + {Index: " 145 ", Address: "one1q63z6u4dj68hylfhqtjrrqnevejx6h287tsqkp", BlsPublicKey: "c0428fb0f7c51cf97a4c563d1a1b6f1dcf46abdb7297276a4f28b6d6cbdc7026a5699c8c8ac8a29f947680f42134e205"}, + {Index: " 146 ", Address: "one1q6tnnm6tpd6spl09zzzq6dyzkm55xmda48ccff", BlsPublicKey: "c1f446d81b824c6fa13b7d4d8f36f3aec8b333602bf9cba24b8451d908b1dabb48d067f4bc25a4ebee95e8dab0680595"}, + {Index: " 147 ", Address: "one1q72xjxzk9fg4le867pjeurrgspn2v6uy4kah7a", BlsPublicKey: "c45b40559b451c71e75e27191830e067416f84a7a3ec6644e9ec412c702d05ad27ebf00046448c74a8283685bac0970a"}, + {Index: " 148 ", Address: "one1qhtnm6tswaqtjlwv7mg06ld2g8mya7g56n3zl7", BlsPublicKey: "c53ab582fbd47a066a7163319896442bf9db90672f884d1198a212b3e105f6bec535c1f1e947003cbf8f539f38d1bd8f"}, + {Index: " 149 ", Address: "one1qlss8mlwea622ctpu00fnah49ksk64vydzge02", BlsPublicKey: "c54f42e4ce7bb33dd3b568835cd61be7eee7d698c2d5d9a457a7889b7f4223f18fe6932e01d0a1f7387392a2ab11ab11"}, + {Index: " 150 ", Address: "one1qmd7lyl27gx5wrp0tr8sc7ghpu2u04rpk6cy43", BlsPublicKey: "c58b6eb5b07a2f76f31e11fe42e3c1f1e0c13b80ddf2f0b0e9e8ac2df4bf6f99f96f8548889d5fb34a266f18bd3fd782"}, + {Index: " 151 ", Address: "one1qwymgz2qp9dj0fnuzutl2ks0ar0jyfweamkk36", BlsPublicKey: "cbf9debce34f0c7f421b6682851edc5a4ea56edfffb7196f5e3e4c89255e1c914ababb1701dac4744370433b71376a11"}, + {Index: " 152 ", Address: "one1r54srvgzf00jyza9grnjs228y6mak7ksvccna3", BlsPublicKey: "cfb24a62b461a476673795d0107c7d4b5ca8159a9d265af78a7e9a5ef4786ccf426d7df6f926aaf099013faf4717528d"}, + {Index: " 153 ", Address: "one1r7kj3cmh888xkv0kw4kj2u3968h3jqpm6snlf2", BlsPublicKey: "cfe659c273485aac37147d73f457943e82bfbe5e6699e50fa13a451a1ae91ca656aaa456adc8f98f0d4527df757dd017"}, + {Index: " 154 ", Address: "one1r8h7dezsjt6jms4g07av9lspm27fj77smgmtql", BlsPublicKey: "d0e0301c1e5c68d47ffb727041c4a2a151b16def23dcc92cf3db9af15f504c3e96c037410d52a184a4cfb6eb0f0cae09"}, + {Index: " 155 ", Address: "one1rqc34tg4l79re9xd769r6mlz0u2mm836ken532", BlsPublicKey: "d23695df8ca2abcff36ed6a4cac01957c011c9b8b6afa3dc5f5e2f703064332d97739d374d1cd7e09b0896b3dd52c398"}, + {Index: " 156 ", Address: "one1rwww5e0vd9e09hlnhk6n6rqycwtwkq0xwjp0ra", BlsPublicKey: "d26f1e02934c2b15ac4697bdff1abb81a1bd56cf5222078914c4493e0724c0491899372878629bd497495c09204c9a0b"}, + {Index: " 157 ", Address: "one1s06neuayy3yg7qdfr9dzltukaf8dthrga6xs5k", BlsPublicKey: "d2c81ccbe5cb5419fc27907e26d581f71f1e3c4948168a740357b1598fbec28e1199cd6f8407f88fbc022e7302b2d40f"}, + {Index: " 158 ", Address: "one1s3x0khxcmvhu02ejc0p9s60lgtfk7f0eu7w9t5", BlsPublicKey: "d31f3ebd76a8de63c14614b673b91a7df4f6775b84143534908962e5268c75676eadeb25fc0545bb6522e7892a15a28b"}, + {Index: " 159 ", Address: "one1s72e9l33m8d0ynd4pjtqsavdpyvf2hddgewl73", BlsPublicKey: "d4523f7ca489827bb920a42cd5ed957f0b3c5de849fc93aaa97c3be13cf548ad22d3a98eb58215ff6e27ce8e8589a68a"}, + {Index: " 160 ", Address: "one1sm7s3z2lypehwd59c752vxpqh949nh9xtmqx6k", BlsPublicKey: "d4a5053c4888e2b32bde65651ebad0e11f344ca67584c7b024f90a8351293135c355b06e2f830b15ec22407188029a8b"}, + {Index: " 161 ", Address: "one1sr5cuktje7tfjtq8cmr8zlnrrag2j4zdsyhh7l", BlsPublicKey: "d5c611cafff9ef47a5deb9c516dfef42f6cd5997a2c74b1ae3ab7380491bda0c7edb6c6d1e0a267f42d5644e9769fc09"}, + {Index: " 162 ", Address: "one1sscahy96rx38u2qfu0464ddatgwhyxy0w0mhhd", BlsPublicKey: "d7158d62bb9e953231d9d5e8e176e0f6e1f881291ee83a1f8f64c988f247c337689c3522d5951ed8fd3c654c776a6405"}, + {Index: " 163 ", Address: "one1sw78u3jwxk0zkl29urg22scdkycuew94hpvvdq", BlsPublicKey: "d790acff014a43e41e78d311a512662fd4d45afcbcf112705fe43f6be710ee88236623e71c560b4c3f24d59d59c9d78d"}, + {Index: " 164 ", Address: "one1sz8auv38tlx09je7v0exrg2s2dlykywcpyvrhk", BlsPublicKey: "d82a1656c7ccbcfa5d87c8ae18ccbded89621cb296fca9fb058f9dc381cd1dc1133c906a8db50ecfc9847aa52a21ca11"}, + {Index: " 165 ", Address: "one1t453xjwud2v5at8c738rlsqnef900dmk9x7u64", BlsPublicKey: "d8ca0b9c86c038b067a3cc5f4b9bb754f187bee86fe8df5a6847cc7b143141d00eea3fba4bd31dd270ec280344d64e83"}, + {Index: " 166 ", Address: "one1t6ppuhtvvmey9ktcls25vl9v867v3rnxc6rq07", BlsPublicKey: "d9e7c803e76c265210fc23432af986d3c20be1c34f459f58f0286c2617dac96f19a7ea6fda78421948c2d73c03ed328d"}, + {Index: " 167 ", Address: "one1t6w3mx6r20wm7j8vu7pd4nktyxqu3nguqrmsth", BlsPublicKey: "dab8b8d6c5c325da362ea14e4cab3cec20222f187152856ff070708a0680b00454ccf712ba643c26a6ded366e8d61b88"}, + {Index: " 168 ", Address: "one1t7txz7n07ytpjt9nv8ecg6k2ade8w2dnqj9daw", BlsPublicKey: "dad00016e405a55422cb713081a439d4a55ead7a0bfedf73a6b2f1b5f7e436b888e1170e306f417790f6ec0d5b79ee97"}, + {Index: " 169 ", Address: "one1t9ayee7r8r7unwjkmjnysea4pmmfucr5xrat7t", BlsPublicKey: "daf06e97a8d9ef94a4862a5650f677a11c0bd8b6cab31589cf368b309404c8c2c6f207f89eb658f431a8751fc3254100"}, + {Index: " 170 ", Address: "one1tk75vv3hhvecws7leyvkxp5tdc7295fh6a05d6", BlsPublicKey: "db7b64f62ca4dfc77b690dc2de51fb3267d6d0933024b68133fd1ec445453909eb5f4c1572be047086778ad2bc4cf689"}, + {Index: " 171 ", Address: "one1ty0qpg797ztznz88d3rgl3pguhfa2mc42nv7kh", BlsPublicKey: "dd5a77bbcafe0e224ec0b71a5fd91958c3507ff1c659e9ebdc34c3ae6e21d6f3259c8e7ac05d46647b8ed6985aa12604"}, + {Index: " 172 ", Address: "one1u5exnyptdx8v63ajjjs2p9qncklw06k4l30erw", BlsPublicKey: "ddacb5c3bd26b5c668f1c14fa6c698f51d8a17d4f9735624b48d13f78f3b1f2a09d5af0619efb101e9e2d28e6235c386"}, + {Index: " 173 ", Address: "one1uf8jdkqsa9dnjl8wzakt30reqla6ayxus0de06", BlsPublicKey: "ddd3d91ddecbabbea61db03ef89260a3705eeb6c8135301b723f90e8d23986100d6cf06034a14d084b3f5e180a406b93"}, + {Index: " 174 ", Address: "one1ups93dnz2t0qdsl29scyvgxj65adeuawcczwpq", BlsPublicKey: "df02f30178e01e3d6a65f656830138515d5aa8b5f6c4bc0de391491ee59a19592dc40f9d789a429d17ed0eaef4b8da8c"}, + {Index: " 175 ", Address: "one1uv8ask9y045v3nahyl3tyufhqkr237xdux0euh", BlsPublicKey: "e0099bcd3ca8122f745b06072a92c7adab6e9beaafa15ab1772e0de939e824e9982bab3a1257566c35d237c417111d12"}, + {Index: " 176 ", Address: "one1uvreadd6r0g5e7zsts34e5pxsmcgguvpurh88s", BlsPublicKey: "e0d854bafd499f1daabb9873fd022134f95cf86e0f98a90e412bc1d35128a4fbd22152e8091860a8fa78e7707bf0340b"}, + {Index: " 177 ", Address: "one1v6xxqqjcpvanpz59hr9m0dnymwwrqz90slcy2u", BlsPublicKey: "e19514992d79abcdb89528da138400e37e7128bc6ddcd12f51a5bc6668d44f7ae9a5d6be5c2e17ddec2e56bff2b8c18e"}, + {Index: " 178 ", Address: "one1vfecfrquqqw30kv39lz9ma7ef4v5lnc4fst8ts", BlsPublicKey: "e22dc89301520a24402f325174c5bb272cacca7c63d572aab9ea537ce623ac7e7ee729f866f6644ca139dd3f607f6107"}, + {Index: " 179 ", Address: "one1vwfp4strys3temhtga5j9tuh5k4pfg0v8hz40s", BlsPublicKey: "e39065621841debd1cdfda597b070960dcbab64ee75fc7e0853f1bbafa0fc05defc31c35ddb120967b94a71e68d8d387"}, + {Index: " 180 ", Address: "one1vwzffhl5zwcvpux2h8x5q3qqaauv80453gyycc", BlsPublicKey: "e4b0fb2c4b5bb72b9dc430a87eec0d0fc5a96e4bc8ad4354807dc2d2bc8bfeeb2a35fd8dc4def9cb0c1fa84184376a87"}, + {Index: " 181 ", Address: "one1w0a0uhccrqg867s7ewy4k8ue5hn7mcqfy2zxtz", BlsPublicKey: "e50275799ef1969de37475ade47c746c4110b4804b4ec22b3743694f57ec03d970ef8b1ab7af1fdbef3176dace54ad0f"}, + {Index: " 182 ", Address: "one1w38dh2n094zwl6dz9k9nu3cqr0vzg2mrv26knn", BlsPublicKey: "e531940b99a932c4c7dec6c44bfd4713a4f56cb1eae2b2075b742403d10fd1d2fcda2ec6d54e596a2f3947e8d09e2d91"}, + {Index: " 183 ", Address: "one1w3tg6jckah0pkffaf4uscrkv2svql2t02tk7dk", BlsPublicKey: "e6e1ccd229940ab774d04dfc73e883f622589341a016274de045352844407166c852b9bd8c0e9ba4ab3b7d71f213d209"}, + {Index: " 184 ", Address: "one1wavz9vhmtykk3gldjt0vlu7lvrrwj5x3avjc7x", BlsPublicKey: "e9161043acbe5ba9a8c158d839326d6ea1da176ecdb5d660bcc01c9cf1087c4ddb2ec8edabc33a707c79542a4c739214"}, + {Index: " 185 ", Address: "one1wn25v837fvvqkq4wl67cxa604xdqf6ds883jqy", BlsPublicKey: "ee4d60e65bede9133989a97789814ec4436860e2dadbdc5c844d5ab317c649c4c4ca548bd4b8178a9ae7c08ca6a13e17"}, + {Index: " 186 ", Address: "one1xs9da8wjwer5y70m2gvwxctxm8jg3gh603cwql", BlsPublicKey: "ee6386b50b826ea492c681a3d140e4bad3dcafd96c6cb7f215c6cec67b036b6cc03abae8bf8fb45b7f87c06c83dcbf02"}, + {Index: " 187 ", Address: "one1xu528n8l6uruk8klky289pymrgl6llwezvg4f9", BlsPublicKey: "f08ba17bf256d4af04e230c2a2a0891344c2eb50b7ad0d2b02211184361cbbc2ac21de821fa3eef4538fb7adc191ad0b"}, + {Index: " 188 ", Address: "one1xugm3xf2szdvqpex9nlvssjfcaz9j6lhszkjmw", BlsPublicKey: "f1be46e7841935f840cb9582c0bfc7a2516ec14e5a71320e920e812261f0b9ad08c7b5cb9b21e51ebae6ac90d258ce01"}, + {Index: " 189 ", Address: "one1xv590z75spd0eart0zkndw9nvtjyl65p8nfc0u", BlsPublicKey: "f269922d35ea651847f76cab7146817f34a50aae0f090edaea00c453c6ba9fd53f7111195cda57032745eda3a08d4f09"}, + {Index: " 190 ", Address: "one1xvt75ry6k0gmcs45nhav767myjq52v07nlqlju", BlsPublicKey: "f32a355774234b754f87d35a9789b156b0a7d7f607de5502db06a7d7ed399dafcb3dac965e1219bdda664122a8920415"}, + {Index: " 191 ", Address: "one1yu3zfqjcrt3xm2r9dv7wmy8280wmm47hskew2f", BlsPublicKey: "f3d64e4a3813272d4850a8a4609f143ee590986cd05806057438498b91fcda98e951a25b43dd050db6213de319b80a0b"}, + {Index: " 192 ", Address: "one1z2sgpyl80jqfnj2mddgwmjtkjru9md3nhrdxfp", BlsPublicKey: "f3ff2e0eab560b4abc26f83f25fa9e0d62d9cec62290d5f0ec225f271c394c2c3e693b81b94ec4665eb77c1600378f17"}, + {Index: " 193 ", Address: "one1z5dhk58uwkj2gur0xm648mxj2mutt35aew773q", BlsPublicKey: "f7dcd026134ae8054f7d9ebd55f15e55314c9ba0d1c988f3d72d7b663aec4f05c6413017d44d6a99b1eaf8ace690120e"}, + {Index: " 194 ", Address: "one1zccvnvdy43cdn4k8vwvjd6sexvz3nna5kk5n5y", BlsPublicKey: "f7f603d90617a81d6cff3ed4a2fa0790850654ef73a789be6090c5fe729938d49e3f7fde5c27a73b097a2f218792088e"}, + {Index: " 195 ", Address: "one1zd9x4scxurl0yxrt3rmyqwm6dmr0u47jczxjf6", BlsPublicKey: "f8774157cca2590913a7a661e825bdad3ee0fc78dddc1596bb8121f078a529aa5915a67af2302a2536c9203d7301548c"}, + {Index: " 196 ", Address: "one1zdxc0nrk49tj70c955fmgt74u0ud7t0l9kqkup", BlsPublicKey: "fa24d6055815c730cff4f2ffe07f957a96b76c4af8e48a4eabdde5d6971c5c74d1b6eb5097ae80a432af9cec2afe1211"}, + {Index: " 197 ", Address: "one1zgh9p3au8f78qgww4xzclankdlftw59hpjuckm", BlsPublicKey: "fbcff21b911baf6dd607bbc86c0261e25cd9f861ccffbf9e370653c35128f07313005c30b57e420ad160a35e91364183"}, + {Index: " 198 ", Address: "one1zk6l76n0r4z9nv5nyv6xqgcs0q9wdp4grspv9d", BlsPublicKey: "fd72f8bc2a2f0f562aeda9732204c1f0ae6af65b0f26b3460424f86799b01043e5b7bb1bf5d49dd33af31eb923924010"}, + {Index: " 199 ", Address: "one1zryan8ncvt543ganuxl8dz5wvj369u646krsk8", BlsPublicKey: "fe518b9e67c1321f13a534b56ae67ca2c669ab7dd643e869410fe3ff6ebfc3e341fd14c7a91be1389aa43a1b1d937e0e"}, +} diff --git a/internal/hmyapi/backend.go b/internal/hmyapi/backend.go index 0d99e1a04..3f7731248 100644 --- a/internal/hmyapi/backend.go +++ b/internal/hmyapi/backend.go @@ -2,6 +2,7 @@ package hmyapi import ( "context" + "math/big" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" @@ -13,6 +14,7 @@ import ( "github.com/harmony-one/harmony/core" "github.com/harmony-one/harmony/core/state" "github.com/harmony-one/harmony/core/types" + "github.com/harmony-one/harmony/core/vm" ) // Backend interface provides the common API services (that are provided by @@ -30,7 +32,7 @@ type Backend interface { EventMux() *event.TypeMux AccountManager() *accounts.Manager // ExtRPCEnabled() bool - // RPCGasCap() *big.Int // global gas cap for eth_call over rpc: DoS protection + RPCGasCap() *big.Int // global gas cap for hmy_call over rpc: DoS protection // BlockChain API // SetHead(number uint64) @@ -40,7 +42,7 @@ type Backend interface { GetBlock(ctx context.Context, blockHash common.Hash) (*types.Block, error) GetReceipts(ctx context.Context, blockHash common.Hash) (types.Receipts, error) // GetTd(blockHash common.Hash) *big.Int - // GetEVM(ctx context.Context, msg core.Message, state *state.DB, header *types.Header) (*vm.EVM, func() error, error) + GetEVM(ctx context.Context, msg core.Message, state *state.DB, header *types.Header) (*vm.EVM, func() error, error) SubscribeChainEvent(ch chan<- core.ChainEvent) event.Subscription SubscribeChainHeadEvent(ch chan<- core.ChainHeadEvent) event.Subscription SubscribeChainSideEvent(ch chan<- core.ChainSideEvent) event.Subscription diff --git a/internal/hmyapi/blockchain.go b/internal/hmyapi/blockchain.go index b1d410df7..d126885a8 100644 --- a/internal/hmyapi/blockchain.go +++ b/internal/hmyapi/blockchain.go @@ -2,10 +2,24 @@ package hmyapi import ( "context" + "fmt" + + "math/big" + "time" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rpc" + "github.com/harmony-one/harmony/core" + "github.com/harmony-one/harmony/core/types" + "github.com/harmony-one/harmony/core/vm" + "github.com/harmony-one/harmony/internal/utils" +) + +const ( + defaultGasPrice = params.GWei ) // PublicBlockChainAPI provides an API to access the Harmony blockchain. @@ -24,7 +38,7 @@ func NewPublicBlockChainAPI(b Backend) *PublicBlockChainAPI { func (s *PublicBlockChainAPI) GetBlockByNumber(ctx context.Context, blockNr rpc.BlockNumber, fullTx bool) (map[string]interface{}, error) { block, err := s.b.BlockByNumber(ctx, blockNr) if block != nil { - response, err := RPCMarshalBlock(block, false, false) + response, err := RPCMarshalBlock(block, true, fullTx) if err == nil && blockNr == rpc.PendingBlockNumber { // Pending blocks need to nil out a few fields for _, field := range []string{"hash", "nonce", "miner"} { @@ -81,3 +95,98 @@ func (s *PublicBlockChainAPI) BlockNumber() hexutil.Uint64 { header, _ := s.b.HeaderByNumber(context.Background(), rpc.LatestBlockNumber) // latest header should always be available return hexutil.Uint64(header.Number.Uint64()) } + +// Call executes the given transaction on the state for the given block number. +// It doesn't make and changes in the state/blockchain and is useful to execute and retrieve values. +func (s *PublicBlockChainAPI) Call(ctx context.Context, args CallArgs, blockNr rpc.BlockNumber) (hexutil.Bytes, error) { + result, _, _, err := doCall(ctx, s.b, args, blockNr, vm.Config{}, 5*time.Second, s.b.RPCGasCap()) + return (hexutil.Bytes)(result), err +} + +func doCall(ctx context.Context, b Backend, args CallArgs, blockNr rpc.BlockNumber, vmCfg vm.Config, timeout time.Duration, globalGasCap *big.Int) ([]byte, uint64, bool, error) { + defer func(start time.Time) { + utils.GetLogInstance().Debug("Executing EVM call finished", "runtime", time.Since(start)) + }(time.Now()) + + state, header, err := b.StateAndHeaderByNumber(ctx, blockNr) + if state == nil || err != nil { + return nil, 0, false, err + } + // Set sender address or use a default if none specified + var addr common.Address + if args.From == nil { + // TODO(ricl): this logic was borrowed from [go-ethereum](https://github.com/ethereum/go-ethereum/blob/f578d41ee6b3087f8021fd561a0b5665aea3dba6/internal/ethapi/api.go#L738) + // [question](https://ethereum.stackexchange.com/questions/72979/why-does-the-docall-function-use-the-first-account-by-default) + // Might need to reconsider the logic + if wallets := b.AccountManager().Wallets(); len(wallets) > 0 { + if accounts := wallets[0].Accounts(); len(accounts) > 0 { + addr = accounts[0].Address + } + } + } else { + addr = *args.From + } + // Set default gas & gas price if none were set + gas := uint64(math.MaxUint64 / 2) + if args.Gas != nil { + gas = uint64(*args.Gas) + } + if globalGasCap != nil && globalGasCap.Uint64() < gas { + utils.GetLogInstance().Warn("Caller gas above allowance, capping", "requested", gas, "cap", globalGasCap) + gas = globalGasCap.Uint64() + } + gasPrice := new(big.Int).SetUint64(defaultGasPrice) + if args.GasPrice != nil { + gasPrice = args.GasPrice.ToInt() + } + + value := new(big.Int) + if args.Value != nil { + value = args.Value.ToInt() + } + + var data []byte + if args.Data != nil { + data = []byte(*args.Data) + } + + // Create new call message + msg := types.NewMessage(addr, args.To, 0, value, gas, gasPrice, data, false) + + // Setup context so it may be cancelled the call has completed + // or, in case of unmetered gas, setup a context with a timeout. + var cancel context.CancelFunc + if timeout > 0 { + ctx, cancel = context.WithTimeout(ctx, timeout) + } else { + ctx, cancel = context.WithCancel(ctx) + } + // Make sure the context is cancelled when the call has completed + // this makes sure resources are cleaned up. + defer cancel() + + // Get a new instance of the EVM. + evm, vmError, err := b.GetEVM(ctx, msg, state, header) + if err != nil { + return nil, 0, false, err + } + // Wait for the context to be done and cancel the evm. Even if the + // EVM has finished, cancelling may be done (repeatedly) + go func() { + <-ctx.Done() + evm.Cancel() + }() + + // Setup the gas pool (also for unmetered requests) + // and apply the message. + gp := new(core.GasPool).AddGas(math.MaxUint64) + res, gas, failed, err := core.ApplyMessage(evm, msg, gp) + if err := vmError(); err != nil { + return nil, 0, false, err + } + // If the timer caused an abort, return an appropriate error message + if evm.Cancelled() { + return nil, 0, false, fmt.Errorf("execution aborted (timeout = %v)", timeout) + } + return res, gas, failed, err +} diff --git a/internal/hmyapi/types.go b/internal/hmyapi/types.go index 4d85865ed..73009cbbb 100644 --- a/internal/hmyapi/types.go +++ b/internal/hmyapi/types.go @@ -105,7 +105,7 @@ func RPCMarshalBlock(b *types.Block, inclTx bool, fullTx bool) (map[string]inter "size": hexutil.Uint64(b.Size()), "gasLimit": hexutil.Uint64(head.GasLimit), "gasUsed": hexutil.Uint64(head.GasUsed), - "timestamp": head.Time, // TODO(ricl): should be hexutil.Uint64 + "timestamp": hexutil.Uint64(head.Time.Uint64()), "transactionsRoot": head.TxHash, "receiptsRoot": head.ReceiptHash, } @@ -158,3 +158,13 @@ func newRPCTransactionFromBlockIndex(b *types.Block, index uint64) *RPCTransacti } return newRPCTransaction(txs[index], b.Hash(), b.NumberU64(), index) } + +// CallArgs represents the arguments for a call. +type CallArgs struct { + From *common.Address `json:"from"` + To *common.Address `json:"to"` + Gas *hexutil.Uint64 `json:"gas"` + GasPrice *hexutil.Big `json:"gasPrice"` + Value *hexutil.Big `json:"value"` + Data *hexutil.Bytes `json:"data"` +} diff --git a/internal/shardchain/shardchains.go b/internal/shardchain/shardchains.go index b9f2071ae..a3d09d1c4 100644 --- a/internal/shardchain/shardchains.go +++ b/internal/shardchain/shardchains.go @@ -99,6 +99,8 @@ func (sc *CollectionImpl) ShardChain(shardID uint32, networkType nodeconfig.Netw chainConfig = *params.MainnetChainConfig case nodeconfig.Testnet: fallthrough + case nodeconfig.Localnet: + fallthrough case nodeconfig.Devnet: chainConfig = *params.TestnetChainConfig } diff --git a/internal/utils/singleton.go b/internal/utils/singleton.go index 20fbfbe3e..396dda1f0 100644 --- a/internal/utils/singleton.go +++ b/internal/utils/singleton.go @@ -3,6 +3,7 @@ package utils import ( + "fmt" "io" "os" "path" @@ -11,6 +12,7 @@ import ( "github.com/ethereum/go-ethereum/log" "github.com/natefinch/lumberjack" + "github.com/rs/zerolog" ) var ( @@ -26,6 +28,10 @@ var ( logHandlers []log.Handler // sub handlers of glogger logVerbosity log.Lvl onceForLog sync.Once + + // ZeroLog + zeroLogger *zerolog.Logger + zeroLoggerLevel zerolog.Level = zerolog.Disabled ) // SetLogContext used to print out loggings of node with port and ip. @@ -33,6 +39,7 @@ var ( func SetLogContext(_port, _ip string) { port = _port ip = _ip + setZeroLogContext(_port, _ip) } // SetLogVerbosity specifies the verbosity of global logger @@ -41,22 +48,19 @@ func SetLogVerbosity(verbosity log.Lvl) { if glogger != nil { glogger.Verbosity(logVerbosity) } + updateZeroLogLevel(int(verbosity)) } // AddLogFile creates a StreamHandler that outputs JSON logs // into rotating files with specified max file size -func AddLogFile(filepath string, maxSize int) error { - if err := os.MkdirAll(path.Dir(filepath), 0755); err != nil { - return err - } - +func AddLogFile(filepath string, maxSize int) { AddLogHandler(log.StreamHandler(&lumberjack.Logger{ Filename: filepath, MaxSize: maxSize, Compress: true, }, log.JSONFormat())) - return nil + setZeroLoggerFileOutput(filepath, maxSize) } // AddLogHandler add a log handler @@ -102,3 +106,63 @@ func GetLogInstance() log.Logger { }) return logInstance } + +// ZeroLog +func setZeroLogContext(port string, ip string) { + childLogger := Logger(). + With(). + Str("port", port). + Str("ip", ip). + Logger() + zeroLogger = &childLogger +} + +// SetZeroLoggerFileOutput sets zeroLogger's output stream +// to destinated filepath with log file rotation. +func setZeroLoggerFileOutput(filepath string, maxSize int) error { + dir := path.Dir(filepath) + filename := path.Base(filepath) + + // Initialize ZeroLogger if it hasn't been already + // TODO: zerolog filename prefix can be removed once all loggers + // has been replaced + childLogger := Logger().Output(&lumberjack.Logger{ + Filename: fmt.Sprintf("%s/zerolog-%s", dir, filename), + MaxSize: maxSize, + Compress: true, + }) + zeroLogger = &childLogger + + return nil +} + +// Logger returns a zerolog.Logger singleton +func Logger() *zerolog.Logger { + if zeroLogger == nil { + logger := zerolog.New(zerolog.ConsoleWriter{Out: os.Stderr}). + Level(zeroLoggerLevel). + With(). + Caller(). + Timestamp(). + Logger() + zeroLogger = &logger + } + return zeroLogger +} + +func updateZeroLogLevel(level int) { + switch level { + case 0: + zeroLoggerLevel = zerolog.Disabled + case 1: + zeroLoggerLevel = zerolog.ErrorLevel + case 2: + zeroLoggerLevel = zerolog.WarnLevel + case 3: + zeroLoggerLevel = zerolog.InfoLevel + default: + zeroLoggerLevel = zerolog.DebugLevel + } + childLogger := Logger().Level(zeroLoggerLevel) + zeroLogger = &childLogger +} diff --git a/node/node.go b/node/node.go index 901ac954b..9eb367d43 100644 --- a/node/node.go +++ b/node/node.go @@ -270,7 +270,7 @@ func (node *Node) getTransactionsForNewBlock(maxNumTxs int, coinbase common.Addr // MaybeKeepSendingPongMessage keeps sending pong message if the current node is a leader. func (node *Node) MaybeKeepSendingPongMessage() { - if nodeconfig.GetDefaultConfig().IsLeader() { + if node.Consensus.IsLeader() { go node.SendPongMessage() } } @@ -376,11 +376,6 @@ func New(host p2p.Host, consensusObj *consensus.Consensus, chainDBFactory shardc } utils.GetLogInstance().Info("Genesis block hash", "genesis block header", node.Blockchain().GetBlockByNumber(0).Header()) - if consensusObj != nil && nodeconfig.GetDefaultConfig().IsLeader() { - node.State = NodeLeader - } else { - node.State = NodeInit - } // start the goroutine to receive client message // client messages are sent by clients, like txgen, wallet @@ -464,8 +459,6 @@ func (node *Node) AddPeers(peers []*p2p.Peer) int { // Only leader needs to add the peer info into consensus // Validators will receive the updated peer info from Leader via pong message // TODO: remove this after fully migrating to beacon chain-based committee membership - //if count > 0 && node.NodeConfig.IsLeader() { - // node.Consensus.AddPeers(peers) // // TODO: make peers into a context object shared by consensus and drand // node.DRand.AddPeers(peers) //} diff --git a/node/node_genesis.go b/node/node_genesis.go index 4d58fb1af..d06f2b8dd 100644 --- a/node/node_genesis.go +++ b/node/node_genesis.go @@ -77,6 +77,8 @@ func (node *Node) SetupGenesisBlock(db ethdb.Database, shardID uint32, myShardSt } case nodeconfig.Testnet: fallthrough + case nodeconfig.Localnet: + fallthrough case nodeconfig.Devnet: chainConfig = *params.TestnetChainConfig // Tests account for txgen to use diff --git a/node/node_handler.go b/node/node_handler.go index f52e848b4..5812dbd94 100644 --- a/node/node_handler.go +++ b/node/node_handler.go @@ -276,10 +276,11 @@ func (node *Node) VerifyNewBlock(newBlock *types.Block) error { // TODO: verify the vrf randomness // _ = newBlock.Header().Vrf - err = node.validateNewShardState(newBlock, &node.CurrentStakes) - if err != nil { - return ctxerror.New("failed to verify sharding state").WithCause(err) - } + // TODO: uncomment 4 lines after we finish staking mechanism + //err = node.validateNewShardState(newBlock, &node.CurrentStakes) + // if err != nil { + // return ctxerror.New("failed to verify sharding state").WithCause(err) + // } return nil } @@ -309,7 +310,7 @@ func (node *Node) validateNewShardState(block *types.Block, stakeInfo *map[commo // We aren't expecting to reshard, so proceed to sign return nil } - var shardState *types.ShardState + shardState := &types.ShardState{} err := rlp.DecodeBytes(header.ShardState, shardState) if err != nil { return err @@ -758,7 +759,7 @@ func (node *Node) epochShardStateMessageHandler(msgPayload []byte) error { receivedEpoch := big.NewInt(int64(epochShardState.Epoch)) getLogger().Info("received new shard state", "epoch", receivedEpoch) node.nextShardState.master = epochShardState - if node.NodeConfig.IsLeader() { + if node.Consensus.IsLeader() { // Wait a bit to allow the master table to reach other validators. node.nextShardState.proposeTime = time.Now().Add(5 * time.Second) } else { @@ -784,7 +785,7 @@ func (node *Node) transitionIntoNextEpoch(shardState types.ShardState) { logger = logger.New( "blsPubKey", hex.EncodeToString(node.Consensus.PubKey.Serialize()), "curShard", node.Blockchain().ShardID(), - "curLeader", node.NodeConfig.IsLeader()) + "curLeader", node.Consensus.IsLeader()) for _, c := range shardState { logger.Debug("new shard information", "shardID", c.ShardID, diff --git a/node/node_newblock.go b/node/node_newblock.go index b4d000d0b..1ba00f35a 100644 --- a/node/node_newblock.go +++ b/node/node_newblock.go @@ -5,7 +5,6 @@ import ( "time" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/log" "github.com/harmony-one/harmony/core" "github.com/harmony-one/harmony/core/types" @@ -75,6 +74,9 @@ func (node *Node) WaitForConsensusReadyv2(readySignal chan struct{}, stopChan ch selectedTxs := types.Transactions{} // Empty transaction list if node.NodeConfig.GetNetworkType() != nodeconfig.Mainnet { selectedTxs = node.getTransactionsForNewBlock(MaxNumberOfTransactionsPerBlock, coinbase) + if err := node.Worker.UpdateCurrent(coinbase); err != nil { + utils.GetLogger().Error("Failed updating worker's state", "Error", err) + } } utils.GetLogInstance().Info("PROPOSING NEW BLOCK ------------------------------------------------", "blockNum", node.Blockchain().CurrentBlock().NumberU64()+1, "selectedTxs", len(selectedTxs)) if err := node.Worker.CommitTransactions(selectedTxs, coinbase); err != nil { @@ -92,11 +94,13 @@ func (node *Node) WaitForConsensusReadyv2(readySignal chan struct{}, stopChan ch viewID := node.Consensus.GetViewID() // add aggregated commit signatures from last block, except for the first two blocks - err = node.Worker.UpdateCurrent(coinbase) - if err != nil { - utils.GetLogger().Debug("Failed updating worker's state", "Error", err) - continue + if node.NodeConfig.GetNetworkType() == nodeconfig.Mainnet { + if err = node.Worker.UpdateCurrent(coinbase); err != nil { + utils.GetLogger().Debug("Failed updating worker's state", "Error", err) + continue + } } + newBlock, err = node.Worker.Commit(sig, mask, viewID, coinbase) if err != nil { @@ -104,7 +108,7 @@ func (node *Node) WaitForConsensusReadyv2(readySignal chan struct{}, stopChan ch ctxerror.New("cannot commit new block"). WithCause(err)) continue - } else if err := node.proposeShardState(newBlock); err != nil { + } else if err := node.proposeShardStateWithoutBeaconSync(newBlock); err != nil { ctxerror.Log15(utils.GetLogger().Error, ctxerror.New("cannot add shard state"). WithCause(err)) @@ -123,6 +127,15 @@ func (node *Node) WaitForConsensusReadyv2(readySignal chan struct{}, stopChan ch }() } +func (node *Node) proposeShardStateWithoutBeaconSync(block *types.Block) error { + if !core.IsEpochLastBlock(block) { + return nil + } + nextEpoch := new(big.Int).Add(block.Header().Epoch, common.Big1) + shardState := core.GetShardState(nextEpoch) + return block.AddShardState(shardState) +} + func (node *Node) proposeShardState(block *types.Block) error { switch node.Consensus.ShardID { case 0: @@ -149,32 +162,34 @@ func (node *Node) proposeBeaconShardState(block *types.Block) error { } func (node *Node) proposeLocalShardState(block *types.Block) { - logger := block.Logger(utils.GetLogInstance()) - getLogger := func() log.Logger { return utils.WithCallerSkip(logger, 1) } + logger := block.Logger(utils.Logger()) // TODO ek – read this from beaconchain once BC sync is fixed if node.nextShardState.master == nil { - getLogger().Debug("yet to receive master proposal from beaconchain") + logger.Debug().Msg("yet to receive master proposal from beaconchain") return } - logger = logger.New( - "nextEpoch", node.nextShardState.master.Epoch, - "proposeTime", node.nextShardState.proposeTime) + + nlogger := logger.With(). + Uint64("nextEpoch", node.nextShardState.master.Epoch). + Time("proposeTime", node.nextShardState.proposeTime). + Logger() + logger = &nlogger if time.Now().Before(node.nextShardState.proposeTime) { - getLogger().Debug("still waiting for shard state to propagate") + logger.Debug().Msg("still waiting for shard state to propagate") return } masterShardState := node.nextShardState.master.ShardState var localShardState types.ShardState committee := masterShardState.FindCommitteeByID(block.ShardID()) if committee != nil { - getLogger().Info("found local shard info; proposing it") + logger.Info().Msg("found local shard info; proposing it") localShardState = append(localShardState, *committee) } else { - getLogger().Info("beacon committee disowned us; proposing nothing") + logger.Info().Msg("beacon committee disowned us; proposing nothing") // Leave local proposal empty to signal the end of shard (disbanding). } err := block.AddShardState(localShardState) if err != nil { - getLogger().Error("Failed proposin local shard state", "error", err) + logger.Error().Err(err).Msg("Failed proposin local shard state") } } diff --git a/node/node_syncing.go b/node/node_syncing.go index 192dc9fc6..e7fc8c23d 100644 --- a/node/node_syncing.go +++ b/node/node_syncing.go @@ -13,6 +13,7 @@ import ( "github.com/harmony-one/harmony/api/service/syncing" "github.com/harmony-one/harmony/api/service/syncing/downloader" downloader_pb "github.com/harmony-one/harmony/api/service/syncing/downloader/proto" + "github.com/harmony-one/harmony/consensus" "github.com/harmony-one/harmony/core" "github.com/harmony-one/harmony/core/types" nodeconfig "github.com/harmony-one/harmony/internal/configs/node" @@ -136,11 +137,11 @@ SyncingLoop: node.stateMutex.Lock() node.State = NodeNotInSync node.stateMutex.Unlock() - if willJoinConsensus { + if willJoinConsensus && node.Consensus.Mode() != consensus.Listening { node.Consensus.BlocksNotSynchronized() } node.stateSync.SyncLoop(bc, worker, willJoinConsensus, false) - if willJoinConsensus { + if willJoinConsensus && node.Consensus.Mode() != consensus.Listening { node.stateMutex.Lock() node.State = NodeReadyForConsensus node.stateMutex.Unlock() @@ -150,7 +151,7 @@ SyncingLoop: node.stateMutex.Lock() node.State = NodeReadyForConsensus node.stateMutex.Unlock() - if willJoinConsensus { + if willJoinConsensus && node.Consensus.Mode() != consensus.Listening { node.Consensus.WaitForSyncing() } } diff --git a/node/rpc.go b/node/rpc.go index 63d25eb7f..8db4cd2f7 100644 --- a/node/rpc.go +++ b/node/rpc.go @@ -35,6 +35,7 @@ var ( httpModules = []string{"hmy", "net"} httpVirtualHosts = []string{"*"} httpTimeouts = rpc.DefaultHTTPTimeouts + httpOrigins = []string{"*"} wsModules = []string{"net", "web3"} wsOrigins = []string{"*"} @@ -56,7 +57,7 @@ func (node *Node) StartRPC(nodePort string) error { port, _ := strconv.Atoi(nodePort) httpEndpoint = fmt.Sprintf(":%v", port+rpcHTTPPortOffset) - if err := node.startHTTP(httpEndpoint, apis, httpModules, nil, httpVirtualHosts, httpTimeouts); err != nil { + if err := node.startHTTP(httpEndpoint, apis, httpModules, httpOrigins, httpVirtualHosts, httpTimeouts); err != nil { return err } diff --git a/scripts/go_executable_build.sh b/scripts/go_executable_build.sh index e0d2218dc..0ea616a16 100755 --- a/scripts/go_executable_build.sh +++ b/scripts/go_executable_build.sh @@ -145,9 +145,9 @@ function upload_wallet case "$OS" in "Linux") - FOLDER=release/$REL/linux-x86_64 ;; + FOLDER=release/linux-x86_64/$REL ;; "Darwin") - FOLDER=release/$REL/darwin-x86_64 ;; + FOLDER=release/darwin-x86_64/$REL ;; *) echo "Unsupported OS: $OS" return ;; diff --git a/scripts/node.sh b/scripts/node.sh index f0bf0f596..dae8282a5 100755 --- a/scripts/node.sh +++ b/scripts/node.sh @@ -100,6 +100,12 @@ usage: ${progname} [-1ch] [-k KEYFILE] -k KEYFILE use the given BLS key file (default: autodetect) -s run setup env only (must run as root) -S run the ${progname} as non-root user (default: run as root) + -p passfile use the given BLS passphrase file + -D do not download Harmony binaries (default: download when start) + +example: + + ${progname} -S -k mybls.key ENDEND } @@ -110,15 +116,16 @@ usage() { exit 64 # EX_USAGE } -unset start_clean loop run_as_root +unset start_clean loop run_as_root blspass do_not_download start_clean=false loop=true run_as_root=true +do_not_download=false ${BLSKEYFILE=} unset OPTIND OPTARG opt OPTIND=1 -while getopts :1chk:sS opt +while getopts :1chk:sSp:D opt do case "${opt}" in '?') usage "unrecognized option -${OPTARG}";; @@ -129,6 +136,8 @@ do k) BLSKEYFILE="${OPTARG}";; s) setup_env; exit 0;; S) run_as_root=false ;; + p) blspass="${OPTARG}";; + D) do_not_download=true;; *) err 70 "unhandled option -${OPTARG}";; # EX_SOFTWARE esac done @@ -189,11 +198,12 @@ fi # clean up old files for bin in "${BIN[@]}"; do - rm -f ${bin} + ${do_not_download} || rm -f ${bin} done download_binaries() { local outdir + ${do_not_download} && return 0 outdir="${1:-.}" mkdir -p "${outdir}" for bin in "${BIN[@]}"; do @@ -337,18 +347,30 @@ kill_node() { } > harmony-update.out 2>&1 & check_update_pid=$! -unset -v passphrase -read -rsp "Enter passphrase for the BLS key file ${BLSKEYFILE}: " passphrase -echo +if [ -z "${blspass}" ]; then + unset -v passphrase + read -rsp "Enter passphrase for the BLS key file ${BLSKEYFILE}: " passphrase + echo +elif [ ! -f "${blspass}" ]; then + err 10 "can't find the ${blspass} file" +fi while : do msg "############### Running Harmony Process ###############" if [ "$OS" == "Linux" ]; then # Run Harmony Node - echo -n "${passphrase}" | LD_LIBRARY_PATH=$(pwd) ./harmony -bootnodes $BN_MA -ip $PUB_IP -port $NODE_PORT -is_genesis -blskey_file "${BLSKEYFILE}" -blspass stdin + if [ -z "${blspass}" ]; then + echo -n "${passphrase}" | LD_LIBRARY_PATH=$(pwd) ./harmony -bootnodes $BN_MA -ip $PUB_IP -port $NODE_PORT -is_genesis -blskey_file "${BLSKEYFILE}" -blspass stdin + else + LD_LIBRARY_PATH=$(pwd) ./harmony -bootnodes $BN_MA -ip $PUB_IP -port $NODE_PORT -is_genesis -blskey_file "${BLSKEYFILE}" -blspass file:${blspass} + fi else - echo -n "${passphrase}" | DYLD_FALLBACK_LIBRARY_PATH=$(pwd) ./harmony -bootnodes $BN_MA -ip $PUB_IP -port $NODE_PORT -is_genesis -blskey_file "${BLSKEYFILE}" -blspass stdin + if [ -z "${blspass}" ]; then + echo -n "${passphrase}" | DYLD_FALLBACK_LIBRARY_PATH=$(pwd) ./harmony -bootnodes $BN_MA -ip $PUB_IP -port $NODE_PORT -is_genesis -blskey_file "${BLSKEYFILE}" -blspass stdin + else + DYLD_FALLBACK_LIBRARY_PATH=$(pwd) ./harmony -bootnodes $BN_MA -ip $PUB_IP -port $NODE_PORT -is_genesis -blskey_file "${BLSKEYFILE}" -blspass file:${blspass} + fi fi || msg "node process finished with status $?" ${loop} || break msg "restarting in 10s..." diff --git a/scripts/pagerduty.sh b/scripts/pagerduty.sh new file mode 100644 index 000000000..3e885c691 --- /dev/null +++ b/scripts/pagerduty.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env bash + +### Log variables +LOGFILE="/home/tmp_log/log-20190628.153354/*.log" +LOG=$(tail -n 1000 $LOGFILE) + +### POST constants +IP=$(dig -4 @resolver1.opendns.com ANY myip.opendns.com +short) +SHARD_NUM=$(echo "$LOG" | grep -oE -m 1 "Shard\":.?" | rev | cut -c 1) +TRIGGER="\ +{\ + \"event_action\": \"trigger\",\ + \"dedup_key\": \"$IP\",\ + \"payload\": {\ + \"summary\": \"Node NOT validating: Shard-$SHARD_NUM: $IP\",\ + \"source\": \"$IP\",\ + \"severity\": \"critical\"\ + }\ +}" +RESOLVE="\ +{\ + \"event_action\": \"resolve\",\ + \"dedup_key\": \"$IP\"\ +}" +KEY="${HMY_PAGERDUTY_KEY}" +HEADER="X-Routing-Key: $KEY" +POSTURL="https://events.pagerduty.com/v2/enqueue" + +### Validation check variables +validation=$(echo "$LOG" | tac | grep -ai -m 1 "bingo\|hooray") +timestamp=$(echo $validation | cut -f 3 -d 't' | cut -c 4-22 | tr T \ ) +latest=$(date -d "$timestamp" +%s) +curtime=$(date +%s) +delay=60 + +### Pagerduty +if [[ $(($curtime - $latest)) -gt $delay ]]; then + # Trigger an alert + trigger=$(curl -s -X POST -H "$HEADER" -d "$TRIGGER" "$POSTURL") +else + # Resolve an alert + resolve=$(curl -s -X POST -H "$HEADER" -d "$RESOLVE" "$POSTURL") +fi diff --git a/test/configs/beaconchain10.txt b/test/configs/beaconchain10.txt index 1982fede6..1da1bf44c 100644 --- a/test/configs/beaconchain10.txt +++ b/test/configs/beaconchain10.txt @@ -1,10 +1,10 @@ -127.0.0.1 9000 validator 0x007579ED2Fe889C5255C36d4978Ac94d25811771 ca23704be46ce9c4704681ac9c08ddc644f1858a5c28ce236e1b5d9dee67c1f5a28075b5ef089adeffa8a372c1762007 -127.0.0.1 9001 validator 0x00F98965458a35f3788C45A095582AB18A5ae79c c6c008ec354ac776fce5c24ce46d5a9897449b66d91d8bbe2ca0249f1e1fce1a5577cf6f91067b060ee20114ac726297 -127.0.0.1 9002 validator 0x0102B41674C3ac2634f404d8c25C25Bb959fE952 f9a835dac43236ded1899257c904da922a9a86242ccced1f782eed8f9df6732c0d44f56280d2ca1689db878c2f14d285 -127.0.0.1 9003 validator 0x0178A7bE4399c1968156edE4f52ae91953ab9B63 7ca453b4916f08e7316cb9e0a80e03336ee70d364dccbab09496590da8807d01cef2cd07187a7d2c946d500936449a98 -127.0.0.1 9004 validator 0x0215c51A3d67Eb1e949bD1Df8b74D3aef097e92d 50b20b4eb89041aa4715e87e4aa6430e674658959d8be657d43e4d3d4c35d7507d6a40aec5188218dcbb5460e354fd12 -127.0.0.1 9005 validator 0x021983eA41fbeeB39F82a9CAf1A83476F0cFeEDC 56c8ebcce3dcacd9fb4209805b141c52efa79842de0098821b4010e2998b7441690245476874878ef07d8fbed32aa917 -127.0.0.1 9006 validator 0x03d1a55eA1246efB257D49D9286f7D370bd09c97 62e389f040a6dd855e9676ab463aa5f04c6ea7766308e8f01c5ff9be43b83e980c734c48a7023a11a9b23a847bd0a889 -127.0.0.1 9007 validator 0x055b95d5205B5711099C32626Ea61481779a2233 cb18edb21369848307299d5903e70c4a505a5efd55e056e6ff9d8ee45ad921da84ca808c544da8126a8ae3951ef9ad0d -127.0.0.1 9008 validator 0x0566729A6FCDda16287777baB5D4425AA93bB0Fc 5ecf182ef0cfe449470d900dbe4ce312d534c882765e639c59525f2710d9f96a04abd871e4f0afadc1bd4b07a54ea106 -127.0.0.1 9009 validator 0x05bA7FcC4c1d7286f7A3d5552DdF305677338c22 5438b795c8652f901b948e886085d6386608875c5e8c1474813c82a6079df3bd8b261f25241c3ed825675f58a1f79491 +127.0.0.1 9000 validator 0x007579ED2Fe889C5255C36d4978Ac94d25811771 e7f54994bc5c02edeeb178ce2d34db276a893bab5c59ac3d7eb9f077c893f9e31171de6236ba0e21be415d8631e45b91 +127.0.0.1 9001 validator 0x00F98965458a35f3788C45A095582AB18A5ae79c 4bf54264c1bfa68ca201f756e882f49e1e8aaa5ddf42deaf4690bc3977497e245af40f3ad4003d7a6121614f13033b0b +127.0.0.1 9002 validator 0x0102B41674C3ac2634f404d8c25C25Bb959fE952 e212c4c5cd8e078aedd34c300ae500c5bd5fd036231d1c9dcc8400337919a59ebd47523faa209fc0d873ead492621f88 +127.0.0.1 9003 validator 0x0178A7bE4399c1968156edE4f52ae91953ab9B63 b7aec767534872af7c905da7318cddf2248b0834ec1d64944ad725878cca0833f14cd3b2f7f01b6f041d573fe67ec299 +127.0.0.1 9004 validator 0x0215c51A3d67Eb1e949bD1Df8b74D3aef097e92d 99d0835797ca0683fb7b1d14a882879652ddcdcfe0d52385ffddf8012ee804d92e5c05a56c9d7fc663678e36a158a28c +127.0.0.1 9005 validator 0x021983eA41fbeeB39F82a9CAf1A83476F0cFeEDC f441b75470919983ba18a0525b1c101af42cae052c6d50f74d1553eebbe78ef226849c5e5a7fb2ba563eec6b20380c00 +127.0.0.1 9006 validator 0x03d1a55eA1246efB257D49D9286f7D370bd09c97 9f5f8c5dbe12d14ae8468828754c4db3f2129c69de88baee4e361e38000aed54da204591bbcdeeeb571ffff81e9ade02 +127.0.0.1 9007 validator 0x055b95d5205B5711099C32626Ea61481779a2233 3434351415d20b3b4a5014b9aca44703dfef332e50e008a59ca8d1f9bb41b0ea695fb74a0f9e346138a429d08c24c793 +127.0.0.1 9008 validator 0x0566729A6FCDda16287777baB5D4425AA93bB0Fc 8a211eb5e9334341fd2498fb5d6b922b4a0984d6a4ea0b5631c1904de5fe21fd6889c9c032d862546ca50a5c41294b0c +127.0.0.1 9009 validator 0x05bA7FcC4c1d7286f7A3d5552DdF305677338c22 2e9aa982036860eccb0880702c5d71665761f8d4e6ab5f3d8c3aee25b3e68a2c7eaa3cd85972c7f9a3c19d3fed3d5d01 diff --git a/test/configs/local-resharding.txt b/test/configs/local-resharding.txt new file mode 100644 index 000000000..1539105f5 --- /dev/null +++ b/test/configs/local-resharding.txt @@ -0,0 +1,25 @@ +127.0.0.1 9000 validator one1pdv9lrdwl0rg5vglh4xtyrv3wjk3wsqket7zxy 65f55eb3052f9e9f632b2923be594ba77c55543f5c58ee1454b9cfd658d25e06373b0f7d42a19c84768139ea294f6204 +127.0.0.1 9001 validator one1m6m0ll3q7ljdqgmth2t5j7dfe6stykucpj2nr5 40379eed79ed82bebfb4310894fd33b6a3f8413a78dc4d43b98d0adc9ef69f3285df05eaab9f2ce5f7227f8cb920e809 +127.0.0.1 9002 validator one12fuf7x9rgtdgqg7vgq0962c556m3p7afsxgvll 02c8ff0b88f313717bc3a627d2f8bb172ba3ad3bb9ba3ecb8eed4b7c878653d3d4faf769876c528b73f343967f74a917 +127.0.0.1 9003 validator one16qsd5ant9v94jrs89mruzx62h7ekcfxmduh2rx ee2474f93cba9241562efc7475ac2721ab0899edf8f7f115a656c0c1f9ef8203add678064878d174bb478fa2e6630502 +127.0.0.1 9004 validator one1pf75h0t4am90z8uv3y0dgunfqp4lj8wr3t5rsp e751ec995defe4931273aaebcb2cd14bf37e629c554a57d3f334c37881a34a6188a93e76113c55ef3481da23b7d7ab09 +127.0.0.1 9005 validator one1est2gxcvavmtnzc7mhd73gzadm3xxcv5zczdtw 776f3b8704f4e1092a302a60e84f81e476c212d6f458092b696df420ea19ff84a6179e8e23d090b9297dc041600bc100 +127.0.0.1 9006 validator one1spshr72utf6rwxseaz339j09ed8p6f8ke370zj 2d61379e44a772e5757e27ee2b3874254f56073e6bd226eb8b160371cc3c18b8c4977bd3dcb71fd57dc62bf0e143fd08 +127.0.0.1 9007 validator one1a0x3d6xpmr6f8wsyaxd9v36pytvp48zckswvv9 c4e4708b6cf2a2ceeb59981677e9821eebafc5cf483fb5364a28fa604cc0ce69beeed40f3f03815c9e196fdaec5f1097 +127.0.0.1 9008 validator one1d2rngmem4x2c6zxsjjz29dlah0jzkr0k2n88wc 6dc2fdc2ceec18f6923b99fd86a68405c132e1005cf1df72dca75db0adfaeb53d201d66af37916d61f079f34f21fb96 +127.0.0.1 9009 validator one1658znfwf40epvy7e46cqrmzyy54h4n0qa73nep 49d15743b36334399f9985feb0753430a2b287b2d68b84495bbb15381854cbf01bca9d1d9f4c9c8f18509b2bfa6bd40f +127.0.0.1 9010 validator one1a50tun737ulcvwy0yvve0pvu5skq0kjargvhwe 52ecce5f64db21cbe374c9268188f5d2cdd5bec1a3112276a350349860e35fb81f8cfe447a311e0550d961cf25cb988d +127.0.0.1 9011 validator one1uyshu2jgv8w465yc8kkny36thlt2wvel89tcmg a547a9bf6fdde4f4934cde21473748861a3cc0fe8bbb5e57225a29f483b05b72531f002f8187675743d819c955a86100 +127.0.0.1 9012 validator one103q7qe5t2505lypvltkqtddaef5tzfxwsse4z7 678ec9670899bf6af85b877058bea4fc1301a5a3a376987e826e3ca150b80e3eaadffedad0fedfa111576fa76ded980c +127.0.0.1 9013 validator one129r9pj3sk0re76f7zs3qz92rggmdgjhtwge62k 63f479f249c59f0486fda8caa2ffb247209489dae009dfde6144ff38c370230963d360dffd318cfb26c213320e89a512 + +127.0.0.1 9100 newnode one1ghkz3frhske7emk79p7v2afmj4a5t0kmjyt4s5 eca09c1808b729ca56f1b5a6a287c6e1c3ae09e29ccf7efa35453471fcab07d9f73cee249e2b91f5ee44eb9618be3904 +127.0.0.1 9101 newnode one1d7jfnr6yraxnrycgaemyktkmhmajhp8kl0yahv f47238daef97d60deedbde5302d05dea5de67608f11f406576e363661f7dcbc4a1385948549b31a6c70f6fde8a391486 +127.0.0.1 9102 newnode one1r4zyyjqrulf935a479sgqlpa78kz7zlcg2jfen fc4b9c535ee91f015efff3f32fbb9d32cdd9bfc8a837bb3eee89b8fff653c7af2050a4e147ebe5c7233dc2d5df06ee0a +127.0.0.1 9103 newnode one1p7ht2d4kl8ve7a8jxw746yfnx4wnfxtp8jqxwe ca86e551ee42adaaa6477322d7db869d3e203c00d7b86c82ebee629ad79cb6d57b8f3db28336778ec2180e56a8e07296 +127.0.0.1 9104 newnode one1z05g55zamqzfw9qs432n33gycdmyvs38xjemyl 95117937cd8c09acd2dfae847d74041a67834ea88662a7cbed1e170350bc329e53db151e5a0ef3e712e35287ae954818 +127.0.0.1 9105 newnode one1ljznytjyn269azvszjlcqvpcj6hjm822yrcp2e 68ae289d73332872ec8d04ac256ca0f5453c88ad392730c5741b6055bc3ec3d086ab03637713a29f459177aaa8340615 +127.0.0.1 9107 newnode one1uyshu2jgv8w465yc8kkny36thlt2wvel89tcmg 1c1fb28d2de96e82c3d9b4917eb54412517e2763112a3164862a6ed627ac62e87ce274bb4ea36e6a61fb66a15c263a06 +127.0.0.1 9108 newnode one103q7qe5t2505lypvltkqtddaef5tzfxwsse4z7 b179c4fdc0bee7bd0b6698b792837dd13404d3f985b59d4a9b1cd0641a76651e271518b61abbb6fbebd4acf963358604 +127.0.0.1 9109 newnode one1658znfwf40epvy7e46cqrmzyy54h4n0qa73nep 576d3c48294e00d6be4a22b07b66a870ddee03052fe48a5abbd180222e5d5a1f8946a78d55b025de21635fd743bbad90 +127.0.0.1 9110 newnode one1d2rngmem4x2c6zxsjjz29dlah0jzkr0k2n88wc 16513c487a6bb76f37219f3c2927a4f281f9dd3fd6ed2e3a64e500de6545cf391dd973cc228d24f9bd01efe94912e714 diff --git a/test/configs/local.txt b/test/configs/local.txt new file mode 100644 index 000000000..47ed122e7 --- /dev/null +++ b/test/configs/local.txt @@ -0,0 +1,14 @@ +127.0.0.1 9000 validator one1pdv9lrdwl0rg5vglh4xtyrv3wjk3wsqket7zxy 65f55eb3052f9e9f632b2923be594ba77c55543f5c58ee1454b9cfd658d25e06373b0f7d42a19c84768139ea294f6204 +127.0.0.1 9001 validator one1m6m0ll3q7ljdqgmth2t5j7dfe6stykucpj2nr5 40379eed79ed82bebfb4310894fd33b6a3f8413a78dc4d43b98d0adc9ef69f3285df05eaab9f2ce5f7227f8cb920e809 +127.0.0.1 9002 validator one12fuf7x9rgtdgqg7vgq0962c556m3p7afsxgvll 02c8ff0b88f313717bc3a627d2f8bb172ba3ad3bb9ba3ecb8eed4b7c878653d3d4faf769876c528b73f343967f74a917 +127.0.0.1 9003 validator one16qsd5ant9v94jrs89mruzx62h7ekcfxmduh2rx ee2474f93cba9241562efc7475ac2721ab0899edf8f7f115a656c0c1f9ef8203add678064878d174bb478fa2e6630502 +127.0.0.1 9004 validator one1pf75h0t4am90z8uv3y0dgunfqp4lj8wr3t5rsp e751ec995defe4931273aaebcb2cd14bf37e629c554a57d3f334c37881a34a6188a93e76113c55ef3481da23b7d7ab09 +127.0.0.1 9005 validator one1est2gxcvavmtnzc7mhd73gzadm3xxcv5zczdtw 776f3b8704f4e1092a302a60e84f81e476c212d6f458092b696df420ea19ff84a6179e8e23d090b9297dc041600bc100 +127.0.0.1 9006 validator one1spshr72utf6rwxseaz339j09ed8p6f8ke370zj 2d61379e44a772e5757e27ee2b3874254f56073e6bd226eb8b160371cc3c18b8c4977bd3dcb71fd57dc62bf0e143fd08 +127.0.0.1 9007 validator one1a0x3d6xpmr6f8wsyaxd9v36pytvp48zckswvv9 c4e4708b6cf2a2ceeb59981677e9821eebafc5cf483fb5364a28fa604cc0ce69beeed40f3f03815c9e196fdaec5f1097 +127.0.0.1 9008 validator one1d2rngmem4x2c6zxsjjz29dlah0jzkr0k2n88wc 6dc2fdc2ceec18f6923b99fd86a68405c132e1005cf1df72dca75db0adfaeb53d201d66af37916d61f079f34f21fb96 +127.0.0.1 9009 validator one1658znfwf40epvy7e46cqrmzyy54h4n0qa73nep 49d15743b36334399f9985feb0753430a2b287b2d68b84495bbb15381854cbf01bca9d1d9f4c9c8f18509b2bfa6bd40f +127.0.0.1 9010 validator one1a50tun737ulcvwy0yvve0pvu5skq0kjargvhwe 52ecce5f64db21cbe374c9268188f5d2cdd5bec1a3112276a350349860e35fb81f8cfe447a311e0550d961cf25cb988d +127.0.0.1 9011 validator one1uyshu2jgv8w465yc8kkny36thlt2wvel89tcmg a547a9bf6fdde4f4934cde21473748861a3cc0fe8bbb5e57225a29f483b05b72531f002f8187675743d819c955a86100 +127.0.0.1 9012 validator one103q7qe5t2505lypvltkqtddaef5tzfxwsse4z7 678ec9670899bf6af85b877058bea4fc1301a5a3a376987e826e3ca150b80e3eaadffedad0fedfa111576fa76ded980c +127.0.0.1 9013 validator one129r9pj3sk0re76f7zs3qz92rggmdgjhtwge62k 63f479f249c59f0486fda8caa2ffb247209489dae009dfde6144ff38c370230963d360dffd318cfb26c213320e89a512 diff --git a/test/debug.sh b/test/debug.sh index 8ab875c48..f43ecb55b 100755 --- a/test/debug.sh +++ b/test/debug.sh @@ -1,3 +1,3 @@ ./test/kill_node.sh rm -rf tmp_log* -./test/deploy.sh -D -1 ./test/configs/beaconchain20.txt +./test/deploy.sh -D -1 ./test/configs/local-resharding.txt diff --git a/test/deploy.sh b/test/deploy.sh index 4ae78ae26..c915fc14b 100755 --- a/test/deploy.sh +++ b/test/deploy.sh @@ -5,21 +5,22 @@ USER=$(whoami) . "${ROOT}/scripts/setup_bls_build_flags.sh" -set -x +# set -x set -eo pipefail export GO111MODULE=on -if [ -f "blspass.txt" ] +mkdir -p .hmy +if [ -f ".hmy/blspass.txt" ] then - echo "blspass.txt already in local." + echo ".hmy/blspass.txt already in local." else - aws s3 cp s3://harmony-pass/blspass.txt blspass.txt + touch .hmy/blspass.txt fi function check_result() { find $log_folder -name leader-*.log > $log_folder/all-leaders.txt - find $log_folder -name validator-*.log > $log_folder/all-validators.txt + find $log_folder -name zerolog-validator-*.log > $log_folder/all-validators.txt find $log_folder -name archival-*.log >> $log_folder/all-validators.txt echo ====== RESULTS ====== @@ -34,6 +35,8 @@ function cleanup() { echo 'Killed process: '$pid $DRYRUN kill -9 $pid 2> /dev/null done + rm -rf ./db/harmony_* + rm -rf ./db-127.0.0.1-* } function killnode() { @@ -56,13 +59,11 @@ function usage { USAGE: $ME [OPTIONS] config_file_name [extra args to node] -h print this help message - -d enable db support (default: $DB) -t toggle txgen (default: $TXGEN) -D duration txgen run duration (default: $DURATION) -m min_peers minimal number of peers to start consensus (default: $MIN) -s shards number of shards (default: $SHARDS) -n dryrun mode (default: $DRYRUN) - -S disable sync test (default: $SYNC) -B don't build the binary This script will build all the binaries and start harmony and txgen based on the configuration file. @@ -79,24 +80,21 @@ EOU DEFAULT_DURATION_NOSYNC=60 DEFAULT_DURATION_SYNC=200 -DB=false TXGEN=true DURATION= MIN=3 SHARDS=2 -SYNC=true DRYRUN= +SYNC=true -while getopts "hdtD:m:s:nSB" option; do +while getopts "htD:m:s:nB" option; do case $option in h) usage ;; - d) DB=true ;; t) TXGEN=false ;; D) DURATION=$OPTARG ;; m) MIN=$OPTARG ;; s) SHARDS=$OPTARG ;; n) DRYRUN=echo ;; - S) SYNC=false ;; B) NOBUILD=true ;; esac done @@ -150,17 +148,11 @@ echo "bootnode launched." + " $BN_MA" unset -v base_args declare -a base_args args -base_args=(-log_folder "${log_folder}" -min_peers "${MIN}" -bootnodes "${BN_MA}" -nopass) -if "${DB}" -then - base_args=("${base_args[@]}" -db_supported) -fi - +base_args=(-log_folder "${log_folder}" -min_peers "${MIN}" -bootnodes "${BN_MA}" -network_type="localnet" -blspass file:.hmy/blspass.txt -dns=false) NUM_NN=0 sleep 2 -mkdir -p .hmy # Start nodes i=0 while IFS='' read -r line || [[ -n "$line" ]]; do @@ -169,17 +161,15 @@ while IFS='' read -r line || [[ -n "$line" ]]; do then args=("${base_args[@]}" -ip "${ip}" -port "${port}" -key "/tmp/${ip}-${port}.key" -db_dir "db-${ip}-${port}") else - if [ -f "${blspub}.key" ] - then - echo ""${blspub}.key" already in local." - else - aws s3 cp "s3://harmony-secret-keys/bls/${blspub}.key" .hmy + if [ ! -e .hmy/${blspub}.key ]; then + echo "missing blskey .hmy/${blspub}.key" + echo "skipping this node" + continue fi - args=("${base_args[@]}" -ip "${ip}" -port "${port}" -key "/tmp/${ip}-${port}.key" -db_dir "db-${ip}-${port}" -accounts "${account}" -blspass file:blspass.txt -blskey_file ".hmy/${blspub}.key") + args=("${base_args[@]}" -ip "${ip}" -port "${port}" -key "/tmp/${ip}-${port}.key" -db_dir "db-${ip}-${port}" -blskey_file ".hmy/${blspub}.key") fi - args=("${base_args[@]}" -ip "${ip}" -port "${port}" -key "/tmp/${ip}-${port}.key" -db_dir "db-${ip}-${port}" -blspass file:blspass.txt -blskey_file ".hmy/${blspub}.key" -dns=false -network_type="mainnet") case "${mode}" in leader*|validator*) args=("${args[@]}" -is_genesis);; esac @@ -188,9 +178,9 @@ while IFS='' read -r line || [[ -n "$line" ]]; do case "${mode}" in explorer*) args=("${args[@]}" -is_genesis=false -is_explorer=true -shard_id=0);; esac case "${mode}" in newnode) - "${SYNC}" || continue sleep "${NUM_NN}" - NUM_NN=$((${NUM_NN} + 30)) + NUM_NN=$((${NUM_NN} + 1)) + args=("${args[@]}" -is_newnode) ;; esac case "${mode}" in @@ -202,7 +192,7 @@ done < $config if [ "$TXGEN" == "true" ]; then echo "launching txgen ... wait" -# sleep 2 + # sleep 2 line=$(grep client $config) IFS=' ' read ip port mode account <<< $line if [ "$mode" == "client" ]; then diff --git a/test/kill_node.sh b/test/kill_node.sh index 7891e3138..c173ade25 100755 --- a/test/kill_node.sh +++ b/test/kill_node.sh @@ -5,3 +5,5 @@ do echo 'Killed process: '$pid kill -9 $pid done + +rm -rf db-127.0.0.1-* diff --git a/test/test_sdk.sh b/test/test_sdk.sh new file mode 100755 index 000000000..d26907b5a --- /dev/null +++ b/test/test_sdk.sh @@ -0,0 +1,7 @@ +# to install gsed for MacOS: brew install gnu-sed +./test/kill_node.sh +rm -rf tmp_log* +gsed -i 's/GenesisShardNum = 4/GenesisShardNum = 1/' core/resharding.go +gsed -i 's/GenesisShardSize = 150/GenesisShardSize = 20/' core/resharding.go +gsed -i 's/GenesisShardHarmonyNodes = 112/GenesisShardHarmonyNodes = 20/' core/resharding.go +./test/deploy.sh -D -1 ./test/configs/beaconchain20.txt -network_type testnet