Skip to content

Commit 152dd4d

Browse files
Merge pull request #307 from iExecBlockchainComputing/feature/computed-json
Feature/computed json
2 parents a5ee4b4 + 043dec1 commit 152dd4d

31 files changed

+567
-592
lines changed

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

Lines changed: 0 additions & 61 deletions
This file was deleted.

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

Lines changed: 65 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,11 @@
22

33
import com.iexec.common.chain.*;
44
import com.iexec.common.contract.generated.IexecHubContract;
5+
import com.iexec.common.contribution.Contribution;
56
import com.iexec.common.replicate.ReplicateStatusCause;
6-
import com.iexec.common.security.Signature;
7+
import com.iexec.common.result.ComputedFile;
78
import com.iexec.common.utils.BytesUtils;
8-
import com.iexec.common.utils.HashUtils;
9-
import com.iexec.common.utils.SignatureUtils;
10-
9+
import com.iexec.common.worker.result.ResultUtils;
1110
import lombok.extern.slf4j.Slf4j;
1211
import org.springframework.stereotype.Service;
1312

@@ -22,20 +21,18 @@
2221
public class ContributionService {
2322

2423
private IexecHubService iexecHubService;
25-
private ContributionAuthorizationService contributionAuthorizationService;
24+
private WorkerpoolAuthorizationService workerpoolAuthorizationService;
25+
private EnclaveAuthorizationService enclaveAuthorizationService;
26+
private CredentialsService credentialsService;
2627

2728
public ContributionService(IexecHubService iexecHubService,
28-
ContributionAuthorizationService contributionAuthorizationService) {
29+
WorkerpoolAuthorizationService workerpoolAuthorizationService,
30+
EnclaveAuthorizationService enclaveAuthorizationService,
31+
CredentialsService credentialsService) {
2932
this.iexecHubService = iexecHubService;
30-
this.contributionAuthorizationService = contributionAuthorizationService;
31-
}
32-
33-
public static String computeResultSeal(String walletAddress, String chainTaskId, String deterministHash) {
34-
return HashUtils.concatenateAndHash(walletAddress, chainTaskId, deterministHash);
35-
}
36-
37-
public static String computeResultHash(String chainTaskId, String deterministHash) {
38-
return HashUtils.concatenateAndHash(chainTaskId, deterministHash);
33+
this.workerpoolAuthorizationService = workerpoolAuthorizationService;
34+
this.enclaveAuthorizationService = enclaveAuthorizationService;
35+
this.credentialsService = credentialsService;
3936
}
4037

4138
public boolean isChainTaskInitialized(String chainTaskId) {
@@ -66,20 +63,20 @@ public Optional<ReplicateStatusCause> getCannotContributeStatusCause(String chai
6663
return Optional.of(CONTRIBUTION_ALREADY_SET);
6764
}
6865

69-
if (!isContributionAuthorizationPresent(chainTaskId)) {
70-
return Optional.of(CONTRIBUTION_AUTHORIZATION_NOT_FOUND);
66+
if (!isWorkerpoolAuthorizationPresent(chainTaskId)) {
67+
return Optional.of(CONTRIBUTION_AUTHORIZATION_NOT_FOUND);//TODO Rename status to WORKERPOOL_AUTHORIZATION_NOT_FOUND
7168
}
7269

7370
return Optional.empty();
7471
}
7572

76-
private boolean isContributionAuthorizationPresent(String chainTaskId) {
77-
ContributionAuthorization contributionAuthorization =
78-
contributionAuthorizationService.getContributionAuthorization(chainTaskId);
79-
if (contributionAuthorization != null){
73+
private boolean isWorkerpoolAuthorizationPresent(String chainTaskId) {
74+
WorkerpoolAuthorization workerpoolAuthorization =
75+
workerpoolAuthorizationService.getWorkerpoolAuthorization(chainTaskId);
76+
if (workerpoolAuthorization != null) {
8077
return true;
8178
}
82-
log.error("ContributionAuthorization missing [chainTaskId:{}]", chainTaskId);
79+
log.error("WorkerpoolAuthorization missing [chainTaskId:{}]", chainTaskId);
8380
return false;
8481
}
8582

@@ -108,14 +105,6 @@ private boolean isContributionUnsetToContribute(ChainTask chainTask) {
108105
return chainContribution.getStatus().equals(ChainContributionStatus.UNSET);
109106
}
110107

111-
public boolean isContributionAuthorizationValid(ContributionAuthorization auth, String signerAddress) {
112-
// create the hash that was used in the signature in the core
113-
byte[] message = BytesUtils.stringToBytes(
114-
HashUtils.concatenateAndHash(auth.getWorkerWallet(), auth.getChainTaskId(), auth.getEnclaveChallenge()));
115-
116-
return SignatureUtils.isSignatureValid(message, auth.getSignature(), signerAddress);
117-
}
118-
119108
public boolean isContributionDeadlineReached(String chainTaskId) {
120109
Optional<ChainTask> oTask = iexecHubService.getChainTask(chainTaskId);
121110
if (!oTask.isPresent()) return true;
@@ -124,30 +113,64 @@ public boolean isContributionDeadlineReached(String chainTaskId) {
124113
}
125114

126115
// returns ChainReceipt of the contribution if successful, null otherwise
127-
public Optional<ChainReceipt> contribute(ContributionAuthorization contribAuth, String deterministHash, Signature enclaveSignature) {
128-
String resultSeal = computeResultSeal(contribAuth.getWorkerWallet(), contribAuth.getChainTaskId(), deterministHash);
129-
String resultHash = computeResultHash(contribAuth.getChainTaskId(), deterministHash);
130-
IexecHubContract.TaskContributeEventResponse contributeResponse = iexecHubService.contribute(contribAuth, resultHash, resultSeal, enclaveSignature);
116+
public Optional<ChainReceipt> contribute(Contribution contribution) {
117+
118+
IexecHubContract.TaskContributeEventResponse contributeResponse = iexecHubService.contribute(contribution);
131119

132120
if (contributeResponse == null) {
133-
log.error("ContributeTransactionReceipt received but was null [chainTaskId:{}]", contribAuth.getChainTaskId());
121+
log.error("ContributeTransactionReceipt received but was null [chainTaskId:{}]", contribution.getChainTaskId());
134122
return Optional.empty();
135123
}
136124

137-
ChainReceipt chainReceipt = ChainUtils.buildChainReceipt(contributeResponse.log, contribAuth.getChainTaskId(),
125+
ChainReceipt chainReceipt = ChainUtils.buildChainReceipt(contributeResponse.log, contribution.getChainTaskId(),
138126
iexecHubService.getLatestBlockNumber());
139127

140-
141-
142128
return Optional.of(chainReceipt);
143129
}
144130

145-
public boolean putContributionAuthorization(ContributionAuthorization contributionAuthorization) {
146-
return contributionAuthorizationService.putContributionAuthorization(contributionAuthorization);
131+
public boolean putWorkerpoolAuthorization(WorkerpoolAuthorization workerpoolAuthorization) {
132+
return workerpoolAuthorizationService.putWorkerpoolAuthorization(workerpoolAuthorization);
133+
}
134+
135+
public WorkerpoolAuthorization getWorkerpoolAuthorization(String chainTaskId) {
136+
return workerpoolAuthorizationService.getWorkerpoolAuthorization(chainTaskId);
147137
}
148138

149-
public ContributionAuthorization getContributionAuthorization(String chainTaskId) {
150-
return contributionAuthorizationService.getContributionAuthorization(chainTaskId);
139+
public Contribution getContribution(ComputedFile computedFile) {
140+
String chainTaskId = computedFile.getTaskId();
141+
WorkerpoolAuthorization workerpoolAuthorization = workerpoolAuthorizationService.getWorkerpoolAuthorization(chainTaskId);
142+
if (workerpoolAuthorization == null) {
143+
log.error("Cant getContribution (cant getWorkerpoolAuthorization) [chainTaskId:{}]", chainTaskId);
144+
return null;
145+
}
146+
147+
String resultDigest = computedFile.getResultDigest();
148+
String resultHash = ResultUtils.computeResultHash(chainTaskId, resultDigest);
149+
String resultSeal = ResultUtils.computeResultSeal(credentialsService.getCredentials().getAddress(), chainTaskId, resultDigest);
150+
String workerpoolSignature = workerpoolAuthorization.getSignature().getValue();
151+
String enclaveChallenge = workerpoolAuthorization.getEnclaveChallenge();
152+
String enclaveSignature = computedFile.getEnclaveSignature();
153+
154+
boolean isTeeTask = iexecHubService.isTeeTask(chainTaskId);
155+
if (isTeeTask) {
156+
if (!enclaveAuthorizationService.isVerifiedEnclaveSignature(chainTaskId,
157+
resultHash, resultSeal, enclaveSignature, enclaveChallenge)){
158+
log.error("Cant getContribution (isVerifiedEnclaveSignature false) [chainTaskId:{}]", chainTaskId);
159+
return null;
160+
}
161+
} else {
162+
enclaveSignature = BytesUtils.EMPTY_HEXASTRING_64;
163+
}
164+
165+
return Contribution.builder()
166+
.chainTaskId(chainTaskId)
167+
.resultDigest(resultDigest)
168+
.resultHash(resultHash)
169+
.resultSeal(resultSeal)
170+
.enclaveChallenge(enclaveChallenge)
171+
.enclaveSignature(enclaveSignature)
172+
.workerPoolSignature(workerpoolSignature)
173+
.build();
151174
}
152175

153176
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.iexec.worker.chain;
2+
3+
import com.iexec.common.security.Signature;
4+
import com.iexec.common.tee.TeeEnclaveChallengeSignature;
5+
import lombok.extern.slf4j.Slf4j;
6+
import org.springframework.stereotype.Service;
7+
8+
import static com.iexec.common.utils.SignatureUtils.isExpectedSignerOnSignedMessageHash;
9+
10+
11+
@Slf4j
12+
@Service
13+
public class EnclaveAuthorizationService {
14+
15+
public boolean isVerifiedEnclaveSignature(String chainTaskId, String resultHash, String resultSeal,
16+
String enclaveSignature, String enclaveChallenge) {
17+
if (enclaveChallenge == null || enclaveChallenge.isEmpty()) {
18+
log.error("Cant verify enclave signature (enclave challenge not found) [chainTaskId:{}]", chainTaskId);
19+
return false;
20+
}
21+
22+
if (enclaveSignature == null || enclaveSignature.isEmpty()) {
23+
log.error("Cant verify enclave signature (enclave signature not found) [chainTaskId:{}]", chainTaskId);
24+
return false;
25+
}
26+
27+
String messageHash = TeeEnclaveChallengeSignature.getMessageHash(resultHash, resultSeal);
28+
29+
return isExpectedSignerOnSignedMessageHash(messageHash,
30+
new Signature(enclaveSignature), enclaveChallenge);
31+
}
32+
}

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

Lines changed: 14 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
import com.iexec.common.chain.*;
55
import com.iexec.common.contract.generated.IexecHubContract;
6+
import com.iexec.common.contribution.Contribution;
67
import com.iexec.common.security.Signature;
78
import com.iexec.common.task.TaskDescription;
89
import com.iexec.common.utils.BytesUtils;
@@ -49,40 +50,31 @@ public IexecHubService(CredentialsService credentialsService,
4950
this.executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(1);
5051
}
5152

52-
IexecHubContract.TaskContributeEventResponse contribute(ContributionAuthorization contribAuth,
53-
String resultHash,
54-
String resultSeal,
55-
Signature enclaveSignature) {
53+
IexecHubContract.TaskContributeEventResponse contribute(Contribution contribution) {
5654
try {
5755
return CompletableFuture.supplyAsync(() -> {
5856
log.info("Requested contribute [chainTaskId:{}, waitingTxCount:{}]",
59-
contribAuth.getChainTaskId(), getWaitingTransactionCount());
60-
return sendContributeTransaction(contribAuth, resultHash, resultSeal, enclaveSignature);
57+
contribution.getChainTaskId(), getWaitingTransactionCount());
58+
return sendContributeTransaction(contribution);
6159
}, executor).get();
6260
} catch (InterruptedException | ExecutionException e) {
6361
e.printStackTrace();
6462
}
6563
return null;
6664
}
6765

68-
private IexecHubContract.TaskContributeEventResponse sendContributeTransaction(ContributionAuthorization contribAuth,
69-
String resultHash,
70-
String resultSeal,
71-
Signature enclaveSignature) {
66+
private IexecHubContract.TaskContributeEventResponse sendContributeTransaction(Contribution contribution) {
7267
TransactionReceipt contributeReceipt;
73-
String chainTaskId = contribAuth.getChainTaskId();
74-
75-
byte[] enclaveSign = BytesUtils.stringToBytes(enclaveSignature.getValue());
76-
byte[] workerPoolSign = BytesUtils.stringToBytes(contribAuth.getSignature().getValue());
68+
String chainTaskId = contribution.getChainTaskId();
7769

7870
RemoteCall<TransactionReceipt> contributeCall = getHubContract(web3jService.getWritingContractGasProvider()).contribute(
7971
stringToBytes(chainTaskId),
80-
stringToBytes(resultHash),
81-
stringToBytes(resultSeal),
82-
contribAuth.getEnclaveChallenge(),
83-
enclaveSign,
84-
workerPoolSign);
85-
log.info("Sent contribute [chainTaskId:{}, resultHash:{}]", chainTaskId, resultHash);
72+
stringToBytes(contribution.getResultHash()),
73+
stringToBytes(contribution.getResultSeal()),
74+
contribution.getEnclaveChallenge(),
75+
stringToBytes(contribution.getEnclaveSignature()),
76+
stringToBytes(contribution.getWorkerPoolSignature()));
77+
log.info("Sent contribute [chainTaskId:{}, contribution:{}]", chainTaskId, contribution);
8678

8779
try {
8880
contributeReceipt = contributeCall.send();
@@ -100,8 +92,8 @@ private IexecHubContract.TaskContributeEventResponse sendContributeTransaction(C
10092
}
10193

10294
if (isSuccessTx(chainTaskId, contributeEvent, CONTRIBUTED)) {
103-
log.info("Contributed [chainTaskId:{}, resultHash:{}, gasUsed:{}, log:{}]",
104-
chainTaskId, resultHash, contributeReceipt.getGasUsed(), contributeEvent.log);
95+
log.info("Contributed [chainTaskId:{}, contribution:{}, gasUsed:{}, log:{}]",
96+
chainTaskId, contribution, contributeReceipt.getGasUsed(), contributeEvent.log);
10597
return contributeEvent;
10698
}
10799

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

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.iexec.common.chain.*;
44
import com.iexec.common.contract.generated.IexecHubContract;
55
import com.iexec.common.utils.HashUtils;
6+
import com.iexec.common.worker.result.ResultUtils;
67
import lombok.extern.slf4j.Slf4j;
78
import org.springframework.stereotype.Service;
89

@@ -25,17 +26,17 @@ public RevealService(IexecHubService iexecHubService,
2526
this.web3jService = web3jService;
2627
}
2728

28-
public boolean repeatCanReveal(String chainTaskId, String determinismHash) {
29+
public boolean repeatCanReveal(String chainTaskId, String resultDigest) {
2930
return web3jService.repeatCheck(6, 3, "canReveal",
30-
this::canReveal, chainTaskId, determinismHash);
31+
this::canReveal, chainTaskId, resultDigest);
3132
}
3233

3334
/*
3435
* params: String chainTaskId, String determinismHash
3536
* */
3637
public boolean canReveal(String... args) {
3738
String chainTaskId = args[0];
38-
String determinismHash = args[1];
39+
String resultDigest = args[1];
3940

4041
Optional<ChainTask> optionalChainTask = iexecHubService.getChainTask(chainTaskId);
4142
if (!optionalChainTask.isPresent()) {
@@ -59,12 +60,12 @@ public boolean canReveal(String... args) {
5960
boolean isContributionResultHashCorrect = false;
6061
boolean isContributionResultSealCorrect = false;
6162

62-
if (!determinismHash.isEmpty()) {//TODO
63-
isContributionResultHashCorrect = chainContribution.getResultHash().equals(HashUtils.concatenateAndHash(chainTaskId, determinismHash));
63+
if (!resultDigest.isEmpty()) {//TODO
64+
isContributionResultHashCorrect = chainContribution.getResultHash().equals(ResultUtils.computeResultHash(chainTaskId, resultDigest));
6465

6566
String walletAddress = credentialsService.getCredentials().getAddress();
6667
isContributionResultSealCorrect = chainContribution.getResultSeal().equals(
67-
HashUtils.concatenateAndHash(walletAddress, chainTaskId, determinismHash)
68+
ResultUtils.computeResultSeal(walletAddress, chainTaskId, resultDigest)
6869
);
6970
}
7071

@@ -96,13 +97,13 @@ public boolean isConsensusBlockReached(String chainTaskId, long consensusBlock)
9697
}
9798

9899
// returns the ChainReceipt of the reveal if successful, empty otherwise
99-
public Optional<ChainReceipt> reveal(String chainTaskId, String determinismHash) {
100+
public Optional<ChainReceipt> reveal(String chainTaskId, String resultDigest) {
100101

101-
if (determinismHash.isEmpty()) {
102+
if (resultDigest.isEmpty()) {
102103
return Optional.empty();
103104
}
104105

105-
IexecHubContract.TaskRevealEventResponse revealResponse = iexecHubService.reveal(chainTaskId, determinismHash);
106+
IexecHubContract.TaskRevealEventResponse revealResponse = iexecHubService.reveal(chainTaskId, resultDigest);
106107
if (revealResponse == null) {
107108
log.error("RevealTransactionReceipt received but was null [chainTaskId:{}]", chainTaskId);
108109
return Optional.empty();

0 commit comments

Comments
 (0)