Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ All notable changes to this project will be documented in this file.
### New Features
- Enable Prometheus actuator. (#79)
- Rework `QueueService` with a thread pool based on a `PriorityBlockingQueue`. (#84)
- Do not use `broker` to match ordes on chain. (#87)
- Do not use `broker` to match ordes on chain. (#87 #88)
### Bug Fixes
- Fix security rule to access Swagger API. (#79)
### Dependency Upgrades
Expand Down
23 changes: 14 additions & 9 deletions src/main/java/com/iexec/blockchain/broker/BrokerService.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
import com.iexec.blockchain.tool.IexecHubService;
import com.iexec.common.sdk.broker.BrokerOrder;
import com.iexec.commons.poco.chain.ChainAccount;
import com.iexec.commons.poco.contract.generated.IexecHubContract;
import com.iexec.commons.poco.order.AppOrder;
import com.iexec.commons.poco.order.DatasetOrder;
import com.iexec.commons.poco.order.RequestOrder;
Expand All @@ -29,7 +28,10 @@
import org.apache.commons.lang3.StringUtils;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Service;
import org.web3j.crypto.Hash;
import org.web3j.protocol.core.methods.response.Log;
import org.web3j.protocol.core.methods.response.TransactionReceipt;
import org.web3j.utils.Numeric;

import java.math.BigInteger;
import java.text.MessageFormat;
Expand All @@ -43,6 +45,8 @@
@Profile("itest")
public class BrokerService {

static final String SCHEDULER_NOTICE = Hash.sha3String("SchedulerNotice(address,bytes32)");

private final IexecHubService iexecHubService;


Expand Down Expand Up @@ -130,7 +134,7 @@ Optional<String> fireMatchOrders(
WorkerpoolOrder workerpoolOrder,
RequestOrder requestOrder) {
try {
TransactionReceipt receipt = iexecHubService.
final TransactionReceipt receipt = iexecHubService.
getHubContract()
.matchOrders(
appOrder.toHubContract(),
Expand All @@ -141,17 +145,18 @@ Optional<String> fireMatchOrders(
log.info("block {}, hash {}, status {}", receipt.getBlockNumber(), receipt.getTransactionHash(), receipt.getStatus());
log.info("logs count {}", receipt.getLogs().size());

String workerpoolAddress = workerpoolOrder.getWorkerpool();
List<String> events = IexecHubContract.getSchedulerNoticeEvents(receipt)
.stream()
.filter(event -> workerpoolAddress.equals(event.workerpool))
.map(event -> BytesUtils.bytesToString(event.dealid))
final String workerpoolAddress = Numeric.toHexStringWithPrefixZeroPadded(
Numeric.toBigInt(workerpoolOrder.getWorkerpool()), 64);
final List<String> expectedTopics = List.of(SCHEDULER_NOTICE, workerpoolAddress);
List<String> events = receipt.getLogs().stream()
.filter(log -> expectedTopics.equals(log.getTopics()))
.map(Log::getData)
.collect(Collectors.toList());
log.info("events count {}", events.size());
log.info("logs {}", events);
if (events.size() != 1) {
throw new IllegalStateException("A single deal should have been created, not " + events.size());
}
String dealId = events.get(0);
final String dealId = events.get(0);
log.info("Matched orders [chainDealId:{}, tx:{}]", dealId, receipt.getTransactionHash());
return Optional.of(dealId);
} catch (Exception e) {
Expand Down
34 changes: 30 additions & 4 deletions src/test/java/com/iexec/blockchain/broker/BrokerServiceTests.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,17 @@
import org.web3j.crypto.ECKeyPair;
import org.web3j.crypto.Keys;
import org.web3j.protocol.core.RemoteFunctionCall;
import org.web3j.protocol.core.methods.response.Log;
import org.web3j.protocol.core.methods.response.TransactionReceipt;
import org.web3j.utils.Numeric;

import java.io.IOException;
import java.math.BigInteger;
import java.text.MessageFormat;
import java.util.List;
import java.util.Optional;

import static com.iexec.blockchain.broker.BrokerService.SCHEDULER_NOTICE;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any;
Expand Down Expand Up @@ -426,8 +430,6 @@ void shouldFailToMatchOrdersWithDataset() throws Exception {
when(remoteCall.send()).thenThrow(IOException.class);
assertThat(brokerService.fireMatchOrders(appOrder, datasetOrder,workerpoolOrder, requestOrder))
.isEmpty();
assertThat(brokerService.fireMatchOrders(appOrder, datasetOrder, workerpoolOrder, requestOrder))
.isEmpty();
}

@Test
Expand All @@ -443,10 +445,34 @@ void shouldFailToMatchOrdersWithoutDataset() throws Exception {
when(remoteCall.send()).thenThrow(IOException.class);
assertThat(brokerService.fireMatchOrders(appOrder, datasetOrder,workerpoolOrder, requestOrder))
.isEmpty();
assertThat(brokerService.fireMatchOrders(appOrder, datasetOrder, workerpoolOrder, requestOrder))
.isEmpty();
}

@Test
void shouldMatchOrdersWithDataset() throws Exception {
String dealId = "dealId";
AppOrder appOrder = generateAppOrder();
DatasetOrder datasetOrder = generateDatasetOrder(true);
WorkerpoolOrder workerpoolOrder = generateWorkerpoolOrder();
RequestOrder requestOrder = generateRequestOrder(
appOrder, datasetOrder, workerpoolOrder);
IexecHubContract iexecHubContract = mock(IexecHubContract.class);
when(iexecHubService.getHubContract()).thenReturn(iexecHubContract);
when(iexecHubContract.matchOrders(any(), any(), any(), any())).thenReturn(remoteCall);
String workerpoolAddress = Numeric.toHexStringWithPrefixZeroPadded(
Numeric.toBigInt(workerpoolOrder.getWorkerpool()), 64);
Log web3Log = new Log();
web3Log.setData(dealId);
web3Log.setTopics(List.of(SCHEDULER_NOTICE, workerpoolAddress));
TransactionReceipt receipt = new TransactionReceipt();
receipt.setTransactionHash("txHash");
receipt.setBlockNumber("0x1");
receipt.setStatus("1");
receipt.setLogs(List.of(web3Log));
when(remoteCall.send()).thenReturn(receipt);
assertThat(brokerService.fireMatchOrders(appOrder, datasetOrder,workerpoolOrder, requestOrder))
.isNotEmpty()
.contains(dealId);
}
//endregion

//region hasRequesterAcceptedPrices
Expand Down