Skip to content

Commit db277f1

Browse files
authored
Merge pull request #89 from iExecBlockchainComputing/upload-result
Upload result
2 parents 79cea18 + 3e4cd00 commit db277f1

File tree

7 files changed

+124
-22
lines changed

7 files changed

+124
-22
lines changed

src/main/java/com/iexec/worker/chain/IexecHubService.java

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33

44
import com.iexec.common.chain.*;
5-
import com.iexec.common.config.PublicConfiguration;
65
import com.iexec.common.contract.generated.App;
76
import com.iexec.common.contract.generated.IexecClerkABILegacy;
87
import com.iexec.common.contract.generated.IexecHubABILegacy;
8+
import com.iexec.worker.config.PublicConfigurationService;
99
import com.iexec.worker.feign.CustomFeignClient;
1010
import lombok.extern.slf4j.Slf4j;
1111
import org.springframework.beans.factory.annotation.Autowired;
@@ -39,17 +39,14 @@ public class IexecHubService {
3939

4040
@Autowired
4141
public IexecHubService(CredentialsService credentialsService,
42-
CustomFeignClient customFeignClient) {
42+
CustomFeignClient customFeignClient,
43+
PublicConfigurationService publicConfigurationService) {
4344
this.credentialsService = credentialsService;
44-
PublicConfiguration publicConfiguration = customFeignClient.getPublicConfiguration();
45-
this.web3j = ChainUtils.getWeb3j(publicConfiguration.getBlockchainURL());
46-
this.iexecHub = ChainUtils.loadHubContract(
47-
credentialsService.getCredentials(),
48-
this.web3j,
49-
publicConfiguration.getIexecHubAddress());
45+
this.web3j = ChainUtils.getWeb3j(publicConfigurationService.getBlockchainURL());
46+
this.iexecHub = ChainUtils.loadHubContract(credentialsService.getCredentials(),
47+
this.web3j, publicConfigurationService.getIexecHubAddress());
5048
this.iexecClerk = ChainUtils.loadClerkContract(credentialsService.getCredentials(),
51-
this.web3j,
52-
publicConfiguration.getIexecHubAddress());
49+
this.web3j, publicConfigurationService.getIexecHubAddress());
5350
this.executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(1);
5451
}
5552

src/main/java/com/iexec/worker/config/PublicConfigurationService.java

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,36 @@
44
import com.iexec.worker.feign.CustomFeignClient;
55
import org.springframework.stereotype.Service;
66

7-
@Service("publicConfigurationService")
7+
@Service
88
public class PublicConfigurationService {
99

10-
public long askForReplicatePeriod;
10+
private PublicConfiguration publicConfiguration;
1111

1212
public PublicConfigurationService(CustomFeignClient customFeignClient){
13-
PublicConfiguration publicConfiguration = customFeignClient.getPublicConfiguration();
14-
askForReplicatePeriod = publicConfiguration.getAskForReplicatePeriod();
13+
this.publicConfiguration = customFeignClient.getPublicConfiguration();
1514
}
15+
16+
public Integer getChainId() {
17+
return publicConfiguration.getChainId();
18+
}
19+
20+
public String getBlockchainURL() {
21+
return publicConfiguration.getBlockchainURL();
22+
}
23+
24+
public String getIexecHubAddress() {
25+
return publicConfiguration.getIexecHubAddress();
26+
}
27+
28+
public String getWorkerPoolAddress() {
29+
return publicConfiguration.getWorkerPoolAddress();
30+
}
31+
public String getSchedulerPublicAddress() {
32+
return publicConfiguration.getSchedulerPublicAddress();
33+
}
34+
35+
public long getAskForReplicatePeriod() {
36+
return publicConfiguration.getAskForReplicatePeriod();
37+
}
38+
1639
}

src/main/java/com/iexec/worker/feign/CustomFeignClient.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ private String getToken() {
166166
if (currentToken.isEmpty()) {
167167
String workerAddress = credentialsService.getCredentials().getAddress();
168168
String challenge = getChallenge(workerAddress);
169-
currentToken = TOKEN_PREFIX + login(workerAddress, signatureService.createSignature(challenge));
169+
currentToken = TOKEN_PREFIX + login(workerAddress, signatureService.hashAndSign(challenge));
170170
}
171171
return currentToken;
172172
}
Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,26 @@
11
package com.iexec.worker.feign;
22

