18
18
import com .staketab .minanames .dto .ZkCloudWorkerDataDTO ;
19
19
import com .staketab .minanames .dto .ZkCloudWorkerGetBlockInfoResponse ;
20
20
import com .staketab .minanames .dto .ZkCloudWorkerRequestDTO ;
21
+ import com .staketab .minanames .dto .ZkCloudWorkerSendTxResponse ;
21
22
import com .staketab .minanames .dto .ZkCloudWorkerTransaction ;
22
23
import com .staketab .minanames .entity .DomainEntity ;
23
24
import com .staketab .minanames .entity .IpfsMetadataCloudWorkerProperty ;
37
38
import java .math .RoundingMode ;
38
39
import java .sql .Timestamp ;
39
40
import java .time .LocalDateTime ;
41
+ import java .util .ArrayList ;
40
42
import java .util .List ;
41
43
import java .util .Map ;
42
44
import java .util .Objects ;
@@ -102,8 +104,8 @@ public void sendTxs(List<PayableTransactionEntity> appliedTxs) {
102
104
}
103
105
104
106
@ Override
105
- public ZkCloudWorkerContractDataResponse getBlockInfo () {
106
- ZkCloudWorkerDataDTO zkCloudWorkerDataDTO = mapToZkCloudWorkerDataDTO (List . of (), GET_BLOCK_INFO );
107
+ public ZkCloudWorkerContractDataResponse getBlockInfo (String startBlock ) {
108
+ ZkCloudWorkerDataDTO zkCloudWorkerDataDTO = mapToZkCloudWorkerDataDTO (GET_BLOCK_INFO , null , startBlock );
107
109
ZkCloudWorkerRequestDTO zkCloudWorkerRequestDTO = mapToZkCloudWorkerRequestDTO (zkCloudWorkerDataDTO , GET_BLOCK_INFO );
108
110
ResponseEntity <String > stringResponseEntity = zkCloudWorkerClient .sendToZkCloudWorker (zkCloudWorkerRequestDTO );
109
111
String body = stringResponseEntity .getBody ();
@@ -122,29 +124,22 @@ public void sendCreateTask() {
122
124
@ Override
123
125
public void checkBlocksFromZkCloudWorker () {
124
126
long topBlockNumber = domainRepository .findTopBlockNumber () != null ? domainRepository .findTopBlockNumber () : 0L ;
125
- ZkCloudWorkerContractDataResponse blockInfo = getBlockInfo ();
126
- List <ZkCloudWorkerBlocksResponse > finalBlocks = blockInfo .getBlocks ()
127
+ ZkCloudWorkerContractDataResponse blockInfo = getBlockInfo (null );
128
+ List <ZkCloudWorkerBlocksResponse > blocks = blockInfo .getBlocks ();
129
+ List <ZkCloudWorkerBlocksResponse > finalBlocks = blocks
127
130
.stream ()
128
131
.filter (ZkCloudWorkerBlocksResponse ::isFinal )
129
- .toList ()
130
- .reversed ();
131
-
132
- for (ZkCloudWorkerBlocksResponse finalBlock : finalBlocks ) {
133
- if (finalBlock .getBlockNumber () <= topBlockNumber ) {
134
- continue ;
135
- }
136
- String ipfs = finalBlock .getIpfs ();
137
- IpfsZkCloudWorkerResponse blockByIpfs = ipfsZkCloudWorkerClient .getBlockByIpfs (ipfs );
138
- List <IpfsZkCloudWorkerTransactionWrapperResponse > transactions = blockByIpfs .getTransactions ();
132
+ .filter (value -> value .getBlockNumber () > topBlockNumber )
133
+ .collect (Collectors .toList ());
134
+ getMoreBlocksIfNeed (finalBlocks , blocks , topBlockNumber );
135
+ List <ZkCloudWorkerBlocksResponse > cloudWorkerBlocksResponses = finalBlocks .reversed ();
139
136
140
- activateNewDomains (finalBlock , transactions , ipfs );
141
- updateOldDomains (finalBlock , transactions );
142
- }
137
+ addNewDomainsOrUpdateOld (cloudWorkerBlocksResponses , topBlockNumber );
143
138
}
144
139
145
140
@ Override
146
141
public IpfsDomainMetadataZkDataDTO getDomainMetadata (String domainMetadata ) {
147
- ZkCloudWorkerDataDTO zkCloudWorkerDataDTO = mapToZkCloudWorkerDataDTO (GET_DOMAIN_METADATA , domainMetadata );
142
+ ZkCloudWorkerDataDTO zkCloudWorkerDataDTO = mapToZkCloudWorkerDataDTO (GET_DOMAIN_METADATA , domainMetadata , null );
148
143
ZkCloudWorkerRequestDTO zkCloudWorkerRequestDTO = mapToZkCloudWorkerRequestDTO (zkCloudWorkerDataDTO , GET_DOMAIN_METADATA );
149
144
ResponseEntity <String > stringResponseEntity = zkCloudWorkerClient .sendToZkCloudWorker (zkCloudWorkerRequestDTO );
150
145
String body = stringResponseEntity .getBody ();
@@ -153,6 +148,39 @@ public IpfsDomainMetadataZkDataDTO getDomainMetadata(String domainMetadata) {
153
148
return gson .fromJson (result , IpfsDomainMetadataZkDataDTO .class );
154
149
}
155
150
151
+ private void getMoreBlocksIfNeed (List <ZkCloudWorkerBlocksResponse > finalBlocks , List <ZkCloudWorkerBlocksResponse > blocks , long topBlockNumber ) {
152
+ List <ZkCloudWorkerBlocksResponse > allBlocks = new ArrayList <>();
153
+ int blockNumber = finalBlocks .getLast ().getBlockNumber ();
154
+ if (!finalBlocks .isEmpty () && blocks .size () == finalBlocks .size ()) {
155
+ String startBlock = finalBlocks .getLast ().getPreviousBlockAddress ();
156
+ while (blockNumber != topBlockNumber + 1 ) {
157
+ List <ZkCloudWorkerBlocksResponse > cloudWorkerBlocksResponses = getBlockInfo (startBlock ).getBlocks ()
158
+ .stream ()
159
+ .filter (ZkCloudWorkerBlocksResponse ::isFinal )
160
+ .filter (value -> value .getBlockNumber () > topBlockNumber )
161
+ .toList ();
162
+ allBlocks .addAll (cloudWorkerBlocksResponses );
163
+ blockNumber = cloudWorkerBlocksResponses .getLast ().getBlockNumber ();
164
+ startBlock = cloudWorkerBlocksResponses .getLast ().getPreviousBlockAddress ();
165
+ }
166
+ }
167
+ finalBlocks .addAll (allBlocks );
168
+ }
169
+
170
+ private void addNewDomainsOrUpdateOld (List <ZkCloudWorkerBlocksResponse > cloudWorkerBlocksResponses , long topBlockNumber ) {
171
+ for (ZkCloudWorkerBlocksResponse finalBlock : cloudWorkerBlocksResponses ) {
172
+ if (finalBlock .getBlockNumber () <= topBlockNumber ) {
173
+ continue ;
174
+ }
175
+ String ipfs = finalBlock .getIpfs ();
176
+ IpfsZkCloudWorkerResponse blockByIpfs = ipfsZkCloudWorkerClient .getBlockByIpfs (ipfs );
177
+ List <IpfsZkCloudWorkerTransactionWrapperResponse > transactions = blockByIpfs .getTransactions ();
178
+
179
+ activateNewDomains (finalBlock , transactions , ipfs );
180
+ updateOldDomains (finalBlock , transactions );
181
+ }
182
+ }
183
+
156
184
private void activateNewDomains (ZkCloudWorkerBlocksResponse finalBlock , List <IpfsZkCloudWorkerTransactionWrapperResponse > transactions , String ipfs ) {
157
185
Map <String , IpfsZkCloudWorkerTransactionResponse > cloudWorkerTransactionResponseMap = transactions
158
186
.stream ()
@@ -251,14 +279,14 @@ private void setMetadata(String newMetadata, DomainEntity domainEntity, String b
251
279
}
252
280
253
281
private void setTxIds (ResponseEntity <String > stringResponseEntity , List <DomainEntity > domainEntities ) {
254
- List <String > txIds = gson .fromJson (stringResponseEntity .getBody (), new TypeToken <List <String >>() {
282
+ List <ZkCloudWorkerSendTxResponse > txIds = gson .fromJson (stringResponseEntity .getBody (), new TypeToken <List <ZkCloudWorkerSendTxResponse >>() {
255
283
}.getType ());
256
284
257
285
for (int i = 0 ; i < domainEntities .size (); i ++) {
258
286
DomainEntity domainEntity = domainEntities .get (i );
259
287
if (txIds != null ) {
260
- String txId = txIds .get (i );
261
- domainEntity .setZkTxId (txId );
288
+ ZkCloudWorkerSendTxResponse zkCloudWorkerSendTxResponse = txIds .get (i );
289
+ domainEntity .setZkTxId (zkCloudWorkerSendTxResponse . getTxId () );
262
290
}
263
291
}
264
292
}
@@ -278,13 +306,14 @@ private ZkCloudWorkerDataDTO mapToZkCloudWorkerDataDTO(List<String> tx, ZkCloudW
278
306
.build ();
279
307
}
280
308
281
- private ZkCloudWorkerDataDTO mapToZkCloudWorkerDataDTO (ZkCloudWorkerTask zkCloudWorkerTask , String domainMetadata ) {
309
+ private ZkCloudWorkerDataDTO mapToZkCloudWorkerDataDTO (ZkCloudWorkerTask zkCloudWorkerTask , String domainMetadata , String startBlock ) {
282
310
return ZkCloudWorkerDataDTO .builder ()
283
311
.task (zkCloudWorkerTask .getName ())
284
312
.metadata (zkCloudWorkerTask .getMetadata ())
285
313
.args (mapArgsToString (ZkCloudWorkerArgs .builder ()
286
314
.contractAddress (mnsContract )
287
315
.domain (domainMetadata )
316
+ .startBlock (startBlock )
288
317
.build ()))
289
318
.build ();
290
319
}
0 commit comments