22
33import com .iexec .common .chain .*;
44import com .iexec .common .contract .generated .IexecHubContract ;
5+ import com .iexec .common .contribution .Contribution ;
56import com .iexec .common .replicate .ReplicateStatusCause ;
6- import com .iexec .common .security . Signature ;
7+ import com .iexec .common .result . ComputedFile ;
78import 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 ;
1110import lombok .extern .slf4j .Slf4j ;
1211import org .springframework .stereotype .Service ;
1312
2221public 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}
0 commit comments