3-
43
import com.iexec.common.result.ResultModel;
4+
import com.iexec.common.result.eip712.Eip712Challenge;
5+
56
import org.springframework.cloud.openfeign.FeignClient;
67
import org.springframework.http.ResponseEntity;
8+
import org.springframework.web.bind.annotation.GetMapping;
79
import org.springframework.web.bind.annotation.PostMapping;
810
import org.springframework.web.bind.annotation.RequestBody;
11+
import org.springframework.web.bind.annotation.RequestHeader;
12+
import org.springframework.web.bind.annotation.RequestParam;
13+
14+
import feign.FeignException;
915

1016
@FeignClient(name = "ResultRepoClient", url = "http://${core.host}:${core.port}")
1117
public interface ResultRepoClient {
1218

19+
@GetMapping("/results/challenge")
20+
Eip712Challenge getChallenge(@RequestParam(name = "chainId") Integer chainId) throws FeignException;
21+
1322
@PostMapping("/results")
14-
ResponseEntity addResult(@RequestBody ResultModel resultModel);
23+
ResponseEntity uploadResult(@RequestHeader("Authorization") String customToken,
24+
@RequestBody ResultModel resultModel);
1525

1626
}

src/main/java/com/iexec/worker/pubsub/SubscriptionService.java

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,12 @@
44
import com.iexec.common.result.TaskNotificationType;
55
import com.iexec.worker.chain.RevealService;
66
import com.iexec.worker.config.CoreConfigurationService;
7+
import com.iexec.worker.config.PublicConfigurationService;
78
import com.iexec.worker.config.WorkerConfigurationService;
89
import com.iexec.worker.feign.CustomFeignClient;
910
import com.iexec.worker.feign.ResultRepoClient;
11+
import com.iexec.common.result.eip712.Eip712Challenge;
12+
import com.iexec.worker.result.Eip712ChallengeService;
1013
import com.iexec.worker.result.ResultService;
1114
import lombok.extern.slf4j.Slf4j;
1215
import org.springframework.lang.Nullable;
@@ -37,6 +40,8 @@ public class SubscriptionService extends StompSessionHandlerAdapter {
3740
private ResultService resultService;
3841
private RevealService revealService;
3942
private CustomFeignClient feignClient;
43+
private Eip712ChallengeService eip712ChallengeService;
44+
private PublicConfigurationService publicConfigurationService;
4045
// internal components
4146
private StompSession session;
4247
private Map<String, StompSession.Subscription> chainTaskIdToSubscription;
@@ -48,11 +53,15 @@ public SubscriptionService(CoreConfigurationService coreConfigurationService,
4853
ResultRepoClient resultRepoClient,
4954
ResultService resultService,
5055
RevealService revealService,
51-
CustomFeignClient feignClient) {
56+
CustomFeignClient feignClient,
57+
Eip712ChallengeService eip712ChallengeService,
58+
PublicConfigurationService publicConfigurationService) {
5259
this.resultRepoClient = resultRepoClient;
5360
this.resultService = resultService;
5461
this.revealService = revealService;
5562
this.feignClient = feignClient;
63+
this.eip712ChallengeService = eip712ChallengeService;
64+
this.publicConfigurationService = publicConfigurationService;
5665

5766
this.coreHost = coreConfigurationService.getHost();
5867
this.corePort = coreConfigurationService.getPort();
@@ -85,7 +94,8 @@ public void afterConnected(StompSession session, StompHeaders connectedHeaders)
8594
@Override
8695
public void handleException(StompSession session, @Nullable StompCommand command,
8796
StompHeaders headers, byte[] payload, Throwable exception) {
88-
log.info("Received handleException [session: {}, isConnected: {}]", session.getSessionId(), session.isConnected());
97+
log.error("Received handleException [session: {}, isConnected: {}, Exception: {}]",
98+
session.getSessionId(), session.isConnected(), exception.getMessage());
8999
this.connectStomp();
90100
}
91101

@@ -95,7 +105,6 @@ public void handleTransportError(StompSession session, Throwable exception) {
95105
this.connectStomp();
96106
}
97107

98-
99108
public void subscribeToTaskNotifications(String chainTaskId) {
100109
if (chainTaskIdToSubscription.containsKey(chainTaskId)) {
101110
log.info("Already subscribed to TaskNotification [chainTaskId:{}]", chainTaskId);
@@ -185,7 +194,9 @@ private void abortContributionTimeout(String chainTaskId) {
185194

186195
private void uploadResult(String chainTaskId) {
187196
feignClient.updateReplicateStatus(chainTaskId, RESULT_UPLOADING);
188-
resultRepoClient.addResult(resultService.getResultModelWithZip(chainTaskId));
197+
Eip712Challenge eip712Challenge = resultRepoClient.getChallenge(publicConfigurationService.getChainId());
198+
String authorizationToken = eip712ChallengeService.buildAuthorizationToken(eip712Challenge);
199+
resultRepoClient.uploadResult(authorizationToken, resultService.getResultModelWithZip(chainTaskId));
189200
feignClient.updateReplicateStatus(chainTaskId, RESULT_UPLOADED);
190201
}
191202

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.iexec.worker.result;
2+
3+
import com.iexec.worker.config.WorkerConfigurationService;
4+
import com.iexec.worker.security.SignatureService;
5+
import com.iexec.common.result.eip712.Eip712Challenge;
6+
import com.iexec.common.result.eip712.Eip712ChallengeUtils;
7+
8+
import lombok.extern.slf4j.Slf4j;
9+
import org.springframework.stereotype.Service;
10+
11+
@Service
12+
@Slf4j
13+
public class Eip712ChallengeService {
14+
15+
private SignatureService signatureService;
16+
private WorkerConfigurationService workerConfigurationService;
17+
18+
Eip712ChallengeService(SignatureService signatureService,
19+
WorkerConfigurationService workerConfigurationService) {
20+
this.signatureService = signatureService;
21+
this.workerConfigurationService = workerConfigurationService;
22+
}
23+
24+
public String buildAuthorizationToken(Eip712Challenge eip712Challenge) {
25+
String walletAddress = workerConfigurationService.getWorkerWalletAddress();
26+
27+
String challengeString = Eip712ChallengeUtils.getEip712ChallengeString(eip712Challenge);
28+
String signatureString = signatureService.signAsString(challengeString);
29+
30+
String authoriaztionToken = String.join("_", challengeString, signatureString, walletAddress);
31+
32+
return authoriaztionToken;
33+
}
34+
}

src/main/java/com/iexec/worker/security/SignatureService.java

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.web3j.crypto.ECKeyPair;
88
import org.web3j.crypto.Hash;
99
import org.web3j.crypto.Sign;
10+
import org.web3j.utils.Numeric;
1011

1112
@Service
1213
public class SignatureService {
@@ -17,7 +18,7 @@ public SignatureService(CredentialsService credentialsService) {
1718
this.credentialsService = credentialsService;
1819
}
1920

20-
public Signature createSignature(String stringToSign) {
21+
public Signature hashAndSign(String stringToSign) {
2122
byte[] message = Hash.sha3(BytesUtils.stringToBytes(stringToSign));
2223

2324
ECKeyPair keyPair = credentialsService.getCredentials().getEcKeyPair();
@@ -30,4 +31,30 @@ public Signature createSignature(String stringToSign) {
3031
.signV(sign.getV())
3132
.build();
3233
}
34+
35+
public String hashAndSignAsString(String stringToSign) {
36+
byte[] message = Hash.sha3(BytesUtils.stringToBytes(stringToSign));
37+
38+
ECKeyPair keyPair = credentialsService.getCredentials().getEcKeyPair();
39+
Sign.SignatureData sign = Sign.signMessage(message, keyPair, false);
40+
41+
return createStringFromSignature(sign);
42+
}
43+
44+
public String signAsString(String stringToSign) {
45+
byte[] message = Numeric.hexStringToByteArray(stringToSign);
46+
47+
ECKeyPair keyPair = credentialsService.getCredentials().getEcKeyPair();
48+
Sign.SignatureData sign = Sign.signMessage(message, keyPair, false);
49+
50+
return createStringFromSignature(sign);
51+
}
52+
53+
private String createStringFromSignature(Sign.SignatureData sign) {
54+
String r = Numeric.toHexString(sign.getR());
55+
String s = Numeric.toHexString(sign.getS());
56+
String v = Integer.toHexString(sign.getV());
57+
58+
return String.join("", r, Numeric.cleanHexPrefix(s), v);
59+
}
3360
}

0 commit comments

Comments
 (0)