tx · DotzstxB6JW7CBfCas71EawsPf2gZWJm1K8RDmoCPYE 3MpdJJV3WyZufiGHRtb7xbY2Vsc2pBFcJYZ: -0.01400000 Waves 2021.05.13 08:34 [1523495] smart account 3MpdJJV3WyZufiGHRtb7xbY2Vsc2pBFcJYZ > SELF 0.00000000 Waves
{ "type": 13, "id": "DotzstxB6JW7CBfCas71EawsPf2gZWJm1K8RDmoCPYE", "fee": 1400000, "feeAssetId": null, "timestamp": 1620884066461, "version": 1, "sender": "3MpdJJV3WyZufiGHRtb7xbY2Vsc2pBFcJYZ", "senderPublicKey": "ALG9JVGNn9aCL68dbg1AmW6yDQv1b8EDLq99pQS8L1k6", "proofs": [ "qESVjMczdkR6EEnxhV8sM6TAR7wH3ezLshNpU3ENuXLggDkbucqD7uCx3rXRL4xovjVikRttYWzoWDw85XW3oat" ], "script": "base64:AAIEAAAAAAAAAA8IAhIAEgMKAQgSBAoCCAEAAAAWAAAAABNnYW1lTWFzdGVyUHVibGljS2V5AQAAACCKqFcQ1VSNQa7ZONz4ZD59H7wLfuowVwcQ1qI/fK6ACwAAAAAKZGljZU51bWJlcgkABEwAAAACAAAAAAAAAAACCQAETAAAAAIAAAAAAAAAAAMJAARMAAAAAgAAAAAAAAAABAkABEwAAAACAAAAAAAAAAAFCQAETAAAAAIAAAAAAAAAAAYJAARMAAAAAgAAAAAAAAAABwkABEwAAAACAAAAAAAAAAAICQAETAAAAAIAAAAAAAAAAAkJAARMAAAAAgAAAAAAAAAACgkABEwAAAACAAAAAAAAAAALCQAETAAAAAIAAAAAAAAAAAwFAAAAA25pbAAAAAAJZ2FtZVRva2VuAQAAACCvQNOoGbkt3wVk9kpr+yD9dOUY7LBdGNCbLK5MVkSodQAAAAAJUlNBUFVCTElDCQACWwAAAAECAAABkmJhc2U2NDpNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQWpudDJQZE4xUGRqZDoKN3JzWHpiYXBndWNuOWUxWGZmVXgxbzdnckFsdzhDNk5GdXYxUFBqN0tuUTZSdE45eGhuaUxGNHhLbGM3Ly9UWVhkMXVIV214OXZ1OWhqY2lZWDlVTVJKbmhsWk8ycTM0bXhQZGNnTERLaEpIRE43MjZLSTB3SHBGUTVkSE15em9NTGRXc2FoRmMxV3gvWHhyb0syS2MxeTJKQldOMmFrUmxreFNEY2x1cWJiVWNXTXlyd0c2aVd1VmxoZWo1eGZjdWVyZy9wc0szNVdHbjdTTEYyOXRXdVIyeCsyNG5NK0JKVXN1Ukc3eUJaVWhHcll6SmsyZ3ZwdWNSTGVhNkFGUnZvdzdSZHlNWUF3S0ZycjZtZ1EwVmNVdzJUNzUwZTFvR2FuWTBVZFUzTlBzS0lndlU0RnQ0dWliTWxNTUJKdmNyc0ViRFFIZkRsd0lEQVFBQgAAAAAJR0FNRVNUQVJUAAAAAAAAAAAAAAAAAA5HQU1FSU5QUk9HUkVTUwAAAAAAAAAAAQAAAAAMR0FNRUZJTklTSEVEAAAAAAAAAAACAAAAABBnYW1lQ291bnRlckxhYmVsAgAAAA1HX0dBTUVDT1VOVEVSAAAAABJnYW1lVG90YWxCZXRzTGFiZWwCAAAAEEdfVE9UQUxDUkFQU0JFVFMAAAAAEGxhc3RSb2xsZWROdW1iZXIAAAAAAAAAAAABAAAAE2F1dGhvcml6ZVBlcm1pc3Npb24AAAABAAAAD2NhbGxlclB1YmxpY0tleQkBAAAAAiE9AAAAAgUAAAAPY2FsbGVyUHVibGljS2V5BQAAABNnYW1lTWFzdGVyUHVibGljS2V5AQAAABlnYW1lQ3VycmVudFBvaW50RGljZUxhYmVsAAAAAQAAAAtnYW1lQ291bnRlcgkAASwAAAACCQABLAAAAAICAAAAAkdfCQABpAAAAAEFAAAAC2dhbWVDb3VudGVyAgAAAAtfRklSU1RQT0lOVAEAAAAXZ2FtZUZpcnN0UG9pbnREaWNlTGFiZWwAAAABAAAAC2dhbWVDb3VudGVyCQABLAAAAAIJAAEsAAAAAgIAAAACR18JAAGkAAAAAQUAAAALZ2FtZUNvdW50ZXICAAAADV9DVVJSRU5UUE9JTlQBAAAADmdhbWVTdGF0ZUxhYmVsAAAAAQAAAAtnYW1lQ291bnRlcgkAASwAAAACCQABLAAAAAICAAAAAkdfCQABpAAAAAEFAAAAC2dhbWVDb3VudGVyAgAAAAZfU1RBVEUBAAAAD2dhbWVTdW1TaGFMYWJlbAAAAAEAAAALZ2FtZUNvdW50ZXIJAAEsAAAAAgkAASwAAAACAgAAAAJHXwkAAaQAAAABBQAAAAtnYW1lQ291bnRlcgIAAAAHX1NVTVNIQQEAAAAUZ2FtZVN0YXJ0SGVpZ2h0TGFiZWwAAAABAAAAC2dhbWVDb3VudGVyCQABLAAAAAIJAAEsAAAAAgIAAAACR18JAAGkAAAAAQUAAAALZ2FtZUNvdW50ZXICAAAADF9TVEFSVEhFSUdIVAEAAAAMZ2V0R2FtZVN0YXRlAAAAAQAAAAtnYW1lQ291bnRlcgkABBoAAAACBQAAAAR0aGlzCQEAAAAOZ2FtZVN0YXRlTGFiZWwAAAABBQAAAAtnYW1lQ291bnRlcgEAAAANZ2V0R2FtZVN1bVNoYQAAAAEAAAALZ2FtZUNvdW50ZXIJAAQdAAAAAgUAAAAEdGhpcwkBAAAAD2dhbWVTdW1TaGFMYWJlbAAAAAEFAAAAC2dhbWVDb3VudGVyAQAAAA5nZXRTdGFydEhlaWdodAAAAAEAAAALZ2FtZUNvdW50ZXIJAAQaAAAAAgUAAAAEdGhpcwkBAAAAFGdhbWVTdGFydEhlaWdodExhYmVsAAAAAQUAAAALZ2FtZUNvdW50ZXIBAAAAEmdldENyYXBHYW1lQ291bnRlcgAAAAAJAAQaAAAAAgUAAAAEdGhpcwUAAAAQZ2FtZUNvdW50ZXJMYWJlbAEAAAARZ2V0Rmlyc3RQb2ludERpY2UAAAABAAAAC2dhbWVDb3VudGVyCQAEGgAAAAIFAAAABHRoaXMJAQAAABdnYW1lRmlyc3RQb2ludERpY2VMYWJlbAAAAAEFAAAAC2dhbWVDb3VudGVyAQAAABNnZXRDdXJyZW50UG9pbnREaWNlAAAAAQAAAAtnYW1lQ291bnRlcgkABBoAAAACBQAAAAR0aGlzCQEAAAAZZ2FtZUN1cnJlbnRQb2ludERpY2VMYWJlbAAAAAEFAAAAC2dhbWVDb3VudGVyAAAAAwAAAAFpAQAAAAhpbml0R2FtZQAAAAADCQEAAAATYXV0aG9yaXplUGVybWlzc2lvbgAAAAEIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQkAAAIAAAABAgAAABJpbml0R2FtZV9GT1JCSURERU4EAAAAByRtYXRjaDAJAQAAABJnZXRDcmFwR2FtZUNvdW50ZXIAAAAAAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAB2NvdW50ZXIFAAAAByRtYXRjaDAJAAACAAAAAQIAAAARSU5JVF9BTFJFQURZX0RPTkUJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAEGdhbWVDb3VudGVyTGFiZWwAAAAAAAAAAAAJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAEmdhbWVUb3RhbEJldHNMYWJlbAAAAAAAAAAAAAUAAAADbmlsAAAAAWkBAAAACXN0YXJ0R2FtZQAAAAEAAAAKcmFuZG9tSGFzaAMJAQAAABNhdXRob3JpemVQZXJtaXNzaW9uAAAAAQgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5CQAAAgAAAAECAAAAE3N0YXJ0R2FtZV9GT1JCSURERU4EAAAAByRtYXRjaDAJAQAAABJnZXRDcmFwR2FtZUNvdW50ZXIA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", "chainId": 84, "height": 1523495, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: FvBSZcN9ooGY4EL1yyq4uJrD1MiGhYhkkheNRAs4Dwzu Next: FjumHL3NMo3Aj5LJstW9BYVJrF2SZmzhfSDAxi9gr3we Diff:
Old | New | Differences | |
---|---|---|---|
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let a = base58'ALG9JVGNn9aCL68dbg1AmW6yDQv1b8EDLq99pQS8L1k6' | |
5 | 5 | ||
6 | - | let b = [ | |
6 | + | let b = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] | |
7 | 7 | ||
8 | 8 | let c = base58'Co7gTLr7ZJvVKwToLpuZJqmkVecy5uwupYH6qCkKuhc8' | |
9 | 9 | ||
10 | - | let d = 0 | |
10 | + | let d = fromBase64String("base64:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjnt2PdN1Pdjd: | |
11 | + | 7rsXzbapgucn9e1XffUx1o7grAlw8C6NFuv1PPj7KnQ6RtN9xhniLF4xKlc7//TYXd1uHWmx9vu9hjciYX9UMRJnhlZO2q34mxPdcgLDKhJHDN726KI0wHpFQ5dHMyzoMLdWsahFc1Wx/XxroK2Kc1y2JBWN2akRlkxSDcluqbbUcWMyrwG6iWuVlhej5xfcuerg/psK35WGn7SLF29tWuR2x+24nM+BJUsuRG7yBZUhGrYzJk2gvpucRLea6AFRvow7RdyMYAwKFrr6mgQ0VcUw2T750e1oGanY0UdU3NPsKIgvU4Ft4uibMlMMBJvcrsEbDQHfDlwIDAQAB") | |
11 | 12 | ||
12 | - | let e = | |
13 | + | let e = 0 | |
13 | 14 | ||
14 | - | let f = | |
15 | + | let f = 1 | |
15 | 16 | ||
16 | - | let g = | |
17 | + | let g = 2 | |
17 | 18 | ||
18 | - | let h = " | |
19 | + | let h = "G_GAMECOUNTER" | |
19 | 20 | ||
20 | - | let i = "G_ | |
21 | + | let i = "G_TOTALCRAPSBETS" | |
21 | 22 | ||
22 | 23 | let j = 0 | |
23 | 24 | ||
24 | 25 | func k (l) = (l != a) | |
25 | 26 | ||
26 | 27 | ||
27 | - | func m (n) = (("G_" + toString(n)) + "_ | |
28 | + | func m (n) = (("G_" + toString(n)) + "_FIRSTPOINT") | |
28 | 29 | ||
29 | 30 | ||
30 | - | func o (n) = (("G_" + toString(n)) + "_ | |
31 | + | func o (n) = (("G_" + toString(n)) + "_CURRENTPOINT") | |
31 | 32 | ||
32 | 33 | ||
33 | - | func p (n) = (("G_" + toString(n)) + "_ | |
34 | + | func p (n) = (("G_" + toString(n)) + "_STATE") | |
34 | 35 | ||
35 | 36 | ||
36 | - | func q (n) = | |
37 | + | func q (n) = (("G_" + toString(n)) + "_SUMSHA") | |
37 | 38 | ||
38 | 39 | ||
39 | - | func r (n) = | |
40 | + | func r (n) = (("G_" + toString(n)) + "_STARTHEIGHT") | |
40 | 41 | ||
41 | 42 | ||
42 | 43 | func s (n) = getInteger(this, p(n)) | |
43 | 44 | ||
44 | 45 | ||
45 | - | func t () = | |
46 | + | func t (n) = getString(this, q(n)) | |
46 | 47 | ||
47 | 48 | ||
48 | - | func u ( | |
49 | + | func u (n) = getInteger(this, r(n)) | |
49 | 50 | ||
50 | 51 | ||
51 | - | @Callable(w) | |
52 | - | func initGame () = if (k(w.callerPublicKey)) | |
52 | + | func v () = getInteger(this, h) | |
53 | + | ||
54 | + | ||
55 | + | func w (n) = getInteger(this, o(n)) | |
56 | + | ||
57 | + | ||
58 | + | func x (n) = getInteger(this, m(n)) | |
59 | + | ||
60 | + | ||
61 | + | @Callable(y) | |
62 | + | func initGame () = if (k(y.callerPublicKey)) | |
53 | 63 | then throw("initGame_FORBIDDEN") | |
54 | 64 | else { | |
55 | - | let | |
56 | - | if ($isInstanceOf( | |
65 | + | let z = v() | |
66 | + | if ($isInstanceOf(z, "Int")) | |
57 | 67 | then { | |
58 | - | let | |
68 | + | let A = z | |
59 | 69 | throw("INIT_ALREADY_DONE") | |
60 | 70 | } | |
61 | - | else [IntegerEntry( | |
71 | + | else [IntegerEntry(h, 0), IntegerEntry(i, 0)] | |
62 | 72 | } | |
63 | 73 | ||
64 | 74 | ||
65 | 75 | ||
66 | - | @Callable( | |
67 | - | func startGame ( | |
76 | + | @Callable(y) | |
77 | + | func startGame (B) = if (k(y.callerPublicKey)) | |
68 | 78 | then throw("startGame_FORBIDDEN") | |
69 | 79 | else { | |
70 | - | let | |
71 | - | if ($isInstanceOf( | |
80 | + | let z = v() | |
81 | + | if ($isInstanceOf(z, "Int")) | |
72 | 82 | then { | |
73 | - | let | |
74 | - | let | |
75 | - | [IntegerEntry( | |
83 | + | let C = z | |
84 | + | let D = (C + 1) | |
85 | + | [IntegerEntry(h, D), IntegerEntry(p(D), 0), IntegerEntry(r(D), lastBlock.height), StringEntry(q(D), toBase58String(sha256(fromBase64String(B))))] | |
76 | 86 | } | |
77 | 87 | else throw("INIT_NEED") | |
78 | 88 | } | |
79 | 89 | ||
80 | 90 | ||
81 | - | @Verifier(B) | |
82 | - | func C () = { | |
83 | - | let x = B | |
84 | - | sigVerify(B.bodyBytes, B.proofs[0], B.senderPublicKey) | |
91 | + | ||
92 | + | @Callable(y) | |
93 | + | func throwDices (E,F) = if (k(y.callerPublicKey)) | |
94 | + | then throw("throwDices_FORBIDDEN") | |
95 | + | else { | |
96 | + | let z = s(F) | |
97 | + | if ($isInstanceOf(z, "Int")) | |
98 | + | then { | |
99 | + | let G = z | |
100 | + | if ((G == g)) | |
101 | + | then throw("Game is finished") | |
102 | + | else { | |
103 | + | let H = t(F) | |
104 | + | if ($isInstanceOf(H, "String")) | |
105 | + | then { | |
106 | + | let I = H | |
107 | + | let J = fromBase64String(E) | |
108 | + | let K = rsaVerify(SHA256, fromBase58String(I), J, d) | |
109 | + | let L = blockInfoByHeight((lastBlock.height - 1)) | |
110 | + | if ($isInstanceOf(L, "BlockInfo")) | |
111 | + | then { | |
112 | + | let M = L | |
113 | + | let B = sha256((take(J, 4) + take(M.generationSignature, 4))) | |
114 | + | if (!(K)) | |
115 | + | then throw("INVALID_RSA_SIGN") | |
116 | + | else { | |
117 | + | let N = (toInt(B) % 8) | |
118 | + | let C = b[N] | |
119 | + | if ((G == e)) | |
120 | + | then [IntegerEntry(p(F), f), IntegerEntry(o(F), C)] | |
121 | + | else [IntegerEntry(p(F), f), IntegerEntry(m(F), C)] | |
122 | + | } | |
123 | + | } | |
124 | + | else throw("Last block doesn't exist.") | |
125 | + | } | |
126 | + | else throw("SHA doesn't exist") | |
127 | + | } | |
128 | + | } | |
129 | + | else throw("Game does not exist or has already ended.") | |
130 | + | } | |
131 | + | ||
132 | + | ||
133 | + | @Verifier(O) | |
134 | + | func P () = { | |
135 | + | let z = O | |
136 | + | sigVerify(O.bodyBytes, O.proofs[0], O.senderPublicKey) | |
85 | 137 | } | |
86 | 138 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 4 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let a = base58'ALG9JVGNn9aCL68dbg1AmW6yDQv1b8EDLq99pQS8L1k6' | |
5 | 5 | ||
6 | - | let b = [ | |
6 | + | let b = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] | |
7 | 7 | ||
8 | 8 | let c = base58'Co7gTLr7ZJvVKwToLpuZJqmkVecy5uwupYH6qCkKuhc8' | |
9 | 9 | ||
10 | - | let d = 0 | |
10 | + | let d = fromBase64String("base64:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjnt2PdN1Pdjd: | |
11 | + | 7rsXzbapgucn9e1XffUx1o7grAlw8C6NFuv1PPj7KnQ6RtN9xhniLF4xKlc7//TYXd1uHWmx9vu9hjciYX9UMRJnhlZO2q34mxPdcgLDKhJHDN726KI0wHpFQ5dHMyzoMLdWsahFc1Wx/XxroK2Kc1y2JBWN2akRlkxSDcluqbbUcWMyrwG6iWuVlhej5xfcuerg/psK35WGn7SLF29tWuR2x+24nM+BJUsuRG7yBZUhGrYzJk2gvpucRLea6AFRvow7RdyMYAwKFrr6mgQ0VcUw2T750e1oGanY0UdU3NPsKIgvU4Ft4uibMlMMBJvcrsEbDQHfDlwIDAQAB") | |
11 | 12 | ||
12 | - | let e = | |
13 | + | let e = 0 | |
13 | 14 | ||
14 | - | let f = | |
15 | + | let f = 1 | |
15 | 16 | ||
16 | - | let g = | |
17 | + | let g = 2 | |
17 | 18 | ||
18 | - | let h = " | |
19 | + | let h = "G_GAMECOUNTER" | |
19 | 20 | ||
20 | - | let i = "G_ | |
21 | + | let i = "G_TOTALCRAPSBETS" | |
21 | 22 | ||
22 | 23 | let j = 0 | |
23 | 24 | ||
24 | 25 | func k (l) = (l != a) | |
25 | 26 | ||
26 | 27 | ||
27 | - | func m (n) = (("G_" + toString(n)) + "_ | |
28 | + | func m (n) = (("G_" + toString(n)) + "_FIRSTPOINT") | |
28 | 29 | ||
29 | 30 | ||
30 | - | func o (n) = (("G_" + toString(n)) + "_ | |
31 | + | func o (n) = (("G_" + toString(n)) + "_CURRENTPOINT") | |
31 | 32 | ||
32 | 33 | ||
33 | - | func p (n) = (("G_" + toString(n)) + "_ | |
34 | + | func p (n) = (("G_" + toString(n)) + "_STATE") | |
34 | 35 | ||
35 | 36 | ||
36 | - | func q (n) = | |
37 | + | func q (n) = (("G_" + toString(n)) + "_SUMSHA") | |
37 | 38 | ||
38 | 39 | ||
39 | - | func r (n) = | |
40 | + | func r (n) = (("G_" + toString(n)) + "_STARTHEIGHT") | |
40 | 41 | ||
41 | 42 | ||
42 | 43 | func s (n) = getInteger(this, p(n)) | |
43 | 44 | ||
44 | 45 | ||
45 | - | func t () = | |
46 | + | func t (n) = getString(this, q(n)) | |
46 | 47 | ||
47 | 48 | ||
48 | - | func u ( | |
49 | + | func u (n) = getInteger(this, r(n)) | |
49 | 50 | ||
50 | 51 | ||
51 | - | @Callable(w) | |
52 | - | func initGame () = if (k(w.callerPublicKey)) | |
52 | + | func v () = getInteger(this, h) | |
53 | + | ||
54 | + | ||
55 | + | func w (n) = getInteger(this, o(n)) | |
56 | + | ||
57 | + | ||
58 | + | func x (n) = getInteger(this, m(n)) | |
59 | + | ||
60 | + | ||
61 | + | @Callable(y) | |
62 | + | func initGame () = if (k(y.callerPublicKey)) | |
53 | 63 | then throw("initGame_FORBIDDEN") | |
54 | 64 | else { | |
55 | - | let | |
56 | - | if ($isInstanceOf( | |
65 | + | let z = v() | |
66 | + | if ($isInstanceOf(z, "Int")) | |
57 | 67 | then { | |
58 | - | let | |
68 | + | let A = z | |
59 | 69 | throw("INIT_ALREADY_DONE") | |
60 | 70 | } | |
61 | - | else [IntegerEntry( | |
71 | + | else [IntegerEntry(h, 0), IntegerEntry(i, 0)] | |
62 | 72 | } | |
63 | 73 | ||
64 | 74 | ||
65 | 75 | ||
66 | - | @Callable( | |
67 | - | func startGame ( | |
76 | + | @Callable(y) | |
77 | + | func startGame (B) = if (k(y.callerPublicKey)) | |
68 | 78 | then throw("startGame_FORBIDDEN") | |
69 | 79 | else { | |
70 | - | let | |
71 | - | if ($isInstanceOf( | |
80 | + | let z = v() | |
81 | + | if ($isInstanceOf(z, "Int")) | |
72 | 82 | then { | |
73 | - | let | |
74 | - | let | |
75 | - | [IntegerEntry( | |
83 | + | let C = z | |
84 | + | let D = (C + 1) | |
85 | + | [IntegerEntry(h, D), IntegerEntry(p(D), 0), IntegerEntry(r(D), lastBlock.height), StringEntry(q(D), toBase58String(sha256(fromBase64String(B))))] | |
76 | 86 | } | |
77 | 87 | else throw("INIT_NEED") | |
78 | 88 | } | |
79 | 89 | ||
80 | 90 | ||
81 | - | @Verifier(B) | |
82 | - | func C () = { | |
83 | - | let x = B | |
84 | - | sigVerify(B.bodyBytes, B.proofs[0], B.senderPublicKey) | |
91 | + | ||
92 | + | @Callable(y) | |
93 | + | func throwDices (E,F) = if (k(y.callerPublicKey)) | |
94 | + | then throw("throwDices_FORBIDDEN") | |
95 | + | else { | |
96 | + | let z = s(F) | |
97 | + | if ($isInstanceOf(z, "Int")) | |
98 | + | then { | |
99 | + | let G = z | |
100 | + | if ((G == g)) | |
101 | + | then throw("Game is finished") | |
102 | + | else { | |
103 | + | let H = t(F) | |
104 | + | if ($isInstanceOf(H, "String")) | |
105 | + | then { | |
106 | + | let I = H | |
107 | + | let J = fromBase64String(E) | |
108 | + | let K = rsaVerify(SHA256, fromBase58String(I), J, d) | |
109 | + | let L = blockInfoByHeight((lastBlock.height - 1)) | |
110 | + | if ($isInstanceOf(L, "BlockInfo")) | |
111 | + | then { | |
112 | + | let M = L | |
113 | + | let B = sha256((take(J, 4) + take(M.generationSignature, 4))) | |
114 | + | if (!(K)) | |
115 | + | then throw("INVALID_RSA_SIGN") | |
116 | + | else { | |
117 | + | let N = (toInt(B) % 8) | |
118 | + | let C = b[N] | |
119 | + | if ((G == e)) | |
120 | + | then [IntegerEntry(p(F), f), IntegerEntry(o(F), C)] | |
121 | + | else [IntegerEntry(p(F), f), IntegerEntry(m(F), C)] | |
122 | + | } | |
123 | + | } | |
124 | + | else throw("Last block doesn't exist.") | |
125 | + | } | |
126 | + | else throw("SHA doesn't exist") | |
127 | + | } | |
128 | + | } | |
129 | + | else throw("Game does not exist or has already ended.") | |
130 | + | } | |
131 | + | ||
132 | + | ||
133 | + | @Verifier(O) | |
134 | + | func P () = { | |
135 | + | let z = O | |
136 | + | sigVerify(O.bodyBytes, O.proofs[0], O.senderPublicKey) | |
85 | 137 | } | |
86 | 138 |
github/deemru/w8io/169f3d6 46.21 ms ◑