Compare commits
2381
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f46fe4996b | ||
|
|
5e6e011fe2 | ||
|
|
f3969cdc25 | ||
|
|
4ff1d1dc8d | ||
|
|
df80c4cde2 | ||
|
|
06946a8fce | ||
|
|
23fccc6cb6 | ||
|
|
4a4ae9db66 | ||
|
|
7a4624bbd9 | ||
|
|
821836d939 | ||
|
|
d4239d66ce | ||
|
|
dc0ce8f11a | ||
|
|
4430a138b6 | ||
|
|
5794b22eb6 | ||
|
|
8dec6a1672 | ||
|
|
4d2765e5ba | ||
|
|
b06cba18f4 | ||
|
|
b7484121fc | ||
|
|
19d8f79a3d | ||
|
|
abbb74ca35 | ||
|
|
73566254bd | ||
|
|
2f48759457 | ||
|
|
0d8659e76f | ||
|
|
ac78c39c30 | ||
|
|
5d4c237e01 | ||
|
|
12d5d3465b | ||
|
|
711ef3b208 | ||
|
|
8be0b10d9d | ||
|
|
9dbc42fc54 | ||
|
|
e409ac8421 | ||
|
|
c2e37859b5 | ||
|
|
776f98d9f5 | ||
|
|
d45ee8dc54 | ||
|
|
885153fcfa | ||
|
|
d8ca0bff38 | ||
|
|
01dabf09db | ||
|
|
afc64ebc5e | ||
|
|
a48a1e31e9 | ||
|
|
bb381c201c | ||
|
|
07416e8c0c | ||
|
|
f269c0fb5d | ||
|
|
46f1f913c8 | ||
|
|
28395af03a | ||
|
|
d2906e2dc7 | ||
|
|
327760acff | ||
|
|
752b961483 | ||
|
|
ff2258ff7a | ||
|
|
4de06dcd32 | ||
|
|
fc313a1e7d | ||
|
|
6e231e720a | ||
|
|
ff9e706c65 | ||
|
|
766bdedd29 | ||
|
|
981a3485eb | ||
|
|
4443ac662f | ||
|
|
24da8bdb34 | ||
|
|
44979541be | ||
|
|
65b23b867c | ||
|
|
58ccfca831 | ||
|
|
30dd65b338 | ||
|
|
d91540ae1f | ||
|
|
8f4824d2b7 | ||
|
|
e75c2e4208 | ||
|
|
bb5f69328d | ||
|
|
db374db306 | ||
|
|
c00e0c9f48 | ||
|
|
63560c820b | ||
|
|
1b8d627af8 | ||
|
|
9d0f586ae7 | ||
|
|
86c5453254 | ||
|
|
4d7e6732fa | ||
|
|
7e99c62f6e | ||
|
|
65fa75fd01 | ||
|
|
258a3c8270 | ||
|
|
597ca9b073 | ||
|
|
c6968f8d61 | ||
|
|
76705b5762 | ||
|
|
8096f7135b | ||
|
|
5e890165e2 | ||
|
|
34f46d736f | ||
|
|
d77ac5ddcb | ||
|
|
0ce9ae4809 | ||
|
|
fd66db680f | ||
|
|
b5da33c013 | ||
|
|
22045b8f2d | ||
|
|
82a3578849 | ||
|
|
74567a16d1 | ||
|
|
0356163a2e | ||
|
|
6d45c37dc5 | ||
|
|
2dd67dc895 | ||
|
|
95e1c4909c | ||
|
|
e426d05bc8 | ||
|
|
f6add2f723 | ||
|
|
b6b3802bb7 | ||
|
|
b240031605 | ||
|
|
33039d2cec | ||
|
|
0314db7894 | ||
|
|
ef5c6c4c48 | ||
|
|
8a7ae61dae | ||
|
|
7dcef330e7 | ||
|
|
3636af4cd9 | ||
|
|
caa6dd9c41 | ||
|
|
a724a713da | ||
|
|
d5a3ddbf7e | ||
|
|
b40ab4bd44 | ||
|
|
7a95ed063d | ||
|
|
199a1d9e75 | ||
|
|
3120852eb9 | ||
|
|
24381411f2 | ||
|
|
06294351fa | ||
|
|
d3d5f92985 | ||
|
|
ca1247e0d9 | ||
|
|
a647390bef | ||
|
|
db869853c4 | ||
|
|
9d5e789d88 | ||
|
|
0b018e56cd | ||
|
|
7eae362c1e | ||
|
|
af428b6298 | ||
|
|
8bb7272bb1 | ||
|
|
0e73c69035 | ||
|
|
7b55de21bd | ||
|
|
a467e1ab31 | ||
|
|
3f8a41cfe8 | ||
|
|
a8580e234d | ||
|
|
938d2d9f5b | ||
|
|
c8af33f163 | ||
|
|
57133a8f66 | ||
|
|
43da108466 | ||
|
|
2b3a86eefb | ||
|
|
5f91072d4d | ||
|
|
5f24a814d2 | ||
|
|
3c4aa92413 | ||
|
|
d374b1ceea | ||
|
|
33648ac546 | ||
|
|
177212f06b | ||
|
|
7bcfb6d1f4 | ||
|
|
b06341031d | ||
|
|
7b41cdb656 | ||
|
|
2a3dcf6cbd | ||
|
|
f4a2e1cb77 | ||
|
|
252387768d | ||
|
|
eed1a098c6 | ||
|
|
2207ab3c93 | ||
|
|
97a3b6e06d | ||
|
|
093ff95580 | ||
|
|
c0aed3c4a2 | ||
|
|
d56980823b | ||
|
|
17274e72da | ||
|
|
3776ee3b62 | ||
|
|
fee480193e | ||
|
|
4c80e179ae | ||
|
|
720e95991c | ||
|
|
470dd8da3d | ||
|
|
a44f598cc2 | ||
|
|
7036e76e17 | ||
|
|
8121f379a3 | ||
|
|
7e21486103 | ||
|
|
b8589e8c51 | ||
|
|
311645b559 | ||
|
|
7e414ac390 | ||
|
|
486904bc92 | ||
|
|
a7c9a83091 | ||
|
|
81238b19ab | ||
|
|
58306a87f1 | ||
|
|
21b74deab4 | ||
|
|
6ef415744c | ||
|
|
92dd629f42 | ||
|
|
adfa766e1b | ||
|
|
991895c0f2 | ||
|
|
162e07fc95 | ||
|
|
e8325f9a98 | ||
|
|
27e3c0b89f | ||
|
|
51c6b64c91 | ||
|
|
6afa99d0a1 | ||
|
|
3556a4b07b | ||
|
|
dcb49dc8ee | ||
|
|
97a9921cdd | ||
|
|
748e535cc6 | ||
|
|
73a2b4152b | ||
|
|
afa36d3f62 | ||
|
|
b852f5e2fd | ||
|
|
75c279ab97 | ||
|
|
34d7135717 | ||
|
|
2e56237898 | ||
|
|
e65a5988e1 | ||
|
|
aea195aeb4 | ||
|
|
571a84b390 | ||
|
|
5a4b5ff97e | ||
|
|
4763104b99 | ||
|
|
7ce92f1422 | ||
|
|
9412753ba3 | ||
|
|
f7a979d825 | ||
|
|
d1c6ab7dc6 | ||
|
|
d7a2fdb5ba | ||
|
|
82e2c3538c | ||
|
|
59bebf8a35 | ||
|
|
eba270d1e2 | ||
|
|
1cf57ffe2d | ||
|
|
92bca485b6 | ||
|
|
d2c1962e34 | ||
|
|
9d994dac9e | ||
|
|
816ca59d6d | ||
|
|
f7603f6c13 | ||
|
|
7a2eb86dd5 | ||
|
|
b332db0a38 | ||
|
|
e3b3b0ca6c | ||
|
|
c8b4f5f0a3 | ||
|
|
8c6ffcf4d4 | ||
|
|
80cba5f176 | ||
|
|
99749e9b9b | ||
|
|
a1f912c71d | ||
|
|
4def0a53e0 | ||
|
|
51d0d5e549 | ||
|
|
b7db4cb280 | ||
|
|
36ffa09b05 | ||
|
|
0e58b3fbbc | ||
|
|
1da2d59066 | ||
|
|
a72879b2b2 | ||
|
|
2909a31e8f | ||
|
|
558eaf8b61 | ||
|
|
6a7895bf49 | ||
|
|
e73ec088d5 | ||
|
|
a0821506bc | ||
|
|
5df2af5189 | ||
|
|
649b0769ba | ||
|
|
fb569d4c2c | ||
|
|
3aac4b45ab | ||
|
|
857b0205a8 | ||
|
|
b5c88d5714 | ||
|
|
58900a7033 | ||
|
|
b75ebcac81 | ||
|
|
90c89288b6 | ||
|
|
f641139bf2 | ||
|
|
1096ead73e | ||
|
|
3d21d71231 | ||
|
|
b4e589a0f7 | ||
|
|
fce0813821 | ||
|
|
9fa81673da | ||
|
|
13d6211ed0 | ||
|
|
faedc12531 | ||
|
|
366ebe3155 | ||
|
|
87d5a3723f | ||
|
|
bd0c010be6 | ||
|
|
d38bdcebfd | ||
|
|
aac30cd840 | ||
|
|
c80783dbea | ||
|
|
fb7eb08624 | ||
|
|
941ef84b71 | ||
|
|
fd3ddc860e | ||
|
|
ab91ab100f | ||
|
|
3e85591c6c | ||
|
|
140f2099bd | ||
|
|
4f060b87bb | ||
|
|
14af4b27cd | ||
|
|
0b0913f2f3 | ||
|
|
7931414735 | ||
|
|
efbb63582e | ||
|
|
ee9ff563d2 | ||
|
|
e5553554d1 | ||
|
|
80ccd14447 | ||
|
|
0a0df61d77 | ||
|
|
f9c8cb044e | ||
|
|
4427986ac1 | ||
|
|
0f5f91c094 | ||
|
|
1aac945bf6 | ||
|
|
b6dc0d2002 | ||
|
|
28d8b4cd65 | ||
|
|
cef416e2b0 | ||
|
|
52ae215104 | ||
|
|
dcfbf7d0a6 | ||
|
|
a450e74954 | ||
|
|
0ccef4e5c0 | ||
|
|
efbc0ff12e | ||
|
|
d114d8fe7e | ||
|
|
e17ec37d10 | ||
|
|
fb5c24b2b5 | ||
|
|
17ca3a1ac9 | ||
|
|
b8aaec6c37 | ||
|
|
b67e6db527 | ||
|
|
2c6d025ab3 | ||
|
|
9038e83639 | ||
|
|
a0a1d371a2 | ||
|
|
925a385200 | ||
|
|
2a857275dd | ||
|
|
e5055c25b0 | ||
|
|
a896d88b51 | ||
|
|
04a0fddb95 | ||
|
|
113d49ae5b | ||
|
|
decfb32b2b | ||
|
|
52197cc912 | ||
|
|
5b5ea083ce | ||
|
|
db6efe6512 | ||
|
|
b77f2f09ab | ||
|
|
7bc6185077 | ||
|
|
c3198d7446 | ||
|
|
16dad6342c | ||
|
|
f1b1eb8b36 | ||
|
|
8b5bc45fcf | ||
|
|
ec5fde466a | ||
|
|
f2a652f29f | ||
|
|
bf29d41993 | ||
|
|
a994153e27 | ||
|
|
0fe91846cd | ||
|
|
5d9739a863 | ||
|
|
dd998d6b24 | ||
|
|
64b9b532c0 | ||
|
|
8a510e68e0 | ||
|
|
144906ff51 | ||
|
|
202cd41eee | ||
|
|
54e7fa8f70 | ||
|
|
b88ecb7896 | ||
|
|
6ecf9aaf49 | ||
|
|
74d94af034 | ||
|
|
c3e1d26ddf | ||
|
|
a59e1d5220 | ||
|
|
1631c6ac8d | ||
|
|
a2d331536b | ||
|
|
5534755f2d | ||
|
|
53fb6adfd6 | ||
|
|
394a7dbb34 | ||
|
|
fea7dfd212 | ||
|
|
12496e5631 | ||
|
|
9c2f8ee995 | ||
|
|
b0ebdb6882 | ||
|
|
9a295e58b0 | ||
|
|
4b99472b35 | ||
|
|
e170487faf | ||
|
|
f0ba0ebb64 | ||
|
|
c81a51af5b | ||
|
|
6c0a2feade | ||
|
|
668b24fb23 | ||
|
|
d3dfb5ca62 | ||
|
|
920fdfdf85 | ||
|
|
649bcad1bb | ||
|
|
71b21db0d9 | ||
|
|
51b645f8d0 | ||
|
|
4588523de7 | ||
|
|
4e57626e42 | ||
|
|
cfb5eac015 | ||
|
|
dbbcf4b2ee | ||
|
|
570773259a | ||
|
|
19f1ad2762 | ||
|
|
814c146626 | ||
|
|
9a2b83064b | ||
|
|
33bec58be4 | ||
|
|
852e864c83 | ||
|
|
6bd39ba137 | ||
|
|
fb2f78b6dd | ||
|
|
ad4bf73f7b | ||
|
|
2e53ef6348 | ||
|
|
544af751cb | ||
|
|
807610131a | ||
|
|
8142aaa9c8 | ||
|
|
4c7d9ad30e | ||
|
|
c484c38735 | ||
|
|
dd0c4a0a34 | ||
|
|
9aba7dc17a | ||
|
|
04fe9062a6 | ||
|
|
2316363f7a | ||
|
|
bd6e327864 | ||
|
|
4accfacbdd | ||
|
|
38f4a819f2 | ||
|
|
7422deaa0d | ||
|
|
42bf65ccb4 | ||
|
|
17e680ea3c | ||
|
|
745476c9ab | ||
|
|
9fba14b6b1 | ||
|
|
68b401a895 | ||
|
|
8975f0b753 | ||
|
|
0c9f697bf6 | ||
|
|
35c90d34d6 | ||
|
|
aa7b5c40b8 | ||
|
|
abaa53c6a3 | ||
|
|
ea57a1aec3 | ||
|
|
ab6aaf5013 | ||
|
|
bf2ac13609 | ||
|
|
03f2efd0f9 | ||
|
|
392d3d4b8a | ||
|
|
51aecb6b17 | ||
|
|
d2c0603717 | ||
|
|
3841e5444f | ||
|
|
80aa6d1d64 | ||
|
|
2dcaddf61d | ||
|
|
e51f3e9b15 | ||
|
|
2ef5a742e9 | ||
|
|
510f980348 | ||
|
|
73102e9432 | ||
|
|
1ec02c5c95 | ||
|
|
984b4c78cb | ||
|
|
e3e78f1dc9 | ||
|
|
bad41c247a | ||
|
|
e17d4f1a6e | ||
|
|
10500611ff | ||
|
|
efcdec6517 | ||
|
|
258df7691f | ||
|
|
7a35a735fa | ||
|
|
6c0f4cbd74 | ||
|
|
49cd428c43 | ||
|
|
f41435d285 | ||
|
|
4dedced175 | ||
|
|
a3bc65ba05 | ||
|
|
30615a4ed6 | ||
|
|
dbcf30470f | ||
|
|
198217d6bc | ||
|
|
7a4205ac36 | ||
|
|
2d3065ae8e | ||
|
|
d589443a5e | ||
|
|
fab7ea6ca1 | ||
|
|
7f6fbe22c6 | ||
|
|
59db4eeacd | ||
|
|
f2648adee8 | ||
|
|
ccdb447085 | ||
|
|
00b6d06041 | ||
|
|
b2610bed52 | ||
|
|
5854d72784 | ||
|
|
0f6cbf1be2 | ||
|
|
ea03e1b6e7 | ||
|
|
a2b996e054 | ||
|
|
16b7d4525f | ||
|
|
3e678f2abc | ||
|
|
1d0a524b88 | ||
|
|
8f1c23296e | ||
|
|
12656b05fe | ||
|
|
27d4d02fe5 | ||
|
|
d3e715594b | ||
|
|
285dfed338 | ||
|
|
6028d7ba18 | ||
|
|
2dd2edc1d3 | ||
|
|
4f259d8644 | ||
|
|
29a82cdf0f | ||
|
|
6a90d32885 | ||
|
|
75c744a438 | ||
|
|
6b56b7710d | ||
|
|
39c709f7b3 | ||
|
|
3f063f7cd7 | ||
|
|
45cbbe6c7a | ||
|
|
30fe2c7c69 | ||
|
|
7ecc00090e | ||
|
|
a2475bca94 | ||
|
|
be1614a042 | ||
|
|
ec01036871 | ||
|
|
1bb698619c | ||
|
|
fa93c23813 | ||
|
|
7150243cda | ||
|
|
86b4aeef1a | ||
|
|
21efd481d8 | ||
|
|
11ac325d1a | ||
|
|
3879c80e6f | ||
|
|
b1e1d2d205 | ||
|
|
abeb4fadc4 | ||
|
|
2ed92c222d | ||
|
|
3c4a83916b | ||
|
|
9f2f9154d2 | ||
|
|
0d92c746bd | ||
|
|
a16c54051c | ||
|
|
2bbd1fbbb6 | ||
|
|
f427c2b566 | ||
|
|
77fbc60cb8 | ||
|
|
61f29a84b5 | ||
|
|
03fd703db5 | ||
|
|
3177f63a17 | ||
|
|
d108565ea2 | ||
|
|
7486227c27 | ||
|
|
7b959ab39c | ||
|
|
a652ffcb62 | ||
|
|
4d20011b78 | ||
|
|
98482a2795 | ||
|
|
e6b0ee7e4a | ||
|
|
8ff55c027e | ||
|
|
948a963f15 | ||
|
|
e73a038fe8 | ||
|
|
b765112896 | ||
|
|
94063ea4d1 | ||
|
|
a085eb1593 | ||
|
|
37e1ac5d93 | ||
|
|
1ee9516887 | ||
|
|
63b03a48d0 | ||
|
|
5e12916aec | ||
|
|
753a0e5408 | ||
|
|
83bce7c94f | ||
|
|
2ec34e2c46 | ||
|
|
6a76bbb6e3 | ||
|
|
c61267cadc | ||
|
|
e167891207 | ||
|
|
8cded9f8d2 | ||
|
|
778768dbf7 | ||
|
|
db749b8fc7 | ||
|
|
01e616f29e | ||
|
|
1996694a2a | ||
|
|
5e56af33df | ||
|
|
3c580403c1 | ||
|
|
b0d917d542 | ||
|
|
cc302dd68b | ||
|
|
37044ed3c3 | ||
|
|
ece8f25511 | ||
|
|
f1381ad535 | ||
|
|
1588dd3dbe | ||
|
|
e06e3a0654 | ||
|
|
80fccba93f | ||
|
|
7aa6663127 | ||
|
|
54ed1f12ff | ||
|
|
37e9fe90ae | ||
|
|
ec1b2b959a | ||
|
|
bc4ae8d383 | ||
|
|
088d231cda | ||
|
|
d30ace0518 | ||
|
|
6302771ff5 | ||
|
|
15f45d5d9e | ||
|
|
038686bea2 | ||
|
|
a83f120f32 | ||
|
|
0f05232199 | ||
|
|
1c13a591e9 | ||
|
|
75f9b7d040 | ||
|
|
ada32395ca | ||
|
|
b0fa75f13e | ||
|
|
9848e0467e | ||
|
|
4f5fea848c | ||
|
|
c98093be03 | ||
|
|
83a7d6e297 | ||
|
|
d84479bb05 | ||
|
|
a32db5ff69 | ||
|
|
030b40b2a0 | ||
|
|
4d5f60cd38 | ||
|
|
17adcb77c3 | ||
|
|
81e056be1a | ||
|
|
25babace8f | ||
|
|
0e7cf61888 | ||
|
|
cb8e2836bb | ||
|
|
e321761a72 | ||
|
|
554dd2f1ee | ||
|
|
8d6aa2477c | ||
|
|
8345877e27 | ||
|
|
9339267e6e | ||
|
|
da2bb41aa3 | ||
|
|
2ee8c4692a | ||
|
|
42d667e585 | ||
|
|
df2824ccac | ||
|
|
c2e3832643 | ||
|
|
3516c7674b | ||
|
|
b78cbcbb99 | ||
|
|
bd4dc217af | ||
|
|
662fc37976 | ||
|
|
89499bfd40 | ||
|
|
4c6fb2198b | ||
|
|
66d763ebc5 | ||
|
|
4823322154 | ||
|
|
b217eec84d | ||
|
|
d75f77b4c5 | ||
|
|
693f230fbb | ||
|
|
21d6020179 | ||
|
|
3fc1346d5b | ||
|
|
58c7c514c6 | ||
|
|
cf0997b434 | ||
|
|
8066833b3a | ||
|
|
ea82f554be | ||
|
|
e0d92a13a7 | ||
|
|
6a268cfb63 | ||
|
|
23eaee49d4 | ||
|
|
fc2a6a82cb | ||
|
|
2673ec3c82 | ||
|
|
f671a3c81c | ||
|
|
1ab53051f7 | ||
|
|
91d0e41444 | ||
|
|
e0931f8f90 | ||
|
|
d16b2902d4 | ||
|
|
a5043f45d3 | ||
|
|
6bf3a21158 | ||
|
|
0cf3a5e704 | ||
|
|
5dc56841ea | ||
|
|
725f22a344 | ||
|
|
ad457202dd | ||
|
|
424824019b | ||
|
|
3e30e7a9ec | ||
|
|
bca48dd1eb | ||
|
|
6851b6a523 | ||
|
|
3d9c5e7bae | ||
|
|
03b419e3d4 | ||
|
|
f291572b4a | ||
|
|
9b071bc96b | ||
|
|
e1c00bdbba | ||
|
|
b46258d0bf | ||
|
|
ffc1c33be0 | ||
|
|
f05437d253 | ||
|
|
0c33eab20a | ||
|
|
3e009013df | ||
|
|
8ce0b984b7 | ||
|
|
fe1e0974cb | ||
|
|
75f4810af1 | ||
|
|
3d207de6aa | ||
|
|
a6a2f0dbae | ||
|
|
b8c4fbaff0 | ||
|
|
abf2140ecf | ||
|
|
12ca08d9a6 | ||
|
|
e200df4def | ||
|
|
f88fc0719f | ||
|
|
818b3b8daf | ||
|
|
7060150bdc | ||
|
|
0a35e9659b | ||
|
|
87397eaffa | ||
|
|
245be406d9 | ||
|
|
90fced7cb2 | ||
|
|
d29a244064 | ||
|
|
ccb20d56ab | ||
|
|
8d62cb22f9 | ||
|
|
c6bd9bc9e0 | ||
|
|
3adafea574 | ||
|
|
9060c474da | ||
|
|
a38e63998e | ||
|
|
28101be1b7 | ||
|
|
7d5c7f5fec | ||
|
|
ed63798082 | ||
|
|
05c5e18899 | ||
|
|
0c17d78356 | ||
|
|
fa97016573 | ||
|
|
37d41f3f83 | ||
|
|
5d87fc8278 | ||
|
|
27465e5faf | ||
|
|
99b879d014 | ||
|
|
dcbfca53d9 | ||
|
|
5f2ef98de6 | ||
|
|
070aca2b65 | ||
|
|
dc5f865d54 | ||
|
|
45ceb5d297 | ||
|
|
a8dace0f23 | ||
|
|
b8e7262b14 | ||
|
|
b334b2055f | ||
|
|
ad14d71978 | ||
|
|
9701b11641 | ||
|
|
965b1cf03c | ||
|
|
1286d76988 | ||
|
|
6491becbe1 | ||
|
|
13fc5b688f | ||
|
|
beb70a3db1 | ||
|
|
482e13706f | ||
|
|
e0326d9d39 | ||
|
|
af72e6f6ac | ||
|
|
6518122a2d | ||
|
|
395cdd721e | ||
|
|
d060df2fb9 | ||
|
|
60193a2ddd | ||
|
|
7edfe9d759 | ||
|
|
a9c1caa188 | ||
|
|
eacf3f1830 | ||
|
|
67805fd25a | ||
|
|
62326b243f | ||
|
|
a0771b12eb | ||
|
|
d6da796bf2 | ||
|
|
a64744f213 | ||
|
|
6efe08dd61 | ||
|
|
98d6d4eb17 | ||
|
|
c93717bf77 | ||
|
|
8f625e847b | ||
|
|
17ef4888e4 | ||
|
|
916b8001b4 | ||
|
|
daf90ff402 | ||
|
|
10acef2845 | ||
|
|
a0994ac4b4 | ||
|
|
e55d6c8d65 | ||
|
|
8c58ecc897 | ||
|
|
19e188da9f | ||
|
|
3e6e02dc7d | ||
|
|
c08fc2bdf7 | ||
|
|
f572852d06 | ||
|
|
db9c516429 | ||
|
|
4fb9e2fd6a | ||
|
|
0f6003fd68 | ||
|
|
17d220524c | ||
|
|
98a9c8310b | ||
|
|
7cfb2529ac | ||
|
|
e8f326681a | ||
|
|
df0cf91548 | ||
|
|
35ddf9e8f0 | ||
|
|
e73dc3eb74 | ||
|
|
8f6c569391 | ||
|
|
178e146599 | ||
|
|
5740f17037 | ||
|
|
c45df789ea | ||
|
|
4500c02e49 | ||
|
|
36b4c8a9e9 | ||
|
|
038404ef31 | ||
|
|
c3be4f2f15 | ||
|
|
aa0d47078f | ||
|
|
c82dccc76c | ||
|
|
7586710395 | ||
|
|
a9cd76907e | ||
|
|
fc6721cff7 | ||
|
|
a0b25b9136 | ||
|
|
0cc63f6896 | ||
|
|
291deaa017 | ||
|
|
2ad9301a6e | ||
|
|
c6829a9d0e | ||
|
|
8842b21ec9 | ||
|
|
e84dad0967 | ||
|
|
7aed7d3fd0 | ||
|
|
38dc034499 | ||
|
|
1c2446da16 | ||
|
|
128bdc63db | ||
|
|
34f376eb23 | ||
|
|
b38d203e83 | ||
|
|
358964d2c8 | ||
|
|
ee6af9de61 | ||
|
|
8864782750 | ||
|
|
58cd226d6b | ||
|
|
7acdb49074 | ||
|
|
2a73e1c2e1 | ||
|
|
8daf22c3ff | ||
|
|
c0c8ad5510 | ||
|
|
4682e8f326 | ||
|
|
f03c7a8880 | ||
|
|
926e2b04b7 | ||
|
|
46746f3495 | ||
|
|
74b33bd4a2 | ||
|
|
4fd81e0c58 | ||
|
|
65ac5669a9 | ||
|
|
e9f665214a | ||
|
|
7eca3e4853 | ||
|
|
a21bba8ac2 | ||
|
|
9fed750f9d | ||
|
|
7d1bd1d5ab | ||
|
|
579b15330a | ||
|
|
807a60b4e4 | ||
|
|
dd12cad1ef | ||
|
|
c6d279c853 | ||
|
|
d9261b6e2f | ||
|
|
ddd5ff9c42 | ||
|
|
238243cc1d | ||
|
|
53015dc3ee | ||
|
|
804bef72c9 | ||
|
|
c8a692046f | ||
|
|
68e20cebd7 | ||
|
|
640f0dc8b6 | ||
|
|
c8156d0f46 | ||
|
|
9d967b084a | ||
|
|
4f199ada40 | ||
|
|
e695be1cba | ||
|
|
fff58e1368 | ||
|
|
550eef131c | ||
|
|
439b4c6e22 | ||
|
|
da574bd842 | ||
|
|
20e32f2de7 | ||
|
|
bfe3f72c45 | ||
|
|
fdb330eb58 | ||
|
|
6d53d0d533 | ||
|
|
d1fa22244f | ||
|
|
93b9f1a24f | ||
|
|
50f26e9721 | ||
|
|
57bf1c7a89 | ||
|
|
972e68a8c1 | ||
|
|
7632f9bbba | ||
|
|
c5ed5dd254 | ||
|
|
a1efd20e81 | ||
|
|
1ea57740aa | ||
|
|
8802de59d4 | ||
|
|
21c93f1dc1 | ||
|
|
2a9069200d | ||
|
|
b08b63d4ab | ||
|
|
1ce3ef0416 | ||
|
|
63d4c10b9e | ||
|
|
2c56687527 | ||
|
|
6601d9031d | ||
|
|
522e96f016 | ||
|
|
2335bed58a | ||
|
|
eaccb571a5 | ||
|
|
196b41d5f6 | ||
|
|
b4294ff531 | ||
|
|
e194cbc715 | ||
|
|
1e845c61a2 | ||
|
|
60dbd59aa0 | ||
|
|
66f5ee4ae9 | ||
|
|
178aaf6ac4 | ||
|
|
91a6eabab5 | ||
|
|
5518e64574 | ||
|
|
9463dc4a99 | ||
|
|
1dfd08a0dd | ||
|
|
901bb153d0 | ||
|
|
1724d1666e | ||
|
|
85592ad39e | ||
|
|
5541694922 | ||
|
|
f2ab452eb8 | ||
|
|
4dee0ba7fb | ||
|
|
2f03bf9372 | ||
|
|
58587a7956 | ||
|
|
a08b557938 | ||
|
|
ca5cab4c43 | ||
|
|
5569c3971b | ||
|
|
6f66ef595e | ||
|
|
a7374a9019 | ||
|
|
a0c58b5582 | ||
|
|
7dcaa97f8b | ||
|
|
70db738bff | ||
|
|
5133b9da94 | ||
|
|
a522aa3baa | ||
|
|
9298023f33 | ||
|
|
061e8cca1f | ||
|
|
ee54a7f3f5 | ||
|
|
0934cf034d | ||
|
|
fcefc87840 | ||
|
|
72baa3d916 | ||
|
|
14d921f64f | ||
|
|
2a95648625 | ||
|
|
2d3f1e0365 | ||
|
|
51d2a883f0 | ||
|
|
d35818293a | ||
|
|
7383a761f6 | ||
|
|
39ae4b04be | ||
|
|
b49c455df0 | ||
|
|
34576d0c64 | ||
|
|
b60aeccfdc | ||
|
|
e715384173 | ||
|
|
67023886c8 | ||
|
|
00a73fd88f | ||
|
|
72f42505b9 | ||
|
|
3b283681a9 | ||
|
|
6b0f1116ce | ||
|
|
f8121c8f1c | ||
|
|
f8dee0983a | ||
|
|
a8436074a6 | ||
|
|
fc82aab74b | ||
|
|
b6eb7fcd96 | ||
|
|
2a3989e4bd | ||
|
|
5372ab907f | ||
|
|
e0c09c0396 | ||
|
|
86031b117f | ||
|
|
f6fbd719d0 | ||
|
|
3a11f22138 | ||
|
|
b4714c6f3e | ||
|
|
51d77d408b | ||
|
|
859cdca4f7 | ||
|
|
cb10108c8e | ||
|
|
a6c7696274 | ||
|
|
cc86117289 | ||
|
|
125dcca829 | ||
|
|
1045dce1ea | ||
|
|
32615ecbd3 | ||
|
|
2e23e40240 | ||
|
|
77cdf26223 | ||
|
|
eadf8b680c | ||
|
|
427fbdb8a9 | ||
|
|
84bad8a79a | ||
|
|
75443681ba | ||
|
|
0731fe2637 | ||
|
|
3421e6a127 | ||
|
|
2de9c4365b | ||
|
|
35a37bacdf | ||
|
|
e25728cb68 | ||
|
+6 |
cdf3812e40 | ||
|
|
574b684396 | ||
|
|
bb800fd78d | ||
|
|
9b7c506de0 | ||
|
|
12c23d7d60 | ||
|
|
22231dc34f | ||
|
|
708618d11c | ||
|
|
46a50960d3 | ||
|
|
6de2aca8ae | ||
|
|
2c839924c6 | ||
|
|
287d410fe8 | ||
|
|
014d95454b | ||
|
|
923d4128bb | ||
|
|
787470c2b4 | ||
|
|
3ef32395f3 | ||
|
|
7a509cf0d8 | ||
|
|
105a1259bc | ||
|
|
c61edd1d6d | ||
|
|
008d04fd57 | ||
|
|
1c7db7c782 | ||
|
|
08ae1391ad | ||
|
|
06b40bcedb | ||
|
|
892819aeec | ||
|
|
e78dbd2535 | ||
|
|
3320754a62 | ||
|
|
1bfbe447db | ||
|
|
8512bbc45b | ||
|
|
593255570b | ||
|
|
93b3da98e8 | ||
|
|
d520dbbc4b | ||
|
|
1e0c78098c | ||
|
|
6c0ddd4ec9 | ||
|
|
73d6c7b28a | ||
|
|
4aafd42462 | ||
|
|
e60199a823 | ||
|
|
8ef17332ba | ||
|
|
a71816279d | ||
|
|
8f4c4268ba | ||
|
|
6b8d4b4de2 | ||
|
|
a8c33de80b | ||
|
|
ac38c9776c | ||
|
|
c73a0b5265 | ||
|
|
12a06defd1 | ||
|
|
0ebdbed30b | ||
|
|
9a46682d9d | ||
|
|
3456d90e0d | ||
|
|
95501b77dd | ||
|
|
1046b3014f | ||
|
|
06584bbb78 | ||
|
|
38c3ab20e8 | ||
|
|
fd1e0ad7a3 | ||
|
|
3bae3a3bea | ||
|
|
f9404aa55e | ||
|
|
7c448afda8 | ||
|
|
8519bc21f9 | ||
|
|
a02c783f0e | ||
|
|
fea879088c | ||
|
|
45667b7391 | ||
|
|
cb49edf29d | ||
|
|
72c04caae9 | ||
|
|
370c8adec9 | ||
|
|
f05d3d8836 | ||
|
|
402173ea16 | ||
|
|
a4a4e04c5e | ||
|
|
77b235df90 | ||
|
|
06393da4ff | ||
|
|
ccd08c2d55 | ||
|
|
c7ec974ff0 | ||
|
|
f8195deb54 | ||
|
|
048ccc71bb | ||
|
|
37752d1d48 | ||
|
|
3de006364e | ||
|
|
0881a01433 | ||
|
|
920d0c9e0a | ||
|
|
472eaaa1cc | ||
|
|
273184b084 | ||
|
|
f4b4a63217 | ||
|
|
6b14b0536e | ||
|
|
f3b5c76709 | ||
|
|
4f9119f211 | ||
|
|
d8570576af | ||
|
|
e8aa95c1d3 | ||
|
|
bc6afa9d59 | ||
|
|
19a88e2735 | ||
|
|
460c91b93f | ||
|
|
7029364f4d | ||
|
|
83554afebc | ||
|
|
c6f69946be | ||
|
|
f8e215c817 | ||
|
|
a4d93d7088 | ||
|
|
0f9d198dbd | ||
|
|
a5851a1763 | ||
|
|
cf6593ff50 | ||
|
|
7c916c10cf | ||
|
|
f532825fe0 | ||
|
|
5c8a02f92a | ||
|
|
a22518d96d | ||
|
|
a469840290 | ||
|
|
f60f02c1ac | ||
|
|
f44bd27f7b | ||
|
|
a18b3583be | ||
|
|
f4ffff7334 | ||
|
|
c7efaaad7e | ||
|
|
9505ac88ba | ||
|
|
8a92e8ea70 | ||
|
|
b8b3b5d48b | ||
|
|
08382c6f48 | ||
|
|
60c9832429 | ||
|
|
4411fd7f81 | ||
|
|
7ed79fece6 | ||
|
|
336a0e5b85 | ||
|
|
9d3e50f140 | ||
|
|
6faa901914 | ||
|
|
bb5cb19607 | ||
|
|
e7aa7cb04f | ||
|
|
7073b33d9b | ||
|
|
2bdae2f444 | ||
|
|
5ff6654c2b | ||
|
|
2b396b5c0a | ||
|
|
d9c13f19b0 | ||
|
|
448b9424e9 | ||
|
|
28e61691d8 | ||
|
|
de62a7d1e1 | ||
|
|
d55100b6a8 | ||
|
|
1f3c23dc87 | ||
|
|
cfb4e62503 | ||
|
|
3d3bce6702 | ||
|
|
62f126daff | ||
|
|
d916253cb5 | ||
|
|
c96608cd33 | ||
|
|
8baa48256a | ||
|
|
a452ab7157 | ||
|
|
f14eda4468 | ||
|
|
c2629b0a96 | ||
|
|
20f27af97e | ||
|
|
6388eca129 | ||
|
|
669c76ef6e | ||
|
|
156ba420c3 | ||
|
|
5f4ccfd790 | ||
|
|
4ae498a72e | ||
|
|
28b4ebd52b | ||
|
|
92f3a7b050 | ||
|
|
c9f1b18264 | ||
|
|
bc7c190db0 | ||
|
|
cbc61a274f | ||
|
|
4b2ff01a55 | ||
|
|
d71f5a7d12 | ||
|
|
7ea690d4be | ||
|
|
503bdb5c34 | ||
|
|
1dee884358 | ||
|
|
6ae7cdab64 | ||
|
|
22ca06f6a1 | ||
|
|
425d8a7fcf | ||
|
|
dbb52ec5b4 | ||
|
|
d2a2fbb858 | ||
|
|
54cb97af3f | ||
|
|
160bcd64a6 | ||
|
|
830c3e49d9 | ||
|
|
4aa24c2190 | ||
|
|
d574eda147 | ||
|
|
f8f07dbc70 | ||
|
|
1dcae9aafd | ||
|
|
0b1cc40fb4 | ||
|
|
806b9a5521 | ||
|
|
1d5ccab004 | ||
|
|
88d59f6a5f | ||
|
|
36b9fe6386 | ||
|
|
bd28a4bca4 | ||
|
|
87e384e7fd | ||
|
|
a8b406e7b7 | ||
|
|
6ca975e83a | ||
|
|
754f294992 | ||
|
|
886a28640f | ||
|
|
69ac84088a | ||
|
|
518e666015 | ||
|
|
596307b32a | ||
|
|
bc22bb1b89 | ||
|
|
720451c89e | ||
|
|
d615b1c806 | ||
|
|
0c305ed957 | ||
|
|
3497b53b88 | ||
|
|
442132be70 | ||
|
|
96bb03e1e0 | ||
|
|
a264893543 | ||
|
|
8c566c3bda | ||
|
|
855c35cb88 | ||
|
|
ab611199fd | ||
|
|
1ddbb417f1 | ||
|
|
1a9e8ac35d | ||
|
|
8960c11f86 | ||
|
|
93d12e1642 | ||
|
|
9720ce68f2 | ||
|
|
ae4010ffb6 | ||
|
|
f3830b60ae | ||
|
|
e1926a06e8 | ||
|
|
ccf1ba2b8a | ||
|
|
3b33f65408 | ||
|
|
64059ca87e | ||
|
|
8574fa1350 | ||
|
|
2e769f1f0a | ||
|
|
59431631aa | ||
|
|
a56c7aca17 | ||
|
|
d674c02c43 | ||
|
|
4892e25800 | ||
|
|
a5d773da9f | ||
|
|
466f0c583f | ||
|
|
f95e6602a0 | ||
|
|
33a176eae4 | ||
|
|
e89af899a3 | ||
|
|
da3892f902 | ||
|
|
9416ceb7de | ||
|
|
2cbc29ea09 | ||
|
|
0b30261e5c | ||
|
|
ea4b57854b | ||
|
|
5c656133e2 | ||
|
|
1a5e38ecf9 | ||
|
|
887f00856e | ||
|
|
b08130a6af | ||
|
|
2871377cee | ||
|
|
ab2580963c | ||
|
|
903242a2a7 | ||
|
|
2f8cdb4c4b | ||
|
|
29623a1959 | ||
|
|
b135f7dbce | ||
|
|
4936b7e1ae | ||
|
|
401c655d8c | ||
|
|
958fc69906 | ||
|
|
7722155db1 | ||
|
|
5ad27f56b1 | ||
|
|
0635c1c3b5 | ||
|
|
3b9b688c97 | ||
|
|
36183c72d1 | ||
|
|
1234647b9d | ||
|
|
c46bf475f7 | ||
|
|
4854bef927 | ||
|
|
f0bf3408bc | ||
|
|
2fd0cb4aff | ||
|
|
6da93cf921 | ||
|
|
bf17d61686 | ||
|
|
f4cc5541e4 | ||
|
|
616790bfa0 | ||
|
|
485d161a5e | ||
|
|
372f8274ae | ||
|
|
a10c014ba6 | ||
|
|
7661c1526b | ||
|
|
cdb4e7bc95 | ||
|
|
0026ad8c09 | ||
|
|
3bb12f4417 | ||
|
|
3a6d37c6a2 | ||
|
|
129531b03e | ||
|
|
5a3b6becf4 | ||
|
|
266492fa1c | ||
|
|
8504401d69 | ||
|
|
1ba2f23efc | ||
|
|
cfceafb576 | ||
|
|
05f983dc10 | ||
|
|
1afc32f650 | ||
|
|
067f08f092 | ||
|
|
9d26ba5636 | ||
|
|
56259c40fc | ||
|
|
2b82a46b02 | ||
|
|
84a1bda771 | ||
|
|
4e9322c1e5 | ||
|
|
e14f0c361f | ||
|
|
43315670fa | ||
|
|
f864c499a3 | ||
|
|
83acf590f8 | ||
|
|
dbe5278afa | ||
|
|
b624704ecd | ||
|
|
6b77b949d7 | ||
|
|
c726e4e86a | ||
|
|
35bcbdc9d0 | ||
|
|
d506d6755d | ||
|
|
b491734ec4 | ||
|
|
8577272164 | ||
|
|
cf56f246b9 | ||
|
|
d9cd19632e | ||
|
|
b747806842 | ||
|
|
ec19e2949e | ||
|
|
70d10ab003 | ||
|
|
be6e586661 | ||
|
|
e1a4cf02f4 | ||
|
|
25edb23c3f | ||
|
|
075216d9da | ||
|
|
f8754d91f7 | ||
|
|
3155b345c1 | ||
|
|
94e4f1baa5 | ||
|
|
a4c999a098 | ||
|
|
9a9e00085e | ||
|
|
cdf169ed83 | ||
|
|
1791db57f6 | ||
|
|
0236952955 | ||
|
|
11633ff1f7 | ||
|
|
65a91f38e0 | ||
|
|
adc62bd732 | ||
|
|
f681a350fc | ||
|
|
d886b46139 | ||
|
|
a58f1284b4 | ||
|
|
159528e7ae | ||
|
|
6443e72ad7 | ||
|
|
eccea8c7e2 | ||
|
|
12ad791917 | ||
|
|
38fe5b7eff | ||
|
|
c2e469095c | ||
|
|
76baeb3214 | ||
|
|
6abf7384e2 | ||
|
|
c3223f446e | ||
|
|
7b5e8d1e96 | ||
|
|
e8d769a574 | ||
|
|
275d9c1553 | ||
|
|
30acef6c75 | ||
|
|
15afe384ff | ||
|
|
32efd0fbc2 | ||
|
|
b1045c39ed | ||
|
|
61ac270876 | ||
|
|
c182e6d3f1 | ||
|
|
1053310511 | ||
|
|
6c38e0e9cc | ||
|
|
17a130d13d | ||
|
|
dfbf4d0f43 | ||
|
|
0a4efd4820 | ||
|
|
ac8ab3ef9e | ||
|
|
57c31a79e7 | ||
|
|
33bf148fcf | ||
|
|
a0422f6467 | ||
|
|
1597e85906 | ||
|
|
5a458a60c2 | ||
|
|
5881edb75e | ||
|
|
e68b8e96c7 | ||
|
|
c32b8af65f | ||
|
|
d82b2a5804 | ||
|
|
285cc66773 | ||
|
|
8d090ba6b8 | ||
|
|
6455e759e3 | ||
|
|
8ba4355cab | ||
|
|
baa107278d | ||
|
|
c0fce07889 | ||
|
|
8e79238284 | ||
|
|
bc879c5bd8 | ||
|
|
949aa26f52 | ||
|
|
03aabc3fc6 | ||
|
|
68c9db0c82 | ||
|
|
f1493fbee7 | ||
|
|
1f70ced8e5 | ||
|
|
e6e50ee9f7 | ||
|
|
f04aca767f | ||
|
|
d2b7c3889b | ||
|
|
b55e121642 | ||
|
|
e737c1e960 | ||
|
|
e4fe47d598 | ||
|
|
6770cc69d5 | ||
|
|
9f85d3dca7 | ||
|
|
8fd3875069 | ||
|
|
40278cd3c1 | ||
|
|
a435aeb991 | ||
|
|
1f9c04b3f4 | ||
|
|
2bc070a7d8 | ||
|
|
4a91d9dcba | ||
|
|
db6532c9d7 | ||
|
|
fa596eee5b | ||
|
|
355a08cd04 | ||
|
|
ca3b7c3bcf | ||
|
|
9fb818babf | ||
|
|
2e04575654 | ||
|
|
ea9a8303c8 | ||
|
|
d6f73c1a81 | ||
|
|
dc6c2b68fe | ||
|
|
87e5549af5 | ||
|
|
0bba2bd1ba | ||
|
|
7512f82a8d | ||
|
|
211712bf6d | ||
|
|
4ae2d400d1 | ||
|
|
985a4bd730 | ||
|
|
2520b16445 | ||
|
|
4c49a4bf67 | ||
|
|
724a7e1ebb | ||
|
|
6b4661be92 | ||
|
|
0a555eda90 | ||
|
|
1b437c8b90 | ||
|
|
0b85c1573e | ||
|
|
729952eb88 | ||
|
|
34d78093e8 | ||
|
|
8864d71e7a | ||
|
|
7b443f5b75 | ||
|
|
04d3d79ecc | ||
|
|
1968498794 | ||
|
|
d9df433e98 | ||
|
|
176275267b | ||
|
|
2651a38f89 | ||
|
|
70dc920f8c | ||
|
|
2fabffe481 | ||
|
|
e78d1306ee | ||
|
|
610a3eee5d | ||
|
|
b472de1bcd | ||
|
|
64de59ab44 | ||
|
|
0bf439ff94 | ||
|
|
87c25e211c | ||
|
|
c117611267 | ||
|
|
af29d2d5be | ||
|
|
0d2d0be8e4 | ||
|
|
6067968c07 | ||
|
|
0bb7996a4c | ||
|
|
0b9b89bf2b | ||
|
|
f5b027eda3 | ||
|
|
0f92bced9d | ||
|
|
56d60fbbd4 | ||
|
|
e56d4b06df | ||
|
|
cc1e00b1c4 | ||
|
|
e4ce056ac6 | ||
|
|
a344142581 | ||
|
|
03a7caf1e6 | ||
|
|
b8901ff5fd | ||
|
|
c474aeee5e | ||
|
|
ec667d49f4 | ||
|
|
93c2e02235 | ||
|
|
fb90ba1fd1 | ||
|
|
93698b6a83 | ||
|
|
96f5697848 | ||
|
|
ff5c576a4d | ||
|
|
8586ea5d78 | ||
|
|
2ae22e11ae | ||
|
|
0fd73272ea | ||
|
|
d48b6a0535 | ||
|
|
81d4342d97 | ||
|
|
a0320d0101 | ||
|
|
5df2d9a4f6 | ||
|
|
ccf2fe66c0 | ||
|
|
96035005b8 | ||
|
|
60c79c7d4e | ||
|
|
716b981dc5 | ||
|
|
c82b4a13a1 | ||
|
|
71a84bb092 | ||
|
|
46cd0809e1 | ||
|
|
348494d7c8 | ||
|
|
9c500e119c | ||
|
|
5386bc2625 | ||
|
|
ea629e1b2a | ||
|
|
0ae02be001 | ||
|
|
4f513692f9 | ||
|
|
e61b9b2a65 | ||
|
|
a38d32562e | ||
|
|
85960256ca | ||
|
|
e71d05ba66 | ||
|
|
a780756eac | ||
|
|
ce91e4261d | ||
|
|
e63d5e184c | ||
|
|
f809dbdd6a | ||
|
|
ba2e665fc2 | ||
|
|
2ff679c679 | ||
|
|
7a71ce48f4 | ||
|
|
303297ae85 | ||
|
|
23007b0b3b | ||
|
|
b90451792d | ||
|
|
d441425618 | ||
|
|
61ffbbc42d | ||
|
|
19964df99a | ||
|
|
7de8d32ab8 | ||
|
|
a536f533d8 | ||
|
|
12153055b4 | ||
|
|
5b4ec7dbea | ||
|
|
1f93d8594e | ||
|
|
ec9d2d1102 | ||
|
|
0ff0f4d0e4 | ||
|
|
21afb3f5ea | ||
|
|
04b52cc25d | ||
|
|
33805a14b9 | ||
|
|
d98b100595 | ||
|
|
c7ac44d3bb | ||
|
|
22fbb3704c | ||
|
|
233f28696d | ||
|
|
0af570ac46 | ||
|
|
49552c2c0a | ||
|
|
084e3414f0 | ||
|
|
cd180f1325 | ||
|
|
1ab39a40da | ||
|
|
32385a97cd | ||
|
|
7c2dcc8db6 | ||
|
|
5a1f8d8f28 | ||
|
|
314fb31886 | ||
|
|
8134d2f05b | ||
|
|
41bf2a0297 | ||
|
|
d5177a394a | ||
|
|
b5f95b7837 | ||
|
|
0376b7b3e6 | ||
|
|
28035525f4 | ||
|
|
2e577e3338 | ||
|
|
28b80a291f | ||
|
|
2735e81aaa | ||
|
|
62fedfbce3 | ||
|
|
cde4b804e3 | ||
|
+3 |
bd10bdf99a | ||
|
|
04f0af5865 | ||
|
|
22f3fbb9a3 | ||
|
|
c0925ffb92 | ||
|
|
945122190e | ||
|
|
bcdfc17e2a | ||
|
|
98210ec6e0 | ||
|
|
7ef997330f | ||
|
|
10357112e5 | ||
|
|
ade75af765 | ||
|
|
c31662d92a | ||
|
|
48ea46990e | ||
|
|
4b11b453be | ||
|
|
73655eda3c | ||
|
|
e2ddc9745c | ||
|
|
bf1fcf88b1 | ||
|
|
32839f6919 | ||
|
|
0d9c474a59 | ||
|
|
0e8dd9efc5 | ||
|
|
907c201912 | ||
|
|
4313917e4c | ||
|
|
7e759547bc | ||
|
|
f22762d94d | ||
|
|
43e2a2b451 | ||
|
|
28ec43cdea | ||
|
|
273ac513fc | ||
|
|
30050a6cb2 | ||
|
|
40b8e9562e | ||
|
|
846aea57c5 | ||
|
|
f4341330b9 | ||
|
|
7cc2c5ce71 | ||
|
|
476a9331f8 | ||
|
|
5249a35212 | ||
|
|
6f51ec24ae | ||
|
|
c75d0c4bd1 | ||
|
|
0e07fa94d0 | ||
|
|
b95d1a6323 | ||
|
|
f14a25a59b | ||
|
|
fd593186fa | ||
|
|
ab1eeeba24 | ||
|
|
a66619f919 | ||
|
|
800d9de4d5 | ||
|
|
95af40543a | ||
|
|
e476c1ab17 | ||
|
|
51e92c97c3 | ||
|
|
af39ec27b8 | ||
|
|
c79085e5b7 | ||
|
|
efe2d8da8a | ||
|
|
d8c1b67a22 | ||
|
|
950e6116e5 | ||
|
|
b541cf919d | ||
|
|
087da50ecc | ||
|
|
d86a68f713 | ||
|
|
62ee9b55e1 | ||
|
|
fc1b57da6e | ||
|
|
3b9624c1c3 | ||
|
|
ae7847d097 | ||
|
|
4eccf30de3 | ||
|
|
efdbea5b53 | ||
|
|
a915c703a5 | ||
|
|
91952f84bd | ||
|
|
75a026827c | ||
|
|
73aabdfeff | ||
|
|
1d4790aa42 | ||
|
|
8a7367f1c9 | ||
|
|
3e96a0630c | ||
|
|
8740fb4bbe | ||
|
|
fa1cbe66e7 | ||
|
|
4e7b8d555e | ||
|
|
9c5d888ec9 | ||
|
|
2681c2a51a | ||
|
|
17ea9f520a | ||
|
|
2fa21ff091 | ||
|
|
9e6b343620 | ||
|
|
6104567fb1 | ||
|
|
7664e0691c | ||
|
|
1d8ebe96bc | ||
|
|
5a5936c3c7 | ||
|
|
245e5705da | ||
|
|
4c76f654b9 | ||
|
|
f38b630da1 | ||
|
|
0bde9e5f50 | ||
|
|
f438b1c7a6 | ||
|
|
9123628254 | ||
|
|
30f4ad57ab | ||
|
|
54f311d94a | ||
|
|
18f2a14a00 | ||
|
|
a9cfaa93cc | ||
|
|
a425a38e29 | ||
|
|
7383ecb0ba | ||
|
|
69210d0917 | ||
|
|
4eb94b5cea | ||
|
|
f660b8c7ff | ||
|
|
85df74ff43 | ||
|
|
c9c53c9745 | ||
|
|
0ee9f9d956 | ||
|
|
5949307342 | ||
|
|
6e149d5406 | ||
|
|
6e72910d31 | ||
|
|
2588b45826 | ||
|
|
a2d6c8f2f7 | ||
|
|
30083949a0 | ||
|
|
6d7a33ff70 | ||
|
|
448eca56c8 | ||
|
|
deea6797c5 | ||
|
|
2b23372ad3 | ||
|
|
64798d081d | ||
|
|
2e5de478a6 | ||
|
|
53c7d9c18f | ||
|
|
672744ad1d | ||
|
|
0bd5f1d4a4 | ||
|
|
49da019bd0 | ||
|
|
b3b9da5bbc | ||
|
|
ea54499f24 | ||
|
|
6337d594fa | ||
|
|
dc5fc9ded4 | ||
|
|
78dd7a246a | ||
|
|
ab5f0216f6 | ||
|
|
32617a61df | ||
|
|
323ff1b55e | ||
|
|
6d5ec6aff8 | ||
|
|
9017e5de52 | ||
|
|
64afdfc642 | ||
|
|
c0cbcda1c2 | ||
|
|
a58e87b173 | ||
|
|
0cff785068 | ||
|
|
98e7623480 | ||
|
|
7f81780ffb | ||
|
|
e17e92775c | ||
|
|
56b238980b | ||
|
|
aa0e6c17b9 | ||
|
|
57a515f7a8 | ||
|
|
7e7fff1dc5 | ||
|
|
98e534cc77 | ||
|
|
17e9e97064 | ||
|
|
420bd34888 | ||
|
|
e109be4c6a | ||
|
|
16ee7d07a8 | ||
|
|
2741c961b7 | ||
|
|
ccbf57165f | ||
|
|
b9ed239cf4 | ||
|
|
61de2f4a4a | ||
|
|
2cda4547d6 | ||
|
|
a2a9147790 | ||
|
|
ee83dceef0 | ||
|
|
6c7fd94aa7 | ||
|
|
b53d5924a1 | ||
|
|
e5bb5b7430 | ||
|
|
4652d8559f | ||
|
|
ef90ba7cef | ||
|
|
2500d98def | ||
|
|
fc273bb79e | ||
|
|
2317111c85 | ||
|
|
9ecc71ca4a | ||
|
|
653e93c62a | ||
|
|
3a23ae6ea4 | ||
|
|
de0c592a95 | ||
|
|
b94fd23da2 | ||
|
|
69c55d807a | ||
|
|
cf6d7ef3ac | ||
|
|
cbcd0d49ae | ||
|
|
42d02dd448 | ||
|
|
6f176f7cf1 | ||
|
|
378c9d37d0 | ||
|
|
cc79d7f79c | ||
|
|
0b6d1ad20b | ||
|
|
335d0bec3e | ||
|
|
6bf7b0312e | ||
|
|
674d127701 | ||
|
|
046ca3fbb8 | ||
|
|
59d7024250 | ||
|
|
1aadbf16ba | ||
|
|
5cb1e8a5d6 | ||
|
|
3af22d3074 | ||
|
|
6aee53fc8b | ||
|
|
8a7fdb04b4 | ||
|
|
5e4f24ec60 | ||
|
|
6373e9752c | ||
|
|
7ffd1635f5 | ||
|
|
50b971091f | ||
|
|
d7b680ecb8 | ||
|
|
66dbe45f9e | ||
|
|
599f16a7cf | ||
|
|
7a99325528 | ||
|
|
bd4900ab6d | ||
|
|
c6f2710e1c | ||
|
|
f6d9a12cba | ||
|
|
3a6aae3e10 | ||
|
|
9c5f3854ab | ||
|
|
10b7961a99 | ||
|
|
a678b7f0ea | ||
|
|
888f97a35f | ||
|
|
7f650ad7dc | ||
|
|
53e43a402a | ||
|
|
401359646a | ||
|
|
fcad93dc10 | ||
|
|
1513aab4c8 | ||
|
|
ec89424c42 | ||
|
|
5f5cc794f0 | ||
|
|
b540d10b48 | ||
|
|
e66d5a0537 | ||
|
|
73a515b93f | ||
|
|
8c1bc10aa4 | ||
|
|
2c89b3240f | ||
|
|
1577740bc4 | ||
|
|
14ef069ea1 | ||
|
|
ed83595e33 | ||
|
|
4ffded6fef | ||
|
|
8df5b81f24 | ||
|
|
65ee059591 | ||
|
|
be5adc7622 | ||
|
|
f77c849a2b | ||
|
|
0fe4fad72c | ||
|
|
2e78158099 | ||
|
|
385f787ffc | ||
|
|
33f7746296 | ||
|
|
bc06775e04 | ||
|
|
2895dcfa98 | ||
|
|
75f9f72147 | ||
|
|
ecef0b6361 | ||
|
|
7afa5c9255 | ||
|
|
568cd38b0f | ||
|
|
c902218baf | ||
|
|
abfabd267d | ||
|
|
6dee0d8ca8 | ||
|
|
c0b7343e60 | ||
|
|
2d664c49b1 | ||
|
|
54d3e412f1 | ||
|
|
9a474c759b | ||
|
|
a0e3111b64 | ||
|
|
c1e1d00d0e | ||
|
|
fa9d34feff | ||
|
|
065e87c071 | ||
|
|
694db60972 | ||
|
|
d186168a92 | ||
|
|
fe8b80120b | ||
|
|
546b65633a | ||
|
|
1e09eff530 | ||
|
|
1608c7c644 | ||
|
|
ea5b60d911 | ||
|
|
8b65834907 | ||
|
|
b0a28635b4 | ||
|
|
abb64508da | ||
|
|
1b52309121 | ||
|
|
97bdbb7df6 | ||
|
|
98c2d25aee | ||
|
|
884b9004db | ||
|
|
4463abd009 | ||
|
|
01bc76b424 | ||
|
|
5a814ab911 | ||
|
|
ec5358773e | ||
|
|
2395de4bb3 | ||
|
|
db86c7d121 | ||
|
|
9fb3958c6d | ||
|
|
8b2b7cb4a4 | ||
|
|
3b9c226507 | ||
|
|
af62690bbc | ||
|
|
f2564ab8b1 | ||
|
|
0d056b5edf | ||
|
|
5d465056ce | ||
|
|
10b9d3fa96 | ||
|
|
f5ec47a2b3 | ||
|
|
0ad2fba4d2 | ||
|
|
56d68e71db | ||
|
|
b301c79462 | ||
|
|
21e85e3150 | ||
|
|
154fb3a727 | ||
|
|
23f8bac05b | ||
|
|
65f89ff128 | ||
|
|
394c3b6deb | ||
|
|
04f32ba119 | ||
|
|
5071a59f1a | ||
|
|
7cb4dbd402 | ||
|
|
010d16946c | ||
|
|
7218b278a2 | ||
|
|
f5895d6e35 | ||
|
|
dae7c538e2 | ||
|
|
5284f60e83 | ||
|
|
30f147770c | ||
|
|
1bd77c7fab | ||
|
|
a7a2ac0948 | ||
|
|
3524b45e33 | ||
|
|
ebfd5c2db0 | ||
|
|
c4875d475d | ||
|
|
02879aa7d1 | ||
|
|
c85a540986 | ||
|
|
38c83be39e | ||
|
|
26ba489746 | ||
|
|
7609655986 | ||
|
|
dc8206e581 | ||
|
|
3401ef6f02 | ||
|
|
84050170b9 | ||
|
|
13b59c9c23 | ||
|
|
6c08797980 | ||
|
|
66f8af9b0c | ||
|
|
66bb149a65 | ||
|
|
09e9562cac | ||
|
|
94bd4d8f3e | ||
|
|
ad8b959880 | ||
|
|
8190658fe9 | ||
|
|
560814d8ff | ||
|
|
185c5f288d | ||
|
|
a955a6308a | ||
|
|
cdd7f26fb3 | ||
|
|
a406df64cf | ||
|
|
e88a7f7088 | ||
|
|
15ed1ee33c | ||
|
|
674427a8b2 | ||
|
|
900525f8c2 | ||
|
|
4df3cc7d57 | ||
|
|
b4c0a18df0 | ||
|
|
b77ca54719 | ||
|
|
e8aacf325c | ||
|
|
139f8773de | ||
|
|
a02564eaf2 | ||
|
|
8a2f8c34cc | ||
|
|
296eaff73c | ||
|
|
32de871243 | ||
|
|
cf60d862f8 | ||
|
|
a294a9592e | ||
|
|
c65ab1b277 | ||
|
|
5c2949b59d | ||
|
|
9fde074ff3 | ||
|
|
049ce70979 | ||
|
|
b1478a49da | ||
|
|
39557de7f4 | ||
|
|
8755c98894 | ||
|
|
2d6d396c78 | ||
|
|
8460536068 | ||
|
|
adc32ee3bf | ||
|
|
de87b02085 | ||
|
|
027ea9ffd0 | ||
|
|
86913ad50e | ||
|
|
8618f216f8 | ||
|
|
84663cc338 | ||
|
|
d9a43d4b8e | ||
|
|
0ab9e4359a | ||
|
|
4d28bdeab7 | ||
|
|
3c1b723c7f | ||
|
|
9b88a7258b | ||
|
|
f891714db2 | ||
|
|
e1aa81e3ba | ||
|
|
ee47a8923d | ||
|
|
c4fdeb19a9 | ||
|
|
6d5139e3b2 | ||
|
|
830ff564a3 | ||
|
|
b3cffa9ca2 | ||
|
|
53d8e364e8 | ||
|
|
6980430b98 | ||
|
|
ebf1254fd3 | ||
|
|
8fd18b7ede | ||
|
|
e549a3fb4a | ||
|
|
24687f209c | ||
|
|
8d162267e8 | ||
|
|
796ddc07b0 | ||
|
|
48bf70f3ee | ||
|
|
f84ad432e7 | ||
|
|
ef2200c28e | ||
|
|
fe675b6fa1 | ||
|
|
26b5fa5aca | ||
|
|
fa71ed607b | ||
|
|
330e54018f | ||
|
|
3105596c9e | ||
|
|
9bfb73211e | ||
|
|
88d3de7afc | ||
|
|
95c0afb99b | ||
|
|
653af01235 | ||
|
|
9d1208c9ff | ||
|
|
c3ee957cc6 | ||
|
|
536600c95c | ||
|
|
627d6e70a6 | ||
|
|
43d557e0f4 | ||
|
|
5626c69ce5 | ||
|
|
b96a2343ac | ||
|
|
1ff4d1ae6c | ||
|
|
6daf3c097f | ||
|
|
80eae53c59 | ||
|
|
65e37c29e4 | ||
|
|
ce17decf3b | ||
|
|
dc102f076a | ||
|
|
0af9888b12 | ||
|
|
e5f48ad9bf | ||
|
|
752d58906c | ||
|
|
2bdd2bf5cd | ||
|
|
983fd2010f | ||
|
|
e838a86df9 | ||
|
|
2f046ec8db | ||
|
|
516ad171d2 | ||
|
|
b1d2e27ae8 | ||
|
|
e40fc14f85 | ||
|
|
9b96ad5b58 | ||
|
|
59e80ae951 | ||
|
|
2c11f9d265 | ||
|
|
1720f51d69 | ||
|
|
1fe9c9c4c7 | ||
|
|
d845e65443 | ||
|
|
91d5efe5ee | ||
|
|
11b15dbcd1 | ||
|
|
e69fdaf48b | ||
|
|
0645225801 | ||
|
|
249dfae727 | ||
|
|
e2d5d12e7f | ||
|
|
6e99a6b9f7 | ||
|
|
c465274a9c | ||
|
|
a629bcab8d | ||
|
|
c6eb7b69e6 | ||
|
|
e57a27e12a | ||
|
|
b4c5a3a779 | ||
|
|
f49cde8bd5 | ||
|
|
b376735cee | ||
|
|
098d4037c9 | ||
|
|
1a1eff321d | ||
|
|
b5e9f270e2 | ||
|
|
d3eba74c04 | ||
|
|
b5c5e6627e | ||
|
|
97b04b7f77 | ||
|
|
5f0ad230aa | ||
|
|
6510e5f129 | ||
|
|
d121e2070b | ||
|
|
f55dc46a32 | ||
|
|
de95667a6a | ||
|
|
2a60cbe66d | ||
|
|
652c3707e9 | ||
|
|
a054f5724b | ||
|
|
4fdcc3dfc9 | ||
|
|
d4db1bfacb | ||
|
|
a604a60b22 | ||
|
|
c246366e7f | ||
|
|
64b1a5298a | ||
|
|
b4c04ad927 | ||
|
|
558a8bc3bb | ||
|
|
1973e44f49 | ||
|
|
7c62f9e6ab | ||
|
|
530e6a02fc | ||
|
|
bc4f9bb805 | ||
|
|
4218612ccd | ||
|
|
ff02579c3d | ||
|
|
fc59d2b48b | ||
|
|
17a77220c2 | ||
|
|
fa64b2dc80 | ||
|
|
80e99be62a | ||
|
|
ce65cdd1e5 | ||
|
|
7859d62a90 | ||
|
|
fb0fb7144b | ||
|
|
c4901e998a | ||
|
|
d468c36216 | ||
|
|
fd2b827e31 | ||
|
|
98481821d8 | ||
|
|
f4ed8476ef | ||
|
|
4d7eddc52c | ||
|
|
396f5d610e | ||
|
|
4904411ded | ||
|
|
eb82d5532e | ||
|
|
6696de6bab | ||
|
|
284bfc9a57 | ||
|
|
d1981ef34e | ||
|
|
80dc0ce879 | ||
|
|
1d1f55125a | ||
|
|
e74838f024 | ||
|
|
d8b6904492 | ||
|
|
9653584d73 | ||
|
|
e6c8de6cc6 | ||
|
|
96ddd756f8 | ||
|
|
dc247cc57d | ||
|
|
dde204fb6a | ||
|
|
99919a8b08 | ||
|
|
44b7584c58 | ||
|
|
986c5e3c68 | ||
|
|
fb3d5e47d5 | ||
|
|
6246cf5499 | ||
|
|
70bb865f81 | ||
|
|
66b77be2d0 | ||
|
|
2b08ed9536 | ||
|
|
3d23a54fe4 | ||
|
|
258001c6aa | ||
|
|
310f20e81b | ||
|
|
88a17013dd | ||
|
|
b8060cd8f7 | ||
|
|
d240b12196 | ||
|
|
f89a682d98 | ||
|
|
f7aecbf75d | ||
|
|
9928c1ac18 | ||
|
|
e5e8308f5c | ||
|
|
570f61438a | ||
|
|
c42f88e4d3 | ||
|
|
bb8c3bad86 | ||
|
|
7bf24ccaa2 | ||
|
|
87597cbc33 | ||
|
|
9535009e46 | ||
|
|
9dfd604724 | ||
|
|
3d5ecf25b2 | ||
|
|
5f5491a9e5 | ||
|
|
0addc7207e | ||
|
|
e88c2061f1 | ||
|
|
1a3cf0c7fe | ||
|
|
559c2c6d34 | ||
|
|
311c8b25fe | ||
|
|
99e7c322eb | ||
|
|
d11248b998 | ||
|
|
9c242a8012 | ||
|
|
8244297b89 | ||
|
|
13f3e0aca4 | ||
|
|
34bbd2ad26 | ||
|
|
5d28eea968 | ||
|
|
27880ece2b | ||
|
|
f228bf484e | ||
|
|
b4ec045bc0 | ||
|
|
27030aa1e8 | ||
|
|
d8441b134a | ||
|
|
a0f2ddb920 | ||
|
|
583ce6d1dc | ||
|
|
857c091576 | ||
|
|
ba89d2ccac | ||
|
|
d89b196f15 | ||
|
|
72b676843b | ||
|
|
1ae896e73f | ||
|
|
54a4f14d09 | ||
|
|
3e81c56349 | ||
|
|
3c195e4d71 | ||
|
|
971cdf51a3 | ||
|
|
c5a79bfc76 | ||
|
|
7470549199 | ||
|
|
4aa532390c | ||
|
|
06262868f5 | ||
|
|
d0dff7ee4e | ||
|
|
63a02a6c74 | ||
|
|
aea9c535e0 | ||
|
|
ecc9af60eb | ||
|
|
2ec4ac3c0f | ||
|
|
5b96496a8d | ||
|
|
6189932bef | ||
|
|
93f94d4ee9 | ||
|
|
906d8bffdf | ||
|
|
7a2bc47486 | ||
|
|
37be57610c | ||
|
|
24c536fed0 | ||
|
|
ff994155df | ||
|
|
32670e810c | ||
|
|
347d92b29c | ||
|
|
1fe4aa3467 | ||
|
|
9e94dc5550 | ||
|
|
a1e08e5664 | ||
|
|
f5048ec61c | ||
|
|
94add978b0 | ||
|
|
c7d4c9d26d | ||
|
|
788b864362 | ||
|
|
84fdc0ea9e | ||
|
|
99db94f476 | ||
|
|
39604faa09 | ||
|
|
fd0fec07d8 | ||
|
|
3ffedead7a | ||
|
|
2bdab5a900 | ||
|
|
8ca1f89ba6 | ||
|
|
ee3a9d2e09 | ||
|
|
1f80471479 | ||
|
|
2d82527ee9 | ||
|
|
9be712de99 | ||
|
|
b6d36436c3 | ||
|
|
39af6e0365 | ||
|
|
dacbdee85b | ||
|
|
862e885125 | ||
|
|
66ad2b8102 | ||
|
|
291a889595 | ||
|
|
4cdeb6cdb1 | ||
|
|
015139d451 | ||
|
|
859c2606f0 | ||
|
|
a05593da5b | ||
|
|
fec9c0f981 | ||
|
|
061a990eb8 | ||
|
|
ef834b988c | ||
|
|
474c60203b | ||
|
|
c17ab761c5 | ||
|
|
142894895d | ||
|
|
b2dfaae68c | ||
|
|
9f03569cd0 | ||
|
|
830c2ffdf5 | ||
|
|
3086e8aa01 | ||
|
|
9c6d531ae7 | ||
|
|
12a8ab5ac7 | ||
|
|
fef7232c6b | ||
|
|
3caa010779 | ||
|
|
cdadf5e5a9 | ||
|
|
cde23be559 | ||
|
|
ea99bd9763 | ||
|
|
fbb487ae2b | ||
|
|
39e4845f42 | ||
|
|
2b644525f8 | ||
|
|
2318419291 | ||
|
|
ca790b4c69 | ||
|
|
332d83bd18 | ||
|
|
5c485c3375 | ||
|
|
29135aa77c | ||
|
|
d68bb937d8 | ||
|
|
4abc38dacc | ||
|
|
10087ffaeb | ||
|
|
4382bbcc96 | ||
|
|
7663ec2bde | ||
|
|
f1e4ecaaa3 | ||
|
|
501d21aa28 | ||
|
|
e3d59288fe | ||
|
|
7cfba5e1b2 | ||
|
|
32ce8f0d9b | ||
|
|
b87ade6402 | ||
|
|
7d3b7fe728 | ||
|
|
609dad02a2 | ||
|
|
7dd12f88e1 | ||
|
|
7a2a069a5a | ||
|
|
bf3daea124 | ||
|
|
305cfa1f69 | ||
|
|
d2c726cd28 | ||
|
|
236a21a9d7 | ||
|
|
4e830a8c31 | ||
|
|
9d63e1412e | ||
|
|
305589e347 | ||
|
|
3c19328764 | ||
|
|
84fd51ff50 | ||
|
|
4f46ad3665 | ||
|
|
4f75e2041c | ||
|
|
3ca9b1e331 | ||
|
|
fb0633453a | ||
|
|
308cef950b | ||
|
|
f567db64b6 | ||
|
|
d94cdaaade | ||
|
|
3e8eaa8112 | ||
|
|
e3e6ff67db | ||
|
|
21906b5a63 | ||
|
|
bdb62e6a40 | ||
|
|
7b23814fc1 | ||
|
|
36fec765e7 | ||
|
|
ea53f12a98 | ||
|
|
81c729e09c | ||
|
|
4be8861f41 | ||
|
|
3441224b2f | ||
|
|
a50a21b076 | ||
|
|
4c4b10c617 | ||
|
|
d249117182 | ||
|
|
b13cf82541 | ||
|
|
a0ec3a7bbe | ||
|
|
c791fe34b9 | ||
|
|
04a8239df4 | ||
|
|
4171be0b98 | ||
|
|
a1f2fdb706 | ||
|
|
8f1b1bb1ff | ||
|
|
108d41fd78 | ||
|
|
001c5500bd | ||
|
|
8d99d27932 | ||
|
|
19c3232d2f | ||
|
|
76090193ea | ||
|
|
c0bbaebaf4 | ||
|
|
92cc24fca2 | ||
|
|
30f66578e1 | ||
|
|
e9a3235291 | ||
|
|
642555d0fb | ||
|
|
0efca4d266 | ||
|
|
bc2bf7d6d0 | ||
|
|
29fff4fb06 | ||
|
|
abef90423d | ||
|
|
ca965d1c6c | ||
|
|
8db6a939c1 | ||
|
|
0594e33ed7 | ||
|
|
f9e19500be | ||
|
|
e3894de618 | ||
|
|
e153db31b1 | ||
|
|
dc732bafd5 | ||
|
|
c4e1e0941c | ||
|
|
f8946b15d2 | ||
|
|
67d4f905e6 | ||
|
|
9c48922a75 | ||
|
|
783fc6a20d | ||
|
|
ab0699875a | ||
|
|
a31b8a1b58 | ||
|
|
3e74819519 | ||
|
|
98ff8c477e | ||
|
|
c147e315db | ||
|
|
a5ea5ba9c1 | ||
|
|
405bfeddac | ||
|
|
7c00c1e5d5 | ||
|
|
15ea3953f0 | ||
|
|
818153a1e7 | ||
|
|
870c2f9554 | ||
|
|
8a45e8c8af | ||
|
|
683900b5a2 | ||
|
|
ab61f4bb2c | ||
|
|
088bf56f2a | ||
|
|
2532300156 | ||
|
|
36ae2086ab | ||
|
|
08b22edd89 | ||
|
|
78cde92999 | ||
|
|
9d916029d9 | ||
|
|
d00e1e78bb | ||
|
|
c51283223d | ||
|
|
e4ed3f8cf8 | ||
|
|
964bbca792 | ||
|
|
efc8c75e7d | ||
|
|
28722de72d | ||
|
|
99c2ad4ad5 | ||
|
|
1b5a1f692a | ||
|
|
343d092044 | ||
|
|
d8578190ff | ||
|
|
6291799cfa | ||
|
|
b3175f0b5c | ||
|
|
0ebe1a6631 | ||
|
|
217cc846c3 | ||
|
|
45d1bd61ce | ||
|
|
0770bced09 | ||
|
|
5d9315938f | ||
|
|
dd144eaab9 | ||
|
|
2086b219d2 | ||
|
|
ebd8c0c50a | ||
|
|
153cdf24a5 | ||
|
|
aa27fb496f | ||
|
|
70f0edd041 | ||
|
|
2f7062d642 | ||
|
|
ebeb16eda5 | ||
|
|
b8a8648f4a | ||
|
|
335f5df3ec | ||
|
|
f1f31d1067 | ||
|
|
5e80276631 | ||
|
|
9812792d46 | ||
|
|
4a6ea4c492 | ||
|
|
b290dac3cb | ||
|
|
76f6eb3edf | ||
|
|
b33e3eac60 | ||
|
|
c18874c122 | ||
|
|
64290b69c9 | ||
|
|
b972e079b8 | ||
|
|
7d07ddd837 | ||
|
|
129eba2b5d | ||
|
|
00bef607ca | ||
|
|
ef2080a800 | ||
|
|
ca72590e49 | ||
|
|
5274ddce83 | ||
|
|
f86ce88d3d | ||
|
|
ea504dc93b | ||
|
|
8a19cd19d8 | ||
|
|
c9d65606f5 | ||
|
|
5a12e58c0c | ||
|
|
9112470785 | ||
|
|
87edaa3f06 | ||
|
|
ba67431731 | ||
|
|
656f4d5101 | ||
|
|
afb4b1b68f | ||
|
|
12abc74640 | ||
|
|
7c404d8b5e | ||
|
|
00975237b1 | ||
|
|
e165731b82 | ||
|
|
9fb1a0d4b3 | ||
|
|
87b82b95c8 | ||
|
|
52bae8d37d | ||
|
|
736b492fb0 | ||
|
|
66891b6c53 | ||
|
|
942c3a879c | ||
|
|
079dab0d75 | ||
|
|
b5ac141936 | ||
|
|
6270f10c93 | ||
|
|
f5ba7b958e | ||
|
|
a59f977db1 | ||
|
|
cd5dd2727c | ||
|
|
087a838db5 | ||
|
|
99040a89c6 | ||
|
|
60751f809b | ||
|
|
32a2ae12cb | ||
|
|
72230d3249 | ||
|
|
b7227d3a6b | ||
|
|
fa4a479b97 | ||
|
|
f27ef344bc | ||
|
|
84a2ebcbfd | ||
|
|
bafa664d03 | ||
|
|
2e29b460d2 | ||
|
|
77208728ad | ||
|
|
e0428ca8c2 | ||
|
|
8ecf6f3ad3 | ||
|
|
1af9e3c313 | ||
|
|
1f65d51a69 | ||
|
|
a7e99bc095 | ||
|
|
5acff25bca | ||
|
|
594d030a56 | ||
|
|
500f71c344 | ||
|
|
dfb691b14a | ||
|
|
b648cec9cd | ||
|
|
a81cbb5a7b | ||
|
|
0ad96858ff | ||
|
|
bb05aeb860 | ||
|
|
5a133ff2d4 | ||
|
|
8bc79a65c7 | ||
|
|
3c2c827bc3 | ||
|
|
05f5e02c03 | ||
|
|
c326eadd8b | ||
|
|
df777b3166 | ||
|
|
6d4b962391 | ||
|
|
525ee3b77d | ||
|
|
61abd91eb9 | ||
|
|
6ae75aa1a2 | ||
|
|
d03992f878 | ||
|
|
15e00a125d | ||
|
|
57772135ad | ||
|
|
abd418af41 | ||
|
|
6a17cad206 | ||
|
|
766d809f0c | ||
|
|
1c98e37db8 | ||
|
|
4d10487463 | ||
|
|
0b5e27d3de | ||
|
|
5119769de0 | ||
|
|
509c44d446 | ||
|
|
10dba44638 | ||
|
|
f390c186e6 | ||
|
|
f5086c98e8 | ||
|
|
670c53e863 | ||
|
|
a59d83518d | ||
|
|
98e1282a3f | ||
|
|
3244969b93 | ||
|
|
495023460c | ||
|
|
f536257d3c | ||
|
|
b0109094cc | ||
|
|
50edfbd182 | ||
|
|
ded80070c5 | ||
|
|
e7628229fc | ||
|
|
533f1a6fdb | ||
|
|
71dacb5af8 | ||
|
|
fe2a589890 | ||
|
|
4b6a9e0387 | ||
|
|
ca1ff19541 | ||
|
|
ada6a143ad | ||
|
|
e24198ab22 | ||
|
|
fa04496c81 | ||
|
|
8b7be6d47e | ||
|
|
837fa4eae9 | ||
|
|
0c91b0dc10 | ||
|
|
881e16ec75 | ||
|
|
cb2b4fa4aa | ||
|
|
9b4cca9fd0 | ||
|
|
11e4914531 | ||
|
|
adae785075 | ||
|
|
24c16bf387 | ||
|
|
ee08c15b8c | ||
|
|
ec3468fea6 | ||
|
|
8a39b79ee8 | ||
|
|
e51904555b | ||
|
|
82451e425b | ||
|
|
e196742ece | ||
|
|
819314de46 | ||
|
|
5a186d4fa8 | ||
|
|
298fbd8d88 | ||
|
|
b46b23e4ff | ||
|
|
1fdd324efc | ||
|
|
5a8bc204b7 | ||
|
|
2498d58ba1 | ||
|
|
ffc10d80ec | ||
|
|
a59d73d64a | ||
|
|
3717795652 | ||
|
|
ab0592231c | ||
|
|
25bec140fb | ||
|
|
23bb80ab2c | ||
|
|
c962fe9011 | ||
|
|
4e2536e0ef | ||
|
|
b15f1e5b93 | ||
|
|
0fce643a10 | ||
|
|
fad79f3218 | ||
|
|
cdc08e566f | ||
|
|
c736dedfa6 | ||
|
|
cf78fa99ee | ||
|
|
e9fd960021 | ||
|
|
9a9428789d | ||
|
|
453b454b7b | ||
|
|
f023f04b40 | ||
|
|
654a3c976e | ||
|
|
ecddd08048 | ||
|
|
da33d82e1b | ||
|
|
4d10adae3c | ||
|
|
b647998f15 | ||
|
|
384b6433c0 | ||
|
|
a38a9ea144 | ||
|
|
4818d78432 | ||
|
|
a9474a5a22 | ||
|
|
4b47881950 | ||
|
|
dc0c4abe4c | ||
|
|
01a6cdaf03 | ||
|
|
92d27aa6d2 | ||
|
|
2f65a20d16 | ||
|
|
aff1077b00 | ||
|
|
468a4ff2ac | ||
|
|
31a09b73cc | ||
|
|
1b45f42d70 | ||
|
|
c0d2f249bc | ||
|
|
784926b2b4 | ||
|
|
50c22aef7a | ||
|
|
8294e03d4e | ||
|
|
5f0ac7defb | ||
|
|
6d2990314f | ||
|
|
d1173265b3 | ||
|
|
eb366c6aa0 | ||
|
|
9a5ca5017b | ||
|
|
4548cea000 | ||
|
|
8c1d1bfd4a | ||
|
|
65ba7bd37d | ||
|
|
b3cce636cc | ||
|
|
f5a7a650e7 | ||
|
|
68f5e8d27e | ||
|
|
e94c0de8c6 | ||
|
|
b0b660b52d | ||
|
|
650130f9c4 | ||
|
|
9d65b56d2e | ||
|
|
e0e0b0b62f | ||
|
|
e7bace9341 | ||
|
|
f8cf3b1510 | ||
|
|
c215a03edd | ||
|
|
1ee82dd604 | ||
|
|
3cd8d9eb06 | ||
|
|
3309e10b0d | ||
|
|
0ccaa00969 | ||
|
|
d690b49d17 | ||
|
|
8cff52aef6 | ||
|
|
943d2a72c6 | ||
|
|
e252e666bd | ||
|
|
f947e65f15 | ||
|
|
e9705c4e26 | ||
|
|
dfea74cca8 | ||
|
|
9e9a3825aa | ||
|
|
498334e860 | ||
|
|
4f03486011 | ||
|
|
52aef0b926 | ||
|
|
c759211032 | ||
|
|
83199661ce | ||
|
|
7f1b4dc438 | ||
|
|
a843c52e38 | ||
|
|
27bb5f1e82 | ||
|
|
9d08c4bc8f | ||
|
|
564aaa7bb1 | ||
|
|
c2887b3e59 | ||
|
|
7e47ab2a1e | ||
|
|
5046b3165d | ||
|
|
9762da5af5 | ||
|
|
b69eb08dd3 | ||
|
|
70e72efcca | ||
|
|
aa0aaccc24 | ||
|
|
3c191d209d | ||
|
|
04f7067034 | ||
|
|
8a41a6bb5b | ||
|
|
179efaf447 | ||
|
|
156fb17dad | ||
|
|
316d35f015 | ||
|
|
6583a44a92 | ||
|
|
40bc05a38e | ||
|
|
9d407f100f | ||
|
|
cf4b39db8c | ||
|
|
d3e565483b | ||
|
|
4b79cc68cb | ||
|
|
279b1f4317 | ||
|
|
e950421e87 | ||
|
|
7972bd8446 | ||
|
|
7cd0ce4010 | ||
|
|
3c3fba87da | ||
|
|
b22e24a95a | ||
|
|
d4cdd82f72 | ||
|
|
3353cbe23a | ||
|
|
9eb8f4ee9d | ||
|
|
db9105e166 | ||
|
|
e1b02dd13d | ||
|
|
93afbdeaae | ||
|
|
474a50252b | ||
|
|
af525a4cf2 | ||
|
|
ca713c57e7 | ||
|
|
57e5aa667f | ||
|
|
d85d4f6094 | ||
|
|
ac2ea039b5 | ||
|
|
91e474e72e | ||
|
|
43db2fb8a4 | ||
|
|
59d069dc4d | ||
|
|
0ca1cc2bcd | ||
|
|
cd682e200b | ||
|
|
6ac5c16d2b | ||
|
|
66a7e32e58 | ||
|
|
8a0b25cfc1 | ||
|
|
67ef0b3af4 | ||
|
|
9b75390b24 | ||
|
|
9662c1463d | ||
|
|
49f074144d | ||
|
|
23728626e2 | ||
|
|
0d437f732d | ||
|
|
1a0dd76ed1 | ||
|
|
d192b821a9 | ||
|
|
3cfff416c0 | ||
|
|
91e678bdcb | ||
|
|
c079a12c9c | ||
|
|
43ec14fa9c | ||
|
|
2375df2b62 | ||
|
|
5120d8481a | ||
|
|
62e98c1964 | ||
|
|
df17ea06f5 | ||
|
|
59040d4419 | ||
|
|
530df4298e | ||
|
|
ea7673618d | ||
|
|
53c8e68fba | ||
|
|
c34e15bbb7 | ||
|
|
181b35dc5e | ||
|
|
7b19beaf5d | ||
|
|
3433fa4a6e | ||
|
|
45bb8c3ebf | ||
|
|
58afade1bb | ||
|
|
1e9a0894f1 | ||
|
|
581a54663c | ||
|
|
36913f4efc | ||
|
|
6c680e306d | ||
|
|
30fc2387be | ||
|
|
22f8d321d7 | ||
|
|
72d8e62075 | ||
|
|
9332b9f399 | ||
|
|
70e3a9aff8 | ||
|
|
4438c4bd87 | ||
|
|
22bbb113e7 | ||
|
|
94a1601ab2 | ||
|
|
e46da5a181 | ||
|
|
0c390d12f7 | ||
|
|
d65d9aa6e0 | ||
|
|
082f70757c | ||
|
|
a685ccc955 | ||
|
|
0962e73e3e | ||
|
|
7d0aefacbb | ||
|
|
a91ffa60d6 | ||
|
|
dc79ea363d | ||
|
|
f09f5c2d11 | ||
|
|
8e2b474fc7 | ||
|
|
9efa495b0e | ||
|
|
941a0f7153 | ||
|
|
9cdc5261c4 | ||
|
|
d067bc9f01 | ||
|
|
e2206147cc | ||
|
|
515925a178 | ||
|
|
c25a5e06cf | ||
|
|
5cbd2519da | ||
|
|
67c1d633c6 | ||
|
|
add13c2646 | ||
|
|
71a2ca9e7c | ||
|
|
707faf57b5 | ||
|
|
e20cd0ef27 | ||
|
|
cf06096565 | ||
|
|
bb85ca031d | ||
|
|
d2702209a4 | ||
|
|
c064ce4852 | ||
|
|
8a657b90a7 | ||
|
|
ab86c5419d | ||
|
|
8e6a01de6d | ||
|
|
d5a4b0637a | ||
|
|
c367533a3c | ||
|
|
b1dafd81b8 | ||
|
|
99fbd7039e | ||
|
|
522858c871 |
+902
-695
File diff suppressed because it is too large
Load Diff
@@ -106,10 +106,12 @@ func main() {
|
|||||||
|
|
||||||
// form the input data.
|
// form the input data.
|
||||||
type data struct {
|
type data struct {
|
||||||
|
Networks []string
|
||||||
ItestFiles []string
|
ItestFiles []string
|
||||||
UnitSuites map[string]string
|
UnitSuites map[string]string
|
||||||
}
|
}
|
||||||
in := data{
|
in := data{
|
||||||
|
Networks: []string{"mainnet", "butterflynet", "calibnet", "debug"},
|
||||||
ItestFiles: itests,
|
ItestFiles: itests,
|
||||||
UnitSuites: func() map[string]string {
|
UnitSuites: func() map[string]string {
|
||||||
ret := make(map[string]string)
|
ret := make(map[string]string)
|
||||||
|
|||||||
+452
-654
File diff suppressed because it is too large
Load Diff
@@ -1,74 +0,0 @@
|
|||||||
ignore:
|
|
||||||
# Auto generated
|
|
||||||
- "^.*_gen.go$"
|
|
||||||
- "^.*/mock_full.go$"
|
|
||||||
# Old actors.
|
|
||||||
- "^chain/actors/builtin/[^/]*/(message|state|v)[0-4]\\.go$" # We test the latest version only.
|
|
||||||
# Tests
|
|
||||||
- "api/test/**"
|
|
||||||
- "conformance/**"
|
|
||||||
# Generators
|
|
||||||
- "gen/**"
|
|
||||||
- "chain/actors/agen/**"
|
|
||||||
# Non-critical utilities
|
|
||||||
- "api/docgen/**"
|
|
||||||
- "api/docgen-openrpc/**"
|
|
||||||
coverage:
|
|
||||||
status:
|
|
||||||
patch: off
|
|
||||||
project:
|
|
||||||
threshold: 1%
|
|
||||||
tools-and-tests:
|
|
||||||
target: auto
|
|
||||||
threshold: 1%
|
|
||||||
informational: true
|
|
||||||
paths:
|
|
||||||
- "testplans"
|
|
||||||
- "tools"
|
|
||||||
- "system"
|
|
||||||
- "snap"
|
|
||||||
- "lotuspond"
|
|
||||||
- "conformance"
|
|
||||||
- "scripts"
|
|
||||||
- "gen"
|
|
||||||
- "build"
|
|
||||||
markets:
|
|
||||||
target: auto
|
|
||||||
threshold: 1%
|
|
||||||
informational: true
|
|
||||||
paths:
|
|
||||||
- "markets"
|
|
||||||
- "paychmgr"
|
|
||||||
miner:
|
|
||||||
target: auto
|
|
||||||
threshold: 1.5%
|
|
||||||
informational: true
|
|
||||||
paths:
|
|
||||||
- "miner"
|
|
||||||
- "storage"
|
|
||||||
chain:
|
|
||||||
target: auto
|
|
||||||
threshold: 1%
|
|
||||||
informational: true
|
|
||||||
paths:
|
|
||||||
- "chain"
|
|
||||||
node:
|
|
||||||
target: auto
|
|
||||||
threshold: 1%
|
|
||||||
informational: true
|
|
||||||
paths:
|
|
||||||
- "node"
|
|
||||||
- "blockstore"
|
|
||||||
- "metrics"
|
|
||||||
- "lib"
|
|
||||||
- "genesis"
|
|
||||||
- "gateway"
|
|
||||||
- "api"
|
|
||||||
- "journal"
|
|
||||||
cli:
|
|
||||||
target: auto
|
|
||||||
threshold: 1%
|
|
||||||
informational: true
|
|
||||||
paths:
|
|
||||||
- "cli"
|
|
||||||
- "cmd"
|
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
chain/actors/builtin/*/v* linguist-generated=true
|
||||||
|
chain/actors/builtin/*/message* linguist-generated=true
|
||||||
@@ -9,15 +9,9 @@ body:
|
|||||||
options:
|
options:
|
||||||
- label: This is **not** a security-related bug/issue. If it is, please follow please follow the [security policy](https://github.com/filecoin-project/lotus/security/policy).
|
- label: This is **not** a security-related bug/issue. If it is, please follow please follow the [security policy](https://github.com/filecoin-project/lotus/security/policy).
|
||||||
required: true
|
required: true
|
||||||
- label: This is **not** a question or a support request. If you have any lotus related questions, please ask in the [lotus forum](https://github.com/filecoin-project/lotus/discussions).
|
|
||||||
required: true
|
|
||||||
- label: This is **not** a new feature request. If it is, please file a [feature request](https://github.com/filecoin-project/lotus/issues/new?assignees=&labels=need%2Ftriage%2Ckind%2Ffeature&template=feature_request.yml) instead.
|
|
||||||
required: true
|
|
||||||
- label: This is **not** an enhancement request. If it is, please file a [improvement suggestion](https://github.com/filecoin-project/lotus/issues/new?assignees=&labels=need%2Ftriage%2Ckind%2Fenhancement&template=enhancement.yml) instead.
|
|
||||||
required: true
|
|
||||||
- label: I **have** searched on the [issue tracker](https://github.com/filecoin-project/lotus/issues) and the [lotus forum](https://github.com/filecoin-project/lotus/discussions), and there is no existing related issue or discussion.
|
- label: I **have** searched on the [issue tracker](https://github.com/filecoin-project/lotus/issues) and the [lotus forum](https://github.com/filecoin-project/lotus/discussions), and there is no existing related issue or discussion.
|
||||||
required: true
|
required: true
|
||||||
- label: I am running the [`Latest release`](https://github.com/filecoin-project/lotus/releases), or the most recent RC(release canadiate) for the upcoming release or the dev branch(master), or have an issue updating to any of these.
|
- label: I am running the [`Latest release`](https://github.com/filecoin-project/lotus/releases), the most recent RC(release canadiate) for the upcoming release or the dev branch(master), or have an issue updating to any of these.
|
||||||
required: true
|
required: true
|
||||||
- label: I did not make any code changes to lotus.
|
- label: I did not make any code changes to lotus.
|
||||||
required: false
|
required: false
|
||||||
@@ -28,19 +22,11 @@ body:
|
|||||||
options:
|
options:
|
||||||
- label: lotus daemon - chain sync
|
- label: lotus daemon - chain sync
|
||||||
required: false
|
required: false
|
||||||
- label: lotus miner - mining and block production
|
- label: lotus fvm/fevm - Lotus FVM and FEVM interactions
|
||||||
required: false
|
required: false
|
||||||
- label: lotus miner/worker - sealing
|
- label: lotus miner/worker - sealing
|
||||||
required: false
|
required: false
|
||||||
- label: lotus miner - proving(WindowPoSt)
|
- label: lotus miner - proving(WindowPoSt/WinningPoSt)
|
||||||
required: false
|
|
||||||
- label: lotus miner/market - storage deal
|
|
||||||
required: false
|
|
||||||
- label: lotus miner/market - retrieval deal
|
|
||||||
required: false
|
|
||||||
- label: lotus miner/market - data transfer
|
|
||||||
required: false
|
|
||||||
- label: lotus client
|
|
||||||
required: false
|
required: false
|
||||||
- label: lotus JSON-RPC API
|
- label: lotus JSON-RPC API
|
||||||
required: false
|
required: false
|
||||||
@@ -56,22 +42,33 @@ body:
|
|||||||
description: Enter the output of `lotus version` and `lotus-miner version` if applicable.
|
description: Enter the output of `lotus version` and `lotus-miner version` if applicable.
|
||||||
placeholder: |
|
placeholder: |
|
||||||
e.g.
|
e.g.
|
||||||
Daemon:1.11.0-rc2+debug+git.0519cd371.dirty+api1.3.0
|
Daemon: 1.19.0+mainnet+git.64059ca87+api1.5.0
|
||||||
Local: lotus version 1.11.0-rc2+debug+git.0519cd371.dirty
|
Local: lotus-miner version 1.19.0+mainnet+git.64059ca87
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: ReproSteps
|
||||||
|
attributes:
|
||||||
|
label: Repro Steps
|
||||||
|
description: "Steps to reproduce the behavior"
|
||||||
|
value: |
|
||||||
|
1. Run '...'
|
||||||
|
2. Do '...'
|
||||||
|
3. See error '...'
|
||||||
|
...
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
- type: textarea
|
- type: textarea
|
||||||
id: Description
|
id: Description
|
||||||
attributes:
|
attributes:
|
||||||
label: Describe the Bug
|
label: Describe the Bug
|
||||||
description: |
|
description: |
|
||||||
This is where you get to tell us what went wrong, when doing so, please try to provide a clear and concise description of the bug with all related information:
|
This is where you get to tell us what went wrong, when doing so, please try to provide a clear and concise description of the bug with all related information:
|
||||||
* What you were doding when you experienced the bug?
|
* What you were doing when you experienced the bug?
|
||||||
* Any *error* messages you saw, *where* you saw them, and what you believe may have caused them (if you have any ideas).
|
* Any *error* messages you saw, *where* you saw them, and what you believe may have caused them (if you have any ideas).
|
||||||
* What is the expected behaviour?
|
* What is the expected behaviour?
|
||||||
* For sealing issues, include the output of `lotus-miner sectors status --log <sectorId>` for the failed sector(s).
|
* For sealing issues, include the output of `lotus-miner sectors status --log <sectorId>` for the failed sector(s).
|
||||||
* For proving issues, include the output of `lotus-miner proving` info.
|
* For proving issues, include the output of `lotus-miner proving` info.
|
||||||
* For deal making issues, include the output of `lotus client list-deals -v` and/or `lotus-miner storage-deals|retrieval-deals|data-transfers list [-v]` commands for the deal(s) in question.
|
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
- type: textarea
|
- type: textarea
|
||||||
@@ -81,20 +78,8 @@ body:
|
|||||||
render: text
|
render: text
|
||||||
description: |
|
description: |
|
||||||
Please provide debug logs of the problem, remember you can get set log level control for:
|
Please provide debug logs of the problem, remember you can get set log level control for:
|
||||||
* lotus: use `lotus log list` to get all log systems available and set level by `lotus log set-level`. An example can be found [here](https://docs.filecoin.io/get-started/lotus/configuration-and-advanced-usage/#log-level-control).
|
* lotus: use `lotus log list` to get all log systems available and set level by `lotus log set-level`. An example can be found [here](https://lotus.filecoin.io/lotus/configure/defaults/#log-level-control).
|
||||||
* lotus-miner:`lotus-miner log list` to get all log systems available and set level by `lotus-miner log set-level
|
* lotus-miner:`lotus-miner log list` to get all log systems available and set level by `lotus-miner log set-level
|
||||||
If you don't provide detailed logs when you raise the issue it will almost certainly be the first request I make before furthur diagnosing the problem.
|
If you don't provide detailed logs when you raise the issue it will almost certainly be the first request we make before furthur diagnosing the problem.
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
- type: textarea
|
|
||||||
id: RepoSteps
|
|
||||||
attributes:
|
|
||||||
label: Repo Steps
|
|
||||||
description: "Steps to reproduce the behavior"
|
|
||||||
value: |
|
|
||||||
1. Run '...'
|
|
||||||
2. Do '...'
|
|
||||||
3. See error '...'
|
|
||||||
...
|
|
||||||
validations:
|
|
||||||
required: false
|
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
blank_issues_enabled: true
|
||||||
|
contact_links:
|
||||||
|
- name: Ask a question about Lotus or get support
|
||||||
|
url: https://github.com/filecoin-project/lotus/discussions/new/choose
|
||||||
|
about: Ask a question or request support for using Lotus
|
||||||
|
- name: Filecoin protocol feature or enhancement
|
||||||
|
url: https://github.com/filecoin-project/FIPs/discussions/new/choose
|
||||||
|
about: Write a discussion in the Filecoin Improvement Proposal repo
|
||||||
@@ -7,13 +7,7 @@ body:
|
|||||||
label: Checklist
|
label: Checklist
|
||||||
description: Please check off the following boxes before continuing to create an improvement suggestion!
|
description: Please check off the following boxes before continuing to create an improvement suggestion!
|
||||||
options:
|
options:
|
||||||
- label: This is **not** a new feature or an enhancement to the Filecoin protocol. If it is, please open an [FIP issue](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0001.md).
|
- label: I **have** a specific, actionable, and well motivated improvement to an existing lotus feature.
|
||||||
required: true
|
|
||||||
- label: This is **not** a new feature request. If it is, please file a [feature request](https://github.com/filecoin-project/lotus/issues/new?assignees=&labels=need%2Ftriage%2Ckind%2Ffeature&template=feature_request.yml) instead.
|
|
||||||
required: true
|
|
||||||
- label: This is **not** brainstorming ideas. If you have an idea you'd like to discuss, please open a new discussion on [the lotus forum](https://github.com/filecoin-project/lotus/discussions/categories/ideas) and select the category as `Ideas`.
|
|
||||||
required: true
|
|
||||||
- label: I **have** a specific, actionable, and well motivated improvement to propose.
|
|
||||||
required: true
|
required: true
|
||||||
- type: checkboxes
|
- type: checkboxes
|
||||||
attributes:
|
attributes:
|
||||||
@@ -22,19 +16,11 @@ body:
|
|||||||
options:
|
options:
|
||||||
- label: lotus daemon - chain sync
|
- label: lotus daemon - chain sync
|
||||||
required: false
|
required: false
|
||||||
- label: lotus miner - mining and block production
|
- label: lotus fvm/fevm - Lotus FVM and FEVM interactions
|
||||||
required: false
|
required: false
|
||||||
- label: lotus miner/worker - sealing
|
- label: lotus miner/worker - sealing
|
||||||
required: false
|
required: false
|
||||||
- label: lotus miner - proving(WindowPoSt)
|
- label: lotus miner - proving(WindowPoSt/WinningPoSt)
|
||||||
required: false
|
|
||||||
- label: lotus miner/market - storage deal
|
|
||||||
required: false
|
|
||||||
- label: lotus miner/market - retrieval deal
|
|
||||||
required: false
|
|
||||||
- label: lotus miner/market - data transfer
|
|
||||||
required: false
|
|
||||||
- label: lotus client
|
|
||||||
required: false
|
required: false
|
||||||
- label: lotus JSON-RPC API
|
- label: lotus JSON-RPC API
|
||||||
required: false
|
required: false
|
||||||
@@ -45,9 +31,17 @@ body:
|
|||||||
- type: textarea
|
- type: textarea
|
||||||
id: request
|
id: request
|
||||||
attributes:
|
attributes:
|
||||||
label: Improvement Suggestion
|
label: Enhancement Suggestion
|
||||||
description: A clear and concise description of what the motivation or the current problem is and what is the suggested improvement?
|
description: A clear and concise description of the suggested enhancement?
|
||||||
placeholder: Ex. Currently lotus... However, as a storage provider, I'd like...
|
placeholder: Ex. Currently lotus... However it would be great if [enhancement] was implemented... With the ability to...
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: request
|
||||||
|
attributes:
|
||||||
|
label: Use-Case
|
||||||
|
description: How would this enhancement help you?
|
||||||
|
placeholder: Ex. With the [enhancement] node operators would be able to... For Storage Providers it would enable...
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
|
|||||||
@@ -7,8 +7,6 @@ body:
|
|||||||
label: Checklist
|
label: Checklist
|
||||||
description: Please check off the following boxes before continuing to create a new feature request!
|
description: Please check off the following boxes before continuing to create a new feature request!
|
||||||
options:
|
options:
|
||||||
- label: This is **not** a new feature or an enhancement to the Filecoin protocol. If it is, please open an [FIP issue](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0001.md).
|
|
||||||
required: true
|
|
||||||
- label: This is **not** brainstorming ideas. If you have an idea you'd like to discuss, please open a new discussion on [the lotus forum](https://github.com/filecoin-project/lotus/discussions/categories/ideas) and select the category as `Ideas`.
|
- label: This is **not** brainstorming ideas. If you have an idea you'd like to discuss, please open a new discussion on [the lotus forum](https://github.com/filecoin-project/lotus/discussions/categories/ideas) and select the category as `Ideas`.
|
||||||
required: true
|
required: true
|
||||||
- label: I **have** a specific, actionable, and well motivated feature request to propose.
|
- label: I **have** a specific, actionable, and well motivated feature request to propose.
|
||||||
@@ -20,19 +18,11 @@ body:
|
|||||||
options:
|
options:
|
||||||
- label: lotus daemon - chain sync
|
- label: lotus daemon - chain sync
|
||||||
required: false
|
required: false
|
||||||
- label: lotus miner - mining and block production
|
- label: lotus fvm/fevm - Lotus FVM and FEVM interactions
|
||||||
required: false
|
required: false
|
||||||
- label: lotus miner/worker - sealing
|
- label: lotus miner/worker - sealing
|
||||||
required: false
|
required: false
|
||||||
- label: lotus miner - proving(WindowPoSt)
|
- label: lotus miner - proving(WindowPoSt/WinningPoSt)
|
||||||
required: false
|
|
||||||
- label: lotus miner/market - storage deal
|
|
||||||
required: false
|
|
||||||
- label: lotus miner/market - retrieval deal
|
|
||||||
required: false
|
|
||||||
- label: lotus miner/market - data transfer
|
|
||||||
required: false
|
|
||||||
- label: lotus client
|
|
||||||
required: false
|
required: false
|
||||||
- label: lotus JSON-RPC API
|
- label: lotus JSON-RPC API
|
||||||
required: false
|
required: false
|
||||||
@@ -56,7 +46,7 @@ body:
|
|||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
- type: textarea
|
- type: textarea
|
||||||
id: alternates
|
id: alternatives
|
||||||
attributes:
|
attributes:
|
||||||
label: Describe alternatives you've considered
|
label: Describe alternatives you've considered
|
||||||
description: A clear and concise description of any alternative solutions or features you've considered.
|
description: A clear and concise description of any alternative solutions or features you've considered.
|
||||||
@@ -69,4 +59,3 @@ body:
|
|||||||
description: Add any other context, design docs or screenshots about the feature request here.
|
description: Add any other context, design docs or screenshots about the feature request here.
|
||||||
validations:
|
validations:
|
||||||
required: false
|
required: false
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,83 @@
|
|||||||
|
name: "Bug Report - developer/service provider"
|
||||||
|
description: "Bug report template about FEVM/FVM for developers/service providers"
|
||||||
|
labels: [need/triage, kind/bug, area/fevm]
|
||||||
|
body:
|
||||||
|
- type: checkboxes
|
||||||
|
attributes:
|
||||||
|
label: Checklist
|
||||||
|
description: Please check off the following boxes before continuing to file a bug report!
|
||||||
|
options:
|
||||||
|
- label: This is **not** a security-related bug/issue. If it is, please follow please follow the [security policy](https://github.com/filecoin-project/lotus/security/policy).
|
||||||
|
required: true
|
||||||
|
- label: I **have** searched on the [issue tracker](https://github.com/filecoin-project/lotus/issues) and the [lotus forum](https://github.com/filecoin-project/lotus/discussions), and there is no existing related issue or discussion.
|
||||||
|
required: true
|
||||||
|
- label: I did not make any code changes to lotus.
|
||||||
|
required: false
|
||||||
|
- type: checkboxes
|
||||||
|
attributes:
|
||||||
|
label: Lotus component
|
||||||
|
description: Please select the lotus component you are filing a bug for
|
||||||
|
options:
|
||||||
|
- label: lotus Ethereum RPC
|
||||||
|
required: false
|
||||||
|
- label: lotus FVM - Lotus FVM interactions
|
||||||
|
required: false
|
||||||
|
- label: FEVM tooling
|
||||||
|
required: false
|
||||||
|
- label: Other
|
||||||
|
required: false
|
||||||
|
- type: textarea
|
||||||
|
id: version
|
||||||
|
attributes:
|
||||||
|
label: Lotus Version
|
||||||
|
render: text
|
||||||
|
description: Enter the output of `lotus version` if applicable.
|
||||||
|
placeholder: |
|
||||||
|
e.g.
|
||||||
|
Daemon: 1.19.0+mainnet+git.64059ca87+api1.5.0
|
||||||
|
Local: lotus-miner version 1.19.0+mainnet+git.64059ca87
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: repro
|
||||||
|
attributes:
|
||||||
|
label: Repro Steps
|
||||||
|
description: "Steps to reproduce the behavior"
|
||||||
|
value: |
|
||||||
|
1. Run '...'
|
||||||
|
2. Do '...'
|
||||||
|
3. See error '...'
|
||||||
|
...
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: textarea
|
||||||
|
id: Description
|
||||||
|
attributes:
|
||||||
|
label: Describe the Bug
|
||||||
|
description: |
|
||||||
|
This is where you get to tell us what went wrong, when doing so, please try to provide a clear and concise description of the bug with all related information:
|
||||||
|
* What you were doing when you experienced the bug? What are you trying to build?
|
||||||
|
* Any *error* messages and logs you saw, *where* you saw them, and what you believe may have caused them (if you have any ideas).
|
||||||
|
* What is the expected behaviour? Links to the actual code?
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: toolingInfo
|
||||||
|
attributes:
|
||||||
|
label: Tooling
|
||||||
|
render: text
|
||||||
|
description: |
|
||||||
|
What kind of tooling are you using:
|
||||||
|
* Are you using ether.js, Alchemy, Hardhat, etc.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: extraInfo
|
||||||
|
attributes:
|
||||||
|
label: Configuration Options
|
||||||
|
render: text
|
||||||
|
description: |
|
||||||
|
Please provide your updated FEVM related configuration options, or custome enviroment variables related to Lotus FEVM
|
||||||
|
* lotus: use `lotus config updated` to get your configuration options, and copy the [FEVM] section
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
@@ -1,21 +1,23 @@
|
|||||||
## Related Issues
|
## Related Issues
|
||||||
<!-- link all issues that this PR might resolve/fix. If an issue doesn't exist, include a brief motivation for the change being made.-->
|
<!-- Link issues that this PR might resolve/fix. If an issue doesn't exist, include a brief motivation for the change being made -->
|
||||||
|
|
||||||
## Proposed Changes
|
## Proposed Changes
|
||||||
<!-- provide a clear list of the changes being made-->
|
<!-- A clear list of the changes being made -->
|
||||||
|
|
||||||
|
|
||||||
## Additional Info
|
## Additional Info
|
||||||
<!-- callouts, links to documentation, and etc-->
|
<!-- Callouts, links to documentation, and etc -->
|
||||||
|
|
||||||
## Checklist
|
## Checklist
|
||||||
|
|
||||||
Before you mark the PR ready for review, please make sure that:
|
Before you mark the PR ready for review, please make sure that:
|
||||||
- [ ] All commits have a clear commit message.
|
|
||||||
- [ ] The PR title is in the form of of `<PR type>: <area>: <change being made>`
|
- [ ] Commits have a clear commit message.
|
||||||
- example: ` fix: mempool: Introduce a cache for valid signatures`
|
- [ ] PR title is in the form of of `<PR type>: <area>: <change being made>`
|
||||||
- `PR type`: _fix_, _feat_, _INTERFACE BREAKING CHANGE_, _CONSENSUS BREAKING_, _build_, _chore_, _ci_, _docs_,_perf_, _refactor_, _revert_, _style_, _test_
|
- example: ` fix: mempool: Introduce a cache for valid signatures`
|
||||||
- `area`: _api_, _chain_, _state_, _vm_, _data transfer_, _market_, _mempool_, _message_, _block production_, _multisig_, _networking_, _paychan_, _proving_, _sealing_, _wallet_, _deps_
|
- `PR type`: fix, feat, build, chore, ci, docs, perf, refactor, revert, style, test
|
||||||
- [ ] This PR has tests for new functionality or change in behaviour
|
- `area`, e.g. api, chain, state, market, mempool, multisig, networking, paych, proving, sealing, wallet, deps
|
||||||
- [ ] If new user-facing features are introduced, clear usage guidelines and / or documentation updates should be included in https://lotus.filecoin.io or [Discussion Tutorials.](https://github.com/filecoin-project/lotus/discussions/categories/tutorials)
|
- [ ] New features have usage guidelines and / or documentation updates in
|
||||||
|
- [ ] [Lotus Documentation](https://lotus.filecoin.io)
|
||||||
|
- [ ] [Discussion Tutorials](https://github.com/filecoin-project/lotus/discussions/categories/tutorials)
|
||||||
|
- [ ] Tests exist for new functionality or change in behavior
|
||||||
- [ ] CI is green
|
- [ ] CI is green
|
||||||
|
|||||||
@@ -13,10 +13,14 @@ name: "CodeQL"
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [ master ]
|
branches:
|
||||||
|
- master
|
||||||
|
- 'release/*'
|
||||||
pull_request:
|
pull_request:
|
||||||
# The branches below must be a subset of the branches above
|
# The branches below must be a subset of the branches above
|
||||||
branches: [ master ]
|
branches:
|
||||||
|
- master
|
||||||
|
- 'release/*'
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
analyze:
|
analyze:
|
||||||
@@ -33,17 +37,17 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
- uses: actions/setup-go@v1
|
- uses: actions/setup-go@v3
|
||||||
with:
|
with:
|
||||||
go-version: '1.17.9'
|
go-version: '1.18.8'
|
||||||
|
|
||||||
# Initializes the CodeQL tools for scanning.
|
# Initializes the CodeQL tools for scanning.
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
uses: github/codeql-action/init@v1
|
uses: github/codeql-action/init@v2
|
||||||
with:
|
with:
|
||||||
languages: ${{ matrix.language }}
|
languages: go
|
||||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||||
# By default, queries listed here will override any specified in a config file.
|
# By default, queries listed here will override any specified in a config file.
|
||||||
# Prefix the list here with "+" to use these queries and those in the config file.
|
# Prefix the list here with "+" to use these queries and those in the config file.
|
||||||
@@ -52,7 +56,7 @@ jobs:
|
|||||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||||
# If this step fails, then you should remove it and run the build manually (see below)
|
# If this step fails, then you should remove it and run the build manually (see below)
|
||||||
- name: Autobuild
|
- name: Autobuild
|
||||||
uses: github/codeql-action/autobuild@v1
|
uses: github/codeql-action/autobuild@v2
|
||||||
|
|
||||||
# ℹ️ Command-line programs to run using the OS shell.
|
# ℹ️ Command-line programs to run using the OS shell.
|
||||||
# 📚 https://git.io/JvXDl
|
# 📚 https://git.io/JvXDl
|
||||||
@@ -66,4 +70,4 @@ jobs:
|
|||||||
# make release
|
# make release
|
||||||
|
|
||||||
- name: Perform CodeQL Analysis
|
- name: Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/analyze@v1
|
uses: github/codeql-action/analyze@v2
|
||||||
|
|||||||
+7
-6
@@ -1,6 +1,3 @@
|
|||||||
/AppDir
|
|
||||||
/appimage-builder-cache
|
|
||||||
*.AppImage
|
|
||||||
/lotus
|
/lotus
|
||||||
/lotus-miner
|
/lotus-miner
|
||||||
/lotus-worker
|
/lotus-worker
|
||||||
@@ -9,7 +6,6 @@
|
|||||||
/lotus-chainwatch
|
/lotus-chainwatch
|
||||||
/lotus-shed
|
/lotus-shed
|
||||||
/lotus-sim
|
/lotus-sim
|
||||||
/lotus-pond
|
|
||||||
/lotus-townhall
|
/lotus-townhall
|
||||||
/lotus-fountain
|
/lotus-fountain
|
||||||
/lotus-stats
|
/lotus-stats
|
||||||
@@ -21,8 +17,6 @@
|
|||||||
/docgen-md
|
/docgen-md
|
||||||
/docgen-openrpc
|
/docgen-openrpc
|
||||||
/bench.json
|
/bench.json
|
||||||
/lotuspond/front/node_modules
|
|
||||||
/lotuspond/front/build
|
|
||||||
/cmd/lotus-townhall/townhall/node_modules
|
/cmd/lotus-townhall/townhall/node_modules
|
||||||
/cmd/lotus-townhall/townhall/build
|
/cmd/lotus-townhall/townhall/build
|
||||||
/cmd/lotus-townhall/townhall/package-lock.json
|
/cmd/lotus-townhall/townhall/package-lock.json
|
||||||
@@ -51,3 +45,10 @@ scratchpad
|
|||||||
|
|
||||||
build/builtin-actors/v*
|
build/builtin-actors/v*
|
||||||
build/builtin-actors/*.car
|
build/builtin-actors/*.car
|
||||||
|
|
||||||
|
dist/
|
||||||
|
|
||||||
|
|
||||||
|
# The following files are checked into git and result
|
||||||
|
# in dirty git state if removed from the docker context
|
||||||
|
!extern/filecoin-ffi/rust/filecoin.pc
|
||||||
|
|||||||
@@ -43,9 +43,6 @@ issues:
|
|||||||
|
|
||||||
exclude-use-default: false
|
exclude-use-default: false
|
||||||
exclude-rules:
|
exclude-rules:
|
||||||
- path: lotuspond
|
|
||||||
linters:
|
|
||||||
- errcheck
|
|
||||||
|
|
||||||
- path: node/modules/lp2p
|
- path: node/modules/lp2p
|
||||||
linters:
|
linters:
|
||||||
|
|||||||
@@ -0,0 +1,109 @@
|
|||||||
|
project_name: lotus
|
||||||
|
|
||||||
|
universal_binaries:
|
||||||
|
- id: lotus
|
||||||
|
replace: true
|
||||||
|
name_template: lotus
|
||||||
|
- id: lotus-miner
|
||||||
|
replace: true
|
||||||
|
name_template: lotus-miner
|
||||||
|
- id: lotus-worker
|
||||||
|
replace: true
|
||||||
|
name_template: lotus-worker
|
||||||
|
|
||||||
|
builds:
|
||||||
|
- id: lotus
|
||||||
|
binary: lotus
|
||||||
|
builder: prebuilt
|
||||||
|
goos:
|
||||||
|
- darwin
|
||||||
|
- linux
|
||||||
|
goarch:
|
||||||
|
- amd64
|
||||||
|
- arm64
|
||||||
|
goamd64:
|
||||||
|
- v1
|
||||||
|
ignore:
|
||||||
|
- goos: linux
|
||||||
|
goarch: arm64
|
||||||
|
prebuilt:
|
||||||
|
path: /tmp/workspace/{{ .Os }}_{{ .Arch }}{{ with .Amd64 }}_{{ . }}{{ end }}/lotus
|
||||||
|
- id: lotus-miner
|
||||||
|
binary: lotus-miner
|
||||||
|
builder: prebuilt
|
||||||
|
goos:
|
||||||
|
- darwin
|
||||||
|
- linux
|
||||||
|
goarch:
|
||||||
|
- amd64
|
||||||
|
- arm64
|
||||||
|
goamd64:
|
||||||
|
- v1
|
||||||
|
ignore:
|
||||||
|
- goos: linux
|
||||||
|
goarch: arm64
|
||||||
|
prebuilt:
|
||||||
|
path: /tmp/workspace/{{ .Os }}_{{ .Arch }}{{ with .Amd64 }}_{{ . }}{{ end }}/lotus-miner
|
||||||
|
- id: lotus-worker
|
||||||
|
binary: lotus-worker
|
||||||
|
builder: prebuilt
|
||||||
|
goos:
|
||||||
|
- darwin
|
||||||
|
- linux
|
||||||
|
goarch:
|
||||||
|
- amd64
|
||||||
|
- arm64
|
||||||
|
goamd64:
|
||||||
|
- v1
|
||||||
|
ignore:
|
||||||
|
- goos: linux
|
||||||
|
goarch: arm64
|
||||||
|
prebuilt:
|
||||||
|
path: /tmp/workspace/{{ .Os }}_{{ .Arch }}{{ with .Amd64 }}_{{ . }}{{ end }}/lotus-worker
|
||||||
|
|
||||||
|
archives:
|
||||||
|
- id: primary
|
||||||
|
format: tar.gz
|
||||||
|
wrap_in_directory: true
|
||||||
|
name_template: "{{ .ProjectName }}_v{{ .Version }}_{{ .Os }}_{{ .Arch }}"
|
||||||
|
files:
|
||||||
|
# this is a dumb but required hack so it doesn't include the default files
|
||||||
|
# https://github.com/goreleaser/goreleaser/issues/602
|
||||||
|
- _n_o_n_e_*
|
||||||
|
|
||||||
|
release:
|
||||||
|
github:
|
||||||
|
owner: filecoin-project
|
||||||
|
name: lotus
|
||||||
|
prerelease: auto
|
||||||
|
name_template: "v{{.Version}}"
|
||||||
|
|
||||||
|
brews:
|
||||||
|
- tap:
|
||||||
|
owner: filecoin-project
|
||||||
|
name: homebrew-lotus
|
||||||
|
branch: master
|
||||||
|
ids:
|
||||||
|
- primary
|
||||||
|
install: |
|
||||||
|
bin.install "lotus"
|
||||||
|
bin.install "lotus-miner"
|
||||||
|
bin.install "lotus-worker"
|
||||||
|
test: |
|
||||||
|
system "#{bin}/lotus --version"
|
||||||
|
system "#{bin}/lotus-miner --version"
|
||||||
|
system "#{bin}/lotus-worker --version"
|
||||||
|
folder: Formula
|
||||||
|
homepage: "https://filecoin.io"
|
||||||
|
description: "A homebrew cask for installing filecoin-project/lotus on MacOS"
|
||||||
|
license: MIT
|
||||||
|
skip_upload: auto
|
||||||
|
dependencies:
|
||||||
|
- name: hwloc
|
||||||
|
|
||||||
|
# produced manually so we can include cid checksums
|
||||||
|
checksum:
|
||||||
|
disable: true
|
||||||
|
|
||||||
|
snapshot:
|
||||||
|
name_template: "{{ .Version }}"
|
||||||
@@ -1 +0,0 @@
|
|||||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0" y="0" viewBox="0 0 127 127" xml:space="preserve" enable-background="new 0 0 127 127"><style type="text/css">.st0{fill:#00d2d6}.st1{fill:#fff}</style><g><path class="st0" d="M63.5,127C28.5,127.1-0.2,98.4,0,63.2C0.2,28.3,28.6-0.2,63.9,0c34.8,0.2,63.3,28.7,63.1,64 C126.7,98.7,98.5,127.1,63.5,127z M71.4,57.6c5.5,0.8,11,1.5,16.5,2.3c0.5-1.7,0.9-3.1,1.3-4.7c-5.7-0.8-11.2-1.7-17.1-2.5 c2-7,3.7-13.7,5.8-20.2c0.7-2.2,2.3-4.2,3.9-5.9c2.1-2.2,5-1.7,6.8,0.7c0.7,1,1.4,2.1,2.3,2.9c1.1,1.1,2.8,1.6,4,0.6 c0.8-0.7,0.7-2.4,0.8-3.6c0-0.5-0.6-1.1-1-1.6c-2-2.3-4.7-3.1-7.5-3.2c-6.3-0.3-10.9,3-14.5,7.8c-3.5,4.8-5.1,10.5-6.8,16.2 c-0.5,1.6-0.9,3.3-1.4,5.1c-6.2-0.9-12.1-1.7-18.2-2.6c-0.2,1.6-0.4,3.2-0.6,4.8c6,0.9,11.8,1.8,17.8,2.7c-0.8,3.4-1.5,6.5-2.3,9.7 c-5.8-0.8-11.4-1.6-17-2.4c-0.2,1.8-0.4,3.2-0.6,4.8c5.6,0.9,11,1.7,16.5,2.5c0,0.6,0.1,1,0,1.3c-1.7,7.4-3.4,14.8-5.3,22.2 c-0.9,3.5-2.4,6.9-5.3,9.3c-2.4,2-5,1.7-6.8-0.8c-0.8-1.1-1.5-2.5-2.6-3.3c-0.8-0.6-2.5-0.9-3.1-0.5c-0.9,0.7-1.5,2.2-1.4,3.3 c0.1,1,1,2.2,1.9,2.8c3,2.3,6.5,2.6,10,1.9c5.9-1.2,10.1-4.9,12.7-10.1c2-4.1,3.6-8.5,5-12.9c1.3-4,2.2-8,3.3-12.2 c5.8,0.8,11.5,1.7,17.3,2.5c0.5-1.7,0.9-3.2,1.4-4.8c-6.1-0.9-11.9-1.7-17.7-2.6C70.1,64,70.7,60.9,71.4,57.6z"/><path class="st1" d="M71.4,57.6c-0.7,3.3-1.3,6.4-2,9.8c5.9,0.9,11.7,1.7,17.7,2.6c-0.5,1.6-0.9,3.1-1.4,4.8 c-5.8-0.8-11.5-1.7-17.3-2.5c-1.1,4.2-2,8.3-3.3,12.2c-1.4,4.4-3,8.7-5,12.9c-2.6,5.2-6.8,8.9-12.7,10.1c-3.5,0.7-7,0.4-10-1.9 c-0.9-0.7-1.8-1.8-1.9-2.8c-0.1-1.1,0.5-2.7,1.4-3.3c0.6-0.5,2.3-0.1,3.1,0.5c1.1,0.8,1.8,2.1,2.6,3.3c1.8,2.5,4.4,2.9,6.8,0.8 c2.9-2.5,4.4-5.8,5.3-9.3c1.9-7.3,3.6-14.8,5.3-22.2c0.1-0.3,0-0.7,0-1.3c-5.4-0.8-10.8-1.7-16.5-2.5c0.2-1.6,0.4-3,0.6-4.8 c5.6,0.8,11.1,1.6,17,2.4c0.8-3.2,1.5-6.4,2.3-9.7c-6-0.9-11.7-1.8-17.8-2.7c0.2-1.6,0.4-3.2,0.6-4.8c6.1,0.9,12,1.7,18.2,2.6 c0.5-1.8,0.9-3.5,1.4-5.1c1.7-5.6,3.2-11.3,6.8-16.2c3.6-4.9,8.1-8.1,14.5-7.8c2.8,0.1,5.5,0.9,7.5,3.2c0.4,0.5,1,1.1,1,1.6 c-0.1,1.2,0,2.9-0.8,3.6c-1.1,1.1-2.8,0.5-4-0.6c-0.9-0.9-1.6-1.9-2.3-2.9c-1.8-2.4-4.7-2.9-6.8-0.7c-1.6,1.7-3.2,3.7-3.9,5.9 C75.7,39.4,74,46,72,53c5.9,0.9,11.4,1.7,17.1,2.5c-0.5,1.6-0.9,3.1-1.3,4.7C82.3,59.1,76.9,58.3,71.4,57.6z"/></g></svg>
|
|
||||||
|
Before Width: | Height: | Size: 2.2 KiB |
@@ -1,71 +0,0 @@
|
|||||||
version: 1
|
|
||||||
AppDir:
|
|
||||||
path: ./AppDir
|
|
||||||
app_info:
|
|
||||||
id: io.filecoin.lotus
|
|
||||||
name: Lotus
|
|
||||||
icon: icon
|
|
||||||
version: latest
|
|
||||||
exec: usr/bin/lotus
|
|
||||||
exec_args: $@
|
|
||||||
apt:
|
|
||||||
arch: amd64
|
|
||||||
allow_unauthenticated: true
|
|
||||||
sources:
|
|
||||||
- sourceline: deb http://archive.ubuntu.com/ubuntu/ focal main restricted
|
|
||||||
- sourceline: deb http://archive.ubuntu.com/ubuntu/ focal-updates main restricted
|
|
||||||
- sourceline: deb http://archive.ubuntu.com/ubuntu/ focal universe
|
|
||||||
- sourceline: deb http://archive.ubuntu.com/ubuntu/ focal-updates universe
|
|
||||||
- sourceline: deb http://archive.ubuntu.com/ubuntu/ focal multiverse
|
|
||||||
- sourceline: deb http://archive.ubuntu.com/ubuntu/ focal-updates multiverse
|
|
||||||
- sourceline: deb http://archive.ubuntu.com/ubuntu/ focal-backports main restricted
|
|
||||||
universe multiverse
|
|
||||||
- sourceline: deb http://security.ubuntu.com/ubuntu focal-security main restricted
|
|
||||||
- sourceline: deb http://security.ubuntu.com/ubuntu focal-security universe
|
|
||||||
- sourceline: deb http://security.ubuntu.com/ubuntu focal-security multiverse
|
|
||||||
- sourceline: deb https://cli-assets.heroku.com/apt ./
|
|
||||||
- sourceline: deb http://ppa.launchpad.net/openjdk-r/ppa/ubuntu focal main
|
|
||||||
- sourceline: deb http://ppa.launchpad.net/git-core/ppa/ubuntu focal main
|
|
||||||
- sourceline: deb http://archive.canonical.com/ubuntu focal partner
|
|
||||||
include:
|
|
||||||
- ocl-icd-libopencl1
|
|
||||||
- libhwloc15
|
|
||||||
exclude: []
|
|
||||||
files:
|
|
||||||
include:
|
|
||||||
- /usr/lib/x86_64-linux-gnu/libgcc_s.so.1
|
|
||||||
- /usr/lib/x86_64-linux-gnu/libpthread-2.31.so
|
|
||||||
- /usr/lib/x86_64-linux-gnu/libm-2.31.so
|
|
||||||
- /usr/lib/x86_64-linux-gnu/libdl-2.31.so
|
|
||||||
- /usr/lib/x86_64-linux-gnu/libc-2.31.so
|
|
||||||
- /usr/lib/x86_64-linux-gnu/libudev.so.1.6.17
|
|
||||||
exclude:
|
|
||||||
- usr/share/man
|
|
||||||
- usr/share/doc/*/README.*
|
|
||||||
- usr/share/doc/*/changelog.*
|
|
||||||
- usr/share/doc/*/NEWS.*
|
|
||||||
- usr/share/doc/*/TODO.*
|
|
||||||
test:
|
|
||||||
fedora:
|
|
||||||
image: appimagecrafters/tests-env:fedora-30
|
|
||||||
command: ./AppRun
|
|
||||||
use_host_x: false
|
|
||||||
debian:
|
|
||||||
image: appimagecrafters/tests-env:debian-stable
|
|
||||||
command: ./AppRun
|
|
||||||
use_host_x: false
|
|
||||||
arch:
|
|
||||||
image: appimagecrafters/tests-env:archlinux-latest
|
|
||||||
command: ./AppRun
|
|
||||||
use_host_x: false
|
|
||||||
centos:
|
|
||||||
image: appimagecrafters/tests-env:centos-7
|
|
||||||
command: ./AppRun
|
|
||||||
use_host_x: false
|
|
||||||
ubuntu:
|
|
||||||
image: appimagecrafters/tests-env:ubuntu-xenial
|
|
||||||
command: ./AppRun
|
|
||||||
use_host_x: false
|
|
||||||
AppImage:
|
|
||||||
arch: x86_64
|
|
||||||
|
|
||||||
+1316
-13
File diff suppressed because it is too large
Load Diff
+136
@@ -0,0 +1,136 @@
|
|||||||
|
#####################################
|
||||||
|
FROM golang:1.19.7-buster AS lotus-builder
|
||||||
|
MAINTAINER Lotus Development Team
|
||||||
|
|
||||||
|
RUN apt-get update && apt-get install -y ca-certificates build-essential clang ocl-icd-opencl-dev ocl-icd-libopencl1 jq libhwloc-dev
|
||||||
|
|
||||||
|
ENV XDG_CACHE_HOME="/tmp"
|
||||||
|
|
||||||
|
### taken from https://github.com/rust-lang/docker-rust/blob/master/1.63.0/buster/Dockerfile
|
||||||
|
ENV RUSTUP_HOME=/usr/local/rustup \
|
||||||
|
CARGO_HOME=/usr/local/cargo \
|
||||||
|
PATH=/usr/local/cargo/bin:$PATH \
|
||||||
|
RUST_VERSION=1.63.0
|
||||||
|
|
||||||
|
RUN set -eux; \
|
||||||
|
dpkgArch="$(dpkg --print-architecture)"; \
|
||||||
|
case "${dpkgArch##*-}" in \
|
||||||
|
amd64) rustArch='x86_64-unknown-linux-gnu'; rustupSha256='5cc9ffd1026e82e7fb2eec2121ad71f4b0f044e88bca39207b3f6b769aaa799c' ;; \
|
||||||
|
arm64) rustArch='aarch64-unknown-linux-gnu'; rustupSha256='e189948e396d47254103a49c987e7fb0e5dd8e34b200aa4481ecc4b8e41fb929' ;; \
|
||||||
|
*) echo >&2 "unsupported architecture: ${dpkgArch}"; exit 1 ;; \
|
||||||
|
esac; \
|
||||||
|
url="https://static.rust-lang.org/rustup/archive/1.25.1/${rustArch}/rustup-init"; \
|
||||||
|
wget "$url"; \
|
||||||
|
echo "${rustupSha256} *rustup-init" | sha256sum -c -; \
|
||||||
|
chmod +x rustup-init; \
|
||||||
|
./rustup-init -y --no-modify-path --profile minimal --default-toolchain $RUST_VERSION --default-host ${rustArch}; \
|
||||||
|
rm rustup-init; \
|
||||||
|
chmod -R a+w $RUSTUP_HOME $CARGO_HOME; \
|
||||||
|
rustup --version; \
|
||||||
|
cargo --version; \
|
||||||
|
rustc --version;
|
||||||
|
|
||||||
|
COPY ./ /opt/filecoin
|
||||||
|
WORKDIR /opt/filecoin
|
||||||
|
|
||||||
|
RUN scripts/docker-git-state-check.sh
|
||||||
|
|
||||||
|
### make configurable filecoin-ffi build
|
||||||
|
ARG FFI_BUILD_FROM_SOURCE=0
|
||||||
|
ENV FFI_BUILD_FROM_SOURCE=${FFI_BUILD_FROM_SOURCE}
|
||||||
|
|
||||||
|
RUN make clean deps
|
||||||
|
|
||||||
|
ARG RUSTFLAGS=""
|
||||||
|
ARG GOFLAGS=""
|
||||||
|
|
||||||
|
RUN make buildall
|
||||||
|
|
||||||
|
#####################################
|
||||||
|
FROM ubuntu:20.04 AS lotus-base
|
||||||
|
MAINTAINER Lotus Development Team
|
||||||
|
|
||||||
|
# Base resources
|
||||||
|
COPY --from=lotus-builder /etc/ssl/certs /etc/ssl/certs
|
||||||
|
COPY --from=lotus-builder /lib/*/libdl.so.2 /lib/
|
||||||
|
COPY --from=lotus-builder /lib/*/librt.so.1 /lib/
|
||||||
|
COPY --from=lotus-builder /lib/*/libgcc_s.so.1 /lib/
|
||||||
|
COPY --from=lotus-builder /lib/*/libutil.so.1 /lib/
|
||||||
|
COPY --from=lotus-builder /usr/lib/*/libltdl.so.7 /lib/
|
||||||
|
COPY --from=lotus-builder /usr/lib/*/libnuma.so.1 /lib/
|
||||||
|
COPY --from=lotus-builder /usr/lib/*/libhwloc.so.5 /lib/
|
||||||
|
COPY --from=lotus-builder /usr/lib/*/libOpenCL.so.1 /lib/
|
||||||
|
|
||||||
|
RUN useradd -r -u 532 -U fc \
|
||||||
|
&& mkdir -p /etc/OpenCL/vendors \
|
||||||
|
&& echo "libnvidia-opencl.so.1" > /etc/OpenCL/vendors/nvidia.icd
|
||||||
|
|
||||||
|
#####################################
|
||||||
|
FROM lotus-base AS lotus
|
||||||
|
MAINTAINER Lotus Development Team
|
||||||
|
|
||||||
|
COPY --from=lotus-builder /opt/filecoin/lotus /usr/local/bin/
|
||||||
|
COPY --from=lotus-builder /opt/filecoin/lotus-shed /usr/local/bin/
|
||||||
|
COPY scripts/docker-lotus-entrypoint.sh /
|
||||||
|
|
||||||
|
ARG DOCKER_LOTUS_IMPORT_SNAPSHOT https://snapshots.mainnet.filops.net/minimal/latest
|
||||||
|
ENV DOCKER_LOTUS_IMPORT_SNAPSHOT ${DOCKER_LOTUS_IMPORT_SNAPSHOT}
|
||||||
|
ENV FILECOIN_PARAMETER_CACHE /var/tmp/filecoin-proof-parameters
|
||||||
|
ENV LOTUS_PATH /var/lib/lotus
|
||||||
|
ENV DOCKER_LOTUS_IMPORT_WALLET ""
|
||||||
|
|
||||||
|
RUN mkdir /var/lib/lotus /var/tmp/filecoin-proof-parameters
|
||||||
|
RUN chown fc: /var/lib/lotus /var/tmp/filecoin-proof-parameters
|
||||||
|
|
||||||
|
VOLUME /var/lib/lotus
|
||||||
|
VOLUME /var/tmp/filecoin-proof-parameters
|
||||||
|
|
||||||
|
USER fc
|
||||||
|
|
||||||
|
EXPOSE 1234
|
||||||
|
|
||||||
|
ENTRYPOINT ["/docker-lotus-entrypoint.sh"]
|
||||||
|
|
||||||
|
CMD ["-help"]
|
||||||
|
|
||||||
|
#####################################
|
||||||
|
FROM lotus-base AS lotus-all-in-one
|
||||||
|
|
||||||
|
ENV FILECOIN_PARAMETER_CACHE /var/tmp/filecoin-proof-parameters
|
||||||
|
ENV LOTUS_MINER_PATH /var/lib/lotus-miner
|
||||||
|
ENV LOTUS_PATH /var/lib/lotus
|
||||||
|
ENV LOTUS_WORKER_PATH /var/lib/lotus-worker
|
||||||
|
ENV WALLET_PATH /var/lib/lotus-wallet
|
||||||
|
|
||||||
|
COPY --from=lotus-builder /opt/filecoin/lotus /usr/local/bin/
|
||||||
|
COPY --from=lotus-builder /opt/filecoin/lotus-seed /usr/local/bin/
|
||||||
|
COPY --from=lotus-builder /opt/filecoin/lotus-shed /usr/local/bin/
|
||||||
|
COPY --from=lotus-builder /opt/filecoin/lotus-wallet /usr/local/bin/
|
||||||
|
COPY --from=lotus-builder /opt/filecoin/lotus-gateway /usr/local/bin/
|
||||||
|
COPY --from=lotus-builder /opt/filecoin/lotus-miner /usr/local/bin/
|
||||||
|
COPY --from=lotus-builder /opt/filecoin/lotus-worker /usr/local/bin/
|
||||||
|
COPY --from=lotus-builder /opt/filecoin/lotus-stats /usr/local/bin/
|
||||||
|
COPY --from=lotus-builder /opt/filecoin/lotus-fountain /usr/local/bin/
|
||||||
|
|
||||||
|
RUN mkdir /var/tmp/filecoin-proof-parameters
|
||||||
|
RUN mkdir /var/lib/lotus
|
||||||
|
RUN mkdir /var/lib/lotus-miner
|
||||||
|
RUN mkdir /var/lib/lotus-worker
|
||||||
|
RUN mkdir /var/lib/lotus-wallet
|
||||||
|
RUN chown fc: /var/tmp/filecoin-proof-parameters
|
||||||
|
RUN chown fc: /var/lib/lotus
|
||||||
|
RUN chown fc: /var/lib/lotus-miner
|
||||||
|
RUN chown fc: /var/lib/lotus-worker
|
||||||
|
RUN chown fc: /var/lib/lotus-wallet
|
||||||
|
|
||||||
|
|
||||||
|
VOLUME /var/tmp/filecoin-proof-parameters
|
||||||
|
VOLUME /var/lib/lotus
|
||||||
|
VOLUME /var/lib/lotus-miner
|
||||||
|
VOLUME /var/lib/lotus-worker
|
||||||
|
VOLUME /var/lib/lotus-wallet
|
||||||
|
|
||||||
|
EXPOSE 1234
|
||||||
|
EXPOSE 2345
|
||||||
|
EXPOSE 3456
|
||||||
|
EXPOSE 1777
|
||||||
+31
-14
@@ -1,30 +1,47 @@
|
|||||||
FROM golang:1.17.9-buster AS builder-deps
|
##### DEPRECATED
|
||||||
|
|
||||||
|
FROM golang:1.19.7-buster AS builder-deps
|
||||||
MAINTAINER Lotus Development Team
|
MAINTAINER Lotus Development Team
|
||||||
|
|
||||||
RUN apt-get update && apt-get install -y ca-certificates build-essential clang ocl-icd-opencl-dev ocl-icd-libopencl1 jq libhwloc-dev
|
RUN apt-get update && apt-get install -y ca-certificates build-essential clang ocl-icd-opencl-dev ocl-icd-libopencl1 jq libhwloc-dev
|
||||||
|
|
||||||
ARG RUST_VERSION=nightly
|
|
||||||
ENV XDG_CACHE_HOME="/tmp"
|
ENV XDG_CACHE_HOME="/tmp"
|
||||||
|
|
||||||
|
### taken from https://github.com/rust-lang/docker-rust/blob/master/1.63.0/buster/Dockerfile
|
||||||
ENV RUSTUP_HOME=/usr/local/rustup \
|
ENV RUSTUP_HOME=/usr/local/rustup \
|
||||||
CARGO_HOME=/usr/local/cargo \
|
CARGO_HOME=/usr/local/cargo \
|
||||||
PATH=/usr/local/cargo/bin:$PATH
|
PATH=/usr/local/cargo/bin:$PATH \
|
||||||
|
RUST_VERSION=1.63.0
|
||||||
|
|
||||||
RUN wget "https://static.rust-lang.org/rustup/dist/x86_64-unknown-linux-gnu/rustup-init"; \
|
RUN set -eux; \
|
||||||
|
dpkgArch="$(dpkg --print-architecture)"; \
|
||||||
|
case "${dpkgArch##*-}" in \
|
||||||
|
amd64) rustArch='x86_64-unknown-linux-gnu'; rustupSha256='5cc9ffd1026e82e7fb2eec2121ad71f4b0f044e88bca39207b3f6b769aaa799c' ;; \
|
||||||
|
arm64) rustArch='aarch64-unknown-linux-gnu'; rustupSha256='e189948e396d47254103a49c987e7fb0e5dd8e34b200aa4481ecc4b8e41fb929' ;; \
|
||||||
|
*) echo >&2 "unsupported architecture: ${dpkgArch}"; exit 1 ;; \
|
||||||
|
esac; \
|
||||||
|
url="https://static.rust-lang.org/rustup/archive/1.25.1/${rustArch}/rustup-init"; \
|
||||||
|
wget "$url"; \
|
||||||
|
echo "${rustupSha256} *rustup-init" | sha256sum -c -; \
|
||||||
chmod +x rustup-init; \
|
chmod +x rustup-init; \
|
||||||
./rustup-init -y --no-modify-path --profile minimal --default-toolchain $RUST_VERSION; \
|
./rustup-init -y --no-modify-path --profile minimal --default-toolchain $RUST_VERSION --default-host ${rustArch}; \
|
||||||
rm rustup-init; \
|
rm rustup-init; \
|
||||||
chmod -R a+w $RUSTUP_HOME $CARGO_HOME; \
|
chmod -R a+w $RUSTUP_HOME $CARGO_HOME; \
|
||||||
rustup --version; \
|
rustup --version; \
|
||||||
cargo --version; \
|
cargo --version; \
|
||||||
rustc --version;
|
rustc --version;
|
||||||
|
### end rust
|
||||||
|
|
||||||
FROM builder-deps AS builder-local
|
FROM builder-deps AS builder-local
|
||||||
MAINTAINER Lotus Development Team
|
MAINTAINER Lotus Development Team
|
||||||
|
|
||||||
COPY ./ /opt/filecoin
|
COPY ./ /opt/filecoin
|
||||||
WORKDIR /opt/filecoin
|
WORKDIR /opt/filecoin
|
||||||
|
|
||||||
|
### make configurable filecoin-ffi build
|
||||||
|
ARG FFI_BUILD_FROM_SOURCE=0
|
||||||
|
ENV FFI_BUILD_FROM_SOURCE=${FFI_BUILD_FROM_SOURCE}
|
||||||
|
|
||||||
RUN make clean deps
|
RUN make clean deps
|
||||||
|
|
||||||
|
|
||||||
@@ -52,14 +69,14 @@ MAINTAINER Lotus Development Team
|
|||||||
|
|
||||||
# Base resources
|
# Base resources
|
||||||
COPY --from=builder /etc/ssl/certs /etc/ssl/certs
|
COPY --from=builder /etc/ssl/certs /etc/ssl/certs
|
||||||
COPY --from=builder /lib/x86_64-linux-gnu/libdl.so.2 /lib/
|
COPY --from=builder /lib/*/libdl.so.2 /lib/
|
||||||
COPY --from=builder /lib/x86_64-linux-gnu/librt.so.1 /lib/
|
COPY --from=builder /lib/*/librt.so.1 /lib/
|
||||||
COPY --from=builder /lib/x86_64-linux-gnu/libgcc_s.so.1 /lib/
|
COPY --from=builder /lib/*/libgcc_s.so.1 /lib/
|
||||||
COPY --from=builder /lib/x86_64-linux-gnu/libutil.so.1 /lib/
|
COPY --from=builder /lib/*/libutil.so.1 /lib/
|
||||||
COPY --from=builder /usr/lib/x86_64-linux-gnu/libltdl.so.7 /lib/
|
COPY --from=builder /usr/lib/*/libltdl.so.7 /lib/
|
||||||
COPY --from=builder /usr/lib/x86_64-linux-gnu/libnuma.so.1 /lib/
|
COPY --from=builder /usr/lib/*/libnuma.so.1 /lib/
|
||||||
COPY --from=builder /usr/lib/x86_64-linux-gnu/libhwloc.so.5 /lib/
|
COPY --from=builder /usr/lib/*/libhwloc.so.5 /lib/
|
||||||
COPY --from=builder /usr/lib/x86_64-linux-gnu/libOpenCL.so.1 /lib/
|
COPY --from=builder /usr/lib/*/libOpenCL.so.1 /lib/
|
||||||
|
|
||||||
RUN useradd -r -u 532 -U fc \
|
RUN useradd -r -u 532 -U fc \
|
||||||
&& mkdir -p /etc/OpenCL/vendors \
|
&& mkdir -p /etc/OpenCL/vendors \
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
1.19.7
|
||||||
@@ -8,9 +8,11 @@ unexport GOFLAGS
|
|||||||
GOCC?=go
|
GOCC?=go
|
||||||
|
|
||||||
GOVERSION:=$(shell $(GOCC) version | tr ' ' '\n' | grep go1 | sed 's/^go//' | awk -F. '{printf "%d%03d%03d", $$1, $$2, $$3}')
|
GOVERSION:=$(shell $(GOCC) version | tr ' ' '\n' | grep go1 | sed 's/^go//' | awk -F. '{printf "%d%03d%03d", $$1, $$2, $$3}')
|
||||||
ifeq ($(shell expr $(GOVERSION) \< 1016000), 1)
|
GOVERSIONMIN:=$(shell cat GO_VERSION_MIN | awk -F. '{printf "%d%03d%03d", $$1, $$2, $$3}')
|
||||||
|
|
||||||
|
ifeq ($(shell expr $(GOVERSION) \< $(GOVERSIONMIN)), 1)
|
||||||
$(warning Your Golang version is go$(shell expr $(GOVERSION) / 1000000).$(shell expr $(GOVERSION) % 1000000 / 1000).$(shell expr $(GOVERSION) % 1000))
|
$(warning Your Golang version is go$(shell expr $(GOVERSION) / 1000000).$(shell expr $(GOVERSION) % 1000000 / 1000).$(shell expr $(GOVERSION) % 1000))
|
||||||
$(error Update Golang to version to at least 1.17.9)
|
$(error Update Golang to version to at least $(shell cat GO_VERSION_MIN))
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# git modules that need to be loaded
|
# git modules that need to be loaded
|
||||||
@@ -64,7 +66,7 @@ CLEAN+=build/.update-modules
|
|||||||
deps: $(BUILD_DEPS)
|
deps: $(BUILD_DEPS)
|
||||||
.PHONY: deps
|
.PHONY: deps
|
||||||
|
|
||||||
build-devnets: build lotus-seed lotus-shed lotus-wallet lotus-gateway lotus-fountain lotus-stats
|
build-devnets: build lotus-seed lotus-shed
|
||||||
.PHONY: build-devnets
|
.PHONY: build-devnets
|
||||||
|
|
||||||
debug: GOFLAGS+=-tags=debug
|
debug: GOFLAGS+=-tags=debug
|
||||||
@@ -160,22 +162,10 @@ benchmarks:
|
|||||||
@curl -X POST 'http://benchmark.kittyhawk.wtf/benchmark' -d '@bench.json' -u "${benchmark_http_cred}"
|
@curl -X POST 'http://benchmark.kittyhawk.wtf/benchmark' -d '@bench.json' -u "${benchmark_http_cred}"
|
||||||
.PHONY: benchmarks
|
.PHONY: benchmarks
|
||||||
|
|
||||||
lotus-pond: 2k
|
|
||||||
$(GOCC) build -o lotus-pond ./lotuspond
|
|
||||||
.PHONY: lotus-pond
|
|
||||||
BINS+=lotus-pond
|
|
||||||
|
|
||||||
lotus-pond-front:
|
|
||||||
(cd lotuspond/front && npm i && CI=false npm run build)
|
|
||||||
.PHONY: lotus-pond-front
|
|
||||||
|
|
||||||
lotus-pond-app: lotus-pond-front lotus-pond
|
|
||||||
.PHONY: lotus-pond-app
|
|
||||||
|
|
||||||
lotus-fountain:
|
lotus-fountain:
|
||||||
rm -f lotus-fountain
|
rm -f lotus-fountain
|
||||||
go build $(GOFLAGS) -o lotus-fountain ./cmd/lotus-fountain
|
$(GOCC) build $(GOFLAGS) -o lotus-fountain ./cmd/lotus-fountain
|
||||||
go run github.com/GeertJohan/go.rice/rice append --exec lotus-fountain -i ./cmd/lotus-fountain -i ./build
|
$(GOCC) run github.com/GeertJohan/go.rice/rice append --exec lotus-fountain -i ./cmd/lotus-fountain -i ./build
|
||||||
.PHONY: lotus-fountain
|
.PHONY: lotus-fountain
|
||||||
BINS+=lotus-fountain
|
BINS+=lotus-fountain
|
||||||
|
|
||||||
@@ -299,16 +289,16 @@ type-gen: api-gen
|
|||||||
$(GOCC) generate -x ./...
|
$(GOCC) generate -x ./...
|
||||||
goimports -w api/
|
goimports -w api/
|
||||||
|
|
||||||
method-gen: api-gen
|
actors-code-gen:
|
||||||
(cd ./lotuspond/front/src/chain && $(GOCC) run ./methodgen.go)
|
|
||||||
|
|
||||||
actors-gen:
|
|
||||||
$(GOCC) run ./gen/inline-gen . gen/inlinegen-data.json
|
$(GOCC) run ./gen/inline-gen . gen/inlinegen-data.json
|
||||||
$(GOCC) run ./chain/actors/agen
|
$(GOCC) run ./chain/actors/agen
|
||||||
$(GOCC) fmt ./...
|
$(GOCC) fmt ./...
|
||||||
|
|
||||||
|
actors-gen: actors-code-gen fiximports
|
||||||
|
.PHONY: actors-gen
|
||||||
|
|
||||||
bundle-gen:
|
bundle-gen:
|
||||||
$(GOCC) run ./gen/bundle
|
$(GOCC) run ./gen/bundle $(VERSION) $(RELEASE) $(RELEASE_OVERRIDES)
|
||||||
$(GOCC) fmt ./build/...
|
$(GOCC) fmt ./build/...
|
||||||
.PHONY: bundle-gen
|
.PHONY: bundle-gen
|
||||||
|
|
||||||
@@ -364,7 +354,7 @@ docsgen-openrpc-gateway: docsgen-openrpc-bin
|
|||||||
fiximports:
|
fiximports:
|
||||||
./scripts/fiximports
|
./scripts/fiximports
|
||||||
|
|
||||||
gen: actors-gen type-gen method-gen cfgdoc-gen docsgen api-gen circleci bundle-gen fiximports
|
gen: actors-code-gen type-gen cfgdoc-gen docsgen api-gen circleci fiximports
|
||||||
@echo ">>> IF YOU'VE MODIFIED THE CLI OR CONFIG, REMEMBER TO ALSO MAKE docsgen-cli"
|
@echo ">>> IF YOU'VE MODIFIED THE CLI OR CONFIG, REMEMBER TO ALSO MAKE docsgen-cli"
|
||||||
.PHONY: gen
|
.PHONY: gen
|
||||||
|
|
||||||
@@ -376,7 +366,7 @@ snap: lotus lotus-miner lotus-worker
|
|||||||
|
|
||||||
# separate from gen because it needs binaries
|
# separate from gen because it needs binaries
|
||||||
docsgen-cli: lotus lotus-miner lotus-worker
|
docsgen-cli: lotus lotus-miner lotus-worker
|
||||||
python ./scripts/generate-lotus-cli.py
|
python3 ./scripts/generate-lotus-cli.py
|
||||||
./lotus config default > documentation/en/default-lotus-config.toml
|
./lotus config default > documentation/en/default-lotus-config.toml
|
||||||
./lotus-miner config default > documentation/en/default-lotus-miner-config.toml
|
./lotus-miner config default > documentation/en/default-lotus-miner-config.toml
|
||||||
.PHONY: docsgen-cli
|
.PHONY: docsgen-cli
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://docs.filecoin.io/" title="Filecoin Docs">
|
<a href="https://lotus.filecoin.io/" title="Filecoin Docs">
|
||||||
<img src="documentation/images/lotus_logo_h.png" alt="Project Lotus Logo" width="244" />
|
<img src="documentation/images/lotus_logo_h.png" alt="Project Lotus Logo" width="244" />
|
||||||
</a>
|
</a>
|
||||||
</p>
|
</p>
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
<a href="https://circleci.com/gh/filecoin-project/lotus"><img src="https://circleci.com/gh/filecoin-project/lotus.svg?style=svg"></a>
|
<a href="https://circleci.com/gh/filecoin-project/lotus"><img src="https://circleci.com/gh/filecoin-project/lotus.svg?style=svg"></a>
|
||||||
<a href="https://codecov.io/gh/filecoin-project/lotus"><img src="https://codecov.io/gh/filecoin-project/lotus/branch/master/graph/badge.svg"></a>
|
<a href="https://codecov.io/gh/filecoin-project/lotus"><img src="https://codecov.io/gh/filecoin-project/lotus/branch/master/graph/badge.svg"></a>
|
||||||
<a href="https://goreportcard.com/report/github.com/filecoin-project/lotus"><img src="https://goreportcard.com/badge/github.com/filecoin-project/lotus" /></a>
|
<a href="https://goreportcard.com/report/github.com/filecoin-project/lotus"><img src="https://goreportcard.com/badge/github.com/filecoin-project/lotus" /></a>
|
||||||
<a href=""><img src="https://img.shields.io/badge/golang-%3E%3D1.17-blue.svg" /></a>
|
<a href=""><img src="https://img.shields.io/badge/golang-%3E%3D1.18.8-blue.svg" /></a>
|
||||||
<br>
|
<br>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
@@ -31,7 +31,7 @@ Please send an email to security@filecoin.org. See our [security policy](SECURIT
|
|||||||
These repos are independent and reusable modules, but are tightly integrated into Lotus to make up a fully featured Filecoin implementation:
|
These repos are independent and reusable modules, but are tightly integrated into Lotus to make up a fully featured Filecoin implementation:
|
||||||
|
|
||||||
- [go-fil-markets](https://github.com/filecoin-project/go-fil-markets) which has its own [kanban work tracker available here](https://app.zenhub.com/workspaces/markets-shared-components-5daa144a7046a60001c6e253/board)
|
- [go-fil-markets](https://github.com/filecoin-project/go-fil-markets) which has its own [kanban work tracker available here](https://app.zenhub.com/workspaces/markets-shared-components-5daa144a7046a60001c6e253/board)
|
||||||
- [specs-actors](https://github.com/filecoin-project/specs-actors) which has its own [kanban work tracker available here](https://app.zenhub.com/workspaces/actors-5ee6f3aa87591f0016c05685/board)
|
- [builtin-actors](https://github.com/filecoin-project/builtin-actors)
|
||||||
|
|
||||||
## Contribute
|
## Contribute
|
||||||
|
|
||||||
@@ -67,14 +67,14 @@ Fedora:
|
|||||||
sudo dnf -y install gcc make git bzr jq pkgconfig mesa-libOpenCL mesa-libOpenCL-devel opencl-headers ocl-icd ocl-icd-devel clang llvm wget hwloc hwloc-devel
|
sudo dnf -y install gcc make git bzr jq pkgconfig mesa-libOpenCL mesa-libOpenCL-devel opencl-headers ocl-icd ocl-icd-devel clang llvm wget hwloc hwloc-devel
|
||||||
```
|
```
|
||||||
|
|
||||||
For other distributions you can find the required dependencies [here.](https://docs.filecoin.io/get-started/lotus/installation/#system-specific) For instructions specific to macOS, you can find them [here.](https://docs.filecoin.io/get-started/lotus/installation/#macos)
|
For other distributions you can find the required dependencies [here.](https://lotus.filecoin.io/lotus/install/prerequisites/#supported-platforms) For instructions specific to macOS, you can find them [here.](https://lotus.filecoin.io/lotus/install/macos/)
|
||||||
|
|
||||||
#### Go
|
#### Go
|
||||||
|
|
||||||
To build Lotus, you need a working installation of [Go 1.17.9 or higher](https://golang.org/dl/):
|
To build Lotus, you need a working installation of [Go 1.19.7 or higher](https://golang.org/dl/):
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
wget -c https://golang.org/dl/go1.17.9.linux-amd64.tar.gz -O - | sudo tar -xz -C /usr/local
|
wget -c https://golang.org/dl/go1.19.7.linux-amd64.tar.gz -O - | sudo tar -xz -C /usr/local
|
||||||
```
|
```
|
||||||
|
|
||||||
**TIP:**
|
**TIP:**
|
||||||
@@ -101,7 +101,7 @@ Note: The default branch `master` is the dev branch where the latest new feature
|
|||||||
|
|
||||||
2. To join mainnet, checkout the [latest release](https://github.com/filecoin-project/lotus/releases).
|
2. To join mainnet, checkout the [latest release](https://github.com/filecoin-project/lotus/releases).
|
||||||
|
|
||||||
If you are changing networks from a previous Lotus installation or there has been a network reset, read the [Switch networks guide](https://docs.filecoin.io/get-started/lotus/switch-networks/) before proceeding.
|
If you are changing networks from a previous Lotus installation or there has been a network reset, read the [Switch networks guide](https://lotus.filecoin.io/lotus/manage/switch-networks/) before proceeding.
|
||||||
|
|
||||||
For networks other than mainnet, look up the current branch or tag/commit for the network you want to join in the [Filecoin networks dashboard](https://network.filecoin.io), then build Lotus for your specific network below.
|
For networks other than mainnet, look up the current branch or tag/commit for the network you want to join in the [Filecoin networks dashboard](https://network.filecoin.io), then build Lotus for your specific network below.
|
||||||
|
|
||||||
@@ -113,8 +113,8 @@ Note: The default branch `master` is the dev branch where the latest new feature
|
|||||||
|
|
||||||
Currently, the latest code on the _master_ branch corresponds to mainnet.
|
Currently, the latest code on the _master_ branch corresponds to mainnet.
|
||||||
|
|
||||||
3. If you are in China, see "[Lotus: tips when running in China](https://docs.filecoin.io/get-started/lotus/tips-running-in-china/)".
|
3. If you are in China, see "[Lotus: tips when running in China](https://lotus.filecoin.io/lotus/configure/nodes-in-china/)".
|
||||||
4. This build instruction uses the prebuilt proofs binaries. If you want to build the proof binaries from source check the [complete instructions](https://docs.filecoin.io/get-started/lotus/installation/#build-and-install-lotus). Note, if you are building the proof binaries from source, [installing rustup](https://docs.filecoin.io/get-started/lotus/installation/#rustup) is also needed.
|
4. This build instruction uses the prebuilt proofs binaries. If you want to build the proof binaries from source check the [complete instructions](https://lotus.filecoin.io/lotus/install/prerequisites/). Note, if you are building the proof binaries from source, [installing rustup](https://lotus.filecoin.io/lotus/install/linux/#rustup) is also needed.
|
||||||
|
|
||||||
5. Build and install Lotus:
|
5. Build and install Lotus:
|
||||||
|
|
||||||
@@ -129,9 +129,9 @@ Note: The default branch `master` is the dev branch where the latest new feature
|
|||||||
|
|
||||||
This will put `lotus`, `lotus-miner` and `lotus-worker` in `/usr/local/bin`.
|
This will put `lotus`, `lotus-miner` and `lotus-worker` in `/usr/local/bin`.
|
||||||
|
|
||||||
`lotus` will use the `$HOME/.lotus` folder by default for storage (configuration, chain data, wallets, etc). See [advanced options](https://docs.filecoin.io/get-started/lotus/configuration-and-advanced-usage/) for information on how to customize the Lotus folder.
|
`lotus` will use the `$HOME/.lotus` folder by default for storage (configuration, chain data, wallets, etc). See [advanced options](https://lotus.filecoin.io/lotus/configure/defaults/#environment-variables) for information on how to customize the Lotus folder.
|
||||||
|
|
||||||
6. You should now have Lotus installed. You can now [start the Lotus daemon and sync the chain](https://docs.filecoin.io/get-started/lotus/installation/#start-the-lotus-daemon-and-sync-the-chain).
|
6. You should now have Lotus installed. You can now [start the Lotus daemon and sync the chain](https://lotus.filecoin.io/lotus/install/linux/#start-the-lotus-daemon-and-sync-the-chain).
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package api
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
|
|
||||||
@@ -49,6 +50,9 @@ type Common interface {
|
|||||||
// trigger graceful shutdown
|
// trigger graceful shutdown
|
||||||
Shutdown(context.Context) error //perm:admin
|
Shutdown(context.Context) error //perm:admin
|
||||||
|
|
||||||
|
// StartTime returns node start time
|
||||||
|
StartTime(context.Context) (time.Time, error) //perm:read
|
||||||
|
|
||||||
// Session returns a random UUID of api provider session
|
// Session returns a random UUID of api provider session
|
||||||
Session(context.Context) (uuid.UUID, error) //perm:read
|
Session(context.Context) (uuid.UUID, error) //perm:read
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,42 @@
|
|||||||
|
package api
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"reflect"
|
||||||
|
|
||||||
|
"github.com/filecoin-project/go-jsonrpc"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
EOutOfGas = iota + jsonrpc.FirstUserCode
|
||||||
|
EActorNotFound
|
||||||
|
)
|
||||||
|
|
||||||
|
type ErrOutOfGas struct{}
|
||||||
|
|
||||||
|
func (e *ErrOutOfGas) Error() string {
|
||||||
|
return "call ran out of gas"
|
||||||
|
}
|
||||||
|
|
||||||
|
type ErrActorNotFound struct{}
|
||||||
|
|
||||||
|
func (e *ErrActorNotFound) Error() string {
|
||||||
|
return "actor not found"
|
||||||
|
}
|
||||||
|
|
||||||
|
var RPCErrors = jsonrpc.NewErrors()
|
||||||
|
|
||||||
|
func ErrorIsIn(err error, errorTypes []error) bool {
|
||||||
|
for _, etype := range errorTypes {
|
||||||
|
tmp := reflect.New(reflect.PointerTo(reflect.ValueOf(etype).Elem().Type())).Interface()
|
||||||
|
if errors.As(err, tmp) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
RPCErrors.Register(EOutOfGas, new(*ErrOutOfGas))
|
||||||
|
RPCErrors.Register(EActorNotFound, new(*ErrActorNotFound))
|
||||||
|
}
|
||||||
+179
-15
@@ -6,20 +6,23 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
blocks "github.com/ipfs/go-block-format"
|
"github.com/google/uuid"
|
||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
"github.com/libp2p/go-libp2p-core/peer"
|
blocks "github.com/ipfs/go-libipfs/blocks"
|
||||||
|
"github.com/libp2p/go-libp2p/core/peer"
|
||||||
|
|
||||||
"github.com/filecoin-project/go-address"
|
"github.com/filecoin-project/go-address"
|
||||||
"github.com/filecoin-project/go-bitfield"
|
"github.com/filecoin-project/go-bitfield"
|
||||||
datatransfer "github.com/filecoin-project/go-data-transfer"
|
datatransfer "github.com/filecoin-project/go-data-transfer/v2"
|
||||||
"github.com/filecoin-project/go-fil-markets/retrievalmarket"
|
"github.com/filecoin-project/go-fil-markets/retrievalmarket"
|
||||||
"github.com/filecoin-project/go-fil-markets/storagemarket"
|
"github.com/filecoin-project/go-fil-markets/storagemarket"
|
||||||
|
"github.com/filecoin-project/go-jsonrpc"
|
||||||
"github.com/filecoin-project/go-state-types/abi"
|
"github.com/filecoin-project/go-state-types/abi"
|
||||||
"github.com/filecoin-project/go-state-types/big"
|
"github.com/filecoin-project/go-state-types/big"
|
||||||
"github.com/filecoin-project/go-state-types/builtin/v8/market"
|
|
||||||
"github.com/filecoin-project/go-state-types/builtin/v8/miner"
|
|
||||||
"github.com/filecoin-project/go-state-types/builtin/v8/paych"
|
"github.com/filecoin-project/go-state-types/builtin/v8/paych"
|
||||||
|
"github.com/filecoin-project/go-state-types/builtin/v9/market"
|
||||||
|
"github.com/filecoin-project/go-state-types/builtin/v9/miner"
|
||||||
|
verifregtypes "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
|
||||||
"github.com/filecoin-project/go-state-types/crypto"
|
"github.com/filecoin-project/go-state-types/crypto"
|
||||||
"github.com/filecoin-project/go-state-types/dline"
|
"github.com/filecoin-project/go-state-types/dline"
|
||||||
abinetwork "github.com/filecoin-project/go-state-types/network"
|
abinetwork "github.com/filecoin-project/go-state-types/network"
|
||||||
@@ -29,6 +32,7 @@ import (
|
|||||||
lminer "github.com/filecoin-project/lotus/chain/actors/builtin/miner"
|
lminer "github.com/filecoin-project/lotus/chain/actors/builtin/miner"
|
||||||
"github.com/filecoin-project/lotus/chain/actors/builtin/power"
|
"github.com/filecoin-project/lotus/chain/actors/builtin/power"
|
||||||
"github.com/filecoin-project/lotus/chain/types"
|
"github.com/filecoin-project/lotus/chain/types"
|
||||||
|
"github.com/filecoin-project/lotus/chain/types/ethtypes"
|
||||||
"github.com/filecoin-project/lotus/node/modules/dtypes"
|
"github.com/filecoin-project/lotus/node/modules/dtypes"
|
||||||
"github.com/filecoin-project/lotus/node/repo/imports"
|
"github.com/filecoin-project/lotus/node/repo/imports"
|
||||||
)
|
)
|
||||||
@@ -149,7 +153,7 @@ type FullNode interface {
|
|||||||
|
|
||||||
// ChainGetPath returns a set of revert/apply operations needed to get from
|
// ChainGetPath returns a set of revert/apply operations needed to get from
|
||||||
// one tipset to another, for example:
|
// one tipset to another, for example:
|
||||||
//```
|
// ```
|
||||||
// to
|
// to
|
||||||
// ^
|
// ^
|
||||||
// from tAA
|
// from tAA
|
||||||
@@ -158,7 +162,7 @@ type FullNode interface {
|
|||||||
// ^---*--^
|
// ^---*--^
|
||||||
// ^
|
// ^
|
||||||
// tRR
|
// tRR
|
||||||
//```
|
// ```
|
||||||
// Would return `[revert(tBA), apply(tAB), apply(tAA)]`
|
// Would return `[revert(tBA), apply(tAB), apply(tAA)]`
|
||||||
ChainGetPath(ctx context.Context, from types.TipSetKey, to types.TipSetKey) ([]*HeadChange, error) //perm:read
|
ChainGetPath(ctx context.Context, from types.TipSetKey, to types.TipSetKey) ([]*HeadChange, error) //perm:read
|
||||||
|
|
||||||
@@ -169,6 +173,24 @@ type FullNode interface {
|
|||||||
// If oldmsgskip is set, messages from before the requested roots are also not included.
|
// If oldmsgskip is set, messages from before the requested roots are also not included.
|
||||||
ChainExport(ctx context.Context, nroots abi.ChainEpoch, oldmsgskip bool, tsk types.TipSetKey) (<-chan []byte, error) //perm:read
|
ChainExport(ctx context.Context, nroots abi.ChainEpoch, oldmsgskip bool, tsk types.TipSetKey) (<-chan []byte, error) //perm:read
|
||||||
|
|
||||||
|
// ChainExportRangeInternal triggers the export of a chain
|
||||||
|
// CAR-snapshot directly to disk. It is similar to ChainExport,
|
||||||
|
// except, depending on options, the snapshot can include receipts,
|
||||||
|
// messages and stateroots for the length between the specified head
|
||||||
|
// and tail, thus producing "archival-grade" snapshots that include
|
||||||
|
// all the on-chain data. The header chain is included back to
|
||||||
|
// genesis and these snapshots can be used to initialize Filecoin
|
||||||
|
// nodes.
|
||||||
|
ChainExportRangeInternal(ctx context.Context, head, tail types.TipSetKey, cfg ChainExportConfig) error //perm:admin
|
||||||
|
|
||||||
|
// ChainPrune forces compaction on cold store and garbage collects; only supported if you
|
||||||
|
// are using the splitstore
|
||||||
|
ChainPrune(ctx context.Context, opts PruneOpts) error //perm:admin
|
||||||
|
|
||||||
|
// ChainHotGC does online (badger) GC on the hot store; only supported if you are using
|
||||||
|
// the splitstore
|
||||||
|
ChainHotGC(ctx context.Context, opts HotGCOpts) error //perm:admin
|
||||||
|
|
||||||
// ChainCheckBlockstore performs an (asynchronous) health check on the chain/state blockstore
|
// ChainCheckBlockstore performs an (asynchronous) health check on the chain/state blockstore
|
||||||
// if supported by the underlying implementation.
|
// if supported by the underlying implementation.
|
||||||
ChainCheckBlockstore(context.Context) error //perm:admin
|
ChainCheckBlockstore(context.Context) error //perm:admin
|
||||||
@@ -176,6 +198,9 @@ type FullNode interface {
|
|||||||
// ChainBlockstoreInfo returns some basic information about the blockstore
|
// ChainBlockstoreInfo returns some basic information about the blockstore
|
||||||
ChainBlockstoreInfo(context.Context) (map[string]interface{}, error) //perm:read
|
ChainBlockstoreInfo(context.Context) (map[string]interface{}, error) //perm:read
|
||||||
|
|
||||||
|
// ChainGetEvents returns the events under an event AMT root CID.
|
||||||
|
ChainGetEvents(context.Context, cid.Cid) ([]types.Event, error) //perm:read
|
||||||
|
|
||||||
// GasEstimateFeeCap estimates gas fee cap
|
// GasEstimateFeeCap estimates gas fee cap
|
||||||
GasEstimateFeeCap(context.Context, *types.Message, int64, types.TipSetKey) (types.BigInt, error) //perm:read
|
GasEstimateFeeCap(context.Context, *types.Message, int64, types.TipSetKey) (types.BigInt, error) //perm:read
|
||||||
|
|
||||||
@@ -382,12 +407,12 @@ type FullNode interface {
|
|||||||
ClientCancelRetrievalDeal(ctx context.Context, dealid retrievalmarket.DealID) error //perm:write
|
ClientCancelRetrievalDeal(ctx context.Context, dealid retrievalmarket.DealID) error //perm:write
|
||||||
|
|
||||||
// ClientUnimport removes references to the specified file from filestore
|
// ClientUnimport removes references to the specified file from filestore
|
||||||
//ClientUnimport(path string)
|
// ClientUnimport(path string)
|
||||||
|
|
||||||
// ClientListImports lists imported files and their root CIDs
|
// ClientListImports lists imported files and their root CIDs
|
||||||
ClientListImports(ctx context.Context) ([]Import, error) //perm:write
|
ClientListImports(ctx context.Context) ([]Import, error) //perm:write
|
||||||
|
|
||||||
//ClientListAsks() []Ask
|
// ClientListAsks() []Ask
|
||||||
|
|
||||||
// MethodGroup: State
|
// MethodGroup: State
|
||||||
// The State methods are used to query, inspect, and interact with chain state.
|
// The State methods are used to query, inspect, and interact with chain state.
|
||||||
@@ -402,7 +427,7 @@ type FullNode interface {
|
|||||||
StateCall(context.Context, *types.Message, types.TipSetKey) (*InvocResult, error) //perm:read
|
StateCall(context.Context, *types.Message, types.TipSetKey) (*InvocResult, error) //perm:read
|
||||||
// StateReplay replays a given message, assuming it was included in a block in the specified tipset.
|
// StateReplay replays a given message, assuming it was included in a block in the specified tipset.
|
||||||
//
|
//
|
||||||
// If a tipset key is provided, and a replacing message is found on chain,
|
// If a tipset key is provided, and a replacing message is not found on chain,
|
||||||
// the method will return an error saying that the message wasn't found
|
// the method will return an error saying that the message wasn't found
|
||||||
//
|
//
|
||||||
// If no tipset key is provided, the appropriate tipset is looked up, and if
|
// If no tipset key is provided, the appropriate tipset is looked up, and if
|
||||||
@@ -523,6 +548,17 @@ type FullNode interface {
|
|||||||
StateMarketDeals(context.Context, types.TipSetKey) (map[string]*MarketDeal, error) //perm:read
|
StateMarketDeals(context.Context, types.TipSetKey) (map[string]*MarketDeal, error) //perm:read
|
||||||
// StateMarketStorageDeal returns information about the indicated deal
|
// StateMarketStorageDeal returns information about the indicated deal
|
||||||
StateMarketStorageDeal(context.Context, abi.DealID, types.TipSetKey) (*MarketDeal, error) //perm:read
|
StateMarketStorageDeal(context.Context, abi.DealID, types.TipSetKey) (*MarketDeal, error) //perm:read
|
||||||
|
// StateGetAllocationForPendingDeal returns the allocation for a given deal ID of a pending deal. Returns nil if
|
||||||
|
// pending allocation is not found.
|
||||||
|
StateGetAllocationForPendingDeal(ctx context.Context, dealId abi.DealID, tsk types.TipSetKey) (*verifregtypes.Allocation, error) //perm:read
|
||||||
|
// StateGetAllocation returns the allocation for a given address and allocation ID.
|
||||||
|
StateGetAllocation(ctx context.Context, clientAddr address.Address, allocationId verifregtypes.AllocationId, tsk types.TipSetKey) (*verifregtypes.Allocation, error) //perm:read
|
||||||
|
// StateGetAllocations returns the all the allocations for a given client.
|
||||||
|
StateGetAllocations(ctx context.Context, clientAddr address.Address, tsk types.TipSetKey) (map[verifregtypes.AllocationId]verifregtypes.Allocation, error) //perm:read
|
||||||
|
// StateGetClaim returns the claim for a given address and claim ID.
|
||||||
|
StateGetClaim(ctx context.Context, providerAddr address.Address, claimId verifregtypes.ClaimId, tsk types.TipSetKey) (*verifregtypes.Claim, error) //perm:read
|
||||||
|
// StateGetClaims returns the all the claims for a given provider.
|
||||||
|
StateGetClaims(ctx context.Context, providerAddr address.Address, tsk types.TipSetKey) (map[verifregtypes.ClaimId]verifregtypes.Claim, error) //perm:read
|
||||||
// StateComputeDataCID computes DataCID from a set of on-chain deals
|
// StateComputeDataCID computes DataCID from a set of on-chain deals
|
||||||
StateComputeDataCID(ctx context.Context, maddr address.Address, sectorType abi.RegisteredSealProof, deals []abi.DealID, tsk types.TipSetKey) (cid.Cid, error) //perm:read
|
StateComputeDataCID(ctx context.Context, maddr address.Address, sectorType abi.RegisteredSealProof, deals []abi.DealID, tsk types.TipSetKey) (cid.Cid, error) //perm:read
|
||||||
// StateLookupID retrieves the ID address of the given address
|
// StateLookupID retrieves the ID address of the given address
|
||||||
@@ -536,6 +572,8 @@ type FullNode interface {
|
|||||||
StateChangedActors(context.Context, cid.Cid, cid.Cid) (map[string]types.Actor, error) //perm:read
|
StateChangedActors(context.Context, cid.Cid, cid.Cid) (map[string]types.Actor, error) //perm:read
|
||||||
// StateMinerSectorCount returns the number of sectors in a miner's sector set and proving set
|
// StateMinerSectorCount returns the number of sectors in a miner's sector set and proving set
|
||||||
StateMinerSectorCount(context.Context, address.Address, types.TipSetKey) (MinerSectors, error) //perm:read
|
StateMinerSectorCount(context.Context, address.Address, types.TipSetKey) (MinerSectors, error) //perm:read
|
||||||
|
// StateMinerAllocated returns a bitfield containing all sector numbers marked as allocated in miner state
|
||||||
|
StateMinerAllocated(context.Context, address.Address, types.TipSetKey) (*bitfield.BitField, error) //perm:read
|
||||||
// StateCompute is a flexible command that applies the given messages on the given tipset.
|
// StateCompute is a flexible command that applies the given messages on the given tipset.
|
||||||
// The messages are run as though the VM were at the provided height.
|
// The messages are run as though the VM were at the provided height.
|
||||||
//
|
//
|
||||||
@@ -577,7 +615,7 @@ type FullNode interface {
|
|||||||
// Returns nil if there is no entry in the data cap table for the
|
// Returns nil if there is no entry in the data cap table for the
|
||||||
// address.
|
// address.
|
||||||
StateVerifiedClientStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) //perm:read
|
StateVerifiedClientStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) //perm:read
|
||||||
// StateVerifiedClientStatus returns the address of the Verified Registry's root key
|
// StateVerifiedRegistryRootKey returns the address of the Verified Registry's root key
|
||||||
StateVerifiedRegistryRootKey(ctx context.Context, tsk types.TipSetKey) (address.Address, error) //perm:read
|
StateVerifiedRegistryRootKey(ctx context.Context, tsk types.TipSetKey) (address.Address, error) //perm:read
|
||||||
// StateDealProviderCollateralBounds returns the min and max collateral a storage provider
|
// StateDealProviderCollateralBounds returns the min and max collateral a storage provider
|
||||||
// can issue. It takes the deal size and verified status as parameters.
|
// can issue. It takes the deal size and verified status as parameters.
|
||||||
@@ -593,6 +631,8 @@ type FullNode interface {
|
|||||||
StateNetworkVersion(context.Context, types.TipSetKey) (apitypes.NetworkVersion, error) //perm:read
|
StateNetworkVersion(context.Context, types.TipSetKey) (apitypes.NetworkVersion, error) //perm:read
|
||||||
// StateActorCodeCIDs returns the CIDs of all the builtin actors for the given network version
|
// StateActorCodeCIDs returns the CIDs of all the builtin actors for the given network version
|
||||||
StateActorCodeCIDs(context.Context, abinetwork.Version) (map[string]cid.Cid, error) //perm:read
|
StateActorCodeCIDs(context.Context, abinetwork.Version) (map[string]cid.Cid, error) //perm:read
|
||||||
|
// StateActorManifestCID returns the CID of the builtin actors manifest for the given network version
|
||||||
|
StateActorManifestCID(context.Context, abinetwork.Version) (cid.Cid, error) //perm:read
|
||||||
|
|
||||||
// StateGetRandomnessFromTickets is used to sample the chain for randomness.
|
// StateGetRandomnessFromTickets is used to sample the chain for randomness.
|
||||||
StateGetRandomnessFromTickets(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte, tsk types.TipSetKey) (abi.Randomness, error) //perm:read
|
StateGetRandomnessFromTickets(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte, tsk types.TipSetKey) (abi.Randomness, error) //perm:read
|
||||||
@@ -619,14 +659,14 @@ type FullNode interface {
|
|||||||
// It takes the following params: <multisig address>, <start epoch>, <end epoch>
|
// It takes the following params: <multisig address>, <start epoch>, <end epoch>
|
||||||
MsigGetVested(context.Context, address.Address, types.TipSetKey, types.TipSetKey) (types.BigInt, error) //perm:read
|
MsigGetVested(context.Context, address.Address, types.TipSetKey, types.TipSetKey) (types.BigInt, error) //perm:read
|
||||||
|
|
||||||
//MsigGetPending returns pending transactions for the given multisig
|
// MsigGetPending returns pending transactions for the given multisig
|
||||||
//wallet. Once pending transactions are fully approved, they will no longer
|
// wallet. Once pending transactions are fully approved, they will no longer
|
||||||
//appear here.
|
// appear here.
|
||||||
MsigGetPending(context.Context, address.Address, types.TipSetKey) ([]*MsigTransaction, error) //perm:read
|
MsigGetPending(context.Context, address.Address, types.TipSetKey) ([]*MsigTransaction, error) //perm:read
|
||||||
|
|
||||||
// MsigCreate creates a multisig wallet
|
// MsigCreate creates a multisig wallet
|
||||||
// It takes the following params: <required number of senders>, <approving addresses>, <unlock duration>
|
// It takes the following params: <required number of senders>, <approving addresses>, <unlock duration>
|
||||||
//<initial balance>, <sender address of the create msg>, <gas price>
|
// <initial balance>, <sender address of the create msg>, <gas price>
|
||||||
MsigCreate(context.Context, uint64, []address.Address, abi.ChainEpoch, types.BigInt, address.Address, types.BigInt) (*MessagePrototype, error) //perm:sign
|
MsigCreate(context.Context, uint64, []address.Address, abi.ChainEpoch, types.BigInt, address.Address, types.BigInt) (*MessagePrototype, error) //perm:sign
|
||||||
|
|
||||||
// MsigPropose proposes a multisig message
|
// MsigPropose proposes a multisig message
|
||||||
@@ -738,11 +778,102 @@ type FullNode interface {
|
|||||||
|
|
||||||
NodeStatus(ctx context.Context, inclChainStatus bool) (NodeStatus, error) //perm:read
|
NodeStatus(ctx context.Context, inclChainStatus bool) (NodeStatus, error) //perm:read
|
||||||
|
|
||||||
|
// MethodGroup: Eth
|
||||||
|
// These methods are used for Ethereum-compatible JSON-RPC calls
|
||||||
|
//
|
||||||
|
// EthAccounts will always return [] since we don't expect Lotus to manage private keys
|
||||||
|
EthAccounts(ctx context.Context) ([]ethtypes.EthAddress, error) //perm:read
|
||||||
|
// EthAddressToFilecoinAddress converts an EthAddress into an f410 Filecoin Address
|
||||||
|
EthAddressToFilecoinAddress(ctx context.Context, ethAddress ethtypes.EthAddress) (address.Address, error) //perm:read
|
||||||
|
// FilecoinAddressToEthAddress converts an f410 or f0 Filecoin Address to an EthAddress
|
||||||
|
FilecoinAddressToEthAddress(ctx context.Context, filecoinAddress address.Address) (ethtypes.EthAddress, error) //perm:read
|
||||||
|
// EthBlockNumber returns the height of the latest (heaviest) TipSet
|
||||||
|
EthBlockNumber(ctx context.Context) (ethtypes.EthUint64, error) //perm:read
|
||||||
|
// EthGetBlockTransactionCountByNumber returns the number of messages in the TipSet
|
||||||
|
EthGetBlockTransactionCountByNumber(ctx context.Context, blkNum ethtypes.EthUint64) (ethtypes.EthUint64, error) //perm:read
|
||||||
|
// EthGetBlockTransactionCountByHash returns the number of messages in the TipSet
|
||||||
|
EthGetBlockTransactionCountByHash(ctx context.Context, blkHash ethtypes.EthHash) (ethtypes.EthUint64, error) //perm:read
|
||||||
|
|
||||||
|
EthGetBlockByHash(ctx context.Context, blkHash ethtypes.EthHash, fullTxInfo bool) (ethtypes.EthBlock, error) //perm:read
|
||||||
|
EthGetBlockByNumber(ctx context.Context, blkNum string, fullTxInfo bool) (ethtypes.EthBlock, error) //perm:read
|
||||||
|
EthGetTransactionByHash(ctx context.Context, txHash *ethtypes.EthHash) (*ethtypes.EthTx, error) //perm:read
|
||||||
|
EthGetTransactionByHashLimited(ctx context.Context, txHash *ethtypes.EthHash, limit abi.ChainEpoch) (*ethtypes.EthTx, error) //perm:read
|
||||||
|
EthGetTransactionHashByCid(ctx context.Context, cid cid.Cid) (*ethtypes.EthHash, error) //perm:read
|
||||||
|
EthGetMessageCidByTransactionHash(ctx context.Context, txHash *ethtypes.EthHash) (*cid.Cid, error) //perm:read
|
||||||
|
EthGetTransactionCount(ctx context.Context, sender ethtypes.EthAddress, blkOpt string) (ethtypes.EthUint64, error) //perm:read
|
||||||
|
EthGetTransactionReceipt(ctx context.Context, txHash ethtypes.EthHash) (*EthTxReceipt, error) //perm:read
|
||||||
|
EthGetTransactionReceiptLimited(ctx context.Context, txHash ethtypes.EthHash, limit abi.ChainEpoch) (*EthTxReceipt, error) //perm:read
|
||||||
|
EthGetTransactionByBlockHashAndIndex(ctx context.Context, blkHash ethtypes.EthHash, txIndex ethtypes.EthUint64) (ethtypes.EthTx, error) //perm:read
|
||||||
|
EthGetTransactionByBlockNumberAndIndex(ctx context.Context, blkNum ethtypes.EthUint64, txIndex ethtypes.EthUint64) (ethtypes.EthTx, error) //perm:read
|
||||||
|
|
||||||
|
EthGetCode(ctx context.Context, address ethtypes.EthAddress, blkOpt string) (ethtypes.EthBytes, error) //perm:read
|
||||||
|
EthGetStorageAt(ctx context.Context, address ethtypes.EthAddress, position ethtypes.EthBytes, blkParam string) (ethtypes.EthBytes, error) //perm:read
|
||||||
|
EthGetBalance(ctx context.Context, address ethtypes.EthAddress, blkParam string) (ethtypes.EthBigInt, error) //perm:read
|
||||||
|
EthChainId(ctx context.Context) (ethtypes.EthUint64, error) //perm:read
|
||||||
|
NetVersion(ctx context.Context) (string, error) //perm:read
|
||||||
|
NetListening(ctx context.Context) (bool, error) //perm:read
|
||||||
|
EthProtocolVersion(ctx context.Context) (ethtypes.EthUint64, error) //perm:read
|
||||||
|
EthGasPrice(ctx context.Context) (ethtypes.EthBigInt, error) //perm:read
|
||||||
|
EthFeeHistory(ctx context.Context, p jsonrpc.RawParams) (ethtypes.EthFeeHistory, error) //perm:read
|
||||||
|
|
||||||
|
EthMaxPriorityFeePerGas(ctx context.Context) (ethtypes.EthBigInt, error) //perm:read
|
||||||
|
EthEstimateGas(ctx context.Context, tx ethtypes.EthCall) (ethtypes.EthUint64, error) //perm:read
|
||||||
|
EthCall(ctx context.Context, tx ethtypes.EthCall, blkParam string) (ethtypes.EthBytes, error) //perm:read
|
||||||
|
|
||||||
|
EthSendRawTransaction(ctx context.Context, rawTx ethtypes.EthBytes) (ethtypes.EthHash, error) //perm:read
|
||||||
|
|
||||||
|
// Returns event logs matching given filter spec.
|
||||||
|
EthGetLogs(ctx context.Context, filter *ethtypes.EthFilterSpec) (*ethtypes.EthFilterResult, error) //perm:read
|
||||||
|
|
||||||
|
// Polling method for a filter, returns event logs which occurred since last poll.
|
||||||
|
// (requires write perm since timestamp of last filter execution will be written)
|
||||||
|
EthGetFilterChanges(ctx context.Context, id ethtypes.EthFilterID) (*ethtypes.EthFilterResult, error) //perm:write
|
||||||
|
|
||||||
|
// Returns event logs matching filter with given id.
|
||||||
|
// (requires write perm since timestamp of last filter execution will be written)
|
||||||
|
EthGetFilterLogs(ctx context.Context, id ethtypes.EthFilterID) (*ethtypes.EthFilterResult, error) //perm:write
|
||||||
|
|
||||||
|
// Installs a persistent filter based on given filter spec.
|
||||||
|
EthNewFilter(ctx context.Context, filter *ethtypes.EthFilterSpec) (ethtypes.EthFilterID, error) //perm:write
|
||||||
|
|
||||||
|
// Installs a persistent filter to notify when a new block arrives.
|
||||||
|
EthNewBlockFilter(ctx context.Context) (ethtypes.EthFilterID, error) //perm:write
|
||||||
|
|
||||||
|
// Installs a persistent filter to notify when new messages arrive in the message pool.
|
||||||
|
EthNewPendingTransactionFilter(ctx context.Context) (ethtypes.EthFilterID, error) //perm:write
|
||||||
|
|
||||||
|
// Uninstalls a filter with given id.
|
||||||
|
EthUninstallFilter(ctx context.Context, id ethtypes.EthFilterID) (bool, error) //perm:write
|
||||||
|
|
||||||
|
// Subscribe to different event types using websockets
|
||||||
|
// eventTypes is one or more of:
|
||||||
|
// - newHeads: notify when new blocks arrive.
|
||||||
|
// - pendingTransactions: notify when new messages arrive in the message pool.
|
||||||
|
// - logs: notify new event logs that match a criteria
|
||||||
|
// params contains additional parameters used with the log event type
|
||||||
|
// The client will receive a stream of EthSubscriptionResponse values until EthUnsubscribe is called.
|
||||||
|
EthSubscribe(ctx context.Context, params jsonrpc.RawParams) (ethtypes.EthSubscriptionID, error) //perm:write
|
||||||
|
|
||||||
|
// Unsubscribe from a websocket subscription
|
||||||
|
EthUnsubscribe(ctx context.Context, id ethtypes.EthSubscriptionID) (bool, error) //perm:write
|
||||||
|
|
||||||
|
// Returns the client version
|
||||||
|
Web3ClientVersion(ctx context.Context) (string, error) //perm:read
|
||||||
|
|
||||||
// CreateBackup creates node backup onder the specified file name. The
|
// CreateBackup creates node backup onder the specified file name. The
|
||||||
// method requires that the lotus daemon is running with the
|
// method requires that the lotus daemon is running with the
|
||||||
// LOTUS_BACKUP_BASE_PATH environment variable set to some path, and that
|
// LOTUS_BACKUP_BASE_PATH environment variable set to some path, and that
|
||||||
// the path specified when calling CreateBackup is within the base path
|
// the path specified when calling CreateBackup is within the base path
|
||||||
CreateBackup(ctx context.Context, fpath string) error //perm:admin
|
CreateBackup(ctx context.Context, fpath string) error //perm:admin
|
||||||
|
|
||||||
|
RaftState(ctx context.Context) (*RaftStateData, error) //perm:read
|
||||||
|
RaftLeader(ctx context.Context) (peer.ID, error) //perm:read
|
||||||
|
}
|
||||||
|
|
||||||
|
// reverse interface to the client, called after EthSubscribe
|
||||||
|
type EthSubscriber interface {
|
||||||
|
// note: the parameter is ethtypes.EthSubscriptionResponse serialized as json object
|
||||||
|
EthSubscription(ctx context.Context, r jsonrpc.RawParams) error // rpc_method:eth_subscription notify:true
|
||||||
}
|
}
|
||||||
|
|
||||||
type StorageAsk struct {
|
type StorageAsk struct {
|
||||||
@@ -992,8 +1123,12 @@ type RetrievalOrder struct {
|
|||||||
Client address.Address
|
Client address.Address
|
||||||
Miner address.Address
|
Miner address.Address
|
||||||
MinerPeer *retrievalmarket.RetrievalPeer
|
MinerPeer *retrievalmarket.RetrievalPeer
|
||||||
|
|
||||||
|
RemoteStore *RemoteStoreID `json:"RemoteStore,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type RemoteStoreID = uuid.UUID
|
||||||
|
|
||||||
type InvocResult struct {
|
type InvocResult struct {
|
||||||
MsgCid cid.Cid
|
MsgCid cid.Cid
|
||||||
Msg *types.Message
|
Msg *types.Message
|
||||||
@@ -1219,3 +1354,32 @@ type MsigTransaction struct {
|
|||||||
|
|
||||||
Approved []address.Address
|
Approved []address.Address
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type PruneOpts struct {
|
||||||
|
MovingGC bool
|
||||||
|
RetainState int64
|
||||||
|
}
|
||||||
|
|
||||||
|
type HotGCOpts struct {
|
||||||
|
Threshold float64
|
||||||
|
Periodic bool
|
||||||
|
Moving bool
|
||||||
|
}
|
||||||
|
|
||||||
|
type EthTxReceipt struct {
|
||||||
|
TransactionHash ethtypes.EthHash `json:"transactionHash"`
|
||||||
|
TransactionIndex ethtypes.EthUint64 `json:"transactionIndex"`
|
||||||
|
BlockHash ethtypes.EthHash `json:"blockHash"`
|
||||||
|
BlockNumber ethtypes.EthUint64 `json:"blockNumber"`
|
||||||
|
From ethtypes.EthAddress `json:"from"`
|
||||||
|
To *ethtypes.EthAddress `json:"to"`
|
||||||
|
StateRoot ethtypes.EthHash `json:"root"`
|
||||||
|
Status ethtypes.EthUint64 `json:"status"`
|
||||||
|
ContractAddress *ethtypes.EthAddress `json:"contractAddress"`
|
||||||
|
CumulativeGasUsed ethtypes.EthUint64 `json:"cumulativeGasUsed"`
|
||||||
|
GasUsed ethtypes.EthUint64 `json:"gasUsed"`
|
||||||
|
EffectiveGasPrice ethtypes.EthBigInt `json:"effectiveGasPrice"`
|
||||||
|
LogsBloom ethtypes.EthBytes `json:"logsBloom"`
|
||||||
|
Logs []ethtypes.EthLog `json:"logs"`
|
||||||
|
Type ethtypes.EthUint64 `json:"type"`
|
||||||
|
}
|
||||||
|
|||||||
+49
-4
@@ -3,16 +3,19 @@ package api
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
blocks "github.com/ipfs/go-block-format"
|
|
||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
|
blocks "github.com/ipfs/go-libipfs/blocks"
|
||||||
|
|
||||||
"github.com/filecoin-project/go-address"
|
"github.com/filecoin-project/go-address"
|
||||||
|
"github.com/filecoin-project/go-jsonrpc"
|
||||||
"github.com/filecoin-project/go-state-types/abi"
|
"github.com/filecoin-project/go-state-types/abi"
|
||||||
"github.com/filecoin-project/go-state-types/builtin/v8/miner"
|
"github.com/filecoin-project/go-state-types/builtin/v9/miner"
|
||||||
"github.com/filecoin-project/go-state-types/dline"
|
"github.com/filecoin-project/go-state-types/dline"
|
||||||
|
|
||||||
apitypes "github.com/filecoin-project/lotus/api/types"
|
apitypes "github.com/filecoin-project/lotus/api/types"
|
||||||
"github.com/filecoin-project/lotus/chain/types"
|
"github.com/filecoin-project/lotus/chain/types"
|
||||||
|
"github.com/filecoin-project/lotus/chain/types/ethtypes"
|
||||||
|
"github.com/filecoin-project/lotus/node/modules/dtypes"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MODIFYING THE API INTERFACE
|
// MODIFYING THE API INTERFACE
|
||||||
@@ -23,7 +26,7 @@ import (
|
|||||||
// When adding / changing methods in this file:
|
// When adding / changing methods in this file:
|
||||||
// * Do the change here
|
// * Do the change here
|
||||||
// * Adjust implementation in `node/impl/`
|
// * Adjust implementation in `node/impl/`
|
||||||
// * Run `make gen` - this will:
|
// * Run `make clean && make deps && make gen` - this will:
|
||||||
// * Generate proxy structs
|
// * Generate proxy structs
|
||||||
// * Generate mocks
|
// * Generate mocks
|
||||||
// * Generate markdown docs
|
// * Generate markdown docs
|
||||||
@@ -45,15 +48,18 @@ type Gateway interface {
|
|||||||
ChainReadObj(context.Context, cid.Cid) ([]byte, error)
|
ChainReadObj(context.Context, cid.Cid) ([]byte, error)
|
||||||
ChainGetGenesis(context.Context) (*types.TipSet, error)
|
ChainGetGenesis(context.Context) (*types.TipSet, error)
|
||||||
GasEstimateMessageGas(ctx context.Context, msg *types.Message, spec *MessageSendSpec, tsk types.TipSetKey) (*types.Message, error)
|
GasEstimateMessageGas(ctx context.Context, msg *types.Message, spec *MessageSendSpec, tsk types.TipSetKey) (*types.Message, error)
|
||||||
|
MpoolGetNonce(ctx context.Context, addr address.Address) (uint64, error)
|
||||||
MpoolPush(ctx context.Context, sm *types.SignedMessage) (cid.Cid, error)
|
MpoolPush(ctx context.Context, sm *types.SignedMessage) (cid.Cid, error)
|
||||||
MsigGetAvailableBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.BigInt, error)
|
MsigGetAvailableBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.BigInt, error)
|
||||||
MsigGetPending(context.Context, address.Address, types.TipSetKey) ([]*MsigTransaction, error)
|
MsigGetPending(context.Context, address.Address, types.TipSetKey) ([]*MsigTransaction, error)
|
||||||
MsigGetVested(ctx context.Context, addr address.Address, start types.TipSetKey, end types.TipSetKey) (types.BigInt, error)
|
MsigGetVested(ctx context.Context, addr address.Address, start types.TipSetKey, end types.TipSetKey) (types.BigInt, error)
|
||||||
MsigGetVestingSchedule(ctx context.Context, addr address.Address, tsk types.TipSetKey) (MsigVesting, error)
|
MsigGetVestingSchedule(ctx context.Context, addr address.Address, tsk types.TipSetKey) (MsigVesting, error)
|
||||||
StateAccountKey(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error)
|
StateAccountKey(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error)
|
||||||
|
StateCall(ctx context.Context, msg *types.Message, tsk types.TipSetKey) (*InvocResult, error)
|
||||||
StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (DealCollateralBounds, error)
|
StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (DealCollateralBounds, error)
|
||||||
|
StateDecodeParams(ctx context.Context, toAddr address.Address, method abi.MethodNum, params []byte, tsk types.TipSetKey) (interface{}, error)
|
||||||
StateGetActor(ctx context.Context, actor address.Address, ts types.TipSetKey) (*types.Actor, error)
|
StateGetActor(ctx context.Context, actor address.Address, ts types.TipSetKey) (*types.Actor, error)
|
||||||
StateReadState(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*ActorState, error) //perm:read
|
StateReadState(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*ActorState, error)
|
||||||
StateListMiners(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error)
|
StateListMiners(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error)
|
||||||
StateLookupID(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error)
|
StateLookupID(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error)
|
||||||
StateMarketBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (MarketBalance, error)
|
StateMarketBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (MarketBalance, error)
|
||||||
@@ -61,12 +67,51 @@ type Gateway interface {
|
|||||||
StateMinerInfo(ctx context.Context, actor address.Address, tsk types.TipSetKey) (MinerInfo, error)
|
StateMinerInfo(ctx context.Context, actor address.Address, tsk types.TipSetKey) (MinerInfo, error)
|
||||||
StateMinerProvingDeadline(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*dline.Info, error)
|
StateMinerProvingDeadline(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*dline.Info, error)
|
||||||
StateMinerPower(context.Context, address.Address, types.TipSetKey) (*MinerPower, error)
|
StateMinerPower(context.Context, address.Address, types.TipSetKey) (*MinerPower, error)
|
||||||
|
StateNetworkName(context.Context) (dtypes.NetworkName, error)
|
||||||
StateNetworkVersion(context.Context, types.TipSetKey) (apitypes.NetworkVersion, error)
|
StateNetworkVersion(context.Context, types.TipSetKey) (apitypes.NetworkVersion, error)
|
||||||
StateSectorGetInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorOnChainInfo, error)
|
StateSectorGetInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorOnChainInfo, error)
|
||||||
|
StateVerifierStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error)
|
||||||
StateVerifiedClientStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error)
|
StateVerifiedClientStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error)
|
||||||
StateSearchMsg(ctx context.Context, from types.TipSetKey, msg cid.Cid, limit abi.ChainEpoch, allowReplaced bool) (*MsgLookup, error)
|
StateSearchMsg(ctx context.Context, from types.TipSetKey, msg cid.Cid, limit abi.ChainEpoch, allowReplaced bool) (*MsgLookup, error)
|
||||||
StateWaitMsg(ctx context.Context, cid cid.Cid, confidence uint64, limit abi.ChainEpoch, allowReplaced bool) (*MsgLookup, error)
|
StateWaitMsg(ctx context.Context, cid cid.Cid, confidence uint64, limit abi.ChainEpoch, allowReplaced bool) (*MsgLookup, error)
|
||||||
WalletBalance(context.Context, address.Address) (types.BigInt, error)
|
WalletBalance(context.Context, address.Address) (types.BigInt, error)
|
||||||
Version(context.Context) (APIVersion, error)
|
Version(context.Context) (APIVersion, error)
|
||||||
Discover(context.Context) (apitypes.OpenRPCDocument, error)
|
Discover(context.Context) (apitypes.OpenRPCDocument, error)
|
||||||
|
|
||||||
|
EthAccounts(ctx context.Context) ([]ethtypes.EthAddress, error)
|
||||||
|
EthBlockNumber(ctx context.Context) (ethtypes.EthUint64, error)
|
||||||
|
EthGetBlockTransactionCountByNumber(ctx context.Context, blkNum ethtypes.EthUint64) (ethtypes.EthUint64, error)
|
||||||
|
EthGetBlockTransactionCountByHash(ctx context.Context, blkHash ethtypes.EthHash) (ethtypes.EthUint64, error)
|
||||||
|
EthGetBlockByHash(ctx context.Context, blkHash ethtypes.EthHash, fullTxInfo bool) (ethtypes.EthBlock, error)
|
||||||
|
EthGetBlockByNumber(ctx context.Context, blkNum string, fullTxInfo bool) (ethtypes.EthBlock, error)
|
||||||
|
EthGetTransactionByHash(ctx context.Context, txHash *ethtypes.EthHash) (*ethtypes.EthTx, error)
|
||||||
|
EthGetTransactionByHashLimited(ctx context.Context, txHash *ethtypes.EthHash, limit abi.ChainEpoch) (*ethtypes.EthTx, error)
|
||||||
|
EthGetTransactionHashByCid(ctx context.Context, cid cid.Cid) (*ethtypes.EthHash, error)
|
||||||
|
EthGetMessageCidByTransactionHash(ctx context.Context, txHash *ethtypes.EthHash) (*cid.Cid, error)
|
||||||
|
EthGetTransactionCount(ctx context.Context, sender ethtypes.EthAddress, blkOpt string) (ethtypes.EthUint64, error)
|
||||||
|
EthGetTransactionReceipt(ctx context.Context, txHash ethtypes.EthHash) (*EthTxReceipt, error)
|
||||||
|
EthGetTransactionReceiptLimited(ctx context.Context, txHash ethtypes.EthHash, limit abi.ChainEpoch) (*EthTxReceipt, error)
|
||||||
|
EthGetCode(ctx context.Context, address ethtypes.EthAddress, blkOpt string) (ethtypes.EthBytes, error)
|
||||||
|
EthGetStorageAt(ctx context.Context, address ethtypes.EthAddress, position ethtypes.EthBytes, blkParam string) (ethtypes.EthBytes, error)
|
||||||
|
EthGetBalance(ctx context.Context, address ethtypes.EthAddress, blkParam string) (ethtypes.EthBigInt, error)
|
||||||
|
EthChainId(ctx context.Context) (ethtypes.EthUint64, error)
|
||||||
|
NetVersion(ctx context.Context) (string, error)
|
||||||
|
NetListening(ctx context.Context) (bool, error)
|
||||||
|
EthProtocolVersion(ctx context.Context) (ethtypes.EthUint64, error)
|
||||||
|
EthGasPrice(ctx context.Context) (ethtypes.EthBigInt, error)
|
||||||
|
EthFeeHistory(ctx context.Context, p jsonrpc.RawParams) (ethtypes.EthFeeHistory, error)
|
||||||
|
EthMaxPriorityFeePerGas(ctx context.Context) (ethtypes.EthBigInt, error)
|
||||||
|
EthEstimateGas(ctx context.Context, tx ethtypes.EthCall) (ethtypes.EthUint64, error)
|
||||||
|
EthCall(ctx context.Context, tx ethtypes.EthCall, blkParam string) (ethtypes.EthBytes, error)
|
||||||
|
EthSendRawTransaction(ctx context.Context, rawTx ethtypes.EthBytes) (ethtypes.EthHash, error)
|
||||||
|
EthGetLogs(ctx context.Context, filter *ethtypes.EthFilterSpec) (*ethtypes.EthFilterResult, error)
|
||||||
|
EthGetFilterChanges(ctx context.Context, id ethtypes.EthFilterID) (*ethtypes.EthFilterResult, error)
|
||||||
|
EthGetFilterLogs(ctx context.Context, id ethtypes.EthFilterID) (*ethtypes.EthFilterResult, error)
|
||||||
|
EthNewFilter(ctx context.Context, filter *ethtypes.EthFilterSpec) (ethtypes.EthFilterID, error)
|
||||||
|
EthNewBlockFilter(ctx context.Context) (ethtypes.EthFilterID, error)
|
||||||
|
EthNewPendingTransactionFilter(ctx context.Context) (ethtypes.EthFilterID, error)
|
||||||
|
EthUninstallFilter(ctx context.Context, id ethtypes.EthFilterID) (bool, error)
|
||||||
|
EthSubscribe(ctx context.Context, params jsonrpc.RawParams) (ethtypes.EthSubscriptionID, error)
|
||||||
|
EthUnsubscribe(ctx context.Context, id ethtypes.EthSubscriptionID) (bool, error)
|
||||||
|
Web3ClientVersion(ctx context.Context) (string, error)
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-4
@@ -4,10 +4,10 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/libp2p/go-libp2p-core/metrics"
|
"github.com/libp2p/go-libp2p/core/metrics"
|
||||||
"github.com/libp2p/go-libp2p-core/network"
|
"github.com/libp2p/go-libp2p/core/network"
|
||||||
"github.com/libp2p/go-libp2p-core/peer"
|
"github.com/libp2p/go-libp2p/core/peer"
|
||||||
"github.com/libp2p/go-libp2p-core/protocol"
|
"github.com/libp2p/go-libp2p/core/protocol"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MODIFYING THE API INTERFACE
|
// MODIFYING THE API INTERFACE
|
||||||
|
|||||||
+197
-24
@@ -7,20 +7,22 @@ import (
|
|||||||
|
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
"github.com/libp2p/go-libp2p-core/peer"
|
"github.com/libp2p/go-libp2p/core/peer"
|
||||||
|
|
||||||
"github.com/filecoin-project/go-address"
|
"github.com/filecoin-project/go-address"
|
||||||
datatransfer "github.com/filecoin-project/go-data-transfer"
|
"github.com/filecoin-project/go-bitfield"
|
||||||
|
datatransfer "github.com/filecoin-project/go-data-transfer/v2"
|
||||||
"github.com/filecoin-project/go-fil-markets/piecestore"
|
"github.com/filecoin-project/go-fil-markets/piecestore"
|
||||||
"github.com/filecoin-project/go-fil-markets/retrievalmarket"
|
"github.com/filecoin-project/go-fil-markets/retrievalmarket"
|
||||||
"github.com/filecoin-project/go-fil-markets/storagemarket"
|
"github.com/filecoin-project/go-fil-markets/storagemarket"
|
||||||
"github.com/filecoin-project/go-jsonrpc/auth"
|
"github.com/filecoin-project/go-jsonrpc/auth"
|
||||||
"github.com/filecoin-project/go-state-types/abi"
|
"github.com/filecoin-project/go-state-types/abi"
|
||||||
"github.com/filecoin-project/go-state-types/builtin/v8/market"
|
"github.com/filecoin-project/go-state-types/big"
|
||||||
"github.com/filecoin-project/go-state-types/builtin/v8/miner"
|
"github.com/filecoin-project/go-state-types/builtin/v9/market"
|
||||||
|
"github.com/filecoin-project/go-state-types/builtin/v9/miner"
|
||||||
abinetwork "github.com/filecoin-project/go-state-types/network"
|
abinetwork "github.com/filecoin-project/go-state-types/network"
|
||||||
|
|
||||||
"github.com/filecoin-project/lotus/chain/actors/builtin"
|
builtinactors "github.com/filecoin-project/lotus/chain/actors/builtin"
|
||||||
"github.com/filecoin-project/lotus/chain/types"
|
"github.com/filecoin-project/lotus/chain/types"
|
||||||
"github.com/filecoin-project/lotus/storage/pipeline/sealiface"
|
"github.com/filecoin-project/lotus/storage/pipeline/sealiface"
|
||||||
"github.com/filecoin-project/lotus/storage/sealer/fsutil"
|
"github.com/filecoin-project/lotus/storage/sealer/fsutil"
|
||||||
@@ -48,6 +50,16 @@ type StorageMiner interface {
|
|||||||
ActorSectorSize(context.Context, address.Address) (abi.SectorSize, error) //perm:read
|
ActorSectorSize(context.Context, address.Address) (abi.SectorSize, error) //perm:read
|
||||||
ActorAddressConfig(ctx context.Context) (AddressConfig, error) //perm:read
|
ActorAddressConfig(ctx context.Context) (AddressConfig, error) //perm:read
|
||||||
|
|
||||||
|
// WithdrawBalance allows to withdraw balance from miner actor to owner address
|
||||||
|
// Specify amount as "0" to withdraw full balance. This method returns a message CID
|
||||||
|
// and does not wait for message execution
|
||||||
|
ActorWithdrawBalance(ctx context.Context, amount abi.TokenAmount) (cid.Cid, error) //perm:admin
|
||||||
|
|
||||||
|
// BeneficiaryWithdrawBalance allows the beneficiary of a miner to withdraw balance from miner actor
|
||||||
|
// Specify amount as "0" to withdraw full balance. This method returns a message CID
|
||||||
|
// and does not wait for message execution
|
||||||
|
BeneficiaryWithdrawBalance(context.Context, abi.TokenAmount) (cid.Cid, error) //perm:admin
|
||||||
|
|
||||||
MiningBase(context.Context) (*types.TipSet, error) //perm:read
|
MiningBase(context.Context) (*types.TipSet, error) //perm:read
|
||||||
|
|
||||||
ComputeWindowPoSt(ctx context.Context, dlIdx uint64, tsk types.TipSetKey) ([]miner.SubmitWindowedPoStParams, error) //perm:admin
|
ComputeWindowPoSt(ctx context.Context, dlIdx uint64, tsk types.TipSetKey) ([]miner.SubmitWindowedPoStParams, error) //perm:admin
|
||||||
@@ -118,12 +130,29 @@ type StorageMiner interface {
|
|||||||
// SectorAbortUpgrade can be called on sectors that are in the process of being upgraded to abort it
|
// SectorAbortUpgrade can be called on sectors that are in the process of being upgraded to abort it
|
||||||
SectorAbortUpgrade(context.Context, abi.SectorNumber) error //perm:admin
|
SectorAbortUpgrade(context.Context, abi.SectorNumber) error //perm:admin
|
||||||
|
|
||||||
|
// SectorNumAssignerMeta returns sector number assigner metadata - reserved/allocated
|
||||||
|
SectorNumAssignerMeta(ctx context.Context) (NumAssignerMeta, error) //perm:read
|
||||||
|
// SectorNumReservations returns a list of sector number reservations
|
||||||
|
SectorNumReservations(ctx context.Context) (map[string]bitfield.BitField, error) //perm:read
|
||||||
|
// SectorNumReserve creates a new sector number reservation. Will fail if any other reservation has colliding
|
||||||
|
// numbers or name. Set force to true to override safety checks.
|
||||||
|
// Valid characters for name: a-z, A-Z, 0-9, _, -
|
||||||
|
SectorNumReserve(ctx context.Context, name string, sectors bitfield.BitField, force bool) error //perm:admin
|
||||||
|
// SectorNumReserveCount creates a new sector number reservation for `count` sector numbers.
|
||||||
|
// by default lotus will allocate lowest-available sector numbers to the reservation.
|
||||||
|
// For restrictions on `name` see SectorNumReserve
|
||||||
|
SectorNumReserveCount(ctx context.Context, name string, count uint64) (bitfield.BitField, error) //perm:admin
|
||||||
|
// SectorNumFree drops a sector reservation
|
||||||
|
SectorNumFree(ctx context.Context, name string) error //perm:admin
|
||||||
|
|
||||||
|
SectorReceive(ctx context.Context, meta RemoteSectorMeta) error //perm:admin
|
||||||
|
|
||||||
// WorkerConnect tells the node to connect to workers RPC
|
// WorkerConnect tells the node to connect to workers RPC
|
||||||
WorkerConnect(context.Context, string) error //perm:admin retry:true
|
WorkerConnect(context.Context, string) error //perm:admin retry:true
|
||||||
WorkerStats(context.Context) (map[uuid.UUID]storiface.WorkerStats, error) //perm:admin
|
WorkerStats(context.Context) (map[uuid.UUID]storiface.WorkerStats, error) //perm:admin
|
||||||
WorkerJobs(context.Context) (map[uuid.UUID][]storiface.WorkerJob, error) //perm:admin
|
WorkerJobs(context.Context) (map[uuid.UUID][]storiface.WorkerJob, error) //perm:admin
|
||||||
|
|
||||||
//storiface.WorkerReturn
|
// storiface.WorkerReturn
|
||||||
ReturnDataCid(ctx context.Context, callID storiface.CallID, pi abi.PieceInfo, err *storiface.CallError) error //perm:admin retry:true
|
ReturnDataCid(ctx context.Context, callID storiface.CallID, pi abi.PieceInfo, err *storiface.CallError) error //perm:admin retry:true
|
||||||
ReturnAddPiece(ctx context.Context, callID storiface.CallID, pi abi.PieceInfo, err *storiface.CallError) error //perm:admin retry:true
|
ReturnAddPiece(ctx context.Context, callID storiface.CallID, pi abi.PieceInfo, err *storiface.CallError) error //perm:admin retry:true
|
||||||
ReturnSealPreCommit1(ctx context.Context, callID storiface.CallID, p1o storiface.PreCommit1Out, err *storiface.CallError) error //perm:admin retry:true
|
ReturnSealPreCommit1(ctx context.Context, callID storiface.CallID, p1o storiface.PreCommit1Out, err *storiface.CallError) error //perm:admin retry:true
|
||||||
@@ -140,33 +169,54 @@ type StorageMiner interface {
|
|||||||
ReturnMoveStorage(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error //perm:admin retry:true
|
ReturnMoveStorage(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error //perm:admin retry:true
|
||||||
ReturnUnsealPiece(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error //perm:admin retry:true
|
ReturnUnsealPiece(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error //perm:admin retry:true
|
||||||
ReturnReadPiece(ctx context.Context, callID storiface.CallID, ok bool, err *storiface.CallError) error //perm:admin retry:true
|
ReturnReadPiece(ctx context.Context, callID storiface.CallID, ok bool, err *storiface.CallError) error //perm:admin retry:true
|
||||||
|
ReturnDownloadSector(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error //perm:admin retry:true
|
||||||
ReturnFetch(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error //perm:admin retry:true
|
ReturnFetch(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error //perm:admin retry:true
|
||||||
|
|
||||||
// SealingSchedDiag dumps internal sealing scheduler state
|
// SealingSchedDiag dumps internal sealing scheduler state
|
||||||
SealingSchedDiag(ctx context.Context, doSched bool) (interface{}, error) //perm:admin
|
SealingSchedDiag(ctx context.Context, doSched bool) (interface{}, error) //perm:admin
|
||||||
SealingAbort(ctx context.Context, call storiface.CallID) error //perm:admin
|
SealingAbort(ctx context.Context, call storiface.CallID) error //perm:admin
|
||||||
|
// SealingSchedRemove removes a request from sealing pipeline
|
||||||
|
SealingRemoveRequest(ctx context.Context, schedId uuid.UUID) error //perm:admin
|
||||||
|
|
||||||
// SectorIndex
|
// paths.SectorIndex
|
||||||
StorageAttach(context.Context, storiface.StorageInfo, fsutil.FsStat) error //perm:admin
|
StorageAttach(context.Context, storiface.StorageInfo, fsutil.FsStat) error //perm:admin
|
||||||
StorageInfo(context.Context, storiface.ID) (storiface.StorageInfo, error) //perm:admin
|
StorageDetach(ctx context.Context, id storiface.ID, url string) error //perm:admin
|
||||||
StorageReportHealth(context.Context, storiface.ID, storiface.HealthReport) error //perm:admin
|
StorageInfo(context.Context, storiface.ID) (storiface.StorageInfo, error) //perm:admin
|
||||||
StorageDeclareSector(ctx context.Context, storageID storiface.ID, s abi.SectorID, ft storiface.SectorFileType, primary bool) error //perm:admin
|
StorageReportHealth(context.Context, storiface.ID, storiface.HealthReport) error //perm:admin
|
||||||
StorageDropSector(ctx context.Context, storageID storiface.ID, s abi.SectorID, ft storiface.SectorFileType) error //perm:admin
|
StorageDeclareSector(ctx context.Context, storageID storiface.ID, s abi.SectorID, ft storiface.SectorFileType, primary bool) error //perm:admin
|
||||||
|
StorageDropSector(ctx context.Context, storageID storiface.ID, s abi.SectorID, ft storiface.SectorFileType) error //perm:admin
|
||||||
|
// StorageFindSector returns list of paths where the specified sector files exist.
|
||||||
|
//
|
||||||
|
// If allowFetch is set, list of paths to which the sector can be fetched will also be returned.
|
||||||
|
// - Paths which have sector files locally (don't require fetching) will be listed first.
|
||||||
|
// - Paths which have sector files locally will not be filtered based on based on AllowTypes/DenyTypes.
|
||||||
|
// - Paths which require fetching will be filtered based on AllowTypes/DenyTypes. If multiple
|
||||||
|
// file types are specified, each type will be considered individually, and a union of all paths
|
||||||
|
// which can accommodate each file type will be returned.
|
||||||
StorageFindSector(ctx context.Context, sector abi.SectorID, ft storiface.SectorFileType, ssize abi.SectorSize, allowFetch bool) ([]storiface.SectorStorageInfo, error) //perm:admin
|
StorageFindSector(ctx context.Context, sector abi.SectorID, ft storiface.SectorFileType, ssize abi.SectorSize, allowFetch bool) ([]storiface.SectorStorageInfo, error) //perm:admin
|
||||||
StorageBestAlloc(ctx context.Context, allocate storiface.SectorFileType, ssize abi.SectorSize, pathType storiface.PathType) ([]storiface.StorageInfo, error) //perm:admin
|
// StorageBestAlloc returns list of paths where sector files of the specified type can be allocated, ordered by preference.
|
||||||
StorageLock(ctx context.Context, sector abi.SectorID, read storiface.SectorFileType, write storiface.SectorFileType) error //perm:admin
|
// Paths with more weight and more % of free space are preferred.
|
||||||
StorageTryLock(ctx context.Context, sector abi.SectorID, read storiface.SectorFileType, write storiface.SectorFileType) (bool, error) //perm:admin
|
// Note: This method doesn't filter paths based on AllowTypes/DenyTypes.
|
||||||
StorageList(ctx context.Context) (map[storiface.ID][]storiface.Decl, error) //perm:admin
|
StorageBestAlloc(ctx context.Context, allocate storiface.SectorFileType, ssize abi.SectorSize, pathType storiface.PathType) ([]storiface.StorageInfo, error) //perm:admin
|
||||||
StorageGetLocks(ctx context.Context) (storiface.SectorLocks, error) //perm:admin
|
StorageLock(ctx context.Context, sector abi.SectorID, read storiface.SectorFileType, write storiface.SectorFileType) error //perm:admin
|
||||||
|
StorageTryLock(ctx context.Context, sector abi.SectorID, read storiface.SectorFileType, write storiface.SectorFileType) (bool, error) //perm:admin
|
||||||
|
StorageList(ctx context.Context) (map[storiface.ID][]storiface.Decl, error) //perm:admin
|
||||||
|
StorageGetLocks(ctx context.Context) (storiface.SectorLocks, error) //perm:admin
|
||||||
|
|
||||||
StorageLocal(ctx context.Context) (map[storiface.ID]string, error) //perm:admin
|
StorageLocal(ctx context.Context) (map[storiface.ID]string, error) //perm:admin
|
||||||
StorageStat(ctx context.Context, id storiface.ID) (fsutil.FsStat, error) //perm:admin
|
StorageStat(ctx context.Context, id storiface.ID) (fsutil.FsStat, error) //perm:admin
|
||||||
|
|
||||||
StorageAuthVerify(ctx context.Context, token string) ([]auth.Permission, error) //perm:read
|
StorageAuthVerify(ctx context.Context, token string) ([]auth.Permission, error) //perm:read
|
||||||
|
|
||||||
MarketImportDealData(ctx context.Context, propcid cid.Cid, path string) error //perm:write
|
StorageAddLocal(ctx context.Context, path string) error //perm:admin
|
||||||
MarketListDeals(ctx context.Context) ([]*MarketDeal, error) //perm:read
|
StorageDetachLocal(ctx context.Context, path string) error //perm:admin
|
||||||
MarketListRetrievalDeals(ctx context.Context) ([]retrievalmarket.ProviderDealState, error) //perm:read
|
StorageRedeclareLocal(ctx context.Context, id *storiface.ID, dropMissing bool) error //perm:admin
|
||||||
|
|
||||||
|
MarketImportDealData(ctx context.Context, propcid cid.Cid, path string) error //perm:write
|
||||||
|
MarketListDeals(ctx context.Context) ([]*MarketDeal, error) //perm:read
|
||||||
|
|
||||||
|
// MarketListRetrievalDeals is deprecated, returns empty list
|
||||||
|
MarketListRetrievalDeals(ctx context.Context) ([]struct{}, error) //perm:read
|
||||||
MarketGetDealUpdates(ctx context.Context) (<-chan storagemarket.MinerDeal, error) //perm:read
|
MarketGetDealUpdates(ctx context.Context) (<-chan storagemarket.MinerDeal, error) //perm:read
|
||||||
MarketListIncompleteDeals(ctx context.Context) ([]storagemarket.MinerDeal, error) //perm:read
|
MarketListIncompleteDeals(ctx context.Context) ([]storagemarket.MinerDeal, error) //perm:read
|
||||||
MarketSetAsk(ctx context.Context, price types.BigInt, verifiedPrice types.BigInt, duration abi.ChainEpoch, minPieceSize abi.PaddedPieceSize, maxPieceSize abi.PaddedPieceSize) error //perm:admin
|
MarketSetAsk(ctx context.Context, price types.BigInt, verifiedPrice types.BigInt, duration abi.ChainEpoch, minPieceSize abi.PaddedPieceSize, maxPieceSize abi.PaddedPieceSize) error //perm:admin
|
||||||
@@ -261,8 +311,6 @@ type StorageMiner interface {
|
|||||||
DealsConsiderUnverifiedStorageDeals(context.Context) (bool, error) //perm:admin
|
DealsConsiderUnverifiedStorageDeals(context.Context) (bool, error) //perm:admin
|
||||||
DealsSetConsiderUnverifiedStorageDeals(context.Context, bool) error //perm:admin
|
DealsSetConsiderUnverifiedStorageDeals(context.Context, bool) error //perm:admin
|
||||||
|
|
||||||
StorageAddLocal(ctx context.Context, path string) error //perm:admin
|
|
||||||
|
|
||||||
PiecesListPieces(ctx context.Context) ([]cid.Cid, error) //perm:read
|
PiecesListPieces(ctx context.Context) ([]cid.Cid, error) //perm:read
|
||||||
PiecesListCidInfos(ctx context.Context) ([]cid.Cid, error) //perm:read
|
PiecesListCidInfos(ctx context.Context) ([]cid.Cid, error) //perm:read
|
||||||
PiecesGetPieceInfo(ctx context.Context, pieceCid cid.Cid) (*piecestore.PieceInfo, error) //perm:read
|
PiecesGetPieceInfo(ctx context.Context, pieceCid cid.Cid) (*piecestore.PieceInfo, error) //perm:read
|
||||||
@@ -274,9 +322,14 @@ type StorageMiner interface {
|
|||||||
// the path specified when calling CreateBackup is within the base path
|
// the path specified when calling CreateBackup is within the base path
|
||||||
CreateBackup(ctx context.Context, fpath string) error //perm:admin
|
CreateBackup(ctx context.Context, fpath string) error //perm:admin
|
||||||
|
|
||||||
CheckProvable(ctx context.Context, pp abi.RegisteredPoStProof, sectors []storiface.SectorRef, expensive bool) (map[abi.SectorNumber]string, error) //perm:admin
|
CheckProvable(ctx context.Context, pp abi.RegisteredPoStProof, sectors []storiface.SectorRef) (map[abi.SectorNumber]string, error) //perm:admin
|
||||||
|
|
||||||
ComputeProof(ctx context.Context, ssi []builtin.ExtendedSectorInfo, rand abi.PoStRandomness, poStEpoch abi.ChainEpoch, nv abinetwork.Version) ([]builtin.PoStProof, error) //perm:read
|
ComputeProof(ctx context.Context, ssi []builtinactors.ExtendedSectorInfo, rand abi.PoStRandomness, poStEpoch abi.ChainEpoch, nv abinetwork.Version) ([]builtinactors.PoStProof, error) //perm:read
|
||||||
|
|
||||||
|
// RecoverFault can be used to declare recoveries manually. It sends messages
|
||||||
|
// to the miner actor with details of recovered sectors and returns the CID of messages. It honors the
|
||||||
|
// maxPartitionsPerRecoveryMessage from the config
|
||||||
|
RecoverFault(ctx context.Context, sectors []abi.SectorNumber) ([]cid.Cid, error) //perm:admin
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ storiface.WorkerReturn = *new(StorageMiner)
|
var _ storiface.WorkerReturn = *new(StorageMiner)
|
||||||
@@ -366,6 +419,10 @@ func (st *SealSeed) Equals(ost *SealSeed) bool {
|
|||||||
|
|
||||||
type SectorState string
|
type SectorState string
|
||||||
|
|
||||||
|
func (s *SectorState) String() string {
|
||||||
|
return string(*s)
|
||||||
|
}
|
||||||
|
|
||||||
type AddrUse int
|
type AddrUse int
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@@ -447,3 +504,119 @@ type DagstoreInitializeAllEvent struct {
|
|||||||
Total int
|
Total int
|
||||||
Current int
|
Current int
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type NumAssignerMeta struct {
|
||||||
|
Reserved bitfield.BitField
|
||||||
|
Allocated bitfield.BitField
|
||||||
|
|
||||||
|
// ChainAllocated+Reserved+Allocated
|
||||||
|
InUse bitfield.BitField
|
||||||
|
|
||||||
|
Next abi.SectorNumber
|
||||||
|
}
|
||||||
|
|
||||||
|
type RemoteSectorMeta struct {
|
||||||
|
////////
|
||||||
|
// BASIC SECTOR INFORMATION
|
||||||
|
|
||||||
|
// State specifies the first state the sector will enter after being imported
|
||||||
|
// Must be one of the following states:
|
||||||
|
// * Packing
|
||||||
|
// * GetTicket
|
||||||
|
// * PreCommitting
|
||||||
|
// * SubmitCommit
|
||||||
|
// * Proving/Available
|
||||||
|
State SectorState
|
||||||
|
|
||||||
|
Sector abi.SectorID
|
||||||
|
Type abi.RegisteredSealProof
|
||||||
|
|
||||||
|
////////
|
||||||
|
// SEALING METADATA
|
||||||
|
// (allows lotus to continue the sealing process)
|
||||||
|
|
||||||
|
// Required in Packing and later
|
||||||
|
Pieces []SectorPiece // todo better type?
|
||||||
|
|
||||||
|
// Required in PreCommitting and later
|
||||||
|
TicketValue abi.SealRandomness
|
||||||
|
TicketEpoch abi.ChainEpoch
|
||||||
|
PreCommit1Out storiface.PreCommit1Out // todo specify better
|
||||||
|
|
||||||
|
CommD *cid.Cid
|
||||||
|
CommR *cid.Cid // SectorKey
|
||||||
|
|
||||||
|
// Required in SubmitCommit and later
|
||||||
|
PreCommitInfo *miner.SectorPreCommitInfo
|
||||||
|
PreCommitDeposit *big.Int
|
||||||
|
PreCommitMessage *cid.Cid
|
||||||
|
PreCommitTipSet types.TipSetKey
|
||||||
|
|
||||||
|
SeedValue abi.InteractiveSealRandomness
|
||||||
|
SeedEpoch abi.ChainEpoch
|
||||||
|
|
||||||
|
CommitProof []byte
|
||||||
|
|
||||||
|
// Required in Proving/Available
|
||||||
|
CommitMessage *cid.Cid
|
||||||
|
|
||||||
|
// Optional sector metadata to import
|
||||||
|
Log []SectorLog
|
||||||
|
|
||||||
|
////////
|
||||||
|
// SECTOR DATA SOURCE
|
||||||
|
|
||||||
|
// Sector urls - lotus will use those for fetching files into local storage
|
||||||
|
|
||||||
|
// Required in all states
|
||||||
|
DataUnsealed *storiface.SectorLocation
|
||||||
|
|
||||||
|
// Required in PreCommitting and later
|
||||||
|
DataSealed *storiface.SectorLocation
|
||||||
|
DataCache *storiface.SectorLocation
|
||||||
|
|
||||||
|
////////
|
||||||
|
// SEALING SERVICE HOOKS
|
||||||
|
|
||||||
|
// URL
|
||||||
|
// RemoteCommit1Endpoint is an URL of POST endpoint which lotus will call requesting Commit1 (seal_commit_phase1)
|
||||||
|
// request body will be json-serialized RemoteCommit1Params struct
|
||||||
|
RemoteCommit1Endpoint string
|
||||||
|
|
||||||
|
// RemoteCommit2Endpoint is an URL of POST endpoint which lotus will call requesting Commit2 (seal_commit_phase2)
|
||||||
|
// request body will be json-serialized RemoteCommit2Params struct
|
||||||
|
RemoteCommit2Endpoint string
|
||||||
|
|
||||||
|
// RemoteSealingDoneEndpoint is called after the sector exists the sealing pipeline
|
||||||
|
// request body will be json-serialized RemoteSealingDoneParams struct
|
||||||
|
RemoteSealingDoneEndpoint string
|
||||||
|
}
|
||||||
|
|
||||||
|
type RemoteCommit1Params struct {
|
||||||
|
Ticket, Seed []byte
|
||||||
|
|
||||||
|
Unsealed cid.Cid
|
||||||
|
Sealed cid.Cid
|
||||||
|
|
||||||
|
ProofType abi.RegisteredSealProof
|
||||||
|
}
|
||||||
|
|
||||||
|
type RemoteCommit2Params struct {
|
||||||
|
Sector abi.SectorID
|
||||||
|
ProofType abi.RegisteredSealProof
|
||||||
|
|
||||||
|
// todo spec better
|
||||||
|
Commit1Out storiface.Commit1Out
|
||||||
|
}
|
||||||
|
|
||||||
|
type RemoteSealingDoneParams struct {
|
||||||
|
// Successful is true if the sector has entered state considered as "successfully sealed"
|
||||||
|
Successful bool
|
||||||
|
|
||||||
|
// State is the state the sector has entered
|
||||||
|
// For example "Proving" / "Removing"
|
||||||
|
State string
|
||||||
|
|
||||||
|
// Optional commit message CID
|
||||||
|
CommitMessage *cid.Cid
|
||||||
|
}
|
||||||
|
|||||||
+19
-1
@@ -1,4 +1,4 @@
|
|||||||
//stm: #unit
|
// stm: #unit
|
||||||
package api
|
package api
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -12,6 +12,9 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
"golang.org/x/xerrors"
|
||||||
|
|
||||||
|
"github.com/filecoin-project/go-jsonrpc"
|
||||||
)
|
)
|
||||||
|
|
||||||
func goCmd() string {
|
func goCmd() string {
|
||||||
@@ -124,3 +127,18 @@ func TestPermTags(t *testing.T) {
|
|||||||
_ = PermissionedStorMinerAPI(&StorageMinerStruct{})
|
_ = PermissionedStorMinerAPI(&StorageMinerStruct{})
|
||||||
_ = PermissionedWorkerAPI(&WorkerStruct{})
|
_ = PermissionedWorkerAPI(&WorkerStruct{})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRetryErrorIsInTrue(t *testing.T) {
|
||||||
|
errorsToRetry := []error{&jsonrpc.RPCConnectionError{}}
|
||||||
|
require.True(t, ErrorIsIn(&jsonrpc.RPCConnectionError{}, errorsToRetry))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestRetryErrorIsInFalse(t *testing.T) {
|
||||||
|
errorsToRetry := []error{&jsonrpc.RPCConnectionError{}}
|
||||||
|
require.False(t, ErrorIsIn(xerrors.Errorf("random error"), errorsToRetry))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestRetryWrappedErrorIsInTrue(t *testing.T) {
|
||||||
|
errorsToRetry := []error{&jsonrpc.RPCConnectionError{}}
|
||||||
|
require.True(t, ErrorIsIn(xerrors.Errorf("wrapped: %w", &jsonrpc.RPCConnectionError{}), errorsToRetry))
|
||||||
|
}
|
||||||
|
|||||||
+13
-4
@@ -39,16 +39,17 @@ type Worker interface {
|
|||||||
SealPreCommit2(ctx context.Context, sector storiface.SectorRef, pc1o storiface.PreCommit1Out) (storiface.CallID, error) //perm:admin
|
SealPreCommit2(ctx context.Context, sector storiface.SectorRef, pc1o storiface.PreCommit1Out) (storiface.CallID, error) //perm:admin
|
||||||
SealCommit1(ctx context.Context, sector storiface.SectorRef, ticket abi.SealRandomness, seed abi.InteractiveSealRandomness, pieces []abi.PieceInfo, cids storiface.SectorCids) (storiface.CallID, error) //perm:admin
|
SealCommit1(ctx context.Context, sector storiface.SectorRef, ticket abi.SealRandomness, seed abi.InteractiveSealRandomness, pieces []abi.PieceInfo, cids storiface.SectorCids) (storiface.CallID, error) //perm:admin
|
||||||
SealCommit2(ctx context.Context, sector storiface.SectorRef, c1o storiface.Commit1Out) (storiface.CallID, error) //perm:admin
|
SealCommit2(ctx context.Context, sector storiface.SectorRef, c1o storiface.Commit1Out) (storiface.CallID, error) //perm:admin
|
||||||
FinalizeSector(ctx context.Context, sector storiface.SectorRef, keepUnsealed []storiface.Range) (storiface.CallID, error) //perm:admin
|
FinalizeSector(ctx context.Context, sector storiface.SectorRef) (storiface.CallID, error) //perm:admin
|
||||||
FinalizeReplicaUpdate(ctx context.Context, sector storiface.SectorRef, keepUnsealed []storiface.Range) (storiface.CallID, error) //perm:admin
|
FinalizeReplicaUpdate(ctx context.Context, sector storiface.SectorRef) (storiface.CallID, error) //perm:admin
|
||||||
ReplicaUpdate(ctx context.Context, sector storiface.SectorRef, pieces []abi.PieceInfo) (storiface.CallID, error) //perm:admin
|
ReplicaUpdate(ctx context.Context, sector storiface.SectorRef, pieces []abi.PieceInfo) (storiface.CallID, error) //perm:admin
|
||||||
ProveReplicaUpdate1(ctx context.Context, sector storiface.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid) (storiface.CallID, error) //perm:admin
|
ProveReplicaUpdate1(ctx context.Context, sector storiface.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid) (storiface.CallID, error) //perm:admin
|
||||||
ProveReplicaUpdate2(ctx context.Context, sector storiface.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid, vanillaProofs storiface.ReplicaVanillaProofs) (storiface.CallID, error) //perm:admin
|
ProveReplicaUpdate2(ctx context.Context, sector storiface.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid, vanillaProofs storiface.ReplicaVanillaProofs) (storiface.CallID, error) //perm:admin
|
||||||
GenerateSectorKeyFromData(ctx context.Context, sector storiface.SectorRef, commD cid.Cid) (storiface.CallID, error) //perm:admin
|
GenerateSectorKeyFromData(ctx context.Context, sector storiface.SectorRef, commD cid.Cid) (storiface.CallID, error) //perm:admin
|
||||||
ReleaseUnsealed(ctx context.Context, sector storiface.SectorRef, safeToFree []storiface.Range) (storiface.CallID, error) //perm:admin
|
ReleaseUnsealed(ctx context.Context, sector storiface.SectorRef, keepUnsealed []storiface.Range) (storiface.CallID, error) //perm:admin
|
||||||
MoveStorage(ctx context.Context, sector storiface.SectorRef, types storiface.SectorFileType) (storiface.CallID, error) //perm:admin
|
MoveStorage(ctx context.Context, sector storiface.SectorRef, types storiface.SectorFileType) (storiface.CallID, error) //perm:admin
|
||||||
UnsealPiece(context.Context, storiface.SectorRef, storiface.UnpaddedByteIndex, abi.UnpaddedPieceSize, abi.SealRandomness, cid.Cid) (storiface.CallID, error) //perm:admin
|
UnsealPiece(context.Context, storiface.SectorRef, storiface.UnpaddedByteIndex, abi.UnpaddedPieceSize, abi.SealRandomness, cid.Cid) (storiface.CallID, error) //perm:admin
|
||||||
Fetch(context.Context, storiface.SectorRef, storiface.SectorFileType, storiface.PathType, storiface.AcquireMode) (storiface.CallID, error) //perm:admin
|
Fetch(context.Context, storiface.SectorRef, storiface.SectorFileType, storiface.PathType, storiface.AcquireMode) (storiface.CallID, error) //perm:admin
|
||||||
|
DownloadSectorData(ctx context.Context, sector storiface.SectorRef, finalized bool, src map[storiface.SectorFileType]storiface.SectorLocation) (storiface.CallID, error) //perm:admin
|
||||||
|
|
||||||
GenerateWinningPoSt(ctx context.Context, ppt abi.RegisteredPoStProof, mid abi.ActorID, sectors []storiface.PostSectorChallenge, randomness abi.PoStRandomness) ([]proof.PoStProof, error) //perm:admin
|
GenerateWinningPoSt(ctx context.Context, ppt abi.RegisteredPoStProof, mid abi.ActorID, sectors []storiface.PostSectorChallenge, randomness abi.PoStRandomness) ([]proof.PoStProof, error) //perm:admin
|
||||||
GenerateWindowPoSt(ctx context.Context, ppt abi.RegisteredPoStProof, mid abi.ActorID, sectors []storiface.PostSectorChallenge, partitionIdx int, randomness abi.PoStRandomness) (storiface.WindowPoStResult, error) //perm:admin
|
GenerateWindowPoSt(ctx context.Context, ppt abi.RegisteredPoStProof, mid abi.ActorID, sectors []storiface.PostSectorChallenge, partitionIdx int, randomness abi.PoStRandomness) (storiface.WindowPoStResult, error) //perm:admin
|
||||||
@@ -59,7 +60,11 @@ type Worker interface {
|
|||||||
// Storage / Other
|
// Storage / Other
|
||||||
Remove(ctx context.Context, sector abi.SectorID) error //perm:admin
|
Remove(ctx context.Context, sector abi.SectorID) error //perm:admin
|
||||||
|
|
||||||
StorageAddLocal(ctx context.Context, path string) error //perm:admin
|
StorageLocal(ctx context.Context) (map[storiface.ID]string, error) //perm:admin
|
||||||
|
StorageAddLocal(ctx context.Context, path string) error //perm:admin
|
||||||
|
StorageDetachLocal(ctx context.Context, path string) error //perm:admin
|
||||||
|
StorageDetachAll(ctx context.Context) error //perm:admin
|
||||||
|
StorageRedeclareLocal(ctx context.Context, id *storiface.ID, dropMissing bool) error //perm:admin
|
||||||
|
|
||||||
// SetEnabled marks the worker as enabled/disabled. Not that this setting
|
// SetEnabled marks the worker as enabled/disabled. Not that this setting
|
||||||
// may take a few seconds to propagate to task scheduler
|
// may take a few seconds to propagate to task scheduler
|
||||||
@@ -76,6 +81,10 @@ type Worker interface {
|
|||||||
|
|
||||||
// Like ProcessSession, but returns an error when worker is disabled
|
// Like ProcessSession, but returns an error when worker is disabled
|
||||||
Session(context.Context) (uuid.UUID, error) //perm:admin
|
Session(context.Context) (uuid.UUID, error) //perm:admin
|
||||||
|
|
||||||
|
// Trigger shutdown
|
||||||
|
Shutdown(context.Context) error //perm:admin
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ storiface.WorkerCalls = *new(Worker)
|
var _ storiface.WorkerCalls = *new(Worker)
|
||||||
|
|||||||
+343
-218
@@ -13,8 +13,8 @@ import (
|
|||||||
xerrors "golang.org/x/xerrors"
|
xerrors "golang.org/x/xerrors"
|
||||||
|
|
||||||
abi "github.com/filecoin-project/go-state-types/abi"
|
abi "github.com/filecoin-project/go-state-types/abi"
|
||||||
market "github.com/filecoin-project/go-state-types/builtin/v8/market"
|
|
||||||
paych "github.com/filecoin-project/go-state-types/builtin/v8/paych"
|
paych "github.com/filecoin-project/go-state-types/builtin/v8/paych"
|
||||||
|
market "github.com/filecoin-project/go-state-types/builtin/v9/market"
|
||||||
)
|
)
|
||||||
|
|
||||||
var _ = xerrors.Errorf
|
var _ = xerrors.Errorf
|
||||||
@@ -50,22 +50,6 @@ func (t *PaymentInfo) MarshalCBOR(w io.Writer) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// t.WaitSentinel (cid.Cid) (struct)
|
|
||||||
if len("WaitSentinel") > cbg.MaxLength {
|
|
||||||
return xerrors.Errorf("Value in field \"WaitSentinel\" was too long")
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("WaitSentinel"))); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if _, err := io.WriteString(w, string("WaitSentinel")); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := cbg.WriteCid(cw, t.WaitSentinel); err != nil {
|
|
||||||
return xerrors.Errorf("failed to write cid field t.WaitSentinel: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// t.Vouchers ([]*paych.SignedVoucher) (slice)
|
// t.Vouchers ([]*paych.SignedVoucher) (slice)
|
||||||
if len("Vouchers") > cbg.MaxLength {
|
if len("Vouchers") > cbg.MaxLength {
|
||||||
return xerrors.Errorf("Value in field \"Vouchers\" was too long")
|
return xerrors.Errorf("Value in field \"Vouchers\" was too long")
|
||||||
@@ -90,6 +74,23 @@ func (t *PaymentInfo) MarshalCBOR(w io.Writer) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// t.WaitSentinel (cid.Cid) (struct)
|
||||||
|
if len("WaitSentinel") > cbg.MaxLength {
|
||||||
|
return xerrors.Errorf("Value in field \"WaitSentinel\" was too long")
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("WaitSentinel"))); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if _, err := io.WriteString(w, string("WaitSentinel")); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := cbg.WriteCid(cw, t.WaitSentinel); err != nil {
|
||||||
|
return xerrors.Errorf("failed to write cid field t.WaitSentinel: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -140,19 +141,6 @@ func (t *PaymentInfo) UnmarshalCBOR(r io.Reader) (err error) {
|
|||||||
return xerrors.Errorf("unmarshaling t.Channel: %w", err)
|
return xerrors.Errorf("unmarshaling t.Channel: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
// t.WaitSentinel (cid.Cid) (struct)
|
|
||||||
case "WaitSentinel":
|
|
||||||
|
|
||||||
{
|
|
||||||
|
|
||||||
c, err := cbg.ReadCid(cr)
|
|
||||||
if err != nil {
|
|
||||||
return xerrors.Errorf("failed to read cid field t.WaitSentinel: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
t.WaitSentinel = c
|
|
||||||
|
|
||||||
}
|
}
|
||||||
// t.Vouchers ([]*paych.SignedVoucher) (slice)
|
// t.Vouchers ([]*paych.SignedVoucher) (slice)
|
||||||
case "Vouchers":
|
case "Vouchers":
|
||||||
@@ -184,6 +172,20 @@ func (t *PaymentInfo) UnmarshalCBOR(r io.Reader) (err error) {
|
|||||||
t.Vouchers[i] = &v
|
t.Vouchers[i] = &v
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// t.WaitSentinel (cid.Cid) (struct)
|
||||||
|
case "WaitSentinel":
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
c, err := cbg.ReadCid(cr)
|
||||||
|
if err != nil {
|
||||||
|
return xerrors.Errorf("failed to read cid field t.WaitSentinel: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
t.WaitSentinel = c
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
// Field doesn't exist on this type, so ignore it
|
// Field doesn't exist on this type, so ignore it
|
||||||
cbg.ScanForLinks(r, func(cid.Cid) {})
|
cbg.ScanForLinks(r, func(cid.Cid) {})
|
||||||
@@ -204,19 +206,19 @@ func (t *SealedRef) MarshalCBOR(w io.Writer) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// t.SectorID (abi.SectorNumber) (uint64)
|
// t.Size (abi.UnpaddedPieceSize) (uint64)
|
||||||
if len("SectorID") > cbg.MaxLength {
|
if len("Size") > cbg.MaxLength {
|
||||||
return xerrors.Errorf("Value in field \"SectorID\" was too long")
|
return xerrors.Errorf("Value in field \"Size\" was too long")
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("SectorID"))); err != nil {
|
if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Size"))); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if _, err := io.WriteString(w, string("SectorID")); err != nil {
|
if _, err := io.WriteString(w, string("Size")); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.SectorID)); err != nil {
|
if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.Size)); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -236,19 +238,19 @@ func (t *SealedRef) MarshalCBOR(w io.Writer) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// t.Size (abi.UnpaddedPieceSize) (uint64)
|
// t.SectorID (abi.SectorNumber) (uint64)
|
||||||
if len("Size") > cbg.MaxLength {
|
if len("SectorID") > cbg.MaxLength {
|
||||||
return xerrors.Errorf("Value in field \"Size\" was too long")
|
return xerrors.Errorf("Value in field \"SectorID\" was too long")
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Size"))); err != nil {
|
if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("SectorID"))); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if _, err := io.WriteString(w, string("Size")); err != nil {
|
if _, err := io.WriteString(w, string("SectorID")); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.Size)); err != nil {
|
if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.SectorID)); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -293,8 +295,8 @@ func (t *SealedRef) UnmarshalCBOR(r io.Reader) (err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch name {
|
switch name {
|
||||||
// t.SectorID (abi.SectorNumber) (uint64)
|
// t.Size (abi.UnpaddedPieceSize) (uint64)
|
||||||
case "SectorID":
|
case "Size":
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -305,7 +307,7 @@ func (t *SealedRef) UnmarshalCBOR(r io.Reader) (err error) {
|
|||||||
if maj != cbg.MajUnsignedInt {
|
if maj != cbg.MajUnsignedInt {
|
||||||
return fmt.Errorf("wrong type for uint64 field")
|
return fmt.Errorf("wrong type for uint64 field")
|
||||||
}
|
}
|
||||||
t.SectorID = abi.SectorNumber(extra)
|
t.Size = abi.UnpaddedPieceSize(extra)
|
||||||
|
|
||||||
}
|
}
|
||||||
// t.Offset (abi.PaddedPieceSize) (uint64)
|
// t.Offset (abi.PaddedPieceSize) (uint64)
|
||||||
@@ -323,8 +325,8 @@ func (t *SealedRef) UnmarshalCBOR(r io.Reader) (err error) {
|
|||||||
t.Offset = abi.PaddedPieceSize(extra)
|
t.Offset = abi.PaddedPieceSize(extra)
|
||||||
|
|
||||||
}
|
}
|
||||||
// t.Size (abi.UnpaddedPieceSize) (uint64)
|
// t.SectorID (abi.SectorNumber) (uint64)
|
||||||
case "Size":
|
case "SectorID":
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -335,7 +337,7 @@ func (t *SealedRef) UnmarshalCBOR(r io.Reader) (err error) {
|
|||||||
if maj != cbg.MajUnsignedInt {
|
if maj != cbg.MajUnsignedInt {
|
||||||
return fmt.Errorf("wrong type for uint64 field")
|
return fmt.Errorf("wrong type for uint64 field")
|
||||||
}
|
}
|
||||||
t.Size = abi.UnpaddedPieceSize(extra)
|
t.SectorID = abi.SectorNumber(extra)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -474,6 +476,28 @@ func (t *SealTicket) MarshalCBOR(w io.Writer) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// t.Epoch (abi.ChainEpoch) (int64)
|
||||||
|
if len("Epoch") > cbg.MaxLength {
|
||||||
|
return xerrors.Errorf("Value in field \"Epoch\" was too long")
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Epoch"))); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if _, err := io.WriteString(w, string("Epoch")); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if t.Epoch >= 0 {
|
||||||
|
if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.Epoch)); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if err := cw.WriteMajorTypeHeader(cbg.MajNegativeInt, uint64(-t.Epoch-1)); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// t.Value (abi.SealRandomness) (slice)
|
// t.Value (abi.SealRandomness) (slice)
|
||||||
if len("Value") > cbg.MaxLength {
|
if len("Value") > cbg.MaxLength {
|
||||||
return xerrors.Errorf("Value in field \"Value\" was too long")
|
return xerrors.Errorf("Value in field \"Value\" was too long")
|
||||||
@@ -497,28 +521,6 @@ func (t *SealTicket) MarshalCBOR(w io.Writer) error {
|
|||||||
if _, err := cw.Write(t.Value[:]); err != nil {
|
if _, err := cw.Write(t.Value[:]); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// t.Epoch (abi.ChainEpoch) (int64)
|
|
||||||
if len("Epoch") > cbg.MaxLength {
|
|
||||||
return xerrors.Errorf("Value in field \"Epoch\" was too long")
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Epoch"))); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if _, err := io.WriteString(w, string("Epoch")); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if t.Epoch >= 0 {
|
|
||||||
if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.Epoch)); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if err := cw.WriteMajorTypeHeader(cbg.MajNegativeInt, uint64(-t.Epoch-1)); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -560,7 +562,33 @@ func (t *SealTicket) UnmarshalCBOR(r io.Reader) (err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch name {
|
switch name {
|
||||||
// t.Value (abi.SealRandomness) (slice)
|
// t.Epoch (abi.ChainEpoch) (int64)
|
||||||
|
case "Epoch":
|
||||||
|
{
|
||||||
|
maj, extra, err := cr.ReadHeader()
|
||||||
|
var extraI int64
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
switch maj {
|
||||||
|
case cbg.MajUnsignedInt:
|
||||||
|
extraI = int64(extra)
|
||||||
|
if extraI < 0 {
|
||||||
|
return fmt.Errorf("int64 positive overflow")
|
||||||
|
}
|
||||||
|
case cbg.MajNegativeInt:
|
||||||
|
extraI = int64(extra)
|
||||||
|
if extraI < 0 {
|
||||||
|
return fmt.Errorf("int64 negative overflow")
|
||||||
|
}
|
||||||
|
extraI = -1 - extraI
|
||||||
|
default:
|
||||||
|
return fmt.Errorf("wrong type for int64 field: %d", maj)
|
||||||
|
}
|
||||||
|
|
||||||
|
t.Epoch = abi.ChainEpoch(extraI)
|
||||||
|
}
|
||||||
|
// t.Value (abi.SealRandomness) (slice)
|
||||||
case "Value":
|
case "Value":
|
||||||
|
|
||||||
maj, extra, err = cr.ReadHeader()
|
maj, extra, err = cr.ReadHeader()
|
||||||
@@ -582,32 +610,6 @@ func (t *SealTicket) UnmarshalCBOR(r io.Reader) (err error) {
|
|||||||
if _, err := io.ReadFull(cr, t.Value[:]); err != nil {
|
if _, err := io.ReadFull(cr, t.Value[:]); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
// t.Epoch (abi.ChainEpoch) (int64)
|
|
||||||
case "Epoch":
|
|
||||||
{
|
|
||||||
maj, extra, err := cr.ReadHeader()
|
|
||||||
var extraI int64
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
switch maj {
|
|
||||||
case cbg.MajUnsignedInt:
|
|
||||||
extraI = int64(extra)
|
|
||||||
if extraI < 0 {
|
|
||||||
return fmt.Errorf("int64 positive overflow")
|
|
||||||
}
|
|
||||||
case cbg.MajNegativeInt:
|
|
||||||
extraI = int64(extra)
|
|
||||||
if extraI < 0 {
|
|
||||||
return fmt.Errorf("int64 negative oveflow")
|
|
||||||
}
|
|
||||||
extraI = -1 - extraI
|
|
||||||
default:
|
|
||||||
return fmt.Errorf("wrong type for int64 field: %d", maj)
|
|
||||||
}
|
|
||||||
|
|
||||||
t.Epoch = abi.ChainEpoch(extraI)
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
// Field doesn't exist on this type, so ignore it
|
// Field doesn't exist on this type, so ignore it
|
||||||
@@ -629,6 +631,28 @@ func (t *SealSeed) MarshalCBOR(w io.Writer) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// t.Epoch (abi.ChainEpoch) (int64)
|
||||||
|
if len("Epoch") > cbg.MaxLength {
|
||||||
|
return xerrors.Errorf("Value in field \"Epoch\" was too long")
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Epoch"))); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if _, err := io.WriteString(w, string("Epoch")); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if t.Epoch >= 0 {
|
||||||
|
if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.Epoch)); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if err := cw.WriteMajorTypeHeader(cbg.MajNegativeInt, uint64(-t.Epoch-1)); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// t.Value (abi.InteractiveSealRandomness) (slice)
|
// t.Value (abi.InteractiveSealRandomness) (slice)
|
||||||
if len("Value") > cbg.MaxLength {
|
if len("Value") > cbg.MaxLength {
|
||||||
return xerrors.Errorf("Value in field \"Value\" was too long")
|
return xerrors.Errorf("Value in field \"Value\" was too long")
|
||||||
@@ -652,28 +676,6 @@ func (t *SealSeed) MarshalCBOR(w io.Writer) error {
|
|||||||
if _, err := cw.Write(t.Value[:]); err != nil {
|
if _, err := cw.Write(t.Value[:]); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// t.Epoch (abi.ChainEpoch) (int64)
|
|
||||||
if len("Epoch") > cbg.MaxLength {
|
|
||||||
return xerrors.Errorf("Value in field \"Epoch\" was too long")
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Epoch"))); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if _, err := io.WriteString(w, string("Epoch")); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if t.Epoch >= 0 {
|
|
||||||
if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.Epoch)); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if err := cw.WriteMajorTypeHeader(cbg.MajNegativeInt, uint64(-t.Epoch-1)); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -715,7 +717,33 @@ func (t *SealSeed) UnmarshalCBOR(r io.Reader) (err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch name {
|
switch name {
|
||||||
// t.Value (abi.InteractiveSealRandomness) (slice)
|
// t.Epoch (abi.ChainEpoch) (int64)
|
||||||
|
case "Epoch":
|
||||||
|
{
|
||||||
|
maj, extra, err := cr.ReadHeader()
|
||||||
|
var extraI int64
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
switch maj {
|
||||||
|
case cbg.MajUnsignedInt:
|
||||||
|
extraI = int64(extra)
|
||||||
|
if extraI < 0 {
|
||||||
|
return fmt.Errorf("int64 positive overflow")
|
||||||
|
}
|
||||||
|
case cbg.MajNegativeInt:
|
||||||
|
extraI = int64(extra)
|
||||||
|
if extraI < 0 {
|
||||||
|
return fmt.Errorf("int64 negative overflow")
|
||||||
|
}
|
||||||
|
extraI = -1 - extraI
|
||||||
|
default:
|
||||||
|
return fmt.Errorf("wrong type for int64 field: %d", maj)
|
||||||
|
}
|
||||||
|
|
||||||
|
t.Epoch = abi.ChainEpoch(extraI)
|
||||||
|
}
|
||||||
|
// t.Value (abi.InteractiveSealRandomness) (slice)
|
||||||
case "Value":
|
case "Value":
|
||||||
|
|
||||||
maj, extra, err = cr.ReadHeader()
|
maj, extra, err = cr.ReadHeader()
|
||||||
@@ -737,32 +765,6 @@ func (t *SealSeed) UnmarshalCBOR(r io.Reader) (err error) {
|
|||||||
if _, err := io.ReadFull(cr, t.Value[:]); err != nil {
|
if _, err := io.ReadFull(cr, t.Value[:]); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
// t.Epoch (abi.ChainEpoch) (int64)
|
|
||||||
case "Epoch":
|
|
||||||
{
|
|
||||||
maj, extra, err := cr.ReadHeader()
|
|
||||||
var extraI int64
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
switch maj {
|
|
||||||
case cbg.MajUnsignedInt:
|
|
||||||
extraI = int64(extra)
|
|
||||||
if extraI < 0 {
|
|
||||||
return fmt.Errorf("int64 positive overflow")
|
|
||||||
}
|
|
||||||
case cbg.MajNegativeInt:
|
|
||||||
extraI = int64(extra)
|
|
||||||
if extraI < 0 {
|
|
||||||
return fmt.Errorf("int64 negative oveflow")
|
|
||||||
}
|
|
||||||
extraI = -1 - extraI
|
|
||||||
default:
|
|
||||||
return fmt.Errorf("wrong type for int64 field: %d", maj)
|
|
||||||
}
|
|
||||||
|
|
||||||
t.Epoch = abi.ChainEpoch(extraI)
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
// Field doesn't exist on this type, so ignore it
|
// Field doesn't exist on this type, so ignore it
|
||||||
@@ -784,6 +786,22 @@ func (t *PieceDealInfo) MarshalCBOR(w io.Writer) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// t.DealID (abi.DealID) (uint64)
|
||||||
|
if len("DealID") > cbg.MaxLength {
|
||||||
|
return xerrors.Errorf("Value in field \"DealID\" was too long")
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("DealID"))); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if _, err := io.WriteString(w, string("DealID")); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.DealID)); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
// t.PublishCid (cid.Cid) (struct)
|
// t.PublishCid (cid.Cid) (struct)
|
||||||
if len("PublishCid") > cbg.MaxLength {
|
if len("PublishCid") > cbg.MaxLength {
|
||||||
return xerrors.Errorf("Value in field \"PublishCid\" was too long")
|
return xerrors.Errorf("Value in field \"PublishCid\" was too long")
|
||||||
@@ -806,22 +824,6 @@ func (t *PieceDealInfo) MarshalCBOR(w io.Writer) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// t.DealID (abi.DealID) (uint64)
|
|
||||||
if len("DealID") > cbg.MaxLength {
|
|
||||||
return xerrors.Errorf("Value in field \"DealID\" was too long")
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("DealID"))); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if _, err := io.WriteString(w, string("DealID")); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.DealID)); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// t.DealProposal (market.DealProposal) (struct)
|
// t.DealProposal (market.DealProposal) (struct)
|
||||||
if len("DealProposal") > cbg.MaxLength {
|
if len("DealProposal") > cbg.MaxLength {
|
||||||
return xerrors.Errorf("Value in field \"DealProposal\" was too long")
|
return xerrors.Errorf("Value in field \"DealProposal\" was too long")
|
||||||
@@ -910,7 +912,22 @@ func (t *PieceDealInfo) UnmarshalCBOR(r io.Reader) (err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch name {
|
switch name {
|
||||||
// t.PublishCid (cid.Cid) (struct)
|
// t.DealID (abi.DealID) (uint64)
|
||||||
|
case "DealID":
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
maj, extra, err = cr.ReadHeader()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if maj != cbg.MajUnsignedInt {
|
||||||
|
return fmt.Errorf("wrong type for uint64 field")
|
||||||
|
}
|
||||||
|
t.DealID = abi.DealID(extra)
|
||||||
|
|
||||||
|
}
|
||||||
|
// t.PublishCid (cid.Cid) (struct)
|
||||||
case "PublishCid":
|
case "PublishCid":
|
||||||
|
|
||||||
{
|
{
|
||||||
@@ -932,21 +949,6 @@ func (t *PieceDealInfo) UnmarshalCBOR(r io.Reader) (err error) {
|
|||||||
t.PublishCid = &c
|
t.PublishCid = &c
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
// t.DealID (abi.DealID) (uint64)
|
|
||||||
case "DealID":
|
|
||||||
|
|
||||||
{
|
|
||||||
|
|
||||||
maj, extra, err = cr.ReadHeader()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if maj != cbg.MajUnsignedInt {
|
|
||||||
return fmt.Errorf("wrong type for uint64 field")
|
|
||||||
}
|
|
||||||
t.DealID = abi.DealID(extra)
|
|
||||||
|
|
||||||
}
|
}
|
||||||
// t.DealProposal (market.DealProposal) (struct)
|
// t.DealProposal (market.DealProposal) (struct)
|
||||||
case "DealProposal":
|
case "DealProposal":
|
||||||
@@ -1005,7 +1007,7 @@ func (t *PieceDealInfo) UnmarshalCBOR(r io.Reader) (err error) {
|
|||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
func (t *DealSchedule) MarshalCBOR(w io.Writer) error {
|
func (t *SectorPiece) MarshalCBOR(w io.Writer) error {
|
||||||
if t == nil {
|
if t == nil {
|
||||||
_, err := w.Write(cbg.CborNull)
|
_, err := w.Write(cbg.CborNull)
|
||||||
return err
|
return err
|
||||||
@@ -1017,26 +1019,127 @@ func (t *DealSchedule) MarshalCBOR(w io.Writer) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// t.StartEpoch (abi.ChainEpoch) (int64)
|
// t.Piece (abi.PieceInfo) (struct)
|
||||||
if len("StartEpoch") > cbg.MaxLength {
|
if len("Piece") > cbg.MaxLength {
|
||||||
return xerrors.Errorf("Value in field \"StartEpoch\" was too long")
|
return xerrors.Errorf("Value in field \"Piece\" was too long")
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("StartEpoch"))); err != nil {
|
if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Piece"))); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if _, err := io.WriteString(w, string("StartEpoch")); err != nil {
|
if _, err := io.WriteString(w, string("Piece")); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if t.StartEpoch >= 0 {
|
if err := t.Piece.MarshalCBOR(cw); err != nil {
|
||||||
if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.StartEpoch)); err != nil {
|
return err
|
||||||
return err
|
}
|
||||||
|
|
||||||
|
// t.DealInfo (api.PieceDealInfo) (struct)
|
||||||
|
if len("DealInfo") > cbg.MaxLength {
|
||||||
|
return xerrors.Errorf("Value in field \"DealInfo\" was too long")
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("DealInfo"))); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if _, err := io.WriteString(w, string("DealInfo")); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := t.DealInfo.MarshalCBOR(cw); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *SectorPiece) UnmarshalCBOR(r io.Reader) (err error) {
|
||||||
|
*t = SectorPiece{}
|
||||||
|
|
||||||
|
cr := cbg.NewCborReader(r)
|
||||||
|
|
||||||
|
maj, extra, err := cr.ReadHeader()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer func() {
|
||||||
|
if err == io.EOF {
|
||||||
|
err = io.ErrUnexpectedEOF
|
||||||
}
|
}
|
||||||
} else {
|
}()
|
||||||
if err := cw.WriteMajorTypeHeader(cbg.MajNegativeInt, uint64(-t.StartEpoch-1)); err != nil {
|
|
||||||
return err
|
if maj != cbg.MajMap {
|
||||||
|
return fmt.Errorf("cbor input should be of type map")
|
||||||
|
}
|
||||||
|
|
||||||
|
if extra > cbg.MaxLength {
|
||||||
|
return fmt.Errorf("SectorPiece: map struct too large (%d)", extra)
|
||||||
|
}
|
||||||
|
|
||||||
|
var name string
|
||||||
|
n := extra
|
||||||
|
|
||||||
|
for i := uint64(0); i < n; i++ {
|
||||||
|
|
||||||
|
{
|
||||||
|
sval, err := cbg.ReadString(cr)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
name = string(sval)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch name {
|
||||||
|
// t.Piece (abi.PieceInfo) (struct)
|
||||||
|
case "Piece":
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
if err := t.Piece.UnmarshalCBOR(cr); err != nil {
|
||||||
|
return xerrors.Errorf("unmarshaling t.Piece: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
// t.DealInfo (api.PieceDealInfo) (struct)
|
||||||
|
case "DealInfo":
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
b, err := cr.ReadByte()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if b != cbg.CborNull[0] {
|
||||||
|
if err := cr.UnreadByte(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
t.DealInfo = new(PieceDealInfo)
|
||||||
|
if err := t.DealInfo.UnmarshalCBOR(cr); err != nil {
|
||||||
|
return xerrors.Errorf("unmarshaling t.DealInfo pointer: %w", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
// Field doesn't exist on this type, so ignore it
|
||||||
|
cbg.ScanForLinks(r, func(cid.Cid) {})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
func (t *DealSchedule) MarshalCBOR(w io.Writer) error {
|
||||||
|
if t == nil {
|
||||||
|
_, err := w.Write(cbg.CborNull)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
cw := cbg.NewCborWriter(w)
|
||||||
|
|
||||||
|
if _, err := cw.Write([]byte{162}); err != nil {
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// t.EndEpoch (abi.ChainEpoch) (int64)
|
// t.EndEpoch (abi.ChainEpoch) (int64)
|
||||||
@@ -1060,6 +1163,28 @@ func (t *DealSchedule) MarshalCBOR(w io.Writer) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// t.StartEpoch (abi.ChainEpoch) (int64)
|
||||||
|
if len("StartEpoch") > cbg.MaxLength {
|
||||||
|
return xerrors.Errorf("Value in field \"StartEpoch\" was too long")
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("StartEpoch"))); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if _, err := io.WriteString(w, string("StartEpoch")); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if t.StartEpoch >= 0 {
|
||||||
|
if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.StartEpoch)); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if err := cw.WriteMajorTypeHeader(cbg.MajNegativeInt, uint64(-t.StartEpoch-1)); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1101,33 +1226,7 @@ func (t *DealSchedule) UnmarshalCBOR(r io.Reader) (err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch name {
|
switch name {
|
||||||
// t.StartEpoch (abi.ChainEpoch) (int64)
|
// t.EndEpoch (abi.ChainEpoch) (int64)
|
||||||
case "StartEpoch":
|
|
||||||
{
|
|
||||||
maj, extra, err := cr.ReadHeader()
|
|
||||||
var extraI int64
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
switch maj {
|
|
||||||
case cbg.MajUnsignedInt:
|
|
||||||
extraI = int64(extra)
|
|
||||||
if extraI < 0 {
|
|
||||||
return fmt.Errorf("int64 positive overflow")
|
|
||||||
}
|
|
||||||
case cbg.MajNegativeInt:
|
|
||||||
extraI = int64(extra)
|
|
||||||
if extraI < 0 {
|
|
||||||
return fmt.Errorf("int64 negative oveflow")
|
|
||||||
}
|
|
||||||
extraI = -1 - extraI
|
|
||||||
default:
|
|
||||||
return fmt.Errorf("wrong type for int64 field: %d", maj)
|
|
||||||
}
|
|
||||||
|
|
||||||
t.StartEpoch = abi.ChainEpoch(extraI)
|
|
||||||
}
|
|
||||||
// t.EndEpoch (abi.ChainEpoch) (int64)
|
|
||||||
case "EndEpoch":
|
case "EndEpoch":
|
||||||
{
|
{
|
||||||
maj, extra, err := cr.ReadHeader()
|
maj, extra, err := cr.ReadHeader()
|
||||||
@@ -1144,7 +1243,7 @@ func (t *DealSchedule) UnmarshalCBOR(r io.Reader) (err error) {
|
|||||||
case cbg.MajNegativeInt:
|
case cbg.MajNegativeInt:
|
||||||
extraI = int64(extra)
|
extraI = int64(extra)
|
||||||
if extraI < 0 {
|
if extraI < 0 {
|
||||||
return fmt.Errorf("int64 negative oveflow")
|
return fmt.Errorf("int64 negative overflow")
|
||||||
}
|
}
|
||||||
extraI = -1 - extraI
|
extraI = -1 - extraI
|
||||||
default:
|
default:
|
||||||
@@ -1153,6 +1252,32 @@ func (t *DealSchedule) UnmarshalCBOR(r io.Reader) (err error) {
|
|||||||
|
|
||||||
t.EndEpoch = abi.ChainEpoch(extraI)
|
t.EndEpoch = abi.ChainEpoch(extraI)
|
||||||
}
|
}
|
||||||
|
// t.StartEpoch (abi.ChainEpoch) (int64)
|
||||||
|
case "StartEpoch":
|
||||||
|
{
|
||||||
|
maj, extra, err := cr.ReadHeader()
|
||||||
|
var extraI int64
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
switch maj {
|
||||||
|
case cbg.MajUnsignedInt:
|
||||||
|
extraI = int64(extra)
|
||||||
|
if extraI < 0 {
|
||||||
|
return fmt.Errorf("int64 positive overflow")
|
||||||
|
}
|
||||||
|
case cbg.MajNegativeInt:
|
||||||
|
extraI = int64(extra)
|
||||||
|
if extraI < 0 {
|
||||||
|
return fmt.Errorf("int64 negative overflow")
|
||||||
|
}
|
||||||
|
extraI = -1 - extraI
|
||||||
|
default:
|
||||||
|
return fmt.Errorf("wrong type for int64 field: %d", maj)
|
||||||
|
}
|
||||||
|
|
||||||
|
t.StartEpoch = abi.ChainEpoch(extraI)
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
// Field doesn't exist on this type, so ignore it
|
// Field doesn't exist on this type, so ignore it
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ import (
|
|||||||
func NewCommonRPCV0(ctx context.Context, addr string, requestHeader http.Header) (api.CommonNet, jsonrpc.ClientCloser, error) {
|
func NewCommonRPCV0(ctx context.Context, addr string, requestHeader http.Header) (api.CommonNet, jsonrpc.ClientCloser, error) {
|
||||||
var res v0api.CommonNetStruct
|
var res v0api.CommonNetStruct
|
||||||
closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin",
|
closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin",
|
||||||
api.GetInternalStructs(&res), requestHeader)
|
api.GetInternalStructs(&res), requestHeader, jsonrpc.WithErrors(api.RPCErrors))
|
||||||
|
|
||||||
return &res, closer, err
|
return &res, closer, err
|
||||||
}
|
}
|
||||||
@@ -29,16 +29,16 @@ func NewFullNodeRPCV0(ctx context.Context, addr string, requestHeader http.Heade
|
|||||||
var res v0api.FullNodeStruct
|
var res v0api.FullNodeStruct
|
||||||
|
|
||||||
closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin",
|
closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin",
|
||||||
api.GetInternalStructs(&res), requestHeader)
|
api.GetInternalStructs(&res), requestHeader, jsonrpc.WithErrors(api.RPCErrors))
|
||||||
|
|
||||||
return &res, closer, err
|
return &res, closer, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewFullNodeRPCV1 creates a new http jsonrpc client.
|
// NewFullNodeRPCV1 creates a new http jsonrpc client.
|
||||||
func NewFullNodeRPCV1(ctx context.Context, addr string, requestHeader http.Header) (api.FullNode, jsonrpc.ClientCloser, error) {
|
func NewFullNodeRPCV1(ctx context.Context, addr string, requestHeader http.Header, opts ...jsonrpc.Option) (api.FullNode, jsonrpc.ClientCloser, error) {
|
||||||
var res v1api.FullNodeStruct
|
var res v1api.FullNodeStruct
|
||||||
closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin",
|
closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin",
|
||||||
api.GetInternalStructs(&res), requestHeader)
|
api.GetInternalStructs(&res), requestHeader, append([]jsonrpc.Option{jsonrpc.WithErrors(api.RPCErrors)}, opts...)...)
|
||||||
|
|
||||||
return &res, closer, err
|
return &res, closer, err
|
||||||
}
|
}
|
||||||
@@ -72,6 +72,7 @@ func NewStorageMinerRPCV0(ctx context.Context, addr string, requestHeader http.H
|
|||||||
api.GetInternalStructs(&res), requestHeader,
|
api.GetInternalStructs(&res), requestHeader,
|
||||||
append([]jsonrpc.Option{
|
append([]jsonrpc.Option{
|
||||||
rpcenc.ReaderParamEncoder(pushUrl),
|
rpcenc.ReaderParamEncoder(pushUrl),
|
||||||
|
jsonrpc.WithErrors(api.RPCErrors),
|
||||||
}, opts...)...)
|
}, opts...)...)
|
||||||
|
|
||||||
return &res, closer, err
|
return &res, closer, err
|
||||||
@@ -90,6 +91,7 @@ func NewWorkerRPCV0(ctx context.Context, addr string, requestHeader http.Header)
|
|||||||
rpcenc.ReaderParamEncoder(pushUrl),
|
rpcenc.ReaderParamEncoder(pushUrl),
|
||||||
jsonrpc.WithNoReconnect(),
|
jsonrpc.WithNoReconnect(),
|
||||||
jsonrpc.WithTimeout(30*time.Second),
|
jsonrpc.WithTimeout(30*time.Second),
|
||||||
|
jsonrpc.WithErrors(api.RPCErrors),
|
||||||
)
|
)
|
||||||
|
|
||||||
return &res, closer, err
|
return &res, closer, err
|
||||||
@@ -101,7 +103,7 @@ func NewGatewayRPCV1(ctx context.Context, addr string, requestHeader http.Header
|
|||||||
closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin",
|
closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin",
|
||||||
api.GetInternalStructs(&res),
|
api.GetInternalStructs(&res),
|
||||||
requestHeader,
|
requestHeader,
|
||||||
opts...,
|
append(opts, jsonrpc.WithErrors(api.RPCErrors))...,
|
||||||
)
|
)
|
||||||
|
|
||||||
return &res, closer, err
|
return &res, closer, err
|
||||||
@@ -113,7 +115,7 @@ func NewGatewayRPCV0(ctx context.Context, addr string, requestHeader http.Header
|
|||||||
closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin",
|
closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin",
|
||||||
api.GetInternalStructs(&res),
|
api.GetInternalStructs(&res),
|
||||||
requestHeader,
|
requestHeader,
|
||||||
opts...,
|
append(opts, jsonrpc.WithErrors(api.RPCErrors))...,
|
||||||
)
|
)
|
||||||
|
|
||||||
return &res, closer, err
|
return &res, closer, err
|
||||||
@@ -124,6 +126,7 @@ func NewWalletRPCV0(ctx context.Context, addr string, requestHeader http.Header)
|
|||||||
closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin",
|
closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin",
|
||||||
api.GetInternalStructs(&res),
|
api.GetInternalStructs(&res),
|
||||||
requestHeader,
|
requestHeader,
|
||||||
|
jsonrpc.WithErrors(api.RPCErrors),
|
||||||
)
|
)
|
||||||
|
|
||||||
return &res, closer, err
|
return &res, closer, err
|
||||||
|
|||||||
+84
-14
@@ -6,6 +6,7 @@ import (
|
|||||||
"go/ast"
|
"go/ast"
|
||||||
"go/parser"
|
"go/parser"
|
||||||
"go/token"
|
"go/token"
|
||||||
|
"net/http"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strings"
|
"strings"
|
||||||
@@ -13,24 +14,25 @@ import (
|
|||||||
"unicode"
|
"unicode"
|
||||||
|
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
blocks "github.com/ipfs/go-block-format"
|
|
||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
"github.com/ipfs/go-graphsync"
|
"github.com/ipfs/go-graphsync"
|
||||||
|
blocks "github.com/ipfs/go-libipfs/blocks"
|
||||||
textselector "github.com/ipld/go-ipld-selector-text-lite"
|
textselector "github.com/ipld/go-ipld-selector-text-lite"
|
||||||
"github.com/libp2p/go-libp2p-core/metrics"
|
|
||||||
"github.com/libp2p/go-libp2p-core/network"
|
|
||||||
"github.com/libp2p/go-libp2p-core/peer"
|
|
||||||
"github.com/libp2p/go-libp2p-core/protocol"
|
|
||||||
pubsub "github.com/libp2p/go-libp2p-pubsub"
|
pubsub "github.com/libp2p/go-libp2p-pubsub"
|
||||||
|
"github.com/libp2p/go-libp2p/core/metrics"
|
||||||
|
"github.com/libp2p/go-libp2p/core/network"
|
||||||
|
"github.com/libp2p/go-libp2p/core/peer"
|
||||||
|
"github.com/libp2p/go-libp2p/core/protocol"
|
||||||
"github.com/multiformats/go-multiaddr"
|
"github.com/multiformats/go-multiaddr"
|
||||||
|
|
||||||
"github.com/filecoin-project/go-address"
|
"github.com/filecoin-project/go-address"
|
||||||
"github.com/filecoin-project/go-bitfield"
|
"github.com/filecoin-project/go-bitfield"
|
||||||
datatransfer "github.com/filecoin-project/go-data-transfer"
|
datatransfer "github.com/filecoin-project/go-data-transfer/v2"
|
||||||
"github.com/filecoin-project/go-fil-markets/filestore"
|
"github.com/filecoin-project/go-fil-markets/filestore"
|
||||||
"github.com/filecoin-project/go-fil-markets/retrievalmarket"
|
"github.com/filecoin-project/go-fil-markets/retrievalmarket"
|
||||||
"github.com/filecoin-project/go-jsonrpc/auth"
|
"github.com/filecoin-project/go-jsonrpc/auth"
|
||||||
"github.com/filecoin-project/go-state-types/abi"
|
"github.com/filecoin-project/go-state-types/abi"
|
||||||
|
"github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
|
||||||
"github.com/filecoin-project/go-state-types/crypto"
|
"github.com/filecoin-project/go-state-types/crypto"
|
||||||
"github.com/filecoin-project/go-state-types/exitcode"
|
"github.com/filecoin-project/go-state-types/exitcode"
|
||||||
|
|
||||||
@@ -39,6 +41,7 @@ import (
|
|||||||
"github.com/filecoin-project/lotus/api/v0api"
|
"github.com/filecoin-project/lotus/api/v0api"
|
||||||
"github.com/filecoin-project/lotus/build"
|
"github.com/filecoin-project/lotus/build"
|
||||||
"github.com/filecoin-project/lotus/chain/types"
|
"github.com/filecoin-project/lotus/chain/types"
|
||||||
|
"github.com/filecoin-project/lotus/chain/types/ethtypes"
|
||||||
"github.com/filecoin-project/lotus/node/modules/dtypes"
|
"github.com/filecoin-project/lotus/node/modules/dtypes"
|
||||||
"github.com/filecoin-project/lotus/node/repo/imports"
|
"github.com/filecoin-project/lotus/node/repo/imports"
|
||||||
sealing "github.com/filecoin-project/lotus/storage/pipeline"
|
sealing "github.com/filecoin-project/lotus/storage/pipeline"
|
||||||
@@ -66,6 +69,7 @@ func init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ExampleValues[reflect.TypeOf(c)] = c
|
ExampleValues[reflect.TypeOf(c)] = c
|
||||||
|
ExampleValues[reflect.TypeOf(&c)] = &c
|
||||||
|
|
||||||
c2, err := cid.Decode("bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve")
|
c2, err := cid.Decode("bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -136,12 +140,20 @@ func init() {
|
|||||||
addExample(&textSelExample)
|
addExample(&textSelExample)
|
||||||
addExample(&apiSelExample)
|
addExample(&apiSelExample)
|
||||||
addExample(network.ReachabilityPublic)
|
addExample(network.ReachabilityPublic)
|
||||||
addExample(build.NewestNetworkVersion)
|
addExample(build.TestNetworkVersion)
|
||||||
|
allocationId := verifreg.AllocationId(0)
|
||||||
|
addExample(allocationId)
|
||||||
|
addExample(&allocationId)
|
||||||
|
addExample(map[verifreg.AllocationId]verifreg.Allocation{})
|
||||||
|
claimId := verifreg.ClaimId(0)
|
||||||
|
addExample(claimId)
|
||||||
|
addExample(&claimId)
|
||||||
|
addExample(map[verifreg.ClaimId]verifreg.Claim{})
|
||||||
addExample(map[string]int{"name": 42})
|
addExample(map[string]int{"name": 42})
|
||||||
addExample(map[string]time.Time{"name": time.Unix(1615243938, 0).UTC()})
|
addExample(map[string]time.Time{"name": time.Unix(1615243938, 0).UTC()})
|
||||||
addExample(&types.ExecutionTrace{
|
addExample(&types.ExecutionTrace{
|
||||||
Msg: ExampleValue("init", reflect.TypeOf(&types.Message{}), nil).(*types.Message),
|
Msg: ExampleValue("init", reflect.TypeOf(types.MessageTrace{}), nil).(types.MessageTrace),
|
||||||
MsgRct: ExampleValue("init", reflect.TypeOf(&types.MessageReceipt{}), nil).(*types.MessageReceipt),
|
MsgRct: ExampleValue("init", reflect.TypeOf(types.ReturnTrace{}), nil).(types.ReturnTrace),
|
||||||
})
|
})
|
||||||
addExample(map[string]types.Actor{
|
addExample(map[string]types.Actor{
|
||||||
"t01236": ExampleValue("init", reflect.TypeOf(types.Actor{}), nil).(types.Actor),
|
"t01236": ExampleValue("init", reflect.TypeOf(types.Actor{}), nil).(types.Actor),
|
||||||
@@ -272,6 +284,8 @@ func init() {
|
|||||||
Read: [storiface.FileTypes]uint{2, 3, 0},
|
Read: [storiface.FileTypes]uint{2, 3, 0},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
storifaceid := storiface.ID("1399aa04-2625-44b1-bad4-bd07b59b22c4")
|
||||||
|
addExample(&storifaceid)
|
||||||
|
|
||||||
// worker specific
|
// worker specific
|
||||||
addExample(storiface.AcquireMove)
|
addExample(storiface.AcquireMove)
|
||||||
@@ -286,7 +300,8 @@ func init() {
|
|||||||
"title": "Lotus RPC API",
|
"title": "Lotus RPC API",
|
||||||
"version": "1.2.1/generated=2020-11-22T08:22:42-06:00",
|
"version": "1.2.1/generated=2020-11-22T08:22:42-06:00",
|
||||||
},
|
},
|
||||||
"methods": []interface{}{}},
|
"methods": []interface{}{},
|
||||||
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
addExample(api.CheckStatusCode(0))
|
addExample(api.CheckStatusCode(0))
|
||||||
@@ -323,7 +338,8 @@ func init() {
|
|||||||
NumConnsInbound: 3,
|
NumConnsInbound: 3,
|
||||||
NumConnsOutbound: 4,
|
NumConnsOutbound: 4,
|
||||||
NumFD: 5,
|
NumFD: 5,
|
||||||
}})
|
},
|
||||||
|
})
|
||||||
addExample(api.NetLimit{
|
addExample(api.NetLimit{
|
||||||
Memory: 123,
|
Memory: 123,
|
||||||
StreamsInbound: 1,
|
StreamsInbound: 1,
|
||||||
@@ -335,10 +351,63 @@ func init() {
|
|||||||
FD: 5,
|
FD: 5,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
addExample(map[string]bitfield.BitField{
|
||||||
|
"": bitfield.NewFromSet([]uint64{5, 6, 7, 10}),
|
||||||
|
})
|
||||||
|
addExample(&api.RaftStateData{
|
||||||
|
NonceMap: make(map[address.Address]uint64),
|
||||||
|
MsgUuids: make(map[uuid.UUID]*types.SignedMessage),
|
||||||
|
})
|
||||||
|
|
||||||
|
addExample(http.Header{
|
||||||
|
"Authorization": []string{"Bearer ey.."},
|
||||||
|
})
|
||||||
|
|
||||||
|
addExample(map[storiface.SectorFileType]storiface.SectorLocation{
|
||||||
|
storiface.FTSealed: {
|
||||||
|
Local: false,
|
||||||
|
URL: "https://example.com/sealingservice/sectors/s-f0123-12345",
|
||||||
|
Headers: nil,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
ethint := ethtypes.EthUint64(5)
|
||||||
|
addExample(ethint)
|
||||||
|
addExample(ðint)
|
||||||
|
|
||||||
|
ethaddr, _ := ethtypes.ParseEthAddress("0x5CbEeCF99d3fDB3f25E309Cc264f240bb0664031")
|
||||||
|
addExample(ethaddr)
|
||||||
|
addExample(ðaddr)
|
||||||
|
|
||||||
|
ethhash, _ := ethtypes.EthHashFromCid(c)
|
||||||
|
addExample(ethhash)
|
||||||
|
addExample(ðhash)
|
||||||
|
|
||||||
|
ethFeeHistoryReward := [][]ethtypes.EthBigInt{}
|
||||||
|
addExample(ðFeeHistoryReward)
|
||||||
|
|
||||||
|
addExample(&uuid.UUID{})
|
||||||
|
|
||||||
|
filterid := ethtypes.EthFilterID(ethhash)
|
||||||
|
addExample(filterid)
|
||||||
|
addExample(&filterid)
|
||||||
|
|
||||||
|
subid := ethtypes.EthSubscriptionID(ethhash)
|
||||||
|
addExample(subid)
|
||||||
|
addExample(&subid)
|
||||||
|
|
||||||
|
pstring := func(s string) *string { return &s }
|
||||||
|
addExample(ðtypes.EthFilterSpec{
|
||||||
|
FromBlock: pstring("2301220"),
|
||||||
|
Address: []ethtypes.EthAddress{ethaddr},
|
||||||
|
})
|
||||||
|
|
||||||
|
percent := types.Percent(123)
|
||||||
|
addExample(percent)
|
||||||
|
addExample(&percent)
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetAPIType(name, pkg string) (i interface{}, t reflect.Type, permStruct []reflect.Type) {
|
func GetAPIType(name, pkg string) (i interface{}, t reflect.Type, permStruct []reflect.Type) {
|
||||||
|
|
||||||
switch pkg {
|
switch pkg {
|
||||||
case "api": // latest
|
case "api": // latest
|
||||||
switch name {
|
switch name {
|
||||||
@@ -408,7 +477,7 @@ func ExampleValue(method string, t, parent reflect.Type) interface{} {
|
|||||||
case reflect.Ptr:
|
case reflect.Ptr:
|
||||||
if t.Elem().Kind() == reflect.Struct {
|
if t.Elem().Kind() == reflect.Struct {
|
||||||
es := exampleStruct(method, t.Elem(), t)
|
es := exampleStruct(method, t.Elem(), t)
|
||||||
//ExampleValues[t] = es
|
ExampleValues[t] = es
|
||||||
return es
|
return es
|
||||||
}
|
}
|
||||||
case reflect.Interface:
|
case reflect.Interface:
|
||||||
@@ -425,7 +494,8 @@ func exampleStruct(method string, t, parent reflect.Type) interface{} {
|
|||||||
if f.Type == parent {
|
if f.Type == parent {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if strings.Title(f.Name) == f.Name {
|
|
||||||
|
if f.IsExported() {
|
||||||
ns.Elem().Field(i).Set(reflect.ValueOf(ExampleValue(method, f.Type, t)))
|
ns.Elem().Field(i).Set(reflect.ValueOf(ExampleValue(method, f.Type, t)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,46 @@
|
|||||||
|
package api
|
||||||
|
|
||||||
|
import apitypes "github.com/filecoin-project/lotus/api/types"
|
||||||
|
|
||||||
|
func CreateEthRPCAliases(as apitypes.Aliaser) {
|
||||||
|
// TODO: maybe use reflect to automatically register all the eth aliases
|
||||||
|
as.AliasMethod("eth_accounts", "Filecoin.EthAccounts")
|
||||||
|
as.AliasMethod("eth_blockNumber", "Filecoin.EthBlockNumber")
|
||||||
|
as.AliasMethod("eth_getBlockTransactionCountByNumber", "Filecoin.EthGetBlockTransactionCountByNumber")
|
||||||
|
as.AliasMethod("eth_getBlockTransactionCountByHash", "Filecoin.EthGetBlockTransactionCountByHash")
|
||||||
|
|
||||||
|
as.AliasMethod("eth_getBlockByHash", "Filecoin.EthGetBlockByHash")
|
||||||
|
as.AliasMethod("eth_getBlockByNumber", "Filecoin.EthGetBlockByNumber")
|
||||||
|
as.AliasMethod("eth_getTransactionByHash", "Filecoin.EthGetTransactionByHash")
|
||||||
|
as.AliasMethod("eth_getTransactionCount", "Filecoin.EthGetTransactionCount")
|
||||||
|
as.AliasMethod("eth_getTransactionReceipt", "Filecoin.EthGetTransactionReceipt")
|
||||||
|
as.AliasMethod("eth_getTransactionByBlockHashAndIndex", "Filecoin.EthGetTransactionByBlockHashAndIndex")
|
||||||
|
as.AliasMethod("eth_getTransactionByBlockNumberAndIndex", "Filecoin.EthGetTransactionByBlockNumberAndIndex")
|
||||||
|
|
||||||
|
as.AliasMethod("eth_getCode", "Filecoin.EthGetCode")
|
||||||
|
as.AliasMethod("eth_getStorageAt", "Filecoin.EthGetStorageAt")
|
||||||
|
as.AliasMethod("eth_getBalance", "Filecoin.EthGetBalance")
|
||||||
|
as.AliasMethod("eth_chainId", "Filecoin.EthChainId")
|
||||||
|
as.AliasMethod("eth_feeHistory", "Filecoin.EthFeeHistory")
|
||||||
|
as.AliasMethod("eth_protocolVersion", "Filecoin.EthProtocolVersion")
|
||||||
|
as.AliasMethod("eth_maxPriorityFeePerGas", "Filecoin.EthMaxPriorityFeePerGas")
|
||||||
|
as.AliasMethod("eth_gasPrice", "Filecoin.EthGasPrice")
|
||||||
|
as.AliasMethod("eth_sendRawTransaction", "Filecoin.EthSendRawTransaction")
|
||||||
|
as.AliasMethod("eth_estimateGas", "Filecoin.EthEstimateGas")
|
||||||
|
as.AliasMethod("eth_call", "Filecoin.EthCall")
|
||||||
|
|
||||||
|
as.AliasMethod("eth_getLogs", "Filecoin.EthGetLogs")
|
||||||
|
as.AliasMethod("eth_getFilterChanges", "Filecoin.EthGetFilterChanges")
|
||||||
|
as.AliasMethod("eth_getFilterLogs", "Filecoin.EthGetFilterLogs")
|
||||||
|
as.AliasMethod("eth_newFilter", "Filecoin.EthNewFilter")
|
||||||
|
as.AliasMethod("eth_newBlockFilter", "Filecoin.EthNewBlockFilter")
|
||||||
|
as.AliasMethod("eth_newPendingTransactionFilter", "Filecoin.EthNewPendingTransactionFilter")
|
||||||
|
as.AliasMethod("eth_uninstallFilter", "Filecoin.EthUninstallFilter")
|
||||||
|
as.AliasMethod("eth_subscribe", "Filecoin.EthSubscribe")
|
||||||
|
as.AliasMethod("eth_unsubscribe", "Filecoin.EthUnsubscribe")
|
||||||
|
|
||||||
|
as.AliasMethod("net_version", "Filecoin.NetVersion")
|
||||||
|
as.AliasMethod("net_listening", "Filecoin.NetListening")
|
||||||
|
|
||||||
|
as.AliasMethod("web3_clientVersion", "Filecoin.Web3ClientVersion")
|
||||||
|
}
|
||||||
+821
-11
@@ -12,22 +12,24 @@ import (
|
|||||||
|
|
||||||
gomock "github.com/golang/mock/gomock"
|
gomock "github.com/golang/mock/gomock"
|
||||||
uuid "github.com/google/uuid"
|
uuid "github.com/google/uuid"
|
||||||
blocks "github.com/ipfs/go-block-format"
|
|
||||||
cid "github.com/ipfs/go-cid"
|
cid "github.com/ipfs/go-cid"
|
||||||
metrics "github.com/libp2p/go-libp2p-core/metrics"
|
blocks "github.com/ipfs/go-libipfs/blocks"
|
||||||
network0 "github.com/libp2p/go-libp2p-core/network"
|
metrics "github.com/libp2p/go-libp2p/core/metrics"
|
||||||
peer "github.com/libp2p/go-libp2p-core/peer"
|
network0 "github.com/libp2p/go-libp2p/core/network"
|
||||||
protocol "github.com/libp2p/go-libp2p-core/protocol"
|
peer "github.com/libp2p/go-libp2p/core/peer"
|
||||||
|
protocol "github.com/libp2p/go-libp2p/core/protocol"
|
||||||
|
|
||||||
address "github.com/filecoin-project/go-address"
|
address "github.com/filecoin-project/go-address"
|
||||||
bitfield "github.com/filecoin-project/go-bitfield"
|
bitfield "github.com/filecoin-project/go-bitfield"
|
||||||
datatransfer "github.com/filecoin-project/go-data-transfer"
|
datatransfer "github.com/filecoin-project/go-data-transfer/v2"
|
||||||
retrievalmarket "github.com/filecoin-project/go-fil-markets/retrievalmarket"
|
retrievalmarket "github.com/filecoin-project/go-fil-markets/retrievalmarket"
|
||||||
|
jsonrpc "github.com/filecoin-project/go-jsonrpc"
|
||||||
auth "github.com/filecoin-project/go-jsonrpc/auth"
|
auth "github.com/filecoin-project/go-jsonrpc/auth"
|
||||||
abi "github.com/filecoin-project/go-state-types/abi"
|
abi "github.com/filecoin-project/go-state-types/abi"
|
||||||
big "github.com/filecoin-project/go-state-types/big"
|
big "github.com/filecoin-project/go-state-types/big"
|
||||||
miner "github.com/filecoin-project/go-state-types/builtin/v8/miner"
|
|
||||||
paych "github.com/filecoin-project/go-state-types/builtin/v8/paych"
|
paych "github.com/filecoin-project/go-state-types/builtin/v8/paych"
|
||||||
|
miner "github.com/filecoin-project/go-state-types/builtin/v9/miner"
|
||||||
|
verifreg "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
|
||||||
crypto "github.com/filecoin-project/go-state-types/crypto"
|
crypto "github.com/filecoin-project/go-state-types/crypto"
|
||||||
dline "github.com/filecoin-project/go-state-types/dline"
|
dline "github.com/filecoin-project/go-state-types/dline"
|
||||||
network "github.com/filecoin-project/go-state-types/network"
|
network "github.com/filecoin-project/go-state-types/network"
|
||||||
@@ -36,6 +38,7 @@ import (
|
|||||||
apitypes "github.com/filecoin-project/lotus/api/types"
|
apitypes "github.com/filecoin-project/lotus/api/types"
|
||||||
miner0 "github.com/filecoin-project/lotus/chain/actors/builtin/miner"
|
miner0 "github.com/filecoin-project/lotus/chain/actors/builtin/miner"
|
||||||
types "github.com/filecoin-project/lotus/chain/types"
|
types "github.com/filecoin-project/lotus/chain/types"
|
||||||
|
ethtypes "github.com/filecoin-project/lotus/chain/types/ethtypes"
|
||||||
alerting "github.com/filecoin-project/lotus/journal/alerting"
|
alerting "github.com/filecoin-project/lotus/journal/alerting"
|
||||||
dtypes "github.com/filecoin-project/lotus/node/modules/dtypes"
|
dtypes "github.com/filecoin-project/lotus/node/modules/dtypes"
|
||||||
imports "github.com/filecoin-project/lotus/node/repo/imports"
|
imports "github.com/filecoin-project/lotus/node/repo/imports"
|
||||||
@@ -152,6 +155,20 @@ func (mr *MockFullNodeMockRecorder) ChainExport(arg0, arg1, arg2, arg3 interface
|
|||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainExport", reflect.TypeOf((*MockFullNode)(nil).ChainExport), arg0, arg1, arg2, arg3)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainExport", reflect.TypeOf((*MockFullNode)(nil).ChainExport), arg0, arg1, arg2, arg3)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ChainExportRangeInternal mocks base method.
|
||||||
|
func (m *MockFullNode) ChainExportRangeInternal(arg0 context.Context, arg1, arg2 types.TipSetKey, arg3 api.ChainExportConfig) error {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "ChainExportRangeInternal", arg0, arg1, arg2, arg3)
|
||||||
|
ret0, _ := ret[0].(error)
|
||||||
|
return ret0
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChainExportRangeInternal indicates an expected call of ChainExportRangeInternal.
|
||||||
|
func (mr *MockFullNodeMockRecorder) ChainExportRangeInternal(arg0, arg1, arg2, arg3 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainExportRangeInternal", reflect.TypeOf((*MockFullNode)(nil).ChainExportRangeInternal), arg0, arg1, arg2, arg3)
|
||||||
|
}
|
||||||
|
|
||||||
// ChainGetBlock mocks base method.
|
// ChainGetBlock mocks base method.
|
||||||
func (m *MockFullNode) ChainGetBlock(arg0 context.Context, arg1 cid.Cid) (*types.BlockHeader, error) {
|
func (m *MockFullNode) ChainGetBlock(arg0 context.Context, arg1 cid.Cid) (*types.BlockHeader, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
@@ -182,6 +199,21 @@ func (mr *MockFullNodeMockRecorder) ChainGetBlockMessages(arg0, arg1 interface{}
|
|||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetBlockMessages", reflect.TypeOf((*MockFullNode)(nil).ChainGetBlockMessages), arg0, arg1)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetBlockMessages", reflect.TypeOf((*MockFullNode)(nil).ChainGetBlockMessages), arg0, arg1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ChainGetEvents mocks base method.
|
||||||
|
func (m *MockFullNode) ChainGetEvents(arg0 context.Context, arg1 cid.Cid) ([]types.Event, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "ChainGetEvents", arg0, arg1)
|
||||||
|
ret0, _ := ret[0].([]types.Event)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChainGetEvents indicates an expected call of ChainGetEvents.
|
||||||
|
func (mr *MockFullNodeMockRecorder) ChainGetEvents(arg0, arg1 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetEvents", reflect.TypeOf((*MockFullNode)(nil).ChainGetEvents), arg0, arg1)
|
||||||
|
}
|
||||||
|
|
||||||
// ChainGetGenesis mocks base method.
|
// ChainGetGenesis mocks base method.
|
||||||
func (m *MockFullNode) ChainGetGenesis(arg0 context.Context) (*types.TipSet, error) {
|
func (m *MockFullNode) ChainGetGenesis(arg0 context.Context) (*types.TipSet, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
@@ -362,6 +394,20 @@ func (mr *MockFullNodeMockRecorder) ChainHead(arg0 interface{}) *gomock.Call {
|
|||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainHead", reflect.TypeOf((*MockFullNode)(nil).ChainHead), arg0)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainHead", reflect.TypeOf((*MockFullNode)(nil).ChainHead), arg0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ChainHotGC mocks base method.
|
||||||
|
func (m *MockFullNode) ChainHotGC(arg0 context.Context, arg1 api.HotGCOpts) error {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "ChainHotGC", arg0, arg1)
|
||||||
|
ret0, _ := ret[0].(error)
|
||||||
|
return ret0
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChainHotGC indicates an expected call of ChainHotGC.
|
||||||
|
func (mr *MockFullNodeMockRecorder) ChainHotGC(arg0, arg1 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainHotGC", reflect.TypeOf((*MockFullNode)(nil).ChainHotGC), arg0, arg1)
|
||||||
|
}
|
||||||
|
|
||||||
// ChainNotify mocks base method.
|
// ChainNotify mocks base method.
|
||||||
func (m *MockFullNode) ChainNotify(arg0 context.Context) (<-chan []*api.HeadChange, error) {
|
func (m *MockFullNode) ChainNotify(arg0 context.Context) (<-chan []*api.HeadChange, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
@@ -377,6 +423,20 @@ func (mr *MockFullNodeMockRecorder) ChainNotify(arg0 interface{}) *gomock.Call {
|
|||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainNotify", reflect.TypeOf((*MockFullNode)(nil).ChainNotify), arg0)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainNotify", reflect.TypeOf((*MockFullNode)(nil).ChainNotify), arg0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ChainPrune mocks base method.
|
||||||
|
func (m *MockFullNode) ChainPrune(arg0 context.Context, arg1 api.PruneOpts) error {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "ChainPrune", arg0, arg1)
|
||||||
|
ret0, _ := ret[0].(error)
|
||||||
|
return ret0
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChainPrune indicates an expected call of ChainPrune.
|
||||||
|
func (mr *MockFullNodeMockRecorder) ChainPrune(arg0, arg1 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainPrune", reflect.TypeOf((*MockFullNode)(nil).ChainPrune), arg0, arg1)
|
||||||
|
}
|
||||||
|
|
||||||
// ChainPutObj mocks base method.
|
// ChainPutObj mocks base method.
|
||||||
func (m *MockFullNode) ChainPutObj(arg0 context.Context, arg1 blocks.Block) error {
|
func (m *MockFullNode) ChainPutObj(arg0 context.Context, arg1 blocks.Block) error {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
@@ -906,6 +966,561 @@ func (mr *MockFullNodeMockRecorder) Discover(arg0 interface{}) *gomock.Call {
|
|||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Discover", reflect.TypeOf((*MockFullNode)(nil).Discover), arg0)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Discover", reflect.TypeOf((*MockFullNode)(nil).Discover), arg0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// EthAccounts mocks base method.
|
||||||
|
func (m *MockFullNode) EthAccounts(arg0 context.Context) ([]ethtypes.EthAddress, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "EthAccounts", arg0)
|
||||||
|
ret0, _ := ret[0].([]ethtypes.EthAddress)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthAccounts indicates an expected call of EthAccounts.
|
||||||
|
func (mr *MockFullNodeMockRecorder) EthAccounts(arg0 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EthAccounts", reflect.TypeOf((*MockFullNode)(nil).EthAccounts), arg0)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthAddressToFilecoinAddress mocks base method.
|
||||||
|
func (m *MockFullNode) EthAddressToFilecoinAddress(arg0 context.Context, arg1 ethtypes.EthAddress) (address.Address, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "EthAddressToFilecoinAddress", arg0, arg1)
|
||||||
|
ret0, _ := ret[0].(address.Address)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthAddressToFilecoinAddress indicates an expected call of EthAddressToFilecoinAddress.
|
||||||
|
func (mr *MockFullNodeMockRecorder) EthAddressToFilecoinAddress(arg0, arg1 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EthAddressToFilecoinAddress", reflect.TypeOf((*MockFullNode)(nil).EthAddressToFilecoinAddress), arg0, arg1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthBlockNumber mocks base method.
|
||||||
|
func (m *MockFullNode) EthBlockNumber(arg0 context.Context) (ethtypes.EthUint64, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "EthBlockNumber", arg0)
|
||||||
|
ret0, _ := ret[0].(ethtypes.EthUint64)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthBlockNumber indicates an expected call of EthBlockNumber.
|
||||||
|
func (mr *MockFullNodeMockRecorder) EthBlockNumber(arg0 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EthBlockNumber", reflect.TypeOf((*MockFullNode)(nil).EthBlockNumber), arg0)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthCall mocks base method.
|
||||||
|
func (m *MockFullNode) EthCall(arg0 context.Context, arg1 ethtypes.EthCall, arg2 string) (ethtypes.EthBytes, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "EthCall", arg0, arg1, arg2)
|
||||||
|
ret0, _ := ret[0].(ethtypes.EthBytes)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthCall indicates an expected call of EthCall.
|
||||||
|
func (mr *MockFullNodeMockRecorder) EthCall(arg0, arg1, arg2 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EthCall", reflect.TypeOf((*MockFullNode)(nil).EthCall), arg0, arg1, arg2)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthChainId mocks base method.
|
||||||
|
func (m *MockFullNode) EthChainId(arg0 context.Context) (ethtypes.EthUint64, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "EthChainId", arg0)
|
||||||
|
ret0, _ := ret[0].(ethtypes.EthUint64)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthChainId indicates an expected call of EthChainId.
|
||||||
|
func (mr *MockFullNodeMockRecorder) EthChainId(arg0 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EthChainId", reflect.TypeOf((*MockFullNode)(nil).EthChainId), arg0)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthEstimateGas mocks base method.
|
||||||
|
func (m *MockFullNode) EthEstimateGas(arg0 context.Context, arg1 ethtypes.EthCall) (ethtypes.EthUint64, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "EthEstimateGas", arg0, arg1)
|
||||||
|
ret0, _ := ret[0].(ethtypes.EthUint64)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthEstimateGas indicates an expected call of EthEstimateGas.
|
||||||
|
func (mr *MockFullNodeMockRecorder) EthEstimateGas(arg0, arg1 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EthEstimateGas", reflect.TypeOf((*MockFullNode)(nil).EthEstimateGas), arg0, arg1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthFeeHistory mocks base method.
|
||||||
|
func (m *MockFullNode) EthFeeHistory(arg0 context.Context, arg1 jsonrpc.RawParams) (ethtypes.EthFeeHistory, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "EthFeeHistory", arg0, arg1)
|
||||||
|
ret0, _ := ret[0].(ethtypes.EthFeeHistory)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthFeeHistory indicates an expected call of EthFeeHistory.
|
||||||
|
func (mr *MockFullNodeMockRecorder) EthFeeHistory(arg0, arg1 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EthFeeHistory", reflect.TypeOf((*MockFullNode)(nil).EthFeeHistory), arg0, arg1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthGasPrice mocks base method.
|
||||||
|
func (m *MockFullNode) EthGasPrice(arg0 context.Context) (ethtypes.EthBigInt, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "EthGasPrice", arg0)
|
||||||
|
ret0, _ := ret[0].(ethtypes.EthBigInt)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthGasPrice indicates an expected call of EthGasPrice.
|
||||||
|
func (mr *MockFullNodeMockRecorder) EthGasPrice(arg0 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EthGasPrice", reflect.TypeOf((*MockFullNode)(nil).EthGasPrice), arg0)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthGetBalance mocks base method.
|
||||||
|
func (m *MockFullNode) EthGetBalance(arg0 context.Context, arg1 ethtypes.EthAddress, arg2 string) (ethtypes.EthBigInt, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "EthGetBalance", arg0, arg1, arg2)
|
||||||
|
ret0, _ := ret[0].(ethtypes.EthBigInt)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthGetBalance indicates an expected call of EthGetBalance.
|
||||||
|
func (mr *MockFullNodeMockRecorder) EthGetBalance(arg0, arg1, arg2 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EthGetBalance", reflect.TypeOf((*MockFullNode)(nil).EthGetBalance), arg0, arg1, arg2)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthGetBlockByHash mocks base method.
|
||||||
|
func (m *MockFullNode) EthGetBlockByHash(arg0 context.Context, arg1 ethtypes.EthHash, arg2 bool) (ethtypes.EthBlock, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "EthGetBlockByHash", arg0, arg1, arg2)
|
||||||
|
ret0, _ := ret[0].(ethtypes.EthBlock)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthGetBlockByHash indicates an expected call of EthGetBlockByHash.
|
||||||
|
func (mr *MockFullNodeMockRecorder) EthGetBlockByHash(arg0, arg1, arg2 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EthGetBlockByHash", reflect.TypeOf((*MockFullNode)(nil).EthGetBlockByHash), arg0, arg1, arg2)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthGetBlockByNumber mocks base method.
|
||||||
|
func (m *MockFullNode) EthGetBlockByNumber(arg0 context.Context, arg1 string, arg2 bool) (ethtypes.EthBlock, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "EthGetBlockByNumber", arg0, arg1, arg2)
|
||||||
|
ret0, _ := ret[0].(ethtypes.EthBlock)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthGetBlockByNumber indicates an expected call of EthGetBlockByNumber.
|
||||||
|
func (mr *MockFullNodeMockRecorder) EthGetBlockByNumber(arg0, arg1, arg2 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EthGetBlockByNumber", reflect.TypeOf((*MockFullNode)(nil).EthGetBlockByNumber), arg0, arg1, arg2)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthGetBlockTransactionCountByHash mocks base method.
|
||||||
|
func (m *MockFullNode) EthGetBlockTransactionCountByHash(arg0 context.Context, arg1 ethtypes.EthHash) (ethtypes.EthUint64, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "EthGetBlockTransactionCountByHash", arg0, arg1)
|
||||||
|
ret0, _ := ret[0].(ethtypes.EthUint64)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthGetBlockTransactionCountByHash indicates an expected call of EthGetBlockTransactionCountByHash.
|
||||||
|
func (mr *MockFullNodeMockRecorder) EthGetBlockTransactionCountByHash(arg0, arg1 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EthGetBlockTransactionCountByHash", reflect.TypeOf((*MockFullNode)(nil).EthGetBlockTransactionCountByHash), arg0, arg1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthGetBlockTransactionCountByNumber mocks base method.
|
||||||
|
func (m *MockFullNode) EthGetBlockTransactionCountByNumber(arg0 context.Context, arg1 ethtypes.EthUint64) (ethtypes.EthUint64, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "EthGetBlockTransactionCountByNumber", arg0, arg1)
|
||||||
|
ret0, _ := ret[0].(ethtypes.EthUint64)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthGetBlockTransactionCountByNumber indicates an expected call of EthGetBlockTransactionCountByNumber.
|
||||||
|
func (mr *MockFullNodeMockRecorder) EthGetBlockTransactionCountByNumber(arg0, arg1 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EthGetBlockTransactionCountByNumber", reflect.TypeOf((*MockFullNode)(nil).EthGetBlockTransactionCountByNumber), arg0, arg1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthGetCode mocks base method.
|
||||||
|
func (m *MockFullNode) EthGetCode(arg0 context.Context, arg1 ethtypes.EthAddress, arg2 string) (ethtypes.EthBytes, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "EthGetCode", arg0, arg1, arg2)
|
||||||
|
ret0, _ := ret[0].(ethtypes.EthBytes)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthGetCode indicates an expected call of EthGetCode.
|
||||||
|
func (mr *MockFullNodeMockRecorder) EthGetCode(arg0, arg1, arg2 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EthGetCode", reflect.TypeOf((*MockFullNode)(nil).EthGetCode), arg0, arg1, arg2)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthGetFilterChanges mocks base method.
|
||||||
|
func (m *MockFullNode) EthGetFilterChanges(arg0 context.Context, arg1 ethtypes.EthFilterID) (*ethtypes.EthFilterResult, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "EthGetFilterChanges", arg0, arg1)
|
||||||
|
ret0, _ := ret[0].(*ethtypes.EthFilterResult)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthGetFilterChanges indicates an expected call of EthGetFilterChanges.
|
||||||
|
func (mr *MockFullNodeMockRecorder) EthGetFilterChanges(arg0, arg1 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EthGetFilterChanges", reflect.TypeOf((*MockFullNode)(nil).EthGetFilterChanges), arg0, arg1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthGetFilterLogs mocks base method.
|
||||||
|
func (m *MockFullNode) EthGetFilterLogs(arg0 context.Context, arg1 ethtypes.EthFilterID) (*ethtypes.EthFilterResult, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "EthGetFilterLogs", arg0, arg1)
|
||||||
|
ret0, _ := ret[0].(*ethtypes.EthFilterResult)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthGetFilterLogs indicates an expected call of EthGetFilterLogs.
|
||||||
|
func (mr *MockFullNodeMockRecorder) EthGetFilterLogs(arg0, arg1 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EthGetFilterLogs", reflect.TypeOf((*MockFullNode)(nil).EthGetFilterLogs), arg0, arg1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthGetLogs mocks base method.
|
||||||
|
func (m *MockFullNode) EthGetLogs(arg0 context.Context, arg1 *ethtypes.EthFilterSpec) (*ethtypes.EthFilterResult, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "EthGetLogs", arg0, arg1)
|
||||||
|
ret0, _ := ret[0].(*ethtypes.EthFilterResult)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthGetLogs indicates an expected call of EthGetLogs.
|
||||||
|
func (mr *MockFullNodeMockRecorder) EthGetLogs(arg0, arg1 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EthGetLogs", reflect.TypeOf((*MockFullNode)(nil).EthGetLogs), arg0, arg1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthGetMessageCidByTransactionHash mocks base method.
|
||||||
|
func (m *MockFullNode) EthGetMessageCidByTransactionHash(arg0 context.Context, arg1 *ethtypes.EthHash) (*cid.Cid, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "EthGetMessageCidByTransactionHash", arg0, arg1)
|
||||||
|
ret0, _ := ret[0].(*cid.Cid)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthGetMessageCidByTransactionHash indicates an expected call of EthGetMessageCidByTransactionHash.
|
||||||
|
func (mr *MockFullNodeMockRecorder) EthGetMessageCidByTransactionHash(arg0, arg1 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EthGetMessageCidByTransactionHash", reflect.TypeOf((*MockFullNode)(nil).EthGetMessageCidByTransactionHash), arg0, arg1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthGetStorageAt mocks base method.
|
||||||
|
func (m *MockFullNode) EthGetStorageAt(arg0 context.Context, arg1 ethtypes.EthAddress, arg2 ethtypes.EthBytes, arg3 string) (ethtypes.EthBytes, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "EthGetStorageAt", arg0, arg1, arg2, arg3)
|
||||||
|
ret0, _ := ret[0].(ethtypes.EthBytes)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthGetStorageAt indicates an expected call of EthGetStorageAt.
|
||||||
|
func (mr *MockFullNodeMockRecorder) EthGetStorageAt(arg0, arg1, arg2, arg3 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EthGetStorageAt", reflect.TypeOf((*MockFullNode)(nil).EthGetStorageAt), arg0, arg1, arg2, arg3)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthGetTransactionByBlockHashAndIndex mocks base method.
|
||||||
|
func (m *MockFullNode) EthGetTransactionByBlockHashAndIndex(arg0 context.Context, arg1 ethtypes.EthHash, arg2 ethtypes.EthUint64) (ethtypes.EthTx, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "EthGetTransactionByBlockHashAndIndex", arg0, arg1, arg2)
|
||||||
|
ret0, _ := ret[0].(ethtypes.EthTx)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthGetTransactionByBlockHashAndIndex indicates an expected call of EthGetTransactionByBlockHashAndIndex.
|
||||||
|
func (mr *MockFullNodeMockRecorder) EthGetTransactionByBlockHashAndIndex(arg0, arg1, arg2 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EthGetTransactionByBlockHashAndIndex", reflect.TypeOf((*MockFullNode)(nil).EthGetTransactionByBlockHashAndIndex), arg0, arg1, arg2)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthGetTransactionByBlockNumberAndIndex mocks base method.
|
||||||
|
func (m *MockFullNode) EthGetTransactionByBlockNumberAndIndex(arg0 context.Context, arg1, arg2 ethtypes.EthUint64) (ethtypes.EthTx, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "EthGetTransactionByBlockNumberAndIndex", arg0, arg1, arg2)
|
||||||
|
ret0, _ := ret[0].(ethtypes.EthTx)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthGetTransactionByBlockNumberAndIndex indicates an expected call of EthGetTransactionByBlockNumberAndIndex.
|
||||||
|
func (mr *MockFullNodeMockRecorder) EthGetTransactionByBlockNumberAndIndex(arg0, arg1, arg2 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EthGetTransactionByBlockNumberAndIndex", reflect.TypeOf((*MockFullNode)(nil).EthGetTransactionByBlockNumberAndIndex), arg0, arg1, arg2)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthGetTransactionByHash mocks base method.
|
||||||
|
func (m *MockFullNode) EthGetTransactionByHash(arg0 context.Context, arg1 *ethtypes.EthHash) (*ethtypes.EthTx, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "EthGetTransactionByHash", arg0, arg1)
|
||||||
|
ret0, _ := ret[0].(*ethtypes.EthTx)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthGetTransactionByHash indicates an expected call of EthGetTransactionByHash.
|
||||||
|
func (mr *MockFullNodeMockRecorder) EthGetTransactionByHash(arg0, arg1 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EthGetTransactionByHash", reflect.TypeOf((*MockFullNode)(nil).EthGetTransactionByHash), arg0, arg1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthGetTransactionByHashLimited mocks base method.
|
||||||
|
func (m *MockFullNode) EthGetTransactionByHashLimited(arg0 context.Context, arg1 *ethtypes.EthHash, arg2 abi.ChainEpoch) (*ethtypes.EthTx, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "EthGetTransactionByHashLimited", arg0, arg1, arg2)
|
||||||
|
ret0, _ := ret[0].(*ethtypes.EthTx)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthGetTransactionByHashLimited indicates an expected call of EthGetTransactionByHashLimited.
|
||||||
|
func (mr *MockFullNodeMockRecorder) EthGetTransactionByHashLimited(arg0, arg1, arg2 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EthGetTransactionByHashLimited", reflect.TypeOf((*MockFullNode)(nil).EthGetTransactionByHashLimited), arg0, arg1, arg2)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthGetTransactionCount mocks base method.
|
||||||
|
func (m *MockFullNode) EthGetTransactionCount(arg0 context.Context, arg1 ethtypes.EthAddress, arg2 string) (ethtypes.EthUint64, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "EthGetTransactionCount", arg0, arg1, arg2)
|
||||||
|
ret0, _ := ret[0].(ethtypes.EthUint64)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthGetTransactionCount indicates an expected call of EthGetTransactionCount.
|
||||||
|
func (mr *MockFullNodeMockRecorder) EthGetTransactionCount(arg0, arg1, arg2 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EthGetTransactionCount", reflect.TypeOf((*MockFullNode)(nil).EthGetTransactionCount), arg0, arg1, arg2)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthGetTransactionHashByCid mocks base method.
|
||||||
|
func (m *MockFullNode) EthGetTransactionHashByCid(arg0 context.Context, arg1 cid.Cid) (*ethtypes.EthHash, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "EthGetTransactionHashByCid", arg0, arg1)
|
||||||
|
ret0, _ := ret[0].(*ethtypes.EthHash)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthGetTransactionHashByCid indicates an expected call of EthGetTransactionHashByCid.
|
||||||
|
func (mr *MockFullNodeMockRecorder) EthGetTransactionHashByCid(arg0, arg1 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EthGetTransactionHashByCid", reflect.TypeOf((*MockFullNode)(nil).EthGetTransactionHashByCid), arg0, arg1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthGetTransactionReceipt mocks base method.
|
||||||
|
func (m *MockFullNode) EthGetTransactionReceipt(arg0 context.Context, arg1 ethtypes.EthHash) (*api.EthTxReceipt, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "EthGetTransactionReceipt", arg0, arg1)
|
||||||
|
ret0, _ := ret[0].(*api.EthTxReceipt)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthGetTransactionReceipt indicates an expected call of EthGetTransactionReceipt.
|
||||||
|
func (mr *MockFullNodeMockRecorder) EthGetTransactionReceipt(arg0, arg1 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EthGetTransactionReceipt", reflect.TypeOf((*MockFullNode)(nil).EthGetTransactionReceipt), arg0, arg1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthGetTransactionReceiptLimited mocks base method.
|
||||||
|
func (m *MockFullNode) EthGetTransactionReceiptLimited(arg0 context.Context, arg1 ethtypes.EthHash, arg2 abi.ChainEpoch) (*api.EthTxReceipt, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "EthGetTransactionReceiptLimited", arg0, arg1, arg2)
|
||||||
|
ret0, _ := ret[0].(*api.EthTxReceipt)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthGetTransactionReceiptLimited indicates an expected call of EthGetTransactionReceiptLimited.
|
||||||
|
func (mr *MockFullNodeMockRecorder) EthGetTransactionReceiptLimited(arg0, arg1, arg2 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EthGetTransactionReceiptLimited", reflect.TypeOf((*MockFullNode)(nil).EthGetTransactionReceiptLimited), arg0, arg1, arg2)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthMaxPriorityFeePerGas mocks base method.
|
||||||
|
func (m *MockFullNode) EthMaxPriorityFeePerGas(arg0 context.Context) (ethtypes.EthBigInt, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "EthMaxPriorityFeePerGas", arg0)
|
||||||
|
ret0, _ := ret[0].(ethtypes.EthBigInt)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthMaxPriorityFeePerGas indicates an expected call of EthMaxPriorityFeePerGas.
|
||||||
|
func (mr *MockFullNodeMockRecorder) EthMaxPriorityFeePerGas(arg0 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EthMaxPriorityFeePerGas", reflect.TypeOf((*MockFullNode)(nil).EthMaxPriorityFeePerGas), arg0)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthNewBlockFilter mocks base method.
|
||||||
|
func (m *MockFullNode) EthNewBlockFilter(arg0 context.Context) (ethtypes.EthFilterID, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "EthNewBlockFilter", arg0)
|
||||||
|
ret0, _ := ret[0].(ethtypes.EthFilterID)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthNewBlockFilter indicates an expected call of EthNewBlockFilter.
|
||||||
|
func (mr *MockFullNodeMockRecorder) EthNewBlockFilter(arg0 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EthNewBlockFilter", reflect.TypeOf((*MockFullNode)(nil).EthNewBlockFilter), arg0)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthNewFilter mocks base method.
|
||||||
|
func (m *MockFullNode) EthNewFilter(arg0 context.Context, arg1 *ethtypes.EthFilterSpec) (ethtypes.EthFilterID, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "EthNewFilter", arg0, arg1)
|
||||||
|
ret0, _ := ret[0].(ethtypes.EthFilterID)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthNewFilter indicates an expected call of EthNewFilter.
|
||||||
|
func (mr *MockFullNodeMockRecorder) EthNewFilter(arg0, arg1 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EthNewFilter", reflect.TypeOf((*MockFullNode)(nil).EthNewFilter), arg0, arg1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthNewPendingTransactionFilter mocks base method.
|
||||||
|
func (m *MockFullNode) EthNewPendingTransactionFilter(arg0 context.Context) (ethtypes.EthFilterID, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "EthNewPendingTransactionFilter", arg0)
|
||||||
|
ret0, _ := ret[0].(ethtypes.EthFilterID)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthNewPendingTransactionFilter indicates an expected call of EthNewPendingTransactionFilter.
|
||||||
|
func (mr *MockFullNodeMockRecorder) EthNewPendingTransactionFilter(arg0 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EthNewPendingTransactionFilter", reflect.TypeOf((*MockFullNode)(nil).EthNewPendingTransactionFilter), arg0)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthProtocolVersion mocks base method.
|
||||||
|
func (m *MockFullNode) EthProtocolVersion(arg0 context.Context) (ethtypes.EthUint64, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "EthProtocolVersion", arg0)
|
||||||
|
ret0, _ := ret[0].(ethtypes.EthUint64)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthProtocolVersion indicates an expected call of EthProtocolVersion.
|
||||||
|
func (mr *MockFullNodeMockRecorder) EthProtocolVersion(arg0 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EthProtocolVersion", reflect.TypeOf((*MockFullNode)(nil).EthProtocolVersion), arg0)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthSendRawTransaction mocks base method.
|
||||||
|
func (m *MockFullNode) EthSendRawTransaction(arg0 context.Context, arg1 ethtypes.EthBytes) (ethtypes.EthHash, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "EthSendRawTransaction", arg0, arg1)
|
||||||
|
ret0, _ := ret[0].(ethtypes.EthHash)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthSendRawTransaction indicates an expected call of EthSendRawTransaction.
|
||||||
|
func (mr *MockFullNodeMockRecorder) EthSendRawTransaction(arg0, arg1 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EthSendRawTransaction", reflect.TypeOf((*MockFullNode)(nil).EthSendRawTransaction), arg0, arg1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthSubscribe mocks base method.
|
||||||
|
func (m *MockFullNode) EthSubscribe(arg0 context.Context, arg1 jsonrpc.RawParams) (ethtypes.EthSubscriptionID, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "EthSubscribe", arg0, arg1)
|
||||||
|
ret0, _ := ret[0].(ethtypes.EthSubscriptionID)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthSubscribe indicates an expected call of EthSubscribe.
|
||||||
|
func (mr *MockFullNodeMockRecorder) EthSubscribe(arg0, arg1 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EthSubscribe", reflect.TypeOf((*MockFullNode)(nil).EthSubscribe), arg0, arg1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthUninstallFilter mocks base method.
|
||||||
|
func (m *MockFullNode) EthUninstallFilter(arg0 context.Context, arg1 ethtypes.EthFilterID) (bool, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "EthUninstallFilter", arg0, arg1)
|
||||||
|
ret0, _ := ret[0].(bool)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthUninstallFilter indicates an expected call of EthUninstallFilter.
|
||||||
|
func (mr *MockFullNodeMockRecorder) EthUninstallFilter(arg0, arg1 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EthUninstallFilter", reflect.TypeOf((*MockFullNode)(nil).EthUninstallFilter), arg0, arg1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthUnsubscribe mocks base method.
|
||||||
|
func (m *MockFullNode) EthUnsubscribe(arg0 context.Context, arg1 ethtypes.EthSubscriptionID) (bool, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "EthUnsubscribe", arg0, arg1)
|
||||||
|
ret0, _ := ret[0].(bool)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// EthUnsubscribe indicates an expected call of EthUnsubscribe.
|
||||||
|
func (mr *MockFullNodeMockRecorder) EthUnsubscribe(arg0, arg1 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EthUnsubscribe", reflect.TypeOf((*MockFullNode)(nil).EthUnsubscribe), arg0, arg1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FilecoinAddressToEthAddress mocks base method.
|
||||||
|
func (m *MockFullNode) FilecoinAddressToEthAddress(arg0 context.Context, arg1 address.Address) (ethtypes.EthAddress, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "FilecoinAddressToEthAddress", arg0, arg1)
|
||||||
|
ret0, _ := ret[0].(ethtypes.EthAddress)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// FilecoinAddressToEthAddress indicates an expected call of FilecoinAddressToEthAddress.
|
||||||
|
func (mr *MockFullNodeMockRecorder) FilecoinAddressToEthAddress(arg0, arg1 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FilecoinAddressToEthAddress", reflect.TypeOf((*MockFullNode)(nil).FilecoinAddressToEthAddress), arg0, arg1)
|
||||||
|
}
|
||||||
|
|
||||||
// GasEstimateFeeCap mocks base method.
|
// GasEstimateFeeCap mocks base method.
|
||||||
func (m *MockFullNode) GasEstimateFeeCap(arg0 context.Context, arg1 *types.Message, arg2 int64, arg3 types.TipSetKey) (big.Int, error) {
|
func (m *MockFullNode) GasEstimateFeeCap(arg0 context.Context, arg1 *types.Message, arg2 int64, arg3 types.TipSetKey) (big.Int, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
@@ -1828,6 +2443,21 @@ func (mr *MockFullNodeMockRecorder) NetLimit(arg0, arg1 interface{}) *gomock.Cal
|
|||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetLimit", reflect.TypeOf((*MockFullNode)(nil).NetLimit), arg0, arg1)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetLimit", reflect.TypeOf((*MockFullNode)(nil).NetLimit), arg0, arg1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NetListening mocks base method.
|
||||||
|
func (m *MockFullNode) NetListening(arg0 context.Context) (bool, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "NetListening", arg0)
|
||||||
|
ret0, _ := ret[0].(bool)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// NetListening indicates an expected call of NetListening.
|
||||||
|
func (mr *MockFullNodeMockRecorder) NetListening(arg0 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetListening", reflect.TypeOf((*MockFullNode)(nil).NetListening), arg0)
|
||||||
|
}
|
||||||
|
|
||||||
// NetPeerInfo mocks base method.
|
// NetPeerInfo mocks base method.
|
||||||
func (m *MockFullNode) NetPeerInfo(arg0 context.Context, arg1 peer.ID) (*api.ExtendedPeerInfo, error) {
|
func (m *MockFullNode) NetPeerInfo(arg0 context.Context, arg1 peer.ID) (*api.ExtendedPeerInfo, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
@@ -1960,6 +2590,21 @@ func (mr *MockFullNodeMockRecorder) NetStat(arg0, arg1 interface{}) *gomock.Call
|
|||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetStat", reflect.TypeOf((*MockFullNode)(nil).NetStat), arg0, arg1)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetStat", reflect.TypeOf((*MockFullNode)(nil).NetStat), arg0, arg1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NetVersion mocks base method.
|
||||||
|
func (m *MockFullNode) NetVersion(arg0 context.Context) (string, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "NetVersion", arg0)
|
||||||
|
ret0, _ := ret[0].(string)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// NetVersion indicates an expected call of NetVersion.
|
||||||
|
func (mr *MockFullNodeMockRecorder) NetVersion(arg0 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetVersion", reflect.TypeOf((*MockFullNode)(nil).NetVersion), arg0)
|
||||||
|
}
|
||||||
|
|
||||||
// NodeStatus mocks base method.
|
// NodeStatus mocks base method.
|
||||||
func (m *MockFullNode) NodeStatus(arg0 context.Context, arg1 bool) (api.NodeStatus, error) {
|
func (m *MockFullNode) NodeStatus(arg0 context.Context, arg1 bool) (api.NodeStatus, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
@@ -2229,6 +2874,36 @@ func (mr *MockFullNodeMockRecorder) PaychVoucherSubmit(arg0, arg1, arg2, arg3, a
|
|||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychVoucherSubmit", reflect.TypeOf((*MockFullNode)(nil).PaychVoucherSubmit), arg0, arg1, arg2, arg3, arg4)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychVoucherSubmit", reflect.TypeOf((*MockFullNode)(nil).PaychVoucherSubmit), arg0, arg1, arg2, arg3, arg4)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RaftLeader mocks base method.
|
||||||
|
func (m *MockFullNode) RaftLeader(arg0 context.Context) (peer.ID, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "RaftLeader", arg0)
|
||||||
|
ret0, _ := ret[0].(peer.ID)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// RaftLeader indicates an expected call of RaftLeader.
|
||||||
|
func (mr *MockFullNodeMockRecorder) RaftLeader(arg0 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RaftLeader", reflect.TypeOf((*MockFullNode)(nil).RaftLeader), arg0)
|
||||||
|
}
|
||||||
|
|
||||||
|
// RaftState mocks base method.
|
||||||
|
func (m *MockFullNode) RaftState(arg0 context.Context) (*api.RaftStateData, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "RaftState", arg0)
|
||||||
|
ret0, _ := ret[0].(*api.RaftStateData)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// RaftState indicates an expected call of RaftState.
|
||||||
|
func (mr *MockFullNodeMockRecorder) RaftState(arg0 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RaftState", reflect.TypeOf((*MockFullNode)(nil).RaftState), arg0)
|
||||||
|
}
|
||||||
|
|
||||||
// Session mocks base method.
|
// Session mocks base method.
|
||||||
func (m *MockFullNode) Session(arg0 context.Context) (uuid.UUID, error) {
|
func (m *MockFullNode) Session(arg0 context.Context) (uuid.UUID, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
@@ -2258,6 +2933,21 @@ func (mr *MockFullNodeMockRecorder) Shutdown(arg0 interface{}) *gomock.Call {
|
|||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Shutdown", reflect.TypeOf((*MockFullNode)(nil).Shutdown), arg0)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Shutdown", reflect.TypeOf((*MockFullNode)(nil).Shutdown), arg0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// StartTime mocks base method.
|
||||||
|
func (m *MockFullNode) StartTime(arg0 context.Context) (time.Time, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "StartTime", arg0)
|
||||||
|
ret0, _ := ret[0].(time.Time)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// StartTime indicates an expected call of StartTime.
|
||||||
|
func (mr *MockFullNodeMockRecorder) StartTime(arg0 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StartTime", reflect.TypeOf((*MockFullNode)(nil).StartTime), arg0)
|
||||||
|
}
|
||||||
|
|
||||||
// StateAccountKey mocks base method.
|
// StateAccountKey mocks base method.
|
||||||
func (m *MockFullNode) StateAccountKey(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (address.Address, error) {
|
func (m *MockFullNode) StateAccountKey(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (address.Address, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
@@ -2288,6 +2978,21 @@ func (mr *MockFullNodeMockRecorder) StateActorCodeCIDs(arg0, arg1 interface{}) *
|
|||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateActorCodeCIDs", reflect.TypeOf((*MockFullNode)(nil).StateActorCodeCIDs), arg0, arg1)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateActorCodeCIDs", reflect.TypeOf((*MockFullNode)(nil).StateActorCodeCIDs), arg0, arg1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// StateActorManifestCID mocks base method.
|
||||||
|
func (m *MockFullNode) StateActorManifestCID(arg0 context.Context, arg1 network.Version) (cid.Cid, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "StateActorManifestCID", arg0, arg1)
|
||||||
|
ret0, _ := ret[0].(cid.Cid)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// StateActorManifestCID indicates an expected call of StateActorManifestCID.
|
||||||
|
func (mr *MockFullNodeMockRecorder) StateActorManifestCID(arg0, arg1 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateActorManifestCID", reflect.TypeOf((*MockFullNode)(nil).StateActorManifestCID), arg0, arg1)
|
||||||
|
}
|
||||||
|
|
||||||
// StateAllMinerFaults mocks base method.
|
// StateAllMinerFaults mocks base method.
|
||||||
func (m *MockFullNode) StateAllMinerFaults(arg0 context.Context, arg1 abi.ChainEpoch, arg2 types.TipSetKey) ([]*api.Fault, error) {
|
func (m *MockFullNode) StateAllMinerFaults(arg0 context.Context, arg1 abi.ChainEpoch, arg2 types.TipSetKey) ([]*api.Fault, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
@@ -2319,10 +3024,10 @@ func (mr *MockFullNodeMockRecorder) StateCall(arg0, arg1, arg2 interface{}) *gom
|
|||||||
}
|
}
|
||||||
|
|
||||||
// StateChangedActors mocks base method.
|
// StateChangedActors mocks base method.
|
||||||
func (m *MockFullNode) StateChangedActors(arg0 context.Context, arg1, arg2 cid.Cid) (map[string]types.Actor, error) {
|
func (m *MockFullNode) StateChangedActors(arg0 context.Context, arg1, arg2 cid.Cid) (map[string]types.ActorV5, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
ret := m.ctrl.Call(m, "StateChangedActors", arg0, arg1, arg2)
|
ret := m.ctrl.Call(m, "StateChangedActors", arg0, arg1, arg2)
|
||||||
ret0, _ := ret[0].(map[string]types.Actor)
|
ret0, _ := ret[0].(map[string]types.ActorV5)
|
||||||
ret1, _ := ret[1].(error)
|
ret1, _ := ret[1].(error)
|
||||||
return ret0, ret1
|
return ret0, ret1
|
||||||
}
|
}
|
||||||
@@ -2424,10 +3129,10 @@ func (mr *MockFullNodeMockRecorder) StateEncodeParams(arg0, arg1, arg2, arg3 int
|
|||||||
}
|
}
|
||||||
|
|
||||||
// StateGetActor mocks base method.
|
// StateGetActor mocks base method.
|
||||||
func (m *MockFullNode) StateGetActor(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (*types.Actor, error) {
|
func (m *MockFullNode) StateGetActor(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (*types.ActorV5, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
ret := m.ctrl.Call(m, "StateGetActor", arg0, arg1, arg2)
|
ret := m.ctrl.Call(m, "StateGetActor", arg0, arg1, arg2)
|
||||||
ret0, _ := ret[0].(*types.Actor)
|
ret0, _ := ret[0].(*types.ActorV5)
|
||||||
ret1, _ := ret[1].(error)
|
ret1, _ := ret[1].(error)
|
||||||
return ret0, ret1
|
return ret0, ret1
|
||||||
}
|
}
|
||||||
@@ -2438,6 +3143,51 @@ func (mr *MockFullNodeMockRecorder) StateGetActor(arg0, arg1, arg2 interface{})
|
|||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateGetActor", reflect.TypeOf((*MockFullNode)(nil).StateGetActor), arg0, arg1, arg2)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateGetActor", reflect.TypeOf((*MockFullNode)(nil).StateGetActor), arg0, arg1, arg2)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// StateGetAllocation mocks base method.
|
||||||
|
func (m *MockFullNode) StateGetAllocation(arg0 context.Context, arg1 address.Address, arg2 verifreg.AllocationId, arg3 types.TipSetKey) (*verifreg.Allocation, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "StateGetAllocation", arg0, arg1, arg2, arg3)
|
||||||
|
ret0, _ := ret[0].(*verifreg.Allocation)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// StateGetAllocation indicates an expected call of StateGetAllocation.
|
||||||
|
func (mr *MockFullNodeMockRecorder) StateGetAllocation(arg0, arg1, arg2, arg3 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateGetAllocation", reflect.TypeOf((*MockFullNode)(nil).StateGetAllocation), arg0, arg1, arg2, arg3)
|
||||||
|
}
|
||||||
|
|
||||||
|
// StateGetAllocationForPendingDeal mocks base method.
|
||||||
|
func (m *MockFullNode) StateGetAllocationForPendingDeal(arg0 context.Context, arg1 abi.DealID, arg2 types.TipSetKey) (*verifreg.Allocation, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "StateGetAllocationForPendingDeal", arg0, arg1, arg2)
|
||||||
|
ret0, _ := ret[0].(*verifreg.Allocation)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// StateGetAllocationForPendingDeal indicates an expected call of StateGetAllocationForPendingDeal.
|
||||||
|
func (mr *MockFullNodeMockRecorder) StateGetAllocationForPendingDeal(arg0, arg1, arg2 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateGetAllocationForPendingDeal", reflect.TypeOf((*MockFullNode)(nil).StateGetAllocationForPendingDeal), arg0, arg1, arg2)
|
||||||
|
}
|
||||||
|
|
||||||
|
// StateGetAllocations mocks base method.
|
||||||
|
func (m *MockFullNode) StateGetAllocations(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (map[verifreg.AllocationId]verifreg.Allocation, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "StateGetAllocations", arg0, arg1, arg2)
|
||||||
|
ret0, _ := ret[0].(map[verifreg.AllocationId]verifreg.Allocation)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// StateGetAllocations indicates an expected call of StateGetAllocations.
|
||||||
|
func (mr *MockFullNodeMockRecorder) StateGetAllocations(arg0, arg1, arg2 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateGetAllocations", reflect.TypeOf((*MockFullNode)(nil).StateGetAllocations), arg0, arg1, arg2)
|
||||||
|
}
|
||||||
|
|
||||||
// StateGetBeaconEntry mocks base method.
|
// StateGetBeaconEntry mocks base method.
|
||||||
func (m *MockFullNode) StateGetBeaconEntry(arg0 context.Context, arg1 abi.ChainEpoch) (*types.BeaconEntry, error) {
|
func (m *MockFullNode) StateGetBeaconEntry(arg0 context.Context, arg1 abi.ChainEpoch) (*types.BeaconEntry, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
@@ -2453,6 +3203,36 @@ func (mr *MockFullNodeMockRecorder) StateGetBeaconEntry(arg0, arg1 interface{})
|
|||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateGetBeaconEntry", reflect.TypeOf((*MockFullNode)(nil).StateGetBeaconEntry), arg0, arg1)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateGetBeaconEntry", reflect.TypeOf((*MockFullNode)(nil).StateGetBeaconEntry), arg0, arg1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// StateGetClaim mocks base method.
|
||||||
|
func (m *MockFullNode) StateGetClaim(arg0 context.Context, arg1 address.Address, arg2 verifreg.ClaimId, arg3 types.TipSetKey) (*verifreg.Claim, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "StateGetClaim", arg0, arg1, arg2, arg3)
|
||||||
|
ret0, _ := ret[0].(*verifreg.Claim)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// StateGetClaim indicates an expected call of StateGetClaim.
|
||||||
|
func (mr *MockFullNodeMockRecorder) StateGetClaim(arg0, arg1, arg2, arg3 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateGetClaim", reflect.TypeOf((*MockFullNode)(nil).StateGetClaim), arg0, arg1, arg2, arg3)
|
||||||
|
}
|
||||||
|
|
||||||
|
// StateGetClaims mocks base method.
|
||||||
|
func (m *MockFullNode) StateGetClaims(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (map[verifreg.ClaimId]verifreg.Claim, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "StateGetClaims", arg0, arg1, arg2)
|
||||||
|
ret0, _ := ret[0].(map[verifreg.ClaimId]verifreg.Claim)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// StateGetClaims indicates an expected call of StateGetClaims.
|
||||||
|
func (mr *MockFullNodeMockRecorder) StateGetClaims(arg0, arg1, arg2 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateGetClaims", reflect.TypeOf((*MockFullNode)(nil).StateGetClaims), arg0, arg1, arg2)
|
||||||
|
}
|
||||||
|
|
||||||
// StateGetNetworkParams mocks base method.
|
// StateGetNetworkParams mocks base method.
|
||||||
func (m *MockFullNode) StateGetNetworkParams(arg0 context.Context) (*api.NetworkParams, error) {
|
func (m *MockFullNode) StateGetNetworkParams(arg0 context.Context) (*api.NetworkParams, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
@@ -2648,6 +3428,21 @@ func (mr *MockFullNodeMockRecorder) StateMinerActiveSectors(arg0, arg1, arg2 int
|
|||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerActiveSectors", reflect.TypeOf((*MockFullNode)(nil).StateMinerActiveSectors), arg0, arg1, arg2)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerActiveSectors", reflect.TypeOf((*MockFullNode)(nil).StateMinerActiveSectors), arg0, arg1, arg2)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// StateMinerAllocated mocks base method.
|
||||||
|
func (m *MockFullNode) StateMinerAllocated(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (*bitfield.BitField, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "StateMinerAllocated", arg0, arg1, arg2)
|
||||||
|
ret0, _ := ret[0].(*bitfield.BitField)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// StateMinerAllocated indicates an expected call of StateMinerAllocated.
|
||||||
|
func (mr *MockFullNodeMockRecorder) StateMinerAllocated(arg0, arg1, arg2 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerAllocated", reflect.TypeOf((*MockFullNode)(nil).StateMinerAllocated), arg0, arg1, arg2)
|
||||||
|
}
|
||||||
|
|
||||||
// StateMinerAvailableBalance mocks base method.
|
// StateMinerAvailableBalance mocks base method.
|
||||||
func (m *MockFullNode) StateMinerAvailableBalance(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (big.Int, error) {
|
func (m *MockFullNode) StateMinerAvailableBalance(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (big.Int, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
@@ -3390,3 +4185,18 @@ func (mr *MockFullNodeMockRecorder) WalletVerify(arg0, arg1, arg2, arg3 interfac
|
|||||||
mr.mock.ctrl.T.Helper()
|
mr.mock.ctrl.T.Helper()
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletVerify", reflect.TypeOf((*MockFullNode)(nil).WalletVerify), arg0, arg1, arg2, arg3)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletVerify", reflect.TypeOf((*MockFullNode)(nil).WalletVerify), arg0, arg1, arg2, arg3)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Web3ClientVersion mocks base method.
|
||||||
|
func (m *MockFullNode) Web3ClientVersion(arg0 context.Context) (string, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "Web3ClientVersion", arg0)
|
||||||
|
ret0, _ := ret[0].(string)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// Web3ClientVersion indicates an expected call of Web3ClientVersion.
|
||||||
|
func (mr *MockFullNodeMockRecorder) Web3ClientVersion(arg0 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Web3ClientVersion", reflect.TypeOf((*MockFullNode)(nil).Web3ClientVersion), arg0)
|
||||||
|
}
|
||||||
|
|||||||
+2009
-468
File diff suppressed because it is too large
Load Diff
@@ -1,4 +1,4 @@
|
|||||||
//stm: #unit
|
// stm: #unit
|
||||||
package api
|
package api
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
+98
-23
@@ -5,17 +5,21 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/google/uuid"
|
||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
"github.com/ipfs/go-graphsync"
|
"github.com/ipfs/go-graphsync"
|
||||||
"github.com/libp2p/go-libp2p-core/network"
|
"github.com/ipld/go-ipld-prime"
|
||||||
"github.com/libp2p/go-libp2p-core/peer"
|
"github.com/ipld/go-ipld-prime/codec/dagjson"
|
||||||
pubsub "github.com/libp2p/go-libp2p-pubsub"
|
pubsub "github.com/libp2p/go-libp2p-pubsub"
|
||||||
|
"github.com/libp2p/go-libp2p/core/network"
|
||||||
|
"github.com/libp2p/go-libp2p/core/peer"
|
||||||
ma "github.com/multiformats/go-multiaddr"
|
ma "github.com/multiformats/go-multiaddr"
|
||||||
|
|
||||||
"github.com/filecoin-project/go-address"
|
"github.com/filecoin-project/go-address"
|
||||||
datatransfer "github.com/filecoin-project/go-data-transfer"
|
datatransfer "github.com/filecoin-project/go-data-transfer/v2"
|
||||||
"github.com/filecoin-project/go-fil-markets/retrievalmarket"
|
"github.com/filecoin-project/go-fil-markets/retrievalmarket"
|
||||||
"github.com/filecoin-project/go-state-types/abi"
|
"github.com/filecoin-project/go-state-types/abi"
|
||||||
|
"github.com/filecoin-project/go-state-types/builtin/v9/miner"
|
||||||
|
|
||||||
"github.com/filecoin-project/lotus/chain/types"
|
"github.com/filecoin-project/lotus/chain/types"
|
||||||
"github.com/filecoin-project/lotus/node/modules/dtypes"
|
"github.com/filecoin-project/lotus/node/modules/dtypes"
|
||||||
@@ -53,7 +57,13 @@ type PubsubScore struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type MessageSendSpec struct {
|
type MessageSendSpec struct {
|
||||||
MaxFee abi.TokenAmount
|
MaxFee abi.TokenAmount
|
||||||
|
MsgUuid uuid.UUID
|
||||||
|
}
|
||||||
|
|
||||||
|
type MpoolMessageWhole struct {
|
||||||
|
Msg *types.Message
|
||||||
|
Spec *MessageSendSpec
|
||||||
}
|
}
|
||||||
|
|
||||||
// GraphSyncDataTransfer provides diagnostics on a data transfer happening over graphsync
|
// GraphSyncDataTransfer provides diagnostics on a data transfer happening over graphsync
|
||||||
@@ -102,16 +112,12 @@ func NewDataTransferChannel(hostID peer.ID, channelState datatransfer.ChannelSta
|
|||||||
IsSender: channelState.Sender() == hostID,
|
IsSender: channelState.Sender() == hostID,
|
||||||
Message: channelState.Message(),
|
Message: channelState.Message(),
|
||||||
}
|
}
|
||||||
stringer, ok := channelState.Voucher().(fmt.Stringer)
|
voucher := channelState.Voucher()
|
||||||
if ok {
|
voucherJSON, err := ipld.Encode(voucher.Voucher, dagjson.Encode)
|
||||||
channel.Voucher = stringer.String()
|
if err != nil {
|
||||||
|
channel.Voucher = fmt.Errorf("Voucher Serialization: %w", err).Error()
|
||||||
} else {
|
} else {
|
||||||
voucherJSON, err := json.Marshal(channelState.Voucher())
|
channel.Voucher = string(voucherJSON)
|
||||||
if err != nil {
|
|
||||||
channel.Voucher = fmt.Errorf("Voucher Serialization: %w", err).Error()
|
|
||||||
} else {
|
|
||||||
channel.Voucher = string(voucherJSON)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if channel.IsSender {
|
if channel.IsSender {
|
||||||
channel.IsInitiator = !channelState.IsPull()
|
channel.IsInitiator = !channelState.IsPull()
|
||||||
@@ -134,13 +140,7 @@ type NetStat struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type NetLimit struct {
|
type NetLimit struct {
|
||||||
Dynamic bool `json:",omitempty"`
|
|
||||||
// set if Dynamic is false
|
|
||||||
Memory int64 `json:",omitempty"`
|
Memory int64 `json:",omitempty"`
|
||||||
// set if Dynamic is true
|
|
||||||
MemoryFraction float64 `json:",omitempty"`
|
|
||||||
MinMemory int64 `json:",omitempty"`
|
|
||||||
MaxMemory int64 `json:",omitempty"`
|
|
||||||
|
|
||||||
Streams, StreamsInbound, StreamsOutbound int
|
Streams, StreamsInbound, StreamsOutbound int
|
||||||
Conns, ConnsInbound, ConnsOutbound int
|
Conns, ConnsInbound, ConnsOutbound int
|
||||||
@@ -252,10 +252,10 @@ type RestrievalRes struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Selector specifies ipld selector string
|
// Selector specifies ipld selector string
|
||||||
// - if the string starts with '{', it's interpreted as json selector string
|
// - if the string starts with '{', it's interpreted as json selector string
|
||||||
// see https://ipld.io/specs/selectors/ and https://ipld.io/specs/selectors/fixtures/selector-fixtures-1/
|
// see https://ipld.io/specs/selectors/ and https://ipld.io/specs/selectors/fixtures/selector-fixtures-1/
|
||||||
// - otherwise the string is interpreted as ipld-selector-text-lite (simple ipld path)
|
// - otherwise the string is interpreted as ipld-selector-text-lite (simple ipld path)
|
||||||
// see https://github.com/ipld/go-ipld-selector-text-lite
|
// see https://github.com/ipld/go-ipld-selector-text-lite
|
||||||
type Selector string
|
type Selector string
|
||||||
|
|
||||||
type DagSpec struct {
|
type DagSpec struct {
|
||||||
@@ -299,6 +299,9 @@ type MinerInfo struct {
|
|||||||
SectorSize abi.SectorSize
|
SectorSize abi.SectorSize
|
||||||
WindowPoStPartitionSectors uint64
|
WindowPoStPartitionSectors uint64
|
||||||
ConsensusFaultElapsed abi.ChainEpoch
|
ConsensusFaultElapsed abi.ChainEpoch
|
||||||
|
Beneficiary address.Address
|
||||||
|
BeneficiaryTerm *miner.BeneficiaryTerm
|
||||||
|
PendingBeneficiaryTerm *miner.PendingBeneficiaryChange
|
||||||
}
|
}
|
||||||
|
|
||||||
type NetworkParams struct {
|
type NetworkParams struct {
|
||||||
@@ -331,4 +334,76 @@ type ForkUpgradeParams struct {
|
|||||||
UpgradeHyperdriveHeight abi.ChainEpoch
|
UpgradeHyperdriveHeight abi.ChainEpoch
|
||||||
UpgradeChocolateHeight abi.ChainEpoch
|
UpgradeChocolateHeight abi.ChainEpoch
|
||||||
UpgradeOhSnapHeight abi.ChainEpoch
|
UpgradeOhSnapHeight abi.ChainEpoch
|
||||||
|
UpgradeSkyrHeight abi.ChainEpoch
|
||||||
|
UpgradeSharkHeight abi.ChainEpoch
|
||||||
|
UpgradeHyggeHeight abi.ChainEpoch
|
||||||
|
UpgradeLightningHeight abi.ChainEpoch
|
||||||
|
UpgradeThunderHeight abi.ChainEpoch
|
||||||
|
}
|
||||||
|
|
||||||
|
type NonceMapType map[address.Address]uint64
|
||||||
|
type MsgUuidMapType map[uuid.UUID]*types.SignedMessage
|
||||||
|
|
||||||
|
type RaftStateData struct {
|
||||||
|
NonceMap NonceMapType
|
||||||
|
MsgUuids MsgUuidMapType
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *NonceMapType) MarshalJSON() ([]byte, error) {
|
||||||
|
marshalled := make(map[string]uint64)
|
||||||
|
for a, n := range *n {
|
||||||
|
marshalled[a.String()] = n
|
||||||
|
}
|
||||||
|
return json.Marshal(marshalled)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *NonceMapType) UnmarshalJSON(b []byte) error {
|
||||||
|
unmarshalled := make(map[string]uint64)
|
||||||
|
err := json.Unmarshal(b, &unmarshalled)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
*n = make(map[address.Address]uint64)
|
||||||
|
for saddr, nonce := range unmarshalled {
|
||||||
|
a, err := address.NewFromString(saddr)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
(*n)[a] = nonce
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *MsgUuidMapType) MarshalJSON() ([]byte, error) {
|
||||||
|
marshalled := make(map[string]*types.SignedMessage)
|
||||||
|
for u, msg := range *m {
|
||||||
|
marshalled[u.String()] = msg
|
||||||
|
}
|
||||||
|
return json.Marshal(marshalled)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *MsgUuidMapType) UnmarshalJSON(b []byte) error {
|
||||||
|
unmarshalled := make(map[string]*types.SignedMessage)
|
||||||
|
err := json.Unmarshal(b, &unmarshalled)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
*m = make(map[uuid.UUID]*types.SignedMessage)
|
||||||
|
for suid, msg := range unmarshalled {
|
||||||
|
u, err := uuid.Parse(suid)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
(*m)[u] = msg
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChainExportConfig holds configuration for chain ranged exports.
|
||||||
|
type ChainExportConfig struct {
|
||||||
|
WriteBufferSize int
|
||||||
|
NumWorkers int
|
||||||
|
IncludeMessages bool
|
||||||
|
IncludeReceipts bool
|
||||||
|
IncludeStateRoots bool
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
package apitypes
|
||||||
|
|
||||||
|
type Aliaser interface {
|
||||||
|
AliasMethod(alias, original string)
|
||||||
|
}
|
||||||
+27
-14
@@ -3,19 +3,20 @@ package v0api
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
blocks "github.com/ipfs/go-block-format"
|
|
||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
|
blocks "github.com/ipfs/go-libipfs/blocks"
|
||||||
textselector "github.com/ipld/go-ipld-selector-text-lite"
|
textselector "github.com/ipld/go-ipld-selector-text-lite"
|
||||||
"github.com/libp2p/go-libp2p-core/peer"
|
"github.com/libp2p/go-libp2p/core/peer"
|
||||||
|
|
||||||
"github.com/filecoin-project/go-address"
|
"github.com/filecoin-project/go-address"
|
||||||
"github.com/filecoin-project/go-bitfield"
|
"github.com/filecoin-project/go-bitfield"
|
||||||
datatransfer "github.com/filecoin-project/go-data-transfer"
|
datatransfer "github.com/filecoin-project/go-data-transfer/v2"
|
||||||
"github.com/filecoin-project/go-fil-markets/retrievalmarket"
|
"github.com/filecoin-project/go-fil-markets/retrievalmarket"
|
||||||
"github.com/filecoin-project/go-fil-markets/storagemarket"
|
"github.com/filecoin-project/go-fil-markets/storagemarket"
|
||||||
"github.com/filecoin-project/go-state-types/abi"
|
"github.com/filecoin-project/go-state-types/abi"
|
||||||
"github.com/filecoin-project/go-state-types/builtin/v8/miner"
|
|
||||||
"github.com/filecoin-project/go-state-types/builtin/v8/paych"
|
"github.com/filecoin-project/go-state-types/builtin/v8/paych"
|
||||||
|
"github.com/filecoin-project/go-state-types/builtin/v9/miner"
|
||||||
|
verifregtypes "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
|
||||||
"github.com/filecoin-project/go-state-types/crypto"
|
"github.com/filecoin-project/go-state-types/crypto"
|
||||||
"github.com/filecoin-project/go-state-types/dline"
|
"github.com/filecoin-project/go-state-types/dline"
|
||||||
abinetwork "github.com/filecoin-project/go-state-types/network"
|
abinetwork "github.com/filecoin-project/go-state-types/network"
|
||||||
@@ -140,7 +141,7 @@ type FullNode interface {
|
|||||||
|
|
||||||
// ChainGetPath returns a set of revert/apply operations needed to get from
|
// ChainGetPath returns a set of revert/apply operations needed to get from
|
||||||
// one tipset to another, for example:
|
// one tipset to another, for example:
|
||||||
//```
|
// ```
|
||||||
// to
|
// to
|
||||||
// ^
|
// ^
|
||||||
// from tAA
|
// from tAA
|
||||||
@@ -149,7 +150,7 @@ type FullNode interface {
|
|||||||
// ^---*--^
|
// ^---*--^
|
||||||
// ^
|
// ^
|
||||||
// tRR
|
// tRR
|
||||||
//```
|
// ```
|
||||||
// Would return `[revert(tBA), apply(tAB), apply(tAA)]`
|
// Would return `[revert(tBA), apply(tAB), apply(tAA)]`
|
||||||
ChainGetPath(ctx context.Context, from types.TipSetKey, to types.TipSetKey) ([]*api.HeadChange, error) //perm:read
|
ChainGetPath(ctx context.Context, from types.TipSetKey, to types.TipSetKey) ([]*api.HeadChange, error) //perm:read
|
||||||
|
|
||||||
@@ -366,12 +367,12 @@ type FullNode interface {
|
|||||||
ClientCancelRetrievalDeal(ctx context.Context, dealid retrievalmarket.DealID) error //perm:write
|
ClientCancelRetrievalDeal(ctx context.Context, dealid retrievalmarket.DealID) error //perm:write
|
||||||
|
|
||||||
// ClientUnimport removes references to the specified file from filestore
|
// ClientUnimport removes references to the specified file from filestore
|
||||||
//ClientUnimport(path string)
|
// ClientUnimport(path string)
|
||||||
|
|
||||||
// ClientListImports lists imported files and their root CIDs
|
// ClientListImports lists imported files and their root CIDs
|
||||||
ClientListImports(ctx context.Context) ([]api.Import, error) //perm:write
|
ClientListImports(ctx context.Context) ([]api.Import, error) //perm:write
|
||||||
|
|
||||||
//ClientListAsks() []Ask
|
// ClientListAsks() []Ask
|
||||||
|
|
||||||
// MethodGroup: State
|
// MethodGroup: State
|
||||||
// The State methods are used to query, inspect, and interact with chain state.
|
// The State methods are used to query, inspect, and interact with chain state.
|
||||||
@@ -386,7 +387,7 @@ type FullNode interface {
|
|||||||
StateCall(context.Context, *types.Message, types.TipSetKey) (*api.InvocResult, error) //perm:read
|
StateCall(context.Context, *types.Message, types.TipSetKey) (*api.InvocResult, error) //perm:read
|
||||||
// StateReplay replays a given message, assuming it was included in a block in the specified tipset.
|
// StateReplay replays a given message, assuming it was included in a block in the specified tipset.
|
||||||
//
|
//
|
||||||
// If a tipset key is provided, and a replacing message is found on chain,
|
// If a tipset key is provided, and a replacing message is not found on chain,
|
||||||
// the method will return an error saying that the message wasn't found
|
// the method will return an error saying that the message wasn't found
|
||||||
//
|
//
|
||||||
// If no tipset key is provided, the appropriate tipset is looked up, and if
|
// If no tipset key is provided, the appropriate tipset is looked up, and if
|
||||||
@@ -531,6 +532,16 @@ type FullNode interface {
|
|||||||
StateMarketDeals(context.Context, types.TipSetKey) (map[string]*api.MarketDeal, error) //perm:read
|
StateMarketDeals(context.Context, types.TipSetKey) (map[string]*api.MarketDeal, error) //perm:read
|
||||||
// StateMarketStorageDeal returns information about the indicated deal
|
// StateMarketStorageDeal returns information about the indicated deal
|
||||||
StateMarketStorageDeal(context.Context, abi.DealID, types.TipSetKey) (*api.MarketDeal, error) //perm:read
|
StateMarketStorageDeal(context.Context, abi.DealID, types.TipSetKey) (*api.MarketDeal, error) //perm:read
|
||||||
|
// StateGetAllocationForPendingDeal returns the allocation for a given deal ID of a pending deal.
|
||||||
|
StateGetAllocationForPendingDeal(ctx context.Context, dealId abi.DealID, tsk types.TipSetKey) (*verifregtypes.Allocation, error) //perm:read
|
||||||
|
// StateGetAllocation returns the allocation for a given address and allocation ID.
|
||||||
|
StateGetAllocation(ctx context.Context, clientAddr address.Address, allocationId verifregtypes.AllocationId, tsk types.TipSetKey) (*verifregtypes.Allocation, error) //perm:read
|
||||||
|
// StateGetAllocations returns the all the allocations for a given client.
|
||||||
|
StateGetAllocations(ctx context.Context, clientAddr address.Address, tsk types.TipSetKey) (map[verifregtypes.AllocationId]verifregtypes.Allocation, error) //perm:read
|
||||||
|
// StateGetClaim returns the claim for a given address and claim ID.
|
||||||
|
StateGetClaim(ctx context.Context, providerAddr address.Address, claimId verifregtypes.ClaimId, tsk types.TipSetKey) (*verifregtypes.Claim, error) //perm:read
|
||||||
|
// StateGetClaims returns the all the claims for a given provider.
|
||||||
|
StateGetClaims(ctx context.Context, providerAddr address.Address, tsk types.TipSetKey) (map[verifregtypes.ClaimId]verifregtypes.Claim, error) //perm:read
|
||||||
// StateLookupID retrieves the ID address of the given address
|
// StateLookupID retrieves the ID address of the given address
|
||||||
StateLookupID(context.Context, address.Address, types.TipSetKey) (address.Address, error) //perm:read
|
StateLookupID(context.Context, address.Address, types.TipSetKey) (address.Address, error) //perm:read
|
||||||
// StateAccountKey returns the public key address of the given ID address
|
// StateAccountKey returns the public key address of the given ID address
|
||||||
@@ -591,7 +602,7 @@ type FullNode interface {
|
|||||||
// Returns nil if there is no entry in the data cap table for the
|
// Returns nil if there is no entry in the data cap table for the
|
||||||
// address.
|
// address.
|
||||||
StateVerifiedClientStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) //perm:read
|
StateVerifiedClientStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) //perm:read
|
||||||
// StateVerifiedClientStatus returns the address of the Verified Registry's root key
|
// StateVerifiedRegistryRootKey returns the address of the Verified Registry's root key
|
||||||
StateVerifiedRegistryRootKey(ctx context.Context, tsk types.TipSetKey) (address.Address, error) //perm:read
|
StateVerifiedRegistryRootKey(ctx context.Context, tsk types.TipSetKey) (address.Address, error) //perm:read
|
||||||
// StateDealProviderCollateralBounds returns the min and max collateral a storage provider
|
// StateDealProviderCollateralBounds returns the min and max collateral a storage provider
|
||||||
// can issue. It takes the deal size and verified status as parameters.
|
// can issue. It takes the deal size and verified status as parameters.
|
||||||
@@ -607,6 +618,8 @@ type FullNode interface {
|
|||||||
StateNetworkVersion(context.Context, types.TipSetKey) (apitypes.NetworkVersion, error) //perm:read
|
StateNetworkVersion(context.Context, types.TipSetKey) (apitypes.NetworkVersion, error) //perm:read
|
||||||
// StateActorCodeCIDs returns the CIDs of all the builtin actors for the given network version
|
// StateActorCodeCIDs returns the CIDs of all the builtin actors for the given network version
|
||||||
StateActorCodeCIDs(context.Context, abinetwork.Version) (map[string]cid.Cid, error) //perm:read
|
StateActorCodeCIDs(context.Context, abinetwork.Version) (map[string]cid.Cid, error) //perm:read
|
||||||
|
// StateActorManifestCID returns the CID of the builtin actors manifest for the given network version
|
||||||
|
StateActorManifestCID(context.Context, abinetwork.Version) (cid.Cid, error) //perm:read
|
||||||
|
|
||||||
// StateGetRandomnessFromTickets is used to sample the chain for randomness.
|
// StateGetRandomnessFromTickets is used to sample the chain for randomness.
|
||||||
StateGetRandomnessFromTickets(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte, tsk types.TipSetKey) (abi.Randomness, error) //perm:read
|
StateGetRandomnessFromTickets(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte, tsk types.TipSetKey) (abi.Randomness, error) //perm:read
|
||||||
@@ -628,14 +641,14 @@ type FullNode interface {
|
|||||||
// It takes the following params: <multisig address>, <start epoch>, <end epoch>
|
// It takes the following params: <multisig address>, <start epoch>, <end epoch>
|
||||||
MsigGetVested(context.Context, address.Address, types.TipSetKey, types.TipSetKey) (types.BigInt, error) //perm:read
|
MsigGetVested(context.Context, address.Address, types.TipSetKey, types.TipSetKey) (types.BigInt, error) //perm:read
|
||||||
|
|
||||||
//MsigGetPending returns pending transactions for the given multisig
|
// MsigGetPending returns pending transactions for the given multisig
|
||||||
//wallet. Once pending transactions are fully approved, they will no longer
|
// wallet. Once pending transactions are fully approved, they will no longer
|
||||||
//appear here.
|
// appear here.
|
||||||
MsigGetPending(context.Context, address.Address, types.TipSetKey) ([]*api.MsigTransaction, error) //perm:read
|
MsigGetPending(context.Context, address.Address, types.TipSetKey) ([]*api.MsigTransaction, error) //perm:read
|
||||||
|
|
||||||
// MsigCreate creates a multisig wallet
|
// MsigCreate creates a multisig wallet
|
||||||
// It takes the following params: <required number of senders>, <approving addresses>, <unlock duration>
|
// It takes the following params: <required number of senders>, <approving addresses>, <unlock duration>
|
||||||
//<initial balance>, <sender address of the create msg>, <gas price>
|
// <initial balance>, <sender address of the create msg>, <gas price>
|
||||||
MsigCreate(context.Context, uint64, []address.Address, abi.ChainEpoch, types.BigInt, address.Address, types.BigInt) (cid.Cid, error) //perm:sign
|
MsigCreate(context.Context, uint64, []address.Address, abi.ChainEpoch, types.BigInt, address.Address, types.BigInt) (cid.Cid, error) //perm:sign
|
||||||
// MsigPropose proposes a multisig message
|
// MsigPropose proposes a multisig message
|
||||||
// It takes the following params: <multisig address>, <recipient address>, <value to transfer>,
|
// It takes the following params: <multisig address>, <recipient address>, <value to transfer>,
|
||||||
|
|||||||
@@ -3,17 +3,18 @@ package v0api
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
blocks "github.com/ipfs/go-block-format"
|
|
||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
|
blocks "github.com/ipfs/go-libipfs/blocks"
|
||||||
|
|
||||||
"github.com/filecoin-project/go-address"
|
"github.com/filecoin-project/go-address"
|
||||||
"github.com/filecoin-project/go-state-types/abi"
|
"github.com/filecoin-project/go-state-types/abi"
|
||||||
"github.com/filecoin-project/go-state-types/builtin/v8/miner"
|
"github.com/filecoin-project/go-state-types/builtin/v9/miner"
|
||||||
"github.com/filecoin-project/go-state-types/dline"
|
"github.com/filecoin-project/go-state-types/dline"
|
||||||
abinetwork "github.com/filecoin-project/go-state-types/network"
|
abinetwork "github.com/filecoin-project/go-state-types/network"
|
||||||
|
|
||||||
"github.com/filecoin-project/lotus/api"
|
"github.com/filecoin-project/lotus/api"
|
||||||
"github.com/filecoin-project/lotus/chain/types"
|
"github.com/filecoin-project/lotus/chain/types"
|
||||||
|
"github.com/filecoin-project/lotus/node/modules/dtypes"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MODIFYING THE API INTERFACE
|
// MODIFYING THE API INTERFACE
|
||||||
@@ -44,12 +45,15 @@ type Gateway interface {
|
|||||||
ChainNotify(context.Context) (<-chan []*api.HeadChange, error)
|
ChainNotify(context.Context) (<-chan []*api.HeadChange, error)
|
||||||
ChainReadObj(context.Context, cid.Cid) ([]byte, error)
|
ChainReadObj(context.Context, cid.Cid) ([]byte, error)
|
||||||
GasEstimateMessageGas(ctx context.Context, msg *types.Message, spec *api.MessageSendSpec, tsk types.TipSetKey) (*types.Message, error)
|
GasEstimateMessageGas(ctx context.Context, msg *types.Message, spec *api.MessageSendSpec, tsk types.TipSetKey) (*types.Message, error)
|
||||||
|
MpoolGetNonce(ctx context.Context, addr address.Address) (uint64, error)
|
||||||
MpoolPush(ctx context.Context, sm *types.SignedMessage) (cid.Cid, error)
|
MpoolPush(ctx context.Context, sm *types.SignedMessage) (cid.Cid, error)
|
||||||
MsigGetAvailableBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.BigInt, error)
|
MsigGetAvailableBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.BigInt, error)
|
||||||
MsigGetVested(ctx context.Context, addr address.Address, start types.TipSetKey, end types.TipSetKey) (types.BigInt, error)
|
MsigGetVested(ctx context.Context, addr address.Address, start types.TipSetKey, end types.TipSetKey) (types.BigInt, error)
|
||||||
MsigGetPending(context.Context, address.Address, types.TipSetKey) ([]*api.MsigTransaction, error)
|
MsigGetPending(context.Context, address.Address, types.TipSetKey) ([]*api.MsigTransaction, error)
|
||||||
StateAccountKey(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error)
|
StateAccountKey(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error)
|
||||||
|
StateCall(ctx context.Context, msg *types.Message, tsk types.TipSetKey) (*api.InvocResult, error)
|
||||||
StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (api.DealCollateralBounds, error)
|
StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (api.DealCollateralBounds, error)
|
||||||
|
StateDecodeParams(ctx context.Context, toAddr address.Address, method abi.MethodNum, params []byte, tsk types.TipSetKey) (interface{}, error)
|
||||||
StateGetActor(ctx context.Context, actor address.Address, ts types.TipSetKey) (*types.Actor, error)
|
StateGetActor(ctx context.Context, actor address.Address, ts types.TipSetKey) (*types.Actor, error)
|
||||||
StateGetReceipt(context.Context, cid.Cid, types.TipSetKey) (*types.MessageReceipt, error)
|
StateGetReceipt(context.Context, cid.Cid, types.TipSetKey) (*types.MessageReceipt, error)
|
||||||
StateListMiners(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error)
|
StateListMiners(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error)
|
||||||
@@ -59,6 +63,7 @@ type Gateway interface {
|
|||||||
StateMinerInfo(ctx context.Context, actor address.Address, tsk types.TipSetKey) (api.MinerInfo, error)
|
StateMinerInfo(ctx context.Context, actor address.Address, tsk types.TipSetKey) (api.MinerInfo, error)
|
||||||
StateMinerProvingDeadline(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*dline.Info, error)
|
StateMinerProvingDeadline(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*dline.Info, error)
|
||||||
StateMinerPower(context.Context, address.Address, types.TipSetKey) (*api.MinerPower, error)
|
StateMinerPower(context.Context, address.Address, types.TipSetKey) (*api.MinerPower, error)
|
||||||
|
StateNetworkName(context.Context) (dtypes.NetworkName, error)
|
||||||
StateNetworkVersion(context.Context, types.TipSetKey) (abinetwork.Version, error)
|
StateNetworkVersion(context.Context, types.TipSetKey) (abinetwork.Version, error)
|
||||||
StateSearchMsg(ctx context.Context, msg cid.Cid) (*api.MsgLookup, error)
|
StateSearchMsg(ctx context.Context, msg cid.Cid) (*api.MsgLookup, error)
|
||||||
StateSectorGetInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorOnChainInfo, error)
|
StateSectorGetInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorOnChainInfo, error)
|
||||||
|
|||||||
+357
-222
@@ -5,19 +5,20 @@ package v0api
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
blocks "github.com/ipfs/go-block-format"
|
|
||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
"github.com/libp2p/go-libp2p-core/peer"
|
blocks "github.com/ipfs/go-libipfs/blocks"
|
||||||
|
"github.com/libp2p/go-libp2p/core/peer"
|
||||||
"golang.org/x/xerrors"
|
"golang.org/x/xerrors"
|
||||||
|
|
||||||
"github.com/filecoin-project/go-address"
|
"github.com/filecoin-project/go-address"
|
||||||
"github.com/filecoin-project/go-bitfield"
|
"github.com/filecoin-project/go-bitfield"
|
||||||
datatransfer "github.com/filecoin-project/go-data-transfer"
|
datatransfer "github.com/filecoin-project/go-data-transfer/v2"
|
||||||
"github.com/filecoin-project/go-fil-markets/retrievalmarket"
|
"github.com/filecoin-project/go-fil-markets/retrievalmarket"
|
||||||
"github.com/filecoin-project/go-fil-markets/storagemarket"
|
"github.com/filecoin-project/go-fil-markets/storagemarket"
|
||||||
"github.com/filecoin-project/go-state-types/abi"
|
"github.com/filecoin-project/go-state-types/abi"
|
||||||
"github.com/filecoin-project/go-state-types/builtin/v8/miner"
|
|
||||||
"github.com/filecoin-project/go-state-types/builtin/v8/paych"
|
"github.com/filecoin-project/go-state-types/builtin/v8/paych"
|
||||||
|
"github.com/filecoin-project/go-state-types/builtin/v9/miner"
|
||||||
|
verifregtypes "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
|
||||||
"github.com/filecoin-project/go-state-types/crypto"
|
"github.com/filecoin-project/go-state-types/crypto"
|
||||||
"github.com/filecoin-project/go-state-types/dline"
|
"github.com/filecoin-project/go-state-types/dline"
|
||||||
abinetwork "github.com/filecoin-project/go-state-types/network"
|
abinetwork "github.com/filecoin-project/go-state-types/network"
|
||||||
@@ -38,371 +39,385 @@ type FullNodeStruct struct {
|
|||||||
|
|
||||||
NetStruct
|
NetStruct
|
||||||
|
|
||||||
Internal struct {
|
Internal FullNodeMethods
|
||||||
BeaconGetEntry func(p0 context.Context, p1 abi.ChainEpoch) (*types.BeaconEntry, error) `perm:"read"`
|
}
|
||||||
|
|
||||||
ChainDeleteObj func(p0 context.Context, p1 cid.Cid) error `perm:"admin"`
|
type FullNodeMethods struct {
|
||||||
|
BeaconGetEntry func(p0 context.Context, p1 abi.ChainEpoch) (*types.BeaconEntry, error) `perm:"read"`
|
||||||
|
|
||||||
ChainExport func(p0 context.Context, p1 abi.ChainEpoch, p2 bool, p3 types.TipSetKey) (<-chan []byte, error) `perm:"read"`
|
ChainDeleteObj func(p0 context.Context, p1 cid.Cid) error `perm:"admin"`
|
||||||
|
|
||||||
ChainGetBlock func(p0 context.Context, p1 cid.Cid) (*types.BlockHeader, error) `perm:"read"`
|
ChainExport func(p0 context.Context, p1 abi.ChainEpoch, p2 bool, p3 types.TipSetKey) (<-chan []byte, error) `perm:"read"`
|
||||||
|
|
||||||
ChainGetBlockMessages func(p0 context.Context, p1 cid.Cid) (*api.BlockMessages, error) `perm:"read"`
|
ChainGetBlock func(p0 context.Context, p1 cid.Cid) (*types.BlockHeader, error) `perm:"read"`
|
||||||
|
|
||||||
ChainGetGenesis func(p0 context.Context) (*types.TipSet, error) `perm:"read"`
|
ChainGetBlockMessages func(p0 context.Context, p1 cid.Cid) (*api.BlockMessages, error) `perm:"read"`
|
||||||
|
|
||||||
ChainGetMessage func(p0 context.Context, p1 cid.Cid) (*types.Message, error) `perm:"read"`
|
ChainGetGenesis func(p0 context.Context) (*types.TipSet, error) `perm:"read"`
|
||||||
|
|
||||||
ChainGetMessagesInTipset func(p0 context.Context, p1 types.TipSetKey) ([]api.Message, error) `perm:"read"`
|
ChainGetMessage func(p0 context.Context, p1 cid.Cid) (*types.Message, error) `perm:"read"`
|
||||||
|
|
||||||
ChainGetNode func(p0 context.Context, p1 string) (*api.IpldObject, error) `perm:"read"`
|
ChainGetMessagesInTipset func(p0 context.Context, p1 types.TipSetKey) ([]api.Message, error) `perm:"read"`
|
||||||
|
|
||||||
ChainGetParentMessages func(p0 context.Context, p1 cid.Cid) ([]api.Message, error) `perm:"read"`
|
ChainGetNode func(p0 context.Context, p1 string) (*api.IpldObject, error) `perm:"read"`
|
||||||
|
|
||||||
ChainGetParentReceipts func(p0 context.Context, p1 cid.Cid) ([]*types.MessageReceipt, error) `perm:"read"`
|
ChainGetParentMessages func(p0 context.Context, p1 cid.Cid) ([]api.Message, error) `perm:"read"`
|
||||||
|
|
||||||
ChainGetPath func(p0 context.Context, p1 types.TipSetKey, p2 types.TipSetKey) ([]*api.HeadChange, error) `perm:"read"`
|
ChainGetParentReceipts func(p0 context.Context, p1 cid.Cid) ([]*types.MessageReceipt, error) `perm:"read"`
|
||||||
|
|
||||||
ChainGetRandomnessFromBeacon func(p0 context.Context, p1 types.TipSetKey, p2 crypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) `perm:"read"`
|
ChainGetPath func(p0 context.Context, p1 types.TipSetKey, p2 types.TipSetKey) ([]*api.HeadChange, error) `perm:"read"`
|
||||||
|
|
||||||
ChainGetRandomnessFromTickets func(p0 context.Context, p1 types.TipSetKey, p2 crypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) `perm:"read"`
|
ChainGetRandomnessFromBeacon func(p0 context.Context, p1 types.TipSetKey, p2 crypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) `perm:"read"`
|
||||||
|
|
||||||
ChainGetTipSet func(p0 context.Context, p1 types.TipSetKey) (*types.TipSet, error) `perm:"read"`
|
ChainGetRandomnessFromTickets func(p0 context.Context, p1 types.TipSetKey, p2 crypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) `perm:"read"`
|
||||||
|
|
||||||
ChainGetTipSetByHeight func(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) `perm:"read"`
|
ChainGetTipSet func(p0 context.Context, p1 types.TipSetKey) (*types.TipSet, error) `perm:"read"`
|
||||||
|
|
||||||
ChainHasObj func(p0 context.Context, p1 cid.Cid) (bool, error) `perm:"read"`
|
ChainGetTipSetByHeight func(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) `perm:"read"`
|
||||||
|
|
||||||
ChainHead func(p0 context.Context) (*types.TipSet, error) `perm:"read"`
|
ChainHasObj func(p0 context.Context, p1 cid.Cid) (bool, error) `perm:"read"`
|
||||||
|
|
||||||
ChainNotify func(p0 context.Context) (<-chan []*api.HeadChange, error) `perm:"read"`
|
ChainHead func(p0 context.Context) (*types.TipSet, error) `perm:"read"`
|
||||||
|
|
||||||
ChainPutObj func(p0 context.Context, p1 blocks.Block) error ``
|
ChainNotify func(p0 context.Context) (<-chan []*api.HeadChange, error) `perm:"read"`
|
||||||
|
|
||||||
ChainReadObj func(p0 context.Context, p1 cid.Cid) ([]byte, error) `perm:"read"`
|
ChainPutObj func(p0 context.Context, p1 blocks.Block) error ``
|
||||||
|
|
||||||
ChainSetHead func(p0 context.Context, p1 types.TipSetKey) error `perm:"admin"`
|
ChainReadObj func(p0 context.Context, p1 cid.Cid) ([]byte, error) `perm:"read"`
|
||||||
|
|
||||||
ChainStatObj func(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (api.ObjStat, error) `perm:"read"`
|
ChainSetHead func(p0 context.Context, p1 types.TipSetKey) error `perm:"admin"`
|
||||||
|
|
||||||
ChainTipSetWeight func(p0 context.Context, p1 types.TipSetKey) (types.BigInt, error) `perm:"read"`
|
ChainStatObj func(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (api.ObjStat, error) `perm:"read"`
|
||||||
|
|
||||||
ClientCalcCommP func(p0 context.Context, p1 string) (*api.CommPRet, error) `perm:"write"`
|
ChainTipSetWeight func(p0 context.Context, p1 types.TipSetKey) (types.BigInt, error) `perm:"read"`
|
||||||
|
|
||||||
ClientCancelDataTransfer func(p0 context.Context, p1 datatransfer.TransferID, p2 peer.ID, p3 bool) error `perm:"write"`
|
ClientCalcCommP func(p0 context.Context, p1 string) (*api.CommPRet, error) `perm:"write"`
|
||||||
|
|
||||||
ClientCancelRetrievalDeal func(p0 context.Context, p1 retrievalmarket.DealID) error `perm:"write"`
|
ClientCancelDataTransfer func(p0 context.Context, p1 datatransfer.TransferID, p2 peer.ID, p3 bool) error `perm:"write"`
|
||||||
|
|
||||||
ClientDataTransferUpdates func(p0 context.Context) (<-chan api.DataTransferChannel, error) `perm:"write"`
|
ClientCancelRetrievalDeal func(p0 context.Context, p1 retrievalmarket.DealID) error `perm:"write"`
|
||||||
|
|
||||||
ClientDealPieceCID func(p0 context.Context, p1 cid.Cid) (api.DataCIDSize, error) `perm:"read"`
|
ClientDataTransferUpdates func(p0 context.Context) (<-chan api.DataTransferChannel, error) `perm:"write"`
|
||||||
|
|
||||||
ClientDealSize func(p0 context.Context, p1 cid.Cid) (api.DataSize, error) `perm:"read"`
|
ClientDealPieceCID func(p0 context.Context, p1 cid.Cid) (api.DataCIDSize, error) `perm:"read"`
|
||||||
|
|
||||||
ClientFindData func(p0 context.Context, p1 cid.Cid, p2 *cid.Cid) ([]api.QueryOffer, error) `perm:"read"`
|
ClientDealSize func(p0 context.Context, p1 cid.Cid) (api.DataSize, error) `perm:"read"`
|
||||||
|
|
||||||
ClientGenCar func(p0 context.Context, p1 api.FileRef, p2 string) error `perm:"write"`
|
ClientFindData func(p0 context.Context, p1 cid.Cid, p2 *cid.Cid) ([]api.QueryOffer, error) `perm:"read"`
|
||||||
|
|
||||||
ClientGetDealInfo func(p0 context.Context, p1 cid.Cid) (*api.DealInfo, error) `perm:"read"`
|
ClientGenCar func(p0 context.Context, p1 api.FileRef, p2 string) error `perm:"write"`
|
||||||
|
|
||||||
ClientGetDealStatus func(p0 context.Context, p1 uint64) (string, error) `perm:"read"`
|
ClientGetDealInfo func(p0 context.Context, p1 cid.Cid) (*api.DealInfo, error) `perm:"read"`
|
||||||
|
|
||||||
ClientGetDealUpdates func(p0 context.Context) (<-chan api.DealInfo, error) `perm:"write"`
|
ClientGetDealStatus func(p0 context.Context, p1 uint64) (string, error) `perm:"read"`
|
||||||
|
|
||||||
ClientGetRetrievalUpdates func(p0 context.Context) (<-chan api.RetrievalInfo, error) `perm:"write"`
|
ClientGetDealUpdates func(p0 context.Context) (<-chan api.DealInfo, error) `perm:"write"`
|
||||||
|
|
||||||
ClientHasLocal func(p0 context.Context, p1 cid.Cid) (bool, error) `perm:"write"`
|
ClientGetRetrievalUpdates func(p0 context.Context) (<-chan api.RetrievalInfo, error) `perm:"write"`
|
||||||
|
|
||||||
ClientImport func(p0 context.Context, p1 api.FileRef) (*api.ImportRes, error) `perm:"admin"`
|
ClientHasLocal func(p0 context.Context, p1 cid.Cid) (bool, error) `perm:"write"`
|
||||||
|
|
||||||
ClientListDataTransfers func(p0 context.Context) ([]api.DataTransferChannel, error) `perm:"write"`
|
ClientImport func(p0 context.Context, p1 api.FileRef) (*api.ImportRes, error) `perm:"admin"`
|
||||||
|
|
||||||
ClientListDeals func(p0 context.Context) ([]api.DealInfo, error) `perm:"write"`
|
ClientListDataTransfers func(p0 context.Context) ([]api.DataTransferChannel, error) `perm:"write"`
|
||||||
|
|
||||||
ClientListImports func(p0 context.Context) ([]api.Import, error) `perm:"write"`
|
ClientListDeals func(p0 context.Context) ([]api.DealInfo, error) `perm:"write"`
|
||||||
|
|
||||||
ClientListRetrievals func(p0 context.Context) ([]api.RetrievalInfo, error) `perm:"write"`
|
ClientListImports func(p0 context.Context) ([]api.Import, error) `perm:"write"`
|
||||||
|
|
||||||
ClientMinerQueryOffer func(p0 context.Context, p1 address.Address, p2 cid.Cid, p3 *cid.Cid) (api.QueryOffer, error) `perm:"read"`
|
ClientListRetrievals func(p0 context.Context) ([]api.RetrievalInfo, error) `perm:"write"`
|
||||||
|
|
||||||
ClientQueryAsk func(p0 context.Context, p1 peer.ID, p2 address.Address) (*storagemarket.StorageAsk, error) `perm:"read"`
|
ClientMinerQueryOffer func(p0 context.Context, p1 address.Address, p2 cid.Cid, p3 *cid.Cid) (api.QueryOffer, error) `perm:"read"`
|
||||||
|
|
||||||
ClientRemoveImport func(p0 context.Context, p1 imports.ID) error `perm:"admin"`
|
ClientQueryAsk func(p0 context.Context, p1 peer.ID, p2 address.Address) (*storagemarket.StorageAsk, error) `perm:"read"`
|
||||||
|
|
||||||
ClientRestartDataTransfer func(p0 context.Context, p1 datatransfer.TransferID, p2 peer.ID, p3 bool) error `perm:"write"`
|
ClientRemoveImport func(p0 context.Context, p1 imports.ID) error `perm:"admin"`
|
||||||
|
|
||||||
ClientRetrieve func(p0 context.Context, p1 RetrievalOrder, p2 *api.FileRef) error `perm:"admin"`
|
ClientRestartDataTransfer func(p0 context.Context, p1 datatransfer.TransferID, p2 peer.ID, p3 bool) error `perm:"write"`
|
||||||
|
|
||||||
ClientRetrieveTryRestartInsufficientFunds func(p0 context.Context, p1 address.Address) error `perm:"write"`
|
ClientRetrieve func(p0 context.Context, p1 RetrievalOrder, p2 *api.FileRef) error `perm:"admin"`
|
||||||
|
|
||||||
ClientRetrieveWithEvents func(p0 context.Context, p1 RetrievalOrder, p2 *api.FileRef) (<-chan marketevents.RetrievalEvent, error) `perm:"admin"`
|
ClientRetrieveTryRestartInsufficientFunds func(p0 context.Context, p1 address.Address) error `perm:"write"`
|
||||||
|
|
||||||
ClientStartDeal func(p0 context.Context, p1 *api.StartDealParams) (*cid.Cid, error) `perm:"admin"`
|
ClientRetrieveWithEvents func(p0 context.Context, p1 RetrievalOrder, p2 *api.FileRef) (<-chan marketevents.RetrievalEvent, error) `perm:"admin"`
|
||||||
|
|
||||||
ClientStatelessDeal func(p0 context.Context, p1 *api.StartDealParams) (*cid.Cid, error) `perm:"write"`
|
ClientStartDeal func(p0 context.Context, p1 *api.StartDealParams) (*cid.Cid, error) `perm:"admin"`
|
||||||
|
|
||||||
CreateBackup func(p0 context.Context, p1 string) error `perm:"admin"`
|
ClientStatelessDeal func(p0 context.Context, p1 *api.StartDealParams) (*cid.Cid, error) `perm:"write"`
|
||||||
|
|
||||||
GasEstimateFeeCap func(p0 context.Context, p1 *types.Message, p2 int64, p3 types.TipSetKey) (types.BigInt, error) `perm:"read"`
|
CreateBackup func(p0 context.Context, p1 string) error `perm:"admin"`
|
||||||
|
|
||||||
GasEstimateGasLimit func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (int64, error) `perm:"read"`
|
GasEstimateFeeCap func(p0 context.Context, p1 *types.Message, p2 int64, p3 types.TipSetKey) (types.BigInt, error) `perm:"read"`
|
||||||
|
|
||||||
GasEstimateGasPremium func(p0 context.Context, p1 uint64, p2 address.Address, p3 int64, p4 types.TipSetKey) (types.BigInt, error) `perm:"read"`
|
GasEstimateGasLimit func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (int64, error) `perm:"read"`
|
||||||
|
|
||||||
GasEstimateMessageGas func(p0 context.Context, p1 *types.Message, p2 *api.MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) `perm:"read"`
|
GasEstimateGasPremium func(p0 context.Context, p1 uint64, p2 address.Address, p3 int64, p4 types.TipSetKey) (types.BigInt, error) `perm:"read"`
|
||||||
|
|
||||||
MarketAddBalance func(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt) (cid.Cid, error) `perm:"sign"`
|
GasEstimateMessageGas func(p0 context.Context, p1 *types.Message, p2 *api.MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) `perm:"read"`
|
||||||
|
|
||||||
MarketGetReserved func(p0 context.Context, p1 address.Address) (types.BigInt, error) `perm:"sign"`
|
MarketAddBalance func(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt) (cid.Cid, error) `perm:"sign"`
|
||||||
|
|
||||||
MarketReleaseFunds func(p0 context.Context, p1 address.Address, p2 types.BigInt) error `perm:"sign"`
|
MarketGetReserved func(p0 context.Context, p1 address.Address) (types.BigInt, error) `perm:"sign"`
|
||||||
|
|
||||||
MarketReserveFunds func(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt) (cid.Cid, error) `perm:"sign"`
|
MarketReleaseFunds func(p0 context.Context, p1 address.Address, p2 types.BigInt) error `perm:"sign"`
|
||||||
|
|
||||||
MarketWithdraw func(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt) (cid.Cid, error) `perm:"sign"`
|
MarketReserveFunds func(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt) (cid.Cid, error) `perm:"sign"`
|
||||||
|
|
||||||
MinerCreateBlock func(p0 context.Context, p1 *api.BlockTemplate) (*types.BlockMsg, error) `perm:"write"`
|
MarketWithdraw func(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt) (cid.Cid, error) `perm:"sign"`
|
||||||
|
|
||||||
MinerGetBaseInfo func(p0 context.Context, p1 address.Address, p2 abi.ChainEpoch, p3 types.TipSetKey) (*api.MiningBaseInfo, error) `perm:"read"`
|
MinerCreateBlock func(p0 context.Context, p1 *api.BlockTemplate) (*types.BlockMsg, error) `perm:"write"`
|
||||||
|
|
||||||
MpoolBatchPush func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"`
|
MinerGetBaseInfo func(p0 context.Context, p1 address.Address, p2 abi.ChainEpoch, p3 types.TipSetKey) (*api.MiningBaseInfo, error) `perm:"read"`
|
||||||
|
|
||||||
MpoolBatchPushMessage func(p0 context.Context, p1 []*types.Message, p2 *api.MessageSendSpec) ([]*types.SignedMessage, error) `perm:"sign"`
|
MpoolBatchPush func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"`
|
||||||
|
|
||||||
MpoolBatchPushUntrusted func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"`
|
MpoolBatchPushMessage func(p0 context.Context, p1 []*types.Message, p2 *api.MessageSendSpec) ([]*types.SignedMessage, error) `perm:"sign"`
|
||||||
|
|
||||||
MpoolClear func(p0 context.Context, p1 bool) error `perm:"write"`
|
MpoolBatchPushUntrusted func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"`
|
||||||
|
|
||||||
MpoolGetConfig func(p0 context.Context) (*types.MpoolConfig, error) `perm:"read"`
|
MpoolClear func(p0 context.Context, p1 bool) error `perm:"write"`
|
||||||
|
|
||||||
MpoolGetNonce func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"read"`
|
MpoolGetConfig func(p0 context.Context) (*types.MpoolConfig, error) `perm:"read"`
|
||||||
|
|
||||||
MpoolPending func(p0 context.Context, p1 types.TipSetKey) ([]*types.SignedMessage, error) `perm:"read"`
|
MpoolGetNonce func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"read"`
|
||||||
|
|
||||||
MpoolPush func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"write"`
|
MpoolPending func(p0 context.Context, p1 types.TipSetKey) ([]*types.SignedMessage, error) `perm:"read"`
|
||||||
|
|
||||||
MpoolPushMessage func(p0 context.Context, p1 *types.Message, p2 *api.MessageSendSpec) (*types.SignedMessage, error) `perm:"sign"`
|
MpoolPush func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"write"`
|
||||||
|
|
||||||
MpoolPushUntrusted func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"write"`
|
MpoolPushMessage func(p0 context.Context, p1 *types.Message, p2 *api.MessageSendSpec) (*types.SignedMessage, error) `perm:"sign"`
|
||||||
|
|
||||||
MpoolSelect func(p0 context.Context, p1 types.TipSetKey, p2 float64) ([]*types.SignedMessage, error) `perm:"read"`
|
MpoolPushUntrusted func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"write"`
|
||||||
|
|
||||||
MpoolSetConfig func(p0 context.Context, p1 *types.MpoolConfig) error `perm:"admin"`
|
MpoolSelect func(p0 context.Context, p1 types.TipSetKey, p2 float64) ([]*types.SignedMessage, error) `perm:"read"`
|
||||||
|
|
||||||
MpoolSub func(p0 context.Context) (<-chan api.MpoolUpdate, error) `perm:"read"`
|
MpoolSetConfig func(p0 context.Context, p1 *types.MpoolConfig) error `perm:"admin"`
|
||||||
|
|
||||||
MsigAddApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 bool) (cid.Cid, error) `perm:"sign"`
|
MpoolSub func(p0 context.Context) (<-chan api.MpoolUpdate, error) `perm:"read"`
|
||||||
|
|
||||||
MsigAddCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 bool) (cid.Cid, error) `perm:"sign"`
|
MsigAddApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 bool) (cid.Cid, error) `perm:"sign"`
|
||||||
|
|
||||||
MsigAddPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (cid.Cid, error) `perm:"sign"`
|
MsigAddCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 bool) (cid.Cid, error) `perm:"sign"`
|
||||||
|
|
||||||
MsigApprove func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (cid.Cid, error) `perm:"sign"`
|
MsigAddPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (cid.Cid, error) `perm:"sign"`
|
||||||
|
|
||||||
MsigApproveTxnHash func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 address.Address, p5 types.BigInt, p6 address.Address, p7 uint64, p8 []byte) (cid.Cid, error) `perm:"sign"`
|
MsigApprove func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (cid.Cid, error) `perm:"sign"`
|
||||||
|
|
||||||
MsigCancel func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 types.BigInt, p5 address.Address, p6 uint64, p7 []byte) (cid.Cid, error) `perm:"sign"`
|
MsigApproveTxnHash func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 address.Address, p5 types.BigInt, p6 address.Address, p7 uint64, p8 []byte) (cid.Cid, error) `perm:"sign"`
|
||||||
|
|
||||||
MsigCreate func(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 types.BigInt, p5 address.Address, p6 types.BigInt) (cid.Cid, error) `perm:"sign"`
|
MsigCancel func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 types.BigInt, p5 address.Address, p6 uint64, p7 []byte) (cid.Cid, error) `perm:"sign"`
|
||||||
|
|
||||||
MsigGetAvailableBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.BigInt, error) `perm:"read"`
|
MsigCreate func(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 types.BigInt, p5 address.Address, p6 types.BigInt) (cid.Cid, error) `perm:"sign"`
|
||||||
|
|
||||||
MsigGetPending func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]*api.MsigTransaction, error) `perm:"read"`
|
MsigGetAvailableBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.BigInt, error) `perm:"read"`
|
||||||
|
|
||||||
MsigGetVested func(p0 context.Context, p1 address.Address, p2 types.TipSetKey, p3 types.TipSetKey) (types.BigInt, error) `perm:"read"`
|
MsigGetPending func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]*api.MsigTransaction, error) `perm:"read"`
|
||||||
|
|
||||||
MsigGetVestingSchedule func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (api.MsigVesting, error) `perm:"read"`
|
MsigGetVested func(p0 context.Context, p1 address.Address, p2 types.TipSetKey, p3 types.TipSetKey) (types.BigInt, error) `perm:"read"`
|
||||||
|
|
||||||
MsigPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt, p4 address.Address, p5 uint64, p6 []byte) (cid.Cid, error) `perm:"sign"`
|
MsigGetVestingSchedule func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (api.MsigVesting, error) `perm:"read"`
|
||||||
|
|
||||||
MsigRemoveSigner func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (cid.Cid, error) `perm:"sign"`
|
MsigPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt, p4 address.Address, p5 uint64, p6 []byte) (cid.Cid, error) `perm:"sign"`
|
||||||
|
|
||||||
MsigSwapApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 address.Address) (cid.Cid, error) `perm:"sign"`
|
MsigRemoveSigner func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (cid.Cid, error) `perm:"sign"`
|
||||||
|
|
||||||
MsigSwapCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address) (cid.Cid, error) `perm:"sign"`
|
MsigSwapApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 address.Address) (cid.Cid, error) `perm:"sign"`
|
||||||
|
|
||||||
MsigSwapPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 address.Address) (cid.Cid, error) `perm:"sign"`
|
MsigSwapCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address) (cid.Cid, error) `perm:"sign"`
|
||||||
|
|
||||||
PaychAllocateLane func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"sign"`
|
MsigSwapPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 address.Address) (cid.Cid, error) `perm:"sign"`
|
||||||
|
|
||||||
PaychAvailableFunds func(p0 context.Context, p1 address.Address) (*api.ChannelAvailableFunds, error) `perm:"sign"`
|
PaychAllocateLane func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"sign"`
|
||||||
|
|
||||||
PaychAvailableFundsByFromTo func(p0 context.Context, p1 address.Address, p2 address.Address) (*api.ChannelAvailableFunds, error) `perm:"sign"`
|
PaychAvailableFunds func(p0 context.Context, p1 address.Address) (*api.ChannelAvailableFunds, error) `perm:"sign"`
|
||||||
|
|
||||||
PaychCollect func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"`
|
PaychAvailableFundsByFromTo func(p0 context.Context, p1 address.Address, p2 address.Address) (*api.ChannelAvailableFunds, error) `perm:"sign"`
|
||||||
|
|
||||||
PaychGet func(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt) (*api.ChannelInfo, error) `perm:"sign"`
|
PaychCollect func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"`
|
||||||
|
|
||||||
PaychGetWaitReady func(p0 context.Context, p1 cid.Cid) (address.Address, error) `perm:"sign"`
|
PaychGet func(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt) (*api.ChannelInfo, error) `perm:"sign"`
|
||||||
|
|
||||||
PaychList func(p0 context.Context) ([]address.Address, error) `perm:"read"`
|
PaychGetWaitReady func(p0 context.Context, p1 cid.Cid) (address.Address, error) `perm:"sign"`
|
||||||
|
|
||||||
PaychNewPayment func(p0 context.Context, p1 address.Address, p2 address.Address, p3 []api.VoucherSpec) (*api.PaymentInfo, error) `perm:"sign"`
|
PaychList func(p0 context.Context) ([]address.Address, error) `perm:"read"`
|
||||||
|
|
||||||
PaychSettle func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"`
|
PaychNewPayment func(p0 context.Context, p1 address.Address, p2 address.Address, p3 []api.VoucherSpec) (*api.PaymentInfo, error) `perm:"sign"`
|
||||||
|
|
||||||
PaychStatus func(p0 context.Context, p1 address.Address) (*api.PaychStatus, error) `perm:"read"`
|
PaychSettle func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"`
|
||||||
|
|
||||||
PaychVoucherAdd func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 types.BigInt) (types.BigInt, error) `perm:"write"`
|
PaychStatus func(p0 context.Context, p1 address.Address) (*api.PaychStatus, error) `perm:"read"`
|
||||||
|
|
||||||
PaychVoucherCheckSpendable func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (bool, error) `perm:"read"`
|
PaychVoucherAdd func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 types.BigInt) (types.BigInt, error) `perm:"write"`
|
||||||
|
|
||||||
PaychVoucherCheckValid func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher) error `perm:"read"`
|
PaychVoucherCheckSpendable func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (bool, error) `perm:"read"`
|
||||||
|
|
||||||
PaychVoucherCreate func(p0 context.Context, p1 address.Address, p2 types.BigInt, p3 uint64) (*api.VoucherCreateResult, error) `perm:"sign"`
|
PaychVoucherCheckValid func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher) error `perm:"read"`
|
||||||
|
|
||||||
PaychVoucherList func(p0 context.Context, p1 address.Address) ([]*paych.SignedVoucher, error) `perm:"write"`
|
PaychVoucherCreate func(p0 context.Context, p1 address.Address, p2 types.BigInt, p3 uint64) (*api.VoucherCreateResult, error) `perm:"sign"`
|
||||||
|
|
||||||
PaychVoucherSubmit func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (cid.Cid, error) `perm:"sign"`
|
PaychVoucherList func(p0 context.Context, p1 address.Address) ([]*paych.SignedVoucher, error) `perm:"write"`
|
||||||
|
|
||||||
StateAccountKey func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `perm:"read"`
|
PaychVoucherSubmit func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (cid.Cid, error) `perm:"sign"`
|
||||||
|
|
||||||
StateActorCodeCIDs func(p0 context.Context, p1 abinetwork.Version) (map[string]cid.Cid, error) `perm:"read"`
|
StateAccountKey func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `perm:"read"`
|
||||||
|
|
||||||
StateAllMinerFaults func(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) ([]*api.Fault, error) `perm:"read"`
|
StateActorCodeCIDs func(p0 context.Context, p1 abinetwork.Version) (map[string]cid.Cid, error) `perm:"read"`
|
||||||
|
|
||||||
StateCall func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*api.InvocResult, error) `perm:"read"`
|
StateActorManifestCID func(p0 context.Context, p1 abinetwork.Version) (cid.Cid, error) `perm:"read"`
|
||||||
|
|
||||||
StateChangedActors func(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (map[string]types.Actor, error) `perm:"read"`
|
StateAllMinerFaults func(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) ([]*api.Fault, error) `perm:"read"`
|
||||||
|
|
||||||
StateCirculatingSupply func(p0 context.Context, p1 types.TipSetKey) (abi.TokenAmount, error) `perm:"read"`
|
StateCall func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*api.InvocResult, error) `perm:"read"`
|
||||||
|
|
||||||
StateCompute func(p0 context.Context, p1 abi.ChainEpoch, p2 []*types.Message, p3 types.TipSetKey) (*api.ComputeStateOutput, error) `perm:"read"`
|
StateChangedActors func(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (map[string]types.Actor, error) `perm:"read"`
|
||||||
|
|
||||||
StateDealProviderCollateralBounds func(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (api.DealCollateralBounds, error) `perm:"read"`
|
StateCirculatingSupply func(p0 context.Context, p1 types.TipSetKey) (abi.TokenAmount, error) `perm:"read"`
|
||||||
|
|
||||||
StateDecodeParams func(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) `perm:"read"`
|
StateCompute func(p0 context.Context, p1 abi.ChainEpoch, p2 []*types.Message, p3 types.TipSetKey) (*api.ComputeStateOutput, error) `perm:"read"`
|
||||||
|
|
||||||
StateGetActor func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) `perm:"read"`
|
StateDealProviderCollateralBounds func(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (api.DealCollateralBounds, error) `perm:"read"`
|
||||||
|
|
||||||
StateGetNetworkParams func(p0 context.Context) (*api.NetworkParams, error) `perm:"read"`
|
StateDecodeParams func(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) `perm:"read"`
|
||||||
|
|
||||||
StateGetRandomnessFromBeacon func(p0 context.Context, p1 crypto.DomainSeparationTag, p2 abi.ChainEpoch, p3 []byte, p4 types.TipSetKey) (abi.Randomness, error) `perm:"read"`
|
StateGetActor func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) `perm:"read"`
|
||||||
|
|
||||||
StateGetRandomnessFromTickets func(p0 context.Context, p1 crypto.DomainSeparationTag, p2 abi.ChainEpoch, p3 []byte, p4 types.TipSetKey) (abi.Randomness, error) `perm:"read"`
|
StateGetAllocation func(p0 context.Context, p1 address.Address, p2 verifregtypes.AllocationId, p3 types.TipSetKey) (*verifregtypes.Allocation, error) `perm:"read"`
|
||||||
|
|
||||||
StateGetReceipt func(p0 context.Context, p1 cid.Cid, p2 types.TipSetKey) (*types.MessageReceipt, error) `perm:"read"`
|
StateGetAllocationForPendingDeal func(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*verifregtypes.Allocation, error) `perm:"read"`
|
||||||
|
|
||||||
StateListActors func(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) `perm:"read"`
|
StateGetAllocations func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (map[verifregtypes.AllocationId]verifregtypes.Allocation, error) `perm:"read"`
|
||||||
|
|
||||||
StateListMessages func(p0 context.Context, p1 *api.MessageMatch, p2 types.TipSetKey, p3 abi.ChainEpoch) ([]cid.Cid, error) `perm:"read"`
|
StateGetClaim func(p0 context.Context, p1 address.Address, p2 verifregtypes.ClaimId, p3 types.TipSetKey) (*verifregtypes.Claim, error) `perm:"read"`
|
||||||
|
|
||||||
StateListMiners func(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) `perm:"read"`
|
StateGetClaims func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (map[verifregtypes.ClaimId]verifregtypes.Claim, error) `perm:"read"`
|
||||||
|
|
||||||
StateLookupID func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `perm:"read"`
|
StateGetNetworkParams func(p0 context.Context) (*api.NetworkParams, error) `perm:"read"`
|
||||||
|
|
||||||
StateMarketBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (api.MarketBalance, error) `perm:"read"`
|
StateGetRandomnessFromBeacon func(p0 context.Context, p1 crypto.DomainSeparationTag, p2 abi.ChainEpoch, p3 []byte, p4 types.TipSetKey) (abi.Randomness, error) `perm:"read"`
|
||||||
|
|
||||||
StateMarketDeals func(p0 context.Context, p1 types.TipSetKey) (map[string]*api.MarketDeal, error) `perm:"read"`
|
StateGetRandomnessFromTickets func(p0 context.Context, p1 crypto.DomainSeparationTag, p2 abi.ChainEpoch, p3 []byte, p4 types.TipSetKey) (abi.Randomness, error) `perm:"read"`
|
||||||
|
|
||||||
StateMarketParticipants func(p0 context.Context, p1 types.TipSetKey) (map[string]api.MarketBalance, error) `perm:"read"`
|
StateGetReceipt func(p0 context.Context, p1 cid.Cid, p2 types.TipSetKey) (*types.MessageReceipt, error) `perm:"read"`
|
||||||
|
|
||||||
StateMarketStorageDeal func(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*api.MarketDeal, error) `perm:"read"`
|
StateListActors func(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) `perm:"read"`
|
||||||
|
|
||||||
StateMinerActiveSectors func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) `perm:"read"`
|
StateListMessages func(p0 context.Context, p1 *api.MessageMatch, p2 types.TipSetKey, p3 abi.ChainEpoch) ([]cid.Cid, error) `perm:"read"`
|
||||||
|
|
||||||
StateMinerAvailableBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.BigInt, error) `perm:"read"`
|
StateListMiners func(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) `perm:"read"`
|
||||||
|
|
||||||
StateMinerDeadlines func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]api.Deadline, error) `perm:"read"`
|
StateLookupID func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `perm:"read"`
|
||||||
|
|
||||||
StateMinerFaults func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (bitfield.BitField, error) `perm:"read"`
|
StateMarketBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (api.MarketBalance, error) `perm:"read"`
|
||||||
|
|
||||||
StateMinerInfo func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (api.MinerInfo, error) `perm:"read"`
|
StateMarketDeals func(p0 context.Context, p1 types.TipSetKey) (map[string]*api.MarketDeal, error) `perm:"read"`
|
||||||
|
|
||||||
StateMinerInitialPledgeCollateral func(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (types.BigInt, error) `perm:"read"`
|
StateMarketParticipants func(p0 context.Context, p1 types.TipSetKey) (map[string]api.MarketBalance, error) `perm:"read"`
|
||||||
|
|
||||||
StateMinerPartitions func(p0 context.Context, p1 address.Address, p2 uint64, p3 types.TipSetKey) ([]api.Partition, error) `perm:"read"`
|
StateMarketStorageDeal func(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*api.MarketDeal, error) `perm:"read"`
|
||||||
|
|
||||||
StateMinerPower func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*api.MinerPower, error) `perm:"read"`
|
StateMinerActiveSectors func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) `perm:"read"`
|
||||||
|
|
||||||
StateMinerPreCommitDepositForPower func(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (types.BigInt, error) `perm:"read"`
|
StateMinerAvailableBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.BigInt, error) `perm:"read"`
|
||||||
|
|
||||||
StateMinerProvingDeadline func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*dline.Info, error) `perm:"read"`
|
StateMinerDeadlines func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]api.Deadline, error) `perm:"read"`
|
||||||
|
|
||||||
StateMinerRecoveries func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (bitfield.BitField, error) `perm:"read"`
|
StateMinerFaults func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (bitfield.BitField, error) `perm:"read"`
|
||||||
|
|
||||||
StateMinerSectorAllocated func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (bool, error) `perm:"read"`
|
StateMinerInfo func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (api.MinerInfo, error) `perm:"read"`
|
||||||
|
|
||||||
StateMinerSectorCount func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (api.MinerSectors, error) `perm:"read"`
|
StateMinerInitialPledgeCollateral func(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (types.BigInt, error) `perm:"read"`
|
||||||
|
|
||||||
StateMinerSectors func(p0 context.Context, p1 address.Address, p2 *bitfield.BitField, p3 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) `perm:"read"`
|
StateMinerPartitions func(p0 context.Context, p1 address.Address, p2 uint64, p3 types.TipSetKey) ([]api.Partition, error) `perm:"read"`
|
||||||
|
|
||||||
StateNetworkName func(p0 context.Context) (dtypes.NetworkName, error) `perm:"read"`
|
StateMinerPower func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*api.MinerPower, error) `perm:"read"`
|
||||||
|
|
||||||
StateNetworkVersion func(p0 context.Context, p1 types.TipSetKey) (apitypes.NetworkVersion, error) `perm:"read"`
|
StateMinerPreCommitDepositForPower func(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (types.BigInt, error) `perm:"read"`
|
||||||
|
|
||||||
StateReadState func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*api.ActorState, error) `perm:"read"`
|
StateMinerProvingDeadline func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*dline.Info, error) `perm:"read"`
|
||||||
|
|
||||||
StateReplay func(p0 context.Context, p1 types.TipSetKey, p2 cid.Cid) (*api.InvocResult, error) `perm:"read"`
|
StateMinerRecoveries func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (bitfield.BitField, error) `perm:"read"`
|
||||||
|
|
||||||
StateSearchMsg func(p0 context.Context, p1 cid.Cid) (*api.MsgLookup, error) `perm:"read"`
|
StateMinerSectorAllocated func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (bool, error) `perm:"read"`
|
||||||
|
|
||||||
StateSearchMsgLimited func(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch) (*api.MsgLookup, error) `perm:"read"`
|
StateMinerSectorCount func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (api.MinerSectors, error) `perm:"read"`
|
||||||
|
|
||||||
StateSectorExpiration func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*lminer.SectorExpiration, error) `perm:"read"`
|
StateMinerSectors func(p0 context.Context, p1 address.Address, p2 *bitfield.BitField, p3 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) `perm:"read"`
|
||||||
|
|
||||||
StateSectorGetInfo func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorOnChainInfo, error) `perm:"read"`
|
StateNetworkName func(p0 context.Context) (dtypes.NetworkName, error) `perm:"read"`
|
||||||
|
|
||||||
StateSectorPartition func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*lminer.SectorLocation, error) `perm:"read"`
|
StateNetworkVersion func(p0 context.Context, p1 types.TipSetKey) (apitypes.NetworkVersion, error) `perm:"read"`
|
||||||
|
|
||||||
StateSectorPreCommitInfo func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) `perm:"read"`
|
StateReadState func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*api.ActorState, error) `perm:"read"`
|
||||||
|
|
||||||
StateVMCirculatingSupplyInternal func(p0 context.Context, p1 types.TipSetKey) (api.CirculatingSupply, error) `perm:"read"`
|
StateReplay func(p0 context.Context, p1 types.TipSetKey, p2 cid.Cid) (*api.InvocResult, error) `perm:"read"`
|
||||||
|
|
||||||
StateVerifiedClientStatus func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) `perm:"read"`
|
StateSearchMsg func(p0 context.Context, p1 cid.Cid) (*api.MsgLookup, error) `perm:"read"`
|
||||||
|
|
||||||
StateVerifiedRegistryRootKey func(p0 context.Context, p1 types.TipSetKey) (address.Address, error) `perm:"read"`
|
StateSearchMsgLimited func(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch) (*api.MsgLookup, error) `perm:"read"`
|
||||||
|
|
||||||
StateVerifierStatus func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) `perm:"read"`
|
StateSectorExpiration func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*lminer.SectorExpiration, error) `perm:"read"`
|
||||||
|
|
||||||
StateWaitMsg func(p0 context.Context, p1 cid.Cid, p2 uint64) (*api.MsgLookup, error) `perm:"read"`
|
StateSectorGetInfo func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorOnChainInfo, error) `perm:"read"`
|
||||||
|
|
||||||
StateWaitMsgLimited func(p0 context.Context, p1 cid.Cid, p2 uint64, p3 abi.ChainEpoch) (*api.MsgLookup, error) `perm:"read"`
|
StateSectorPartition func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*lminer.SectorLocation, error) `perm:"read"`
|
||||||
|
|
||||||
SyncCheckBad func(p0 context.Context, p1 cid.Cid) (string, error) `perm:"read"`
|
StateSectorPreCommitInfo func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) `perm:"read"`
|
||||||
|
|
||||||
SyncCheckpoint func(p0 context.Context, p1 types.TipSetKey) error `perm:"admin"`
|
StateVMCirculatingSupplyInternal func(p0 context.Context, p1 types.TipSetKey) (api.CirculatingSupply, error) `perm:"read"`
|
||||||
|
|
||||||
SyncIncomingBlocks func(p0 context.Context) (<-chan *types.BlockHeader, error) `perm:"read"`
|
StateVerifiedClientStatus func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) `perm:"read"`
|
||||||
|
|
||||||
SyncMarkBad func(p0 context.Context, p1 cid.Cid) error `perm:"admin"`
|
StateVerifiedRegistryRootKey func(p0 context.Context, p1 types.TipSetKey) (address.Address, error) `perm:"read"`
|
||||||
|
|
||||||
SyncState func(p0 context.Context) (*api.SyncState, error) `perm:"read"`
|
StateVerifierStatus func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) `perm:"read"`
|
||||||
|
|
||||||
SyncSubmitBlock func(p0 context.Context, p1 *types.BlockMsg) error `perm:"write"`
|
StateWaitMsg func(p0 context.Context, p1 cid.Cid, p2 uint64) (*api.MsgLookup, error) `perm:"read"`
|
||||||
|
|
||||||
SyncUnmarkAllBad func(p0 context.Context) error `perm:"admin"`
|
StateWaitMsgLimited func(p0 context.Context, p1 cid.Cid, p2 uint64, p3 abi.ChainEpoch) (*api.MsgLookup, error) `perm:"read"`
|
||||||
|
|
||||||
SyncUnmarkBad func(p0 context.Context, p1 cid.Cid) error `perm:"admin"`
|
SyncCheckBad func(p0 context.Context, p1 cid.Cid) (string, error) `perm:"read"`
|
||||||
|
|
||||||
SyncValidateTipset func(p0 context.Context, p1 types.TipSetKey) (bool, error) `perm:"read"`
|
SyncCheckpoint func(p0 context.Context, p1 types.TipSetKey) error `perm:"admin"`
|
||||||
|
|
||||||
WalletBalance func(p0 context.Context, p1 address.Address) (types.BigInt, error) `perm:"read"`
|
SyncIncomingBlocks func(p0 context.Context) (<-chan *types.BlockHeader, error) `perm:"read"`
|
||||||
|
|
||||||
WalletDefaultAddress func(p0 context.Context) (address.Address, error) `perm:"write"`
|
SyncMarkBad func(p0 context.Context, p1 cid.Cid) error `perm:"admin"`
|
||||||
|
|
||||||
WalletDelete func(p0 context.Context, p1 address.Address) error `perm:"admin"`
|
SyncState func(p0 context.Context) (*api.SyncState, error) `perm:"read"`
|
||||||
|
|
||||||
WalletExport func(p0 context.Context, p1 address.Address) (*types.KeyInfo, error) `perm:"admin"`
|
SyncSubmitBlock func(p0 context.Context, p1 *types.BlockMsg) error `perm:"write"`
|
||||||
|
|
||||||
WalletHas func(p0 context.Context, p1 address.Address) (bool, error) `perm:"write"`
|
SyncUnmarkAllBad func(p0 context.Context) error `perm:"admin"`
|
||||||
|
|
||||||
WalletImport func(p0 context.Context, p1 *types.KeyInfo) (address.Address, error) `perm:"admin"`
|
SyncUnmarkBad func(p0 context.Context, p1 cid.Cid) error `perm:"admin"`
|
||||||
|
|
||||||
WalletList func(p0 context.Context) ([]address.Address, error) `perm:"write"`
|
SyncValidateTipset func(p0 context.Context, p1 types.TipSetKey) (bool, error) `perm:"read"`
|
||||||
|
|
||||||
WalletNew func(p0 context.Context, p1 types.KeyType) (address.Address, error) `perm:"write"`
|
WalletBalance func(p0 context.Context, p1 address.Address) (types.BigInt, error) `perm:"read"`
|
||||||
|
|
||||||
WalletSetDefault func(p0 context.Context, p1 address.Address) error `perm:"write"`
|
WalletDefaultAddress func(p0 context.Context) (address.Address, error) `perm:"write"`
|
||||||
|
|
||||||
WalletSign func(p0 context.Context, p1 address.Address, p2 []byte) (*crypto.Signature, error) `perm:"sign"`
|
WalletDelete func(p0 context.Context, p1 address.Address) error `perm:"admin"`
|
||||||
|
|
||||||
WalletSignMessage func(p0 context.Context, p1 address.Address, p2 *types.Message) (*types.SignedMessage, error) `perm:"sign"`
|
WalletExport func(p0 context.Context, p1 address.Address) (*types.KeyInfo, error) `perm:"admin"`
|
||||||
|
|
||||||
WalletValidateAddress func(p0 context.Context, p1 string) (address.Address, error) `perm:"read"`
|
WalletHas func(p0 context.Context, p1 address.Address) (bool, error) `perm:"write"`
|
||||||
|
|
||||||
WalletVerify func(p0 context.Context, p1 address.Address, p2 []byte, p3 *crypto.Signature) (bool, error) `perm:"read"`
|
WalletImport func(p0 context.Context, p1 *types.KeyInfo) (address.Address, error) `perm:"admin"`
|
||||||
}
|
|
||||||
|
WalletList func(p0 context.Context) ([]address.Address, error) `perm:"write"`
|
||||||
|
|
||||||
|
WalletNew func(p0 context.Context, p1 types.KeyType) (address.Address, error) `perm:"write"`
|
||||||
|
|
||||||
|
WalletSetDefault func(p0 context.Context, p1 address.Address) error `perm:"write"`
|
||||||
|
|
||||||
|
WalletSign func(p0 context.Context, p1 address.Address, p2 []byte) (*crypto.Signature, error) `perm:"sign"`
|
||||||
|
|
||||||
|
WalletSignMessage func(p0 context.Context, p1 address.Address, p2 *types.Message) (*types.SignedMessage, error) `perm:"sign"`
|
||||||
|
|
||||||
|
WalletValidateAddress func(p0 context.Context, p1 string) (address.Address, error) `perm:"read"`
|
||||||
|
|
||||||
|
WalletVerify func(p0 context.Context, p1 address.Address, p2 []byte, p3 *crypto.Signature) (bool, error) `perm:"read"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type FullNodeStub struct {
|
type FullNodeStub struct {
|
||||||
@@ -412,71 +427,81 @@ type FullNodeStub struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type GatewayStruct struct {
|
type GatewayStruct struct {
|
||||||
Internal struct {
|
Internal GatewayMethods
|
||||||
ChainGetBlockMessages func(p0 context.Context, p1 cid.Cid) (*api.BlockMessages, error) ``
|
}
|
||||||
|
|
||||||
ChainGetMessage func(p0 context.Context, p1 cid.Cid) (*types.Message, error) ``
|
type GatewayMethods struct {
|
||||||
|
ChainGetBlockMessages func(p0 context.Context, p1 cid.Cid) (*api.BlockMessages, error) ``
|
||||||
|
|
||||||
ChainGetTipSet func(p0 context.Context, p1 types.TipSetKey) (*types.TipSet, error) ``
|
ChainGetMessage func(p0 context.Context, p1 cid.Cid) (*types.Message, error) ``
|
||||||
|
|
||||||
ChainGetTipSetByHeight func(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) ``
|
ChainGetTipSet func(p0 context.Context, p1 types.TipSetKey) (*types.TipSet, error) ``
|
||||||
|
|
||||||
ChainHasObj func(p0 context.Context, p1 cid.Cid) (bool, error) ``
|
ChainGetTipSetByHeight func(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) ``
|
||||||
|
|
||||||
ChainHead func(p0 context.Context) (*types.TipSet, error) ``
|
ChainHasObj func(p0 context.Context, p1 cid.Cid) (bool, error) ``
|
||||||
|
|
||||||
ChainNotify func(p0 context.Context) (<-chan []*api.HeadChange, error) ``
|
ChainHead func(p0 context.Context) (*types.TipSet, error) ``
|
||||||
|
|
||||||
ChainPutObj func(p0 context.Context, p1 blocks.Block) error ``
|
ChainNotify func(p0 context.Context) (<-chan []*api.HeadChange, error) ``
|
||||||
|
|
||||||
ChainReadObj func(p0 context.Context, p1 cid.Cid) ([]byte, error) ``
|
ChainPutObj func(p0 context.Context, p1 blocks.Block) error ``
|
||||||
|
|
||||||
GasEstimateMessageGas func(p0 context.Context, p1 *types.Message, p2 *api.MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) ``
|
ChainReadObj func(p0 context.Context, p1 cid.Cid) ([]byte, error) ``
|
||||||
|
|
||||||
MpoolPush func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) ``
|
GasEstimateMessageGas func(p0 context.Context, p1 *types.Message, p2 *api.MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) ``
|
||||||
|
|
||||||
MsigGetAvailableBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.BigInt, error) ``
|
MpoolGetNonce func(p0 context.Context, p1 address.Address) (uint64, error) ``
|
||||||
|
|
||||||
MsigGetPending func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]*api.MsigTransaction, error) ``
|
MpoolPush func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) ``
|
||||||
|
|
||||||
MsigGetVested func(p0 context.Context, p1 address.Address, p2 types.TipSetKey, p3 types.TipSetKey) (types.BigInt, error) ``
|
MsigGetAvailableBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.BigInt, error) ``
|
||||||
|
|
||||||
StateAccountKey func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) ``
|
MsigGetPending func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]*api.MsigTransaction, error) ``
|
||||||
|
|
||||||
StateDealProviderCollateralBounds func(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (api.DealCollateralBounds, error) ``
|
MsigGetVested func(p0 context.Context, p1 address.Address, p2 types.TipSetKey, p3 types.TipSetKey) (types.BigInt, error) ``
|
||||||
|
|
||||||
StateGetActor func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) ``
|
StateAccountKey func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) ``
|
||||||
|
|
||||||
StateGetReceipt func(p0 context.Context, p1 cid.Cid, p2 types.TipSetKey) (*types.MessageReceipt, error) ``
|
StateCall func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*api.InvocResult, error) ``
|
||||||
|
|
||||||
StateListMiners func(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) ``
|
StateDealProviderCollateralBounds func(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (api.DealCollateralBounds, error) ``
|
||||||
|
|
||||||
StateLookupID func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) ``
|
StateDecodeParams func(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) ``
|
||||||
|
|
||||||
StateMarketBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (api.MarketBalance, error) ``
|
StateGetActor func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) ``
|
||||||
|
|
||||||
StateMarketStorageDeal func(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*api.MarketDeal, error) ``
|
StateGetReceipt func(p0 context.Context, p1 cid.Cid, p2 types.TipSetKey) (*types.MessageReceipt, error) ``
|
||||||
|
|
||||||
StateMinerInfo func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (api.MinerInfo, error) ``
|
StateListMiners func(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) ``
|
||||||
|
|
||||||
StateMinerPower func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*api.MinerPower, error) ``
|
StateLookupID func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) ``
|
||||||
|
|
||||||
StateMinerProvingDeadline func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*dline.Info, error) ``
|
StateMarketBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (api.MarketBalance, error) ``
|
||||||
|
|
||||||
StateNetworkVersion func(p0 context.Context, p1 types.TipSetKey) (abinetwork.Version, error) ``
|
StateMarketStorageDeal func(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*api.MarketDeal, error) ``
|
||||||
|
|
||||||
StateSearchMsg func(p0 context.Context, p1 cid.Cid) (*api.MsgLookup, error) ``
|
StateMinerInfo func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (api.MinerInfo, error) ``
|
||||||
|
|
||||||
StateSectorGetInfo func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorOnChainInfo, error) ``
|
StateMinerPower func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*api.MinerPower, error) ``
|
||||||
|
|
||||||
StateVerifiedClientStatus func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) ``
|
StateMinerProvingDeadline func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*dline.Info, error) ``
|
||||||
|
|
||||||
StateWaitMsg func(p0 context.Context, p1 cid.Cid, p2 uint64) (*api.MsgLookup, error) ``
|
StateNetworkName func(p0 context.Context) (dtypes.NetworkName, error) ``
|
||||||
|
|
||||||
Version func(p0 context.Context) (api.APIVersion, error) ``
|
StateNetworkVersion func(p0 context.Context, p1 types.TipSetKey) (abinetwork.Version, error) ``
|
||||||
|
|
||||||
WalletBalance func(p0 context.Context, p1 address.Address) (types.BigInt, error) ``
|
StateSearchMsg func(p0 context.Context, p1 cid.Cid) (*api.MsgLookup, error) ``
|
||||||
}
|
|
||||||
|
StateSectorGetInfo func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorOnChainInfo, error) ``
|
||||||
|
|
||||||
|
StateVerifiedClientStatus func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) ``
|
||||||
|
|
||||||
|
StateWaitMsg func(p0 context.Context, p1 cid.Cid, p2 uint64) (*api.MsgLookup, error) ``
|
||||||
|
|
||||||
|
Version func(p0 context.Context) (api.APIVersion, error) ``
|
||||||
|
|
||||||
|
WalletBalance func(p0 context.Context, p1 address.Address) (types.BigInt, error) ``
|
||||||
}
|
}
|
||||||
|
|
||||||
type GatewayStub struct {
|
type GatewayStub struct {
|
||||||
@@ -1692,6 +1717,17 @@ func (s *FullNodeStub) StateActorCodeCIDs(p0 context.Context, p1 abinetwork.Vers
|
|||||||
return *new(map[string]cid.Cid), ErrNotSupported
|
return *new(map[string]cid.Cid), ErrNotSupported
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *FullNodeStruct) StateActorManifestCID(p0 context.Context, p1 abinetwork.Version) (cid.Cid, error) {
|
||||||
|
if s.Internal.StateActorManifestCID == nil {
|
||||||
|
return *new(cid.Cid), ErrNotSupported
|
||||||
|
}
|
||||||
|
return s.Internal.StateActorManifestCID(p0, p1)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *FullNodeStub) StateActorManifestCID(p0 context.Context, p1 abinetwork.Version) (cid.Cid, error) {
|
||||||
|
return *new(cid.Cid), ErrNotSupported
|
||||||
|
}
|
||||||
|
|
||||||
func (s *FullNodeStruct) StateAllMinerFaults(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) ([]*api.Fault, error) {
|
func (s *FullNodeStruct) StateAllMinerFaults(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) ([]*api.Fault, error) {
|
||||||
if s.Internal.StateAllMinerFaults == nil {
|
if s.Internal.StateAllMinerFaults == nil {
|
||||||
return *new([]*api.Fault), ErrNotSupported
|
return *new([]*api.Fault), ErrNotSupported
|
||||||
@@ -1780,6 +1816,61 @@ func (s *FullNodeStub) StateGetActor(p0 context.Context, p1 address.Address, p2
|
|||||||
return nil, ErrNotSupported
|
return nil, ErrNotSupported
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *FullNodeStruct) StateGetAllocation(p0 context.Context, p1 address.Address, p2 verifregtypes.AllocationId, p3 types.TipSetKey) (*verifregtypes.Allocation, error) {
|
||||||
|
if s.Internal.StateGetAllocation == nil {
|
||||||
|
return nil, ErrNotSupported
|
||||||
|
}
|
||||||
|
return s.Internal.StateGetAllocation(p0, p1, p2, p3)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *FullNodeStub) StateGetAllocation(p0 context.Context, p1 address.Address, p2 verifregtypes.AllocationId, p3 types.TipSetKey) (*verifregtypes.Allocation, error) {
|
||||||
|
return nil, ErrNotSupported
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *FullNodeStruct) StateGetAllocationForPendingDeal(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*verifregtypes.Allocation, error) {
|
||||||
|
if s.Internal.StateGetAllocationForPendingDeal == nil {
|
||||||
|
return nil, ErrNotSupported
|
||||||
|
}
|
||||||
|
return s.Internal.StateGetAllocationForPendingDeal(p0, p1, p2)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *FullNodeStub) StateGetAllocationForPendingDeal(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*verifregtypes.Allocation, error) {
|
||||||
|
return nil, ErrNotSupported
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *FullNodeStruct) StateGetAllocations(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (map[verifregtypes.AllocationId]verifregtypes.Allocation, error) {
|
||||||
|
if s.Internal.StateGetAllocations == nil {
|
||||||
|
return *new(map[verifregtypes.AllocationId]verifregtypes.Allocation), ErrNotSupported
|
||||||
|
}
|
||||||
|
return s.Internal.StateGetAllocations(p0, p1, p2)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *FullNodeStub) StateGetAllocations(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (map[verifregtypes.AllocationId]verifregtypes.Allocation, error) {
|
||||||
|
return *new(map[verifregtypes.AllocationId]verifregtypes.Allocation), ErrNotSupported
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *FullNodeStruct) StateGetClaim(p0 context.Context, p1 address.Address, p2 verifregtypes.ClaimId, p3 types.TipSetKey) (*verifregtypes.Claim, error) {
|
||||||
|
if s.Internal.StateGetClaim == nil {
|
||||||
|
return nil, ErrNotSupported
|
||||||
|
}
|
||||||
|
return s.Internal.StateGetClaim(p0, p1, p2, p3)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *FullNodeStub) StateGetClaim(p0 context.Context, p1 address.Address, p2 verifregtypes.ClaimId, p3 types.TipSetKey) (*verifregtypes.Claim, error) {
|
||||||
|
return nil, ErrNotSupported
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *FullNodeStruct) StateGetClaims(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (map[verifregtypes.ClaimId]verifregtypes.Claim, error) {
|
||||||
|
if s.Internal.StateGetClaims == nil {
|
||||||
|
return *new(map[verifregtypes.ClaimId]verifregtypes.Claim), ErrNotSupported
|
||||||
|
}
|
||||||
|
return s.Internal.StateGetClaims(p0, p1, p2)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *FullNodeStub) StateGetClaims(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (map[verifregtypes.ClaimId]verifregtypes.Claim, error) {
|
||||||
|
return *new(map[verifregtypes.ClaimId]verifregtypes.Claim), ErrNotSupported
|
||||||
|
}
|
||||||
|
|
||||||
func (s *FullNodeStruct) StateGetNetworkParams(p0 context.Context) (*api.NetworkParams, error) {
|
func (s *FullNodeStruct) StateGetNetworkParams(p0 context.Context) (*api.NetworkParams, error) {
|
||||||
if s.Internal.StateGetNetworkParams == nil {
|
if s.Internal.StateGetNetworkParams == nil {
|
||||||
return nil, ErrNotSupported
|
return nil, ErrNotSupported
|
||||||
@@ -2594,6 +2685,17 @@ func (s *GatewayStub) GasEstimateMessageGas(p0 context.Context, p1 *types.Messag
|
|||||||
return nil, ErrNotSupported
|
return nil, ErrNotSupported
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *GatewayStruct) MpoolGetNonce(p0 context.Context, p1 address.Address) (uint64, error) {
|
||||||
|
if s.Internal.MpoolGetNonce == nil {
|
||||||
|
return 0, ErrNotSupported
|
||||||
|
}
|
||||||
|
return s.Internal.MpoolGetNonce(p0, p1)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *GatewayStub) MpoolGetNonce(p0 context.Context, p1 address.Address) (uint64, error) {
|
||||||
|
return 0, ErrNotSupported
|
||||||
|
}
|
||||||
|
|
||||||
func (s *GatewayStruct) MpoolPush(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) {
|
func (s *GatewayStruct) MpoolPush(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) {
|
||||||
if s.Internal.MpoolPush == nil {
|
if s.Internal.MpoolPush == nil {
|
||||||
return *new(cid.Cid), ErrNotSupported
|
return *new(cid.Cid), ErrNotSupported
|
||||||
@@ -2649,6 +2751,17 @@ func (s *GatewayStub) StateAccountKey(p0 context.Context, p1 address.Address, p2
|
|||||||
return *new(address.Address), ErrNotSupported
|
return *new(address.Address), ErrNotSupported
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *GatewayStruct) StateCall(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*api.InvocResult, error) {
|
||||||
|
if s.Internal.StateCall == nil {
|
||||||
|
return nil, ErrNotSupported
|
||||||
|
}
|
||||||
|
return s.Internal.StateCall(p0, p1, p2)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *GatewayStub) StateCall(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*api.InvocResult, error) {
|
||||||
|
return nil, ErrNotSupported
|
||||||
|
}
|
||||||
|
|
||||||
func (s *GatewayStruct) StateDealProviderCollateralBounds(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (api.DealCollateralBounds, error) {
|
func (s *GatewayStruct) StateDealProviderCollateralBounds(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (api.DealCollateralBounds, error) {
|
||||||
if s.Internal.StateDealProviderCollateralBounds == nil {
|
if s.Internal.StateDealProviderCollateralBounds == nil {
|
||||||
return *new(api.DealCollateralBounds), ErrNotSupported
|
return *new(api.DealCollateralBounds), ErrNotSupported
|
||||||
@@ -2660,6 +2773,17 @@ func (s *GatewayStub) StateDealProviderCollateralBounds(p0 context.Context, p1 a
|
|||||||
return *new(api.DealCollateralBounds), ErrNotSupported
|
return *new(api.DealCollateralBounds), ErrNotSupported
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *GatewayStruct) StateDecodeParams(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) {
|
||||||
|
if s.Internal.StateDecodeParams == nil {
|
||||||
|
return nil, ErrNotSupported
|
||||||
|
}
|
||||||
|
return s.Internal.StateDecodeParams(p0, p1, p2, p3, p4)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *GatewayStub) StateDecodeParams(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) {
|
||||||
|
return nil, ErrNotSupported
|
||||||
|
}
|
||||||
|
|
||||||
func (s *GatewayStruct) StateGetActor(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) {
|
func (s *GatewayStruct) StateGetActor(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) {
|
||||||
if s.Internal.StateGetActor == nil {
|
if s.Internal.StateGetActor == nil {
|
||||||
return nil, ErrNotSupported
|
return nil, ErrNotSupported
|
||||||
@@ -2759,6 +2883,17 @@ func (s *GatewayStub) StateMinerProvingDeadline(p0 context.Context, p1 address.A
|
|||||||
return nil, ErrNotSupported
|
return nil, ErrNotSupported
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *GatewayStruct) StateNetworkName(p0 context.Context) (dtypes.NetworkName, error) {
|
||||||
|
if s.Internal.StateNetworkName == nil {
|
||||||
|
return *new(dtypes.NetworkName), ErrNotSupported
|
||||||
|
}
|
||||||
|
return s.Internal.StateNetworkName(p0)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *GatewayStub) StateNetworkName(p0 context.Context) (dtypes.NetworkName, error) {
|
||||||
|
return *new(dtypes.NetworkName), ErrNotSupported
|
||||||
|
}
|
||||||
|
|
||||||
func (s *GatewayStruct) StateNetworkVersion(p0 context.Context, p1 types.TipSetKey) (abinetwork.Version, error) {
|
func (s *GatewayStruct) StateNetworkVersion(p0 context.Context, p1 types.TipSetKey) (abinetwork.Version, error) {
|
||||||
if s.Internal.StateNetworkVersion == nil {
|
if s.Internal.StateNetworkVersion == nil {
|
||||||
return *new(abinetwork.Version), ErrNotSupported
|
return *new(abinetwork.Version), ErrNotSupported
|
||||||
|
|||||||
+117
-11
@@ -11,23 +11,24 @@ import (
|
|||||||
|
|
||||||
gomock "github.com/golang/mock/gomock"
|
gomock "github.com/golang/mock/gomock"
|
||||||
uuid "github.com/google/uuid"
|
uuid "github.com/google/uuid"
|
||||||
blocks "github.com/ipfs/go-block-format"
|
|
||||||
cid "github.com/ipfs/go-cid"
|
cid "github.com/ipfs/go-cid"
|
||||||
metrics "github.com/libp2p/go-libp2p-core/metrics"
|
blocks "github.com/ipfs/go-libipfs/blocks"
|
||||||
network0 "github.com/libp2p/go-libp2p-core/network"
|
metrics "github.com/libp2p/go-libp2p/core/metrics"
|
||||||
peer "github.com/libp2p/go-libp2p-core/peer"
|
network0 "github.com/libp2p/go-libp2p/core/network"
|
||||||
protocol "github.com/libp2p/go-libp2p-core/protocol"
|
peer "github.com/libp2p/go-libp2p/core/peer"
|
||||||
|
protocol "github.com/libp2p/go-libp2p/core/protocol"
|
||||||
|
|
||||||
address "github.com/filecoin-project/go-address"
|
address "github.com/filecoin-project/go-address"
|
||||||
bitfield "github.com/filecoin-project/go-bitfield"
|
bitfield "github.com/filecoin-project/go-bitfield"
|
||||||
datatransfer "github.com/filecoin-project/go-data-transfer"
|
datatransfer "github.com/filecoin-project/go-data-transfer/v2"
|
||||||
retrievalmarket "github.com/filecoin-project/go-fil-markets/retrievalmarket"
|
retrievalmarket "github.com/filecoin-project/go-fil-markets/retrievalmarket"
|
||||||
storagemarket "github.com/filecoin-project/go-fil-markets/storagemarket"
|
storagemarket "github.com/filecoin-project/go-fil-markets/storagemarket"
|
||||||
auth "github.com/filecoin-project/go-jsonrpc/auth"
|
auth "github.com/filecoin-project/go-jsonrpc/auth"
|
||||||
abi "github.com/filecoin-project/go-state-types/abi"
|
abi "github.com/filecoin-project/go-state-types/abi"
|
||||||
big "github.com/filecoin-project/go-state-types/big"
|
big "github.com/filecoin-project/go-state-types/big"
|
||||||
miner "github.com/filecoin-project/go-state-types/builtin/v8/miner"
|
|
||||||
paych "github.com/filecoin-project/go-state-types/builtin/v8/paych"
|
paych "github.com/filecoin-project/go-state-types/builtin/v8/paych"
|
||||||
|
miner "github.com/filecoin-project/go-state-types/builtin/v9/miner"
|
||||||
|
verifreg "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
|
||||||
crypto "github.com/filecoin-project/go-state-types/crypto"
|
crypto "github.com/filecoin-project/go-state-types/crypto"
|
||||||
dline "github.com/filecoin-project/go-state-types/dline"
|
dline "github.com/filecoin-project/go-state-types/dline"
|
||||||
network "github.com/filecoin-project/go-state-types/network"
|
network "github.com/filecoin-project/go-state-types/network"
|
||||||
@@ -2157,6 +2158,21 @@ func (mr *MockFullNodeMockRecorder) Shutdown(arg0 interface{}) *gomock.Call {
|
|||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Shutdown", reflect.TypeOf((*MockFullNode)(nil).Shutdown), arg0)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Shutdown", reflect.TypeOf((*MockFullNode)(nil).Shutdown), arg0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// StartTime mocks base method.
|
||||||
|
func (m *MockFullNode) StartTime(arg0 context.Context) (time.Time, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "StartTime", arg0)
|
||||||
|
ret0, _ := ret[0].(time.Time)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// StartTime indicates an expected call of StartTime.
|
||||||
|
func (mr *MockFullNodeMockRecorder) StartTime(arg0 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StartTime", reflect.TypeOf((*MockFullNode)(nil).StartTime), arg0)
|
||||||
|
}
|
||||||
|
|
||||||
// StateAccountKey mocks base method.
|
// StateAccountKey mocks base method.
|
||||||
func (m *MockFullNode) StateAccountKey(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (address.Address, error) {
|
func (m *MockFullNode) StateAccountKey(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (address.Address, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
@@ -2187,6 +2203,21 @@ func (mr *MockFullNodeMockRecorder) StateActorCodeCIDs(arg0, arg1 interface{}) *
|
|||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateActorCodeCIDs", reflect.TypeOf((*MockFullNode)(nil).StateActorCodeCIDs), arg0, arg1)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateActorCodeCIDs", reflect.TypeOf((*MockFullNode)(nil).StateActorCodeCIDs), arg0, arg1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// StateActorManifestCID mocks base method.
|
||||||
|
func (m *MockFullNode) StateActorManifestCID(arg0 context.Context, arg1 network.Version) (cid.Cid, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "StateActorManifestCID", arg0, arg1)
|
||||||
|
ret0, _ := ret[0].(cid.Cid)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// StateActorManifestCID indicates an expected call of StateActorManifestCID.
|
||||||
|
func (mr *MockFullNodeMockRecorder) StateActorManifestCID(arg0, arg1 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateActorManifestCID", reflect.TypeOf((*MockFullNode)(nil).StateActorManifestCID), arg0, arg1)
|
||||||
|
}
|
||||||
|
|
||||||
// StateAllMinerFaults mocks base method.
|
// StateAllMinerFaults mocks base method.
|
||||||
func (m *MockFullNode) StateAllMinerFaults(arg0 context.Context, arg1 abi.ChainEpoch, arg2 types.TipSetKey) ([]*api.Fault, error) {
|
func (m *MockFullNode) StateAllMinerFaults(arg0 context.Context, arg1 abi.ChainEpoch, arg2 types.TipSetKey) ([]*api.Fault, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
@@ -2218,10 +2249,10 @@ func (mr *MockFullNodeMockRecorder) StateCall(arg0, arg1, arg2 interface{}) *gom
|
|||||||
}
|
}
|
||||||
|
|
||||||
// StateChangedActors mocks base method.
|
// StateChangedActors mocks base method.
|
||||||
func (m *MockFullNode) StateChangedActors(arg0 context.Context, arg1, arg2 cid.Cid) (map[string]types.Actor, error) {
|
func (m *MockFullNode) StateChangedActors(arg0 context.Context, arg1, arg2 cid.Cid) (map[string]types.ActorV5, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
ret := m.ctrl.Call(m, "StateChangedActors", arg0, arg1, arg2)
|
ret := m.ctrl.Call(m, "StateChangedActors", arg0, arg1, arg2)
|
||||||
ret0, _ := ret[0].(map[string]types.Actor)
|
ret0, _ := ret[0].(map[string]types.ActorV5)
|
||||||
ret1, _ := ret[1].(error)
|
ret1, _ := ret[1].(error)
|
||||||
return ret0, ret1
|
return ret0, ret1
|
||||||
}
|
}
|
||||||
@@ -2293,10 +2324,10 @@ func (mr *MockFullNodeMockRecorder) StateDecodeParams(arg0, arg1, arg2, arg3, ar
|
|||||||
}
|
}
|
||||||
|
|
||||||
// StateGetActor mocks base method.
|
// StateGetActor mocks base method.
|
||||||
func (m *MockFullNode) StateGetActor(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (*types.Actor, error) {
|
func (m *MockFullNode) StateGetActor(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (*types.ActorV5, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
ret := m.ctrl.Call(m, "StateGetActor", arg0, arg1, arg2)
|
ret := m.ctrl.Call(m, "StateGetActor", arg0, arg1, arg2)
|
||||||
ret0, _ := ret[0].(*types.Actor)
|
ret0, _ := ret[0].(*types.ActorV5)
|
||||||
ret1, _ := ret[1].(error)
|
ret1, _ := ret[1].(error)
|
||||||
return ret0, ret1
|
return ret0, ret1
|
||||||
}
|
}
|
||||||
@@ -2307,6 +2338,81 @@ func (mr *MockFullNodeMockRecorder) StateGetActor(arg0, arg1, arg2 interface{})
|
|||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateGetActor", reflect.TypeOf((*MockFullNode)(nil).StateGetActor), arg0, arg1, arg2)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateGetActor", reflect.TypeOf((*MockFullNode)(nil).StateGetActor), arg0, arg1, arg2)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// StateGetAllocation mocks base method.
|
||||||
|
func (m *MockFullNode) StateGetAllocation(arg0 context.Context, arg1 address.Address, arg2 verifreg.AllocationId, arg3 types.TipSetKey) (*verifreg.Allocation, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "StateGetAllocation", arg0, arg1, arg2, arg3)
|
||||||
|
ret0, _ := ret[0].(*verifreg.Allocation)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// StateGetAllocation indicates an expected call of StateGetAllocation.
|
||||||
|
func (mr *MockFullNodeMockRecorder) StateGetAllocation(arg0, arg1, arg2, arg3 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateGetAllocation", reflect.TypeOf((*MockFullNode)(nil).StateGetAllocation), arg0, arg1, arg2, arg3)
|
||||||
|
}
|
||||||
|
|
||||||
|
// StateGetAllocationForPendingDeal mocks base method.
|
||||||
|
func (m *MockFullNode) StateGetAllocationForPendingDeal(arg0 context.Context, arg1 abi.DealID, arg2 types.TipSetKey) (*verifreg.Allocation, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "StateGetAllocationForPendingDeal", arg0, arg1, arg2)
|
||||||
|
ret0, _ := ret[0].(*verifreg.Allocation)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// StateGetAllocationForPendingDeal indicates an expected call of StateGetAllocationForPendingDeal.
|
||||||
|
func (mr *MockFullNodeMockRecorder) StateGetAllocationForPendingDeal(arg0, arg1, arg2 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateGetAllocationForPendingDeal", reflect.TypeOf((*MockFullNode)(nil).StateGetAllocationForPendingDeal), arg0, arg1, arg2)
|
||||||
|
}
|
||||||
|
|
||||||
|
// StateGetAllocations mocks base method.
|
||||||
|
func (m *MockFullNode) StateGetAllocations(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (map[verifreg.AllocationId]verifreg.Allocation, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "StateGetAllocations", arg0, arg1, arg2)
|
||||||
|
ret0, _ := ret[0].(map[verifreg.AllocationId]verifreg.Allocation)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// StateGetAllocations indicates an expected call of StateGetAllocations.
|
||||||
|
func (mr *MockFullNodeMockRecorder) StateGetAllocations(arg0, arg1, arg2 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateGetAllocations", reflect.TypeOf((*MockFullNode)(nil).StateGetAllocations), arg0, arg1, arg2)
|
||||||
|
}
|
||||||
|
|
||||||
|
// StateGetClaim mocks base method.
|
||||||
|
func (m *MockFullNode) StateGetClaim(arg0 context.Context, arg1 address.Address, arg2 verifreg.ClaimId, arg3 types.TipSetKey) (*verifreg.Claim, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "StateGetClaim", arg0, arg1, arg2, arg3)
|
||||||
|
ret0, _ := ret[0].(*verifreg.Claim)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// StateGetClaim indicates an expected call of StateGetClaim.
|
||||||
|
func (mr *MockFullNodeMockRecorder) StateGetClaim(arg0, arg1, arg2, arg3 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateGetClaim", reflect.TypeOf((*MockFullNode)(nil).StateGetClaim), arg0, arg1, arg2, arg3)
|
||||||
|
}
|
||||||
|
|
||||||
|
// StateGetClaims mocks base method.
|
||||||
|
func (m *MockFullNode) StateGetClaims(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (map[verifreg.ClaimId]verifreg.Claim, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "StateGetClaims", arg0, arg1, arg2)
|
||||||
|
ret0, _ := ret[0].(map[verifreg.ClaimId]verifreg.Claim)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// StateGetClaims indicates an expected call of StateGetClaims.
|
||||||
|
func (mr *MockFullNodeMockRecorder) StateGetClaims(arg0, arg1, arg2 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateGetClaims", reflect.TypeOf((*MockFullNode)(nil).StateGetClaims), arg0, arg1, arg2)
|
||||||
|
}
|
||||||
|
|
||||||
// StateGetNetworkParams mocks base method.
|
// StateGetNetworkParams mocks base method.
|
||||||
func (m *MockFullNode) StateGetNetworkParams(arg0 context.Context) (*api.NetworkParams, error) {
|
func (m *MockFullNode) StateGetNetworkParams(arg0 context.Context) (*api.NetworkParams, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
|
|
||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
"github.com/libp2p/go-libp2p-core/peer"
|
"github.com/libp2p/go-libp2p/core/peer"
|
||||||
"golang.org/x/xerrors"
|
"golang.org/x/xerrors"
|
||||||
|
|
||||||
"github.com/filecoin-project/go-address"
|
"github.com/filecoin-project/go-address"
|
||||||
@@ -12,7 +12,7 @@ import (
|
|||||||
"github.com/filecoin-project/go-fil-markets/storagemarket"
|
"github.com/filecoin-project/go-fil-markets/storagemarket"
|
||||||
"github.com/filecoin-project/go-state-types/abi"
|
"github.com/filecoin-project/go-state-types/abi"
|
||||||
"github.com/filecoin-project/go-state-types/big"
|
"github.com/filecoin-project/go-state-types/big"
|
||||||
"github.com/filecoin-project/go-state-types/builtin/v8/miner"
|
"github.com/filecoin-project/go-state-types/builtin/v9/miner"
|
||||||
"github.com/filecoin-project/go-state-types/crypto"
|
"github.com/filecoin-project/go-state-types/crypto"
|
||||||
|
|
||||||
"github.com/filecoin-project/lotus/api"
|
"github.com/filecoin-project/lotus/api"
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ import (
|
|||||||
type FullNode = api.FullNode
|
type FullNode = api.FullNode
|
||||||
type FullNodeStruct = api.FullNodeStruct
|
type FullNodeStruct = api.FullNodeStruct
|
||||||
|
|
||||||
|
type RawFullNodeAPI FullNode
|
||||||
|
|
||||||
func PermissionedFullAPI(a FullNode) FullNode {
|
func PermissionedFullAPI(a FullNode) FullNode {
|
||||||
return api.PermissionedFullAPI(a)
|
return api.PermissionedFullAPI(a)
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -58,7 +58,7 @@ var (
|
|||||||
FullAPIVersion1 = newVer(2, 3, 0)
|
FullAPIVersion1 = newVer(2, 3, 0)
|
||||||
|
|
||||||
MinerAPIVersion0 = newVer(1, 5, 0)
|
MinerAPIVersion0 = newVer(1, 5, 0)
|
||||||
WorkerAPIVersion0 = newVer(1, 6, 0)
|
WorkerAPIVersion0 = newVer(1, 7, 0)
|
||||||
)
|
)
|
||||||
|
|
||||||
//nolint:varcheck,deadcode
|
//nolint:varcheck,deadcode
|
||||||
|
|||||||
+1
-1
@@ -3,8 +3,8 @@ package blockstore
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
blocks "github.com/ipfs/go-block-format"
|
|
||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
|
blocks "github.com/ipfs/go-libipfs/blocks"
|
||||||
"golang.org/x/xerrors"
|
"golang.org/x/xerrors"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -5,9 +5,9 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
block "github.com/ipfs/go-block-format"
|
|
||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
ipld "github.com/ipfs/go-ipld-format"
|
ipld "github.com/ipfs/go-ipld-format"
|
||||||
|
block "github.com/ipfs/go-libipfs/blocks"
|
||||||
"golang.org/x/xerrors"
|
"golang.org/x/xerrors"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -181,18 +181,22 @@ func (bs *AutobatchBlockstore) Get(ctx context.Context, c cid.Cid) (block.Block,
|
|||||||
}
|
}
|
||||||
|
|
||||||
bs.stateLock.Lock()
|
bs.stateLock.Lock()
|
||||||
defer bs.stateLock.Unlock()
|
|
||||||
v, ok := bs.flushingBatch.blockMap[c]
|
v, ok := bs.flushingBatch.blockMap[c]
|
||||||
if ok {
|
if ok {
|
||||||
|
bs.stateLock.Unlock()
|
||||||
return v, nil
|
return v, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
v, ok = bs.bufferedBatch.blockMap[c]
|
v, ok = bs.bufferedBatch.blockMap[c]
|
||||||
if ok {
|
if ok {
|
||||||
|
bs.stateLock.Unlock()
|
||||||
return v, nil
|
return v, nil
|
||||||
}
|
}
|
||||||
|
bs.stateLock.Unlock()
|
||||||
|
|
||||||
return bs.Get(ctx, c)
|
// We have to check the backing store one more time because it may have been flushed by the
|
||||||
|
// time we were able to take the lock above.
|
||||||
|
return bs.backingBs.Get(ctx, c)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (bs *AutobatchBlockstore) DeleteBlock(context.Context, cid.Cid) error {
|
func (bs *AutobatchBlockstore) DeleteBlock(context.Context, cid.Cid) error {
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
ipld "github.com/ipfs/go-ipld-format"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -29,6 +30,10 @@ func TestAutobatchBlockstore(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, b2.RawData(), v2.RawData())
|
require.Equal(t, b2.RawData(), v2.RawData())
|
||||||
|
|
||||||
|
// Regression test for a deadlock.
|
||||||
|
_, err = ab.Get(ctx, b3.Cid())
|
||||||
|
require.True(t, ipld.IsNotFound(err))
|
||||||
|
|
||||||
require.NoError(t, ab.Flush(ctx))
|
require.NoError(t, ab.Flush(ctx))
|
||||||
require.NoError(t, ab.Shutdown(ctx))
|
require.NoError(t, ab.Shutdown(ctx))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,13 +13,14 @@ import (
|
|||||||
"github.com/dgraph-io/badger/v2"
|
"github.com/dgraph-io/badger/v2"
|
||||||
"github.com/dgraph-io/badger/v2/options"
|
"github.com/dgraph-io/badger/v2/options"
|
||||||
"github.com/dgraph-io/badger/v2/pb"
|
"github.com/dgraph-io/badger/v2/pb"
|
||||||
blocks "github.com/ipfs/go-block-format"
|
|
||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
ipld "github.com/ipfs/go-ipld-format"
|
ipld "github.com/ipfs/go-ipld-format"
|
||||||
|
blocks "github.com/ipfs/go-libipfs/blocks"
|
||||||
logger "github.com/ipfs/go-log/v2"
|
logger "github.com/ipfs/go-log/v2"
|
||||||
pool "github.com/libp2p/go-buffer-pool"
|
pool "github.com/libp2p/go-buffer-pool"
|
||||||
"github.com/multiformats/go-base32"
|
"github.com/multiformats/go-base32"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
|
"golang.org/x/xerrors"
|
||||||
|
|
||||||
"github.com/filecoin-project/lotus/blockstore"
|
"github.com/filecoin-project/lotus/blockstore"
|
||||||
)
|
)
|
||||||
@@ -44,7 +45,8 @@ const (
|
|||||||
// MemoryMap is equivalent to badger/options.MemoryMap.
|
// MemoryMap is equivalent to badger/options.MemoryMap.
|
||||||
MemoryMap = options.MemoryMap
|
MemoryMap = options.MemoryMap
|
||||||
// LoadToRAM is equivalent to badger/options.LoadToRAM.
|
// LoadToRAM is equivalent to badger/options.LoadToRAM.
|
||||||
LoadToRAM = options.LoadToRAM
|
LoadToRAM = options.LoadToRAM
|
||||||
|
defaultGCThreshold = 0.125
|
||||||
)
|
)
|
||||||
|
|
||||||
// Options embeds the badger options themselves, and augments them with
|
// Options embeds the badger options themselves, and augments them with
|
||||||
@@ -394,6 +396,9 @@ func (b *Blockstore) doCopy(from, to *badger.DB) error {
|
|||||||
if workers < 2 {
|
if workers < 2 {
|
||||||
workers = 2
|
workers = 2
|
||||||
}
|
}
|
||||||
|
if workers > 8 {
|
||||||
|
workers = 8
|
||||||
|
}
|
||||||
|
|
||||||
stream := from.NewStream()
|
stream := from.NewStream()
|
||||||
stream.NumGo = workers
|
stream.NumGo = workers
|
||||||
@@ -439,7 +444,7 @@ func (b *Blockstore) deleteDB(path string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *Blockstore) onlineGC() error {
|
func (b *Blockstore) onlineGC(ctx context.Context, threshold float64, checkFreq time.Duration, check func() error) error {
|
||||||
b.lockDB()
|
b.lockDB()
|
||||||
defer b.unlockDB()
|
defer b.unlockDB()
|
||||||
|
|
||||||
@@ -448,14 +453,26 @@ func (b *Blockstore) onlineGC() error {
|
|||||||
if nworkers < 2 {
|
if nworkers < 2 {
|
||||||
nworkers = 2
|
nworkers = 2
|
||||||
}
|
}
|
||||||
|
if nworkers > 7 { // max out at 1 goroutine per badger level
|
||||||
|
nworkers = 7
|
||||||
|
}
|
||||||
|
|
||||||
err := b.db.Flatten(nworkers)
|
err := b.db.Flatten(nworkers)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
checkTick := time.NewTimer(checkFreq)
|
||||||
|
defer checkTick.Stop()
|
||||||
for err == nil {
|
for err == nil {
|
||||||
err = b.db.RunValueLogGC(0.125)
|
select {
|
||||||
|
case <-ctx.Done():
|
||||||
|
err = ctx.Err()
|
||||||
|
case <-checkTick.C:
|
||||||
|
err = check()
|
||||||
|
checkTick.Reset(checkFreq)
|
||||||
|
default:
|
||||||
|
err = b.db.RunValueLogGC(threshold)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if err == badger.ErrNoRewrite {
|
if err == badger.ErrNoRewrite {
|
||||||
@@ -468,7 +485,7 @@ func (b *Blockstore) onlineGC() error {
|
|||||||
|
|
||||||
// CollectGarbage compacts and runs garbage collection on the value log;
|
// CollectGarbage compacts and runs garbage collection on the value log;
|
||||||
// implements the BlockstoreGC trait
|
// implements the BlockstoreGC trait
|
||||||
func (b *Blockstore) CollectGarbage(opts ...blockstore.BlockstoreGCOption) error {
|
func (b *Blockstore) CollectGarbage(ctx context.Context, opts ...blockstore.BlockstoreGCOption) error {
|
||||||
if err := b.access(); err != nil {
|
if err := b.access(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -485,8 +502,58 @@ func (b *Blockstore) CollectGarbage(opts ...blockstore.BlockstoreGCOption) error
|
|||||||
if options.FullGC {
|
if options.FullGC {
|
||||||
return b.movingGC()
|
return b.movingGC()
|
||||||
}
|
}
|
||||||
|
threshold := options.Threshold
|
||||||
|
if threshold == 0 {
|
||||||
|
threshold = defaultGCThreshold
|
||||||
|
}
|
||||||
|
checkFreq := options.CheckFreq
|
||||||
|
if checkFreq < 30*time.Second { // disallow checking more frequently than block time
|
||||||
|
checkFreq = 30 * time.Second
|
||||||
|
}
|
||||||
|
check := options.Check
|
||||||
|
if check == nil {
|
||||||
|
check = func() error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return b.onlineGC(ctx, threshold, checkFreq, check)
|
||||||
|
}
|
||||||
|
|
||||||
return b.onlineGC()
|
// GCOnce runs garbage collection on the value log;
|
||||||
|
// implements BlockstoreGCOnce trait
|
||||||
|
func (b *Blockstore) GCOnce(ctx context.Context, opts ...blockstore.BlockstoreGCOption) error {
|
||||||
|
if err := b.access(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer b.viewers.Done()
|
||||||
|
|
||||||
|
var options blockstore.BlockstoreGCOptions
|
||||||
|
for _, opt := range opts {
|
||||||
|
err := opt(&options)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if options.FullGC {
|
||||||
|
return xerrors.Errorf("FullGC option specified for GCOnce but full GC is non incremental")
|
||||||
|
}
|
||||||
|
|
||||||
|
threshold := options.Threshold
|
||||||
|
if threshold == 0 {
|
||||||
|
threshold = defaultGCThreshold
|
||||||
|
}
|
||||||
|
|
||||||
|
b.lockDB()
|
||||||
|
defer b.unlockDB()
|
||||||
|
|
||||||
|
// Note no compaction needed before single GC as we will hit at most one vlog anyway
|
||||||
|
err := b.db.RunValueLogGC(threshold)
|
||||||
|
if err == badger.ErrNoRewrite {
|
||||||
|
// not really an error in this case, it signals the end of GC
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Size returns the aggregate size of the blockstore
|
// Size returns the aggregate size of the blockstore
|
||||||
@@ -551,6 +618,18 @@ func (b *Blockstore) View(ctx context.Context, cid cid.Cid, fn func([]byte) erro
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (b *Blockstore) Flush(context.Context) error {
|
||||||
|
if err := b.access(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer b.viewers.Done()
|
||||||
|
|
||||||
|
b.lockDB()
|
||||||
|
defer b.unlockDB()
|
||||||
|
|
||||||
|
return b.db.Sync()
|
||||||
|
}
|
||||||
|
|
||||||
// Has implements Blockstore.Has.
|
// Has implements Blockstore.Has.
|
||||||
func (b *Blockstore) Has(ctx context.Context, cid cid.Cid) (bool, error) {
|
func (b *Blockstore) Has(ctx context.Context, cid cid.Cid) (bool, error) {
|
||||||
if err := b.access(); err != nil {
|
if err := b.access(); err != nil {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
//stm: #unit
|
// stm: #unit
|
||||||
package badgerbs
|
package badgerbs
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -10,8 +10,8 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
blocks "github.com/ipfs/go-block-format"
|
|
||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
|
blocks "github.com/ipfs/go-libipfs/blocks"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"golang.org/x/sync/errgroup"
|
"golang.org/x/sync/errgroup"
|
||||||
|
|
||||||
@@ -145,7 +145,7 @@ func testMove(t *testing.T, optsF func(string) Options) {
|
|||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
g.Go(func() error {
|
g.Go(func() error {
|
||||||
return db.CollectGarbage(blockstore.WithFullGC(true))
|
return db.CollectGarbage(ctx, blockstore.WithFullGC(true))
|
||||||
})
|
})
|
||||||
|
|
||||||
err = g.Wait()
|
err = g.Wait()
|
||||||
@@ -230,7 +230,7 @@ func testMove(t *testing.T, optsF func(string) Options) {
|
|||||||
checkPath()
|
checkPath()
|
||||||
|
|
||||||
// now do another FullGC to test the double move and following of symlinks
|
// now do another FullGC to test the double move and following of symlinks
|
||||||
if err := db.CollectGarbage(blockstore.WithFullGC(true)); err != nil {
|
if err := db.CollectGarbage(ctx, blockstore.WithFullGC(true)); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
//stm: #unit
|
// stm: #unit
|
||||||
package badgerbs
|
package badgerbs
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -9,10 +9,10 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
blocks "github.com/ipfs/go-block-format"
|
|
||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
u "github.com/ipfs/go-ipfs-util"
|
u "github.com/ipfs/go-ipfs-util"
|
||||||
ipld "github.com/ipfs/go-ipld-format"
|
ipld "github.com/ipfs/go-ipld-format"
|
||||||
|
blocks "github.com/ipfs/go-libipfs/blocks"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
|
||||||
"github.com/filecoin-project/lotus/blockstore"
|
"github.com/filecoin-project/lotus/blockstore"
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package blockstore
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
ds "github.com/ipfs/go-datastore"
|
ds "github.com/ipfs/go-datastore"
|
||||||
@@ -18,6 +19,7 @@ type Blockstore interface {
|
|||||||
blockstore.Blockstore
|
blockstore.Blockstore
|
||||||
blockstore.Viewer
|
blockstore.Viewer
|
||||||
BatchDeleter
|
BatchDeleter
|
||||||
|
Flusher
|
||||||
}
|
}
|
||||||
|
|
||||||
// BasicBlockstore is an alias to the original IPFS Blockstore.
|
// BasicBlockstore is an alias to the original IPFS Blockstore.
|
||||||
@@ -25,6 +27,10 @@ type BasicBlockstore = blockstore.Blockstore
|
|||||||
|
|
||||||
type Viewer = blockstore.Viewer
|
type Viewer = blockstore.Viewer
|
||||||
|
|
||||||
|
type Flusher interface {
|
||||||
|
Flush(context.Context) error
|
||||||
|
}
|
||||||
|
|
||||||
type BatchDeleter interface {
|
type BatchDeleter interface {
|
||||||
DeleteMany(ctx context.Context, cids []cid.Cid) error
|
DeleteMany(ctx context.Context, cids []cid.Cid) error
|
||||||
}
|
}
|
||||||
@@ -36,7 +42,12 @@ type BlockstoreIterator interface {
|
|||||||
|
|
||||||
// BlockstoreGC is a trait for blockstores that support online garbage collection
|
// BlockstoreGC is a trait for blockstores that support online garbage collection
|
||||||
type BlockstoreGC interface {
|
type BlockstoreGC interface {
|
||||||
CollectGarbage(options ...BlockstoreGCOption) error
|
CollectGarbage(ctx context.Context, options ...BlockstoreGCOption) error
|
||||||
|
}
|
||||||
|
|
||||||
|
// BlockstoreGCOnce is a trait for a blockstore that supports incremental online garbage collection
|
||||||
|
type BlockstoreGCOnce interface {
|
||||||
|
GCOnce(ctx context.Context, options ...BlockstoreGCOption) error
|
||||||
}
|
}
|
||||||
|
|
||||||
// BlockstoreGCOption is a functional interface for controlling blockstore GC options
|
// BlockstoreGCOption is a functional interface for controlling blockstore GC options
|
||||||
@@ -45,6 +56,12 @@ type BlockstoreGCOption = func(*BlockstoreGCOptions) error
|
|||||||
// BlockstoreGCOptions is a struct with GC options
|
// BlockstoreGCOptions is a struct with GC options
|
||||||
type BlockstoreGCOptions struct {
|
type BlockstoreGCOptions struct {
|
||||||
FullGC bool
|
FullGC bool
|
||||||
|
// fraction of garbage in badger vlog before its worth processing in online GC
|
||||||
|
Threshold float64
|
||||||
|
// how often to call the check function
|
||||||
|
CheckFreq time.Duration
|
||||||
|
// function to call periodically to pause or early terminate GC
|
||||||
|
Check func() error
|
||||||
}
|
}
|
||||||
|
|
||||||
func WithFullGC(fullgc bool) BlockstoreGCOption {
|
func WithFullGC(fullgc bool) BlockstoreGCOption {
|
||||||
@@ -54,6 +71,27 @@ func WithFullGC(fullgc bool) BlockstoreGCOption {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func WithThreshold(threshold float64) BlockstoreGCOption {
|
||||||
|
return func(opts *BlockstoreGCOptions) error {
|
||||||
|
opts.Threshold = threshold
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func WithCheckFreq(f time.Duration) BlockstoreGCOption {
|
||||||
|
return func(opts *BlockstoreGCOptions) error {
|
||||||
|
opts.CheckFreq = f
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func WithCheck(check func() error) BlockstoreGCOption {
|
||||||
|
return func(opts *BlockstoreGCOptions) error {
|
||||||
|
opts.Check = check
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// BlockstoreSize is a trait for on-disk blockstores that can report their size
|
// BlockstoreSize is a trait for on-disk blockstores that can report their size
|
||||||
type BlockstoreSize interface {
|
type BlockstoreSize interface {
|
||||||
Size() (int64, error)
|
Size() (int64, error)
|
||||||
@@ -92,6 +130,13 @@ type adaptedBlockstore struct {
|
|||||||
|
|
||||||
var _ Blockstore = (*adaptedBlockstore)(nil)
|
var _ Blockstore = (*adaptedBlockstore)(nil)
|
||||||
|
|
||||||
|
func (a *adaptedBlockstore) Flush(ctx context.Context) error {
|
||||||
|
if flusher, canFlush := a.Blockstore.(Flusher); canFlush {
|
||||||
|
return flusher.Flush(ctx)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (a *adaptedBlockstore) View(ctx context.Context, cid cid.Cid, callback func([]byte) error) error {
|
func (a *adaptedBlockstore) View(ctx context.Context, cid cid.Cid, callback func([]byte) error) error {
|
||||||
blk, err := a.Get(ctx, cid)
|
blk, err := a.Get(ctx, cid)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -4,9 +4,9 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
block "github.com/ipfs/go-block-format"
|
|
||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
ipld "github.com/ipfs/go-ipld-format"
|
ipld "github.com/ipfs/go-ipld-format"
|
||||||
|
block "github.com/ipfs/go-libipfs/blocks"
|
||||||
)
|
)
|
||||||
|
|
||||||
// buflog is a logger for the buffered blockstore. It is subscoped from the
|
// buflog is a logger for the buffered blockstore. It is subscoped from the
|
||||||
@@ -46,6 +46,8 @@ var (
|
|||||||
_ Viewer = (*BufferedBlockstore)(nil)
|
_ Viewer = (*BufferedBlockstore)(nil)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func (bs *BufferedBlockstore) Flush(ctx context.Context) error { return bs.write.Flush(ctx) }
|
||||||
|
|
||||||
func (bs *BufferedBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) {
|
func (bs *BufferedBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) {
|
||||||
a, err := bs.read.AllKeysChan(ctx)
|
a, err := bs.read.AllKeysChan(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -0,0 +1,441 @@
|
|||||||
|
// Code generated by github.com/whyrusleeping/cbor-gen. DO NOT EDIT.
|
||||||
|
|
||||||
|
package blockstore
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"math"
|
||||||
|
"sort"
|
||||||
|
|
||||||
|
cid "github.com/ipfs/go-cid"
|
||||||
|
cbg "github.com/whyrusleeping/cbor-gen"
|
||||||
|
xerrors "golang.org/x/xerrors"
|
||||||
|
)
|
||||||
|
|
||||||
|
var _ = xerrors.Errorf
|
||||||
|
var _ = cid.Undef
|
||||||
|
var _ = math.E
|
||||||
|
var _ = sort.Sort
|
||||||
|
|
||||||
|
var lengthBufNetRpcReq = []byte{132}
|
||||||
|
|
||||||
|
func (t *NetRpcReq) MarshalCBOR(w io.Writer) error {
|
||||||
|
if t == nil {
|
||||||
|
_, err := w.Write(cbg.CborNull)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
cw := cbg.NewCborWriter(w)
|
||||||
|
|
||||||
|
if _, err := cw.Write(lengthBufNetRpcReq); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// t.Type (blockstore.NetRPCReqType) (uint8)
|
||||||
|
if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.Type)); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// t.ID (uint64) (uint64)
|
||||||
|
|
||||||
|
if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.ID)); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// t.Cid ([]cid.Cid) (slice)
|
||||||
|
if len(t.Cid) > cbg.MaxLength {
|
||||||
|
return xerrors.Errorf("Slice value in field t.Cid was too long")
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := cw.WriteMajorTypeHeader(cbg.MajArray, uint64(len(t.Cid))); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
for _, v := range t.Cid {
|
||||||
|
if err := cbg.WriteCid(w, v); err != nil {
|
||||||
|
return xerrors.Errorf("failed writing cid field t.Cid: %w", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// t.Data ([][]uint8) (slice)
|
||||||
|
if len(t.Data) > cbg.MaxLength {
|
||||||
|
return xerrors.Errorf("Slice value in field t.Data was too long")
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := cw.WriteMajorTypeHeader(cbg.MajArray, uint64(len(t.Data))); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
for _, v := range t.Data {
|
||||||
|
if len(v) > cbg.ByteArrayMaxLen {
|
||||||
|
return xerrors.Errorf("Byte array in field v was too long")
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := cw.WriteMajorTypeHeader(cbg.MajByteString, uint64(len(v))); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err := cw.Write(v[:]); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *NetRpcReq) UnmarshalCBOR(r io.Reader) (err error) {
|
||||||
|
*t = NetRpcReq{}
|
||||||
|
|
||||||
|
cr := cbg.NewCborReader(r)
|
||||||
|
|
||||||
|
maj, extra, err := cr.ReadHeader()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer func() {
|
||||||
|
if err == io.EOF {
|
||||||
|
err = io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
if maj != cbg.MajArray {
|
||||||
|
return fmt.Errorf("cbor input should be of type array")
|
||||||
|
}
|
||||||
|
|
||||||
|
if extra != 4 {
|
||||||
|
return fmt.Errorf("cbor input had wrong number of fields")
|
||||||
|
}
|
||||||
|
|
||||||
|
// t.Type (blockstore.NetRPCReqType) (uint8)
|
||||||
|
|
||||||
|
maj, extra, err = cr.ReadHeader()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if maj != cbg.MajUnsignedInt {
|
||||||
|
return fmt.Errorf("wrong type for uint8 field")
|
||||||
|
}
|
||||||
|
if extra > math.MaxUint8 {
|
||||||
|
return fmt.Errorf("integer in input was too large for uint8 field")
|
||||||
|
}
|
||||||
|
t.Type = NetRPCReqType(extra)
|
||||||
|
// t.ID (uint64) (uint64)
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
maj, extra, err = cr.ReadHeader()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if maj != cbg.MajUnsignedInt {
|
||||||
|
return fmt.Errorf("wrong type for uint64 field")
|
||||||
|
}
|
||||||
|
t.ID = uint64(extra)
|
||||||
|
|
||||||
|
}
|
||||||
|
// t.Cid ([]cid.Cid) (slice)
|
||||||
|
|
||||||
|
maj, extra, err = cr.ReadHeader()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if extra > cbg.MaxLength {
|
||||||
|
return fmt.Errorf("t.Cid: array too large (%d)", extra)
|
||||||
|
}
|
||||||
|
|
||||||
|
if maj != cbg.MajArray {
|
||||||
|
return fmt.Errorf("expected cbor array")
|
||||||
|
}
|
||||||
|
|
||||||
|
if extra > 0 {
|
||||||
|
t.Cid = make([]cid.Cid, extra)
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 0; i < int(extra); i++ {
|
||||||
|
|
||||||
|
c, err := cbg.ReadCid(cr)
|
||||||
|
if err != nil {
|
||||||
|
return xerrors.Errorf("reading cid field t.Cid failed: %w", err)
|
||||||
|
}
|
||||||
|
t.Cid[i] = c
|
||||||
|
}
|
||||||
|
|
||||||
|
// t.Data ([][]uint8) (slice)
|
||||||
|
|
||||||
|
maj, extra, err = cr.ReadHeader()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if extra > cbg.MaxLength {
|
||||||
|
return fmt.Errorf("t.Data: array too large (%d)", extra)
|
||||||
|
}
|
||||||
|
|
||||||
|
if maj != cbg.MajArray {
|
||||||
|
return fmt.Errorf("expected cbor array")
|
||||||
|
}
|
||||||
|
|
||||||
|
if extra > 0 {
|
||||||
|
t.Data = make([][]uint8, extra)
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 0; i < int(extra); i++ {
|
||||||
|
{
|
||||||
|
var maj byte
|
||||||
|
var extra uint64
|
||||||
|
var err error
|
||||||
|
|
||||||
|
maj, extra, err = cr.ReadHeader()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if extra > cbg.ByteArrayMaxLen {
|
||||||
|
return fmt.Errorf("t.Data[i]: byte array too large (%d)", extra)
|
||||||
|
}
|
||||||
|
if maj != cbg.MajByteString {
|
||||||
|
return fmt.Errorf("expected byte array")
|
||||||
|
}
|
||||||
|
|
||||||
|
if extra > 0 {
|
||||||
|
t.Data[i] = make([]uint8, extra)
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err := io.ReadFull(cr, t.Data[i][:]); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var lengthBufNetRpcResp = []byte{131}
|
||||||
|
|
||||||
|
func (t *NetRpcResp) MarshalCBOR(w io.Writer) error {
|
||||||
|
if t == nil {
|
||||||
|
_, err := w.Write(cbg.CborNull)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
cw := cbg.NewCborWriter(w)
|
||||||
|
|
||||||
|
if _, err := cw.Write(lengthBufNetRpcResp); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// t.Type (blockstore.NetRPCRespType) (uint8)
|
||||||
|
if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.Type)); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// t.ID (uint64) (uint64)
|
||||||
|
|
||||||
|
if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.ID)); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// t.Data ([]uint8) (slice)
|
||||||
|
if len(t.Data) > cbg.ByteArrayMaxLen {
|
||||||
|
return xerrors.Errorf("Byte array in field t.Data was too long")
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := cw.WriteMajorTypeHeader(cbg.MajByteString, uint64(len(t.Data))); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err := cw.Write(t.Data[:]); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *NetRpcResp) UnmarshalCBOR(r io.Reader) (err error) {
|
||||||
|
*t = NetRpcResp{}
|
||||||
|
|
||||||
|
cr := cbg.NewCborReader(r)
|
||||||
|
|
||||||
|
maj, extra, err := cr.ReadHeader()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer func() {
|
||||||
|
if err == io.EOF {
|
||||||
|
err = io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
if maj != cbg.MajArray {
|
||||||
|
return fmt.Errorf("cbor input should be of type array")
|
||||||
|
}
|
||||||
|
|
||||||
|
if extra != 3 {
|
||||||
|
return fmt.Errorf("cbor input had wrong number of fields")
|
||||||
|
}
|
||||||
|
|
||||||
|
// t.Type (blockstore.NetRPCRespType) (uint8)
|
||||||
|
|
||||||
|
maj, extra, err = cr.ReadHeader()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if maj != cbg.MajUnsignedInt {
|
||||||
|
return fmt.Errorf("wrong type for uint8 field")
|
||||||
|
}
|
||||||
|
if extra > math.MaxUint8 {
|
||||||
|
return fmt.Errorf("integer in input was too large for uint8 field")
|
||||||
|
}
|
||||||
|
t.Type = NetRPCRespType(extra)
|
||||||
|
// t.ID (uint64) (uint64)
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
maj, extra, err = cr.ReadHeader()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if maj != cbg.MajUnsignedInt {
|
||||||
|
return fmt.Errorf("wrong type for uint64 field")
|
||||||
|
}
|
||||||
|
t.ID = uint64(extra)
|
||||||
|
|
||||||
|
}
|
||||||
|
// t.Data ([]uint8) (slice)
|
||||||
|
|
||||||
|
maj, extra, err = cr.ReadHeader()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if extra > cbg.ByteArrayMaxLen {
|
||||||
|
return fmt.Errorf("t.Data: byte array too large (%d)", extra)
|
||||||
|
}
|
||||||
|
if maj != cbg.MajByteString {
|
||||||
|
return fmt.Errorf("expected byte array")
|
||||||
|
}
|
||||||
|
|
||||||
|
if extra > 0 {
|
||||||
|
t.Data = make([]uint8, extra)
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err := io.ReadFull(cr, t.Data[:]); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var lengthBufNetRpcErr = []byte{131}
|
||||||
|
|
||||||
|
func (t *NetRpcErr) MarshalCBOR(w io.Writer) error {
|
||||||
|
if t == nil {
|
||||||
|
_, err := w.Write(cbg.CborNull)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
cw := cbg.NewCborWriter(w)
|
||||||
|
|
||||||
|
if _, err := cw.Write(lengthBufNetRpcErr); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// t.Type (blockstore.NetRPCErrType) (uint8)
|
||||||
|
if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.Type)); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// t.Msg (string) (string)
|
||||||
|
if len(t.Msg) > cbg.MaxLength {
|
||||||
|
return xerrors.Errorf("Value in field t.Msg was too long")
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.Msg))); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if _, err := io.WriteString(w, string(t.Msg)); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// t.Cid (cid.Cid) (struct)
|
||||||
|
|
||||||
|
if t.Cid == nil {
|
||||||
|
if _, err := cw.Write(cbg.CborNull); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if err := cbg.WriteCid(cw, *t.Cid); err != nil {
|
||||||
|
return xerrors.Errorf("failed to write cid field t.Cid: %w", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *NetRpcErr) UnmarshalCBOR(r io.Reader) (err error) {
|
||||||
|
*t = NetRpcErr{}
|
||||||
|
|
||||||
|
cr := cbg.NewCborReader(r)
|
||||||
|
|
||||||
|
maj, extra, err := cr.ReadHeader()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer func() {
|
||||||
|
if err == io.EOF {
|
||||||
|
err = io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
if maj != cbg.MajArray {
|
||||||
|
return fmt.Errorf("cbor input should be of type array")
|
||||||
|
}
|
||||||
|
|
||||||
|
if extra != 3 {
|
||||||
|
return fmt.Errorf("cbor input had wrong number of fields")
|
||||||
|
}
|
||||||
|
|
||||||
|
// t.Type (blockstore.NetRPCErrType) (uint8)
|
||||||
|
|
||||||
|
maj, extra, err = cr.ReadHeader()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if maj != cbg.MajUnsignedInt {
|
||||||
|
return fmt.Errorf("wrong type for uint8 field")
|
||||||
|
}
|
||||||
|
if extra > math.MaxUint8 {
|
||||||
|
return fmt.Errorf("integer in input was too large for uint8 field")
|
||||||
|
}
|
||||||
|
t.Type = NetRPCErrType(extra)
|
||||||
|
// t.Msg (string) (string)
|
||||||
|
|
||||||
|
{
|
||||||
|
sval, err := cbg.ReadString(cr)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
t.Msg = string(sval)
|
||||||
|
}
|
||||||
|
// t.Cid (cid.Cid) (struct)
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
b, err := cr.ReadByte()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if b != cbg.CborNull[0] {
|
||||||
|
if err := cr.UnreadByte(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
c, err := cbg.ReadCid(cr)
|
||||||
|
if err != nil {
|
||||||
|
return xerrors.Errorf("failed to read cid field t.Cid: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
t.Cid = &c
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
@@ -4,8 +4,8 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"io"
|
"io"
|
||||||
|
|
||||||
blocks "github.com/ipfs/go-block-format"
|
|
||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
|
blocks "github.com/ipfs/go-libipfs/blocks"
|
||||||
)
|
)
|
||||||
|
|
||||||
var _ Blockstore = (*discardstore)(nil)
|
var _ Blockstore = (*discardstore)(nil)
|
||||||
@@ -38,6 +38,10 @@ func (b *discardstore) View(ctx context.Context, cid cid.Cid, f func([]byte) err
|
|||||||
return b.bs.View(ctx, cid, f)
|
return b.bs.View(ctx, cid, f)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (b *discardstore) Flush(ctx context.Context) error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (b *discardstore) Put(ctx context.Context, blk blocks.Block) error {
|
func (b *discardstore) Put(ctx context.Context, blk blocks.Block) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,9 +5,9 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
blocks "github.com/ipfs/go-block-format"
|
|
||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
ipld "github.com/ipfs/go-ipld-format"
|
ipld "github.com/ipfs/go-ipld-format"
|
||||||
|
blocks "github.com/ipfs/go-libipfs/blocks"
|
||||||
"golang.org/x/xerrors"
|
"golang.org/x/xerrors"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
+13
-1
@@ -4,8 +4,8 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"io"
|
"io"
|
||||||
|
|
||||||
blocks "github.com/ipfs/go-block-format"
|
|
||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
|
blocks "github.com/ipfs/go-libipfs/blocks"
|
||||||
mh "github.com/multiformats/go-multihash"
|
mh "github.com/multiformats/go-multihash"
|
||||||
"golang.org/x/xerrors"
|
"golang.org/x/xerrors"
|
||||||
)
|
)
|
||||||
@@ -102,6 +102,14 @@ func (b *idstore) Put(ctx context.Context, blk blocks.Block) error {
|
|||||||
return b.bs.Put(ctx, blk)
|
return b.bs.Put(ctx, blk)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (b *idstore) ForEachKey(f func(cid.Cid) error) error {
|
||||||
|
iterBstore, ok := b.bs.(BlockstoreIterator)
|
||||||
|
if !ok {
|
||||||
|
return xerrors.Errorf("underlying blockstore (type %T) doesn't support fast iteration", b.bs)
|
||||||
|
}
|
||||||
|
return iterBstore.ForEachKey(f)
|
||||||
|
}
|
||||||
|
|
||||||
func (b *idstore) PutMany(ctx context.Context, blks []blocks.Block) error {
|
func (b *idstore) PutMany(ctx context.Context, blks []blocks.Block) error {
|
||||||
toPut := make([]blocks.Block, 0, len(blks))
|
toPut := make([]blocks.Block, 0, len(blks))
|
||||||
for _, blk := range blks {
|
for _, blk := range blks {
|
||||||
@@ -171,3 +179,7 @@ func (b *idstore) Close() error {
|
|||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (b *idstore) Flush(ctx context.Context) error {
|
||||||
|
return b.bs.Flush(ctx)
|
||||||
|
}
|
||||||
|
|||||||
+3
-3
@@ -3,11 +3,11 @@ package blockstore
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"io/ioutil"
|
"io"
|
||||||
|
|
||||||
blocks "github.com/ipfs/go-block-format"
|
|
||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
httpapi "github.com/ipfs/go-ipfs-http-client"
|
httpapi "github.com/ipfs/go-ipfs-http-client"
|
||||||
|
blocks "github.com/ipfs/go-libipfs/blocks"
|
||||||
iface "github.com/ipfs/interface-go-ipfs-core"
|
iface "github.com/ipfs/interface-go-ipfs-core"
|
||||||
"github.com/ipfs/interface-go-ipfs-core/options"
|
"github.com/ipfs/interface-go-ipfs-core/options"
|
||||||
"github.com/ipfs/interface-go-ipfs-core/path"
|
"github.com/ipfs/interface-go-ipfs-core/path"
|
||||||
@@ -103,7 +103,7 @@ func (i *IPFSBlockstore) Get(ctx context.Context, cid cid.Cid) (blocks.Block, er
|
|||||||
return nil, xerrors.Errorf("getting ipfs block: %w", err)
|
return nil, xerrors.Errorf("getting ipfs block: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
data, err := ioutil.ReadAll(rd)
|
data, err := io.ReadAll(rd)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
+18
-12
@@ -3,9 +3,9 @@ package blockstore
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
blocks "github.com/ipfs/go-block-format"
|
|
||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
ipld "github.com/ipfs/go-ipld-format"
|
ipld "github.com/ipfs/go-ipld-format"
|
||||||
|
blocks "github.com/ipfs/go-libipfs/blocks"
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewMemory returns a temporary memory-backed blockstore.
|
// NewMemory returns a temporary memory-backed blockstore.
|
||||||
@@ -14,27 +14,30 @@ func NewMemory() MemBlockstore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// MemBlockstore is a terminal blockstore that keeps blocks in memory.
|
// MemBlockstore is a terminal blockstore that keeps blocks in memory.
|
||||||
type MemBlockstore map[cid.Cid]blocks.Block
|
// To match behavior of badger blockstore we index by multihash only.
|
||||||
|
type MemBlockstore map[string]blocks.Block
|
||||||
|
|
||||||
|
func (MemBlockstore) Flush(context.Context) error { return nil }
|
||||||
|
|
||||||
func (m MemBlockstore) DeleteBlock(ctx context.Context, k cid.Cid) error {
|
func (m MemBlockstore) DeleteBlock(ctx context.Context, k cid.Cid) error {
|
||||||
delete(m, k)
|
delete(m, string(k.Hash()))
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m MemBlockstore) DeleteMany(ctx context.Context, ks []cid.Cid) error {
|
func (m MemBlockstore) DeleteMany(ctx context.Context, ks []cid.Cid) error {
|
||||||
for _, k := range ks {
|
for _, k := range ks {
|
||||||
delete(m, k)
|
delete(m, string(k.Hash()))
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m MemBlockstore) Has(ctx context.Context, k cid.Cid) (bool, error) {
|
func (m MemBlockstore) Has(ctx context.Context, k cid.Cid) (bool, error) {
|
||||||
_, ok := m[k]
|
_, ok := m[string(k.Hash())]
|
||||||
return ok, nil
|
return ok, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m MemBlockstore) View(ctx context.Context, k cid.Cid, callback func([]byte) error) error {
|
func (m MemBlockstore) View(ctx context.Context, k cid.Cid, callback func([]byte) error) error {
|
||||||
b, ok := m[k]
|
b, ok := m[string(k.Hash())]
|
||||||
if !ok {
|
if !ok {
|
||||||
return ipld.ErrNotFound{Cid: k}
|
return ipld.ErrNotFound{Cid: k}
|
||||||
}
|
}
|
||||||
@@ -42,16 +45,19 @@ func (m MemBlockstore) View(ctx context.Context, k cid.Cid, callback func([]byte
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (m MemBlockstore) Get(ctx context.Context, k cid.Cid) (blocks.Block, error) {
|
func (m MemBlockstore) Get(ctx context.Context, k cid.Cid) (blocks.Block, error) {
|
||||||
b, ok := m[k]
|
b, ok := m[string(k.Hash())]
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, ipld.ErrNotFound{Cid: k}
|
return nil, ipld.ErrNotFound{Cid: k}
|
||||||
}
|
}
|
||||||
|
if b.Cid().Prefix().Codec != k.Prefix().Codec {
|
||||||
|
return blocks.NewBlockWithCid(b.RawData(), k)
|
||||||
|
}
|
||||||
return b, nil
|
return b, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetSize returns the CIDs mapped BlockSize
|
// GetSize returns the CIDs mapped BlockSize
|
||||||
func (m MemBlockstore) GetSize(ctx context.Context, k cid.Cid) (int, error) {
|
func (m MemBlockstore) GetSize(ctx context.Context, k cid.Cid) (int, error) {
|
||||||
b, ok := m[k]
|
b, ok := m[string(k.Hash())]
|
||||||
if !ok {
|
if !ok {
|
||||||
return 0, ipld.ErrNotFound{Cid: k}
|
return 0, ipld.ErrNotFound{Cid: k}
|
||||||
}
|
}
|
||||||
@@ -62,7 +68,7 @@ func (m MemBlockstore) GetSize(ctx context.Context, k cid.Cid) (int, error) {
|
|||||||
func (m MemBlockstore) Put(ctx context.Context, b blocks.Block) error {
|
func (m MemBlockstore) Put(ctx context.Context, b blocks.Block) error {
|
||||||
// Convert to a basic block for safety, but try to reuse the existing
|
// Convert to a basic block for safety, but try to reuse the existing
|
||||||
// block if it's already a basic block.
|
// block if it's already a basic block.
|
||||||
k := b.Cid()
|
k := string(b.Cid().Hash())
|
||||||
if _, ok := b.(*blocks.BasicBlock); !ok {
|
if _, ok := b.(*blocks.BasicBlock); !ok {
|
||||||
// If we already have the block, abort.
|
// If we already have the block, abort.
|
||||||
if _, ok := m[k]; ok {
|
if _, ok := m[k]; ok {
|
||||||
@@ -71,7 +77,7 @@ func (m MemBlockstore) Put(ctx context.Context, b blocks.Block) error {
|
|||||||
// the error is only for debugging.
|
// the error is only for debugging.
|
||||||
b, _ = blocks.NewBlockWithCid(b.RawData(), b.Cid())
|
b, _ = blocks.NewBlockWithCid(b.RawData(), b.Cid())
|
||||||
}
|
}
|
||||||
m[b.Cid()] = b
|
m[k] = b
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -89,8 +95,8 @@ func (m MemBlockstore) PutMany(ctx context.Context, bs []blocks.Block) error {
|
|||||||
// the given context, closing the channel if it becomes Done.
|
// the given context, closing the channel if it becomes Done.
|
||||||
func (m MemBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) {
|
func (m MemBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) {
|
||||||
ch := make(chan cid.Cid, len(m))
|
ch := make(chan cid.Cid, len(m))
|
||||||
for k := range m {
|
for _, b := range m {
|
||||||
ch <- k
|
ch <- b.Cid()
|
||||||
}
|
}
|
||||||
close(ch)
|
close(ch)
|
||||||
return ch, nil
|
return ch, nil
|
||||||
|
|||||||
@@ -0,0 +1,45 @@
|
|||||||
|
package blockstore
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/ipfs/go-cid"
|
||||||
|
blocks "github.com/ipfs/go-libipfs/blocks"
|
||||||
|
mh "github.com/multiformats/go-multihash"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestMemGetCodec(t *testing.T) {
|
||||||
|
ctx := context.Background()
|
||||||
|
bs := NewMemory()
|
||||||
|
|
||||||
|
cborArr := []byte{0x82, 1, 2}
|
||||||
|
|
||||||
|
h, err := mh.Sum(cborArr, mh.SHA2_256, -1)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
rawCid := cid.NewCidV1(cid.Raw, h)
|
||||||
|
rawBlk, err := blocks.NewBlockWithCid(cborArr, rawCid)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
err = bs.Put(ctx, rawBlk)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
cborCid := cid.NewCidV1(cid.DagCBOR, h)
|
||||||
|
|
||||||
|
cborBlk, err := bs.Get(ctx, cborCid)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
require.Equal(t, cborCid.Prefix(), cborBlk.Cid().Prefix())
|
||||||
|
require.EqualValues(t, cborArr, cborBlk.RawData())
|
||||||
|
|
||||||
|
// was allocated
|
||||||
|
require.NotEqual(t, cborBlk, rawBlk)
|
||||||
|
|
||||||
|
gotRawBlk, err := bs.Get(ctx, rawCid)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
// not allocated
|
||||||
|
require.Equal(t, rawBlk, gotRawBlk)
|
||||||
|
}
|
||||||
@@ -0,0 +1,426 @@
|
|||||||
|
package blockstore
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"context"
|
||||||
|
"encoding/binary"
|
||||||
|
"fmt"
|
||||||
|
"sync"
|
||||||
|
"sync/atomic"
|
||||||
|
|
||||||
|
"github.com/ipfs/go-cid"
|
||||||
|
ipld "github.com/ipfs/go-ipld-format"
|
||||||
|
blocks "github.com/ipfs/go-libipfs/blocks"
|
||||||
|
"github.com/libp2p/go-msgio"
|
||||||
|
cbg "github.com/whyrusleeping/cbor-gen"
|
||||||
|
"golang.org/x/xerrors"
|
||||||
|
)
|
||||||
|
|
||||||
|
type NetRPCReqType byte
|
||||||
|
|
||||||
|
const (
|
||||||
|
NRpcHas NetRPCReqType = iota
|
||||||
|
NRpcGet
|
||||||
|
NRpcGetSize
|
||||||
|
NRpcPut
|
||||||
|
NRpcDelete
|
||||||
|
|
||||||
|
// todo cancel req
|
||||||
|
)
|
||||||
|
|
||||||
|
type NetRPCRespType byte
|
||||||
|
|
||||||
|
const (
|
||||||
|
NRpcOK NetRPCRespType = iota
|
||||||
|
NRpcErr
|
||||||
|
NRpcMore
|
||||||
|
)
|
||||||
|
|
||||||
|
type NetRPCErrType byte
|
||||||
|
|
||||||
|
const (
|
||||||
|
NRpcErrGeneric NetRPCErrType = iota
|
||||||
|
NRpcErrNotFound
|
||||||
|
)
|
||||||
|
|
||||||
|
type NetRpcReq struct {
|
||||||
|
Type NetRPCReqType
|
||||||
|
ID uint64
|
||||||
|
|
||||||
|
Cid []cid.Cid // todo maxsize?
|
||||||
|
Data [][]byte // todo maxsize?
|
||||||
|
}
|
||||||
|
|
||||||
|
type NetRpcResp struct {
|
||||||
|
Type NetRPCRespType
|
||||||
|
ID uint64
|
||||||
|
|
||||||
|
// error or cids in allkeys
|
||||||
|
Data []byte // todo maxsize?
|
||||||
|
|
||||||
|
next <-chan NetRpcResp
|
||||||
|
}
|
||||||
|
|
||||||
|
type NetRpcErr struct {
|
||||||
|
Type NetRPCErrType
|
||||||
|
|
||||||
|
Msg string
|
||||||
|
|
||||||
|
// in case of NRpcErrNotFound
|
||||||
|
Cid *cid.Cid
|
||||||
|
}
|
||||||
|
|
||||||
|
type NetworkStore struct {
|
||||||
|
// note: writer is thread-safe
|
||||||
|
msgStream msgio.ReadWriteCloser
|
||||||
|
|
||||||
|
// atomic
|
||||||
|
reqCount uint64
|
||||||
|
|
||||||
|
respLk sync.Mutex
|
||||||
|
|
||||||
|
// respMap is nil after store closes
|
||||||
|
respMap map[uint64]chan<- NetRpcResp
|
||||||
|
|
||||||
|
closing chan struct{}
|
||||||
|
closed chan struct{}
|
||||||
|
|
||||||
|
closeLk sync.Mutex
|
||||||
|
onClose []func()
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewNetworkStore(mss msgio.ReadWriteCloser) *NetworkStore {
|
||||||
|
ns := &NetworkStore{
|
||||||
|
msgStream: mss,
|
||||||
|
|
||||||
|
respMap: map[uint64]chan<- NetRpcResp{},
|
||||||
|
|
||||||
|
closing: make(chan struct{}),
|
||||||
|
closed: make(chan struct{}),
|
||||||
|
}
|
||||||
|
|
||||||
|
go ns.receive()
|
||||||
|
|
||||||
|
return ns
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *NetworkStore) shutdown(msg string) {
|
||||||
|
if err := n.msgStream.Close(); err != nil {
|
||||||
|
log.Errorw("closing netstore msg stream", "error", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
nerr := NetRpcErr{
|
||||||
|
Type: NRpcErrGeneric,
|
||||||
|
Msg: msg,
|
||||||
|
Cid: nil,
|
||||||
|
}
|
||||||
|
|
||||||
|
var errb bytes.Buffer
|
||||||
|
if err := nerr.MarshalCBOR(&errb); err != nil {
|
||||||
|
log.Errorw("netstore shutdown: error marshaling error", "err", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
n.respLk.Lock()
|
||||||
|
for id, resps := range n.respMap {
|
||||||
|
resps <- NetRpcResp{
|
||||||
|
Type: NRpcErr,
|
||||||
|
ID: id,
|
||||||
|
Data: errb.Bytes(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
n.respMap = nil
|
||||||
|
|
||||||
|
n.respLk.Unlock()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *NetworkStore) OnClose(cb func()) {
|
||||||
|
n.closeLk.Lock()
|
||||||
|
defer n.closeLk.Unlock()
|
||||||
|
|
||||||
|
select {
|
||||||
|
case <-n.closed:
|
||||||
|
cb()
|
||||||
|
default:
|
||||||
|
n.onClose = append(n.onClose, cb)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *NetworkStore) receive() {
|
||||||
|
defer func() {
|
||||||
|
n.closeLk.Lock()
|
||||||
|
defer n.closeLk.Unlock()
|
||||||
|
|
||||||
|
close(n.closed)
|
||||||
|
if n.onClose != nil {
|
||||||
|
for _, f := range n.onClose {
|
||||||
|
f()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-n.closing:
|
||||||
|
n.shutdown("netstore stopping")
|
||||||
|
return
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
|
||||||
|
msg, err := n.msgStream.ReadMsg()
|
||||||
|
if err != nil {
|
||||||
|
n.shutdown(fmt.Sprintf("netstore ReadMsg: %s", err))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var resp NetRpcResp
|
||||||
|
if err := resp.UnmarshalCBOR(bytes.NewReader(msg)); err != nil {
|
||||||
|
n.shutdown(fmt.Sprintf("unmarshaling netstore response: %s", err))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
n.msgStream.ReleaseMsg(msg)
|
||||||
|
|
||||||
|
n.respLk.Lock()
|
||||||
|
if ch, ok := n.respMap[resp.ID]; ok {
|
||||||
|
if resp.Type == NRpcMore {
|
||||||
|
nch := make(chan NetRpcResp, 1)
|
||||||
|
resp.next = nch
|
||||||
|
n.respMap[resp.ID] = nch
|
||||||
|
} else {
|
||||||
|
delete(n.respMap, resp.ID)
|
||||||
|
}
|
||||||
|
|
||||||
|
ch <- resp
|
||||||
|
}
|
||||||
|
n.respLk.Unlock()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *NetworkStore) sendRpc(rt NetRPCReqType, cids []cid.Cid, data [][]byte) (uint64, <-chan NetRpcResp, error) {
|
||||||
|
rid := atomic.AddUint64(&n.reqCount, 1)
|
||||||
|
|
||||||
|
respCh := make(chan NetRpcResp, 1) // todo pool?
|
||||||
|
|
||||||
|
n.respLk.Lock()
|
||||||
|
if n.respMap == nil {
|
||||||
|
n.respLk.Unlock()
|
||||||
|
return 0, nil, xerrors.Errorf("netstore closed")
|
||||||
|
}
|
||||||
|
n.respMap[rid] = respCh
|
||||||
|
n.respLk.Unlock()
|
||||||
|
|
||||||
|
req := NetRpcReq{
|
||||||
|
Type: rt,
|
||||||
|
ID: rid,
|
||||||
|
Cid: cids,
|
||||||
|
Data: data,
|
||||||
|
}
|
||||||
|
|
||||||
|
var rbuf bytes.Buffer // todo buffer pool
|
||||||
|
if err := req.MarshalCBOR(&rbuf); err != nil {
|
||||||
|
n.respLk.Lock()
|
||||||
|
defer n.respLk.Unlock()
|
||||||
|
|
||||||
|
if n.respMap == nil {
|
||||||
|
return 0, nil, xerrors.Errorf("netstore closed")
|
||||||
|
}
|
||||||
|
delete(n.respMap, rid)
|
||||||
|
|
||||||
|
return 0, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := n.msgStream.WriteMsg(rbuf.Bytes()); err != nil {
|
||||||
|
n.respLk.Lock()
|
||||||
|
defer n.respLk.Unlock()
|
||||||
|
|
||||||
|
if n.respMap == nil {
|
||||||
|
return 0, nil, xerrors.Errorf("netstore closed")
|
||||||
|
}
|
||||||
|
delete(n.respMap, rid)
|
||||||
|
|
||||||
|
return 0, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return rid, respCh, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *NetworkStore) waitResp(ctx context.Context, rch <-chan NetRpcResp, rid uint64) (NetRpcResp, error) {
|
||||||
|
select {
|
||||||
|
case resp := <-rch:
|
||||||
|
if resp.Type == NRpcErr {
|
||||||
|
var e NetRpcErr
|
||||||
|
if err := e.UnmarshalCBOR(bytes.NewReader(resp.Data)); err != nil {
|
||||||
|
return NetRpcResp{}, xerrors.Errorf("unmarshaling error data: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var err error
|
||||||
|
switch e.Type {
|
||||||
|
case NRpcErrNotFound:
|
||||||
|
if e.Cid != nil {
|
||||||
|
err = ipld.ErrNotFound{
|
||||||
|
Cid: *e.Cid,
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
err = xerrors.Errorf("block not found, but cid was null")
|
||||||
|
}
|
||||||
|
case NRpcErrGeneric:
|
||||||
|
err = xerrors.Errorf("generic error")
|
||||||
|
default:
|
||||||
|
err = xerrors.Errorf("unknown error type")
|
||||||
|
}
|
||||||
|
|
||||||
|
return NetRpcResp{}, xerrors.Errorf("netstore error response: %s (%w)", e.Msg, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return resp, nil
|
||||||
|
case <-ctx.Done():
|
||||||
|
// todo send cancel req
|
||||||
|
|
||||||
|
n.respLk.Lock()
|
||||||
|
if n.respMap != nil {
|
||||||
|
delete(n.respMap, rid)
|
||||||
|
}
|
||||||
|
n.respLk.Unlock()
|
||||||
|
|
||||||
|
return NetRpcResp{}, ctx.Err()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *NetworkStore) Has(ctx context.Context, c cid.Cid) (bool, error) {
|
||||||
|
req, rch, err := n.sendRpc(NRpcHas, []cid.Cid{c}, nil)
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := n.waitResp(ctx, rch, req)
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(resp.Data) != 1 {
|
||||||
|
return false, xerrors.Errorf("expected reposnse length to be 1 byte")
|
||||||
|
}
|
||||||
|
switch resp.Data[0] {
|
||||||
|
case cbg.CborBoolTrue[0]:
|
||||||
|
return true, nil
|
||||||
|
case cbg.CborBoolFalse[0]:
|
||||||
|
return false, nil
|
||||||
|
default:
|
||||||
|
return false, xerrors.Errorf("has: bad response: %x", resp.Data[0])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *NetworkStore) Get(ctx context.Context, c cid.Cid) (blocks.Block, error) {
|
||||||
|
req, rch, err := n.sendRpc(NRpcGet, []cid.Cid{c}, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := n.waitResp(ctx, rch, req)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return blocks.NewBlockWithCid(resp.Data, c)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *NetworkStore) View(ctx context.Context, c cid.Cid, callback func([]byte) error) error {
|
||||||
|
req, rch, err := n.sendRpc(NRpcGet, []cid.Cid{c}, nil)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := n.waitResp(ctx, rch, req)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return callback(resp.Data) // todo return buf to pool
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *NetworkStore) GetSize(ctx context.Context, c cid.Cid) (int, error) {
|
||||||
|
req, rch, err := n.sendRpc(NRpcGetSize, []cid.Cid{c}, nil)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := n.waitResp(ctx, rch, req)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(resp.Data) != 4 {
|
||||||
|
return 0, xerrors.Errorf("expected getsize response to be 4 bytes, was %d", resp.Data)
|
||||||
|
}
|
||||||
|
|
||||||
|
return int(binary.LittleEndian.Uint32(resp.Data)), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *NetworkStore) Put(ctx context.Context, block blocks.Block) error {
|
||||||
|
return n.PutMany(ctx, []blocks.Block{block})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *NetworkStore) PutMany(ctx context.Context, blocks []blocks.Block) error {
|
||||||
|
// todo pool
|
||||||
|
cids := make([]cid.Cid, len(blocks))
|
||||||
|
blkDatas := make([][]byte, len(blocks))
|
||||||
|
for i, block := range blocks {
|
||||||
|
cids[i] = block.Cid()
|
||||||
|
blkDatas[i] = block.RawData()
|
||||||
|
}
|
||||||
|
|
||||||
|
req, rch, err := n.sendRpc(NRpcPut, cids, blkDatas)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = n.waitResp(ctx, rch, req)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *NetworkStore) DeleteBlock(ctx context.Context, c cid.Cid) error {
|
||||||
|
return n.DeleteMany(ctx, []cid.Cid{c})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *NetworkStore) DeleteMany(ctx context.Context, cids []cid.Cid) error {
|
||||||
|
req, rch, err := n.sendRpc(NRpcDelete, cids, nil)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = n.waitResp(ctx, rch, req)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *NetworkStore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) {
|
||||||
|
return nil, xerrors.Errorf("not supported")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *NetworkStore) HashOnRead(enabled bool) {
|
||||||
|
// todo
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*NetworkStore) Flush(context.Context) error { return nil }
|
||||||
|
|
||||||
|
func (n *NetworkStore) Stop(ctx context.Context) error {
|
||||||
|
close(n.closing)
|
||||||
|
|
||||||
|
select {
|
||||||
|
case <-n.closed:
|
||||||
|
return nil
|
||||||
|
case <-ctx.Done():
|
||||||
|
return ctx.Err()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ Blockstore = &NetworkStore{}
|
||||||
@@ -0,0 +1,237 @@
|
|||||||
|
package blockstore
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"context"
|
||||||
|
"encoding/binary"
|
||||||
|
|
||||||
|
"github.com/ipfs/go-cid"
|
||||||
|
ipld "github.com/ipfs/go-ipld-format"
|
||||||
|
block "github.com/ipfs/go-libipfs/blocks"
|
||||||
|
"github.com/libp2p/go-msgio"
|
||||||
|
cbg "github.com/whyrusleeping/cbor-gen"
|
||||||
|
"golang.org/x/xerrors"
|
||||||
|
)
|
||||||
|
|
||||||
|
type NetworkStoreHandler struct {
|
||||||
|
msgStream msgio.ReadWriteCloser
|
||||||
|
|
||||||
|
bs Blockstore
|
||||||
|
}
|
||||||
|
|
||||||
|
// NOTE: This code isn't yet hardened to accept untrusted input. See TODOs here and in net.go
|
||||||
|
func HandleNetBstoreStream(ctx context.Context, bs Blockstore, mss msgio.ReadWriteCloser) *NetworkStoreHandler {
|
||||||
|
ns := &NetworkStoreHandler{
|
||||||
|
msgStream: mss,
|
||||||
|
bs: bs,
|
||||||
|
}
|
||||||
|
|
||||||
|
go ns.handle(ctx)
|
||||||
|
|
||||||
|
return ns
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *NetworkStoreHandler) handle(ctx context.Context) {
|
||||||
|
defer func() {
|
||||||
|
if err := h.msgStream.Close(); err != nil {
|
||||||
|
log.Errorw("error closing blockstore stream", "error", err)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
for {
|
||||||
|
var req NetRpcReq
|
||||||
|
|
||||||
|
ms, err := h.msgStream.ReadMsg()
|
||||||
|
if err != nil {
|
||||||
|
log.Warnw("bstore stream err", "error", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := req.UnmarshalCBOR(bytes.NewReader(ms)); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
h.msgStream.ReleaseMsg(ms)
|
||||||
|
|
||||||
|
switch req.Type {
|
||||||
|
case NRpcHas:
|
||||||
|
if len(req.Cid) != 1 {
|
||||||
|
if err := h.respondError(req.ID, xerrors.New("expected request for 1 cid"), cid.Undef); err != nil {
|
||||||
|
log.Warnw("writing error response", "error", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
res, err := h.bs.Has(ctx, req.Cid[0])
|
||||||
|
if err != nil {
|
||||||
|
if err := h.respondError(req.ID, err, req.Cid[0]); err != nil {
|
||||||
|
log.Warnw("writing error response", "error", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
var resData [1]byte
|
||||||
|
if res {
|
||||||
|
resData[0] = cbg.CborBoolTrue[0]
|
||||||
|
} else {
|
||||||
|
resData[0] = cbg.CborBoolFalse[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := h.respond(req.ID, NRpcOK, resData[:]); err != nil {
|
||||||
|
log.Warnw("writing response", "error", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
case NRpcGet:
|
||||||
|
if len(req.Cid) != 1 {
|
||||||
|
if err := h.respondError(req.ID, xerrors.New("expected request for 1 cid"), cid.Undef); err != nil {
|
||||||
|
log.Warnw("writing error response", "error", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
err := h.bs.View(ctx, req.Cid[0], func(bdata []byte) error {
|
||||||
|
return h.respond(req.ID, NRpcOK, bdata)
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
if err := h.respondError(req.ID, err, req.Cid[0]); err != nil {
|
||||||
|
log.Warnw("writing error response", "error", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
case NRpcGetSize:
|
||||||
|
if len(req.Cid) != 1 {
|
||||||
|
if err := h.respondError(req.ID, xerrors.New("expected request for 1 cid"), cid.Undef); err != nil {
|
||||||
|
log.Warnw("writing error response", "error", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
sz, err := h.bs.GetSize(ctx, req.Cid[0])
|
||||||
|
if err != nil {
|
||||||
|
if err := h.respondError(req.ID, err, req.Cid[0]); err != nil {
|
||||||
|
log.Warnw("writing error response", "error", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
var resData [4]byte
|
||||||
|
binary.LittleEndian.PutUint32(resData[:], uint32(sz))
|
||||||
|
|
||||||
|
if err := h.respond(req.ID, NRpcOK, resData[:]); err != nil {
|
||||||
|
log.Warnw("writing response", "error", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
case NRpcPut:
|
||||||
|
blocks := make([]block.Block, len(req.Cid))
|
||||||
|
|
||||||
|
if len(req.Cid) != len(req.Data) {
|
||||||
|
if err := h.respondError(req.ID, xerrors.New("cid count didn't match data count"), cid.Undef); err != nil {
|
||||||
|
log.Warnw("writing error response", "error", err)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := range req.Cid {
|
||||||
|
blocks[i], err = block.NewBlockWithCid(req.Data[i], req.Cid[i])
|
||||||
|
if err != nil {
|
||||||
|
log.Warnw("make block", "error", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
err := h.bs.PutMany(ctx, blocks)
|
||||||
|
if err != nil {
|
||||||
|
if err := h.respondError(req.ID, err, cid.Undef); err != nil {
|
||||||
|
log.Warnw("writing error response", "error", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := h.respond(req.ID, NRpcOK, []byte{}); err != nil {
|
||||||
|
log.Warnw("writing response", "error", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
case NRpcDelete:
|
||||||
|
err := h.bs.DeleteMany(ctx, req.Cid)
|
||||||
|
if err != nil {
|
||||||
|
if err := h.respondError(req.ID, err, cid.Undef); err != nil {
|
||||||
|
log.Warnw("writing error response", "error", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := h.respond(req.ID, NRpcOK, []byte{}); err != nil {
|
||||||
|
log.Warnw("writing response", "error", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
if err := h.respondError(req.ID, xerrors.New("unsupported request type"), cid.Undef); err != nil {
|
||||||
|
log.Warnw("writing error response", "error", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *NetworkStoreHandler) respondError(req uint64, uerr error, c cid.Cid) error {
|
||||||
|
var resp NetRpcResp
|
||||||
|
resp.ID = req
|
||||||
|
resp.Type = NRpcErr
|
||||||
|
|
||||||
|
nerr := NetRpcErr{
|
||||||
|
Type: NRpcErrGeneric,
|
||||||
|
Msg: uerr.Error(),
|
||||||
|
}
|
||||||
|
if ipld.IsNotFound(uerr) {
|
||||||
|
nerr.Type = NRpcErrNotFound
|
||||||
|
nerr.Cid = &c
|
||||||
|
}
|
||||||
|
|
||||||
|
var edata bytes.Buffer
|
||||||
|
if err := nerr.MarshalCBOR(&edata); err != nil {
|
||||||
|
return xerrors.Errorf("marshaling error data: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
resp.Data = edata.Bytes()
|
||||||
|
|
||||||
|
var msg bytes.Buffer
|
||||||
|
if err := resp.MarshalCBOR(&msg); err != nil {
|
||||||
|
return xerrors.Errorf("marshaling error response: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := h.msgStream.WriteMsg(msg.Bytes()); err != nil {
|
||||||
|
return xerrors.Errorf("write error response: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *NetworkStoreHandler) respond(req uint64, rt NetRPCRespType, data []byte) error {
|
||||||
|
var resp NetRpcResp
|
||||||
|
resp.ID = req
|
||||||
|
resp.Type = rt
|
||||||
|
resp.Data = data
|
||||||
|
|
||||||
|
var msg bytes.Buffer
|
||||||
|
if err := resp.MarshalCBOR(&msg); err != nil {
|
||||||
|
return xerrors.Errorf("marshaling response: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := h.msgStream.WriteMsg(msg.Bytes()); err != nil {
|
||||||
|
return xerrors.Errorf("write response: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
package blockstore
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
ipld "github.com/ipfs/go-ipld-format"
|
||||||
|
block "github.com/ipfs/go-libipfs/blocks"
|
||||||
|
"github.com/libp2p/go-msgio"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestNetBstore(t *testing.T) {
|
||||||
|
ctx := context.Background()
|
||||||
|
|
||||||
|
cr, sw := io.Pipe()
|
||||||
|
sr, cw := io.Pipe()
|
||||||
|
|
||||||
|
cm := msgio.Combine(msgio.NewWriter(cw), msgio.NewReader(cr))
|
||||||
|
sm := msgio.Combine(msgio.NewWriter(sw), msgio.NewReader(sr))
|
||||||
|
|
||||||
|
bbs := NewMemorySync()
|
||||||
|
_ = HandleNetBstoreStream(ctx, bbs, sm)
|
||||||
|
|
||||||
|
nbs := NewNetworkStore(cm)
|
||||||
|
|
||||||
|
tb1 := block.NewBlock([]byte("aoeu"))
|
||||||
|
|
||||||
|
h, err := nbs.Has(ctx, tb1.Cid())
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.False(t, h)
|
||||||
|
|
||||||
|
err = nbs.Put(ctx, tb1)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
h, err = nbs.Has(ctx, tb1.Cid())
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.True(t, h)
|
||||||
|
|
||||||
|
sz, err := nbs.GetSize(ctx, tb1.Cid())
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Equal(t, 4, sz)
|
||||||
|
|
||||||
|
err = nbs.DeleteBlock(ctx, tb1.Cid())
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
h, err = nbs.Has(ctx, tb1.Cid())
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.False(t, h)
|
||||||
|
|
||||||
|
_, err = nbs.Get(ctx, tb1.Cid())
|
||||||
|
fmt.Println(err)
|
||||||
|
require.True(t, ipld.IsNotFound(err))
|
||||||
|
|
||||||
|
err = nbs.Put(ctx, tb1)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
b, err := nbs.Get(ctx, tb1.Cid())
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Equal(t, "aoeu", string(b.RawData()))
|
||||||
|
}
|
||||||
@@ -0,0 +1,100 @@
|
|||||||
|
package blockstore
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/gorilla/websocket"
|
||||||
|
"github.com/libp2p/go-msgio"
|
||||||
|
"golang.org/x/xerrors"
|
||||||
|
)
|
||||||
|
|
||||||
|
type wsWrapper struct {
|
||||||
|
wc *websocket.Conn
|
||||||
|
|
||||||
|
nextMsg []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *wsWrapper) Read(b []byte) (int, error) {
|
||||||
|
return 0, xerrors.New("read unsupported")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *wsWrapper) ReadMsg() ([]byte, error) {
|
||||||
|
if w.nextMsg != nil {
|
||||||
|
nm := w.nextMsg
|
||||||
|
w.nextMsg = nil
|
||||||
|
return nm, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
mt, r, err := w.wc.NextReader()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
switch mt {
|
||||||
|
case websocket.BinaryMessage, websocket.TextMessage:
|
||||||
|
default:
|
||||||
|
return nil, xerrors.Errorf("unexpected message type")
|
||||||
|
}
|
||||||
|
|
||||||
|
// todo pool
|
||||||
|
// todo limit sizes
|
||||||
|
var mbuf bytes.Buffer
|
||||||
|
if _, err := mbuf.ReadFrom(r); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return mbuf.Bytes(), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *wsWrapper) ReleaseMsg(bytes []byte) {
|
||||||
|
// todo use a pool
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *wsWrapper) NextMsgLen() (int, error) {
|
||||||
|
if w.nextMsg != nil {
|
||||||
|
return len(w.nextMsg), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
mt, msg, err := w.wc.ReadMessage()
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
switch mt {
|
||||||
|
case websocket.BinaryMessage, websocket.TextMessage:
|
||||||
|
default:
|
||||||
|
return 0, xerrors.Errorf("unexpected message type")
|
||||||
|
}
|
||||||
|
|
||||||
|
w.nextMsg = msg
|
||||||
|
return len(w.nextMsg), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *wsWrapper) Write(bytes []byte) (int, error) {
|
||||||
|
return 0, xerrors.New("write unsupported")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *wsWrapper) WriteMsg(bytes []byte) error {
|
||||||
|
return w.wc.WriteMessage(websocket.BinaryMessage, bytes)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *wsWrapper) Close() error {
|
||||||
|
return w.wc.Close()
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ msgio.ReadWriteCloser = &wsWrapper{}
|
||||||
|
|
||||||
|
func wsConnToMio(wc *websocket.Conn) msgio.ReadWriteCloser {
|
||||||
|
return &wsWrapper{
|
||||||
|
wc: wc,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func HandleNetBstoreWS(ctx context.Context, bs Blockstore, wc *websocket.Conn) *NetworkStoreHandler {
|
||||||
|
return HandleNetBstoreStream(ctx, bs, wsConnToMio(wc))
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewNetworkStoreWS(wc *websocket.Conn) *NetworkStore {
|
||||||
|
return NewNetworkStore(wsConnToMio(wc))
|
||||||
|
}
|
||||||
@@ -12,8 +12,8 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
blocks "github.com/ipfs/go-block-format"
|
|
||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
|
blocks "github.com/ipfs/go-libipfs/blocks"
|
||||||
"go.uber.org/multierr"
|
"go.uber.org/multierr"
|
||||||
"golang.org/x/xerrors"
|
"golang.org/x/xerrors"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -11,6 +11,8 @@ import (
|
|||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
"golang.org/x/xerrors"
|
"golang.org/x/xerrors"
|
||||||
|
|
||||||
|
"github.com/filecoin-project/lotus/system"
|
||||||
)
|
)
|
||||||
|
|
||||||
type BadgerMarkSetEnv struct {
|
type BadgerMarkSetEnv struct {
|
||||||
@@ -349,7 +351,7 @@ func (s *BadgerMarkSet) write(seqno int) (err error) {
|
|||||||
persist := s.persist
|
persist := s.persist
|
||||||
s.mx.RUnlock()
|
s.mx.RUnlock()
|
||||||
|
|
||||||
if persist {
|
if persist && !system.BadgerFsyncDisable { // WARNING: disabling sync makes recovery from crash during critical section unsound
|
||||||
return s.db.Sync()
|
return s.db.Sync()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
//stm: #unit
|
// stm: #unit
|
||||||
package splitstore
|
package splitstore
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -8,10 +8,10 @@ import (
|
|||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
blocks "github.com/ipfs/go-block-format"
|
|
||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
dstore "github.com/ipfs/go-datastore"
|
dstore "github.com/ipfs/go-datastore"
|
||||||
ipld "github.com/ipfs/go-ipld-format"
|
ipld "github.com/ipfs/go-ipld-format"
|
||||||
|
blocks "github.com/ipfs/go-libipfs/blocks"
|
||||||
logging "github.com/ipfs/go-log/v2"
|
logging "github.com/ipfs/go-log/v2"
|
||||||
"go.opencensus.io/stats"
|
"go.opencensus.io/stats"
|
||||||
"go.uber.org/multierr"
|
"go.uber.org/multierr"
|
||||||
@@ -43,8 +43,16 @@ var (
|
|||||||
// compactionIndexKey stores the compaction index (serial number)
|
// compactionIndexKey stores the compaction index (serial number)
|
||||||
compactionIndexKey = dstore.NewKey("/splitstore/compactionIndex")
|
compactionIndexKey = dstore.NewKey("/splitstore/compactionIndex")
|
||||||
|
|
||||||
|
// stores the prune index (serial number)
|
||||||
|
pruneIndexKey = dstore.NewKey("/splitstore/pruneIndex")
|
||||||
|
|
||||||
|
// stores the base epoch of last prune in the metadata store
|
||||||
|
pruneEpochKey = dstore.NewKey("/splitstore/pruneEpoch")
|
||||||
|
|
||||||
log = logging.Logger("splitstore")
|
log = logging.Logger("splitstore")
|
||||||
|
|
||||||
|
errClosing = errors.New("splitstore is closing")
|
||||||
|
|
||||||
// set this to true if you are debugging the splitstore to enable debug logging
|
// set this to true if you are debugging the splitstore to enable debug logging
|
||||||
enableDebugLog = false
|
enableDebugLog = false
|
||||||
// set this to true if you want to track origin stack traces in the write log
|
// set this to true if you want to track origin stack traces in the write log
|
||||||
@@ -54,6 +62,16 @@ var (
|
|||||||
upgradeBoundary = build.Finality
|
upgradeBoundary = build.Finality
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type CompactType int
|
||||||
|
|
||||||
|
const (
|
||||||
|
none CompactType = iota
|
||||||
|
warmup
|
||||||
|
hot
|
||||||
|
cold
|
||||||
|
check
|
||||||
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
if os.Getenv("LOTUS_SPLITSTORE_DEBUG_LOG") == "1" {
|
if os.Getenv("LOTUS_SPLITSTORE_DEBUG_LOG") == "1" {
|
||||||
enableDebugLog = true
|
enableDebugLog = true
|
||||||
@@ -80,6 +98,10 @@ type Config struct {
|
|||||||
// and directly purges cold blocks.
|
// and directly purges cold blocks.
|
||||||
DiscardColdBlocks bool
|
DiscardColdBlocks bool
|
||||||
|
|
||||||
|
// UniversalColdBlocks indicates whether all blocks being garbage collected and purged
|
||||||
|
// from the hotstore should be written to the cold store
|
||||||
|
UniversalColdBlocks bool
|
||||||
|
|
||||||
// HotstoreMessageRetention indicates the hotstore retention policy for messages.
|
// HotstoreMessageRetention indicates the hotstore retention policy for messages.
|
||||||
// It has the following semantics:
|
// It has the following semantics:
|
||||||
// - a value of 0 will only retain messages within the compaction boundary (4 finalities)
|
// - a value of 0 will only retain messages within the compaction boundary (4 finalities)
|
||||||
@@ -93,6 +115,23 @@ type Config struct {
|
|||||||
// A positive value is the number of compactions before a full GC is performed;
|
// A positive value is the number of compactions before a full GC is performed;
|
||||||
// a value of 1 will perform full GC in every compaction.
|
// a value of 1 will perform full GC in every compaction.
|
||||||
HotStoreFullGCFrequency uint64
|
HotStoreFullGCFrequency uint64
|
||||||
|
|
||||||
|
// HotstoreMaxSpaceTarget suggests the max allowed space the hotstore can take.
|
||||||
|
// This is not a hard limit, it is possible for the hotstore to exceed the target
|
||||||
|
// for example if state grows massively between compactions. The splitstore
|
||||||
|
// will make a best effort to avoid overflowing the target and in practice should
|
||||||
|
// never overflow. This field is used when doing GC at the end of a compaction to
|
||||||
|
// adaptively choose moving GC
|
||||||
|
HotstoreMaxSpaceTarget uint64
|
||||||
|
|
||||||
|
// Moving GC will be triggered when total moving size exceeds
|
||||||
|
// HotstoreMaxSpaceTarget - HotstoreMaxSpaceThreshold
|
||||||
|
HotstoreMaxSpaceThreshold uint64
|
||||||
|
|
||||||
|
// Safety buffer to prevent moving GC from overflowing disk.
|
||||||
|
// Moving GC will not occur when total moving size exceeds
|
||||||
|
// HotstoreMaxSpaceTarget - HotstoreMaxSpaceSafetyBuffer
|
||||||
|
HotstoreMaxSpaceSafetyBuffer uint64
|
||||||
}
|
}
|
||||||
|
|
||||||
// ChainAccessor allows the Splitstore to access the chain. It will most likely
|
// ChainAccessor allows the Splitstore to access the chain. It will most likely
|
||||||
@@ -117,8 +156,9 @@ type hotstore interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type SplitStore struct {
|
type SplitStore struct {
|
||||||
compacting int32 // compaction/prune/warmup in progress
|
compacting int32 // flag for when compaction is in progress
|
||||||
closing int32 // the splitstore is closing
|
compactType CompactType // compaction type, protected by compacting atomic, only meaningful when compacting == 1
|
||||||
|
closing int32 // the splitstore is closing
|
||||||
|
|
||||||
cfg *Config
|
cfg *Config
|
||||||
path string
|
path string
|
||||||
@@ -126,6 +166,7 @@ type SplitStore struct {
|
|||||||
mx sync.Mutex
|
mx sync.Mutex
|
||||||
warmupEpoch abi.ChainEpoch // protected by mx
|
warmupEpoch abi.ChainEpoch // protected by mx
|
||||||
baseEpoch abi.ChainEpoch // protected by compaction lock
|
baseEpoch abi.ChainEpoch // protected by compaction lock
|
||||||
|
pruneEpoch abi.ChainEpoch // protected by compaction lock
|
||||||
|
|
||||||
headChangeMx sync.Mutex
|
headChangeMx sync.Mutex
|
||||||
|
|
||||||
@@ -140,10 +181,17 @@ type SplitStore struct {
|
|||||||
markSetSize int64
|
markSetSize int64
|
||||||
|
|
||||||
compactionIndex int64
|
compactionIndex int64
|
||||||
|
pruneIndex int64
|
||||||
|
onlineGCCnt int64
|
||||||
|
|
||||||
ctx context.Context
|
ctx context.Context
|
||||||
cancel func()
|
cancel func()
|
||||||
|
|
||||||
|
outOfSync int32 // for fast checking
|
||||||
|
chainSyncMx sync.Mutex
|
||||||
|
chainSyncCond sync.Cond
|
||||||
|
chainSyncFinished bool // protected by chainSyncMx
|
||||||
|
|
||||||
debug *debugLog
|
debug *debugLog
|
||||||
|
|
||||||
// transactional protection for concurrent read/writes during compaction
|
// transactional protection for concurrent read/writes during compaction
|
||||||
@@ -170,6 +218,17 @@ type SplitStore struct {
|
|||||||
|
|
||||||
// registered protectors
|
// registered protectors
|
||||||
protectors []func(func(cid.Cid) error) error
|
protectors []func(func(cid.Cid) error) error
|
||||||
|
|
||||||
|
// dag sizes measured during latest compaction
|
||||||
|
// logged and used for GC strategy
|
||||||
|
|
||||||
|
// protected by compaction lock
|
||||||
|
szWalk int64
|
||||||
|
szProtectedTxns int64
|
||||||
|
szKeys int64 // approximate, not counting keys protected when entering critical section
|
||||||
|
|
||||||
|
// protected by txnLk
|
||||||
|
szMarkedLiveRefs int64
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ bstore.Blockstore = (*SplitStore)(nil)
|
var _ bstore.Blockstore = (*SplitStore)(nil)
|
||||||
@@ -207,6 +266,7 @@ func Open(path string, ds dstore.Datastore, hot, cold bstore.Blockstore, cfg *Co
|
|||||||
|
|
||||||
ss.txnViewsCond.L = &ss.txnViewsMx
|
ss.txnViewsCond.L = &ss.txnViewsMx
|
||||||
ss.txnSyncCond.L = &ss.txnSyncMx
|
ss.txnSyncCond.L = &ss.txnSyncMx
|
||||||
|
ss.chainSyncCond.L = &ss.chainSyncMx
|
||||||
ss.ctx, ss.cancel = context.WithCancel(context.Background())
|
ss.ctx, ss.cancel = context.WithCancel(context.Background())
|
||||||
|
|
||||||
ss.reifyCond.L = &ss.reifyMx
|
ss.reifyCond.L = &ss.reifyMx
|
||||||
@@ -227,6 +287,13 @@ func Open(path string, ds dstore.Datastore, hot, cold bstore.Blockstore, cfg *Co
|
|||||||
return nil, xerrors.Errorf("error resuming compaction: %w", err)
|
return nil, xerrors.Errorf("error resuming compaction: %w", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if ss.pruneCheckpointExists() {
|
||||||
|
log.Info("found prune checkpoint; resuming prune")
|
||||||
|
if err := ss.completePrune(); err != nil {
|
||||||
|
markSetEnv.Close() //nolint:errcheck
|
||||||
|
return nil, xerrors.Errorf("error resuming prune: %w", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return ss, nil
|
return ss, nil
|
||||||
}
|
}
|
||||||
@@ -260,8 +327,14 @@ func (s *SplitStore) Has(ctx context.Context, cid cid.Cid) (bool, error) {
|
|||||||
if has {
|
if has {
|
||||||
return s.has(cid)
|
return s.has(cid)
|
||||||
}
|
}
|
||||||
|
switch s.compactType {
|
||||||
return s.cold.Has(ctx, cid)
|
case hot:
|
||||||
|
return s.cold.Has(ctx, cid)
|
||||||
|
case cold:
|
||||||
|
return s.hot.Has(ctx, cid)
|
||||||
|
default:
|
||||||
|
return false, xerrors.Errorf("invalid compaction type %d, only hot and cold allowed for critical section", s.compactType)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
has, err := s.hot.Has(ctx, cid)
|
has, err := s.hot.Has(ctx, cid)
|
||||||
@@ -276,8 +349,11 @@ func (s *SplitStore) Has(ctx context.Context, cid cid.Cid) (bool, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
has, err = s.cold.Has(ctx, cid)
|
has, err = s.cold.Has(ctx, cid)
|
||||||
if has && bstore.IsHotView(ctx) {
|
if has {
|
||||||
s.reifyColdObject(cid)
|
s.trackTxnRef(cid)
|
||||||
|
if bstore.IsHotView(ctx) {
|
||||||
|
s.reifyColdObject(cid)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return has, err
|
return has, err
|
||||||
@@ -307,8 +383,14 @@ func (s *SplitStore) Get(ctx context.Context, cid cid.Cid) (blocks.Block, error)
|
|||||||
if has {
|
if has {
|
||||||
return s.get(cid)
|
return s.get(cid)
|
||||||
}
|
}
|
||||||
|
switch s.compactType {
|
||||||
return s.cold.Get(ctx, cid)
|
case hot:
|
||||||
|
return s.cold.Get(ctx, cid)
|
||||||
|
case cold:
|
||||||
|
return s.hot.Get(ctx, cid)
|
||||||
|
default:
|
||||||
|
return nil, xerrors.Errorf("invalid compaction type %d, only hot and cold allowed for critical section", s.compactType)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
blk, err := s.hot.Get(ctx, cid)
|
blk, err := s.hot.Get(ctx, cid)
|
||||||
@@ -325,6 +407,7 @@ func (s *SplitStore) Get(ctx context.Context, cid cid.Cid) (blocks.Block, error)
|
|||||||
|
|
||||||
blk, err = s.cold.Get(ctx, cid)
|
blk, err = s.cold.Get(ctx, cid)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
|
s.trackTxnRef(cid)
|
||||||
if bstore.IsHotView(ctx) {
|
if bstore.IsHotView(ctx) {
|
||||||
s.reifyColdObject(cid)
|
s.reifyColdObject(cid)
|
||||||
}
|
}
|
||||||
@@ -361,8 +444,14 @@ func (s *SplitStore) GetSize(ctx context.Context, cid cid.Cid) (int, error) {
|
|||||||
if has {
|
if has {
|
||||||
return s.getSize(cid)
|
return s.getSize(cid)
|
||||||
}
|
}
|
||||||
|
switch s.compactType {
|
||||||
return s.cold.GetSize(ctx, cid)
|
case hot:
|
||||||
|
return s.cold.GetSize(ctx, cid)
|
||||||
|
case cold:
|
||||||
|
return s.hot.GetSize(ctx, cid)
|
||||||
|
default:
|
||||||
|
return 0, xerrors.Errorf("invalid compaction type %d, only hot and cold allowed for critical section", s.compactType)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
size, err := s.hot.GetSize(ctx, cid)
|
size, err := s.hot.GetSize(ctx, cid)
|
||||||
@@ -379,6 +468,7 @@ func (s *SplitStore) GetSize(ctx context.Context, cid cid.Cid) (int, error) {
|
|||||||
|
|
||||||
size, err = s.cold.GetSize(ctx, cid)
|
size, err = s.cold.GetSize(ctx, cid)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
|
s.trackTxnRef(cid)
|
||||||
if bstore.IsHotView(ctx) {
|
if bstore.IsHotView(ctx) {
|
||||||
s.reifyColdObject(cid)
|
s.reifyColdObject(cid)
|
||||||
}
|
}
|
||||||
@@ -392,6 +482,23 @@ func (s *SplitStore) GetSize(ctx context.Context, cid cid.Cid) (int, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *SplitStore) Flush(ctx context.Context) error {
|
||||||
|
s.txnLk.RLock()
|
||||||
|
defer s.txnLk.RUnlock()
|
||||||
|
|
||||||
|
if err := s.cold.Flush(ctx); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := s.hot.Flush(ctx); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := s.ds.Sync(ctx, dstore.Key{}); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (s *SplitStore) Put(ctx context.Context, blk blocks.Block) error {
|
func (s *SplitStore) Put(ctx context.Context, blk blocks.Block) error {
|
||||||
if isIdentiyCid(blk.Cid()) {
|
if isIdentiyCid(blk.Cid()) {
|
||||||
return nil
|
return nil
|
||||||
@@ -408,12 +515,12 @@ func (s *SplitStore) Put(ctx context.Context, blk blocks.Block) error {
|
|||||||
s.debug.LogWrite(blk)
|
s.debug.LogWrite(blk)
|
||||||
|
|
||||||
// critical section
|
// critical section
|
||||||
if s.txnMarkSet != nil {
|
if s.txnMarkSet != nil && s.compactType == hot { // puts only touch hot store
|
||||||
s.markLiveRefs([]cid.Cid{blk.Cid()})
|
s.markLiveRefs([]cid.Cid{blk.Cid()})
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
s.trackTxnRef(blk.Cid())
|
s.trackTxnRef(blk.Cid())
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -459,12 +566,12 @@ func (s *SplitStore) PutMany(ctx context.Context, blks []blocks.Block) error {
|
|||||||
s.debug.LogWriteMany(blks)
|
s.debug.LogWriteMany(blks)
|
||||||
|
|
||||||
// critical section
|
// critical section
|
||||||
if s.txnMarkSet != nil {
|
if s.txnMarkSet != nil && s.compactType == hot { // puts only touch hot store
|
||||||
s.markLiveRefs(batch)
|
s.markLiveRefs(batch)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
s.trackTxnRefMany(batch)
|
s.trackTxnRefMany(batch)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -536,8 +643,14 @@ func (s *SplitStore) View(ctx context.Context, cid cid.Cid, cb func([]byte) erro
|
|||||||
if has {
|
if has {
|
||||||
return s.view(cid, cb)
|
return s.view(cid, cb)
|
||||||
}
|
}
|
||||||
|
switch s.compactType {
|
||||||
return s.cold.View(ctx, cid, cb)
|
case hot:
|
||||||
|
return s.cold.View(ctx, cid, cb)
|
||||||
|
case cold:
|
||||||
|
return s.hot.View(ctx, cid, cb)
|
||||||
|
default:
|
||||||
|
return xerrors.Errorf("invalid compaction type %d, only hot and cold allowed for critical section", s.compactType)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// views are (optimistically) protected two-fold:
|
// views are (optimistically) protected two-fold:
|
||||||
@@ -623,6 +736,23 @@ func (s *SplitStore) Start(chain ChainAccessor, us stmgr.UpgradeSchedule) error
|
|||||||
return xerrors.Errorf("error loading base epoch: %w", err)
|
return xerrors.Errorf("error loading base epoch: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// load prune epoch from metadata ds
|
||||||
|
bs, err = s.ds.Get(s.ctx, pruneEpochKey)
|
||||||
|
switch err {
|
||||||
|
case nil:
|
||||||
|
s.pruneEpoch = bytesToEpoch(bs)
|
||||||
|
case dstore.ErrNotFound:
|
||||||
|
if curTs == nil {
|
||||||
|
//this can happen in some tests
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if err := s.setPruneEpoch(curTs.Height()); err != nil {
|
||||||
|
return xerrors.Errorf("error saving prune epoch: %w", err)
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return xerrors.Errorf("error loading prune epoch: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
// load warmup epoch from metadata ds
|
// load warmup epoch from metadata ds
|
||||||
bs, err = s.ds.Get(s.ctx, warmupEpochKey)
|
bs, err = s.ds.Get(s.ctx, warmupEpochKey)
|
||||||
switch err {
|
switch err {
|
||||||
@@ -698,6 +828,11 @@ func (s *SplitStore) Close() error {
|
|||||||
s.txnSyncCond.Broadcast()
|
s.txnSyncCond.Broadcast()
|
||||||
s.txnSyncMx.Unlock()
|
s.txnSyncMx.Unlock()
|
||||||
|
|
||||||
|
s.chainSyncMx.Lock()
|
||||||
|
s.chainSyncFinished = true
|
||||||
|
s.chainSyncCond.Broadcast()
|
||||||
|
s.chainSyncMx.Unlock()
|
||||||
|
|
||||||
log.Warn("close with ongoing compaction in progress; waiting for it to finish...")
|
log.Warn("close with ongoing compaction in progress; waiting for it to finish...")
|
||||||
for atomic.LoadInt32(&s.compacting) == 1 {
|
for atomic.LoadInt32(&s.compacting) == 1 {
|
||||||
time.Sleep(time.Second)
|
time.Sleep(time.Second)
|
||||||
@@ -722,3 +857,8 @@ func (s *SplitStore) setBaseEpoch(epoch abi.ChainEpoch) error {
|
|||||||
s.baseEpoch = epoch
|
s.baseEpoch = epoch
|
||||||
return s.ds.Put(s.ctx, baseEpochKey, epochToBytes(epoch))
|
return s.ds.Put(s.ctx, baseEpochKey, epochToBytes(epoch))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *SplitStore) setPruneEpoch(epoch abi.ChainEpoch) error {
|
||||||
|
s.pruneEpoch = epoch
|
||||||
|
return s.ds.Put(s.ctx, pruneEpochKey, epochToBytes(epoch))
|
||||||
|
}
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ func (s *SplitStore) Check() error {
|
|||||||
if !atomic.CompareAndSwapInt32(&s.compacting, 0, 1) {
|
if !atomic.CompareAndSwapInt32(&s.compacting, 0, 1) {
|
||||||
return xerrors.Errorf("can't acquire compaction lock; compacting operation in progress")
|
return xerrors.Errorf("can't acquire compaction lock; compacting operation in progress")
|
||||||
}
|
}
|
||||||
|
s.compactType = check
|
||||||
|
|
||||||
if s.compactionIndex == 0 {
|
if s.compactionIndex == 0 {
|
||||||
atomic.StoreInt32(&s.compacting, 0)
|
atomic.StoreInt32(&s.compacting, 0)
|
||||||
@@ -94,7 +95,7 @@ func (s *SplitStore) doCheck(curTs *types.TipSet) error {
|
|||||||
}
|
}
|
||||||
defer visitor.Close() //nolint
|
defer visitor.Close() //nolint
|
||||||
|
|
||||||
err = s.walkChain(curTs, boundaryEpoch, boundaryEpoch, visitor,
|
size := s.walkChain(curTs, boundaryEpoch, boundaryEpoch, visitor,
|
||||||
func(c cid.Cid) error {
|
func(c cid.Cid) error {
|
||||||
if isUnitaryObject(c) {
|
if isUnitaryObject(c) {
|
||||||
return errStopWalk
|
return errStopWalk
|
||||||
@@ -124,7 +125,7 @@ func (s *SplitStore) doCheck(curTs *types.TipSet) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
})
|
}, func(cid.Cid) error { return nil })
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err = xerrors.Errorf("error walking chain: %w", err)
|
err = xerrors.Errorf("error walking chain: %w", err)
|
||||||
@@ -132,7 +133,7 @@ func (s *SplitStore) doCheck(curTs *types.TipSet) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Infow("check done", "cold", *coldCnt, "missing", *missingCnt)
|
log.Infow("check done", "cold", *coldCnt, "missing", *missingCnt, "walk size", size)
|
||||||
write("--")
|
write("--")
|
||||||
write("cold: %d missing: %d", *coldCnt, *missingCnt)
|
write("cold: %d missing: %d", *coldCnt, *missingCnt)
|
||||||
write("DONE")
|
write("DONE")
|
||||||
@@ -146,6 +147,8 @@ func (s *SplitStore) Info() map[string]interface{} {
|
|||||||
info["base epoch"] = s.baseEpoch
|
info["base epoch"] = s.baseEpoch
|
||||||
info["warmup epoch"] = s.warmupEpoch
|
info["warmup epoch"] = s.warmupEpoch
|
||||||
info["compactions"] = s.compactionIndex
|
info["compactions"] = s.compactionIndex
|
||||||
|
info["prunes"] = s.pruneIndex
|
||||||
|
info["compacting"] = s.compacting == 1
|
||||||
|
|
||||||
sizer, ok := s.hot.(bstore.BlockstoreSize)
|
sizer, ok := s.hot.(bstore.BlockstoreSize)
|
||||||
if ok {
|
if ok {
|
||||||
|
|||||||
@@ -10,9 +10,9 @@ import (
|
|||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
blocks "github.com/ipfs/go-block-format"
|
|
||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
ipld "github.com/ipfs/go-ipld-format"
|
ipld "github.com/ipfs/go-ipld-format"
|
||||||
|
blocks "github.com/ipfs/go-libipfs/blocks"
|
||||||
cbg "github.com/whyrusleeping/cbor-gen"
|
cbg "github.com/whyrusleeping/cbor-gen"
|
||||||
"go.opencensus.io/stats"
|
"go.opencensus.io/stats"
|
||||||
"golang.org/x/sync/errgroup"
|
"golang.org/x/sync/errgroup"
|
||||||
@@ -52,6 +52,12 @@ var (
|
|||||||
// SyncWaitTime is the time delay from a tipset's min timestamp before we decide
|
// SyncWaitTime is the time delay from a tipset's min timestamp before we decide
|
||||||
// we have synced.
|
// we have synced.
|
||||||
SyncWaitTime = 30 * time.Second
|
SyncWaitTime = 30 * time.Second
|
||||||
|
|
||||||
|
// This is a testing flag that should always be true when running a node. itests rely on the rough hack
|
||||||
|
// of starting genesis so far in the past that they exercise catchup mining to mine
|
||||||
|
// blocks quickly and so disabling syncgap checking is necessary to test compaction
|
||||||
|
// without a deep structural improvement of itests.
|
||||||
|
CheckSyncGap = true
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -60,7 +66,8 @@ var (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
batchSize = 16384
|
batchSize = 16384
|
||||||
|
cidKeySize = 128
|
||||||
)
|
)
|
||||||
|
|
||||||
func (s *SplitStore) HeadChange(_, apply []*types.TipSet) error {
|
func (s *SplitStore) HeadChange(_, apply []*types.TipSet) error {
|
||||||
@@ -81,10 +88,38 @@ func (s *SplitStore) HeadChange(_, apply []*types.TipSet) error {
|
|||||||
// this is guaranteed by the chainstore, and it is pervasive in all lotus
|
// this is guaranteed by the chainstore, and it is pervasive in all lotus
|
||||||
// -- if that ever changes then all hell will break loose in general and
|
// -- if that ever changes then all hell will break loose in general and
|
||||||
// we will have a rance to protectTipSets here.
|
// we will have a rance to protectTipSets here.
|
||||||
// Reagrdless, we put a mutex in HeadChange just to be safe
|
// Regardless, we put a mutex in HeadChange just to be safe
|
||||||
|
|
||||||
if !atomic.CompareAndSwapInt32(&s.compacting, 0, 1) {
|
if !atomic.CompareAndSwapInt32(&s.compacting, 0, 1) {
|
||||||
// we are currently compacting -- protect the new tipset(s)
|
// we are currently compacting
|
||||||
|
// 1. Signal sync condition to yield compaction when out of sync and resume when in sync
|
||||||
|
timestamp := time.Unix(int64(curTs.MinTimestamp()), 0)
|
||||||
|
if CheckSyncGap && time.Since(timestamp) > SyncGapTime {
|
||||||
|
/* Chain out of sync */
|
||||||
|
if atomic.CompareAndSwapInt32(&s.outOfSync, 0, 1) {
|
||||||
|
// transition from in sync to out of sync
|
||||||
|
s.chainSyncMx.Lock()
|
||||||
|
s.chainSyncFinished = false
|
||||||
|
s.chainSyncMx.Unlock()
|
||||||
|
}
|
||||||
|
// already out of sync, no signaling necessary
|
||||||
|
|
||||||
|
}
|
||||||
|
// TODO: ok to use hysteresis with no transitions between 30s and 1m?
|
||||||
|
if time.Since(timestamp) < SyncWaitTime {
|
||||||
|
/* Chain in sync */
|
||||||
|
if atomic.CompareAndSwapInt32(&s.outOfSync, 0, 0) {
|
||||||
|
// already in sync, no signaling necessary
|
||||||
|
} else {
|
||||||
|
// transition from out of sync to in sync
|
||||||
|
s.chainSyncMx.Lock()
|
||||||
|
s.chainSyncFinished = true
|
||||||
|
s.chainSyncCond.Broadcast()
|
||||||
|
s.chainSyncMx.Unlock()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
// 2. protect the new tipset(s)
|
||||||
s.protectTipSets(apply)
|
s.protectTipSets(apply)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -96,7 +131,8 @@ func (s *SplitStore) HeadChange(_, apply []*types.TipSet) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
timestamp := time.Unix(int64(curTs.MinTimestamp()), 0)
|
timestamp := time.Unix(int64(curTs.MinTimestamp()), 0)
|
||||||
if time.Since(timestamp) > SyncGapTime {
|
|
||||||
|
if CheckSyncGap && time.Since(timestamp) > SyncGapTime {
|
||||||
// don't attempt compaction before we have caught up syncing
|
// don't attempt compaction before we have caught up syncing
|
||||||
atomic.StoreInt32(&s.compacting, 0)
|
atomic.StoreInt32(&s.compacting, 0)
|
||||||
return nil
|
return nil
|
||||||
@@ -111,6 +147,7 @@ func (s *SplitStore) HeadChange(_, apply []*types.TipSet) error {
|
|||||||
if epoch-s.baseEpoch > CompactionThreshold {
|
if epoch-s.baseEpoch > CompactionThreshold {
|
||||||
// it's time to compact -- prepare the transaction and go!
|
// it's time to compact -- prepare the transaction and go!
|
||||||
s.beginTxnProtect()
|
s.beginTxnProtect()
|
||||||
|
s.compactType = hot
|
||||||
go func() {
|
go func() {
|
||||||
defer atomic.StoreInt32(&s.compacting, 0)
|
defer atomic.StoreInt32(&s.compacting, 0)
|
||||||
defer s.endTxnProtect()
|
defer s.endTxnProtect()
|
||||||
@@ -122,6 +159,7 @@ func (s *SplitStore) HeadChange(_, apply []*types.TipSet) error {
|
|||||||
|
|
||||||
log.Infow("compaction done", "took", time.Since(start))
|
log.Infow("compaction done", "took", time.Since(start))
|
||||||
}()
|
}()
|
||||||
|
// only prune if auto prune is enabled and after at least one compaction
|
||||||
} else {
|
} else {
|
||||||
// no compaction necessary
|
// no compaction necessary
|
||||||
atomic.StoreInt32(&s.compacting, 0)
|
atomic.StoreInt32(&s.compacting, 0)
|
||||||
@@ -165,6 +203,8 @@ func (s *SplitStore) protectTipSets(apply []*types.TipSet) {
|
|||||||
timestamp := time.Unix(int64(curTs.MinTimestamp()), 0)
|
timestamp := time.Unix(int64(curTs.MinTimestamp()), 0)
|
||||||
doSync := time.Since(timestamp) < SyncWaitTime
|
doSync := time.Since(timestamp) < SyncWaitTime
|
||||||
go func() {
|
go func() {
|
||||||
|
// we are holding the txnLk while marking
|
||||||
|
// so critical section cannot delete
|
||||||
if doSync {
|
if doSync {
|
||||||
defer func() {
|
defer func() {
|
||||||
s.txnSyncMx.Lock()
|
s.txnSyncMx.Lock()
|
||||||
@@ -188,9 +228,11 @@ func (s *SplitStore) markLiveRefs(cids []cid.Cid) {
|
|||||||
log.Debugf("marking %d live refs", len(cids))
|
log.Debugf("marking %d live refs", len(cids))
|
||||||
startMark := time.Now()
|
startMark := time.Now()
|
||||||
|
|
||||||
|
szMarked := new(int64)
|
||||||
|
|
||||||
count := new(int32)
|
count := new(int32)
|
||||||
visitor := newConcurrentVisitor()
|
visitor := newConcurrentVisitor()
|
||||||
walkObject := func(c cid.Cid) error {
|
walkObject := func(c cid.Cid) (int64, error) {
|
||||||
return s.walkObjectIncomplete(c, visitor,
|
return s.walkObjectIncomplete(c, visitor,
|
||||||
func(c cid.Cid) error {
|
func(c cid.Cid) error {
|
||||||
if isUnitaryObject(c) {
|
if isUnitaryObject(c) {
|
||||||
@@ -217,10 +259,12 @@ func (s *SplitStore) markLiveRefs(cids []cid.Cid) {
|
|||||||
|
|
||||||
// optimize the common case of single put
|
// optimize the common case of single put
|
||||||
if len(cids) == 1 {
|
if len(cids) == 1 {
|
||||||
if err := walkObject(cids[0]); err != nil {
|
sz, err := walkObject(cids[0])
|
||||||
|
if err != nil {
|
||||||
log.Errorf("error marking tipset refs: %s", err)
|
log.Errorf("error marking tipset refs: %s", err)
|
||||||
}
|
}
|
||||||
log.Debugw("marking live refs done", "took", time.Since(startMark), "marked", *count)
|
log.Debugw("marking live refs done", "took", time.Since(startMark), "marked", *count)
|
||||||
|
atomic.AddInt64(szMarked, sz)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -232,9 +276,11 @@ func (s *SplitStore) markLiveRefs(cids []cid.Cid) {
|
|||||||
|
|
||||||
worker := func() error {
|
worker := func() error {
|
||||||
for c := range workch {
|
for c := range workch {
|
||||||
if err := walkObject(c); err != nil {
|
sz, err := walkObject(c)
|
||||||
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
atomic.AddInt64(szMarked, sz)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@@ -257,7 +303,8 @@ func (s *SplitStore) markLiveRefs(cids []cid.Cid) {
|
|||||||
log.Errorf("error marking tipset refs: %s", err)
|
log.Errorf("error marking tipset refs: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Debugw("marking live refs done", "took", time.Since(startMark), "marked", *count)
|
log.Debugw("marking live refs done", "took", time.Since(startMark), "marked", *count, "size marked", *szMarked)
|
||||||
|
s.szMarkedLiveRefs += atomic.LoadInt64(szMarked)
|
||||||
}
|
}
|
||||||
|
|
||||||
// transactionally protect a view
|
// transactionally protect a view
|
||||||
@@ -350,6 +397,7 @@ func (s *SplitStore) protectTxnRefs(markSet MarkSet) error {
|
|||||||
|
|
||||||
log.Infow("protecting transactional references", "refs", len(txnRefs))
|
log.Infow("protecting transactional references", "refs", len(txnRefs))
|
||||||
count := 0
|
count := 0
|
||||||
|
sz := new(int64)
|
||||||
workch := make(chan cid.Cid, len(txnRefs))
|
workch := make(chan cid.Cid, len(txnRefs))
|
||||||
startProtect := time.Now()
|
startProtect := time.Now()
|
||||||
|
|
||||||
@@ -382,10 +430,11 @@ func (s *SplitStore) protectTxnRefs(markSet MarkSet) error {
|
|||||||
|
|
||||||
worker := func() error {
|
worker := func() error {
|
||||||
for c := range workch {
|
for c := range workch {
|
||||||
err := s.doTxnProtect(c, markSet)
|
szTxn, err := s.doTxnProtect(c, markSet)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return xerrors.Errorf("error protecting transactional references to %s: %w", c, err)
|
return xerrors.Errorf("error protecting transactional references to %s: %w", c, err)
|
||||||
}
|
}
|
||||||
|
atomic.AddInt64(sz, szTxn)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -398,16 +447,16 @@ func (s *SplitStore) protectTxnRefs(markSet MarkSet) error {
|
|||||||
if err := g.Wait(); err != nil {
|
if err := g.Wait(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
s.szProtectedTxns += atomic.LoadInt64(sz)
|
||||||
log.Infow("protecting transactional refs done", "took", time.Since(startProtect), "protected", count)
|
log.Infow("protecting transactional refs done", "took", time.Since(startProtect), "protected", count, "protected size", sz)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// transactionally protect a reference by walking the object and marking.
|
// transactionally protect a reference by walking the object and marking.
|
||||||
// concurrent markings are short circuited by checking the markset.
|
// concurrent markings are short circuited by checking the markset.
|
||||||
func (s *SplitStore) doTxnProtect(root cid.Cid, markSet MarkSet) error {
|
func (s *SplitStore) doTxnProtect(root cid.Cid, markSet MarkSet) (int64, error) {
|
||||||
if err := s.checkClosing(); err != nil {
|
if err := s.checkYield(); err != nil {
|
||||||
return err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Note: cold objects are deleted heaviest first, so the consituents of an object
|
// Note: cold objects are deleted heaviest first, so the consituents of an object
|
||||||
@@ -431,7 +480,7 @@ func (s *SplitStore) doTxnProtect(root cid.Cid, markSet MarkSet) error {
|
|||||||
},
|
},
|
||||||
func(c cid.Cid) error {
|
func(c cid.Cid) error {
|
||||||
if s.txnMissing != nil {
|
if s.txnMissing != nil {
|
||||||
log.Warnf("missing object reference %s in %s", c, root)
|
log.Debugf("missing object reference %s in %s", c, root)
|
||||||
s.txnRefsMx.Lock()
|
s.txnRefsMx.Lock()
|
||||||
s.txnMissing[c] = struct{}{}
|
s.txnMissing[c] = struct{}{}
|
||||||
s.txnRefsMx.Unlock()
|
s.txnRefsMx.Unlock()
|
||||||
@@ -474,6 +523,7 @@ func (s *SplitStore) applyProtectors() error {
|
|||||||
// - At this point we are ready to begin purging:
|
// - At this point we are ready to begin purging:
|
||||||
// - We sort cold objects heaviest first, so as to never delete the consituents of a DAG before the DAG itself (which would leave dangling references)
|
// - We sort cold objects heaviest first, so as to never delete the consituents of a DAG before the DAG itself (which would leave dangling references)
|
||||||
// - We delete in small batches taking a lock; each batch is checked again for marks, from the concurrent transactional mark, so as to never delete anything live
|
// - We delete in small batches taking a lock; each batch is checked again for marks, from the concurrent transactional mark, so as to never delete anything live
|
||||||
|
//
|
||||||
// - We then end the transaction and compact/gc the hotstore.
|
// - We then end the transaction and compact/gc the hotstore.
|
||||||
func (s *SplitStore) compact(curTs *types.TipSet) {
|
func (s *SplitStore) compact(curTs *types.TipSet) {
|
||||||
log.Info("waiting for active views to complete")
|
log.Info("waiting for active views to complete")
|
||||||
@@ -497,6 +547,7 @@ func (s *SplitStore) doCompact(curTs *types.TipSet) error {
|
|||||||
// might be potentially inconsistent; abort compaction and notify the user to intervene.
|
// might be potentially inconsistent; abort compaction and notify the user to intervene.
|
||||||
return xerrors.Errorf("checkpoint exists; aborting compaction")
|
return xerrors.Errorf("checkpoint exists; aborting compaction")
|
||||||
}
|
}
|
||||||
|
s.clearSizeMeasurements()
|
||||||
|
|
||||||
currentEpoch := curTs.Height()
|
currentEpoch := curTs.Height()
|
||||||
boundaryEpoch := currentEpoch - CompactionBoundary
|
boundaryEpoch := currentEpoch - CompactionBoundary
|
||||||
@@ -516,7 +567,13 @@ func (s *SplitStore) doCompact(curTs *types.TipSet) error {
|
|||||||
defer markSet.Close() //nolint:errcheck
|
defer markSet.Close() //nolint:errcheck
|
||||||
defer s.debug.Flush()
|
defer s.debug.Flush()
|
||||||
|
|
||||||
if err := s.checkClosing(); err != nil {
|
coldSet, err := s.markSetEnv.New("cold", s.markSetSize)
|
||||||
|
if err != nil {
|
||||||
|
return xerrors.Errorf("error creating cold mark set: %w", err)
|
||||||
|
}
|
||||||
|
defer coldSet.Close() //nolint:errcheck
|
||||||
|
|
||||||
|
if err := s.checkYield(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -534,25 +591,52 @@ func (s *SplitStore) doCompact(curTs *types.TipSet) error {
|
|||||||
startMark := time.Now()
|
startMark := time.Now()
|
||||||
|
|
||||||
count := new(int64)
|
count := new(int64)
|
||||||
err = s.walkChain(curTs, boundaryEpoch, inclMsgsEpoch, &noopVisitor{},
|
|
||||||
func(c cid.Cid) error {
|
|
||||||
if isUnitaryObject(c) {
|
|
||||||
return errStopWalk
|
|
||||||
}
|
|
||||||
|
|
||||||
visit, err := markSet.Visit(c)
|
coldCount := new(int64)
|
||||||
if err != nil {
|
fCold := func(c cid.Cid) error {
|
||||||
return xerrors.Errorf("error visiting object: %w", err)
|
// Writes to cold set optimized away in universal and discard mode
|
||||||
}
|
//
|
||||||
|
// Nothing gets written to cold store in discard mode so no cold objects to write
|
||||||
if !visit {
|
// Everything not marked hot gets written to cold store in universal mode so no need to track cold objects separately
|
||||||
return errStopWalk
|
if s.cfg.DiscardColdBlocks || s.cfg.UniversalColdBlocks {
|
||||||
}
|
|
||||||
|
|
||||||
atomic.AddInt64(count, 1)
|
|
||||||
return nil
|
return nil
|
||||||
})
|
}
|
||||||
|
|
||||||
|
if isUnitaryObject(c) {
|
||||||
|
return errStopWalk
|
||||||
|
}
|
||||||
|
|
||||||
|
visit, err := coldSet.Visit(c)
|
||||||
|
if err != nil {
|
||||||
|
return xerrors.Errorf("error visiting object: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !visit {
|
||||||
|
return errStopWalk
|
||||||
|
}
|
||||||
|
|
||||||
|
atomic.AddInt64(coldCount, 1)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
fHot := func(c cid.Cid) error {
|
||||||
|
if isUnitaryObject(c) {
|
||||||
|
return errStopWalk
|
||||||
|
}
|
||||||
|
|
||||||
|
visit, err := markSet.Visit(c)
|
||||||
|
if err != nil {
|
||||||
|
return xerrors.Errorf("error visiting object: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !visit {
|
||||||
|
return errStopWalk
|
||||||
|
}
|
||||||
|
|
||||||
|
atomic.AddInt64(count, 1)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
err = s.walkChain(curTs, boundaryEpoch, inclMsgsEpoch, &noopVisitor{}, fHot, fCold)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return xerrors.Errorf("error marking: %w", err)
|
return xerrors.Errorf("error marking: %w", err)
|
||||||
}
|
}
|
||||||
@@ -561,7 +645,7 @@ func (s *SplitStore) doCompact(curTs *types.TipSet) error {
|
|||||||
|
|
||||||
log.Infow("marking done", "took", time.Since(startMark), "marked", *count)
|
log.Infow("marking done", "took", time.Since(startMark), "marked", *count)
|
||||||
|
|
||||||
if err := s.checkClosing(); err != nil {
|
if err := s.checkYield(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -571,7 +655,7 @@ func (s *SplitStore) doCompact(curTs *types.TipSet) error {
|
|||||||
return xerrors.Errorf("error protecting transactional refs: %w", err)
|
return xerrors.Errorf("error protecting transactional refs: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := s.checkClosing(); err != nil {
|
if err := s.checkYield(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -585,9 +669,14 @@ func (s *SplitStore) doCompact(curTs *types.TipSet) error {
|
|||||||
}
|
}
|
||||||
defer coldw.Close() //nolint:errcheck
|
defer coldw.Close() //nolint:errcheck
|
||||||
|
|
||||||
// some stats for logging
|
purgew, err := NewColdSetWriter(s.discardSetPath())
|
||||||
var hotCnt, coldCnt int
|
if err != nil {
|
||||||
|
return xerrors.Errorf("error creating deadset: %w", err)
|
||||||
|
}
|
||||||
|
defer purgew.Close() //nolint:errcheck
|
||||||
|
|
||||||
|
// some stats for logging
|
||||||
|
var hotCnt, coldCnt, purgeCnt int64
|
||||||
err = s.hot.ForEachKey(func(c cid.Cid) error {
|
err = s.hot.ForEachKey(func(c cid.Cid) error {
|
||||||
// was it marked?
|
// was it marked?
|
||||||
mark, err := markSet.Has(c)
|
mark, err := markSet.Has(c)
|
||||||
@@ -600,30 +689,50 @@ func (s *SplitStore) doCompact(curTs *types.TipSet) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// it's cold, mark it as candidate for move
|
// it needs to be removed from hot store, mark it as candidate for purge
|
||||||
|
if err := purgew.Write(c); err != nil {
|
||||||
|
return xerrors.Errorf("error writing cid to purge set: %w", err)
|
||||||
|
}
|
||||||
|
purgeCnt++
|
||||||
|
|
||||||
|
coldMark, err := coldSet.Has(c)
|
||||||
|
if err != nil {
|
||||||
|
return xerrors.Errorf("error checking cold mark set for %s: %w", c, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Discard mode: coldMark == false, s.cfg.UniversalColdBlocks == false, always return here, no writes to cold store
|
||||||
|
// Universal mode: coldMark == false, s.cfg.UniversalColdBlocks == true, never stop here, all writes to cold store
|
||||||
|
// Otherwise: s.cfg.UniversalColdBlocks == false, if !coldMark stop here and don't write to cold store, if coldMark continue and write to cold store
|
||||||
|
if !coldMark && !s.cfg.UniversalColdBlocks { // universal mode means mark everything as cold
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// it's cold, mark as candidate for move
|
||||||
if err := coldw.Write(c); err != nil {
|
if err := coldw.Write(c); err != nil {
|
||||||
return xerrors.Errorf("error writing cid to coldstore: %w", err)
|
return xerrors.Errorf("error writing cid to cold set")
|
||||||
}
|
}
|
||||||
coldCnt++
|
coldCnt++
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return xerrors.Errorf("error collecting cold objects: %w", err)
|
return xerrors.Errorf("error collecting cold objects: %w", err)
|
||||||
}
|
}
|
||||||
|
if err := purgew.Close(); err != nil {
|
||||||
|
return xerrors.Errorf("erroring closing purgeset: %w", err)
|
||||||
|
}
|
||||||
if err := coldw.Close(); err != nil {
|
if err := coldw.Close(); err != nil {
|
||||||
return xerrors.Errorf("error closing coldset: %w", err)
|
return xerrors.Errorf("error closing coldset: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Infow("cold collection done", "took", time.Since(startCollect))
|
log.Infow("cold collection done", "took", time.Since(startCollect))
|
||||||
|
|
||||||
log.Infow("compaction stats", "hot", hotCnt, "cold", coldCnt)
|
log.Infow("compaction stats", "hot", hotCnt, "cold", coldCnt, "purge", purgeCnt)
|
||||||
stats.Record(s.ctx, metrics.SplitstoreCompactionHot.M(int64(hotCnt)))
|
s.szKeys = hotCnt * cidKeySize
|
||||||
stats.Record(s.ctx, metrics.SplitstoreCompactionCold.M(int64(coldCnt)))
|
stats.Record(s.ctx, metrics.SplitstoreCompactionHot.M(hotCnt))
|
||||||
|
stats.Record(s.ctx, metrics.SplitstoreCompactionCold.M(coldCnt))
|
||||||
|
|
||||||
if err := s.checkClosing(); err != nil {
|
if err := s.checkYield(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -632,7 +741,7 @@ func (s *SplitStore) doCompact(curTs *types.TipSet) error {
|
|||||||
// possibly delete objects we didn't have when we were collecting cold objects)
|
// possibly delete objects we didn't have when we were collecting cold objects)
|
||||||
s.waitForMissingRefs(markSet)
|
s.waitForMissingRefs(markSet)
|
||||||
|
|
||||||
if err := s.checkClosing(); err != nil {
|
if err := s.checkYield(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -652,7 +761,7 @@ func (s *SplitStore) doCompact(curTs *types.TipSet) error {
|
|||||||
}
|
}
|
||||||
log.Infow("moving done", "took", time.Since(startMove))
|
log.Infow("moving done", "took", time.Since(startMove))
|
||||||
|
|
||||||
if err := s.checkClosing(); err != nil {
|
if err := s.checkYield(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -661,6 +770,12 @@ func (s *SplitStore) doCompact(curTs *types.TipSet) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
purger, err := NewColdSetReader(s.discardSetPath())
|
||||||
|
if err != nil {
|
||||||
|
return xerrors.Errorf("error opening coldset: %w", err)
|
||||||
|
}
|
||||||
|
defer purger.Close() //nolint:errcheck
|
||||||
|
|
||||||
// 4. Purge cold objects with checkpointing for recovery.
|
// 4. Purge cold objects with checkpointing for recovery.
|
||||||
// This is the critical section of compaction, whereby any cold object not in the markSet is
|
// This is the critical section of compaction, whereby any cold object not in the markSet is
|
||||||
// considered already deleted.
|
// considered already deleted.
|
||||||
@@ -677,7 +792,7 @@ func (s *SplitStore) doCompact(curTs *types.TipSet) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// wait for the head to catch up so that the current tipset is marked
|
// wait for the head to catch up so that the current tipset is marked
|
||||||
s.waitForSync()
|
s.waitForTxnSync()
|
||||||
|
|
||||||
if err := s.checkClosing(); err != nil {
|
if err := s.checkClosing(); err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -692,13 +807,13 @@ func (s *SplitStore) doCompact(curTs *types.TipSet) error {
|
|||||||
// 5. purge cold objects from the hotstore, taking protected references into account
|
// 5. purge cold objects from the hotstore, taking protected references into account
|
||||||
log.Info("purging cold objects from the hotstore")
|
log.Info("purging cold objects from the hotstore")
|
||||||
startPurge := time.Now()
|
startPurge := time.Now()
|
||||||
err = s.purge(coldr, checkpoint, markSet)
|
err = s.purge(purger, checkpoint, markSet)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return xerrors.Errorf("error purging cold objects: %w", err)
|
return xerrors.Errorf("error purging cold objects: %w", err)
|
||||||
}
|
}
|
||||||
log.Infow("purging cold objects from hotstore done", "took", time.Since(startPurge))
|
log.Infow("purging cold objects from hotstore done", "took", time.Since(startPurge))
|
||||||
|
|
||||||
s.endCriticalSection()
|
s.endCriticalSection()
|
||||||
|
log.Infow("critical section done", "total protected size", s.szProtectedTxns, "total marked live size", s.szMarkedLiveRefs)
|
||||||
|
|
||||||
if err := checkpoint.Close(); err != nil {
|
if err := checkpoint.Close(); err != nil {
|
||||||
log.Warnf("error closing checkpoint: %s", err)
|
log.Warnf("error closing checkpoint: %s", err)
|
||||||
@@ -712,10 +827,13 @@ func (s *SplitStore) doCompact(curTs *types.TipSet) error {
|
|||||||
if err := os.Remove(s.coldSetPath()); err != nil {
|
if err := os.Remove(s.coldSetPath()); err != nil {
|
||||||
log.Warnf("error removing coldset: %s", err)
|
log.Warnf("error removing coldset: %s", err)
|
||||||
}
|
}
|
||||||
|
if err := os.Remove(s.discardSetPath()); err != nil {
|
||||||
|
log.Warnf("error removing discardset: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
// we are done; do some housekeeping
|
// we are done; do some housekeeping
|
||||||
s.endTxnProtect()
|
s.endTxnProtect()
|
||||||
s.gcHotstore()
|
s.gcHotAfterCompaction()
|
||||||
|
|
||||||
err = s.setBaseEpoch(boundaryEpoch)
|
err = s.setBaseEpoch(boundaryEpoch)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -775,8 +893,12 @@ func (s *SplitStore) beginCriticalSection(markSet MarkSet) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *SplitStore) waitForSync() {
|
func (s *SplitStore) waitForTxnSync() {
|
||||||
log.Info("waiting for sync")
|
log.Info("waiting for sync")
|
||||||
|
if !CheckSyncGap {
|
||||||
|
log.Warnf("If you see this outside of test it is a serious splitstore issue")
|
||||||
|
return
|
||||||
|
}
|
||||||
startWait := time.Now()
|
startWait := time.Now()
|
||||||
defer func() {
|
defer func() {
|
||||||
log.Infow("waiting for sync done", "took", time.Since(startWait))
|
log.Infow("waiting for sync done", "took", time.Since(startWait))
|
||||||
@@ -790,6 +912,25 @@ func (s *SplitStore) waitForSync() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Block compaction operations if chain sync has fallen behind
|
||||||
|
func (s *SplitStore) waitForSync() {
|
||||||
|
if atomic.LoadInt32(&s.outOfSync) == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
s.chainSyncMx.Lock()
|
||||||
|
defer s.chainSyncMx.Unlock()
|
||||||
|
|
||||||
|
for !s.chainSyncFinished {
|
||||||
|
s.chainSyncCond.Wait()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Combined sync and closing check
|
||||||
|
func (s *SplitStore) checkYield() error {
|
||||||
|
s.waitForSync()
|
||||||
|
return s.checkClosing()
|
||||||
|
}
|
||||||
|
|
||||||
func (s *SplitStore) endTxnProtect() {
|
func (s *SplitStore) endTxnProtect() {
|
||||||
s.txnLk.Lock()
|
s.txnLk.Lock()
|
||||||
defer s.txnLk.Unlock()
|
defer s.txnLk.Unlock()
|
||||||
@@ -816,7 +957,7 @@ func (s *SplitStore) endCriticalSection() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *SplitStore) walkChain(ts *types.TipSet, inclState, inclMsgs abi.ChainEpoch,
|
func (s *SplitStore) walkChain(ts *types.TipSet, inclState, inclMsgs abi.ChainEpoch,
|
||||||
visitor ObjectVisitor, f func(cid.Cid) error) error {
|
visitor ObjectVisitor, fHot, fCold func(cid.Cid) error) error {
|
||||||
var walked ObjectVisitor
|
var walked ObjectVisitor
|
||||||
var mx sync.Mutex
|
var mx sync.Mutex
|
||||||
// we copy the tipset first into a new slice, which allows us to reuse it in every epoch.
|
// we copy the tipset first into a new slice, which allows us to reuse it in every epoch.
|
||||||
@@ -824,6 +965,11 @@ func (s *SplitStore) walkChain(ts *types.TipSet, inclState, inclMsgs abi.ChainEp
|
|||||||
copy(toWalk, ts.Cids())
|
copy(toWalk, ts.Cids())
|
||||||
walkCnt := new(int64)
|
walkCnt := new(int64)
|
||||||
scanCnt := new(int64)
|
scanCnt := new(int64)
|
||||||
|
szWalk := new(int64)
|
||||||
|
|
||||||
|
tsRef := func(blkCids []cid.Cid) (cid.Cid, error) {
|
||||||
|
return types.NewTipSetKey(blkCids...).Cid()
|
||||||
|
}
|
||||||
|
|
||||||
stopWalk := func(_ cid.Cid) error { return errStopWalk }
|
stopWalk := func(_ cid.Cid) error { return errStopWalk }
|
||||||
|
|
||||||
@@ -838,7 +984,7 @@ func (s *SplitStore) walkChain(ts *types.TipSet, inclState, inclMsgs abi.ChainEp
|
|||||||
|
|
||||||
atomic.AddInt64(walkCnt, 1)
|
atomic.AddInt64(walkCnt, 1)
|
||||||
|
|
||||||
if err := f(c); err != nil {
|
if err := fHot(c); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -846,39 +992,73 @@ func (s *SplitStore) walkChain(ts *types.TipSet, inclState, inclMsgs abi.ChainEp
|
|||||||
err = s.view(c, func(data []byte) error {
|
err = s.view(c, func(data []byte) error {
|
||||||
return hdr.UnmarshalCBOR(bytes.NewBuffer(data))
|
return hdr.UnmarshalCBOR(bytes.NewBuffer(data))
|
||||||
})
|
})
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return xerrors.Errorf("error unmarshaling block header (cid: %s): %w", c, err)
|
return xerrors.Errorf("error unmarshaling block header (cid: %s): %w", c, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// tipset CID references are retained
|
||||||
|
pRef, err := tsRef(hdr.Parents)
|
||||||
|
if err != nil {
|
||||||
|
return xerrors.Errorf("error computing cid reference to parent tipset")
|
||||||
|
}
|
||||||
|
sz, err := s.walkObjectIncomplete(pRef, visitor, fHot, stopWalk)
|
||||||
|
if err != nil {
|
||||||
|
return xerrors.Errorf("error walking parent tipset cid reference")
|
||||||
|
}
|
||||||
|
atomic.AddInt64(szWalk, sz)
|
||||||
|
|
||||||
// message are retained if within the inclMsgs boundary
|
// message are retained if within the inclMsgs boundary
|
||||||
if hdr.Height >= inclMsgs && hdr.Height > 0 {
|
if hdr.Height >= inclMsgs && hdr.Height > 0 {
|
||||||
if inclMsgs < inclState {
|
if inclMsgs < inclState {
|
||||||
// we need to use walkObjectIncomplete here, as messages/receipts may be missing early on if we
|
// we need to use walkObjectIncomplete here, as messages/receipts may be missing early on if we
|
||||||
// synced from snapshot and have a long HotStoreMessageRetentionPolicy.
|
// synced from snapshot and have a long HotStoreMessageRetentionPolicy.
|
||||||
if err := s.walkObjectIncomplete(hdr.Messages, visitor, f, stopWalk); err != nil {
|
sz, err := s.walkObjectIncomplete(hdr.Messages, visitor, fHot, stopWalk)
|
||||||
|
if err != nil {
|
||||||
return xerrors.Errorf("error walking messages (cid: %s): %w", hdr.Messages, err)
|
return xerrors.Errorf("error walking messages (cid: %s): %w", hdr.Messages, err)
|
||||||
}
|
}
|
||||||
|
atomic.AddInt64(szWalk, sz)
|
||||||
|
|
||||||
if err := s.walkObjectIncomplete(hdr.ParentMessageReceipts, visitor, f, stopWalk); err != nil {
|
sz, err = s.walkObjectIncomplete(hdr.ParentMessageReceipts, visitor, fHot, stopWalk)
|
||||||
|
if err != nil {
|
||||||
return xerrors.Errorf("error walking messages receipts (cid: %s): %w", hdr.ParentMessageReceipts, err)
|
return xerrors.Errorf("error walking messages receipts (cid: %s): %w", hdr.ParentMessageReceipts, err)
|
||||||
}
|
}
|
||||||
|
atomic.AddInt64(szWalk, sz)
|
||||||
} else {
|
} else {
|
||||||
if err := s.walkObject(hdr.Messages, visitor, f); err != nil {
|
sz, err = s.walkObject(hdr.Messages, visitor, fHot)
|
||||||
|
if err != nil {
|
||||||
return xerrors.Errorf("error walking messages (cid: %s): %w", hdr.Messages, err)
|
return xerrors.Errorf("error walking messages (cid: %s): %w", hdr.Messages, err)
|
||||||
}
|
}
|
||||||
|
atomic.AddInt64(szWalk, sz)
|
||||||
|
|
||||||
if err := s.walkObject(hdr.ParentMessageReceipts, visitor, f); err != nil {
|
sz, err := s.walkObjectIncomplete(hdr.ParentMessageReceipts, visitor, fHot, stopWalk)
|
||||||
|
if err != nil {
|
||||||
return xerrors.Errorf("error walking message receipts (cid: %s): %w", hdr.ParentMessageReceipts, err)
|
return xerrors.Errorf("error walking message receipts (cid: %s): %w", hdr.ParentMessageReceipts, err)
|
||||||
}
|
}
|
||||||
|
atomic.AddInt64(szWalk, sz)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// messages and receipts outside of inclMsgs are included in the cold store
|
||||||
|
if hdr.Height < inclMsgs && hdr.Height > 0 {
|
||||||
|
sz, err := s.walkObjectIncomplete(hdr.Messages, visitor, fCold, stopWalk)
|
||||||
|
if err != nil {
|
||||||
|
return xerrors.Errorf("error walking messages (cid: %s): %w", hdr.Messages, err)
|
||||||
|
}
|
||||||
|
atomic.AddInt64(szWalk, sz)
|
||||||
|
sz, err = s.walkObjectIncomplete(hdr.ParentMessageReceipts, visitor, fCold, stopWalk)
|
||||||
|
if err != nil {
|
||||||
|
return xerrors.Errorf("error walking messages receipts (cid: %s): %w", hdr.ParentMessageReceipts, err)
|
||||||
|
}
|
||||||
|
atomic.AddInt64(szWalk, sz)
|
||||||
|
}
|
||||||
|
|
||||||
// state is only retained if within the inclState boundary, with the exception of genesis
|
// state is only retained if within the inclState boundary, with the exception of genesis
|
||||||
if hdr.Height >= inclState || hdr.Height == 0 {
|
if hdr.Height >= inclState || hdr.Height == 0 {
|
||||||
if err := s.walkObject(hdr.ParentStateRoot, visitor, f); err != nil {
|
sz, err := s.walkObject(hdr.ParentStateRoot, visitor, fHot)
|
||||||
|
if err != nil {
|
||||||
return xerrors.Errorf("error walking state root (cid: %s): %w", hdr.ParentStateRoot, err)
|
return xerrors.Errorf("error walking state root (cid: %s): %w", hdr.ParentStateRoot, err)
|
||||||
}
|
}
|
||||||
|
atomic.AddInt64(szWalk, sz)
|
||||||
atomic.AddInt64(scanCnt, 1)
|
atomic.AddInt64(scanCnt, 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -891,9 +1071,20 @@ func (s *SplitStore) walkChain(ts *types.TipSet, inclState, inclMsgs abi.ChainEp
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// retain ref to chain head
|
||||||
|
hRef, err := tsRef(ts.Cids())
|
||||||
|
if err != nil {
|
||||||
|
return xerrors.Errorf("error computing cid reference to parent tipset")
|
||||||
|
}
|
||||||
|
sz, err := s.walkObjectIncomplete(hRef, visitor, fHot, stopWalk)
|
||||||
|
if err != nil {
|
||||||
|
return xerrors.Errorf("error walking parent tipset cid reference")
|
||||||
|
}
|
||||||
|
atomic.AddInt64(szWalk, sz)
|
||||||
|
|
||||||
for len(toWalk) > 0 {
|
for len(toWalk) > 0 {
|
||||||
// walking can take a while, so check this with every opportunity
|
// walking can take a while, so check this with every opportunity
|
||||||
if err := s.checkClosing(); err != nil {
|
if err := s.checkYield(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -933,123 +1124,129 @@ func (s *SplitStore) walkChain(ts *types.TipSet, inclState, inclMsgs abi.ChainEp
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Infow("chain walk done", "walked", *walkCnt, "scanned", *scanCnt)
|
log.Infow("chain walk done", "walked", *walkCnt, "scanned", *scanCnt, "walk size", szWalk)
|
||||||
|
s.szWalk = atomic.LoadInt64(szWalk)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *SplitStore) walkObject(c cid.Cid, visitor ObjectVisitor, f func(cid.Cid) error) error {
|
func (s *SplitStore) walkObject(c cid.Cid, visitor ObjectVisitor, f func(cid.Cid) error) (int64, error) {
|
||||||
|
var sz int64
|
||||||
visit, err := visitor.Visit(c)
|
visit, err := visitor.Visit(c)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return xerrors.Errorf("error visiting object: %w", err)
|
return 0, xerrors.Errorf("error visiting object: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !visit {
|
if !visit {
|
||||||
return nil
|
return sz, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := f(c); err != nil {
|
if err := f(c); err != nil {
|
||||||
if err == errStopWalk {
|
if err == errStopWalk {
|
||||||
return nil
|
return sz, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if c.Prefix().Codec != cid.DagCBOR {
|
if c.Prefix().Codec != cid.DagCBOR {
|
||||||
return nil
|
return sz, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// check this before recursing
|
// check this before recursing
|
||||||
if err := s.checkClosing(); err != nil {
|
if err := s.checkYield(); err != nil {
|
||||||
return err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
var links []cid.Cid
|
var links []cid.Cid
|
||||||
err = s.view(c, func(data []byte) error {
|
err = s.view(c, func(data []byte) error {
|
||||||
|
sz += int64(len(data))
|
||||||
return cbg.ScanForLinks(bytes.NewReader(data), func(c cid.Cid) {
|
return cbg.ScanForLinks(bytes.NewReader(data), func(c cid.Cid) {
|
||||||
links = append(links, c)
|
links = append(links, c)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return xerrors.Errorf("error scanning linked block (cid: %s): %w", c, err)
|
return 0, xerrors.Errorf("error scanning linked block (cid: %s): %w", c, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, c := range links {
|
for _, c := range links {
|
||||||
err := s.walkObject(c, visitor, f)
|
szLink, err := s.walkObject(c, visitor, f)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return xerrors.Errorf("error walking link (cid: %s): %w", c, err)
|
return 0, xerrors.Errorf("error walking link (cid: %s): %w", c, err)
|
||||||
}
|
}
|
||||||
|
sz += szLink
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return sz, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// like walkObject, but the object may be potentially incomplete (references missing)
|
// like walkObject, but the object may be potentially incomplete (references missing)
|
||||||
func (s *SplitStore) walkObjectIncomplete(c cid.Cid, visitor ObjectVisitor, f, missing func(cid.Cid) error) error {
|
func (s *SplitStore) walkObjectIncomplete(c cid.Cid, visitor ObjectVisitor, f, missing func(cid.Cid) error) (int64, error) {
|
||||||
|
var sz int64
|
||||||
visit, err := visitor.Visit(c)
|
visit, err := visitor.Visit(c)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return xerrors.Errorf("error visiting object: %w", err)
|
return 0, xerrors.Errorf("error visiting object: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !visit {
|
if !visit {
|
||||||
return nil
|
return sz, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// occurs check -- only for DAGs
|
// occurs check -- only for DAGs
|
||||||
if c.Prefix().Codec == cid.DagCBOR {
|
if c.Prefix().Codec == cid.DagCBOR {
|
||||||
has, err := s.has(c)
|
has, err := s.has(c)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return xerrors.Errorf("error occur checking %s: %w", c, err)
|
return 0, xerrors.Errorf("error occur checking %s: %w", c, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !has {
|
if !has {
|
||||||
err = missing(c)
|
err = missing(c)
|
||||||
if err == errStopWalk {
|
if err == errStopWalk {
|
||||||
return nil
|
return sz, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return err
|
return 0, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := f(c); err != nil {
|
if err := f(c); err != nil {
|
||||||
if err == errStopWalk {
|
if err == errStopWalk {
|
||||||
return nil
|
return sz, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if c.Prefix().Codec != cid.DagCBOR {
|
if c.Prefix().Codec != cid.DagCBOR {
|
||||||
return nil
|
return sz, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// check this before recursing
|
// check this before recursing
|
||||||
if err := s.checkClosing(); err != nil {
|
if err := s.checkYield(); err != nil {
|
||||||
return err
|
return sz, err
|
||||||
}
|
}
|
||||||
|
|
||||||
var links []cid.Cid
|
var links []cid.Cid
|
||||||
err = s.view(c, func(data []byte) error {
|
err = s.view(c, func(data []byte) error {
|
||||||
|
sz += int64(len(data))
|
||||||
return cbg.ScanForLinks(bytes.NewReader(data), func(c cid.Cid) {
|
return cbg.ScanForLinks(bytes.NewReader(data), func(c cid.Cid) {
|
||||||
links = append(links, c)
|
links = append(links, c)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return xerrors.Errorf("error scanning linked block (cid: %s): %w", c, err)
|
return 0, xerrors.Errorf("error scanning linked block (cid: %s): %w", c, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, c := range links {
|
for _, c := range links {
|
||||||
err := s.walkObjectIncomplete(c, visitor, f, missing)
|
szLink, err := s.walkObjectIncomplete(c, visitor, f, missing)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return xerrors.Errorf("error walking link (cid: %s): %w", c, err)
|
return 0, xerrors.Errorf("error walking link (cid: %s): %w", c, err)
|
||||||
}
|
}
|
||||||
|
sz += szLink
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return sz, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// internal version used during compaction and related operations
|
// internal version used during compaction and related operations
|
||||||
@@ -1112,10 +1309,9 @@ func (s *SplitStore) moveColdBlocks(coldr *ColdSetReader) error {
|
|||||||
batch := make([]blocks.Block, 0, batchSize)
|
batch := make([]blocks.Block, 0, batchSize)
|
||||||
|
|
||||||
err := coldr.ForEach(func(c cid.Cid) error {
|
err := coldr.ForEach(func(c cid.Cid) error {
|
||||||
if err := s.checkClosing(); err != nil {
|
if err := s.checkYield(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
blk, err := s.hot.Get(s.ctx, c)
|
blk, err := s.hot.Get(s.ctx, c)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if ipld.IsNotFound(err) {
|
if ipld.IsNotFound(err) {
|
||||||
@@ -1133,6 +1329,7 @@ func (s *SplitStore) moveColdBlocks(coldr *ColdSetReader) error {
|
|||||||
return xerrors.Errorf("error putting batch to coldstore: %w", err)
|
return xerrors.Errorf("error putting batch to coldstore: %w", err)
|
||||||
}
|
}
|
||||||
batch = batch[:0]
|
batch = batch[:0]
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@@ -1221,8 +1418,17 @@ func (s *SplitStore) purgeBatch(batch, deadCids []cid.Cid, checkpoint *Checkpoin
|
|||||||
return 0, liveCnt, nil
|
return 0, liveCnt, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := s.hot.DeleteMany(s.ctx, deadCids); err != nil {
|
switch s.compactType {
|
||||||
return 0, liveCnt, xerrors.Errorf("error purging cold objects: %w", err)
|
case hot:
|
||||||
|
if err := s.hot.DeleteMany(s.ctx, deadCids); err != nil {
|
||||||
|
return 0, liveCnt, xerrors.Errorf("error purging cold objects: %w", err)
|
||||||
|
}
|
||||||
|
case cold:
|
||||||
|
if err := s.cold.DeleteMany(s.ctx, deadCids); err != nil {
|
||||||
|
return 0, liveCnt, xerrors.Errorf("error purging dead objects: %w", err)
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return 0, liveCnt, xerrors.Errorf("invalid compaction type %d, only hot and cold allowed for critical section", s.compactType)
|
||||||
}
|
}
|
||||||
|
|
||||||
s.debug.LogDelete(deadCids)
|
s.debug.LogDelete(deadCids)
|
||||||
@@ -1239,15 +1445,28 @@ func (s *SplitStore) coldSetPath() string {
|
|||||||
return filepath.Join(s.path, "coldset")
|
return filepath.Join(s.path, "coldset")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *SplitStore) discardSetPath() string {
|
||||||
|
return filepath.Join(s.path, "deadset")
|
||||||
|
}
|
||||||
|
|
||||||
func (s *SplitStore) checkpointPath() string {
|
func (s *SplitStore) checkpointPath() string {
|
||||||
return filepath.Join(s.path, "checkpoint")
|
return filepath.Join(s.path, "checkpoint")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *SplitStore) pruneCheckpointPath() string {
|
||||||
|
return filepath.Join(s.path, "prune-checkpoint")
|
||||||
|
}
|
||||||
|
|
||||||
func (s *SplitStore) checkpointExists() bool {
|
func (s *SplitStore) checkpointExists() bool {
|
||||||
_, err := os.Stat(s.checkpointPath())
|
_, err := os.Stat(s.checkpointPath())
|
||||||
return err == nil
|
return err == nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *SplitStore) pruneCheckpointExists() bool {
|
||||||
|
_, err := os.Stat(s.pruneCheckpointPath())
|
||||||
|
return err == nil
|
||||||
|
}
|
||||||
|
|
||||||
func (s *SplitStore) completeCompaction() error {
|
func (s *SplitStore) completeCompaction() error {
|
||||||
checkpoint, last, err := OpenCheckpoint(s.checkpointPath())
|
checkpoint, last, err := OpenCheckpoint(s.checkpointPath())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -1268,6 +1487,7 @@ func (s *SplitStore) completeCompaction() error {
|
|||||||
defer markSet.Close() //nolint:errcheck
|
defer markSet.Close() //nolint:errcheck
|
||||||
|
|
||||||
// PURGE
|
// PURGE
|
||||||
|
s.compactType = hot
|
||||||
log.Info("purging cold objects from the hotstore")
|
log.Info("purging cold objects from the hotstore")
|
||||||
startPurge := time.Now()
|
startPurge := time.Now()
|
||||||
err = s.completePurge(coldr, checkpoint, last, markSet)
|
err = s.completePurge(coldr, checkpoint, last, markSet)
|
||||||
@@ -1290,9 +1510,11 @@ func (s *SplitStore) completeCompaction() error {
|
|||||||
if err := os.Remove(s.coldSetPath()); err != nil {
|
if err := os.Remove(s.coldSetPath()); err != nil {
|
||||||
log.Warnf("error removing coldset: %s", err)
|
log.Warnf("error removing coldset: %s", err)
|
||||||
}
|
}
|
||||||
|
s.compactType = none
|
||||||
|
|
||||||
// Note: at this point we can start the splitstore; a compaction should run on
|
// Note: at this point we can start the splitstore; base epoch is not
|
||||||
// the first head change, which will trigger gc on the hotstore.
|
// incremented here so a compaction should run on the first head
|
||||||
|
// change, which will trigger gc on the hotstore.
|
||||||
// We don't mind the second (back-to-back) compaction as the head will
|
// We don't mind the second (back-to-back) compaction as the head will
|
||||||
// have advanced during marking and coldset accumulation.
|
// have advanced during marking and coldset accumulation.
|
||||||
return nil
|
return nil
|
||||||
@@ -1350,6 +1572,13 @@ func (s *SplitStore) completePurge(coldr *ColdSetReader, checkpoint *Checkpoint,
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *SplitStore) clearSizeMeasurements() {
|
||||||
|
s.szKeys = 0
|
||||||
|
s.szMarkedLiveRefs = 0
|
||||||
|
s.szProtectedTxns = 0
|
||||||
|
s.szWalk = 0
|
||||||
|
}
|
||||||
|
|
||||||
// I really don't like having this code, but we seem to have some occasional DAG references with
|
// I really don't like having this code, but we seem to have some occasional DAG references with
|
||||||
// missing constituents. During testing in mainnet *some* of these references *sometimes* appeared
|
// missing constituents. During testing in mainnet *some* of these references *sometimes* appeared
|
||||||
// after a little bit.
|
// after a little bit.
|
||||||
@@ -1390,7 +1619,7 @@ func (s *SplitStore) waitForMissingRefs(markSet MarkSet) {
|
|||||||
missing = make(map[cid.Cid]struct{})
|
missing = make(map[cid.Cid]struct{})
|
||||||
|
|
||||||
for c := range towalk {
|
for c := range towalk {
|
||||||
err := s.walkObjectIncomplete(c, visitor,
|
_, err := s.walkObjectIncomplete(c, visitor,
|
||||||
func(c cid.Cid) error {
|
func(c cid.Cid) error {
|
||||||
if isUnitaryObject(c) {
|
if isUnitaryObject(c) {
|
||||||
return errStopWalk
|
return errStopWalk
|
||||||
|
|||||||
@@ -4,9 +4,9 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
blocks "github.com/ipfs/go-block-format"
|
|
||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
ipld "github.com/ipfs/go-ipld-format"
|
ipld "github.com/ipfs/go-ipld-format"
|
||||||
|
blocks "github.com/ipfs/go-libipfs/blocks"
|
||||||
|
|
||||||
bstore "github.com/filecoin-project/lotus/blockstore"
|
bstore "github.com/filecoin-project/lotus/blockstore"
|
||||||
)
|
)
|
||||||
@@ -43,6 +43,7 @@ func (es *exposedSplitStore) Has(ctx context.Context, c cid.Cid) (bool, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (es *exposedSplitStore) Get(ctx context.Context, c cid.Cid) (blocks.Block, error) {
|
func (es *exposedSplitStore) Get(ctx context.Context, c cid.Cid) (blocks.Block, error) {
|
||||||
|
|
||||||
if isIdentiyCid(c) {
|
if isIdentiyCid(c) {
|
||||||
data, err := decodeIdentityCid(c)
|
data, err := decodeIdentityCid(c)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -76,6 +77,10 @@ func (es *exposedSplitStore) GetSize(ctx context.Context, c cid.Cid) (int, error
|
|||||||
return size, err
|
return size, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (es *exposedSplitStore) Flush(ctx context.Context) error {
|
||||||
|
return es.s.Flush(ctx)
|
||||||
|
}
|
||||||
|
|
||||||
func (es *exposedSplitStore) Put(ctx context.Context, blk blocks.Block) error {
|
func (es *exposedSplitStore) Put(ctx context.Context, blk blocks.Block) error {
|
||||||
return es.s.Put(ctx, blk)
|
return es.s.Put(ctx, blk)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,29 +7,96 @@ import (
|
|||||||
bstore "github.com/filecoin-project/lotus/blockstore"
|
bstore "github.com/filecoin-project/lotus/blockstore"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (s *SplitStore) gcHotstore() {
|
const (
|
||||||
|
// Fraction of garbage in badger vlog for online GC traversal to collect garbage
|
||||||
|
AggressiveOnlineGCThreshold = 0.0001
|
||||||
|
)
|
||||||
|
|
||||||
|
func (s *SplitStore) gcHotAfterCompaction() {
|
||||||
|
// Measure hotstore size, determine if we should do full GC, determine if we can do full GC.
|
||||||
|
// We should do full GC if
|
||||||
|
// FullGCFrequency is specified and compaction index matches frequency
|
||||||
|
// OR HotstoreMaxSpaceTarget is specified and total moving space is within 150 GB of target
|
||||||
|
// We can do full if
|
||||||
|
// HotstoreMaxSpaceTarget is not specified
|
||||||
|
// OR total moving space would not exceed 50 GB below target
|
||||||
|
//
|
||||||
|
// a) If we should not do full GC => online GC
|
||||||
|
// b) If we should do full GC and can => moving GC
|
||||||
|
// c) If we should do full GC and can't => aggressive online GC
|
||||||
|
getSize := func() int64 {
|
||||||
|
sizer, ok := s.hot.(bstore.BlockstoreSize)
|
||||||
|
if ok {
|
||||||
|
size, err := sizer.Size()
|
||||||
|
if err != nil {
|
||||||
|
log.Warnf("error getting hotstore size: %s, estimating empty hot store for targeting", err)
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
return size
|
||||||
|
}
|
||||||
|
log.Errorf("Could not measure hotstore size, assuming it is 0 bytes, which it is not")
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
hotSize := getSize()
|
||||||
|
|
||||||
|
copySizeApprox := s.szKeys + s.szMarkedLiveRefs + s.szProtectedTxns + s.szWalk
|
||||||
|
shouldTarget := s.cfg.HotstoreMaxSpaceTarget > 0 && hotSize+copySizeApprox > int64(s.cfg.HotstoreMaxSpaceTarget)-int64(s.cfg.HotstoreMaxSpaceThreshold)
|
||||||
|
shouldFreq := s.cfg.HotStoreFullGCFrequency > 0 && s.compactionIndex%int64(s.cfg.HotStoreFullGCFrequency) == 0
|
||||||
|
shouldDoFull := shouldTarget || shouldFreq
|
||||||
|
canDoFull := s.cfg.HotstoreMaxSpaceTarget == 0 || hotSize+copySizeApprox < int64(s.cfg.HotstoreMaxSpaceTarget)-int64(s.cfg.HotstoreMaxSpaceSafetyBuffer)
|
||||||
|
log.Debugw("approximating new hot store size", "key size", s.szKeys, "marked live refs", s.szMarkedLiveRefs, "protected txns", s.szProtectedTxns, "walked DAG", s.szWalk)
|
||||||
|
log.Infof("measured hot store size: %d, approximate new size: %d, should do full %t, can do full %t", hotSize, copySizeApprox, shouldDoFull, canDoFull)
|
||||||
|
|
||||||
var opts []bstore.BlockstoreGCOption
|
var opts []bstore.BlockstoreGCOption
|
||||||
if s.cfg.HotStoreFullGCFrequency > 0 && s.compactionIndex%int64(s.cfg.HotStoreFullGCFrequency) == 0 {
|
if shouldDoFull && canDoFull {
|
||||||
opts = append(opts, bstore.WithFullGC(true))
|
opts = append(opts, bstore.WithFullGC(true))
|
||||||
|
} else if shouldDoFull && !canDoFull {
|
||||||
|
log.Warnf("Attention! Estimated moving GC size %d is not within safety buffer %d of target max %d, performing aggressive online GC to attempt to bring hotstore size down safely", copySizeApprox, s.cfg.HotstoreMaxSpaceSafetyBuffer, s.cfg.HotstoreMaxSpaceTarget)
|
||||||
|
log.Warn("If problem continues you can 1) temporarily allocate more disk space to hotstore and 2) reflect in HotstoreMaxSpaceTarget OR trigger manual move with `lotus chain prune hot-moving`")
|
||||||
|
log.Warn("If problem continues and you do not have any more disk space you can run continue to manually trigger online GC at aggressive thresholds (< 0.01) with `lotus chain prune hot`")
|
||||||
|
|
||||||
|
opts = append(opts, bstore.WithThreshold(AggressiveOnlineGCThreshold))
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := s.gcBlockstore(s.hot, opts); err != nil {
|
if err := s.gcBlockstore(s.hot, opts); err != nil {
|
||||||
log.Warnf("error garbage collecting hostore: %s", err)
|
log.Warnf("error garbage collecting hostore: %s", err)
|
||||||
}
|
}
|
||||||
|
log.Infof("measured hot store size after GC: %d", getSize())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *SplitStore) gcBlockstore(b bstore.Blockstore, opts []bstore.BlockstoreGCOption) error {
|
func (s *SplitStore) gcBlockstore(b bstore.Blockstore, opts []bstore.BlockstoreGCOption) error {
|
||||||
|
if err := s.checkYield(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
if gc, ok := b.(bstore.BlockstoreGC); ok {
|
if gc, ok := b.(bstore.BlockstoreGC); ok {
|
||||||
log.Info("garbage collecting blockstore")
|
log.Info("garbage collecting blockstore")
|
||||||
startGC := time.Now()
|
startGC := time.Now()
|
||||||
|
|
||||||
if err := gc.CollectGarbage(opts...); err != nil {
|
opts = append(opts, bstore.WithCheckFreq(90*time.Second))
|
||||||
|
opts = append(opts, bstore.WithCheck(s.checkYield))
|
||||||
|
if err := gc.CollectGarbage(s.ctx, opts...); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Infow("garbage collecting hotstore done", "took", time.Since(startGC))
|
log.Infow("garbage collecting blockstore done", "took", time.Since(startGC))
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return fmt.Errorf("blockstore doesn't support garbage collection: %T", b)
|
return fmt.Errorf("blockstore doesn't support garbage collection: %T", b)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *SplitStore) gcBlockstoreOnce(b bstore.Blockstore, opts []bstore.BlockstoreGCOption) error {
|
||||||
|
if gc, ok := b.(bstore.BlockstoreGCOnce); ok {
|
||||||
|
log.Debug("gc blockstore once")
|
||||||
|
startGC := time.Now()
|
||||||
|
|
||||||
|
if err := gc.GCOnce(s.ctx, opts...); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Debugw("gc blockstore once done", "took", time.Since(startGC))
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return fmt.Errorf("blockstore doesn't support gc once: %T", b)
|
||||||
|
}
|
||||||
|
|||||||
@@ -0,0 +1,591 @@
|
|||||||
|
package splitstore
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"os"
|
||||||
|
"runtime"
|
||||||
|
"sync"
|
||||||
|
"sync/atomic"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
cid "github.com/ipfs/go-cid"
|
||||||
|
ipld "github.com/ipfs/go-ipld-format"
|
||||||
|
cbg "github.com/whyrusleeping/cbor-gen"
|
||||||
|
"go.opencensus.io/stats"
|
||||||
|
"golang.org/x/xerrors"
|
||||||
|
|
||||||
|
"github.com/filecoin-project/lotus/api"
|
||||||
|
bstore "github.com/filecoin-project/lotus/blockstore"
|
||||||
|
"github.com/filecoin-project/lotus/build"
|
||||||
|
"github.com/filecoin-project/lotus/chain/types"
|
||||||
|
"github.com/filecoin-project/lotus/metrics"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
// PruneOnline is a prune option that instructs PruneChain to use online gc for reclaiming space;
|
||||||
|
// there is no value associated with this option.
|
||||||
|
PruneOnlineGC = "splitstore.PruneOnlineGC"
|
||||||
|
|
||||||
|
// PruneMoving is a prune option that instructs PruneChain to use moving gc for reclaiming space;
|
||||||
|
// the value associated with this option is the path of the new coldstore.
|
||||||
|
PruneMovingGC = "splitstore.PruneMovingGC"
|
||||||
|
|
||||||
|
// PruneRetainState is a prune option that instructs PruneChain as to how many finalities worth
|
||||||
|
// of state to retain in the coldstore.
|
||||||
|
// The value is an integer:
|
||||||
|
// - if it is -1 then all state objects reachable from the chain will be retained in the coldstore.
|
||||||
|
// this is useful for garbage collecting side-chains and other garbage in archival nodes.
|
||||||
|
// This is the (safe) default.
|
||||||
|
// - if it is 0 then no state objects that are unreachable within the compaction boundary will
|
||||||
|
// be retained in the coldstore.
|
||||||
|
// - if it is a positive integer, then it's the number of finalities past the compaction boundary
|
||||||
|
// for which chain-reachable state objects are retained.
|
||||||
|
PruneRetainState = "splitstore.PruneRetainState"
|
||||||
|
|
||||||
|
// PruneThreshold is the number of epochs that need to have elapsed
|
||||||
|
// from the previously pruned epoch to trigger a new prune
|
||||||
|
PruneThreshold = 7 * build.Finality
|
||||||
|
)
|
||||||
|
|
||||||
|
// GCHotstore runs online GC on the chain state in the hotstore according the to options specified
|
||||||
|
func (s *SplitStore) GCHotStore(opts api.HotGCOpts) error {
|
||||||
|
if opts.Moving {
|
||||||
|
gcOpts := []bstore.BlockstoreGCOption{bstore.WithFullGC(true)}
|
||||||
|
return s.gcBlockstore(s.hot, gcOpts)
|
||||||
|
}
|
||||||
|
|
||||||
|
gcOpts := []bstore.BlockstoreGCOption{bstore.WithThreshold(opts.Threshold)}
|
||||||
|
var err error
|
||||||
|
if opts.Periodic {
|
||||||
|
err = s.gcBlockstore(s.hot, gcOpts)
|
||||||
|
} else {
|
||||||
|
err = s.gcBlockstoreOnce(s.hot, gcOpts)
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// PruneChain instructs the SplitStore to prune chain state in the coldstore, according to the
|
||||||
|
// options specified.
|
||||||
|
func (s *SplitStore) PruneChain(opts api.PruneOpts) error {
|
||||||
|
retainState := opts.RetainState
|
||||||
|
|
||||||
|
var gcOpts []bstore.BlockstoreGCOption
|
||||||
|
if opts.MovingGC {
|
||||||
|
gcOpts = append(gcOpts, bstore.WithFullGC(true))
|
||||||
|
}
|
||||||
|
doGC := func() error { return s.gcBlockstore(s.cold, gcOpts) }
|
||||||
|
|
||||||
|
var retainStateP func(int64) bool
|
||||||
|
switch {
|
||||||
|
case retainState > 0:
|
||||||
|
retainStateP = func(depth int64) bool {
|
||||||
|
return depth <= int64(CompactionBoundary)+retainState*int64(build.Finality)
|
||||||
|
}
|
||||||
|
case retainState < 0:
|
||||||
|
retainStateP = func(_ int64) bool { return true }
|
||||||
|
default:
|
||||||
|
retainStateP = func(depth int64) bool {
|
||||||
|
return depth <= int64(CompactionBoundary)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, ok := s.cold.(bstore.BlockstoreIterator); !ok {
|
||||||
|
return xerrors.Errorf("coldstore does not support efficient iteration")
|
||||||
|
}
|
||||||
|
|
||||||
|
return s.pruneChain(retainStateP, doGC)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *SplitStore) pruneChain(retainStateP func(int64) bool, doGC func() error) error {
|
||||||
|
// inhibit compaction while we are setting up
|
||||||
|
s.headChangeMx.Lock()
|
||||||
|
defer s.headChangeMx.Unlock()
|
||||||
|
|
||||||
|
// take the compaction lock; fail if there is a compaction in progress
|
||||||
|
if !atomic.CompareAndSwapInt32(&s.compacting, 0, 1) {
|
||||||
|
return xerrors.Errorf("compaction, prune or warmup in progress")
|
||||||
|
}
|
||||||
|
|
||||||
|
// check if we are actually closing first
|
||||||
|
if atomic.LoadInt32(&s.closing) == 1 {
|
||||||
|
atomic.StoreInt32(&s.compacting, 0)
|
||||||
|
return errClosing
|
||||||
|
}
|
||||||
|
|
||||||
|
// ensure that we have compacted at least once
|
||||||
|
if s.compactionIndex == 0 {
|
||||||
|
atomic.StoreInt32(&s.compacting, 0)
|
||||||
|
return xerrors.Errorf("splitstore has not compacted yet")
|
||||||
|
}
|
||||||
|
|
||||||
|
// get the current tipset
|
||||||
|
curTs := s.chain.GetHeaviestTipSet()
|
||||||
|
|
||||||
|
// begin the transaction and go
|
||||||
|
s.beginTxnProtect()
|
||||||
|
s.compactType = cold
|
||||||
|
go func() {
|
||||||
|
defer atomic.StoreInt32(&s.compacting, 0)
|
||||||
|
defer s.endTxnProtect()
|
||||||
|
|
||||||
|
log.Info("pruning splitstore")
|
||||||
|
start := time.Now()
|
||||||
|
|
||||||
|
s.prune(curTs, retainStateP, doGC)
|
||||||
|
|
||||||
|
log.Infow("prune done", "took", time.Since(start))
|
||||||
|
}()
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *SplitStore) prune(curTs *types.TipSet, retainStateP func(int64) bool, doGC func() error) {
|
||||||
|
log.Debug("waiting for active views to complete")
|
||||||
|
start := time.Now()
|
||||||
|
s.viewWait()
|
||||||
|
log.Debugw("waiting for active views done", "took", time.Since(start))
|
||||||
|
|
||||||
|
err := s.doPrune(curTs, retainStateP, doGC)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("PRUNE ERROR: %s", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *SplitStore) doPrune(curTs *types.TipSet, retainStateP func(int64) bool, doGC func() error) error {
|
||||||
|
currentEpoch := curTs.Height()
|
||||||
|
boundaryEpoch := currentEpoch - CompactionBoundary
|
||||||
|
|
||||||
|
log.Infow("running prune", "currentEpoch", currentEpoch, "pruneEpoch", s.pruneEpoch)
|
||||||
|
|
||||||
|
markSet, err := s.markSetEnv.New("live", s.markSetSize)
|
||||||
|
if err != nil {
|
||||||
|
return xerrors.Errorf("error creating mark set: %w", err)
|
||||||
|
}
|
||||||
|
defer markSet.Close() //nolint:errcheck
|
||||||
|
defer s.debug.Flush()
|
||||||
|
|
||||||
|
if err := s.checkClosing(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 0. track all protected references at beginning of compaction; anything added later should
|
||||||
|
// be transactionally protected by the write
|
||||||
|
log.Info("protecting references with registered protectors")
|
||||||
|
err = s.applyProtectors()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 1. mark reachable objects by walking the chain from the current epoch; we keep all messages
|
||||||
|
// and chain headers; state and reciepts are retained only if it is within retention policy scope
|
||||||
|
log.Info("marking reachable objects")
|
||||||
|
startMark := time.Now()
|
||||||
|
|
||||||
|
count := new(int64)
|
||||||
|
err = s.walkChainDeep(curTs, retainStateP,
|
||||||
|
func(c cid.Cid) error {
|
||||||
|
if isUnitaryObject(c) {
|
||||||
|
return errStopWalk
|
||||||
|
}
|
||||||
|
|
||||||
|
mark, err := markSet.Has(c)
|
||||||
|
if err != nil {
|
||||||
|
return xerrors.Errorf("error checking markset: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if mark {
|
||||||
|
return errStopWalk
|
||||||
|
}
|
||||||
|
|
||||||
|
atomic.AddInt64(count, 1)
|
||||||
|
return markSet.Mark(c)
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return xerrors.Errorf("error marking: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Infow("marking done", "took", time.Since(startMark), "marked", count)
|
||||||
|
|
||||||
|
if err := s.checkClosing(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 1.1 protect transactional refs
|
||||||
|
err = s.protectTxnRefs(markSet)
|
||||||
|
if err != nil {
|
||||||
|
return xerrors.Errorf("error protecting transactional refs: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := s.checkClosing(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. iterate through the coldstore to collect dead objects
|
||||||
|
log.Info("collecting dead objects")
|
||||||
|
startCollect := time.Now()
|
||||||
|
|
||||||
|
deadw, err := NewColdSetWriter(s.discardSetPath())
|
||||||
|
if err != nil {
|
||||||
|
return xerrors.Errorf("error creating coldset: %w", err)
|
||||||
|
}
|
||||||
|
defer deadw.Close() //nolint:errcheck
|
||||||
|
|
||||||
|
// some stats for logging
|
||||||
|
var liveCnt, deadCnt int
|
||||||
|
|
||||||
|
err = s.cold.(bstore.BlockstoreIterator).ForEachKey(func(c cid.Cid) error {
|
||||||
|
// was it marked?
|
||||||
|
mark, err := markSet.Has(c)
|
||||||
|
if err != nil {
|
||||||
|
return xerrors.Errorf("error checking mark set for %s: %w", c, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if mark {
|
||||||
|
liveCnt++
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Note: a possible optimization here is to also purge objects that are in the hotstore
|
||||||
|
// but this needs special care not to purge genesis state, so we don't bother (yet)
|
||||||
|
|
||||||
|
// it's dead in the coldstore, mark it as candidate for purge
|
||||||
|
|
||||||
|
if err := deadw.Write(c); err != nil {
|
||||||
|
return xerrors.Errorf("error writing cid to coldstore: %w", err)
|
||||||
|
}
|
||||||
|
deadCnt++
|
||||||
|
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return xerrors.Errorf("error dead objects: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := deadw.Close(); err != nil {
|
||||||
|
return xerrors.Errorf("error closing deadset: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
stats.Record(s.ctx, metrics.SplitstoreCompactionDead.M(int64(deadCnt)))
|
||||||
|
|
||||||
|
log.Infow("dead collection done", "took", time.Since(startCollect))
|
||||||
|
log.Infow("prune stats", "live", liveCnt, "dead", deadCnt)
|
||||||
|
|
||||||
|
if err := s.checkClosing(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// now that we have collected dead objects, check for missing references from transactional i/o
|
||||||
|
// this is carried over from hot compaction for completeness
|
||||||
|
s.waitForMissingRefs(markSet)
|
||||||
|
|
||||||
|
if err := s.checkClosing(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
deadr, err := NewColdSetReader(s.discardSetPath())
|
||||||
|
if err != nil {
|
||||||
|
return xerrors.Errorf("error opening deadset: %w", err)
|
||||||
|
}
|
||||||
|
defer deadr.Close() //nolint:errcheck
|
||||||
|
|
||||||
|
// 3. Purge dead objects with checkpointing for recovery.
|
||||||
|
// This is the critical section of prune, whereby any dead object not in the markSet is
|
||||||
|
// considered already deleted.
|
||||||
|
// We delete dead objects in batches, holding the transaction lock, where we check the markSet
|
||||||
|
// again for new references created by the caller.
|
||||||
|
// After each batch we write a checkpoint to disk; if the process is interrupted before completion
|
||||||
|
// the process will continue from the checkpoint in the next recovery.
|
||||||
|
if err := s.beginCriticalSection(markSet); err != nil {
|
||||||
|
return xerrors.Errorf("error beginning critical section: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := s.checkClosing(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
checkpoint, err := NewCheckpoint(s.pruneCheckpointPath())
|
||||||
|
if err != nil {
|
||||||
|
return xerrors.Errorf("error creating checkpoint: %w", err)
|
||||||
|
}
|
||||||
|
defer checkpoint.Close() //nolint:errcheck
|
||||||
|
|
||||||
|
log.Info("purging dead objects from the coldstore")
|
||||||
|
startPurge := time.Now()
|
||||||
|
err = s.purge(deadr, checkpoint, markSet)
|
||||||
|
if err != nil {
|
||||||
|
return xerrors.Errorf("error purging dead objects: %w", err)
|
||||||
|
}
|
||||||
|
log.Infow("purging dead objects from coldstore done", "took", time.Since(startPurge))
|
||||||
|
|
||||||
|
s.endCriticalSection()
|
||||||
|
|
||||||
|
if err := checkpoint.Close(); err != nil {
|
||||||
|
log.Warnf("error closing checkpoint: %s", err)
|
||||||
|
}
|
||||||
|
if err := os.Remove(s.pruneCheckpointPath()); err != nil {
|
||||||
|
log.Warnf("error removing checkpoint: %s", err)
|
||||||
|
}
|
||||||
|
if err := deadr.Close(); err != nil {
|
||||||
|
log.Warnf("error closing discard set: %s", err)
|
||||||
|
}
|
||||||
|
if err := os.Remove(s.discardSetPath()); err != nil {
|
||||||
|
log.Warnf("error removing discard set: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// we are done; do some housekeeping
|
||||||
|
s.endTxnProtect()
|
||||||
|
err = doGC()
|
||||||
|
if err != nil {
|
||||||
|
log.Warnf("error garbage collecting cold store: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := s.setPruneEpoch(boundaryEpoch); err != nil {
|
||||||
|
return xerrors.Errorf("error saving prune base epoch: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
s.pruneIndex++
|
||||||
|
err = s.ds.Put(s.ctx, pruneIndexKey, int64ToBytes(s.pruneIndex))
|
||||||
|
if err != nil {
|
||||||
|
return xerrors.Errorf("error saving prune index: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *SplitStore) completePrune() error {
|
||||||
|
checkpoint, last, err := OpenCheckpoint(s.pruneCheckpointPath())
|
||||||
|
if err != nil {
|
||||||
|
return xerrors.Errorf("error opening checkpoint: %w", err)
|
||||||
|
}
|
||||||
|
defer checkpoint.Close() //nolint:errcheck
|
||||||
|
|
||||||
|
deadr, err := NewColdSetReader(s.discardSetPath())
|
||||||
|
if err != nil {
|
||||||
|
return xerrors.Errorf("error opening deadset: %w", err)
|
||||||
|
}
|
||||||
|
defer deadr.Close() //nolint:errcheck
|
||||||
|
|
||||||
|
markSet, err := s.markSetEnv.Recover("live")
|
||||||
|
if err != nil {
|
||||||
|
return xerrors.Errorf("error recovering markset: %w", err)
|
||||||
|
}
|
||||||
|
defer markSet.Close() //nolint:errcheck
|
||||||
|
|
||||||
|
// PURGE!
|
||||||
|
s.compactType = cold
|
||||||
|
log.Info("purging dead objects from the coldstore")
|
||||||
|
startPurge := time.Now()
|
||||||
|
err = s.completePurge(deadr, checkpoint, last, markSet)
|
||||||
|
if err != nil {
|
||||||
|
return xerrors.Errorf("error purgin dead objects: %w", err)
|
||||||
|
}
|
||||||
|
log.Infow("purging dead objects from the coldstore done", "took", time.Since(startPurge))
|
||||||
|
|
||||||
|
markSet.EndCriticalSection()
|
||||||
|
s.compactType = none
|
||||||
|
|
||||||
|
if err := checkpoint.Close(); err != nil {
|
||||||
|
log.Warnf("error closing checkpoint: %s", err)
|
||||||
|
}
|
||||||
|
if err := os.Remove(s.pruneCheckpointPath()); err != nil {
|
||||||
|
log.Warnf("error removing checkpoint: %s", err)
|
||||||
|
}
|
||||||
|
if err := deadr.Close(); err != nil {
|
||||||
|
log.Warnf("error closing deadset: %s", err)
|
||||||
|
}
|
||||||
|
if err := os.Remove(s.discardSetPath()); err != nil {
|
||||||
|
log.Warnf("error removing deadset: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// like walkChain but peforms a deep walk, using parallel walking with walkObjectLax,
|
||||||
|
// whereby all extant messages are retained and state roots are retained if they satisfy
|
||||||
|
// the given predicate.
|
||||||
|
// missing references are ignored, as we expect to have plenty for snapshot syncs.
|
||||||
|
func (s *SplitStore) walkChainDeep(ts *types.TipSet, retainStateP func(int64) bool,
|
||||||
|
f func(cid.Cid) error) error {
|
||||||
|
visited := cid.NewSet()
|
||||||
|
toWalk := ts.Cids()
|
||||||
|
walkCnt := 0
|
||||||
|
|
||||||
|
workers := runtime.NumCPU() / 2
|
||||||
|
if workers < 2 {
|
||||||
|
workers = 2
|
||||||
|
}
|
||||||
|
|
||||||
|
var wg sync.WaitGroup
|
||||||
|
workch := make(chan cid.Cid, 16*workers)
|
||||||
|
errch := make(chan error, workers)
|
||||||
|
|
||||||
|
var once sync.Once
|
||||||
|
defer once.Do(func() { close(workch) })
|
||||||
|
|
||||||
|
push := func(c cid.Cid) error {
|
||||||
|
if !visited.Visit(c) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
select {
|
||||||
|
case workch <- c:
|
||||||
|
return nil
|
||||||
|
case err := <-errch:
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
worker := func() {
|
||||||
|
defer wg.Done()
|
||||||
|
for c := range workch {
|
||||||
|
err := s.walkObjectLax(c, f)
|
||||||
|
if err != nil {
|
||||||
|
errch <- xerrors.Errorf("error walking object (cid: %s): %w", c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 0; i < workers; i++ {
|
||||||
|
wg.Add(1)
|
||||||
|
go worker()
|
||||||
|
}
|
||||||
|
|
||||||
|
baseEpoch := ts.Height()
|
||||||
|
minEpoch := baseEpoch // for progress report
|
||||||
|
log.Infof("walking at epoch %d", minEpoch)
|
||||||
|
|
||||||
|
walkBlock := func(c cid.Cid) error {
|
||||||
|
if !visited.Visit(c) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
walkCnt++
|
||||||
|
|
||||||
|
if err := f(c); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
var hdr types.BlockHeader
|
||||||
|
err := s.view(c, func(data []byte) error {
|
||||||
|
return hdr.UnmarshalCBOR(bytes.NewBuffer(data))
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return xerrors.Errorf("error unmarshaling block header (cid: %s): %w", c, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if hdr.Height < minEpoch {
|
||||||
|
minEpoch = hdr.Height
|
||||||
|
if minEpoch%10_000 == 0 {
|
||||||
|
log.Infof("walking at epoch %d (walked: %d)", minEpoch, walkCnt)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
depth := int64(baseEpoch - hdr.Height)
|
||||||
|
retainState := retainStateP(depth)
|
||||||
|
|
||||||
|
if hdr.Height > 0 {
|
||||||
|
if err := push(hdr.Messages); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if retainState {
|
||||||
|
if err := push(hdr.ParentMessageReceipts); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if retainState || hdr.Height == 0 {
|
||||||
|
if err := push(hdr.ParentStateRoot); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if hdr.Height > 0 {
|
||||||
|
toWalk = append(toWalk, hdr.Parents...)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
for len(toWalk) > 0 {
|
||||||
|
// walking can take a while, so check this with every opportunity
|
||||||
|
if err := s.checkClosing(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
select {
|
||||||
|
case err := <-errch:
|
||||||
|
return err
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
|
||||||
|
walking := toWalk
|
||||||
|
toWalk = nil
|
||||||
|
for _, c := range walking {
|
||||||
|
if err := walkBlock(c); err != nil {
|
||||||
|
return xerrors.Errorf("error walking block (cid: %s): %w", c, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
once.Do(func() { close(workch) })
|
||||||
|
wg.Wait()
|
||||||
|
select {
|
||||||
|
case err := <-errch:
|
||||||
|
return err
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Infow("chain walk done", "walked", walkCnt)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// like walkObject but treats missing references laxly; faster version of walkObjectIncomplete
|
||||||
|
// without an occurs check.
|
||||||
|
func (s *SplitStore) walkObjectLax(c cid.Cid, f func(cid.Cid) error) error {
|
||||||
|
if err := f(c); err != nil {
|
||||||
|
if err == errStopWalk {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if c.Prefix().Codec != cid.DagCBOR {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// check this before recursing
|
||||||
|
if err := s.checkClosing(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
var links []cid.Cid
|
||||||
|
err := s.view(c, func(data []byte) error {
|
||||||
|
return cbg.ScanForLinks(bytes.NewReader(data), func(c cid.Cid) {
|
||||||
|
links = append(links, c)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
if ipld.IsNotFound(err) { // not a problem for deep walks
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return xerrors.Errorf("error scanning linked block (cid: %s): %w", c, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, c := range links {
|
||||||
|
err := s.walkObjectLax(c, f)
|
||||||
|
if err != nil {
|
||||||
|
return xerrors.Errorf("error walking link (cid: %s): %w", c, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
@@ -5,8 +5,8 @@ import (
|
|||||||
"runtime"
|
"runtime"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
|
|
||||||
blocks "github.com/ipfs/go-block-format"
|
|
||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
|
blocks "github.com/ipfs/go-libipfs/blocks"
|
||||||
"golang.org/x/xerrors"
|
"golang.org/x/xerrors"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -83,7 +83,7 @@ func (s *SplitStore) reifyWorker(workch chan cid.Cid) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *SplitStore) doReify(c cid.Cid) {
|
func (s *SplitStore) doReify(c cid.Cid) {
|
||||||
var toreify, totrack, toforget []cid.Cid
|
var toreify, toforget []cid.Cid
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
s.reifyMx.Lock()
|
s.reifyMx.Lock()
|
||||||
@@ -92,9 +92,6 @@ func (s *SplitStore) doReify(c cid.Cid) {
|
|||||||
for _, c := range toreify {
|
for _, c := range toreify {
|
||||||
delete(s.reifyInProgress, c)
|
delete(s.reifyInProgress, c)
|
||||||
}
|
}
|
||||||
for _, c := range totrack {
|
|
||||||
delete(s.reifyInProgress, c)
|
|
||||||
}
|
|
||||||
for _, c := range toforget {
|
for _, c := range toforget {
|
||||||
delete(s.reifyInProgress, c)
|
delete(s.reifyInProgress, c)
|
||||||
}
|
}
|
||||||
@@ -104,7 +101,7 @@ func (s *SplitStore) doReify(c cid.Cid) {
|
|||||||
defer s.txnLk.RUnlock()
|
defer s.txnLk.RUnlock()
|
||||||
|
|
||||||
count := 0
|
count := 0
|
||||||
err := s.walkObjectIncomplete(c, newTmpVisitor(),
|
_, err := s.walkObjectIncomplete(c, newTmpVisitor(),
|
||||||
func(c cid.Cid) error {
|
func(c cid.Cid) error {
|
||||||
if isUnitaryObject(c) {
|
if isUnitaryObject(c) {
|
||||||
return errStopWalk
|
return errStopWalk
|
||||||
@@ -131,19 +128,10 @@ func (s *SplitStore) doReify(c cid.Cid) {
|
|||||||
return xerrors.Errorf("error checking hotstore: %w", err)
|
return xerrors.Errorf("error checking hotstore: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// All reified blocks are tracked at reification start
|
||||||
if has {
|
if has {
|
||||||
if s.txnMarkSet != nil {
|
toforget = append(toforget, c)
|
||||||
hasMark, err := s.txnMarkSet.Has(c)
|
return errStopWalk
|
||||||
if err != nil {
|
|
||||||
log.Warnf("error checking markset: %s", err)
|
|
||||||
} else if hasMark {
|
|
||||||
toforget = append(toforget, c)
|
|
||||||
return errStopWalk
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
totrack = append(totrack, c)
|
|
||||||
return errStopWalk
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
toreify = append(toreify, c)
|
toreify = append(toreify, c)
|
||||||
@@ -155,7 +143,7 @@ func (s *SplitStore) doReify(c cid.Cid) {
|
|||||||
})
|
})
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if xerrors.Is(err, errReifyLimit) {
|
if errors.Is(err, errReifyLimit) {
|
||||||
log.Debug("reification aborted; reify limit reached")
|
log.Debug("reification aborted; reify limit reached")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -190,24 +178,4 @@ func (s *SplitStore) doReify(c cid.Cid) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if s.txnMarkSet != nil {
|
|
||||||
if len(toreify) > 0 {
|
|
||||||
if err := s.txnMarkSet.MarkMany(toreify); err != nil {
|
|
||||||
log.Warnf("error marking reified objects: %s", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if len(totrack) > 0 {
|
|
||||||
if err := s.txnMarkSet.MarkMany(totrack); err != nil {
|
|
||||||
log.Warnf("error marking tracked objects: %s", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// if txnActive is false these are noops
|
|
||||||
if len(toreify) > 0 {
|
|
||||||
s.trackTxnRefMany(toreify)
|
|
||||||
}
|
|
||||||
if len(totrack) > 0 {
|
|
||||||
s.trackTxnRefMany(totrack)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
//stm: #unit
|
// stm: #unit
|
||||||
package splitstore
|
package splitstore
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -11,11 +11,11 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
blocks "github.com/ipfs/go-block-format"
|
|
||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
"github.com/ipfs/go-datastore"
|
"github.com/ipfs/go-datastore"
|
||||||
dssync "github.com/ipfs/go-datastore/sync"
|
dssync "github.com/ipfs/go-datastore/sync"
|
||||||
ipld "github.com/ipfs/go-ipld-format"
|
ipld "github.com/ipfs/go-ipld-format"
|
||||||
|
blocks "github.com/ipfs/go-libipfs/blocks"
|
||||||
logging "github.com/ipfs/go-log/v2"
|
logging "github.com/ipfs/go-log/v2"
|
||||||
mh "github.com/multiformats/go-multihash"
|
mh "github.com/multiformats/go-multihash"
|
||||||
|
|
||||||
@@ -38,6 +38,7 @@ func init() {
|
|||||||
func testSplitStore(t *testing.T, cfg *Config) {
|
func testSplitStore(t *testing.T, cfg *Config) {
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
chain := &mockChain{t: t}
|
chain := &mockChain{t: t}
|
||||||
|
fmt.Printf("Config: %v\n", cfg)
|
||||||
|
|
||||||
// the myriads of stores
|
// the myriads of stores
|
||||||
ds := dssync.MutexWrap(datastore.NewMapDatastore())
|
ds := dssync.MutexWrap(datastore.NewMapDatastore())
|
||||||
@@ -225,7 +226,7 @@ func TestSplitStoreCompaction(t *testing.T) {
|
|||||||
//stm: @SPLITSTORE_SPLITSTORE_OPEN_001, @SPLITSTORE_SPLITSTORE_CLOSE_001
|
//stm: @SPLITSTORE_SPLITSTORE_OPEN_001, @SPLITSTORE_SPLITSTORE_CLOSE_001
|
||||||
//stm: @SPLITSTORE_SPLITSTORE_PUT_001, @SPLITSTORE_SPLITSTORE_ADD_PROTECTOR_001
|
//stm: @SPLITSTORE_SPLITSTORE_PUT_001, @SPLITSTORE_SPLITSTORE_ADD_PROTECTOR_001
|
||||||
//stm: @SPLITSTORE_SPLITSTORE_CLOSE_001
|
//stm: @SPLITSTORE_SPLITSTORE_CLOSE_001
|
||||||
testSplitStore(t, &Config{MarkSetType: "map"})
|
testSplitStore(t, &Config{MarkSetType: "map", UniversalColdBlocks: true})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestSplitStoreCompactionWithBadger(t *testing.T) {
|
func TestSplitStoreCompactionWithBadger(t *testing.T) {
|
||||||
@@ -237,7 +238,7 @@ func TestSplitStoreCompactionWithBadger(t *testing.T) {
|
|||||||
t.Cleanup(func() {
|
t.Cleanup(func() {
|
||||||
badgerMarkSetBatchSize = bs
|
badgerMarkSetBatchSize = bs
|
||||||
})
|
})
|
||||||
testSplitStore(t, &Config{MarkSetType: "badger"})
|
testSplitStore(t, &Config{MarkSetType: "badger", UniversalColdBlocks: true})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestSplitStoreSuppressCompactionNearUpgrade(t *testing.T) {
|
func TestSplitStoreSuppressCompactionNearUpgrade(t *testing.T) {
|
||||||
@@ -283,7 +284,7 @@ func TestSplitStoreSuppressCompactionNearUpgrade(t *testing.T) {
|
|||||||
path := t.TempDir()
|
path := t.TempDir()
|
||||||
|
|
||||||
// open the splitstore
|
// open the splitstore
|
||||||
ss, err := Open(path, ds, hot, cold, &Config{MarkSetType: "map"})
|
ss, err := Open(path, ds, hot, cold, &Config{MarkSetType: "map", UniversalColdBlocks: true})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
@@ -422,7 +423,7 @@ func testSplitStoreReification(t *testing.T, f func(context.Context, blockstore.
|
|||||||
|
|
||||||
path := t.TempDir()
|
path := t.TempDir()
|
||||||
|
|
||||||
ss, err := Open(path, ds, hot, cold, &Config{MarkSetType: "map"})
|
ss, err := Open(path, ds, hot, cold, &Config{MarkSetType: "map", UniversalColdBlocks: true})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
@@ -522,7 +523,7 @@ func testSplitStoreReificationLimit(t *testing.T, f func(context.Context, blocks
|
|||||||
|
|
||||||
path := t.TempDir()
|
path := t.TempDir()
|
||||||
|
|
||||||
ss, err := Open(path, ds, hot, cold, &Config{MarkSetType: "map"})
|
ss, err := Open(path, ds, hot, cold, &Config{MarkSetType: "map", UniversalColdBlocks: true})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
@@ -756,6 +757,8 @@ func (b *mockStore) DeleteMany(_ context.Context, cids []cid.Cid) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (b *mockStore) Flush(context.Context) error { return nil }
|
||||||
|
|
||||||
func (b *mockStore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) {
|
func (b *mockStore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) {
|
||||||
return nil, errors.New("not implemented")
|
return nil, errors.New("not implemented")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,9 +5,9 @@ import (
|
|||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
blocks "github.com/ipfs/go-block-format"
|
|
||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
ipld "github.com/ipfs/go-ipld-format"
|
ipld "github.com/ipfs/go-ipld-format"
|
||||||
|
blocks "github.com/ipfs/go-libipfs/blocks"
|
||||||
"golang.org/x/xerrors"
|
"golang.org/x/xerrors"
|
||||||
|
|
||||||
"github.com/filecoin-project/go-state-types/abi"
|
"github.com/filecoin-project/go-state-types/abi"
|
||||||
@@ -21,14 +21,14 @@ var (
|
|||||||
WarmupBoundary = build.Finality
|
WarmupBoundary = build.Finality
|
||||||
)
|
)
|
||||||
|
|
||||||
// warmup acuiqres the compaction lock and spawns a goroutine to warm up the hotstore;
|
// warmup acquires the compaction lock and spawns a goroutine to warm up the hotstore;
|
||||||
// this is necessary when we sync from a snapshot or when we enable the splitstore
|
// this is necessary when we sync from a snapshot or when we enable the splitstore
|
||||||
// on top of an existing blockstore (which becomes the coldstore).
|
// on top of an existing blockstore (which becomes the coldstore).
|
||||||
func (s *SplitStore) warmup(curTs *types.TipSet) error {
|
func (s *SplitStore) warmup(curTs *types.TipSet) error {
|
||||||
if !atomic.CompareAndSwapInt32(&s.compacting, 0, 1) {
|
if !atomic.CompareAndSwapInt32(&s.compacting, 0, 1) {
|
||||||
return xerrors.Errorf("error locking compaction")
|
return xerrors.Errorf("error locking compaction")
|
||||||
}
|
}
|
||||||
|
s.compactType = warmup
|
||||||
go func() {
|
go func() {
|
||||||
defer atomic.StoreInt32(&s.compacting, 0)
|
defer atomic.StoreInt32(&s.compacting, 0)
|
||||||
|
|
||||||
@@ -110,7 +110,7 @@ func (s *SplitStore) doWarmup(curTs *types.TipSet) error {
|
|||||||
mx.Unlock()
|
mx.Unlock()
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
})
|
}, func(cid.Cid) error { return nil })
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|||||||
+3
-1
@@ -4,8 +4,8 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
blocks "github.com/ipfs/go-block-format"
|
|
||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
|
blocks "github.com/ipfs/go-libipfs/blocks"
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewMemorySync returns a thread-safe in-memory blockstore.
|
// NewMemorySync returns a thread-safe in-memory blockstore.
|
||||||
@@ -20,6 +20,8 @@ type SyncBlockstore struct {
|
|||||||
bs MemBlockstore // specifically use a memStore to save indirection overhead.
|
bs MemBlockstore // specifically use a memStore to save indirection overhead.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (*SyncBlockstore) Flush(context.Context) error { return nil }
|
||||||
|
|
||||||
func (m *SyncBlockstore) DeleteBlock(ctx context.Context, k cid.Cid) error {
|
func (m *SyncBlockstore) DeleteBlock(ctx context.Context, k cid.Cid) error {
|
||||||
m.mu.Lock()
|
m.mu.Lock()
|
||||||
defer m.mu.Unlock()
|
defer m.mu.Unlock()
|
||||||
|
|||||||
+16
-5
@@ -6,9 +6,9 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
blocks "github.com/ipfs/go-block-format"
|
|
||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
ipld "github.com/ipfs/go-ipld-format"
|
ipld "github.com/ipfs/go-ipld-format"
|
||||||
|
blocks "github.com/ipfs/go-libipfs/blocks"
|
||||||
"github.com/raulk/clock"
|
"github.com/raulk/clock"
|
||||||
"go.uber.org/multierr"
|
"go.uber.org/multierr"
|
||||||
)
|
)
|
||||||
@@ -93,6 +93,16 @@ func (t *TimedCacheBlockstore) rotate() {
|
|||||||
t.mu.Unlock()
|
t.mu.Unlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (t *TimedCacheBlockstore) Flush(ctx context.Context) error {
|
||||||
|
t.mu.Lock()
|
||||||
|
defer t.mu.Unlock()
|
||||||
|
|
||||||
|
if err := t.active.Flush(ctx); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return t.inactive.Flush(ctx)
|
||||||
|
}
|
||||||
|
|
||||||
func (t *TimedCacheBlockstore) Put(ctx context.Context, b blocks.Block) error {
|
func (t *TimedCacheBlockstore) Put(ctx context.Context, b blocks.Block) error {
|
||||||
// Don't check the inactive set here. We want to keep this block for at
|
// Don't check the inactive set here. We want to keep this block for at
|
||||||
// least one interval.
|
// least one interval.
|
||||||
@@ -176,11 +186,12 @@ func (t *TimedCacheBlockstore) AllKeysChan(_ context.Context) (<-chan cid.Cid, e
|
|||||||
defer t.mu.RUnlock()
|
defer t.mu.RUnlock()
|
||||||
|
|
||||||
ch := make(chan cid.Cid, len(t.active)+len(t.inactive))
|
ch := make(chan cid.Cid, len(t.active)+len(t.inactive))
|
||||||
for c := range t.active {
|
for _, b := range t.active {
|
||||||
ch <- c
|
ch <- b.Cid()
|
||||||
}
|
}
|
||||||
for c := range t.inactive {
|
for _, b := range t.inactive {
|
||||||
if _, ok := t.active[c]; ok {
|
c := b.Cid()
|
||||||
|
if _, ok := t.active[string(c.Hash())]; ok {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
ch <- c
|
ch <- c
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
//stm: #unit
|
// stm: #unit
|
||||||
package blockstore
|
package blockstore
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -6,8 +6,8 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
blocks "github.com/ipfs/go-block-format"
|
|
||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
|
blocks "github.com/ipfs/go-libipfs/blocks"
|
||||||
"github.com/raulk/clock"
|
"github.com/raulk/clock"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|||||||
+13
-5
@@ -3,19 +3,18 @@ package blockstore
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
blocks "github.com/ipfs/go-block-format"
|
|
||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
ipld "github.com/ipfs/go-ipld-format"
|
ipld "github.com/ipfs/go-ipld-format"
|
||||||
|
blocks "github.com/ipfs/go-libipfs/blocks"
|
||||||
)
|
)
|
||||||
|
|
||||||
type unionBlockstore []Blockstore
|
type unionBlockstore []Blockstore
|
||||||
|
|
||||||
// Union returns an unioned blockstore.
|
// Union returns an unioned blockstore.
|
||||||
//
|
//
|
||||||
// * Reads return from the first blockstore that has the value, querying in the
|
// - Reads return from the first blockstore that has the value, querying in the
|
||||||
// supplied order.
|
// supplied order.
|
||||||
// * Writes (puts and deletes) are broadcast to all stores.
|
// - Writes (puts and deletes) are broadcast to all stores.
|
||||||
//
|
|
||||||
func Union(stores ...Blockstore) Blockstore {
|
func Union(stores ...Blockstore) Blockstore {
|
||||||
return unionBlockstore(stores)
|
return unionBlockstore(stores)
|
||||||
}
|
}
|
||||||
@@ -56,6 +55,15 @@ func (m unionBlockstore) GetSize(ctx context.Context, cid cid.Cid) (size int, er
|
|||||||
return size, err
|
return size, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m unionBlockstore) Flush(ctx context.Context) (err error) {
|
||||||
|
for _, bs := range m {
|
||||||
|
if err = bs.Flush(ctx); err != nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
func (m unionBlockstore) Put(ctx context.Context, block blocks.Block) (err error) {
|
func (m unionBlockstore) Put(ctx context.Context, block blocks.Block) (err error) {
|
||||||
for _, bs := range m {
|
for _, bs := range m {
|
||||||
if err = bs.Put(ctx, block); err != nil {
|
if err = bs.Put(ctx, block); err != nil {
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
//stm: #unit
|
// stm: #unit
|
||||||
package blockstore
|
package blockstore
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
blocks "github.com/ipfs/go-block-format"
|
blocks "github.com/ipfs/go-libipfs/blocks"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -13,6 +13,7 @@ var (
|
|||||||
b0 = blocks.NewBlock([]byte("abc"))
|
b0 = blocks.NewBlock([]byte("abc"))
|
||||||
b1 = blocks.NewBlock([]byte("foo"))
|
b1 = blocks.NewBlock([]byte("foo"))
|
||||||
b2 = blocks.NewBlock([]byte("bar"))
|
b2 = blocks.NewBlock([]byte("bar"))
|
||||||
|
b3 = blocks.NewBlock([]byte("baz"))
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestUnionBlockstore_Get(t *testing.T) {
|
func TestUnionBlockstore_Get(t *testing.T) {
|
||||||
|
|||||||
@@ -52,4 +52,4 @@ popd
|
|||||||
|
|
||||||
echo "Generating metadata..."
|
echo "Generating metadata..."
|
||||||
|
|
||||||
make -C ../../ bundle-gen
|
make -C ../../ VERSION="$VERSION" RELEASE="$RELEASE" RELEASE_OVERRIDES="${RELEASE_OVERRIDES[*]}" bundle-gen
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1
-1
@@ -6,7 +6,7 @@ import (
|
|||||||
"path"
|
"path"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/libp2p/go-libp2p-core/peer"
|
"github.com/libp2p/go-libp2p/core/peer"
|
||||||
|
|
||||||
"github.com/filecoin-project/lotus/lib/addrutil"
|
"github.com/filecoin-project/lotus/lib/addrutil"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
/dns4/bootstrap-0.butterfly.fildev.network/tcp/1347/p2p/12D3KooWSUZhAY3eyoPUboJ1ZWe4dNPFWTr1EPoDjbTDSAN15uhY
|
/dns4/bootstrap-0.butterfly.fildev.network/tcp/1347/p2p/12D3KooWD5mtdmjHQ1Puj9Md7SEfoa7kWMpwqUhAKsyYsBP56LQC
|
||||||
/dns4/bootstrap-1.butterfly.fildev.network/tcp/1347/p2p/12D3KooWDfvNrSRVGWAGbn3sm9C8z98W2x25qCZjaXGHXmGiH24e
|
/dns4/bootstrap-1.butterfly.fildev.network/tcp/1347/p2p/12D3KooWEoYPkm6o87ES6AppFY7d7WHJUQg7XVPRAyQZjEU31efQ
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/dns4/bootstrap-0.calibration.fildev.network/tcp/1347/p2p/12D3KooWJkikQQkxS58spo76BYzFt4fotaT5NpV2zngvrqm4u5ow
|
/dns4/bootstrap-0.calibration.fildev.network/tcp/1347/p2p/12D3KooWCi2w8U4DDB9xqrejb5KYHaQv2iA2AJJ6uzG3iQxNLBMy
|
||||||
/dns4/bootstrap-1.calibration.fildev.network/tcp/1347/p2p/12D3KooWLce5FDHR4EX4CrYavphA5xS3uDsX6aoowXh5tzDUxJav
|
/dns4/bootstrap-1.calibration.fildev.network/tcp/1347/p2p/12D3KooWDTayrBojBn9jWNNUih4nNQQBGJD7Zo3gQCKgBkUsS6dp
|
||||||
/dns4/bootstrap-2.calibration.fildev.network/tcp/1347/p2p/12D3KooWA9hFfQG9GjP6bHeuQQbMD3FDtZLdW1NayxKXUT26PQZu
|
/dns4/bootstrap-2.calibration.fildev.network/tcp/1347/p2p/12D3KooWNRxTHUn8bf7jz1KEUPMc2dMgGfa4f8ZJTsquVSn3vHCG
|
||||||
/dns4/bootstrap-3.calibration.fildev.network/tcp/1347/p2p/12D3KooWMHDi3LVTFG8Szqogt7RkNXvonbQYqSazxBx41A5aeuVz
|
/dns4/bootstrap-3.calibration.fildev.network/tcp/1347/p2p/12D3KooWFWUqE9jgXvcKHWieYs9nhyp6NF4ftwLGAHm4sCv73jjK
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
/dns4/bootstrap-0.interop.fildev.network/tcp/1347/p2p/12D3KooWDY249nj6gxSiBTocNBnkbBBvnfPgkxq5SBUVrccjwRnr
|
/dns4/bootstrap-0.interop.fildev.network/tcp/1347/p2p/12D3KooWDpppr8csCNvEPnD2Z83KTPdBTM7iJhL66qK8LK3bB5NU
|
||||||
/dns4/bootstrap-1.interop.fildev.network/tcp/1347/p2p/12D3KooWCwFsKt4NyoJQk7vjiACXL9LznBWANXKjCebKJ7MHh3h4
|
/dns4/bootstrap-1.interop.fildev.network/tcp/1347/p2p/12D3KooWR3K1sXWoDYcXWqDF26mFEM1o1g7e7fcVR3NYE7rn24Gs
|
||||||
|
|||||||
+12
-9
@@ -18,6 +18,8 @@ import (
|
|||||||
"github.com/ipld/go-car"
|
"github.com/ipld/go-car"
|
||||||
"golang.org/x/xerrors"
|
"golang.org/x/xerrors"
|
||||||
|
|
||||||
|
actorstypes "github.com/filecoin-project/go-state-types/actors"
|
||||||
|
|
||||||
"github.com/filecoin-project/lotus/blockstore"
|
"github.com/filecoin-project/lotus/blockstore"
|
||||||
"github.com/filecoin-project/lotus/chain/actors"
|
"github.com/filecoin-project/lotus/chain/actors"
|
||||||
"github.com/filecoin-project/lotus/chain/actors/adt"
|
"github.com/filecoin-project/lotus/chain/actors/adt"
|
||||||
@@ -28,14 +30,14 @@ var embeddedBuiltinActorReleases embed.FS
|
|||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
if BundleOverrides == nil {
|
if BundleOverrides == nil {
|
||||||
BundleOverrides = make(map[actors.Version]string)
|
BundleOverrides = make(map[actorstypes.Version]string)
|
||||||
}
|
}
|
||||||
for _, av := range actors.Versions {
|
for _, av := range actors.Versions {
|
||||||
path := os.Getenv(fmt.Sprintf("LOTUS_BUILTIN_ACTORS_V%d_BUNDLE", av))
|
path := os.Getenv(fmt.Sprintf("LOTUS_BUILTIN_ACTORS_V%d_BUNDLE", av))
|
||||||
if path == "" {
|
if path == "" {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
BundleOverrides[actors.Version(av)] = path
|
BundleOverrides[actorstypes.Version(av)] = path
|
||||||
}
|
}
|
||||||
if err := loadManifests(NetworkBundle); err != nil {
|
if err := loadManifests(NetworkBundle); err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
@@ -55,7 +57,7 @@ func UseNetworkBundle(netw string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func loadManifests(netw string) error {
|
func loadManifests(netw string) error {
|
||||||
overridden := make(map[actors.Version]struct{})
|
overridden := make(map[actorstypes.Version]struct{})
|
||||||
var newMetadata []*BuiltinActorsMetadata
|
var newMetadata []*BuiltinActorsMetadata
|
||||||
// First, prefer overrides.
|
// First, prefer overrides.
|
||||||
for av, path := range BundleOverrides {
|
for av, path := range BundleOverrides {
|
||||||
@@ -93,10 +95,11 @@ func loadManifests(netw string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type BuiltinActorsMetadata struct {
|
type BuiltinActorsMetadata struct {
|
||||||
Network string
|
Network string
|
||||||
Version actors.Version
|
Version actorstypes.Version
|
||||||
ManifestCid cid.Cid
|
ManifestCid cid.Cid
|
||||||
Actors map[string]cid.Cid
|
Actors map[string]cid.Cid
|
||||||
|
BundleGitTag string
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReadEmbeddedBuiltinActorsMetadata reads the metadata from the embedded built-in actor bundles.
|
// ReadEmbeddedBuiltinActorsMetadata reads the metadata from the embedded built-in actor bundles.
|
||||||
@@ -182,7 +185,7 @@ func readEmbeddedBuiltinActorsMetadata(bundle string) ([]*BuiltinActorsMetadata,
|
|||||||
}
|
}
|
||||||
bundles = append(bundles, &BuiltinActorsMetadata{
|
bundles = append(bundles, &BuiltinActorsMetadata{
|
||||||
Network: name,
|
Network: name,
|
||||||
Version: actors.Version(version),
|
Version: actorstypes.Version(version),
|
||||||
ManifestCid: root,
|
ManifestCid: root,
|
||||||
Actors: actorCids,
|
Actors: actorCids,
|
||||||
})
|
})
|
||||||
@@ -229,7 +232,7 @@ func readBundleManifest(r io.Reader) (cid.Cid, map[string]cid.Cid, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// GetEmbeddedBuiltinActorsBundle returns the builtin-actors bundle for the given actors version.
|
// GetEmbeddedBuiltinActorsBundle returns the builtin-actors bundle for the given actors version.
|
||||||
func GetEmbeddedBuiltinActorsBundle(version actors.Version) ([]byte, bool) {
|
func GetEmbeddedBuiltinActorsBundle(version actorstypes.Version) ([]byte, bool) {
|
||||||
fi, err := embeddedBuiltinActorReleases.Open(fmt.Sprintf("actors/v%d.tar.zst", version))
|
fi, err := embeddedBuiltinActorReleases.Open(fmt.Sprintf("actors/v%d.tar.zst", version))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, false
|
return nil, false
|
||||||
|
|||||||
+537
-38
@@ -7,25 +7,97 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var EmbeddedBuiltinActorsMetadata []*BuiltinActorsMetadata = []*BuiltinActorsMetadata{{
|
var EmbeddedBuiltinActorsMetadata []*BuiltinActorsMetadata = []*BuiltinActorsMetadata{{
|
||||||
Network: "butterflynet",
|
Network: "butterflynet",
|
||||||
Version: 8,
|
Version: 8,
|
||||||
ManifestCid: MustParseCid("bafy2bzacedvaarfyh6q3bk4dyzux46ednlace2ckxp5nbyn6mb3da2apqn6sk"),
|
|
||||||
|
ManifestCid: MustParseCid("bafy2bzaceba5qgs4z3imhlxwds5vamahngatvuuglbv5yl3ftfiosj6ud5chs"),
|
||||||
Actors: map[string]cid.Cid{
|
Actors: map[string]cid.Cid{
|
||||||
"account": MustParseCid("bafk2bzaceavzeu4gqte7o33vr4htiaapiwpfq6p26tgdkqla2baqhmiqswfso"),
|
"account": MustParseCid("bafk2bzacebd5zetyjtragjwrv2nqktct6u2pmsi4eifbanovxohx3a7lszjxi"),
|
||||||
"cron": MustParseCid("bafk2bzacech35onpqxep4yox36k7sr4mj4bch54s3i4b3yyaustrbo5xwfbfs"),
|
"cron": MustParseCid("bafk2bzacecrszortqkc7har77ssgajglymv6ftrqvmdko5h2yqqh5k2qospl2"),
|
||||||
"init": MustParseCid("bafk2bzaceahxin3sf5f6ude5j6we4yeqlg66s5qe4tu7lwp26jcg7yp2ns6hi"),
|
"datacap": MustParseCid("bafk2bzacecapjnxnyw4talwqv5ajbtbkzmzqiosztj5cb3sortyp73ndjl76e"),
|
||||||
"multisig": MustParseCid("bafk2bzacectfmzjtniypgl4whm42sws5aupihqgfikwsr7p5yoq3bmqaogldi"),
|
"eam": MustParseCid("bafk2bzacecflry2dyjqj6fhpovkbcbei377zabectznuxsf6bxggsve7bsxga"),
|
||||||
"paymentchannel": MustParseCid("bafk2bzacecbwu54ce5mjgp2pqxyj6kpn2vlgiu5wv2lj2byjiegxnn3infd5i"),
|
"ethaccount": MustParseCid("bafk2bzacedl4pmkfxkzoqajs6im3ranmopozsmxjcxsnk3kwvd3vv7mfwwrf4"),
|
||||||
"reward": MustParseCid("bafk2bzacecskkbhe6c4ud5jt62wg4w7j7shj6xdwoyic74s5y6pgywxxvnw72"),
|
"evm": MustParseCid("bafk2bzacebgzvmvwv7rsnnhp3zhqbiqkumvyrc7pazfovpptgpgtqkalrli74"),
|
||||||
"storagemarket": MustParseCid("bafk2bzacebycxcwwm7hwhuhpasaskil2kxaqb7tins7azdvvm72rorlciuysi"),
|
"init": MustParseCid("bafk2bzacecbxp66q3ytjkg37nyv4rmzezbfaigvx4i5yhvqbm5gg4amjeaias"),
|
||||||
"storageminer": MustParseCid("bafk2bzacecgx3etor5m6lahpmjdwqnryutqe6naiurfhgsju72rd4nqssutbg"),
|
"multisig": MustParseCid("bafk2bzacecjltag3mn75dsnmrmopjow27buxqhabissowayqlmavrcfetqswc"),
|
||||||
"storagepower": MustParseCid("bafk2bzaceayvy6xyp5cwtngm457c5hssvihidppgq3o7gy3dlmhgor3yzujoc"),
|
"paymentchannel": MustParseCid("bafk2bzacednzxg263eqbl2imwz3uhujov63tjkffieyl4hl3dhrgxyhwep6hc"),
|
||||||
"system": MustParseCid("bafk2bzacec6xctjxybp7r3kkhase56o6jsaiua7ure5ttu2xfuojt4jhlsoa6"),
|
"placeholder": MustParseCid("bafk2bzaceaamp2a35vpfml4skap4dffklzae2urcm34mtwwce2lvhaons3a5y"),
|
||||||
"verifiedregistry": MustParseCid("bafk2bzacec2hcqlqcfacylfcrhhliwkisvh4y3adwt47xkf2gdvodwu6ccepc"),
|
"reward": MustParseCid("bafk2bzacectp23cxsbbdrr3uggnw7f263qll5wkkfzqhn5yq37ae2ehdjdzri"),
|
||||||
|
"storagemarket": MustParseCid("bafk2bzacea45ko3ezkpeujsniovncwnizc4wsxd7kyckskhs7gvzwthzb2mqe"),
|
||||||
|
"storageminer": MustParseCid("bafk2bzaced74qthwrl3gahcf7o3vrdrodbcqhlplh6fykbgy5sd2iyouhq44c"),
|
||||||
|
"storagepower": MustParseCid("bafk2bzaceduksv6wqthr5fgp7mx5prv6gzul2oozf3svrjbuggc4bgokdxgfy"),
|
||||||
|
"system": MustParseCid("bafk2bzacebe6j2ius6clbbr7dypsg54jzmn5xablzunph7ebedw6yhwla4cj2"),
|
||||||
|
"verifiedregistry": MustParseCid("bafk2bzacebu4joy25gneu2qv3qfm3ktakzalndjrbhekeqrqk3zhotv6nyy2g"),
|
||||||
},
|
},
|
||||||
}, {
|
}, {
|
||||||
Network: "calibrationnet",
|
Network: "butterflynet",
|
||||||
Version: 8,
|
Version: 9,
|
||||||
|
|
||||||
|
ManifestCid: MustParseCid("bafy2bzacec35by4erhcdgcsgzp7yb3j57utydlxxfc73m3k5pep67ehvvyv6i"),
|
||||||
|
Actors: map[string]cid.Cid{
|
||||||
|
"account": MustParseCid("bafk2bzaceajsdln7v4chxqoukiw7lxw6aexg5qdsaex2hgelz2sbu24iblhzg"),
|
||||||
|
"cron": MustParseCid("bafk2bzacecgrwmgnqhybn3l23uvwf2n2vrcfjrprfzgd44uxers2pgr5mhsue"),
|
||||||
|
"datacap": MustParseCid("bafk2bzacebyier2ceh27acbrq2ccv4efvzotl6qntnlrxdsrik6i4tembz6qw"),
|
||||||
|
"init": MustParseCid("bafk2bzaceberhto43wnf4pklkd4c7d36kzslngyzyms4op7shxuswv3dtvfxu"),
|
||||||
|
"multisig": MustParseCid("bafk2bzaceaclpbrhoqdruvsuqqgknvy2k5dywzmjoehk4uarce3uvt3w2rewu"),
|
||||||
|
"paymentchannel": MustParseCid("bafk2bzacedzp56g5cg73oilloak3kf7u667rdkd5pgnhe2cljmr3o7ykcrzuk"),
|
||||||
|
"reward": MustParseCid("bafk2bzacebczbwfbbi6mvppbjcozatasjiaohvjjiqcy65ccuuyyw3xiixhk2"),
|
||||||
|
"storagemarket": MustParseCid("bafk2bzaceawqexy6t2ybzh3jjwhbs7icbg5vqnedbbge4e4r4pfp7spkcadsu"),
|
||||||
|
"storageminer": MustParseCid("bafk2bzacearemd7pn2jj26fdtqd4di27lfhpng3vp5chepm7qnmdzgiqr6wfi"),
|
||||||
|
"storagepower": MustParseCid("bafk2bzaceddc7fiaxfobfegqaobf5xinjgmhsa5iu4yi6klvc3jmjimcdvgyg"),
|
||||||
|
"system": MustParseCid("bafk2bzacedylltr57b2n6zpadh4i2c2kis4fzzvhao3kgvfaggrrbqyacew7q"),
|
||||||
|
"verifiedregistry": MustParseCid("bafk2bzacecjkesz766626ab4svnzpq3jfs26a75vfktlfaku5fjdao2eyiqyq"),
|
||||||
|
},
|
||||||
|
}, {
|
||||||
|
Network: "butterflynet",
|
||||||
|
Version: 10,
|
||||||
|
|
||||||
|
ManifestCid: MustParseCid("bafy2bzaceckjhsggacixv2d377zfdcnuio4hzkveprio3xnhm3gohi3zy3zco"),
|
||||||
|
Actors: map[string]cid.Cid{
|
||||||
|
"account": MustParseCid("bafk2bzacedkt3uzgugcsdrcsyfvizcpyr5eshltmienbyhjne2t7t3ktkihny"),
|
||||||
|
"cron": MustParseCid("bafk2bzacecrehknegmfnhmhwy2g43cw52mvl7ptfpp44syus4iph7az7uveuq"),
|
||||||
|
"datacap": MustParseCid("bafk2bzaced4krgbpj4sywcc453l3pygqr4qocc6nxylhztsm4duvkgfwd7vws"),
|
||||||
|
"eam": MustParseCid("bafk2bzacebn5lyg5pfhjpdlf3r7lnah4x33bhp5afftdgbr4kbpuioytr4bhe"),
|
||||||
|
"ethaccount": MustParseCid("bafk2bzaceaxyu24a2tbiacfr4p367xjtptrbang4qrh3fx65cojyrzolwyi4u"),
|
||||||
|
"evm": MustParseCid("bafk2bzacea5bqaubqeuqmpguxrem2pgocjr43wcfi5e3jpw2e3b4o6tcvs746"),
|
||||||
|
"init": MustParseCid("bafk2bzaceaufptkdg2gc4eq4ijqxtqp7wxwifusxb6kxay3vdz3wr5epqjbho"),
|
||||||
|
"multisig": MustParseCid("bafk2bzacedp3c26ccw3l7fci4xhedxhqeqevkubuf5okuslq7o7rcqwqfahci"),
|
||||||
|
"paymentchannel": MustParseCid("bafk2bzacedlmiqvbutz4ebx2mezy3pqj72x2yt4gwea7sf4dv4a4s7xidelok"),
|
||||||
|
"placeholder": MustParseCid("bafk2bzacedfvut2myeleyq67fljcrw4kkmn5pb5dpyozovj7jpoez5irnc3ro"),
|
||||||
|
"reward": MustParseCid("bafk2bzacecrzxiowkhzpgz4rl2pdldzwmmnctuq5zzntqjkgyhyfllo3afb5s"),
|
||||||
|
"storagemarket": MustParseCid("bafk2bzacebh2q3ofolirt5q2jpx367dfv22aecevsmybba3yhnxfs3foe6c5q"),
|
||||||
|
"storageminer": MustParseCid("bafk2bzaceavop4j7iwneew6h7p667gvx37baloxilxetwkhsrr26jme6yye5o"),
|
||||||
|
"storagepower": MustParseCid("bafk2bzacecfblbat4w7jkxx7kjst33lowyb7s6apdnl7fsnpmy5c3jfq5kvye"),
|
||||||
|
"system": MustParseCid("bafk2bzacebojf25kc5yo7gskdbdgg5f52oppej2jp6nknzlvrww4ue5vkddd2"),
|
||||||
|
"verifiedregistry": MustParseCid("bafk2bzaceavue3zekq4wmvttck2vgxlcensrsgh5niu5qhna2owejycorftcc"),
|
||||||
|
},
|
||||||
|
}, {
|
||||||
|
Network: "butterflynet",
|
||||||
|
Version: 11,
|
||||||
|
BundleGitTag: "v11.0.0",
|
||||||
|
ManifestCid: MustParseCid("bafy2bzaceaiy4dsxxus5xp5n5i4tjzkb7sc54mjz7qnk2efhgmsrobjesxnza"),
|
||||||
|
Actors: map[string]cid.Cid{
|
||||||
|
"account": MustParseCid("bafk2bzacecfdqb7p3jakhaa3cqnzpt7hxmhghrbxvafsylqno3febx55fnidw"),
|
||||||
|
"cron": MustParseCid("bafk2bzaceavmqu2qihgbe3xdaotgypuzvdpiifnm7ll6rolks2u4lac6voosk"),
|
||||||
|
"datacap": MustParseCid("bafk2bzacealtvh65rzb34fmyzw4m2np2htnio4w3pn4alzqovwxkdbf23dvpo"),
|
||||||
|
"eam": MustParseCid("bafk2bzacedko6hcjmwpuwgma5pb4gr2wgyvregk3nqqjxit7dv4es6vh5cjoc"),
|
||||||
|
"ethaccount": MustParseCid("bafk2bzacedhcei2xnr34poxr4xziypm2obqlibke4cs2cjfnr3sz6nf6h7fyy"),
|
||||||
|
"evm": MustParseCid("bafk2bzacebn5lwxboiikhz67ajwa34v2lc4qevnhpwdnipbmrnutkvrrqkb46"),
|
||||||
|
"init": MustParseCid("bafk2bzacea6vw4esh5tg7mprv5jkbx5xcyilcy4vvf64lss32mjyuvv2mh5ng"),
|
||||||
|
"multisig": MustParseCid("bafk2bzacedq2afnwcfipay5twv5mgzjoio5bbjvyo4yqchdwqcr7wrareyx54"),
|
||||||
|
"paymentchannel": MustParseCid("bafk2bzacebbsvr7i7mqmaadyjibe5wxnv7bwvvec2wlgknuwda6ep45amnd5w"),
|
||||||
|
"placeholder": MustParseCid("bafk2bzacedfvut2myeleyq67fljcrw4kkmn5pb5dpyozovj7jpoez5irnc3ro"),
|
||||||
|
"reward": MustParseCid("bafk2bzaceafuh6idvaqqkj353vs4qdl42tcmvnymewu5zf4rq2nruxdyunses"),
|
||||||
|
"storagemarket": MustParseCid("bafk2bzaceb7bx4honi3byjllpdk6fea32dpu3vqvil3okodybdk5m3erlnwjw"),
|
||||||
|
"storageminer": MustParseCid("bafk2bzacebxjhofdr3sb2uhy2ky2vcijh4nhmwkh5xijtbgk6dzkknji2kn7a"),
|
||||||
|
"storagepower": MustParseCid("bafk2bzaceabskmmkas6njbowols7t4ib3bipa5abpomk3jtgfwojtzd7mjzfm"),
|
||||||
|
"system": MustParseCid("bafk2bzacedtuh7cht3fud7fb4avl4g2zbz57lc4ohiaufpaex6dkmdokn5rgo"),
|
||||||
|
"verifiedregistry": MustParseCid("bafk2bzaceb37hxeuoo5rgf6ansrdl2ykm5v5zp6kireubn4orcopr67jbxv6k"),
|
||||||
|
},
|
||||||
|
}, {
|
||||||
|
Network: "calibrationnet",
|
||||||
|
Version: 8,
|
||||||
|
|
||||||
ManifestCid: MustParseCid("bafy2bzacedrdn6z3z7xz7lx4wll3tlgktirhllzqxb766dxpaqp3ukxsjfsba"),
|
ManifestCid: MustParseCid("bafy2bzacedrdn6z3z7xz7lx4wll3tlgktirhllzqxb766dxpaqp3ukxsjfsba"),
|
||||||
Actors: map[string]cid.Cid{
|
Actors: map[string]cid.Cid{
|
||||||
"account": MustParseCid("bafk2bzacecruossn66xqbeutqx5r4k2kjzgd43frmwd4qkw6haez44ubvvpxo"),
|
"account": MustParseCid("bafk2bzacecruossn66xqbeutqx5r4k2kjzgd43frmwd4qkw6haez44ubvvpxo"),
|
||||||
@@ -41,25 +113,166 @@ var EmbeddedBuiltinActorsMetadata []*BuiltinActorsMetadata = []*BuiltinActorsMet
|
|||||||
"verifiedregistry": MustParseCid("bafk2bzaceaihibfu625lbtzdp3tcftscshrmbgghgrc7kzqhxn4455pycpdkm"),
|
"verifiedregistry": MustParseCid("bafk2bzaceaihibfu625lbtzdp3tcftscshrmbgghgrc7kzqhxn4455pycpdkm"),
|
||||||
},
|
},
|
||||||
}, {
|
}, {
|
||||||
Network: "caterpillarnet",
|
Network: "calibrationnet",
|
||||||
Version: 8,
|
Version: 9,
|
||||||
ManifestCid: MustParseCid("bafy2bzacecsmunz6fzhg53276cixadn6ybhcnzkgbw3la5hf342tfxsdoet26"),
|
|
||||||
|
ManifestCid: MustParseCid("bafy2bzacedbedgynklc4dgpyxippkxmba2mgtw7ecntoneclsvvl4klqwuyyy"),
|
||||||
Actors: map[string]cid.Cid{
|
Actors: map[string]cid.Cid{
|
||||||
"account": MustParseCid("bafk2bzaced6yatl4y2nmqmx2h3btk3np6oelyw2yt57elsb2nfmm33fadzt2g"),
|
"account": MustParseCid("bafk2bzaceavfgpiw6whqigmskk74z4blm22nwjfnzxb4unlqz2e4wg3c5ujpw"),
|
||||||
"cron": MustParseCid("bafk2bzacebrujytq4u7g62jbz52gio5k2s6rhruty7nt4eqq7ygitzxuee5zi"),
|
"cron": MustParseCid("bafk2bzaceb7hxmudhvkizszbmmf2ur2qfnfxfkok3xmbrlifylx6huw4bb3s4"),
|
||||||
"init": MustParseCid("bafk2bzacedajw5ptnwfdidv6m4rvd4c2m7dve4lhfbawygl5idkalcxbiiudu"),
|
"datacap": MustParseCid("bafk2bzaceanmwcfjfj65xy275rrfqqgoblnuqirdg6zwhc6qhbfhpphomvceu"),
|
||||||
"multisig": MustParseCid("bafk2bzaceb3kh5hjh6eebb5236xp7crn2owyyo7irap6sy4ns76uc7om6pxuy"),
|
"init": MustParseCid("bafk2bzaceczqxpivlxifdo5ohr2rx5ny4uyvssm6tkf7am357xm47x472yxu2"),
|
||||||
"paymentchannel": MustParseCid("bafk2bzacedl5am53e4mtxpzligcycxvmkolfkhfiuavww2dq3ukgaqwowj7vw"),
|
"multisig": MustParseCid("bafk2bzacec6gmi7ucukr3bk67akaxwngohw3lsg3obvdazhmfhdzflkszk3tg"),
|
||||||
"reward": MustParseCid("bafk2bzacecbswf242j43cymj3wh7nszawwlofv6z6z4qipb5d32hpxdhxywng"),
|
"paymentchannel": MustParseCid("bafk2bzacec4kg3bfjtssvv2b4wizlbdk3pdtrg5aknzgeb3a6rmksgurpynca"),
|
||||||
"storagemarket": MustParseCid("bafk2bzaceca5ersmg3zxf2cztgktq33bmfjuiqjcjlktwj52xyrpujbdsqvek"),
|
"reward": MustParseCid("bafk2bzacebpptqhcw6mcwdj576dgpryapdd2zfexxvqzlh3aoc24mabwgmcss"),
|
||||||
"storageminer": MustParseCid("bafk2bzacedg2fqaq5udfp3h6cxhywm27dgagxtselfgkyyyunqq362eaxpdm4"),
|
"storagemarket": MustParseCid("bafk2bzacebkfcnc27d3agm2bhzzbvvtbqahmvy2b2nf5xyj4aoxehow3bules"),
|
||||||
"storagepower": MustParseCid("bafk2bzaceb3dm2i2q323e6iozo3r6pyded645vvlpf537kga2a3hu5x7abgl4"),
|
"storageminer": MustParseCid("bafk2bzacebz4na3nq4gmumghegtkaofrv4nffiihd7sxntrryfneusqkuqodm"),
|
||||||
"system": MustParseCid("bafk2bzacebu47th3xerlngqavlipb6cfu2utljkxxzgadc3totogto2tmx2jc"),
|
"storagepower": MustParseCid("bafk2bzaceburxajojmywawjudovqvigmos4dlu4ifdikogumhso2ca2ccaleo"),
|
||||||
"verifiedregistry": MustParseCid("bafk2bzaceci3niq3rmbcmepgn27zvlgci6d5t4dvthx3pbmmx3wcu5elova6i"),
|
"system": MustParseCid("bafk2bzaceaue3nzucbom3tcclgyaahy3iwvbqejsxrohiquakvvsjgbw3shac"),
|
||||||
|
"verifiedregistry": MustParseCid("bafk2bzacebh7dj6j7yi5vadh7lgqjtq42qi2uq4n6zy2g5vjeathacwn2tscu"),
|
||||||
},
|
},
|
||||||
}, {
|
}, {
|
||||||
Network: "devnet",
|
Network: "calibrationnet",
|
||||||
Version: 8,
|
Version: 10,
|
||||||
|
|
||||||
|
ManifestCid: MustParseCid("bafy2bzaced25ta3j6ygs34roprilbtb3f6mxifyfnm7z7ndquaruxzdq3y7lo"),
|
||||||
|
Actors: map[string]cid.Cid{
|
||||||
|
"account": MustParseCid("bafk2bzacebhfuz3sv7duvk653544xsxhdn4lsmy7ol7k6gdgancyctvmd7lnq"),
|
||||||
|
"cron": MustParseCid("bafk2bzacecw2yjb6ysieffa7lk7xd32b3n4ssowvafolt7eq52lp6lk4lkhji"),
|
||||||
|
"datacap": MustParseCid("bafk2bzaceaot6tv6p4cat3cg5fknq22htosw3p5rwyijmdsraatwqyc4qyero"),
|
||||||
|
"eam": MustParseCid("bafk2bzacec5untyj6cefdsfm47wckozw6wt6svqqh5dzh63nu4f6dvf26fkco"),
|
||||||
|
"ethaccount": MustParseCid("bafk2bzacebiyrhz32xwxi6xql67aaq5nrzeelzas472kuwjqmdmgwotpkj35e"),
|
||||||
|
"evm": MustParseCid("bafk2bzaceblpgzid4qjfavuiht6uwvq2lznshklk2qmf5akm3dzx2fczdqdxc"),
|
||||||
|
"init": MustParseCid("bafk2bzacedhxbcglnonzruxf2jpczara73eh735wf2kznatx2u4gsuhgqwffq"),
|
||||||
|
"multisig": MustParseCid("bafk2bzacebv5gdlte2pyovmz6s37me6x2rixaa6a33w6lgqdohmycl23snvwm"),
|
||||||
|
"paymentchannel": MustParseCid("bafk2bzacea7ngq44gedftjlar3j3ql3dmd7e7xkkb6squgxinfncybfmppmlc"),
|
||||||
|
"placeholder": MustParseCid("bafk2bzacedfvut2myeleyq67fljcrw4kkmn5pb5dpyozovj7jpoez5irnc3ro"),
|
||||||
|
"reward": MustParseCid("bafk2bzacea3yo22x4dsh4axioshrdp42eoeugef3tqtmtwz5untyvth7uc73o"),
|
||||||
|
"storagemarket": MustParseCid("bafk2bzacecclsfboql3iraf3e66pzuh3h7qp3vgmfurqz26qh5g5nrexjgknc"),
|
||||||
|
"storageminer": MustParseCid("bafk2bzacedu4chbl36rilas45py4vhqtuj6o7aa5stlvnwef3kshgwcsmha6y"),
|
||||||
|
"storagepower": MustParseCid("bafk2bzacedu3c67spbf2dmwo77ymkjel6i2o5gpzyksgu2iuwu2xvcnxgfdjg"),
|
||||||
|
"system": MustParseCid("bafk2bzacea4mtukm5zazygkdbgdf26cpnwwif5n2no7s6tknpxlwy6fpq3mug"),
|
||||||
|
"verifiedregistry": MustParseCid("bafk2bzacec67wuchq64k7kgrujguukjvdlsl24pgighqdx5vgjhyk6bycrwnc"),
|
||||||
|
},
|
||||||
|
}, {
|
||||||
|
Network: "calibrationnet",
|
||||||
|
Version: 11,
|
||||||
|
BundleGitTag: "v11.0.0-rc2",
|
||||||
|
ManifestCid: MustParseCid("bafy2bzacedhuowetjy2h4cxnijz2l64h4mzpk5m256oywp4evarpono3cjhco"),
|
||||||
|
Actors: map[string]cid.Cid{
|
||||||
|
"account": MustParseCid("bafk2bzacebor5mnjnsav34cmm5pcd3dy4wubbv4wtcrvba7depy3sct7ie4sy"),
|
||||||
|
"cron": MustParseCid("bafk2bzacebetehhedh55alfn4rcx2mhjhvuiustxlhtxc3drkemnpttws5eqw"),
|
||||||
|
"datacap": MustParseCid("bafk2bzaced6uhmrh5jjexhw4lco4ipesi2iutl7uupnyspgmnbydyo3amtu4i"),
|
||||||
|
"eam": MustParseCid("bafk2bzacea6wzcnflfnaxqnwydoghh7ezg5au32ew3bnzljzpiw6fimhlpoiu"),
|
||||||
|
"ethaccount": MustParseCid("bafk2bzacedrbpvjvyzif2cjxosm4pliyq2m6wzndvrg7r6hzdhixplzvgubbw"),
|
||||||
|
"evm": MustParseCid("bafk2bzaceabftmhejmvjvpzmbsv4cvaew6v5juj5sqtq7cfijugwsnahnsy5w"),
|
||||||
|
"init": MustParseCid("bafk2bzaceduyjd35y7o2lhvevtysqf45rp5ot7x5f36q6iond6dyiz6773g5q"),
|
||||||
|
"multisig": MustParseCid("bafk2bzacebcb72fmbpocetnzgni2wnbrduamlqx6fl3yelrlzu7id6bu5ib5g"),
|
||||||
|
"paymentchannel": MustParseCid("bafk2bzaceazwhm63kyp47pste5i5acnuhosrgythyagf3kc5clogiqqx6vkzk"),
|
||||||
|
"placeholder": MustParseCid("bafk2bzacedfvut2myeleyq67fljcrw4kkmn5pb5dpyozovj7jpoez5irnc3ro"),
|
||||||
|
"reward": MustParseCid("bafk2bzacecp7xo5ev46y64zr5osnn5fxo7itpoqw235tcfv6eo4rymzdemet2"),
|
||||||
|
"storagemarket": MustParseCid("bafk2bzacedjt5mueomasx7dijooxnwxsbtzu2dj2ppp45rtle4kiinkmgzeei"),
|
||||||
|
"storageminer": MustParseCid("bafk2bzacebkjnjp5okqjhjxzft5qkuv36u4tz7inawseiwi2kw4j43xpxvhpm"),
|
||||||
|
"storagepower": MustParseCid("bafk2bzaced2qsypqwore3jrdtaesh4itst2fyeepdsozvtffc2pianzmphdum"),
|
||||||
|
"system": MustParseCid("bafk2bzacedqvik2n3phnj3cni3h2k5mtvz43nyq7mdmv7k7euejysvajywdug"),
|
||||||
|
"verifiedregistry": MustParseCid("bafk2bzaceceoo5jlom2zweh7kpye2vkj33wgqnkjshlsw2neemqkfg5g2rmvg"),
|
||||||
|
},
|
||||||
|
}, {
|
||||||
|
Network: "caterpillarnet",
|
||||||
|
Version: 8,
|
||||||
|
|
||||||
|
ManifestCid: MustParseCid("bafy2bzacebsdvrxmdajiyxq2mxxxppvg2zwvqjzz3pgbsxwh6pvdcjofpmnxw"),
|
||||||
|
Actors: map[string]cid.Cid{
|
||||||
|
"account": MustParseCid("bafk2bzacedfms6w3ghqtljpgsfuiqa6ztjx7kcuin6myjezj6rypj3zjbqms6"),
|
||||||
|
"cron": MustParseCid("bafk2bzaceaganmlpozvy4jywigs46pfrtdmhjjey6uyhpurplqbasojsislba"),
|
||||||
|
"datacap": MustParseCid("bafk2bzacebafqqe3wv5ytkfwmqzbmchgem66pw6yq6rl7w6vlhqsbkxnisswq"),
|
||||||
|
"eam": MustParseCid("bafk2bzaceaeayeksiivw4y3gdqtigbgfntyvwc3q7v2ivb5kx7u55pn4q5lt6"),
|
||||||
|
"ethaccount": MustParseCid("bafk2bzaceburkmtd63nmzxpux5rcxsbqr6x5didl2ce7al32g4tqrvo4pjz2i"),
|
||||||
|
"evm": MustParseCid("bafk2bzacea7tp4lop7ivhay3ozitkmxxurk74v4zse42ant47rh2uw5z3tq5e"),
|
||||||
|
"init": MustParseCid("bafk2bzaced23r54kwuebl7t6mdantbby5qpfduxwxfryeliof2enyqzhokix6"),
|
||||||
|
"multisig": MustParseCid("bafk2bzacebcn3rib6j6jvclys7dkf62hco45ssgamczkrtzt6xyewd6gt3mtu"),
|
||||||
|
"paymentchannel": MustParseCid("bafk2bzacecvas4leo44pqdguj22nnwqoqdgwajzrpm5d6ltkehc37ni6p6doq"),
|
||||||
|
"placeholder": MustParseCid("bafk2bzaceaamp2a35vpfml4skap4dffklzae2urcm34mtwwce2lvhaons3a5y"),
|
||||||
|
"reward": MustParseCid("bafk2bzacebiizh4ohvv6p4uxjusoygex4wxcgvudqmdl2fsh6ft6s2zt4tz6q"),
|
||||||
|
"storagemarket": MustParseCid("bafk2bzacedhkidshm7w2sqlw7izvaieyhkvmyhfsem6t6qfnkh7dnwqe56po2"),
|
||||||
|
"storageminer": MustParseCid("bafk2bzacedcmsibwfwhkp3sabmbyjmhqibyhjf3wwst7u5bkb2k6xpun3xevg"),
|
||||||
|
"storagepower": MustParseCid("bafk2bzacecrgnpypxnxzgglhlitaallfee3dl4ejy3y63knl7llnwba4ycf7i"),
|
||||||
|
"system": MustParseCid("bafk2bzacecl7gizbe52xj6sfm5glubkhrdblmzuwlid6lxrwr5zhcmv4dl2ew"),
|
||||||
|
"verifiedregistry": MustParseCid("bafk2bzacebzndvdqtdck2y35smcxezldgh6nm6rbkj3g3fmiknsgg2uah235y"),
|
||||||
|
},
|
||||||
|
}, {
|
||||||
|
Network: "caterpillarnet",
|
||||||
|
Version: 9,
|
||||||
|
|
||||||
|
ManifestCid: MustParseCid("bafy2bzacebsdvrxmdajiyxq2mxxxppvg2zwvqjzz3pgbsxwh6pvdcjofpmnxw"),
|
||||||
|
Actors: map[string]cid.Cid{
|
||||||
|
"account": MustParseCid("bafk2bzacedfms6w3ghqtljpgsfuiqa6ztjx7kcuin6myjezj6rypj3zjbqms6"),
|
||||||
|
"cron": MustParseCid("bafk2bzaceaganmlpozvy4jywigs46pfrtdmhjjey6uyhpurplqbasojsislba"),
|
||||||
|
"datacap": MustParseCid("bafk2bzacebafqqe3wv5ytkfwmqzbmchgem66pw6yq6rl7w6vlhqsbkxnisswq"),
|
||||||
|
"eam": MustParseCid("bafk2bzaceaeayeksiivw4y3gdqtigbgfntyvwc3q7v2ivb5kx7u55pn4q5lt6"),
|
||||||
|
"ethaccount": MustParseCid("bafk2bzaceburkmtd63nmzxpux5rcxsbqr6x5didl2ce7al32g4tqrvo4pjz2i"),
|
||||||
|
"evm": MustParseCid("bafk2bzacea7tp4lop7ivhay3ozitkmxxurk74v4zse42ant47rh2uw5z3tq5e"),
|
||||||
|
"init": MustParseCid("bafk2bzaced23r54kwuebl7t6mdantbby5qpfduxwxfryeliof2enyqzhokix6"),
|
||||||
|
"multisig": MustParseCid("bafk2bzacebcn3rib6j6jvclys7dkf62hco45ssgamczkrtzt6xyewd6gt3mtu"),
|
||||||
|
"paymentchannel": MustParseCid("bafk2bzacecvas4leo44pqdguj22nnwqoqdgwajzrpm5d6ltkehc37ni6p6doq"),
|
||||||
|
"placeholder": MustParseCid("bafk2bzaceaamp2a35vpfml4skap4dffklzae2urcm34mtwwce2lvhaons3a5y"),
|
||||||
|
"reward": MustParseCid("bafk2bzacebiizh4ohvv6p4uxjusoygex4wxcgvudqmdl2fsh6ft6s2zt4tz6q"),
|
||||||
|
"storagemarket": MustParseCid("bafk2bzacedhkidshm7w2sqlw7izvaieyhkvmyhfsem6t6qfnkh7dnwqe56po2"),
|
||||||
|
"storageminer": MustParseCid("bafk2bzacedcmsibwfwhkp3sabmbyjmhqibyhjf3wwst7u5bkb2k6xpun3xevg"),
|
||||||
|
"storagepower": MustParseCid("bafk2bzacecrgnpypxnxzgglhlitaallfee3dl4ejy3y63knl7llnwba4ycf7i"),
|
||||||
|
"system": MustParseCid("bafk2bzacecl7gizbe52xj6sfm5glubkhrdblmzuwlid6lxrwr5zhcmv4dl2ew"),
|
||||||
|
"verifiedregistry": MustParseCid("bafk2bzacebzndvdqtdck2y35smcxezldgh6nm6rbkj3g3fmiknsgg2uah235y"),
|
||||||
|
},
|
||||||
|
}, {
|
||||||
|
Network: "caterpillarnet",
|
||||||
|
Version: 10,
|
||||||
|
|
||||||
|
ManifestCid: MustParseCid("bafy2bzaceajftd7jawqnwf4kzkotksrwy6ag7mu2apkvypzrrmxboheuum5oi"),
|
||||||
|
Actors: map[string]cid.Cid{
|
||||||
|
"account": MustParseCid("bafk2bzacecsbx4tovnr5x2ifcpqbpx33oht74mgtvmaauzrqcq2wnm7prr7ak"),
|
||||||
|
"cron": MustParseCid("bafk2bzacecpzfajba6m4v4ty342jw6lcu6n63bwtldmzko733wpd2q5jzfdvu"),
|
||||||
|
"datacap": MustParseCid("bafk2bzaceaa5zplkxvguwvnecfen62buhli5rraa3ga74b33a3sbscanzx4ok"),
|
||||||
|
"eam": MustParseCid("bafk2bzaceaffoa3eqmj7h53lwjatfqrjw63l3czk3vthyjz6oyhgwka3xwp6g"),
|
||||||
|
"ethaccount": MustParseCid("bafk2bzaceb7suh5m4xagoq6ap5v5x7vrhex2coq6gu6d54jteblm36cxhk5b2"),
|
||||||
|
"evm": MustParseCid("bafk2bzaceccmwmnb42pn7y7skbjwjur7b2eqxuw4lvm3he2xpvudjzluss4os"),
|
||||||
|
"init": MustParseCid("bafk2bzaceai72h4hxbgbp6gwm3m24uujscrj4bmbh6pxoerqtduijxt6dchfq"),
|
||||||
|
"multisig": MustParseCid("bafk2bzacebycdokda2gysqpnl3dwksgidujgsksf4n6qotjq4erj5zd7clkzy"),
|
||||||
|
"paymentchannel": MustParseCid("bafk2bzaceb5ucvftftiim6cxjusdpsmbht4x33kgexxgv5447gevk47h7jjqk"),
|
||||||
|
"placeholder": MustParseCid("bafk2bzacedfvut2myeleyq67fljcrw4kkmn5pb5dpyozovj7jpoez5irnc3ro"),
|
||||||
|
"reward": MustParseCid("bafk2bzaceajqygfkhamlzfsquqjgoy4p7pc2fruouqajapfucf22rbmtt5yf6"),
|
||||||
|
"storagemarket": MustParseCid("bafk2bzacednmzko2o5iv5kc6qxvpqfx5rq72krxzvna6cqoqem6flbfukglby"),
|
||||||
|
"storageminer": MustParseCid("bafk2bzacedayzz5qw7t7ykycf3a2hp666j5hb23a3mnmgp4xbbpvrx3h3ags4"),
|
||||||
|
"storagepower": MustParseCid("bafk2bzacedd3eiejzp35xuwjf3cvgd43b5ukqhelqmtgzqzqnt2wcy56pb744"),
|
||||||
|
"system": MustParseCid("bafk2bzacecfivztuulqqv4o5oyvvvrkblwix4hqt24pqru6ivnpioefhuhria"),
|
||||||
|
"verifiedregistry": MustParseCid("bafk2bzacecdhw6x7dfrxfysmn6tdbn2ny464omgqppxhjuawxauscidppd7pc"),
|
||||||
|
},
|
||||||
|
}, {
|
||||||
|
Network: "caterpillarnet",
|
||||||
|
Version: 11,
|
||||||
|
BundleGitTag: "v11.0.0",
|
||||||
|
ManifestCid: MustParseCid("bafy2bzacebexc2jgzwr5ngn6jdnkwdqwwmcapajuypdgvopoe6bnvp4yxm4o2"),
|
||||||
|
Actors: map[string]cid.Cid{
|
||||||
|
"account": MustParseCid("bafk2bzaceanjiq5m3feytue5m7hhxfkob2ofg2greoct5tr77reuhrjglo66g"),
|
||||||
|
"cron": MustParseCid("bafk2bzaceavgd5qj6n744tukhdrvxejygzs3jnlizmcvjsdnxkgiimrd5jrys"),
|
||||||
|
"datacap": MustParseCid("bafk2bzacedmdywxwrzop2gmf4ys5stydlmvbe35j3nyr2efmf273briksuvse"),
|
||||||
|
"eam": MustParseCid("bafk2bzacec7qo7s72li7tqysllstlrxxm2dhfqv2w32pytel2e775cki4ozqm"),
|
||||||
|
"ethaccount": MustParseCid("bafk2bzaceaygtkliu26ubb7ivljrvaeesp5sbjlis5okzl35ishxioa2tlx4w"),
|
||||||
|
"evm": MustParseCid("bafk2bzacebo7iqzy2ophz4f3civzwlltec7q5fut7kmtfckr6vy33r6ic5eqe"),
|
||||||
|
"init": MustParseCid("bafk2bzaceb7uzzlsquqwrqhb2vpbvk3jgr4wp5i3smu2splnag2v5sppdehns"),
|
||||||
|
"multisig": MustParseCid("bafk2bzacebwibfqrytobl4pjtny244zkmfoomazbap3r5gddjryckx5js4csi"),
|
||||||
|
"paymentchannel": MustParseCid("bafk2bzacecuaa5esuxpouigxoamyl5gire2qqqhvyhewsig2x2j73f6ksh7go"),
|
||||||
|
"placeholder": MustParseCid("bafk2bzacedfvut2myeleyq67fljcrw4kkmn5pb5dpyozovj7jpoez5irnc3ro"),
|
||||||
|
"reward": MustParseCid("bafk2bzaced4xxqhv63njf2ibvsqshlwikafctxev7aho5lgsfxyt2javjwvtw"),
|
||||||
|
"storagemarket": MustParseCid("bafk2bzacedwtx3xokqmbgkgkoqkdt6lam4ymdjb3eznlbtec5wcrtx74l2bpc"),
|
||||||
|
"storageminer": MustParseCid("bafk2bzacebbbe4sdo3xxkez7x7lkl6j46w34vx7eg7xswmdzhp7moa44p3wjg"),
|
||||||
|
"storagepower": MustParseCid("bafk2bzacedfgz6n24tjsor4pcayomim2f5f3a3fgyatmjgwxxeejna7okndda"),
|
||||||
|
"system": MustParseCid("bafk2bzacebxfzeom3d7ahcz2n2nlwp7ncv767bdbbrisugks4l6v7lcu2tmyg"),
|
||||||
|
"verifiedregistry": MustParseCid("bafk2bzacedaws3or3twy45ltcxucgvqijsje4x675ph6vup2w35smlfneamno"),
|
||||||
|
},
|
||||||
|
}, {
|
||||||
|
Network: "devnet",
|
||||||
|
Version: 8,
|
||||||
|
|
||||||
ManifestCid: MustParseCid("bafy2bzacedq7tuibavyqxzkq4uybjj7ly22eu42mjkoehwn5d47xfunmtjm4k"),
|
ManifestCid: MustParseCid("bafy2bzacedq7tuibavyqxzkq4uybjj7ly22eu42mjkoehwn5d47xfunmtjm4k"),
|
||||||
Actors: map[string]cid.Cid{
|
Actors: map[string]cid.Cid{
|
||||||
"account": MustParseCid("bafk2bzacea4tlgnp7m6tlldpz3termlwxlnyq24nwd4zdzv4r6nsjuaktuuzc"),
|
"account": MustParseCid("bafk2bzacea4tlgnp7m6tlldpz3termlwxlnyq24nwd4zdzv4r6nsjuaktuuzc"),
|
||||||
@@ -75,8 +288,97 @@ var EmbeddedBuiltinActorsMetadata []*BuiltinActorsMetadata = []*BuiltinActorsMet
|
|||||||
"verifiedregistry": MustParseCid("bafk2bzaceaajgtglewgitshgdi2nzrvq7eihjtyqj5yiamesqun2hujl3xev2"),
|
"verifiedregistry": MustParseCid("bafk2bzaceaajgtglewgitshgdi2nzrvq7eihjtyqj5yiamesqun2hujl3xev2"),
|
||||||
},
|
},
|
||||||
}, {
|
}, {
|
||||||
Network: "mainnet",
|
Network: "devnet",
|
||||||
Version: 8,
|
Version: 9,
|
||||||
|
|
||||||
|
ManifestCid: MustParseCid("bafy2bzacedozk3jh2j4nobqotkbofodq4chbrabioxbfrygpldgoxs3zwgggk"),
|
||||||
|
Actors: map[string]cid.Cid{
|
||||||
|
"account": MustParseCid("bafk2bzaced5llqnqqhypolyuogz3h2wjomugqkrhyhocvly3aoib4c5xiush6"),
|
||||||
|
"cron": MustParseCid("bafk2bzaceahwdt32ji53mo5yz6imvztz3s3g2ra5uz3jdfa77j7hqcnq6r4l2"),
|
||||||
|
"datacap": MustParseCid("bafk2bzaceabcxoy5iscdierasorjoj6xzqgnnb5pmrr7prkuibw4yggx3v2d2"),
|
||||||
|
"init": MustParseCid("bafk2bzaceastwn42kqyztz7uzej7l4lemp5nakqqsfvksry7k75q5ombhprme"),
|
||||||
|
"multisig": MustParseCid("bafk2bzacebeiygkjupkpfxcrsidci4bvn6afkvx4lsj3ut3ywhsj654pzfgk4"),
|
||||||
|
"paymentchannel": MustParseCid("bafk2bzacedhsdoo4ww47rm44pizu5qqpho753cizzbbvnd5yz3nm3347su5cy"),
|
||||||
|
"reward": MustParseCid("bafk2bzacebzqvisqe3iaodtxq7l2lgzwfkxznrnp676ddpllqcpvuae5i33le"),
|
||||||
|
"storagemarket": MustParseCid("bafk2bzaceduauegz4nniegh667btjhg2anipwpxeb664s4ossq2ifvuqwqlso"),
|
||||||
|
"storageminer": MustParseCid("bafk2bzacec23wjdmbm5pt6pqsbjb3w6j7vyrolijz2mysvp6clllfgpmhb6ge"),
|
||||||
|
"storagepower": MustParseCid("bafk2bzacebnyywv46n2ghg62inllwpmnyuwtoz57fn5lpgpf436mahajg4qrg"),
|
||||||
|
"system": MustParseCid("bafk2bzacebgafb6h2o2g5whrujc2uvsttrussyc5t56rvhrjqkqhzdu4jopwa"),
|
||||||
|
"verifiedregistry": MustParseCid("bafk2bzacednorhcy446agy7ecpmfms2u4aoa3mj2eqomffuoerbik5yavrxyi"),
|
||||||
|
},
|
||||||
|
}, {
|
||||||
|
Network: "devnet",
|
||||||
|
Version: 10,
|
||||||
|
|
||||||
|
ManifestCid: MustParseCid("bafy2bzacebzz376j5kizfck56366kdz5aut6ktqrvqbi3efa2d4l2o2m653ts"),
|
||||||
|
Actors: map[string]cid.Cid{
|
||||||
|
"account": MustParseCid("bafk2bzacedkj5dqs5xxamnlug2d5dyjl6askf7wlmvwzhmsrzcvogv7acqfe6"),
|
||||||
|
"cron": MustParseCid("bafk2bzaceabslrigld2vshng6sppbp3bsptjtttvbxctwqe5lkyl2efom2wu4"),
|
||||||
|
"datacap": MustParseCid("bafk2bzaceagg4qklzhhg5oj4shwqpoeykeyxus7xhj2abuot2tycdwsf2oaaa"),
|
||||||
|
"eam": MustParseCid("bafk2bzaceafttsbglcetxwtzqtdniittwczogkefgnxztgsp7mymcpvdlhdik"),
|
||||||
|
"ethaccount": MustParseCid("bafk2bzacedypn6tf3yrj4bavmscddygeima3puih37fbkxuhjhlrzbjh3dbo4"),
|
||||||
|
"evm": MustParseCid("bafk2bzacec5ywczgg73fnwi36nlxso3zduop3fwj3pq6ynn5zltrs4dpcwglg"),
|
||||||
|
"init": MustParseCid("bafk2bzacebkanlbkwwtniyz4fawevnkoyje67l5nflltmciplqiutekxzzfh4"),
|
||||||
|
"multisig": MustParseCid("bafk2bzacectxa2izvpaybmmpvearekrybxtglctwnexzzneyn6xrnrmectmpa"),
|
||||||
|
"paymentchannel": MustParseCid("bafk2bzacectov7vawkhsvq7aobyjq3oppamytq425wpkxejmq65vvcdm4bt2e"),
|
||||||
|
"placeholder": MustParseCid("bafk2bzacedfvut2myeleyq67fljcrw4kkmn5pb5dpyozovj7jpoez5irnc3ro"),
|
||||||
|
"reward": MustParseCid("bafk2bzacec3xpbrxw2rnpuve4mxfhny44lxbpbwmduy4ula4ohj2bp6wplpvc"),
|
||||||
|
"storagemarket": MustParseCid("bafk2bzacec5nexsejraoqraywka7zcacjoxgpdbopehdkhiwqwcyghtof4s3w"),
|
||||||
|
"storageminer": MustParseCid("bafk2bzacecw5xzj6z5b7qxx5xca5py4aoecmqj2pxb6nw673alufy22zckkyo"),
|
||||||
|
"storagepower": MustParseCid("bafk2bzaceckhnpxoaanjf474wxzkntlnzdofoy75ehyuydfjkuw4swhotws4y"),
|
||||||
|
"system": MustParseCid("bafk2bzaceairk5qz5hyzt4yyaxa356aszyifswiust5ilxizwxujcmtzvjzoa"),
|
||||||
|
"verifiedregistry": MustParseCid("bafk2bzaced2mkyqobpgna5jevosym3adv2bvraggigyz2jgn5cxymirxj4x3i"),
|
||||||
|
},
|
||||||
|
}, {
|
||||||
|
Network: "devnet",
|
||||||
|
Version: 11,
|
||||||
|
BundleGitTag: "v11.0.0",
|
||||||
|
ManifestCid: MustParseCid("bafy2bzaceay35go4xbjb45km6o46e5bib3bi46panhovcbedrynzwmm3drr4i"),
|
||||||
|
Actors: map[string]cid.Cid{
|
||||||
|
"account": MustParseCid("bafk2bzacecf2pprkbdlpm4e2xz3ufunxtgrgyh2ie3stuqiyhibsvdze7kvri"),
|
||||||
|
"cron": MustParseCid("bafk2bzaceasr5d2skowvzv5mzsyak6waqrgc46ewj6rzbapkfi5woom6n6bwa"),
|
||||||
|
"datacap": MustParseCid("bafk2bzaceaqd77gptubupda7rp7daxkxbkzwc253dxhiyoezxvj2tljmkgpny"),
|
||||||
|
"eam": MustParseCid("bafk2bzacedve6p4ye6zxydjbfs4ode5r2equ7rqzpyltujsq2lu6wyxnijfx4"),
|
||||||
|
"ethaccount": MustParseCid("bafk2bzacea25xfsxwew3h2crer6jlb4c5vwu2gtch2jh73ocuxjhupenyrugy"),
|
||||||
|
"evm": MustParseCid("bafk2bzacece5hivtkmi757lyfahgti7xuqgofodb2u65pxgf6oizfwiiwlcsi"),
|
||||||
|
"init": MustParseCid("bafk2bzacecxnr5y7qifzdqqiwfbjxv2yr7lbkcyu3e2mf5zjdncteupxdlquu"),
|
||||||
|
"multisig": MustParseCid("bafk2bzaceayap4k4u3lbysaeeixct5fvhmafy3fa5eagvdpk3i4a7ubfdpobe"),
|
||||||
|
"paymentchannel": MustParseCid("bafk2bzaceafgrz5wepbein35gie7rnsu7zttxvgllgdneuefmmy4j5izydtza"),
|
||||||
|
"placeholder": MustParseCid("bafk2bzacedfvut2myeleyq67fljcrw4kkmn5pb5dpyozovj7jpoez5irnc3ro"),
|
||||||
|
"reward": MustParseCid("bafk2bzacedwbtfqlx47fdkxjrb5mwiatheci44x3zkpx33smybc2cme23ymuo"),
|
||||||
|
"storagemarket": MustParseCid("bafk2bzaceaj74fmooaf3gj3ebwon64ky7hhdh7kytdr3agclqfrqzmpzykh7g"),
|
||||||
|
"storageminer": MustParseCid("bafk2bzacedb7bokkzzs7hnbhivp74pgcpermuy7j6b3ncodylksukkxtnn7ze"),
|
||||||
|
"storagepower": MustParseCid("bafk2bzacedilnkegizkxz3nuutib4d4wwlk4bkla22loepia2h53yf4hysmq6"),
|
||||||
|
"system": MustParseCid("bafk2bzacedpyoncjbl4oxkjm5e77ngvpy2xfajjc4myfsv2vltvzxioattlu2"),
|
||||||
|
"verifiedregistry": MustParseCid("bafk2bzacebdqi5tr5pjnem5nylg2zbqcugvi7oxi35bhnrfudx4y4ufhlit2k"),
|
||||||
|
},
|
||||||
|
}, {
|
||||||
|
Network: "hyperspace",
|
||||||
|
Version: 8,
|
||||||
|
|
||||||
|
ManifestCid: MustParseCid("bafy2bzacedvffumcvf72f2btjqvece3kpcdorxq5tq76iwcmqbzvsiu526cqm"),
|
||||||
|
Actors: map[string]cid.Cid{
|
||||||
|
"account": MustParseCid("bafk2bzacecim7uybic2qprbkjhowg7qkniv4zywj5h5g4u4ss72urco2akzuo"),
|
||||||
|
"cron": MustParseCid("bafk2bzaceahgq64awp4f7li3hdgimc4upqvdvltpmeywckvens33umcxt424a"),
|
||||||
|
"datacap": MustParseCid("bafk2bzacebkxn52ttooaslkwncijk3bgd3tm2zw7vijdhwvg2cxnxbrzmmq5e"),
|
||||||
|
"eam": MustParseCid("bafk2bzaceczhgub5anrnaf7ol65mu54gsgwcj6c6m3yhet7rhxm2l6kz4s4ru"),
|
||||||
|
"ethaccount": MustParseCid("bafk2bzacealn5enbxyxbfs7gbsjbyma2zk3bcr7okvflxhpr753d4eh6ixooa"),
|
||||||
|
"evm": MustParseCid("bafk2bzacedljkrmazyewawpnddrkzrt55556374dw2pm2hokgkompgzw4vx5y"),
|
||||||
|
"init": MustParseCid("bafk2bzacec55gyyaqjrw7zughywocgwcjvv6k5fijjpjw4xgckuqz6pjtff5a"),
|
||||||
|
"multisig": MustParseCid("bafk2bzaceblozbdzybdivvjdiid4jwm2jc6x5a66sunh2vvwsqba6wzqmr7i6"),
|
||||||
|
"paymentchannel": MustParseCid("bafk2bzacealcyke5a6n24efs6qe4iikynpk2twqssyugy7jcyf6p6shgw2iwa"),
|
||||||
|
"placeholder": MustParseCid("bafk2bzaceaamp2a35vpfml4skap4dffklzae2urcm34mtwwce2lvhaons3a5y"),
|
||||||
|
"reward": MustParseCid("bafk2bzacebafzaqhwsm3nmsfwcd6ngvx6ev6zlcpyfljqh4kb77vok6opban6"),
|
||||||
|
"storagemarket": MustParseCid("bafk2bzacecrjfg4p7fxznsdkoobs4po2ve3ywixrirrk6netgxh63qqaefamg"),
|
||||||
|
"storageminer": MustParseCid("bafk2bzaceb3ctd4atxwhdkmlg4i63zxo5aopknlj7l5kaiqr22xpcmico6vg4"),
|
||||||
|
"storagepower": MustParseCid("bafk2bzacecvcix3ugopvby2vah5wwiu5cqjedwzwkanmr34kdoc4f3o6p7nsq"),
|
||||||
|
"system": MustParseCid("bafk2bzacedo2hfopt6gy52goj7fot5qwzhtnysmgo7h25crq4clpugkerjabk"),
|
||||||
|
"verifiedregistry": MustParseCid("bafk2bzacea7rfkjrixaidksnmjehglmavyt56nyeu3sfxu2e3dcpf62oab6tw"),
|
||||||
|
},
|
||||||
|
}, {
|
||||||
|
Network: "mainnet",
|
||||||
|
Version: 8,
|
||||||
|
|
||||||
ManifestCid: MustParseCid("bafy2bzacebogjbpiemi7npzxchgcjjki3tfxon4ims55obfyfleqntteljsea"),
|
ManifestCid: MustParseCid("bafy2bzacebogjbpiemi7npzxchgcjjki3tfxon4ims55obfyfleqntteljsea"),
|
||||||
Actors: map[string]cid.Cid{
|
Actors: map[string]cid.Cid{
|
||||||
"account": MustParseCid("bafk2bzacedudbf7fc5va57t3tmo63snmt3en4iaidv4vo3qlyacbxaa6hlx6y"),
|
"account": MustParseCid("bafk2bzacedudbf7fc5va57t3tmo63snmt3en4iaidv4vo3qlyacbxaa6hlx6y"),
|
||||||
@@ -92,8 +394,74 @@ var EmbeddedBuiltinActorsMetadata []*BuiltinActorsMetadata = []*BuiltinActorsMet
|
|||||||
"verifiedregistry": MustParseCid("bafk2bzaceb3zbkjz3auizmoln2unmxep7dyfcmsre64vnqfhdyh7rkqfoxlw4"),
|
"verifiedregistry": MustParseCid("bafk2bzaceb3zbkjz3auizmoln2unmxep7dyfcmsre64vnqfhdyh7rkqfoxlw4"),
|
||||||
},
|
},
|
||||||
}, {
|
}, {
|
||||||
Network: "testing",
|
Network: "mainnet",
|
||||||
Version: 8,
|
Version: 9,
|
||||||
|
|
||||||
|
ManifestCid: MustParseCid("bafy2bzaceb6j6666h36xnhksu3ww4kxb6e25niayfgkdnifaqi6m6ooc66i6i"),
|
||||||
|
Actors: map[string]cid.Cid{
|
||||||
|
"account": MustParseCid("bafk2bzacect2p7urje3pylrrrjy3tngn6yaih4gtzauuatf2jllk3ksgfiw2y"),
|
||||||
|
"cron": MustParseCid("bafk2bzacebcec3lffmos3nawm5cvwehssxeqwxixoyyfvejy7viszzsxzyu26"),
|
||||||
|
"datacap": MustParseCid("bafk2bzacebb6uy2ys7tapekmtj7apnjg7oyj4ia5t7tlkvbmwtxwv74lb2pug"),
|
||||||
|
"init": MustParseCid("bafk2bzacebtdq4zyuxk2fzbdkva6kc4mx75mkbfmldplfntayhbl5wkqou33i"),
|
||||||
|
"multisig": MustParseCid("bafk2bzacec4va3nmugyqjqrs3lqyr2ij67jhjia5frvx7omnh2isha6abxzya"),
|
||||||
|
"paymentchannel": MustParseCid("bafk2bzacebhdvjbjcgupklddfavzef4e4gnkt3xk3rbmgfmk7xhecszhfxeds"),
|
||||||
|
"reward": MustParseCid("bafk2bzacebezgbbmcm2gbcqwisus5fjvpj7hhmu5ubd37phuku3hmkfulxm2o"),
|
||||||
|
"storagemarket": MustParseCid("bafk2bzacec3j7p6gklk64stax5px3xxd7hdtejaepnd4nw7s2adihde6emkcu"),
|
||||||
|
"storageminer": MustParseCid("bafk2bzacedyux5hlrildwutvvjdcsvjtwsoc5xnqdjl73ouiukgklekeuyfl4"),
|
||||||
|
"storagepower": MustParseCid("bafk2bzacedsetphfajgne4qy3vdrpyd6ekcmtfs2zkjut4r34cvnuoqemdrtw"),
|
||||||
|
"system": MustParseCid("bafk2bzaceagvlo2jtahj7dloshrmwfulrd6e2izqev32qm46eumf754weec6c"),
|
||||||
|
"verifiedregistry": MustParseCid("bafk2bzacecf3yodlyudzukumehbuabgqljyhjt5ifiv4vetcfohnvsxzynwga"),
|
||||||
|
},
|
||||||
|
}, {
|
||||||
|
Network: "mainnet",
|
||||||
|
Version: 10,
|
||||||
|
|
||||||
|
ManifestCid: MustParseCid("bafy2bzacecsuyf7mmvrhkx2evng5gnz5canlnz2fdlzu2lvcgptiq2pzuovos"),
|
||||||
|
Actors: map[string]cid.Cid{
|
||||||
|
"account": MustParseCid("bafk2bzaceampw4romta75hyz5p4cqriypmpbgnkxncgxgqn6zptv5lsp2w2bo"),
|
||||||
|
"cron": MustParseCid("bafk2bzacedcbtsifegiu432m5tysjzkxkmoczxscb6hqpmrr6img7xzdbbs2g"),
|
||||||
|
"datacap": MustParseCid("bafk2bzacealj5uk7wixhvk7l5tnredtelralwnceafqq34nb2lbylhtuyo64u"),
|
||||||
|
"eam": MustParseCid("bafk2bzacedrpm5gbleh4xkyo2jvs7p5g6f34soa6dpv7ashcdgy676snsum6g"),
|
||||||
|
"ethaccount": MustParseCid("bafk2bzaceaqoc5zakbhjxn3jljc4lxnthllzunhdor7sxhwgmskvc6drqc3fa"),
|
||||||
|
"evm": MustParseCid("bafk2bzaceahmzdxhqsm7cu2mexusjp6frm7r4kdesvti3etv5evfqboos2j4g"),
|
||||||
|
"init": MustParseCid("bafk2bzaced2f5rhir3hbpqbz5ght7ohv2kgj42g5ykxrypuo2opxsup3ykwl6"),
|
||||||
|
"multisig": MustParseCid("bafk2bzaceduf3hayh63jnl4z2knxv7cnrdenoubni22fxersc4octlwpxpmy4"),
|
||||||
|
"paymentchannel": MustParseCid("bafk2bzaceartlg4mrbwgzcwric6mtvyawpbgx2xclo2vj27nna57nxynf3pgc"),
|
||||||
|
"placeholder": MustParseCid("bafk2bzacedfvut2myeleyq67fljcrw4kkmn5pb5dpyozovj7jpoez5irnc3ro"),
|
||||||
|
"reward": MustParseCid("bafk2bzacebnhtaejfjtzymyfmbdrfmo7vgj3zsof6zlucbmkhrvcuotw5dxpq"),
|
||||||
|
"storagemarket": MustParseCid("bafk2bzaceclejwjtpu2dhw3qbx6ow7b4pmhwa7ocrbbiqwp36sq5yeg6jz2bc"),
|
||||||
|
"storageminer": MustParseCid("bafk2bzaced4h7noksockro7glnssz2jnmo2rpzd7dvnmfs4p24zx3h6gtx47s"),
|
||||||
|
"storagepower": MustParseCid("bafk2bzacec4ay4crzo73ypmh7o3fjendhbqrxake46bprabw67fvwjz5q6ixq"),
|
||||||
|
"system": MustParseCid("bafk2bzacedakk5nofebyup4m7nvx6djksfwhnxzrfuq4oyemhpl4lllaikr64"),
|
||||||
|
"verifiedregistry": MustParseCid("bafk2bzacedfel6edzqpe5oujno7fog4i526go4dtcs6vwrdtbpy2xq6htvcg6"),
|
||||||
|
},
|
||||||
|
}, {
|
||||||
|
Network: "mainnet",
|
||||||
|
Version: 11,
|
||||||
|
BundleGitTag: "v11.0.0",
|
||||||
|
ManifestCid: MustParseCid("bafy2bzacecnhaiwcrpyjvzl4uv4q3jzoif26okl3m66q3cijp3dfwlcxwztwo"),
|
||||||
|
Actors: map[string]cid.Cid{
|
||||||
|
"account": MustParseCid("bafk2bzacealnlr7st6lkwoh6wxpf2hnrlex5sknaopgmkr2tuhg7vmbfy45so"),
|
||||||
|
"cron": MustParseCid("bafk2bzacebpewdvvgt6tk2o2u4rcovdgym67tadiis5usemlbejg7k3kt567o"),
|
||||||
|
"datacap": MustParseCid("bafk2bzacebslykoyrb2hm7aacjngqgd5n2wmeii2goadrs5zaya3pvdf6pdnq"),
|
||||||
|
"eam": MustParseCid("bafk2bzaceaelwt4yfsfvsu3pa3miwalsvy3cfkcjvmt4sqoeopsppnrmj2mf2"),
|
||||||
|
"ethaccount": MustParseCid("bafk2bzaceclkmc4yidxc6lgcjpfypbde2eddnevcveo4j5kmh4ek6inqysz2k"),
|
||||||
|
"evm": MustParseCid("bafk2bzacediwh6etwzwmb5pivtclpdplewdjzphouwqpppce6opisjv2fjqfe"),
|
||||||
|
"init": MustParseCid("bafk2bzaceckwf3w6n2nw6eh77ktmsxqgsvshonvgnyk5q5syyngtetxvasfxg"),
|
||||||
|
"multisig": MustParseCid("bafk2bzaceafajceqwg5ybiz7xw6rxammuirkgtuv625gzaehsqfprm4bazjmk"),
|
||||||
|
"paymentchannel": MustParseCid("bafk2bzaceb4e6cnsnviegmqvsmoxzncruvhra54piq7bwiqfqevle6oob2gvo"),
|
||||||
|
"placeholder": MustParseCid("bafk2bzacedfvut2myeleyq67fljcrw4kkmn5pb5dpyozovj7jpoez5irnc3ro"),
|
||||||
|
"reward": MustParseCid("bafk2bzacebwjw2vxkobs7r2kwjdqqb42h2kucyuk6flbnyzw4odg5s4mogamo"),
|
||||||
|
"storagemarket": MustParseCid("bafk2bzaceazu2j2zu4p24tr22btnqzkhzjvyjltlvsagaj6w3syevikeb5d7m"),
|
||||||
|
"storageminer": MustParseCid("bafk2bzacec24okjqrp7c7rj3hbrs5ez5apvwah2ruka6haesgfngf37mhk6us"),
|
||||||
|
"storagepower": MustParseCid("bafk2bzaceaxgloxuzg35vu7l7tohdgaq2frsfp4ejmuo7tkoxjp5zqrze6sf4"),
|
||||||
|
"system": MustParseCid("bafk2bzaced7npe5mt5nh72jxr2igi2sofoa7gedt4w6kueeke7i3xxugqpjfm"),
|
||||||
|
"verifiedregistry": MustParseCid("bafk2bzacedej3dnr62g2je2abmyjg3xqv4otvh6e26du5fcrhvw7zgcaaez3a"),
|
||||||
|
},
|
||||||
|
}, {
|
||||||
|
Network: "testing",
|
||||||
|
Version: 8,
|
||||||
|
|
||||||
ManifestCid: MustParseCid("bafy2bzacedkjpqx27wgsvfxzuxfvixuxtbpt2y6yo6igcasez6gqiowron776"),
|
ManifestCid: MustParseCid("bafy2bzacedkjpqx27wgsvfxzuxfvixuxtbpt2y6yo6igcasez6gqiowron776"),
|
||||||
Actors: map[string]cid.Cid{
|
Actors: map[string]cid.Cid{
|
||||||
"account": MustParseCid("bafk2bzacebmfbtdj5vruje5auacrhhprcjdd6uclhukb7je7t2f6ozfcgqlu2"),
|
"account": MustParseCid("bafk2bzacebmfbtdj5vruje5auacrhhprcjdd6uclhukb7je7t2f6ozfcgqlu2"),
|
||||||
@@ -109,8 +477,74 @@ var EmbeddedBuiltinActorsMetadata []*BuiltinActorsMetadata = []*BuiltinActorsMet
|
|||||||
"verifiedregistry": MustParseCid("bafk2bzacectzxvtoselhnzsair5nv6k5vokvegnht6z2lfee4p3xexo4kg4m6"),
|
"verifiedregistry": MustParseCid("bafk2bzacectzxvtoselhnzsair5nv6k5vokvegnht6z2lfee4p3xexo4kg4m6"),
|
||||||
},
|
},
|
||||||
}, {
|
}, {
|
||||||
Network: "testing-fake-proofs",
|
Network: "testing",
|
||||||
Version: 8,
|
Version: 9,
|
||||||
|
|
||||||
|
ManifestCid: MustParseCid("bafy2bzacecnnrmekqw2xvud46g3vo6x26cogh3ydgljqajlxqxzzbuxsjlwjm"),
|
||||||
|
Actors: map[string]cid.Cid{
|
||||||
|
"account": MustParseCid("bafk2bzaceaiebfiuu76zoywzltelio2zuvsavirka27ur6kspn7scvcl5cuiy"),
|
||||||
|
"cron": MustParseCid("bafk2bzacecla36w3tbwap5jgdtooxsud25mdpc75kgtjs34mi4xhwygph2gki"),
|
||||||
|
"datacap": MustParseCid("bafk2bzaced5h3ct6i7oqpyimkj3hwdywmux5tslu5vs2ywbzruqmxjtqczygs"),
|
||||||
|
"init": MustParseCid("bafk2bzaceauxqpspnvui7dryuvfgzoogatbkbahp4ovaih734blwi4bassnlm"),
|
||||||
|
"multisig": MustParseCid("bafk2bzaceddfagxfpsihjxq7yt4ditv2tcoou5w4hzbsapadlw3v44cxfcqpi"),
|
||||||
|
"paymentchannel": MustParseCid("bafk2bzaced4nc4ofrbqevpwrt7fnf3beshi5ccrecq3zojt2sxgrkz7ebnbh4"),
|
||||||
|
"reward": MustParseCid("bafk2bzacedxleepeg4ei3jnayzcfz6shi25rrvoyhr6fxmkdezq4owrazi7rq"),
|
||||||
|
"storagemarket": MustParseCid("bafk2bzaceakqcjpppg3exrr7dru7jglvno2xyw4hsuebxay4lvrzvmwmv5kvu"),
|
||||||
|
"storageminer": MustParseCid("bafk2bzacealfvphicwnysmmyyerseppyvydy2reisvbft46vdprp2lnfvlgqc"),
|
||||||
|
"storagepower": MustParseCid("bafk2bzaceageil5b5mr5uwo6vqs4nnnmpiwe3fkjffzyngcicuu7gruuwapjm"),
|
||||||
|
"system": MustParseCid("bafk2bzacedo4pu3iwx2gu72hinsstpiokhl5iicnb3rumzffsnhy7zhmnxhyy"),
|
||||||
|
"verifiedregistry": MustParseCid("bafk2bzaceatmqip2o3ausbntvdhj7yemu6hb3b5yqv6hm42gylbbmz7geocpm"),
|
||||||
|
},
|
||||||
|
}, {
|
||||||
|
Network: "testing",
|
||||||
|
Version: 10,
|
||||||
|
|
||||||
|
ManifestCid: MustParseCid("bafy2bzacebsp3bkxwsijenqeimhvhtg52d6o76hn6qhzxveqfq7d5hdd5l2ee"),
|
||||||
|
Actors: map[string]cid.Cid{
|
||||||
|
"account": MustParseCid("bafk2bzaceazxb6p2xg6caivmie6k2bvutyesngwyvhwv4eemwu7ia4vnqkcuy"),
|
||||||
|
"cron": MustParseCid("bafk2bzaceax6ym73boyl5zdpbcr6zmbajzylmcdvlapz5zcqgzcshakz44jbq"),
|
||||||
|
"datacap": MustParseCid("bafk2bzacea63x3v6lvtb4ast5uq3nhrpokvylymvezyr5xyjl6vtlfwkuw6qo"),
|
||||||
|
"eam": MustParseCid("bafk2bzacebhualcn7fofyqr6lhrel32ud23hcwzeenfqu3rrn5nmt6gugqgo6"),
|
||||||
|
"ethaccount": MustParseCid("bafk2bzacecgft7e3v4kbpb3tlt5s6hng74ptu3ggcdi4wmt5p4vr6qkmkw2zc"),
|
||||||
|
"evm": MustParseCid("bafk2bzaceaoqvbqetgicqpvwvcnpjx5aa74kwlhq3u7mwv4yseszxkimwz5pk"),
|
||||||
|
"init": MustParseCid("bafk2bzaceapmoyg2qppzle24t25ncyycn2uwhnw6crqkqlokkbc7w4mn74wko"),
|
||||||
|
"multisig": MustParseCid("bafk2bzacecn3dlepgaps3h6iwlq65dx6zyrbfi4pmgdqxphb5idubb6ibflwe"),
|
||||||
|
"paymentchannel": MustParseCid("bafk2bzaceaanxurr2k3ueolwcnminmdfp3tyxtntqg5fou37smeulb5dxqjzk"),
|
||||||
|
"placeholder": MustParseCid("bafk2bzacedfvut2myeleyq67fljcrw4kkmn5pb5dpyozovj7jpoez5irnc3ro"),
|
||||||
|
"reward": MustParseCid("bafk2bzacedujdvwk4omjexdnmh2qrkqbw27v4c2g3krajhtzyfzart36bimum"),
|
||||||
|
"storagemarket": MustParseCid("bafk2bzacecdbjjxvdtltobiu7thwyyr2puunoz3q4vyfnhhxl2sbp4ovwq37s"),
|
||||||
|
"storageminer": MustParseCid("bafk2bzacebo5q7jrf4qjrhtotwt5ouzlygvml4bzofs2egdnbxyfmuo7tro6c"),
|
||||||
|
"storagepower": MustParseCid("bafk2bzacebt2ipqnorxbzncwjadkulip6blzksmwd4mmyrfjsmjyf55itra2k"),
|
||||||
|
"system": MustParseCid("bafk2bzacecf2jimdz7knhngs64ximfz3eaud6s3kiunmkybgrkupdjyo2dw7o"),
|
||||||
|
"verifiedregistry": MustParseCid("bafk2bzacecdmek2htsgcyoyl35glakyab66cojqo2y335njnm7krleb6yfbps"),
|
||||||
|
},
|
||||||
|
}, {
|
||||||
|
Network: "testing",
|
||||||
|
Version: 11,
|
||||||
|
BundleGitTag: "v11.0.0",
|
||||||
|
ManifestCid: MustParseCid("bafy2bzacea2vxre32tg3xhpejrktiuzx4d3pcoe7yyazgscfibmegmchr6n42"),
|
||||||
|
Actors: map[string]cid.Cid{
|
||||||
|
"account": MustParseCid("bafk2bzaceccerssb3tgel6ukdghlwvs7dxsolj4fpkgn7dh7owzwapqb6ejpw"),
|
||||||
|
"cron": MustParseCid("bafk2bzacebtfl6fczxnitrqqjhyefskf3asyn3gzuvqcddieoqfsaddk5fd4q"),
|
||||||
|
"datacap": MustParseCid("bafk2bzacediikc55y6uzmnhucf4mik6rqpjulwvgp5gdibogxjhgbvusmzff2"),
|
||||||
|
"eam": MustParseCid("bafk2bzaceazqi5ezossp6kvqogaaba6hxlfarqgniktmb7iy5qonha3eflz6m"),
|
||||||
|
"ethaccount": MustParseCid("bafk2bzaceb77ospgfqqmf67v23wkyeg7lr2mu53ybaacu3bslx7s7nhttdueo"),
|
||||||
|
"evm": MustParseCid("bafk2bzacedvgt7mv22hux4vrnklylq7qmw43kfrqwam6wdsfzkdnaewr33qbu"),
|
||||||
|
"init": MustParseCid("bafk2bzacealzb3nk2oypway5ubz3hs5py5ok5tuw545454vg4d3mwbslef4js"),
|
||||||
|
"multisig": MustParseCid("bafk2bzacec45ppn4hrwizmopp2v2atkxw35tb6yem6uqhqilrv7aiaknnnxmu"),
|
||||||
|
"paymentchannel": MustParseCid("bafk2bzaceajbr3t6cngzh3katqteflbcrtwtdgbthnlfemon5tg6rytf2uonw"),
|
||||||
|
"placeholder": MustParseCid("bafk2bzacedfvut2myeleyq67fljcrw4kkmn5pb5dpyozovj7jpoez5irnc3ro"),
|
||||||
|
"reward": MustParseCid("bafk2bzacea7ycf53kbq4robcuh3ziy7qwwhaqamc5krn3lugypgpxhlewdaiq"),
|
||||||
|
"storagemarket": MustParseCid("bafk2bzacedskmbcpaeb6bezs32szh52jrukvihobluadauayroo5gzrt32tkm"),
|
||||||
|
"storageminer": MustParseCid("bafk2bzaced3yg5lctmswnbkxyd6cleg3llyux7fu2vbddyd2ho36fpym423mq"),
|
||||||
|
"storagepower": MustParseCid("bafk2bzacebvpdf372fzxgixztbz2r7ayxyvx7jmdxwlfuqt2cq7tnqgie3klw"),
|
||||||
|
"system": MustParseCid("bafk2bzaceaatvscbnkv36ixhtt2zel4er5oskxevgumh5gegqkv7uzah36f24"),
|
||||||
|
"verifiedregistry": MustParseCid("bafk2bzacebp2r56wxadvfzpfbmqwfi3dlnwpmoc5u4tau2hfftbkuafkhye64"),
|
||||||
|
},
|
||||||
|
}, {
|
||||||
|
Network: "testing-fake-proofs",
|
||||||
|
Version: 8,
|
||||||
|
|
||||||
ManifestCid: MustParseCid("bafy2bzacecd3lb5v6tzjylnhnrhexslssyaozy6hogzgpkhztoe76exbrgrug"),
|
ManifestCid: MustParseCid("bafy2bzacecd3lb5v6tzjylnhnrhexslssyaozy6hogzgpkhztoe76exbrgrug"),
|
||||||
Actors: map[string]cid.Cid{
|
Actors: map[string]cid.Cid{
|
||||||
"account": MustParseCid("bafk2bzacebmfbtdj5vruje5auacrhhprcjdd6uclhukb7je7t2f6ozfcgqlu2"),
|
"account": MustParseCid("bafk2bzacebmfbtdj5vruje5auacrhhprcjdd6uclhukb7je7t2f6ozfcgqlu2"),
|
||||||
@@ -125,4 +559,69 @@ var EmbeddedBuiltinActorsMetadata []*BuiltinActorsMetadata = []*BuiltinActorsMet
|
|||||||
"system": MustParseCid("bafk2bzaced6kjkbv7lrb2qwq5we2hqaxc6ztch5p52g27qtjy45zdemsk4b7m"),
|
"system": MustParseCid("bafk2bzaced6kjkbv7lrb2qwq5we2hqaxc6ztch5p52g27qtjy45zdemsk4b7m"),
|
||||||
"verifiedregistry": MustParseCid("bafk2bzacectzxvtoselhnzsair5nv6k5vokvegnht6z2lfee4p3xexo4kg4m6"),
|
"verifiedregistry": MustParseCid("bafk2bzacectzxvtoselhnzsair5nv6k5vokvegnht6z2lfee4p3xexo4kg4m6"),
|
||||||
},
|
},
|
||||||
|
}, {
|
||||||
|
Network: "testing-fake-proofs",
|
||||||
|
Version: 9,
|
||||||
|
|
||||||
|
ManifestCid: MustParseCid("bafy2bzacecql2gj2tri4fnbznmldue73qzt6zszvugw4exd64mwb52zrhv7k2"),
|
||||||
|
Actors: map[string]cid.Cid{
|
||||||
|
"account": MustParseCid("bafk2bzaceaiebfiuu76zoywzltelio2zuvsavirka27ur6kspn7scvcl5cuiy"),
|
||||||
|
"cron": MustParseCid("bafk2bzacecla36w3tbwap5jgdtooxsud25mdpc75kgtjs34mi4xhwygph2gki"),
|
||||||
|
"datacap": MustParseCid("bafk2bzaced5h3ct6i7oqpyimkj3hwdywmux5tslu5vs2ywbzruqmxjtqczygs"),
|
||||||
|
"init": MustParseCid("bafk2bzaceauxqpspnvui7dryuvfgzoogatbkbahp4ovaih734blwi4bassnlm"),
|
||||||
|
"multisig": MustParseCid("bafk2bzaceddfagxfpsihjxq7yt4ditv2tcoou5w4hzbsapadlw3v44cxfcqpi"),
|
||||||
|
"paymentchannel": MustParseCid("bafk2bzaced4nc4ofrbqevpwrt7fnf3beshi5ccrecq3zojt2sxgrkz7ebnbh4"),
|
||||||
|
"reward": MustParseCid("bafk2bzacedxleepeg4ei3jnayzcfz6shi25rrvoyhr6fxmkdezq4owrazi7rq"),
|
||||||
|
"storagemarket": MustParseCid("bafk2bzaceakqcjpppg3exrr7dru7jglvno2xyw4hsuebxay4lvrzvmwmv5kvu"),
|
||||||
|
"storageminer": MustParseCid("bafk2bzaceab3cjrwwwfemyc5lw73w6tibpgxtx3wuzjhami6tvhcvetygdm7m"),
|
||||||
|
"storagepower": MustParseCid("bafk2bzaceafemwhsy3e7ueqsrn3f7n53vdqkvfbig3hgbw7eohsefnfvgq7yc"),
|
||||||
|
"system": MustParseCid("bafk2bzacedo4pu3iwx2gu72hinsstpiokhl5iicnb3rumzffsnhy7zhmnxhyy"),
|
||||||
|
"verifiedregistry": MustParseCid("bafk2bzaceatmqip2o3ausbntvdhj7yemu6hb3b5yqv6hm42gylbbmz7geocpm"),
|
||||||
|
},
|
||||||
|
}, {
|
||||||
|
Network: "testing-fake-proofs",
|
||||||
|
Version: 10,
|
||||||
|
|
||||||
|
ManifestCid: MustParseCid("bafy2bzacedwap2uuii4luljckrnb4vkur2unb6fyinn7xjie6xlva2wmlygj2"),
|
||||||
|
Actors: map[string]cid.Cid{
|
||||||
|
"account": MustParseCid("bafk2bzaceazxb6p2xg6caivmie6k2bvutyesngwyvhwv4eemwu7ia4vnqkcuy"),
|
||||||
|
"cron": MustParseCid("bafk2bzaceax6ym73boyl5zdpbcr6zmbajzylmcdvlapz5zcqgzcshakz44jbq"),
|
||||||
|
"datacap": MustParseCid("bafk2bzacea63x3v6lvtb4ast5uq3nhrpokvylymvezyr5xyjl6vtlfwkuw6qo"),
|
||||||
|
"eam": MustParseCid("bafk2bzacebhualcn7fofyqr6lhrel32ud23hcwzeenfqu3rrn5nmt6gugqgo6"),
|
||||||
|
"ethaccount": MustParseCid("bafk2bzacecgft7e3v4kbpb3tlt5s6hng74ptu3ggcdi4wmt5p4vr6qkmkw2zc"),
|
||||||
|
"evm": MustParseCid("bafk2bzaceaoqvbqetgicqpvwvcnpjx5aa74kwlhq3u7mwv4yseszxkimwz5pk"),
|
||||||
|
"init": MustParseCid("bafk2bzaceapmoyg2qppzle24t25ncyycn2uwhnw6crqkqlokkbc7w4mn74wko"),
|
||||||
|
"multisig": MustParseCid("bafk2bzacecn3dlepgaps3h6iwlq65dx6zyrbfi4pmgdqxphb5idubb6ibflwe"),
|
||||||
|
"paymentchannel": MustParseCid("bafk2bzaceaanxurr2k3ueolwcnminmdfp3tyxtntqg5fou37smeulb5dxqjzk"),
|
||||||
|
"placeholder": MustParseCid("bafk2bzacedfvut2myeleyq67fljcrw4kkmn5pb5dpyozovj7jpoez5irnc3ro"),
|
||||||
|
"reward": MustParseCid("bafk2bzacedujdvwk4omjexdnmh2qrkqbw27v4c2g3krajhtzyfzart36bimum"),
|
||||||
|
"storagemarket": MustParseCid("bafk2bzacecdbjjxvdtltobiu7thwyyr2puunoz3q4vyfnhhxl2sbp4ovwq37s"),
|
||||||
|
"storageminer": MustParseCid("bafk2bzacedc5klueery4fn2voso4u76rgo54uctsculesdbxxbeh6rgp2q4te"),
|
||||||
|
"storagepower": MustParseCid("bafk2bzacecuz2h2renlfio4xkyrvvro7nwidf7utpjy3oizk2xuszoz3gmea6"),
|
||||||
|
"system": MustParseCid("bafk2bzacecf2jimdz7knhngs64ximfz3eaud6s3kiunmkybgrkupdjyo2dw7o"),
|
||||||
|
"verifiedregistry": MustParseCid("bafk2bzacecdmek2htsgcyoyl35glakyab66cojqo2y335njnm7krleb6yfbps"),
|
||||||
|
},
|
||||||
|
}, {
|
||||||
|
Network: "testing-fake-proofs",
|
||||||
|
Version: 11,
|
||||||
|
BundleGitTag: "v11.0.0",
|
||||||
|
ManifestCid: MustParseCid("bafy2bzacecojemqglhzzhjnhgtrcbsgkyv67ziytvtbhwlr4ym4oxqofv7zui"),
|
||||||
|
Actors: map[string]cid.Cid{
|
||||||
|
"account": MustParseCid("bafk2bzaceccerssb3tgel6ukdghlwvs7dxsolj4fpkgn7dh7owzwapqb6ejpw"),
|
||||||
|
"cron": MustParseCid("bafk2bzacebtfl6fczxnitrqqjhyefskf3asyn3gzuvqcddieoqfsaddk5fd4q"),
|
||||||
|
"datacap": MustParseCid("bafk2bzacediikc55y6uzmnhucf4mik6rqpjulwvgp5gdibogxjhgbvusmzff2"),
|
||||||
|
"eam": MustParseCid("bafk2bzaceazqi5ezossp6kvqogaaba6hxlfarqgniktmb7iy5qonha3eflz6m"),
|
||||||
|
"ethaccount": MustParseCid("bafk2bzaceb77ospgfqqmf67v23wkyeg7lr2mu53ybaacu3bslx7s7nhttdueo"),
|
||||||
|
"evm": MustParseCid("bafk2bzacedvgt7mv22hux4vrnklylq7qmw43kfrqwam6wdsfzkdnaewr33qbu"),
|
||||||
|
"init": MustParseCid("bafk2bzacealzb3nk2oypway5ubz3hs5py5ok5tuw545454vg4d3mwbslef4js"),
|
||||||
|
"multisig": MustParseCid("bafk2bzacec45ppn4hrwizmopp2v2atkxw35tb6yem6uqhqilrv7aiaknnnxmu"),
|
||||||
|
"paymentchannel": MustParseCid("bafk2bzaceajbr3t6cngzh3katqteflbcrtwtdgbthnlfemon5tg6rytf2uonw"),
|
||||||
|
"placeholder": MustParseCid("bafk2bzacedfvut2myeleyq67fljcrw4kkmn5pb5dpyozovj7jpoez5irnc3ro"),
|
||||||
|
"reward": MustParseCid("bafk2bzacea7ycf53kbq4robcuh3ziy7qwwhaqamc5krn3lugypgpxhlewdaiq"),
|
||||||
|
"storagemarket": MustParseCid("bafk2bzacedskmbcpaeb6bezs32szh52jrukvihobluadauayroo5gzrt32tkm"),
|
||||||
|
"storageminer": MustParseCid("bafk2bzacebqeztpa5exztccqjwqhan5droiy7ga6zekm6f2gzxoe655vneczm"),
|
||||||
|
"storagepower": MustParseCid("bafk2bzaceb2tlyuwxncdxsh3hc4fwcjnpxaijkiv54ustwdjbrqabxdsc27km"),
|
||||||
|
"system": MustParseCid("bafk2bzaceaatvscbnkv36ixhtt2zel4er5oskxevgumh5gegqkv7uzah36f24"),
|
||||||
|
"verifiedregistry": MustParseCid("bafk2bzacebp2r56wxadvfzpfbmqwfi3dlnwpmoc5u4tau2hfftbkuafkhye64"),
|
||||||
|
},
|
||||||
}}
|
}}
|
||||||
|
|||||||
@@ -5,6 +5,9 @@ import (
|
|||||||
|
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
|
||||||
|
actorstypes "github.com/filecoin-project/go-state-types/actors"
|
||||||
|
"github.com/filecoin-project/go-state-types/manifest"
|
||||||
|
|
||||||
"github.com/filecoin-project/lotus/build"
|
"github.com/filecoin-project/lotus/build"
|
||||||
"github.com/filecoin-project/lotus/chain/actors"
|
"github.com/filecoin-project/lotus/chain/actors"
|
||||||
)
|
)
|
||||||
@@ -14,21 +17,29 @@ func TestEmbeddedMetadata(t *testing.T) {
|
|||||||
metadata, err := build.ReadEmbeddedBuiltinActorsMetadata()
|
metadata, err := build.ReadEmbeddedBuiltinActorsMetadata()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
require.Equal(t, metadata, build.EmbeddedBuiltinActorsMetadata)
|
for i, v1 := range metadata {
|
||||||
|
v2 := build.EmbeddedBuiltinActorsMetadata[i]
|
||||||
|
require.Equal(t, v1.Network, v2.Network)
|
||||||
|
require.Equal(t, v1.Version, v2.Version)
|
||||||
|
require.Equal(t, v1.ManifestCid, v2.ManifestCid)
|
||||||
|
require.Equal(t, v1.Actors, v2.Actors)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test that we're registering the manifest correctly.
|
// Test that we're registering the manifest correctly.
|
||||||
func TestRegistration(t *testing.T) {
|
func TestRegistration(t *testing.T) {
|
||||||
manifestCid, found := actors.GetManifest(actors.Version8)
|
for _, av := range []actorstypes.Version{actorstypes.Version8, actorstypes.Version9} {
|
||||||
require.True(t, found)
|
manifestCid, found := actors.GetManifest(av)
|
||||||
require.True(t, manifestCid.Defined())
|
require.True(t, found)
|
||||||
|
require.True(t, manifestCid.Defined())
|
||||||
|
|
||||||
for _, key := range actors.GetBuiltinActorsKeys() {
|
for _, key := range manifest.GetBuiltinActorsKeys(av) {
|
||||||
actorCid, found := actors.GetActorCodeID(actors.Version8, key)
|
actorCid, found := actors.GetActorCodeID(av, key)
|
||||||
require.True(t, found)
|
require.True(t, found)
|
||||||
name, version, found := actors.GetActorMetaByCode(actorCid)
|
name, version, found := actors.GetActorMetaByCode(actorCid)
|
||||||
require.True(t, found)
|
require.True(t, found)
|
||||||
require.Equal(t, actors.Version8, version)
|
require.Equal(t, av, version)
|
||||||
require.Equal(t, key, name)
|
require.Equal(t, key, name)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user