mirror of https://github.com/hyperledger/besu
Issue - 7554 remove unused privacy test classes (#7569)
* remove unused classes Signed-off-by: George Tebrean <george@web3labs.com> * removed duplication from changelog Signed-off-by: Sally MacFarlane <macfarla.github@gmail.com> --------- Signed-off-by: George Tebrean <george@web3labs.com> Signed-off-by: George Tebrean <99179176+gtebrean@users.noreply.github.com> Signed-off-by: Sally MacFarlane <macfarla.github@gmail.com> Co-authored-by: Sally MacFarlane <macfarla.github@gmail.com>pull/7607/head
parent
b18d15058f
commit
6ed1db32ae
@ -1,38 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.condition.priv; |
|
||||||
|
|
||||||
import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; |
|
||||||
|
|
||||||
import org.hyperledger.besu.datatypes.Hash; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.condition.Condition; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.node.Node; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.EeaSendRawTransactionTransaction; |
|
||||||
|
|
||||||
public class EeaSendRawTransactionSuccess implements Condition { |
|
||||||
|
|
||||||
private final EeaSendRawTransactionTransaction sendRawTransactionTransaction; |
|
||||||
|
|
||||||
public EeaSendRawTransactionSuccess( |
|
||||||
final EeaSendRawTransactionTransaction sendRawTransactionTransaction) { |
|
||||||
this.sendRawTransactionTransaction = sendRawTransactionTransaction; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void verify(final Node node) { |
|
||||||
final Hash transactionHash = node.execute(sendRawTransactionTransaction); |
|
||||||
assertThat(transactionHash).isNotNull(); |
|
||||||
} |
|
||||||
} |
|
@ -1,53 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.condition.priv; |
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.failBecauseExceptionWasNotThrown; |
|
||||||
|
|
||||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcError; |
|
||||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.RpcErrorType; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.condition.Condition; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.node.Node; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; |
|
||||||
|
|
||||||
import org.assertj.core.api.Assertions; |
|
||||||
import org.web3j.protocol.exceptions.ClientConnectionException; |
|
||||||
|
|
||||||
public class ExpectJsonRpcError implements Condition { |
|
||||||
|
|
||||||
private final Transaction<?> transaction; |
|
||||||
private final JsonRpcError error; |
|
||||||
|
|
||||||
public ExpectJsonRpcError(final Transaction<?> transaction, final JsonRpcError error) { |
|
||||||
this.transaction = transaction; |
|
||||||
this.error = error; |
|
||||||
} |
|
||||||
|
|
||||||
public ExpectJsonRpcError(final Transaction<?> transaction, final RpcErrorType error) { |
|
||||||
this(transaction, new JsonRpcError(error)); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void verify(final Node node) { |
|
||||||
try { |
|
||||||
node.execute(transaction); |
|
||||||
failBecauseExceptionWasNotThrown(ClientConnectionException.class); |
|
||||||
} catch (final Exception e) { |
|
||||||
Assertions.assertThat(e) |
|
||||||
.isInstanceOf(RuntimeException.class) |
|
||||||
.hasMessageContaining(error.getMessage()); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,120 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.condition.priv; |
|
||||||
|
|
||||||
import org.hyperledger.besu.datatypes.Address; |
|
||||||
import org.hyperledger.besu.datatypes.Hash; |
|
||||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.RpcErrorType; |
|
||||||
import org.hyperledger.besu.ethereum.privacy.PrivateTransaction; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.condition.Condition; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.privacy.condition.PrivateCondition; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.PrivacyTransactions; |
|
||||||
|
|
||||||
import java.util.List; |
|
||||||
|
|
||||||
public class PrivConditions { |
|
||||||
|
|
||||||
private final PrivacyTransactions transactions; |
|
||||||
|
|
||||||
public PrivConditions(final PrivacyTransactions transactions) { |
|
||||||
this.transactions = transactions; |
|
||||||
} |
|
||||||
|
|
||||||
public Condition getPrivacyPrecompileAddress(final Address precompileAddress) { |
|
||||||
return new PrivGetPrivacyPrecompileAddressSuccess( |
|
||||||
transactions.getPrivacyPrecompileAddress(), precompileAddress); |
|
||||||
} |
|
||||||
|
|
||||||
public Condition getPrivateTransaction( |
|
||||||
final Hash transactionHash, final PrivateTransaction privateTransaction) { |
|
||||||
return new PrivGetPrivateTransactionSuccess( |
|
||||||
transactions.getPrivateTransaction(transactionHash), privateTransaction); |
|
||||||
} |
|
||||||
|
|
||||||
public Condition getPrivateTransactionReturnsNull(final Hash transactionHash) { |
|
||||||
return new PrivGetPrivateTransactionReturnsNull( |
|
||||||
transactions.getPrivateTransaction(transactionHash)); |
|
||||||
} |
|
||||||
|
|
||||||
public Condition createPrivacyGroup( |
|
||||||
final List<String> addresses, |
|
||||||
final String groupName, |
|
||||||
final String groupDescription, |
|
||||||
final String groupId) { |
|
||||||
return new PrivCreatePrivacyGroupSuccess( |
|
||||||
transactions.createPrivacyGroup(addresses, groupName, groupDescription), groupId); |
|
||||||
} |
|
||||||
|
|
||||||
public Condition deletePrivacyGroup(final String groupId) { |
|
||||||
return new PrivDeletePrivacyGroupSuccess(transactions.deletePrivacyGroup(groupId), groupId); |
|
||||||
} |
|
||||||
|
|
||||||
public Condition findPrivacyGroup(final int numGroups, final String... groupMembers) { |
|
||||||
return new PrivFindPrivacyGroupSuccess(transactions.findPrivacyGroup(groupMembers), numGroups); |
|
||||||
} |
|
||||||
|
|
||||||
public Condition eeaSendRawTransaction(final String transaction) { |
|
||||||
return new EeaSendRawTransactionSuccess(transactions.sendRawTransaction(transaction)); |
|
||||||
} |
|
||||||
|
|
||||||
public Condition distributeRawTransaction( |
|
||||||
final String transactionRLP, final String enclaveResponseKey) { |
|
||||||
return new PrivDistributeRawTransactionSuccess( |
|
||||||
transactions.distributeRawTransaction(transactionRLP), enclaveResponseKey); |
|
||||||
} |
|
||||||
|
|
||||||
public Condition getTransactionCount( |
|
||||||
final String accountAddress, |
|
||||||
final String privacyGroupId, |
|
||||||
final int expectedTransactionCount) { |
|
||||||
return new PrivGetTransactionCountSuccess( |
|
||||||
transactions.getTransactionCount(accountAddress, privacyGroupId), expectedTransactionCount); |
|
||||||
} |
|
||||||
|
|
||||||
public Condition getEeaTransactionCount( |
|
||||||
final String accountAddress, |
|
||||||
final String privateFrom, |
|
||||||
final String[] privateFor, |
|
||||||
final int expectedTransactionCount) { |
|
||||||
return new PrivGetEeaTransactionCountSuccess( |
|
||||||
transactions.getEeaTransactionCount(accountAddress, privateFrom, privateFor), |
|
||||||
expectedTransactionCount); |
|
||||||
} |
|
||||||
|
|
||||||
public Condition getSuccessfulTransactionReceipt(final Hash transactionHash) { |
|
||||||
return new PrivGetExpectedSuccessfulTransactionReceipt( |
|
||||||
transactions.getTransactionReceipt(transactionHash)); |
|
||||||
} |
|
||||||
|
|
||||||
public Condition getFailedTransactionReceipt(final Hash transactionHash) { |
|
||||||
return new PrivGetExpectedFailedTransactionReceipt( |
|
||||||
transactions.getTransactionReceipt(transactionHash)); |
|
||||||
} |
|
||||||
|
|
||||||
public Condition getInvalidTransactionReceipt(final Hash transactionHash) { |
|
||||||
return new PrivGetExpectedInvalidTransactionReceipt( |
|
||||||
transactions.getTransactionReceipt(transactionHash)); |
|
||||||
} |
|
||||||
|
|
||||||
public Condition multiTenancyValidationFail( |
|
||||||
final Transaction<?> transaction, final RpcErrorType error) { |
|
||||||
return new ExpectJsonRpcError(transaction, error); |
|
||||||
} |
|
||||||
|
|
||||||
public PrivateCondition syncingStatus(final boolean isSyncing) { |
|
||||||
return new PrivateSyncingStatusCondition(transactions.syncing(), isSyncing); |
|
||||||
} |
|
||||||
} |
|
@ -1,39 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.condition.priv; |
|
||||||
|
|
||||||
import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.condition.Condition; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.node.Node; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.PrivCreatePrivacyGroupTransaction; |
|
||||||
|
|
||||||
public class PrivCreatePrivacyGroupSuccess implements Condition { |
|
||||||
|
|
||||||
private final PrivCreatePrivacyGroupTransaction transaction; |
|
||||||
private final String groupId; |
|
||||||
|
|
||||||
public PrivCreatePrivacyGroupSuccess( |
|
||||||
final PrivCreatePrivacyGroupTransaction transaction, final String groupId) { |
|
||||||
this.transaction = transaction; |
|
||||||
this.groupId = groupId; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void verify(final Node node) { |
|
||||||
final String result = node.execute(transaction); |
|
||||||
assertThat(result).isEqualTo(groupId); |
|
||||||
} |
|
||||||
} |
|
@ -1,39 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.condition.priv; |
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.condition.Condition; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.node.Node; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.PrivDeletePrivacyGroupTransaction; |
|
||||||
|
|
||||||
public class PrivDeletePrivacyGroupSuccess implements Condition { |
|
||||||
|
|
||||||
private final PrivDeletePrivacyGroupTransaction transaction; |
|
||||||
private final String groupId; |
|
||||||
|
|
||||||
public PrivDeletePrivacyGroupSuccess( |
|
||||||
final PrivDeletePrivacyGroupTransaction transaction, final String groupId) { |
|
||||||
this.transaction = transaction; |
|
||||||
this.groupId = groupId; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void verify(final Node node) { |
|
||||||
final String result = node.execute(transaction); |
|
||||||
assertThat(result).isEqualTo(groupId); |
|
||||||
} |
|
||||||
} |
|
@ -1,42 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.condition.priv; |
|
||||||
|
|
||||||
import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.condition.Condition; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.node.Node; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.PrivDistributeRawTransactionTransaction; |
|
||||||
|
|
||||||
public class PrivDistributeRawTransactionSuccess implements Condition { |
|
||||||
|
|
||||||
private final PrivDistributeRawTransactionTransaction sendRawTransactionTransaction; |
|
||||||
private final String enclaveResponseKey; |
|
||||||
|
|
||||||
public PrivDistributeRawTransactionSuccess( |
|
||||||
final PrivDistributeRawTransactionTransaction sendRawTransactionTransaction, |
|
||||||
final String enclaveResponseKey) { |
|
||||||
this.sendRawTransactionTransaction = sendRawTransactionTransaction; |
|
||||||
this.enclaveResponseKey = enclaveResponseKey; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void verify(final Node node) { |
|
||||||
final String result = node.execute(sendRawTransactionTransaction); |
|
||||||
assertThat(result).isNotNull(); |
|
||||||
assertThat(result).isInstanceOf(String.class); |
|
||||||
assertThat(result).isEqualTo(enclaveResponseKey); |
|
||||||
} |
|
||||||
} |
|
@ -1,40 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.condition.priv; |
|
||||||
|
|
||||||
import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; |
|
||||||
|
|
||||||
import org.hyperledger.besu.enclave.types.PrivacyGroup; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.condition.Condition; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.node.Node; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.PrivFindPrivacyGroupTransaction; |
|
||||||
|
|
||||||
public class PrivFindPrivacyGroupSuccess implements Condition { |
|
||||||
|
|
||||||
private final PrivFindPrivacyGroupTransaction transaction; |
|
||||||
private final int numGroups; |
|
||||||
|
|
||||||
public PrivFindPrivacyGroupSuccess( |
|
||||||
final PrivFindPrivacyGroupTransaction transaction, final int numGroups) { |
|
||||||
this.transaction = transaction; |
|
||||||
this.numGroups = numGroups; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void verify(final Node node) { |
|
||||||
final PrivacyGroup[] privacyGroups = node.execute(transaction); |
|
||||||
assertThat(privacyGroups).hasSize(numGroups); |
|
||||||
} |
|
||||||
} |
|
@ -1,42 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.condition.priv; |
|
||||||
|
|
||||||
import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.condition.Condition; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.node.Node; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.PrivGetEeaTransactionCountTransaction; |
|
||||||
|
|
||||||
public class PrivGetEeaTransactionCountSuccess implements Condition { |
|
||||||
|
|
||||||
private final PrivGetEeaTransactionCountTransaction privGetEeaTransactionCountTransaction; |
|
||||||
private final int expectedTransactionCount; |
|
||||||
|
|
||||||
public PrivGetEeaTransactionCountSuccess( |
|
||||||
final PrivGetEeaTransactionCountTransaction privGetEeaTransactionCountTransaction, |
|
||||||
final int expectedTransactionCount) { |
|
||||||
this.privGetEeaTransactionCountTransaction = privGetEeaTransactionCountTransaction; |
|
||||||
this.expectedTransactionCount = expectedTransactionCount; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void verify(final Node node) { |
|
||||||
final int result = node.execute(privGetEeaTransactionCountTransaction); |
|
||||||
assertThat(result).isNotNull(); |
|
||||||
assertThat(result).isInstanceOf(Integer.class); |
|
||||||
assertThat(result).isEqualTo(expectedTransactionCount); |
|
||||||
} |
|
||||||
} |
|
@ -1,38 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.condition.priv; |
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.WaitUtils; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.condition.Condition; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.node.Node; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.PrivGetTransactionReceiptTransaction; |
|
||||||
|
|
||||||
public class PrivGetExpectedFailedTransactionReceipt implements Condition { |
|
||||||
|
|
||||||
private final PrivGetTransactionReceiptTransaction getTransactionReceiptTransaction; |
|
||||||
|
|
||||||
public PrivGetExpectedFailedTransactionReceipt( |
|
||||||
final PrivGetTransactionReceiptTransaction getTransactionReceiptTransaction) { |
|
||||||
this.getTransactionReceiptTransaction = getTransactionReceiptTransaction; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void verify(final Node node) { |
|
||||||
WaitUtils.waitFor(() -> assertThat(node.execute(getTransactionReceiptTransaction)).isNotNull()); |
|
||||||
assertThat(node.execute(getTransactionReceiptTransaction).getStatus()).isEqualTo("0x0"); |
|
||||||
} |
|
||||||
} |
|
@ -1,38 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.condition.priv; |
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.WaitUtils; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.condition.Condition; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.node.Node; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.PrivGetTransactionReceiptTransaction; |
|
||||||
|
|
||||||
public class PrivGetExpectedInvalidTransactionReceipt implements Condition { |
|
||||||
|
|
||||||
private final PrivGetTransactionReceiptTransaction getTransactionReceiptTransaction; |
|
||||||
|
|
||||||
public PrivGetExpectedInvalidTransactionReceipt( |
|
||||||
final PrivGetTransactionReceiptTransaction getTransactionReceiptTransaction) { |
|
||||||
this.getTransactionReceiptTransaction = getTransactionReceiptTransaction; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void verify(final Node node) { |
|
||||||
WaitUtils.waitFor(() -> assertThat(node.execute(getTransactionReceiptTransaction)).isNotNull()); |
|
||||||
assertThat(node.execute(getTransactionReceiptTransaction).getStatus()).isEqualTo("0x2"); |
|
||||||
} |
|
||||||
} |
|
@ -1,38 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.condition.priv; |
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.WaitUtils; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.condition.Condition; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.node.Node; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.PrivGetTransactionReceiptTransaction; |
|
||||||
|
|
||||||
public class PrivGetExpectedSuccessfulTransactionReceipt implements Condition { |
|
||||||
|
|
||||||
private final PrivGetTransactionReceiptTransaction getTransactionReceiptTransaction; |
|
||||||
|
|
||||||
public PrivGetExpectedSuccessfulTransactionReceipt( |
|
||||||
final PrivGetTransactionReceiptTransaction getTransactionReceiptTransaction) { |
|
||||||
this.getTransactionReceiptTransaction = getTransactionReceiptTransaction; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void verify(final Node node) { |
|
||||||
WaitUtils.waitFor(() -> assertThat(node.execute(getTransactionReceiptTransaction)).isNotNull()); |
|
||||||
assertThat(node.execute(getTransactionReceiptTransaction).getStatus()).isEqualTo("0x1"); |
|
||||||
} |
|
||||||
} |
|
@ -1,42 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.condition.priv; |
|
||||||
|
|
||||||
import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; |
|
||||||
|
|
||||||
import org.hyperledger.besu.datatypes.Address; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.condition.Condition; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.node.Node; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.PrivGetPrivacyPrecompileAddressTransaction; |
|
||||||
|
|
||||||
public class PrivGetPrivacyPrecompileAddressSuccess implements Condition { |
|
||||||
|
|
||||||
private final PrivGetPrivacyPrecompileAddressTransaction transaction; |
|
||||||
private final Address precompileAddress; |
|
||||||
|
|
||||||
public PrivGetPrivacyPrecompileAddressSuccess( |
|
||||||
final PrivGetPrivacyPrecompileAddressTransaction transaction, |
|
||||||
final Address precompileAddress) { |
|
||||||
this.transaction = transaction; |
|
||||||
this.precompileAddress = precompileAddress; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void verify(final Node node) { |
|
||||||
final Address result = node.execute(transaction); |
|
||||||
assertThat(result).isInstanceOf(Address.class); |
|
||||||
assertThat(result).isEqualTo(precompileAddress); |
|
||||||
} |
|
||||||
} |
|
@ -1,38 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.condition.priv; |
|
||||||
|
|
||||||
import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.condition.Condition; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.node.Node; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.privacy.PrivateTransactionGroupResponse; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.PrivGetPrivateTransactionTransaction; |
|
||||||
|
|
||||||
public class PrivGetPrivateTransactionReturnsNull implements Condition { |
|
||||||
|
|
||||||
private final PrivGetPrivateTransactionTransaction transaction; |
|
||||||
|
|
||||||
public PrivGetPrivateTransactionReturnsNull( |
|
||||||
final PrivGetPrivateTransactionTransaction transaction) { |
|
||||||
this.transaction = transaction; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void verify(final Node node) { |
|
||||||
final PrivateTransactionGroupResponse result = node.execute(transaction); |
|
||||||
assertThat(result).isNull(); |
|
||||||
} |
|
||||||
} |
|
@ -1,43 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.condition.priv; |
|
||||||
|
|
||||||
import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; |
|
||||||
|
|
||||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.privacy.PrivateTransactionGroupResult; |
|
||||||
import org.hyperledger.besu.ethereum.privacy.PrivateTransaction; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.condition.Condition; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.node.Node; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.privacy.PrivateTransactionGroupResponse; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.PrivGetPrivateTransactionTransaction; |
|
||||||
|
|
||||||
public class PrivGetPrivateTransactionSuccess implements Condition { |
|
||||||
|
|
||||||
private final PrivGetPrivateTransactionTransaction transaction; |
|
||||||
private final PrivateTransactionGroupResult privateTransaction; |
|
||||||
|
|
||||||
public PrivGetPrivateTransactionSuccess( |
|
||||||
final PrivGetPrivateTransactionTransaction transaction, |
|
||||||
final PrivateTransaction privateTransaction) { |
|
||||||
this.transaction = transaction; |
|
||||||
this.privateTransaction = new PrivateTransactionGroupResult(privateTransaction); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void verify(final Node node) { |
|
||||||
final PrivateTransactionGroupResponse result = node.execute(transaction); |
|
||||||
assertThat(result).usingRecursiveComparison().isEqualTo(privateTransaction); |
|
||||||
} |
|
||||||
} |
|
@ -1,42 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.condition.priv; |
|
||||||
|
|
||||||
import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.condition.Condition; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.node.Node; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.PrivGetTransactionCountTransaction; |
|
||||||
|
|
||||||
public class PrivGetTransactionCountSuccess implements Condition { |
|
||||||
|
|
||||||
private final PrivGetTransactionCountTransaction privGetTransactionCountTransaction; |
|
||||||
private final int expectedTransactionCount; |
|
||||||
|
|
||||||
public PrivGetTransactionCountSuccess( |
|
||||||
final PrivGetTransactionCountTransaction privGetTransactionCountTransaction, |
|
||||||
final int expectedTransactionCount) { |
|
||||||
this.privGetTransactionCountTransaction = privGetTransactionCountTransaction; |
|
||||||
this.expectedTransactionCount = expectedTransactionCount; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void verify(final Node node) { |
|
||||||
final Integer result = node.execute(privGetTransactionCountTransaction); |
|
||||||
assertThat(result).isNotNull(); |
|
||||||
assertThat(result).isInstanceOf(Integer.class); |
|
||||||
assertThat(result).isEqualTo(expectedTransactionCount); |
|
||||||
} |
|
||||||
} |
|
@ -1,40 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright contributors to Hyperledger Besu. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.condition.priv; |
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.WaitUtils; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.privacy.PrivacyNode; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.privacy.condition.PrivateCondition; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.PrivSyncingTransactions; |
|
||||||
|
|
||||||
public class PrivateSyncingStatusCondition implements PrivateCondition { |
|
||||||
|
|
||||||
private final PrivSyncingTransactions transaction; |
|
||||||
private final boolean syncingMiningStatus; |
|
||||||
|
|
||||||
public PrivateSyncingStatusCondition( |
|
||||||
final PrivSyncingTransactions transaction, final boolean syncingStatus) { |
|
||||||
this.transaction = transaction; |
|
||||||
this.syncingMiningStatus = syncingStatus; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void verify(final PrivacyNode node) { |
|
||||||
WaitUtils.waitFor( |
|
||||||
10, () -> assertThat(node.execute(transaction)).isEqualTo(syncingMiningStatus)); |
|
||||||
} |
|
||||||
} |
|
@ -1,65 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.node.configuration.privacy; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.node.configuration.BesuNodeConfiguration; |
|
||||||
import org.hyperledger.enclave.testutil.EnclaveKeyConfiguration; |
|
||||||
|
|
||||||
public class PrivacyNodeConfiguration { |
|
||||||
|
|
||||||
private final boolean isFlexiblePrivacyGroupEnabled; |
|
||||||
private final boolean isMultitenancyEnabled; |
|
||||||
private final boolean isPrivacyPluginEnabled; |
|
||||||
private final BesuNodeConfiguration besuConfig; |
|
||||||
private final EnclaveKeyConfiguration keyConfig; |
|
||||||
|
|
||||||
PrivacyNodeConfiguration( |
|
||||||
final BesuNodeConfiguration besuConfig, final EnclaveKeyConfiguration keyConfig) { |
|
||||||
this(false, false, false, besuConfig, keyConfig); |
|
||||||
} |
|
||||||
|
|
||||||
public PrivacyNodeConfiguration( |
|
||||||
final boolean isFlexiblePrivacyGroupEnabled, |
|
||||||
final boolean isMultitenancyEnabled, |
|
||||||
final boolean isPrivacyPluginEnabled, |
|
||||||
final BesuNodeConfiguration besuConfig, |
|
||||||
final EnclaveKeyConfiguration keyConfig) { |
|
||||||
this.isFlexiblePrivacyGroupEnabled = isFlexiblePrivacyGroupEnabled; |
|
||||||
this.besuConfig = besuConfig; |
|
||||||
this.keyConfig = keyConfig; |
|
||||||
this.isMultitenancyEnabled = isMultitenancyEnabled; |
|
||||||
this.isPrivacyPluginEnabled = isPrivacyPluginEnabled; |
|
||||||
} |
|
||||||
|
|
||||||
public boolean isFlexiblePrivacyGroupEnabled() { |
|
||||||
return isFlexiblePrivacyGroupEnabled; |
|
||||||
} |
|
||||||
|
|
||||||
public boolean isMultitenancyEnabled() { |
|
||||||
return isMultitenancyEnabled; |
|
||||||
} |
|
||||||
|
|
||||||
public boolean isPrivacyPluginEnabled() { |
|
||||||
return isPrivacyPluginEnabled; |
|
||||||
} |
|
||||||
|
|
||||||
public BesuNodeConfiguration getBesuConfig() { |
|
||||||
return besuConfig; |
|
||||||
} |
|
||||||
|
|
||||||
public EnclaveKeyConfiguration getKeyConfig() { |
|
||||||
return keyConfig; |
|
||||||
} |
|
||||||
} |
|
@ -1,294 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.node.configuration.privacy; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.node.configuration.BesuNodeConfigurationBuilder; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.node.configuration.NodeConfigurationFactory; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.node.configuration.genesis.GenesisConfigurationFactory; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.privacy.PrivacyNode; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.privacy.account.PrivacyAccount; |
|
||||||
import org.hyperledger.enclave.testutil.EnclaveEncryptorType; |
|
||||||
import org.hyperledger.enclave.testutil.EnclaveKeyConfiguration; |
|
||||||
import org.hyperledger.enclave.testutil.EnclaveType; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
import java.net.URISyntaxException; |
|
||||||
import java.util.Collections; |
|
||||||
import java.util.List; |
|
||||||
import java.util.Optional; |
|
||||||
|
|
||||||
import io.vertx.core.Vertx; |
|
||||||
import org.testcontainers.containers.Network; |
|
||||||
|
|
||||||
public class PrivacyNodeFactory { |
|
||||||
|
|
||||||
private final NodeConfigurationFactory node = new NodeConfigurationFactory(); |
|
||||||
private final Vertx vertx; |
|
||||||
|
|
||||||
public PrivacyNodeFactory(final Vertx vertx) { |
|
||||||
this.vertx = vertx; |
|
||||||
} |
|
||||||
|
|
||||||
public PrivacyNode create( |
|
||||||
final PrivacyNodeConfiguration privacyNodeConfig, |
|
||||||
final EnclaveType enclaveType, |
|
||||||
final Optional<Network> containerNetwork) |
|
||||||
throws IOException { |
|
||||||
return new PrivacyNode(privacyNodeConfig, vertx, enclaveType, containerNetwork); |
|
||||||
} |
|
||||||
|
|
||||||
public PrivacyNode createPrivateTransactionEnabledMinerNode( |
|
||||||
final String name, |
|
||||||
final PrivacyAccount privacyAccount, |
|
||||||
final EnclaveType enclaveType, |
|
||||||
final Optional<Network> containerNetwork, |
|
||||||
final boolean isFlexiblePrivacyGroupEnabled, |
|
||||||
final boolean isMultitenancyEnabled, |
|
||||||
final boolean isPrivacyPluginEnabled) |
|
||||||
throws IOException { |
|
||||||
return create( |
|
||||||
new PrivacyNodeConfiguration( |
|
||||||
isFlexiblePrivacyGroupEnabled, |
|
||||||
isMultitenancyEnabled, |
|
||||||
isPrivacyPluginEnabled, |
|
||||||
new BesuNodeConfigurationBuilder() |
|
||||||
.name(name) |
|
||||||
.miningEnabled() |
|
||||||
.jsonRpcEnabled() |
|
||||||
.webSocketEnabled() |
|
||||||
.enablePrivateTransactions() |
|
||||||
.keyFilePath(privacyAccount.getPrivateKeyPath()) |
|
||||||
.plugins(Collections.singletonList("testPlugins")) |
|
||||||
.extraCLIOptions(List.of("--plugin-privacy-service-encryption-prefix=0xAA")) |
|
||||||
.build(), |
|
||||||
new EnclaveKeyConfiguration( |
|
||||||
privacyAccount.getEnclaveKeyPaths(), |
|
||||||
privacyAccount.getEnclavePrivateKeyPaths(), |
|
||||||
privacyAccount.getEnclaveEncryptorType())), |
|
||||||
enclaveType, |
|
||||||
containerNetwork); |
|
||||||
} |
|
||||||
|
|
||||||
public PrivacyNode createPrivateTransactionEnabledNode( |
|
||||||
final String name, |
|
||||||
final PrivacyAccount privacyAccount, |
|
||||||
final EnclaveType enclaveType, |
|
||||||
final Optional<Network> containerNetwork, |
|
||||||
final boolean isFlexiblePrivacyGroupEnabled, |
|
||||||
final boolean isMultitenancyEnabled, |
|
||||||
final boolean isPrivacyPluginEnabled) |
|
||||||
throws IOException { |
|
||||||
return create( |
|
||||||
new PrivacyNodeConfiguration( |
|
||||||
isFlexiblePrivacyGroupEnabled, |
|
||||||
isMultitenancyEnabled, |
|
||||||
isPrivacyPluginEnabled, |
|
||||||
new BesuNodeConfigurationBuilder() |
|
||||||
.name(name) |
|
||||||
.jsonRpcEnabled() |
|
||||||
.keyFilePath(privacyAccount.getPrivateKeyPath()) |
|
||||||
.enablePrivateTransactions() |
|
||||||
.webSocketEnabled() |
|
||||||
.plugins(Collections.singletonList("testPlugins")) |
|
||||||
.extraCLIOptions(List.of("--plugin-privacy-service-encryption-prefix=0xBB")) |
|
||||||
.build(), |
|
||||||
new EnclaveKeyConfiguration( |
|
||||||
privacyAccount.getEnclaveKeyPaths(), |
|
||||||
privacyAccount.getEnclavePrivateKeyPaths(), |
|
||||||
privacyAccount.getEnclaveEncryptorType())), |
|
||||||
enclaveType, |
|
||||||
containerNetwork); |
|
||||||
} |
|
||||||
|
|
||||||
public PrivacyNode createIbft2NodePrivacyEnabled( |
|
||||||
final String name, |
|
||||||
final PrivacyAccount privacyAccount, |
|
||||||
final boolean minerEnabled, |
|
||||||
final EnclaveType enclaveType, |
|
||||||
final Optional<Network> containerNetwork, |
|
||||||
final boolean isFlexiblePrivacyGroupEnabled, |
|
||||||
final boolean isMultitenancyEnabled, |
|
||||||
final boolean isPrivacyPluginEnabled, |
|
||||||
final String unrestrictedPrefix) |
|
||||||
throws IOException { |
|
||||||
return create( |
|
||||||
new PrivacyNodeConfiguration( |
|
||||||
isFlexiblePrivacyGroupEnabled, |
|
||||||
isMultitenancyEnabled, |
|
||||||
isPrivacyPluginEnabled, |
|
||||||
new BesuNodeConfigurationBuilder() |
|
||||||
.name(name) |
|
||||||
.miningEnabled() |
|
||||||
.jsonRpcConfiguration(node.createJsonRpcWithIbft2EnabledConfig(minerEnabled)) |
|
||||||
.webSocketConfiguration(node.createWebSocketEnabledConfig()) |
|
||||||
.devMode(false) |
|
||||||
.genesisConfigProvider(GenesisConfigurationFactory::createPrivacyIbft2GenesisConfig) |
|
||||||
.keyFilePath(privacyAccount.getPrivateKeyPath()) |
|
||||||
.enablePrivateTransactions() |
|
||||||
.plugins(Collections.singletonList("testPlugins")) |
|
||||||
.extraCLIOptions( |
|
||||||
List.of("--plugin-privacy-service-encryption-prefix=" + unrestrictedPrefix)) |
|
||||||
.build(), |
|
||||||
new EnclaveKeyConfiguration( |
|
||||||
privacyAccount.getEnclaveKeyPaths(), |
|
||||||
privacyAccount.getEnclavePrivateKeyPaths(), |
|
||||||
privacyAccount.getEnclaveEncryptorType())), |
|
||||||
enclaveType, |
|
||||||
containerNetwork); |
|
||||||
} |
|
||||||
|
|
||||||
public PrivacyNode createIbft2NodePrivacyEnabledWithGenesis( |
|
||||||
final String name, |
|
||||||
final PrivacyAccount privacyAccount, |
|
||||||
final boolean minerEnabled, |
|
||||||
final EnclaveType enclaveType, |
|
||||||
final Optional<Network> containerNetwork, |
|
||||||
final boolean isFlexiblePrivacyGroupEnabled, |
|
||||||
final boolean isMultitenancyEnabled, |
|
||||||
final boolean isPrivacyPluginEnabled, |
|
||||||
final String unrestrictedPrefix) |
|
||||||
throws IOException { |
|
||||||
return create( |
|
||||||
new PrivacyNodeConfiguration( |
|
||||||
isFlexiblePrivacyGroupEnabled, |
|
||||||
isMultitenancyEnabled, |
|
||||||
isPrivacyPluginEnabled, |
|
||||||
new BesuNodeConfigurationBuilder() |
|
||||||
.name(name) |
|
||||||
.miningEnabled() |
|
||||||
.jsonRpcConfiguration(node.createJsonRpcWithIbft2EnabledConfig(minerEnabled)) |
|
||||||
.webSocketConfiguration(node.createWebSocketEnabledConfig()) |
|
||||||
.devMode(false) |
|
||||||
.genesisConfigProvider(GenesisConfigurationFactory::createPrivacyIbft2GenesisConfig) |
|
||||||
.keyFilePath(privacyAccount.getPrivateKeyPath()) |
|
||||||
.enablePrivateTransactions() |
|
||||||
.plugins(Collections.singletonList("testPlugins")) |
|
||||||
.extraCLIOptions( |
|
||||||
List.of( |
|
||||||
"--plugin-privacy-service-encryption-prefix=" + unrestrictedPrefix, |
|
||||||
"--plugin-privacy-service-genesis-enabled=true")) |
|
||||||
.build(), |
|
||||||
new EnclaveKeyConfiguration( |
|
||||||
privacyAccount.getEnclaveKeyPaths(), |
|
||||||
privacyAccount.getEnclavePrivateKeyPaths(), |
|
||||||
privacyAccount.getEnclaveEncryptorType())), |
|
||||||
enclaveType, |
|
||||||
containerNetwork); |
|
||||||
} |
|
||||||
|
|
||||||
public PrivacyNode createQbftNodePrivacyEnabled( |
|
||||||
final String name, |
|
||||||
final PrivacyAccount privacyAccount, |
|
||||||
final EnclaveType enclaveType, |
|
||||||
final Optional<Network> containerNetwork, |
|
||||||
final boolean isFlexiblePrivacyGroupEnabled, |
|
||||||
final boolean isMultitenancyEnabled, |
|
||||||
final boolean isPrivacyPluginEnabled, |
|
||||||
final String unrestrictedPrefix) |
|
||||||
throws IOException { |
|
||||||
return create( |
|
||||||
new PrivacyNodeConfiguration( |
|
||||||
isFlexiblePrivacyGroupEnabled, |
|
||||||
isMultitenancyEnabled, |
|
||||||
isPrivacyPluginEnabled, |
|
||||||
new BesuNodeConfigurationBuilder() |
|
||||||
.name(name) |
|
||||||
.miningEnabled() |
|
||||||
.jsonRpcConfiguration(node.createJsonRpcWithQbftEnabledConfig(false)) |
|
||||||
.webSocketConfiguration(node.createWebSocketEnabledConfig()) |
|
||||||
.devMode(false) |
|
||||||
.genesisConfigProvider(GenesisConfigurationFactory::createQbftGenesisConfig) |
|
||||||
.keyFilePath(privacyAccount.getPrivateKeyPath()) |
|
||||||
.enablePrivateTransactions() |
|
||||||
.plugins(Collections.singletonList("testPlugins")) |
|
||||||
.extraCLIOptions( |
|
||||||
List.of("--plugin-privacy-service-encryption-prefix=" + unrestrictedPrefix)) |
|
||||||
.build(), |
|
||||||
new EnclaveKeyConfiguration( |
|
||||||
privacyAccount.getEnclaveKeyPaths(), |
|
||||||
privacyAccount.getEnclavePrivateKeyPaths(), |
|
||||||
privacyAccount.getEnclaveEncryptorType())), |
|
||||||
enclaveType, |
|
||||||
containerNetwork); |
|
||||||
} |
|
||||||
|
|
||||||
public PrivacyNode createFlexiblePrivacyGroupEnabledMinerNode( |
|
||||||
final String name, |
|
||||||
final PrivacyAccount privacyAccount, |
|
||||||
final boolean multiTenancyEnabled, |
|
||||||
final EnclaveType enclaveType, |
|
||||||
final Optional<Network> containerNetwork) |
|
||||||
throws IOException, URISyntaxException { |
|
||||||
final BesuNodeConfigurationBuilder besuNodeConfigurationBuilder = |
|
||||||
new BesuNodeConfigurationBuilder(); |
|
||||||
if (multiTenancyEnabled) { |
|
||||||
final String authPrivTomlPath = |
|
||||||
EnclaveEncryptorType.EC.equals(privacyAccount.getEnclaveEncryptorType()) |
|
||||||
? "authentication/auth_priv_ec_pubkey.toml" |
|
||||||
: "authentication/auth_priv.toml"; |
|
||||||
besuNodeConfigurationBuilder.jsonRpcAuthenticationConfiguration(authPrivTomlPath); |
|
||||||
} |
|
||||||
return create( |
|
||||||
new PrivacyNodeConfiguration( |
|
||||||
true, |
|
||||||
multiTenancyEnabled, |
|
||||||
false, |
|
||||||
besuNodeConfigurationBuilder |
|
||||||
.name(name) |
|
||||||
.miningEnabled() |
|
||||||
.jsonRpcEnabled() |
|
||||||
.webSocketEnabled() |
|
||||||
.enablePrivateTransactions() |
|
||||||
.plugins(Collections.singletonList("testPlugins")) |
|
||||||
.extraCLIOptions(List.of("--plugin-privacy-service-genesis-enabled=true")) |
|
||||||
.keyFilePath(privacyAccount.getPrivateKeyPath()) |
|
||||||
.build(), |
|
||||||
new EnclaveKeyConfiguration( |
|
||||||
privacyAccount.getEnclaveKeyPaths(), |
|
||||||
privacyAccount.getEnclavePrivateKeyPaths(), |
|
||||||
privacyAccount.getEnclaveEncryptorType())), |
|
||||||
enclaveType, |
|
||||||
containerNetwork); |
|
||||||
} |
|
||||||
|
|
||||||
public PrivacyNode createFlexiblePrivacyGroupEnabledNode( |
|
||||||
final String name, |
|
||||||
final PrivacyAccount privacyAccount, |
|
||||||
final boolean multiTenancyEnabled, |
|
||||||
final EnclaveType enclaveType, |
|
||||||
final Optional<Network> containerNetwork) |
|
||||||
throws IOException { |
|
||||||
return create( |
|
||||||
new PrivacyNodeConfiguration( |
|
||||||
true, |
|
||||||
multiTenancyEnabled, |
|
||||||
false, |
|
||||||
new BesuNodeConfigurationBuilder() |
|
||||||
.name(name) |
|
||||||
.jsonRpcEnabled() |
|
||||||
.keyFilePath(privacyAccount.getPrivateKeyPath()) |
|
||||||
.enablePrivateTransactions() |
|
||||||
.plugins(Collections.singletonList("testPlugins")) |
|
||||||
.extraCLIOptions(List.of("--plugin-privacy-service-genesis-enabled=true")) |
|
||||||
.webSocketEnabled() |
|
||||||
.build(), |
|
||||||
new EnclaveKeyConfiguration( |
|
||||||
privacyAccount.getEnclaveKeyPaths(), |
|
||||||
privacyAccount.getEnclavePrivateKeyPaths(), |
|
||||||
privacyAccount.getEnclaveEncryptorType())), |
|
||||||
enclaveType, |
|
||||||
containerNetwork); |
|
||||||
} |
|
||||||
} |
|
@ -1,184 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.privacy; |
|
||||||
|
|
||||||
import static java.util.Collections.emptyList; |
|
||||||
import static java.util.function.Predicate.not; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.condition.net.NetConditions; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.node.BesuNodeRunner; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.node.RunnableNode; |
|
||||||
import org.hyperledger.enclave.testutil.EnclaveType; |
|
||||||
import org.hyperledger.enclave.testutil.TesseraTestHarness; |
|
||||||
|
|
||||||
import java.net.URI; |
|
||||||
import java.util.Arrays; |
|
||||||
import java.util.Collections; |
|
||||||
import java.util.List; |
|
||||||
import java.util.Optional; |
|
||||||
import java.util.stream.Collectors; |
|
||||||
|
|
||||||
import org.slf4j.Logger; |
|
||||||
import org.slf4j.LoggerFactory; |
|
||||||
|
|
||||||
public class PrivacyCluster { |
|
||||||
private static final Logger LOG = LoggerFactory.getLogger(PrivacyCluster.class); |
|
||||||
private final NetConditions net; |
|
||||||
private final BesuNodeRunner besuNodeRunner; |
|
||||||
|
|
||||||
private List<PrivacyNode> nodes = emptyList(); |
|
||||||
private List<RunnableNode> runnableNodes = emptyList(); |
|
||||||
private PrivacyNode bootNode; |
|
||||||
|
|
||||||
public PrivacyCluster(final NetConditions net) { |
|
||||||
this.net = net; |
|
||||||
this.besuNodeRunner = BesuNodeRunner.instance(); |
|
||||||
} |
|
||||||
|
|
||||||
public void start(final PrivacyNode... nodes) { |
|
||||||
start(Arrays.asList(nodes)); |
|
||||||
} |
|
||||||
|
|
||||||
public void start(final List<PrivacyNode> nodes) { |
|
||||||
startNodes(nodes); |
|
||||||
awaitPeerCount(nodes); |
|
||||||
} |
|
||||||
|
|
||||||
public void startNodes(final PrivacyNode... nodes) { |
|
||||||
startNodes(Arrays.asList(nodes)); |
|
||||||
} |
|
||||||
|
|
||||||
public void startNodes(final List<PrivacyNode> nodes) { |
|
||||||
if (nodes.isEmpty()) { |
|
||||||
throw new IllegalArgumentException("Can't start a cluster with no nodes"); |
|
||||||
} |
|
||||||
this.nodes = nodes; |
|
||||||
this.runnableNodes = nodes.stream().map(PrivacyNode::getBesu).collect(Collectors.toList()); |
|
||||||
|
|
||||||
final Optional<PrivacyNode> bootNode = selectAndStartBootnode(nodes); |
|
||||||
|
|
||||||
nodes.parallelStream() |
|
||||||
.filter(node -> bootNode.map(boot -> boot != node).orElse(true)) |
|
||||||
.forEach(this::startNode); |
|
||||||
} |
|
||||||
|
|
||||||
public void awaitPeerCount(final PrivacyNode... nodes) { |
|
||||||
awaitPeerCount(Arrays.asList(nodes)); |
|
||||||
} |
|
||||||
|
|
||||||
public void awaitPeerCount(final List<PrivacyNode> nodes) { |
|
||||||
for (final PrivacyNode node : nodes) { |
|
||||||
LOG.info("Awaiting peer discovery for node {}", node.getName()); |
|
||||||
node.awaitPeerDiscovery(net.awaitPeerCount(nodes.size() - 1)); |
|
||||||
} |
|
||||||
|
|
||||||
verifyAllEnclaveNetworkConnections(); |
|
||||||
} |
|
||||||
|
|
||||||
public List<PrivacyNode> getNodes() { |
|
||||||
return nodes; |
|
||||||
} |
|
||||||
|
|
||||||
/** Verify that each Enclave has connected to every other Enclave */ |
|
||||||
public void verifyAllEnclaveNetworkConnections() { |
|
||||||
nodes.forEach( |
|
||||||
privacyNode -> { |
|
||||||
final List<PrivacyNode> otherNodes = |
|
||||||
nodes.stream() |
|
||||||
.filter(not(privacyNode::equals)) |
|
||||||
.collect(Collectors.toUnmodifiableList()); |
|
||||||
privacyNode.testEnclaveConnection(otherNodes); |
|
||||||
}); |
|
||||||
} |
|
||||||
|
|
||||||
public void stop() { |
|
||||||
for (final PrivacyNode node : nodes) { |
|
||||||
besuNodeRunner.stopNode(node.getBesu()); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
public void stopNode(final PrivacyNode node) { |
|
||||||
node.getEnclave().stop(); |
|
||||||
besuNodeRunner.stopNode(node.getBesu()); |
|
||||||
} |
|
||||||
|
|
||||||
public void close() { |
|
||||||
stop(); |
|
||||||
for (final PrivacyNode node : nodes) { |
|
||||||
node.close(); |
|
||||||
} |
|
||||||
besuNodeRunner.shutdown(); |
|
||||||
} |
|
||||||
|
|
||||||
private Optional<PrivacyNode> selectAndStartBootnode(final List<PrivacyNode> nodes) { |
|
||||||
final Optional<PrivacyNode> bootNode = |
|
||||||
nodes.stream() |
|
||||||
.filter(node -> node.getConfiguration().isBootnodeEligible()) |
|
||||||
.filter(node -> node.getConfiguration().isP2pEnabled()) |
|
||||||
.filter(node -> node.getConfiguration().isDiscoveryEnabled()) |
|
||||||
.findFirst(); |
|
||||||
|
|
||||||
bootNode.ifPresent( |
|
||||||
b -> { |
|
||||||
LOG.info("Selected node {} as bootnode", b.getName()); |
|
||||||
startNode(b, true); |
|
||||||
this.bootNode = b; |
|
||||||
}); |
|
||||||
|
|
||||||
return bootNode; |
|
||||||
} |
|
||||||
|
|
||||||
private void startNode(final PrivacyNode node) { |
|
||||||
startNode(node, false); |
|
||||||
} |
|
||||||
|
|
||||||
private void startNode(final PrivacyNode node, final boolean isBootNode) { |
|
||||||
node.getConfiguration() |
|
||||||
.setBootnodes(isBootNode ? emptyList() : Collections.singletonList(bootNode.enodeUrl())); |
|
||||||
|
|
||||||
node.getConfiguration() |
|
||||||
.getGenesisConfigProvider() |
|
||||||
.create(runnableNodes) |
|
||||||
.ifPresent(node.getConfiguration()::setGenesisConfig); |
|
||||||
|
|
||||||
if (!isBootNode) { |
|
||||||
if (bootNode.getEnclave().getEnclaveType() == EnclaveType.TESSERA) { |
|
||||||
final URI otherNode = bootNode.getEnclave().nodeUrl(); |
|
||||||
try { |
|
||||||
// Substitute IP with hostname for test container network
|
|
||||||
final URI otherNodeHostname = |
|
||||||
new URI( |
|
||||||
otherNode.getScheme() |
|
||||||
+ "://" |
|
||||||
+ bootNode.getName() |
|
||||||
+ ":" |
|
||||||
+ TesseraTestHarness.p2pPort); |
|
||||||
node.addOtherEnclaveNode(otherNodeHostname); |
|
||||||
} catch (Exception ex) { |
|
||||||
throw new RuntimeException("Invalid node URI"); |
|
||||||
} |
|
||||||
} else { |
|
||||||
node.addOtherEnclaveNode(bootNode.getEnclave().nodeUrl()); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
LOG.info( |
|
||||||
"Starting node {} (id = {}...{})", |
|
||||||
node.getName(), |
|
||||||
node.getNodeId().substring(0, 4), |
|
||||||
node.getNodeId().substring(124)); |
|
||||||
node.start(besuNodeRunner); |
|
||||||
} |
|
||||||
} |
|
@ -1,315 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.privacy; |
|
||||||
|
|
||||||
import static org.hyperledger.besu.controller.BesuController.DATABASE_PATH; |
|
||||||
import static org.hyperledger.besu.plugin.services.storage.rocksdb.configuration.RocksDBCLIOptions.DEFAULT_BACKGROUND_THREAD_COUNT; |
|
||||||
import static org.hyperledger.besu.plugin.services.storage.rocksdb.configuration.RocksDBCLIOptions.DEFAULT_CACHE_CAPACITY; |
|
||||||
import static org.hyperledger.besu.plugin.services.storage.rocksdb.configuration.RocksDBCLIOptions.DEFAULT_IS_HIGH_SPEC; |
|
||||||
import static org.hyperledger.besu.plugin.services.storage.rocksdb.configuration.RocksDBCLIOptions.DEFAULT_MAX_OPEN_FILES; |
|
||||||
|
|
||||||
import org.hyperledger.besu.crypto.KeyPairUtil; |
|
||||||
import org.hyperledger.besu.datatypes.Address; |
|
||||||
import org.hyperledger.besu.enclave.Enclave; |
|
||||||
import org.hyperledger.besu.enclave.EnclaveClientException; |
|
||||||
import org.hyperledger.besu.enclave.EnclaveFactory; |
|
||||||
import org.hyperledger.besu.enclave.EnclaveIOException; |
|
||||||
import org.hyperledger.besu.enclave.EnclaveServerException; |
|
||||||
import org.hyperledger.besu.ethereum.core.PrivacyParameters; |
|
||||||
import org.hyperledger.besu.ethereum.privacy.storage.PrivacyStorageProvider; |
|
||||||
import org.hyperledger.besu.ethereum.privacy.storage.keyvalue.PrivacyKeyValueStorageProviderBuilder; |
|
||||||
import org.hyperledger.besu.ethereum.storage.keyvalue.KeyValueSegmentIdentifier; |
|
||||||
import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem; |
|
||||||
import org.hyperledger.besu.plugin.services.storage.rocksdb.RocksDBKeyValuePrivacyStorageFactory; |
|
||||||
import org.hyperledger.besu.plugin.services.storage.rocksdb.RocksDBKeyValueStorageFactory; |
|
||||||
import org.hyperledger.besu.plugin.services.storage.rocksdb.RocksDBMetricsFactory; |
|
||||||
import org.hyperledger.besu.plugin.services.storage.rocksdb.configuration.RocksDBFactoryConfiguration; |
|
||||||
import org.hyperledger.besu.services.BesuConfigurationImpl; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.condition.Condition; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.node.BesuNode; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.node.BesuNodeRunner; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.node.configuration.BesuNodeConfiguration; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.node.configuration.NodeConfiguration; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.node.configuration.privacy.PrivacyNodeConfiguration; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.privacy.condition.PrivateCondition; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; |
|
||||||
import org.hyperledger.enclave.testutil.EnclaveTestHarness; |
|
||||||
import org.hyperledger.enclave.testutil.EnclaveType; |
|
||||||
import org.hyperledger.enclave.testutil.NoopEnclaveTestHarness; |
|
||||||
import org.hyperledger.enclave.testutil.TesseraTestHarnessFactory; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
import java.net.URI; |
|
||||||
import java.nio.file.Files; |
|
||||||
import java.nio.file.Path; |
|
||||||
import java.util.Arrays; |
|
||||||
import java.util.Collections; |
|
||||||
import java.util.List; |
|
||||||
import java.util.Optional; |
|
||||||
import java.util.stream.Collectors; |
|
||||||
|
|
||||||
import io.vertx.core.Vertx; |
|
||||||
import org.awaitility.Awaitility; |
|
||||||
import org.slf4j.Logger; |
|
||||||
import org.slf4j.LoggerFactory; |
|
||||||
import org.testcontainers.containers.Network; |
|
||||||
|
|
||||||
public class PrivacyNode implements AutoCloseable { |
|
||||||
|
|
||||||
private static final Logger LOG = LoggerFactory.getLogger(PrivacyNode.class); |
|
||||||
|
|
||||||
private final EnclaveTestHarness enclave; |
|
||||||
private final BesuNode besu; |
|
||||||
private final Vertx vertx; |
|
||||||
private final boolean isFlexiblePrivacyEnabled; |
|
||||||
private final boolean isMultitenancyEnabled; |
|
||||||
private final boolean isPrivacyPluginEnabled; |
|
||||||
private final BesuNodeConfiguration besuConfig; |
|
||||||
|
|
||||||
public PrivacyNode( |
|
||||||
final PrivacyNodeConfiguration privacyConfiguration, |
|
||||||
final Vertx vertx, |
|
||||||
final EnclaveType enclaveType, |
|
||||||
final Optional<Network> containerNetwork) |
|
||||||
throws IOException { |
|
||||||
final Path enclaveDir = Files.createTempDirectory("acctest-orion"); |
|
||||||
final BesuNodeConfiguration config = privacyConfiguration.getBesuConfig(); |
|
||||||
this.enclave = |
|
||||||
selectEnclave(enclaveType, enclaveDir, config, privacyConfiguration, containerNetwork); |
|
||||||
this.vertx = vertx; |
|
||||||
|
|
||||||
this.besuConfig = config; |
|
||||||
|
|
||||||
isFlexiblePrivacyEnabled = privacyConfiguration.isFlexiblePrivacyGroupEnabled(); |
|
||||||
isMultitenancyEnabled = privacyConfiguration.isMultitenancyEnabled(); |
|
||||||
isPrivacyPluginEnabled = privacyConfiguration.isPrivacyPluginEnabled(); |
|
||||||
|
|
||||||
this.besu = |
|
||||||
new BesuNode( |
|
||||||
besuConfig.getName(), |
|
||||||
besuConfig.getDataPath(), |
|
||||||
besuConfig.getMiningParameters(), |
|
||||||
besuConfig.getTransactionPoolConfiguration(), |
|
||||||
besuConfig.getJsonRpcConfiguration(), |
|
||||||
besuConfig.getEngineRpcConfiguration(), |
|
||||||
besuConfig.getWebSocketConfiguration(), |
|
||||||
besuConfig.getJsonRpcIpcConfiguration(), |
|
||||||
besuConfig.getInProcessRpcConfiguration(), |
|
||||||
besuConfig.getMetricsConfiguration(), |
|
||||||
besuConfig.getPermissioningConfiguration(), |
|
||||||
besuConfig.getApiConfiguration(), |
|
||||||
besuConfig.getDataStorageConfiguration(), |
|
||||||
besuConfig.getKeyFilePath(), |
|
||||||
besuConfig.isDevMode(), |
|
||||||
besuConfig.getNetwork(), |
|
||||||
besuConfig.getGenesisConfigProvider(), |
|
||||||
besuConfig.isP2pEnabled(), |
|
||||||
besuConfig.getP2pPort(), |
|
||||||
besuConfig.getTLSConfiguration(), |
|
||||||
besuConfig.getNetworkingConfiguration(), |
|
||||||
besuConfig.isDiscoveryEnabled(), |
|
||||||
besuConfig.isBootnodeEligible(), |
|
||||||
besuConfig.isRevertReasonEnabled(), |
|
||||||
besuConfig.isSecp256k1Native(), |
|
||||||
besuConfig.isAltbn128Native(), |
|
||||||
besuConfig.getPlugins(), |
|
||||||
besuConfig.getExtraCLIOptions(), |
|
||||||
Collections.emptyList(), |
|
||||||
besuConfig.isDnsEnabled(), |
|
||||||
besuConfig.getPrivacyParameters(), |
|
||||||
List.of(), |
|
||||||
Optional.empty(), |
|
||||||
besuConfig.isStrictTxReplayProtectionEnabled(), |
|
||||||
besuConfig.getEnvironment()); |
|
||||||
} |
|
||||||
|
|
||||||
public void testEnclaveConnection(final List<PrivacyNode> otherNodes) { |
|
||||||
if (this.isPrivacyPluginEnabled) { |
|
||||||
LOG.info("Skipping test as node has no enclave (isPrivacyPluginEnabled=true)"); |
|
||||||
return; |
|
||||||
} |
|
||||||
|
|
||||||
if (!otherNodes.isEmpty()) { |
|
||||||
LOG.debug( |
|
||||||
String.format( |
|
||||||
"Testing Enclave connectivity between %s (%s) and %s (%s)", |
|
||||||
besu.getName(), |
|
||||||
enclave.nodeUrl(), |
|
||||||
Arrays.toString(otherNodes.stream().map(node -> node.besu.getName()).toArray()), |
|
||||||
Arrays.toString(otherNodes.stream().map(node -> node.enclave.nodeUrl()).toArray()))); |
|
||||||
final EnclaveFactory factory = new EnclaveFactory(vertx); |
|
||||||
final Enclave enclaveClient = factory.createVertxEnclave(enclave.clientUrl()); |
|
||||||
final String payload = "SGVsbG8sIFdvcmxkIQ=="; |
|
||||||
final List<String> to = |
|
||||||
otherNodes.stream() |
|
||||||
.map(node -> node.enclave.getDefaultPublicKey()) |
|
||||||
.collect(Collectors.toList()); |
|
||||||
|
|
||||||
Awaitility.await() |
|
||||||
.until( |
|
||||||
() -> { |
|
||||||
try { |
|
||||||
enclaveClient.send(payload, enclave.getDefaultPublicKey(), to); |
|
||||||
return true; |
|
||||||
} catch (final EnclaveClientException |
|
||||||
| EnclaveIOException |
|
||||||
| EnclaveServerException e) { |
|
||||||
LOG.warn( |
|
||||||
"Waiting for enclave connectivity between {} and {}: " + e.getMessage(), |
|
||||||
enclave.getDefaultPublicKey(), |
|
||||||
to.get(0)); |
|
||||||
return false; |
|
||||||
} |
|
||||||
}); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
public EnclaveTestHarness getEnclave() { |
|
||||||
return enclave; |
|
||||||
} |
|
||||||
|
|
||||||
public BesuNode getBesu() { |
|
||||||
return besu; |
|
||||||
} |
|
||||||
|
|
||||||
public void stop() { |
|
||||||
besu.stop(); |
|
||||||
enclave.stop(); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void close() { |
|
||||||
besu.close(); |
|
||||||
enclave.close(); |
|
||||||
} |
|
||||||
|
|
||||||
public void start(final BesuNodeRunner runner) { |
|
||||||
enclave.start(); |
|
||||||
|
|
||||||
final PrivacyParameters privacyParameters; |
|
||||||
|
|
||||||
try { |
|
||||||
final Path dataDir = Files.createTempDirectory("acctest-privacy"); |
|
||||||
final Path dbDir = dataDir.resolve(DATABASE_PATH); |
|
||||||
|
|
||||||
var builder = |
|
||||||
new PrivacyParameters.Builder() |
|
||||||
.setEnabled(true) |
|
||||||
.setEnclaveUrl(enclave.clientUrl()) |
|
||||||
.setStorageProvider(createKeyValueStorageProvider(dataDir, dbDir)) |
|
||||||
.setPrivateKeyPath(KeyPairUtil.getDefaultKeyFile(besu.homeDirectory()).toPath()) |
|
||||||
.setEnclaveFactory(new EnclaveFactory(vertx)) |
|
||||||
.setFlexiblePrivacyGroupsEnabled(isFlexiblePrivacyEnabled) |
|
||||||
.setMultiTenancyEnabled(isMultitenancyEnabled) |
|
||||||
.setPrivacyPluginEnabled(isPrivacyPluginEnabled); |
|
||||||
|
|
||||||
if (enclave.getPublicKeyPaths().size() > 0) { |
|
||||||
builder.setPrivacyUserIdUsingFile(enclave.getPublicKeyPaths().get(0).toFile()); |
|
||||||
} |
|
||||||
|
|
||||||
privacyParameters = builder.build(); |
|
||||||
|
|
||||||
} catch (final IOException e) { |
|
||||||
throw new RuntimeException(e); |
|
||||||
} |
|
||||||
besu.setPrivacyParameters(privacyParameters); |
|
||||||
besu.start(runner); |
|
||||||
} |
|
||||||
|
|
||||||
public void awaitPeerDiscovery(final Condition condition) { |
|
||||||
besu.awaitPeerDiscovery(condition); |
|
||||||
} |
|
||||||
|
|
||||||
public String getName() { |
|
||||||
return besu.getName(); |
|
||||||
} |
|
||||||
|
|
||||||
public Address getAddress() { |
|
||||||
return besu.getAddress(); |
|
||||||
} |
|
||||||
|
|
||||||
public URI enodeUrl() { |
|
||||||
return besu.enodeUrl(); |
|
||||||
} |
|
||||||
|
|
||||||
public String getNodeId() { |
|
||||||
return besu.getNodeId(); |
|
||||||
} |
|
||||||
|
|
||||||
public <T> T execute(final Transaction<T> transaction) { |
|
||||||
return besu.execute(transaction); |
|
||||||
} |
|
||||||
|
|
||||||
public void verify(final PrivateCondition expected) { |
|
||||||
expected.verify(this); |
|
||||||
} |
|
||||||
|
|
||||||
public String getEnclaveKey() { |
|
||||||
return enclave.getDefaultPublicKey(); |
|
||||||
} |
|
||||||
|
|
||||||
public String getTransactionSigningKey() { |
|
||||||
return besu.getPrivacyParameters().getSigningKeyPair().orElseThrow().getPrivateKey().toString(); |
|
||||||
} |
|
||||||
|
|
||||||
public void addOtherEnclaveNode(final URI otherNode) { |
|
||||||
enclave.addOtherNode(otherNode); |
|
||||||
} |
|
||||||
|
|
||||||
public NodeConfiguration getConfiguration() { |
|
||||||
return besu.getConfiguration(); |
|
||||||
} |
|
||||||
|
|
||||||
private PrivacyStorageProvider createKeyValueStorageProvider( |
|
||||||
final Path dataLocation, final Path dbLocation) { |
|
||||||
final var besuConfiguration = new BesuConfigurationImpl(); |
|
||||||
besuConfiguration |
|
||||||
.init(dataLocation, dbLocation, besuConfig.getDataStorageConfiguration()) |
|
||||||
.withMiningParameters(besuConfig.getMiningParameters()); |
|
||||||
return new PrivacyKeyValueStorageProviderBuilder() |
|
||||||
.withStorageFactory( |
|
||||||
new RocksDBKeyValuePrivacyStorageFactory( |
|
||||||
new RocksDBKeyValueStorageFactory( |
|
||||||
() -> |
|
||||||
new RocksDBFactoryConfiguration( |
|
||||||
DEFAULT_MAX_OPEN_FILES, |
|
||||||
DEFAULT_BACKGROUND_THREAD_COUNT, |
|
||||||
DEFAULT_CACHE_CAPACITY, |
|
||||||
DEFAULT_IS_HIGH_SPEC), |
|
||||||
Arrays.asList(KeyValueSegmentIdentifier.values()), |
|
||||||
RocksDBMetricsFactory.PRIVATE_ROCKS_DB_METRICS))) |
|
||||||
.withCommonConfiguration(besuConfiguration) |
|
||||||
.withMetricsSystem(new NoOpMetricsSystem()) |
|
||||||
.build(); |
|
||||||
} |
|
||||||
|
|
||||||
private EnclaveTestHarness selectEnclave( |
|
||||||
final EnclaveType enclaveType, |
|
||||||
final Path tempDir, |
|
||||||
final BesuNodeConfiguration config, |
|
||||||
final PrivacyNodeConfiguration privacyConfiguration, |
|
||||||
final Optional<Network> containerNetwork) { |
|
||||||
|
|
||||||
switch (enclaveType) { |
|
||||||
case ORION: |
|
||||||
throw new UnsupportedOperationException("The Orion tests are getting deprecated"); |
|
||||||
case TESSERA: |
|
||||||
return TesseraTestHarnessFactory.create( |
|
||||||
config.getName(), tempDir, privacyConfiguration.getKeyConfig(), containerNetwork); |
|
||||||
default: |
|
||||||
return new NoopEnclaveTestHarness(tempDir, privacyConfiguration.getKeyConfig()); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,117 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.privacy; |
|
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonCreator; |
|
||||||
import com.fasterxml.jackson.annotation.JsonProperty; |
|
||||||
|
|
||||||
public class PrivateTransactionGroupResponse { |
|
||||||
private final String from; |
|
||||||
private final String gas; |
|
||||||
private final String gasPrice; |
|
||||||
private final String input; |
|
||||||
private final String nonce; |
|
||||||
private final String to; |
|
||||||
private final String value; |
|
||||||
private final String v; |
|
||||||
private final String r; |
|
||||||
private final String s; |
|
||||||
private final String privateFrom; |
|
||||||
private final String restriction; |
|
||||||
private final String privacyGroupId; |
|
||||||
|
|
||||||
@JsonCreator |
|
||||||
public PrivateTransactionGroupResponse( |
|
||||||
@JsonProperty("from") final String from, |
|
||||||
@JsonProperty("gas") final String gas, |
|
||||||
@JsonProperty("gasPrice") final String gasPrice, |
|
||||||
@JsonProperty("hash") final String hash, |
|
||||||
@JsonProperty("input") final String input, |
|
||||||
@JsonProperty("nonce") final String nonce, |
|
||||||
@JsonProperty("to") final String to, |
|
||||||
@JsonProperty("value") final String value, |
|
||||||
@JsonProperty("v") final String v, |
|
||||||
@JsonProperty("r") final String r, |
|
||||||
@JsonProperty("s") final String s, |
|
||||||
@JsonProperty("privateFrom") final String privateFrom, |
|
||||||
@JsonProperty("restriction") final String restriction, |
|
||||||
@JsonProperty("privacyGroupId") final String privacyGroupId) { |
|
||||||
this.from = from; |
|
||||||
this.gas = gas; |
|
||||||
this.gasPrice = gasPrice; |
|
||||||
this.input = input; |
|
||||||
this.nonce = nonce; |
|
||||||
this.to = to; |
|
||||||
this.value = value; |
|
||||||
this.v = v; |
|
||||||
this.r = r; |
|
||||||
this.s = s; |
|
||||||
this.privateFrom = privateFrom; |
|
||||||
this.restriction = restriction; |
|
||||||
this.privacyGroupId = privacyGroupId; |
|
||||||
} |
|
||||||
|
|
||||||
public String getFrom() { |
|
||||||
return from; |
|
||||||
} |
|
||||||
|
|
||||||
public String getGas() { |
|
||||||
return gas; |
|
||||||
} |
|
||||||
|
|
||||||
public String getGasPrice() { |
|
||||||
return gasPrice; |
|
||||||
} |
|
||||||
|
|
||||||
public String getInput() { |
|
||||||
return input; |
|
||||||
} |
|
||||||
|
|
||||||
public String getNonce() { |
|
||||||
return nonce; |
|
||||||
} |
|
||||||
|
|
||||||
public String getTo() { |
|
||||||
return to; |
|
||||||
} |
|
||||||
|
|
||||||
public String getValue() { |
|
||||||
return value; |
|
||||||
} |
|
||||||
|
|
||||||
public String getV() { |
|
||||||
return v; |
|
||||||
} |
|
||||||
|
|
||||||
public String getR() { |
|
||||||
return r; |
|
||||||
} |
|
||||||
|
|
||||||
public String getS() { |
|
||||||
return s; |
|
||||||
} |
|
||||||
|
|
||||||
public String getPrivateFrom() { |
|
||||||
return privateFrom; |
|
||||||
} |
|
||||||
|
|
||||||
public String getRestriction() { |
|
||||||
return restriction; |
|
||||||
} |
|
||||||
|
|
||||||
public String getPrivacyGroupId() { |
|
||||||
return privacyGroupId; |
|
||||||
} |
|
||||||
} |
|
@ -1,85 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.privacy.account; |
|
||||||
|
|
||||||
import org.hyperledger.enclave.testutil.EnclaveEncryptorType; |
|
||||||
|
|
||||||
import java.io.File; |
|
||||||
import java.net.URL; |
|
||||||
import java.util.Arrays; |
|
||||||
|
|
||||||
public class PrivacyAccount { |
|
||||||
|
|
||||||
private final URL privateKeyPath; |
|
||||||
private final URL[] enclaveKeyPaths; |
|
||||||
private final URL[] enclavePrivateKeyPaths; |
|
||||||
private final EnclaveEncryptorType enclaveEncryptorType; |
|
||||||
|
|
||||||
private PrivacyAccount( |
|
||||||
final URL privateKeyPath, |
|
||||||
final URL[] enclavePublicKeyPaths, |
|
||||||
final URL[] enclavePrivateKeyPaths, |
|
||||||
final EnclaveEncryptorType enclaveEncryptorType) { |
|
||||||
this.privateKeyPath = privateKeyPath; |
|
||||||
this.enclaveKeyPaths = enclavePublicKeyPaths; |
|
||||||
this.enclavePrivateKeyPaths = enclavePrivateKeyPaths; |
|
||||||
this.enclaveEncryptorType = enclaveEncryptorType; |
|
||||||
} |
|
||||||
|
|
||||||
public static PrivacyAccount create( |
|
||||||
final URL privateKeyPath, |
|
||||||
final URL enclavePublicKeyPath, |
|
||||||
final URL enclavePrivateKeyPath, |
|
||||||
final EnclaveEncryptorType enclaveEncryptorType) { |
|
||||||
return new PrivacyAccount( |
|
||||||
privateKeyPath, |
|
||||||
new URL[] {enclavePublicKeyPath}, |
|
||||||
new URL[] {enclavePrivateKeyPath}, |
|
||||||
enclaveEncryptorType); |
|
||||||
} |
|
||||||
|
|
||||||
public static PrivacyAccount create( |
|
||||||
final URL privateKeyPath, |
|
||||||
final URL[] enclavePublicKeyPath, |
|
||||||
final URL[] enclavePrivateKeyPath, |
|
||||||
final EnclaveEncryptorType enclaveEncryptorType) { |
|
||||||
return new PrivacyAccount( |
|
||||||
privateKeyPath, enclavePublicKeyPath, enclavePrivateKeyPath, enclaveEncryptorType); |
|
||||||
} |
|
||||||
|
|
||||||
public String getPrivateKeyPath() { |
|
||||||
return toStringResource(privateKeyPath); |
|
||||||
} |
|
||||||
|
|
||||||
public String[] getEnclaveKeyPaths() { |
|
||||||
return Arrays.stream(enclaveKeyPaths) |
|
||||||
.map(path -> toStringResource(path)) |
|
||||||
.toArray(String[]::new); |
|
||||||
} |
|
||||||
|
|
||||||
public String[] getEnclavePrivateKeyPaths() { |
|
||||||
return Arrays.stream(enclavePrivateKeyPaths) |
|
||||||
.map(path -> toStringResource(path)) |
|
||||||
.toArray(String[]::new); |
|
||||||
} |
|
||||||
|
|
||||||
public EnclaveEncryptorType getEnclaveEncryptorType() { |
|
||||||
return enclaveEncryptorType; |
|
||||||
} |
|
||||||
|
|
||||||
private String toStringResource(final URL path) { |
|
||||||
return path.getPath().substring(path.getPath().lastIndexOf(File.separator) + 1); |
|
||||||
} |
|
||||||
} |
|
@ -1,101 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.privacy.account; |
|
||||||
|
|
||||||
import org.hyperledger.enclave.testutil.EnclaveEncryptorType; |
|
||||||
|
|
||||||
import java.net.URL; |
|
||||||
|
|
||||||
/** Supplier of known funded accounts defined in dev.json */ |
|
||||||
public enum PrivacyAccountResolver { |
|
||||||
ALICE { |
|
||||||
@Override |
|
||||||
public PrivacyAccount resolve(final EnclaveEncryptorType enclaveEncryptorType) { |
|
||||||
return PrivacyAccount.create( |
|
||||||
resolveResource("key"), |
|
||||||
enclaveEncryptorType.equals(EnclaveEncryptorType.EC) |
|
||||||
? resolveResource("enclave_ec_key_0.pub") |
|
||||||
: resolveResource("enclave_key_0.pub"), |
|
||||||
enclaveEncryptorType.equals(EnclaveEncryptorType.EC) |
|
||||||
? resolveResource("enclave_ec_key_0.key") |
|
||||||
: resolveResource("enclave_key_0.key"), |
|
||||||
enclaveEncryptorType); |
|
||||||
} |
|
||||||
}, |
|
||||||
BOB { |
|
||||||
@Override |
|
||||||
public PrivacyAccount resolve(final EnclaveEncryptorType enclaveEncryptorType) { |
|
||||||
return PrivacyAccount.create( |
|
||||||
resolveResource("key1"), |
|
||||||
enclaveEncryptorType.equals(EnclaveEncryptorType.EC) |
|
||||||
? resolveResource("enclave_ec_key_1.pub") |
|
||||||
: resolveResource("enclave_key_1.pub"), |
|
||||||
enclaveEncryptorType.equals(EnclaveEncryptorType.EC) |
|
||||||
? resolveResource("enclave_ec_key_1.key") |
|
||||||
: resolveResource("enclave_key_1.key"), |
|
||||||
enclaveEncryptorType); |
|
||||||
} |
|
||||||
}, |
|
||||||
CHARLIE { |
|
||||||
@Override |
|
||||||
public PrivacyAccount resolve(final EnclaveEncryptorType enclaveEncryptorType) { |
|
||||||
return PrivacyAccount.create( |
|
||||||
resolveResource("key2"), |
|
||||||
enclaveEncryptorType.equals(EnclaveEncryptorType.EC) |
|
||||||
? resolveResource("enclave_ec_key_2.pub") |
|
||||||
: resolveResource("enclave_key_2.pub"), |
|
||||||
enclaveEncryptorType.equals(EnclaveEncryptorType.EC) |
|
||||||
? resolveResource("enclave_ec_key_2.key") |
|
||||||
: resolveResource("enclave_key_2.key"), |
|
||||||
enclaveEncryptorType); |
|
||||||
} |
|
||||||
}, |
|
||||||
MULTI_TENANCY { |
|
||||||
@Override |
|
||||||
public PrivacyAccount resolve(final EnclaveEncryptorType enclaveEncryptorType) { |
|
||||||
return PrivacyAccount.create( |
|
||||||
resolveResource("key"), |
|
||||||
new URL[] { |
|
||||||
enclaveEncryptorType.equals(EnclaveEncryptorType.EC) |
|
||||||
? resolveResource("enclave_ec_key_0.pub") |
|
||||||
: resolveResource("enclave_key_0.pub"), |
|
||||||
enclaveEncryptorType.equals(EnclaveEncryptorType.EC) |
|
||||||
? resolveResource("enclave_ec_key_1.pub") |
|
||||||
: resolveResource("enclave_key_1.pub"), |
|
||||||
enclaveEncryptorType.equals(EnclaveEncryptorType.EC) |
|
||||||
? resolveResource("enclave_ec_key_2.pub") |
|
||||||
: resolveResource("enclave_key_2.pub") |
|
||||||
}, |
|
||||||
new URL[] { |
|
||||||
enclaveEncryptorType.equals(EnclaveEncryptorType.EC) |
|
||||||
? resolveResource("enclave_ec_key_0.key") |
|
||||||
: resolveResource("enclave_key_0.key"), |
|
||||||
enclaveEncryptorType.equals(EnclaveEncryptorType.EC) |
|
||||||
? resolveResource("enclave_ec_key_1.key") |
|
||||||
: resolveResource("enclave_key_1.key"), |
|
||||||
enclaveEncryptorType.equals(EnclaveEncryptorType.EC) |
|
||||||
? resolveResource("enclave_ec_key_2.key") |
|
||||||
: resolveResource("enclave_key_2.key") |
|
||||||
}, |
|
||||||
enclaveEncryptorType); |
|
||||||
} |
|
||||||
}; |
|
||||||
|
|
||||||
public abstract PrivacyAccount resolve(final EnclaveEncryptorType enclaveEncryptorType); |
|
||||||
|
|
||||||
URL resolveResource(final String resource) { |
|
||||||
return PrivacyAccountResolver.class.getClassLoader().getResource(resource); |
|
||||||
} |
|
||||||
} |
|
@ -1,41 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.privacy.condition; |
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.privacy.PrivacyNode; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.privacy.transaction.PrivacyTransactions; |
|
||||||
|
|
||||||
import org.web3j.protocol.besu.response.privacy.PrivateTransactionReceipt; |
|
||||||
|
|
||||||
public class ExpectExistingPrivateTransactionReceipt implements PrivateCondition { |
|
||||||
private final PrivacyTransactions transactions; |
|
||||||
private final String transactionHash; |
|
||||||
|
|
||||||
public ExpectExistingPrivateTransactionReceipt( |
|
||||||
final PrivacyTransactions transactions, final String transactionHash) { |
|
||||||
|
|
||||||
this.transactions = transactions; |
|
||||||
this.transactionHash = transactionHash; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void verify(final PrivacyNode node) { |
|
||||||
final PrivateTransactionReceipt privateTransactionReceipt = |
|
||||||
node.execute(transactions.getPrivateTransactionReceipt(transactionHash)); |
|
||||||
assertThat(privateTransactionReceipt).isNotNull(); |
|
||||||
} |
|
||||||
} |
|
@ -1,40 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.privacy.condition; |
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.privacy.PrivacyNode; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.privacy.transaction.PrivacyTransactions; |
|
||||||
|
|
||||||
public class ExpectInternalErrorPrivateTransactionReceipt implements PrivateCondition { |
|
||||||
private final PrivacyTransactions transactions; |
|
||||||
private final String transactionHash; |
|
||||||
|
|
||||||
public ExpectInternalErrorPrivateTransactionReceipt( |
|
||||||
final PrivacyTransactions transactions, final String transactionHash) { |
|
||||||
this.transactions = transactions; |
|
||||||
this.transactionHash = transactionHash; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void verify(final PrivacyNode node) { |
|
||||||
try { |
|
||||||
node.execute(transactions.getPrivateTransactionReceipt(transactionHash)); |
|
||||||
} catch (final RuntimeException e) { |
|
||||||
assertThat(e.getMessage()).contains("Internal error"); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,41 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.privacy.condition; |
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat; |
|
||||||
import static org.assertj.core.api.Assertions.catchThrowable; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.privacy.PrivacyNode; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.privacy.transaction.PrivacyTransactions; |
|
||||||
|
|
||||||
public class ExpectNoPrivateTransactionReceipt implements PrivateCondition { |
|
||||||
private final PrivacyTransactions transactions; |
|
||||||
private final String transactionHash; |
|
||||||
|
|
||||||
public ExpectNoPrivateTransactionReceipt( |
|
||||||
final PrivacyTransactions transactions, final String transactionHash) { |
|
||||||
this.transactions = transactions; |
|
||||||
this.transactionHash = transactionHash; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void verify(final PrivacyNode node) { |
|
||||||
final Throwable t = |
|
||||||
catchThrowable( |
|
||||||
() -> node.execute(transactions.getPrivateTransactionReceipt(transactionHash))); |
|
||||||
|
|
||||||
assertThat(t).hasMessageContaining("TransactionException"); |
|
||||||
} |
|
||||||
} |
|
@ -1,29 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.privacy.condition; |
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
import org.web3j.tx.Contract; |
|
||||||
|
|
||||||
public class ExpectValidContractCode implements PrivateContractCondition { |
|
||||||
@Override |
|
||||||
public void verify(final Contract contract) throws IOException { |
|
||||||
assertThat(contract).isNotNull(); |
|
||||||
assertThat(contract.isValid()).isEqualTo(true); |
|
||||||
} |
|
||||||
} |
|
@ -1,53 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.privacy.condition; |
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.privacy.PrivacyNode; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.privacy.transaction.PrivacyTransactions; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.PrivacyRequestFactory; |
|
||||||
|
|
||||||
import java.util.List; |
|
||||||
import java.util.concurrent.TimeUnit; |
|
||||||
|
|
||||||
import org.awaitility.Awaitility; |
|
||||||
import org.web3j.utils.Base64String; |
|
||||||
|
|
||||||
public class ExpectValidFlexiblePrivacyGroupCreated implements PrivateCondition { |
|
||||||
|
|
||||||
private final PrivacyTransactions transactions; |
|
||||||
private final PrivacyRequestFactory.FlexiblePrivacyGroup expected; |
|
||||||
|
|
||||||
public ExpectValidFlexiblePrivacyGroupCreated( |
|
||||||
final PrivacyTransactions transactions, |
|
||||||
final PrivacyRequestFactory.FlexiblePrivacyGroup expected) { |
|
||||||
this.transactions = transactions; |
|
||||||
this.expected = expected; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void verify(final PrivacyNode node) { |
|
||||||
Awaitility.waitAtMost(20, TimeUnit.SECONDS) |
|
||||||
.untilAsserted( |
|
||||||
() -> { |
|
||||||
final List<PrivacyRequestFactory.FlexiblePrivacyGroup> groups = |
|
||||||
node.execute( |
|
||||||
transactions.findFlexiblePrivacyGroup( |
|
||||||
Base64String.unwrapList(expected.getMembers()))); |
|
||||||
assertThat(groups).contains(expected); |
|
||||||
}); |
|
||||||
} |
|
||||||
} |
|
@ -1,51 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.privacy.condition; |
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.privacy.PrivacyNode; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.privacy.transaction.PrivacyTransactions; |
|
||||||
|
|
||||||
import java.util.List; |
|
||||||
|
|
||||||
import org.awaitility.Awaitility; |
|
||||||
import org.web3j.protocol.besu.response.privacy.PrivacyGroup; |
|
||||||
import org.web3j.utils.Base64String; |
|
||||||
|
|
||||||
public class ExpectValidPrivacyGroupCreated implements PrivateCondition { |
|
||||||
|
|
||||||
private final PrivacyTransactions transactions; |
|
||||||
private final PrivacyGroup expected; |
|
||||||
|
|
||||||
public ExpectValidPrivacyGroupCreated( |
|
||||||
final PrivacyTransactions transactions, final PrivacyGroup expected) { |
|
||||||
this.transactions = transactions; |
|
||||||
this.expected = expected; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void verify(final PrivacyNode node) { |
|
||||||
Awaitility.await() |
|
||||||
.untilAsserted( |
|
||||||
() -> { |
|
||||||
final List<PrivacyGroup> groups = |
|
||||||
node.execute( |
|
||||||
transactions.findPrivacyGroup( |
|
||||||
Base64String.unwrapList(expected.getMembers()))); |
|
||||||
assertThat(groups).contains(expected); |
|
||||||
}); |
|
||||||
} |
|
||||||
} |
|
@ -1,57 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.privacy.condition; |
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat; |
|
||||||
|
|
||||||
import java.util.Optional; |
|
||||||
|
|
||||||
import org.web3j.protocol.core.methods.response.TransactionReceipt; |
|
||||||
import org.web3j.tx.Contract; |
|
||||||
|
|
||||||
public class ExpectValidPrivateContractDeployedReceipt implements PrivateContractCondition { |
|
||||||
|
|
||||||
private final String contractAddress; |
|
||||||
private final String senderAddress; |
|
||||||
|
|
||||||
public ExpectValidPrivateContractDeployedReceipt( |
|
||||||
final String contractAddress, final String senderAddress) { |
|
||||||
this.contractAddress = contractAddress; |
|
||||||
this.senderAddress = senderAddress; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void verify(final Contract contract) { |
|
||||||
|
|
||||||
assertThat(contract).isNotNull(); |
|
||||||
final Optional<TransactionReceipt> receipt = contract.getTransactionReceipt(); |
|
||||||
|
|
||||||
// We're expecting a receipt
|
|
||||||
assertThat(receipt).isNotNull(); |
|
||||||
assertThat(receipt.isPresent()).isTrue(); |
|
||||||
final TransactionReceipt transactionReceipt = receipt.get(); |
|
||||||
|
|
||||||
assertThat(transactionReceipt.isStatusOK()).isTrue(); |
|
||||||
|
|
||||||
// Contract transaction has no 'to' address or contract address
|
|
||||||
assertThat(transactionReceipt.getTo()).isNull(); |
|
||||||
|
|
||||||
// Address generation is deterministic, based on the sender address and the transaction nonce
|
|
||||||
assertThat(transactionReceipt.getContractAddress()).isEqualTo(contractAddress); |
|
||||||
|
|
||||||
// Address for the account that signed (and paid) for the contract deployment transaction
|
|
||||||
assertThat(transactionReceipt.getFrom()).isEqualTo(senderAddress); |
|
||||||
} |
|
||||||
} |
|
@ -1,91 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.privacy.condition; |
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.privacy.PrivacyNode; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.privacy.transaction.PrivacyTransactions; |
|
||||||
|
|
||||||
import org.web3j.protocol.besu.response.privacy.PrivateTransactionReceipt; |
|
||||||
|
|
||||||
public class ExpectValidPrivateTransactionReceipt implements PrivateCondition { |
|
||||||
private final PrivacyTransactions transactions; |
|
||||||
private final String transactionHash; |
|
||||||
private final PrivateTransactionReceipt expectedReceipt; |
|
||||||
private final boolean ignoreOutput; |
|
||||||
|
|
||||||
public ExpectValidPrivateTransactionReceipt( |
|
||||||
final PrivacyTransactions transactions, |
|
||||||
final String transactionHash, |
|
||||||
final PrivateTransactionReceipt expectedReceipt) { |
|
||||||
this(transactions, transactionHash, expectedReceipt, false); |
|
||||||
} |
|
||||||
|
|
||||||
public ExpectValidPrivateTransactionReceipt( |
|
||||||
final PrivacyTransactions transactions, |
|
||||||
final String transactionHash, |
|
||||||
final PrivateTransactionReceipt expectedReceipt, |
|
||||||
final boolean ignoreOutput) { |
|
||||||
|
|
||||||
this.transactions = transactions; |
|
||||||
this.transactionHash = transactionHash; |
|
||||||
this.expectedReceipt = expectedReceipt; |
|
||||||
this.ignoreOutput = ignoreOutput; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void verify(final PrivacyNode node) { |
|
||||||
final PrivateTransactionReceipt actualReceipt = |
|
||||||
node.execute(transactions.getPrivateTransactionReceipt(transactionHash)); |
|
||||||
if (ignoreOutput) { |
|
||||||
// output can be ignored if it is checked separately
|
|
||||||
assertThat(actualReceipt) |
|
||||||
.usingRecursiveComparison() |
|
||||||
.ignoringFields( |
|
||||||
"commitmentHash", |
|
||||||
"logs", |
|
||||||
"blockHash", |
|
||||||
"blockNumber", |
|
||||||
"logsBloom", |
|
||||||
"transactionIndex", |
|
||||||
"output") |
|
||||||
// TODO: The fields blockHash, blockNumber, logsBloom, transactionIndex and output have to
|
|
||||||
// be ignored as
|
|
||||||
// the class org.web3j.protocol.besu.response.privacy.PrivateTransactionReceipt does not
|
|
||||||
// contain
|
|
||||||
// these fields. Once web3j has been updated these ignores can be removed.
|
|
||||||
.isEqualTo(expectedReceipt); |
|
||||||
} else { |
|
||||||
assertThat(actualReceipt) |
|
||||||
.usingRecursiveComparison() |
|
||||||
.ignoringFields( |
|
||||||
"commitmentHash", "logs", "blockHash", "blockNumber", "logsBloom", "transactionIndex") |
|
||||||
// TODO: The fields blockHash, blockNumber, logsBloom and transactionIndex have to be
|
|
||||||
// ignored as the class
|
|
||||||
// org.web3j.protocol.besu.response.privacy.PrivateTransactionReceipt does not contain
|
|
||||||
// these fields. Once web3j has been updated these ignores can be removed.
|
|
||||||
.isEqualTo(expectedReceipt); |
|
||||||
} |
|
||||||
assertThat(actualReceipt.getLogs().size()).isEqualTo(expectedReceipt.getLogs().size()); |
|
||||||
|
|
||||||
for (int i = 0; i < expectedReceipt.getLogs().size(); i++) { |
|
||||||
assertThat(actualReceipt.getLogs().get(i)) |
|
||||||
.usingRecursiveComparison() |
|
||||||
.ignoringFields("blockHash", "blockNumber") |
|
||||||
.isEqualTo(expectedReceipt.getLogs().get(i)); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,52 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.privacy.condition; |
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.NodeRequests; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
import org.web3j.protocol.besu.Besu; |
|
||||||
import org.web3j.protocol.besu.response.privacy.PrivateTransactionReceipt; |
|
||||||
import org.web3j.protocol.exceptions.TransactionException; |
|
||||||
import org.web3j.tx.response.PollingPrivateTransactionReceiptProcessor; |
|
||||||
|
|
||||||
public class PrivGetTransactionReceiptTransaction |
|
||||||
implements Transaction<PrivateTransactionReceipt> { |
|
||||||
|
|
||||||
private final String transactionHash; |
|
||||||
|
|
||||||
public PrivGetTransactionReceiptTransaction(final String transactionHash) { |
|
||||||
this.transactionHash = transactionHash; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public PrivateTransactionReceipt execute(final NodeRequests node) { |
|
||||||
final Besu besu = node.privacy().getBesuClient(); |
|
||||||
final PollingPrivateTransactionReceiptProcessor receiptProcessor = |
|
||||||
new PollingPrivateTransactionReceiptProcessor(besu, 1000, 15); |
|
||||||
try { |
|
||||||
final PrivateTransactionReceipt result = |
|
||||||
receiptProcessor.waitForTransactionReceipt(transactionHash); |
|
||||||
assertThat(result).isNotNull(); |
|
||||||
return result; |
|
||||||
} catch (final IOException | TransactionException e) { |
|
||||||
throw new RuntimeException(e); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,21 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.privacy.condition; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.privacy.PrivacyNode; |
|
||||||
|
|
||||||
public interface PrivateCondition { |
|
||||||
void verify(PrivacyNode node); |
|
||||||
} |
|
@ -1,23 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.privacy.condition; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
import org.web3j.tx.Contract; |
|
||||||
|
|
||||||
public interface PrivateContractCondition { |
|
||||||
void verify(final Contract contract) throws IOException; |
|
||||||
} |
|
@ -1,29 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.privacy.condition; |
|
||||||
|
|
||||||
public class PrivateContractVerifier { |
|
||||||
|
|
||||||
public PrivateContractVerifier() {} |
|
||||||
|
|
||||||
public ExpectValidPrivateContractDeployedReceipt validPrivateContractDeployed( |
|
||||||
final String contractAddress, final String senderAddress) { |
|
||||||
return new ExpectValidPrivateContractDeployedReceipt(contractAddress, senderAddress); |
|
||||||
} |
|
||||||
|
|
||||||
public ExpectValidContractCode validContractCodeProvided() { |
|
||||||
return new ExpectValidContractCode(); |
|
||||||
} |
|
||||||
} |
|
@ -1,88 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.privacy.condition; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.privacy.PrivacyNode; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.privacy.transaction.PrivacyTransactions; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.PrivacyRequestFactory.FlexiblePrivacyGroup; |
|
||||||
|
|
||||||
import java.util.Arrays; |
|
||||||
import java.util.List; |
|
||||||
import java.util.stream.Collectors; |
|
||||||
|
|
||||||
import org.web3j.protocol.besu.response.privacy.PrivacyGroup; |
|
||||||
import org.web3j.protocol.besu.response.privacy.PrivateTransactionReceipt; |
|
||||||
import org.web3j.utils.Base64String; |
|
||||||
|
|
||||||
public class PrivateTransactionVerifier { |
|
||||||
|
|
||||||
private final PrivacyTransactions transactions; |
|
||||||
|
|
||||||
public PrivateTransactionVerifier(final PrivacyTransactions transactions) { |
|
||||||
this.transactions = transactions; |
|
||||||
} |
|
||||||
|
|
||||||
public ExpectValidPrivateTransactionReceipt validPrivateTransactionReceipt( |
|
||||||
final String transactionHash, final PrivateTransactionReceipt receipt) { |
|
||||||
return new ExpectValidPrivateTransactionReceipt(transactions, transactionHash, receipt); |
|
||||||
} |
|
||||||
|
|
||||||
public ExpectValidPrivateTransactionReceipt validPrivateTransactionReceipt( |
|
||||||
final String transactionHash, |
|
||||||
final PrivateTransactionReceipt receipt, |
|
||||||
final boolean ignoreOutput) { |
|
||||||
return new ExpectValidPrivateTransactionReceipt( |
|
||||||
transactions, transactionHash, receipt, ignoreOutput); |
|
||||||
} |
|
||||||
|
|
||||||
public ExpectExistingPrivateTransactionReceipt existingPrivateTransactionReceipt( |
|
||||||
final String transactionHash) { |
|
||||||
return new ExpectExistingPrivateTransactionReceipt(transactions, transactionHash); |
|
||||||
} |
|
||||||
|
|
||||||
public ExpectNoPrivateTransactionReceipt noPrivateTransactionReceipt( |
|
||||||
final String transactionHash) { |
|
||||||
return new ExpectNoPrivateTransactionReceipt(transactions, transactionHash); |
|
||||||
} |
|
||||||
|
|
||||||
public ExpectValidPrivacyGroupCreated validPrivacyGroupCreated(final PrivacyGroup expected) { |
|
||||||
return new ExpectValidPrivacyGroupCreated(transactions, expected); |
|
||||||
} |
|
||||||
|
|
||||||
public ExpectValidFlexiblePrivacyGroupCreated flexiblePrivacyGroupExists( |
|
||||||
final String privacyGroupId, final PrivacyNode... members) { |
|
||||||
|
|
||||||
final List<Base64String> membersEnclaveKeys = |
|
||||||
Arrays.stream(members) |
|
||||||
.map(PrivacyNode::getEnclaveKey) |
|
||||||
.map(Base64String::wrap) |
|
||||||
.collect(Collectors.toList()); |
|
||||||
return flexiblePrivacyGroupExists(privacyGroupId, membersEnclaveKeys); |
|
||||||
} |
|
||||||
|
|
||||||
public ExpectValidFlexiblePrivacyGroupCreated flexiblePrivacyGroupExists( |
|
||||||
final String privacyGroupId, final List<Base64String> membersEnclaveKeys) { |
|
||||||
|
|
||||||
final FlexiblePrivacyGroup expectedGroup = |
|
||||||
new FlexiblePrivacyGroup(privacyGroupId, membersEnclaveKeys); |
|
||||||
|
|
||||||
return new ExpectValidFlexiblePrivacyGroupCreated(transactions, expectedGroup); |
|
||||||
} |
|
||||||
|
|
||||||
public ExpectInternalErrorPrivateTransactionReceipt internalErrorPrivateTransactionReceipt( |
|
||||||
final String transactionHash) { |
|
||||||
return new ExpectInternalErrorPrivateTransactionReceipt(transactions, transactionHash); |
|
||||||
} |
|
||||||
} |
|
@ -1,73 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.privacy.contract; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.NodeRequests; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
import java.math.BigInteger; |
|
||||||
|
|
||||||
import org.web3j.crypto.Credentials; |
|
||||||
import org.web3j.tx.PrivateTransactionManager; |
|
||||||
import org.web3j.tx.gas.BesuPrivacyGasProvider; |
|
||||||
import org.web3j.utils.Base64String; |
|
||||||
import org.web3j.utils.Restriction; |
|
||||||
|
|
||||||
public class CallOnchainPermissioningPrivateSmartContractFunction implements Transaction<String> { |
|
||||||
|
|
||||||
private static final BesuPrivacyGasProvider GAS_PROVIDER = |
|
||||||
new BesuPrivacyGasProvider(BigInteger.valueOf(1000)); |
|
||||||
private final String contractAddress; |
|
||||||
private final String encodedFunction; |
|
||||||
private final Credentials senderCredentials; |
|
||||||
private final Base64String privateFrom; |
|
||||||
private final Base64String privacyGroupId; |
|
||||||
|
|
||||||
public CallOnchainPermissioningPrivateSmartContractFunction( |
|
||||||
final String contractAddress, |
|
||||||
final String encodedFunction, |
|
||||||
final String transactionSigningKey, |
|
||||||
final String privateFrom, |
|
||||||
final String privacyGroupId) { |
|
||||||
|
|
||||||
this.contractAddress = contractAddress; |
|
||||||
this.encodedFunction = encodedFunction; |
|
||||||
this.senderCredentials = Credentials.create(transactionSigningKey); |
|
||||||
this.privateFrom = Base64String.wrap(privateFrom); |
|
||||||
this.privacyGroupId = Base64String.wrap(privacyGroupId); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public String execute(final NodeRequests node) { |
|
||||||
final PrivateTransactionManager privateTransactionManager = |
|
||||||
node.privacy() |
|
||||||
.getTransactionManager( |
|
||||||
senderCredentials, privateFrom, privacyGroupId, Restriction.RESTRICTED); |
|
||||||
|
|
||||||
try { |
|
||||||
return privateTransactionManager |
|
||||||
.sendTransaction( |
|
||||||
GAS_PROVIDER.getGasPrice(), |
|
||||||
GAS_PROVIDER.getGasLimit(), |
|
||||||
contractAddress, |
|
||||||
encodedFunction, |
|
||||||
null) |
|
||||||
.getTransactionHash(); |
|
||||||
} catch (final IOException e) { |
|
||||||
throw new RuntimeException(e); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,121 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.privacy.contract; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.NodeRequests; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
import java.math.BigInteger; |
|
||||||
import java.util.List; |
|
||||||
|
|
||||||
import org.web3j.crypto.Credentials; |
|
||||||
import org.web3j.tx.PrivateTransactionManager; |
|
||||||
import org.web3j.tx.gas.BesuPrivacyGasProvider; |
|
||||||
import org.web3j.utils.Base64String; |
|
||||||
import org.web3j.utils.Restriction; |
|
||||||
|
|
||||||
public class CallPrivateSmartContractFunction implements Transaction<String> { |
|
||||||
|
|
||||||
private static final BesuPrivacyGasProvider GAS_PROVIDER = |
|
||||||
new BesuPrivacyGasProvider(BigInteger.valueOf(1000)); |
|
||||||
private final String contractAddress; |
|
||||||
private final String encodedFunction; |
|
||||||
private final Credentials senderCredentials; |
|
||||||
private final Restriction restriction; |
|
||||||
private final Base64String privateFrom; |
|
||||||
private final List<Base64String> privateFor; |
|
||||||
private final Base64String privacyGroupId; |
|
||||||
|
|
||||||
public CallPrivateSmartContractFunction( |
|
||||||
final String contractAddress, |
|
||||||
final String encodedFunction, |
|
||||||
final String transactionSigningKey, |
|
||||||
final Restriction restriction, |
|
||||||
final String privateFrom, |
|
||||||
final List<String> privateFor) { |
|
||||||
this( |
|
||||||
contractAddress, |
|
||||||
encodedFunction, |
|
||||||
transactionSigningKey, |
|
||||||
restriction, |
|
||||||
privateFrom, |
|
||||||
privateFor, |
|
||||||
null); |
|
||||||
} |
|
||||||
|
|
||||||
public CallPrivateSmartContractFunction( |
|
||||||
final String contractAddress, |
|
||||||
final String encodedFunction, |
|
||||||
final String transactionSigningKey, |
|
||||||
final Restriction restriction, |
|
||||||
final String privateFrom, |
|
||||||
final String privacyGroupId) { |
|
||||||
this( |
|
||||||
contractAddress, |
|
||||||
encodedFunction, |
|
||||||
transactionSigningKey, |
|
||||||
restriction, |
|
||||||
privateFrom, |
|
||||||
null, |
|
||||||
privacyGroupId); |
|
||||||
} |
|
||||||
|
|
||||||
private CallPrivateSmartContractFunction( |
|
||||||
final String contractAddress, |
|
||||||
final String encodedFunction, |
|
||||||
final String transactionSigningKey, |
|
||||||
final Restriction restriction, |
|
||||||
final String privateFrom, |
|
||||||
final List<String> privateFor, |
|
||||||
final String privacyGroupId) { |
|
||||||
|
|
||||||
this.contractAddress = contractAddress; |
|
||||||
this.encodedFunction = encodedFunction; |
|
||||||
this.senderCredentials = Credentials.create(transactionSigningKey); |
|
||||||
this.restriction = restriction; |
|
||||||
this.privateFrom = Base64String.wrap(privateFrom); |
|
||||||
this.privateFor = privateFor != null ? Base64String.wrapList(privateFor) : null; |
|
||||||
this.privacyGroupId = privacyGroupId != null ? Base64String.wrap(privacyGroupId) : null; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public String execute(final NodeRequests node) { |
|
||||||
final PrivateTransactionManager privateTransactionManager; |
|
||||||
|
|
||||||
if (privateFor != null) { |
|
||||||
privateTransactionManager = |
|
||||||
node.privacy() |
|
||||||
.getTransactionManager(senderCredentials, privateFrom, privateFor, restriction); |
|
||||||
} else { |
|
||||||
privateTransactionManager = |
|
||||||
node.privacy() |
|
||||||
.getTransactionManager(senderCredentials, privateFrom, privacyGroupId, restriction); |
|
||||||
} |
|
||||||
|
|
||||||
try { |
|
||||||
return privateTransactionManager |
|
||||||
.sendTransaction( |
|
||||||
GAS_PROVIDER.getGasPrice(), |
|
||||||
GAS_PROVIDER.getGasLimit(), |
|
||||||
contractAddress, |
|
||||||
encodedFunction, |
|
||||||
null) |
|
||||||
.getTransactionHash(); |
|
||||||
} catch (final IOException e) { |
|
||||||
throw new RuntimeException(e); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,87 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.privacy.contract; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.NodeRequests; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; |
|
||||||
|
|
||||||
import java.lang.reflect.Method; |
|
||||||
import java.math.BigInteger; |
|
||||||
import java.util.List; |
|
||||||
|
|
||||||
import org.web3j.crypto.Credentials; |
|
||||||
import org.web3j.protocol.Web3j; |
|
||||||
import org.web3j.protocol.core.RemoteCall; |
|
||||||
import org.web3j.tx.Contract; |
|
||||||
import org.web3j.tx.PrivateTransactionManager; |
|
||||||
import org.web3j.tx.TransactionManager; |
|
||||||
import org.web3j.tx.gas.BesuPrivacyGasProvider; |
|
||||||
import org.web3j.tx.gas.ContractGasProvider; |
|
||||||
import org.web3j.utils.Base64String; |
|
||||||
import org.web3j.utils.Restriction; |
|
||||||
|
|
||||||
public class DeployPrivateSmartContractTransaction<T extends Contract> implements Transaction<T> { |
|
||||||
|
|
||||||
private static final BesuPrivacyGasProvider GAS_PROVIDER = |
|
||||||
new BesuPrivacyGasProvider(BigInteger.valueOf(1000)); |
|
||||||
private static final Object METHOD_IS_STATIC = null; |
|
||||||
|
|
||||||
private final Class<T> clazz; |
|
||||||
private final Credentials senderCredentials; |
|
||||||
private final Base64String privateFrom; |
|
||||||
private final List<Base64String> privateFor; |
|
||||||
|
|
||||||
public DeployPrivateSmartContractTransaction( |
|
||||||
final Class<T> clazz, |
|
||||||
final String transactionSigningKey, |
|
||||||
final String privateFrom, |
|
||||||
final List<String> privateFor) { |
|
||||||
this.clazz = clazz; |
|
||||||
this.senderCredentials = Credentials.create(transactionSigningKey); |
|
||||||
this.privateFrom = Base64String.wrap(privateFrom); |
|
||||||
this.privateFor = Base64String.wrapList(privateFor); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public T execute(final NodeRequests node) { |
|
||||||
|
|
||||||
final PrivateTransactionManager privateTransactionManager = |
|
||||||
node.privacy() |
|
||||||
.getTransactionManager( |
|
||||||
senderCredentials, privateFrom, privateFor, Restriction.RESTRICTED); |
|
||||||
|
|
||||||
try { |
|
||||||
final Method method = |
|
||||||
clazz.getMethod( |
|
||||||
"deploy", Web3j.class, TransactionManager.class, ContractGasProvider.class); |
|
||||||
|
|
||||||
final Object invoked = |
|
||||||
method.invoke( |
|
||||||
METHOD_IS_STATIC, |
|
||||||
node.privacy().getBesuClient(), |
|
||||||
privateTransactionManager, |
|
||||||
GAS_PROVIDER); |
|
||||||
|
|
||||||
return cast(invoked).send(); |
|
||||||
} catch (final Exception e) { |
|
||||||
throw new RuntimeException(e); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
@SuppressWarnings("unchecked") |
|
||||||
private RemoteCall<T> cast(final Object invokedMethod) { |
|
||||||
return (RemoteCall<T>) invokedMethod; |
|
||||||
} |
|
||||||
} |
|
@ -1,89 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.privacy.contract; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.NodeRequests; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; |
|
||||||
|
|
||||||
import java.lang.reflect.Method; |
|
||||||
import java.math.BigInteger; |
|
||||||
|
|
||||||
import org.web3j.crypto.Credentials; |
|
||||||
import org.web3j.protocol.Web3j; |
|
||||||
import org.web3j.protocol.core.RemoteCall; |
|
||||||
import org.web3j.tx.Contract; |
|
||||||
import org.web3j.tx.PrivateTransactionManager; |
|
||||||
import org.web3j.tx.TransactionManager; |
|
||||||
import org.web3j.tx.gas.BesuPrivacyGasProvider; |
|
||||||
import org.web3j.tx.gas.ContractGasProvider; |
|
||||||
import org.web3j.utils.Base64String; |
|
||||||
import org.web3j.utils.Restriction; |
|
||||||
|
|
||||||
public class DeployPrivateSmartContractWithPrivacyGroupIdTransaction<T extends Contract> |
|
||||||
implements Transaction<T> { |
|
||||||
|
|
||||||
private static final BesuPrivacyGasProvider GAS_PROVIDER = |
|
||||||
new BesuPrivacyGasProvider(BigInteger.valueOf(1000)); |
|
||||||
private static final Object METHOD_IS_STATIC = null; |
|
||||||
|
|
||||||
private final Class<T> clazz; |
|
||||||
private final Credentials senderCredentials; |
|
||||||
private final Restriction restriction; |
|
||||||
private final Base64String privateFrom; |
|
||||||
private final Base64String privacyGroupId; |
|
||||||
|
|
||||||
public DeployPrivateSmartContractWithPrivacyGroupIdTransaction( |
|
||||||
final Class<T> clazz, |
|
||||||
final String transactionSigningKey, |
|
||||||
final Restriction restriction, |
|
||||||
final String privateFrom, |
|
||||||
final String privacyGroupId) { |
|
||||||
this.clazz = clazz; |
|
||||||
this.senderCredentials = Credentials.create(transactionSigningKey); |
|
||||||
this.restriction = restriction; |
|
||||||
this.privateFrom = Base64String.wrap(privateFrom); |
|
||||||
this.privacyGroupId = Base64String.wrap(privacyGroupId); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public T execute(final NodeRequests node) { |
|
||||||
|
|
||||||
final PrivateTransactionManager privateTransactionManager = |
|
||||||
node.privacy() |
|
||||||
.getTransactionManager(senderCredentials, privateFrom, privacyGroupId, restriction); |
|
||||||
|
|
||||||
try { |
|
||||||
final Method method = |
|
||||||
clazz.getMethod( |
|
||||||
"deploy", Web3j.class, TransactionManager.class, ContractGasProvider.class); |
|
||||||
|
|
||||||
final Object invoked = |
|
||||||
method.invoke( |
|
||||||
METHOD_IS_STATIC, |
|
||||||
node.privacy().getBesuClient(), |
|
||||||
privateTransactionManager, |
|
||||||
GAS_PROVIDER); |
|
||||||
|
|
||||||
return cast(invoked).send(); |
|
||||||
} catch (final Exception e) { |
|
||||||
throw new RuntimeException(e); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
@SuppressWarnings("unchecked") |
|
||||||
private RemoteCall<T> cast(final Object invokedMethod) { |
|
||||||
return (RemoteCall<T>) invokedMethod; |
|
||||||
} |
|
||||||
} |
|
@ -1,87 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.privacy.contract; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.NodeRequests; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; |
|
||||||
|
|
||||||
import java.lang.reflect.Method; |
|
||||||
import java.math.BigInteger; |
|
||||||
import java.util.List; |
|
||||||
|
|
||||||
import org.web3j.crypto.Credentials; |
|
||||||
import org.web3j.protocol.Web3j; |
|
||||||
import org.web3j.tx.Contract; |
|
||||||
import org.web3j.tx.PrivateTransactionManager; |
|
||||||
import org.web3j.tx.TransactionManager; |
|
||||||
import org.web3j.tx.gas.BesuPrivacyGasProvider; |
|
||||||
import org.web3j.tx.gas.ContractGasProvider; |
|
||||||
import org.web3j.utils.Base64String; |
|
||||||
import org.web3j.utils.Restriction; |
|
||||||
|
|
||||||
public class LoadPrivateSmartContractTransaction<T extends Contract> implements Transaction<T> { |
|
||||||
private static final BesuPrivacyGasProvider GAS_PROVIDER = |
|
||||||
new BesuPrivacyGasProvider(BigInteger.valueOf(1000)); |
|
||||||
private static final Object METHOD_IS_STATIC = null; |
|
||||||
|
|
||||||
private final Class<T> clazz; |
|
||||||
private final Credentials senderCredentials; |
|
||||||
private final Base64String privateFrom; |
|
||||||
private final List<Base64String> privateFor; |
|
||||||
private final String contractAddress; |
|
||||||
|
|
||||||
public LoadPrivateSmartContractTransaction( |
|
||||||
final String contractAddress, |
|
||||||
final Class<T> clazz, |
|
||||||
final String transactionSigningKey, |
|
||||||
final String privateFrom, |
|
||||||
final List<String> privateFor) { |
|
||||||
|
|
||||||
this.contractAddress = contractAddress; |
|
||||||
this.clazz = clazz; |
|
||||||
this.senderCredentials = Credentials.create(transactionSigningKey); |
|
||||||
this.privateFrom = Base64String.wrap(privateFrom); |
|
||||||
this.privateFor = Base64String.wrapList(privateFor); |
|
||||||
} |
|
||||||
|
|
||||||
@SuppressWarnings("unchecked") |
|
||||||
@Override |
|
||||||
public T execute(final NodeRequests node) { |
|
||||||
final PrivateTransactionManager privateTransactionManager = |
|
||||||
node.privacy() |
|
||||||
.getTransactionManager( |
|
||||||
senderCredentials, privateFrom, privateFor, Restriction.RESTRICTED); |
|
||||||
|
|
||||||
try { |
|
||||||
final Method method = |
|
||||||
clazz.getMethod( |
|
||||||
"load", |
|
||||||
String.class, |
|
||||||
Web3j.class, |
|
||||||
TransactionManager.class, |
|
||||||
ContractGasProvider.class); |
|
||||||
|
|
||||||
return (T) |
|
||||||
method.invoke( |
|
||||||
METHOD_IS_STATIC, |
|
||||||
contractAddress, |
|
||||||
node.privacy().getBesuClient(), |
|
||||||
privateTransactionManager, |
|
||||||
GAS_PROVIDER); |
|
||||||
} catch (final Exception e) { |
|
||||||
throw new RuntimeException(e); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,88 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.privacy.contract; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.NodeRequests; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; |
|
||||||
|
|
||||||
import java.lang.reflect.Method; |
|
||||||
import java.math.BigInteger; |
|
||||||
|
|
||||||
import org.web3j.crypto.Credentials; |
|
||||||
import org.web3j.protocol.Web3j; |
|
||||||
import org.web3j.tx.Contract; |
|
||||||
import org.web3j.tx.PrivateTransactionManager; |
|
||||||
import org.web3j.tx.TransactionManager; |
|
||||||
import org.web3j.tx.gas.BesuPrivacyGasProvider; |
|
||||||
import org.web3j.tx.gas.ContractGasProvider; |
|
||||||
import org.web3j.utils.Base64String; |
|
||||||
import org.web3j.utils.Restriction; |
|
||||||
|
|
||||||
public class LoadPrivateSmartContractTransactionWithPrivacyGroupId<T extends Contract> |
|
||||||
implements Transaction<T> { |
|
||||||
|
|
||||||
private static final BesuPrivacyGasProvider GAS_PROVIDER = |
|
||||||
new BesuPrivacyGasProvider(BigInteger.valueOf(1000)); |
|
||||||
private static final Object METHOD_IS_STATIC = null; |
|
||||||
|
|
||||||
private final Class<T> clazz; |
|
||||||
private final Credentials senderCredentials; |
|
||||||
private final Base64String privateFrom; |
|
||||||
private final Base64String privacyGroupId; |
|
||||||
private final String contractAddress; |
|
||||||
|
|
||||||
public LoadPrivateSmartContractTransactionWithPrivacyGroupId( |
|
||||||
final String contractAddress, |
|
||||||
final Class<T> clazz, |
|
||||||
final String transactionSigningKey, |
|
||||||
final String privateFrom, |
|
||||||
final String privacyGroupId) { |
|
||||||
|
|
||||||
this.contractAddress = contractAddress; |
|
||||||
this.clazz = clazz; |
|
||||||
this.senderCredentials = Credentials.create(transactionSigningKey); |
|
||||||
this.privateFrom = Base64String.wrap(privateFrom); |
|
||||||
this.privacyGroupId = Base64String.wrap(privacyGroupId); |
|
||||||
} |
|
||||||
|
|
||||||
@SuppressWarnings("unchecked") |
|
||||||
@Override |
|
||||||
public T execute(final NodeRequests node) { |
|
||||||
final PrivateTransactionManager privateTransactionManager = |
|
||||||
node.privacy() |
|
||||||
.getTransactionManager( |
|
||||||
senderCredentials, privateFrom, privacyGroupId, Restriction.RESTRICTED); |
|
||||||
|
|
||||||
try { |
|
||||||
final Method method = |
|
||||||
clazz.getMethod( |
|
||||||
"load", |
|
||||||
String.class, |
|
||||||
Web3j.class, |
|
||||||
TransactionManager.class, |
|
||||||
ContractGasProvider.class); |
|
||||||
|
|
||||||
return (T) |
|
||||||
method.invoke( |
|
||||||
METHOD_IS_STATIC, |
|
||||||
contractAddress, |
|
||||||
node.privacy().getBesuClient(), |
|
||||||
privateTransactionManager, |
|
||||||
GAS_PROVIDER); |
|
||||||
} catch (final Exception e) { |
|
||||||
throw new RuntimeException(e); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,154 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.privacy.contract; |
|
||||||
|
|
||||||
import java.util.Arrays; |
|
||||||
import java.util.List; |
|
||||||
|
|
||||||
import org.web3j.tx.Contract; |
|
||||||
import org.web3j.utils.Restriction; |
|
||||||
|
|
||||||
public class PrivateContractTransactions { |
|
||||||
|
|
||||||
public <T extends Contract> |
|
||||||
DeployPrivateSmartContractWithPrivacyGroupIdTransaction<T> |
|
||||||
createSmartContractWithPrivacyGroupId( |
|
||||||
final Class<T> clazz, |
|
||||||
final String transactionSigningKey, |
|
||||||
final Restriction restriction, |
|
||||||
final String privateFrom, |
|
||||||
final String privacyGroupId) { |
|
||||||
return new DeployPrivateSmartContractWithPrivacyGroupIdTransaction<>( |
|
||||||
clazz, transactionSigningKey, restriction, privateFrom, privacyGroupId); |
|
||||||
} |
|
||||||
|
|
||||||
public <T extends Contract> |
|
||||||
DeployPrivateSmartContractWithPrivacyGroupIdTransaction<T> |
|
||||||
createSmartContractWithPrivacyGroupId( |
|
||||||
final Class<T> clazz, |
|
||||||
final String transactionSigningKey, |
|
||||||
final String privateFrom, |
|
||||||
final String privacyGroupId) { |
|
||||||
return new DeployPrivateSmartContractWithPrivacyGroupIdTransaction<>( |
|
||||||
clazz, transactionSigningKey, Restriction.RESTRICTED, privateFrom, privacyGroupId); |
|
||||||
} |
|
||||||
|
|
||||||
public <T extends Contract> DeployPrivateSmartContractTransaction<T> createSmartContract( |
|
||||||
final Class<T> clazz, |
|
||||||
final String transactionSigningKey, |
|
||||||
final String privateFrom, |
|
||||||
final String... privateFor) { |
|
||||||
return createSmartContract( |
|
||||||
clazz, transactionSigningKey, privateFrom, Arrays.asList(privateFor)); |
|
||||||
} |
|
||||||
|
|
||||||
public <T extends Contract> DeployPrivateSmartContractTransaction<T> createSmartContract( |
|
||||||
final Class<T> clazz, |
|
||||||
final String transactionSigningKey, |
|
||||||
final String privateFrom, |
|
||||||
final List<String> privateFor) { |
|
||||||
return new DeployPrivateSmartContractTransaction<>( |
|
||||||
clazz, transactionSigningKey, privateFrom, privateFor); |
|
||||||
} |
|
||||||
|
|
||||||
public CallPrivateSmartContractFunction callSmartContract( |
|
||||||
final String contractAddress, |
|
||||||
final String encodedFunction, |
|
||||||
final String transactionSigningKey, |
|
||||||
final Restriction restriction, |
|
||||||
final String privateFrom, |
|
||||||
final String... privateFor) { |
|
||||||
return callSmartContract( |
|
||||||
contractAddress, |
|
||||||
encodedFunction, |
|
||||||
transactionSigningKey, |
|
||||||
restriction, |
|
||||||
privateFrom, |
|
||||||
Arrays.asList(privateFor)); |
|
||||||
} |
|
||||||
|
|
||||||
public CallPrivateSmartContractFunction callSmartContract( |
|
||||||
final String contractAddress, |
|
||||||
final String encodedFunction, |
|
||||||
final String transactionSigningKey, |
|
||||||
final Restriction restriction, |
|
||||||
final String privateFrom, |
|
||||||
final List<String> privateFor) { |
|
||||||
return new CallPrivateSmartContractFunction( |
|
||||||
contractAddress, |
|
||||||
encodedFunction, |
|
||||||
transactionSigningKey, |
|
||||||
restriction, |
|
||||||
privateFrom, |
|
||||||
privateFor); |
|
||||||
} |
|
||||||
|
|
||||||
public CallPrivateSmartContractFunction callSmartContractWithPrivacyGroupId( |
|
||||||
final String contractAddress, |
|
||||||
final String encodedFunction, |
|
||||||
final String transactionSigningKey, |
|
||||||
final Restriction restriction, |
|
||||||
final String privateFrom, |
|
||||||
final String privacyGroupId) { |
|
||||||
return new CallPrivateSmartContractFunction( |
|
||||||
contractAddress, |
|
||||||
encodedFunction, |
|
||||||
transactionSigningKey, |
|
||||||
restriction, |
|
||||||
privateFrom, |
|
||||||
privacyGroupId); |
|
||||||
} |
|
||||||
|
|
||||||
public <T extends Contract> LoadPrivateSmartContractTransaction<T> loadSmartContract( |
|
||||||
final String contractAddress, |
|
||||||
final Class<T> clazz, |
|
||||||
final String transactionSigningKey, |
|
||||||
final String privateFrom, |
|
||||||
final String... privateFor) { |
|
||||||
return loadSmartContract( |
|
||||||
contractAddress, clazz, transactionSigningKey, privateFrom, Arrays.asList(privateFor)); |
|
||||||
} |
|
||||||
|
|
||||||
public <T extends Contract> LoadPrivateSmartContractTransaction<T> loadSmartContract( |
|
||||||
final String contractAddress, |
|
||||||
final Class<T> clazz, |
|
||||||
final String transactionSigningKey, |
|
||||||
final String privateFrom, |
|
||||||
final List<String> privateFor) { |
|
||||||
return new LoadPrivateSmartContractTransaction<>( |
|
||||||
contractAddress, clazz, transactionSigningKey, privateFrom, privateFor); |
|
||||||
} |
|
||||||
|
|
||||||
public <T extends Contract> |
|
||||||
LoadPrivateSmartContractTransactionWithPrivacyGroupId<T> loadSmartContractWithPrivacyGroupId( |
|
||||||
final String contractAddress, |
|
||||||
final Class<T> clazz, |
|
||||||
final String transactionSigningKey, |
|
||||||
final String privateFrom, |
|
||||||
final String privacyGroupId) { |
|
||||||
return new LoadPrivateSmartContractTransactionWithPrivacyGroupId<>( |
|
||||||
contractAddress, clazz, transactionSigningKey, privateFrom, privacyGroupId); |
|
||||||
} |
|
||||||
|
|
||||||
public CallOnchainPermissioningPrivateSmartContractFunction callOnchainPermissioningSmartContract( |
|
||||||
final String contractAddress, |
|
||||||
final String encodedFunction, |
|
||||||
final String transactionSigningKey, |
|
||||||
final String privateFrom, |
|
||||||
final String privacyGroupId) { |
|
||||||
return new CallOnchainPermissioningPrivateSmartContractFunction( |
|
||||||
contractAddress, encodedFunction, transactionSigningKey, privateFrom, privacyGroupId); |
|
||||||
} |
|
||||||
} |
|
@ -1,57 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.privacy.transaction; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.privacy.PrivacyNode; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.NodeRequests; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
import java.util.Arrays; |
|
||||||
import java.util.List; |
|
||||||
import java.util.stream.Collectors; |
|
||||||
|
|
||||||
import org.web3j.crypto.Credentials; |
|
||||||
import org.web3j.utils.Base64String; |
|
||||||
|
|
||||||
public class AddToFlexiblePrivacyGroupTransaction implements Transaction<String> { |
|
||||||
private final Base64String privacyGroupId; |
|
||||||
private final PrivacyNode adder; |
|
||||||
private final List<String> addresses; |
|
||||||
private final Credentials signer; |
|
||||||
|
|
||||||
public AddToFlexiblePrivacyGroupTransaction( |
|
||||||
final String privacyGroupId, |
|
||||||
final PrivacyNode adder, |
|
||||||
final Credentials signer, |
|
||||||
final PrivacyNode... nodes) { |
|
||||||
this.privacyGroupId = Base64String.wrap(privacyGroupId); |
|
||||||
this.adder = adder; |
|
||||||
this.signer = signer; |
|
||||||
this.addresses = |
|
||||||
Arrays.stream(nodes) |
|
||||||
.map(n -> n.getEnclave().getDefaultPublicKey()) |
|
||||||
.collect(Collectors.toList()); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public String execute(final NodeRequests node) { |
|
||||||
try { |
|
||||||
return node.privacy().privxAddToPrivacyGroup(privacyGroupId, adder, signer, addresses); |
|
||||||
} catch (final IOException e) { |
|
||||||
throw new RuntimeException(e); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,46 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.privacy.transaction; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.privacy.PrivacyNode; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.NodeRequests; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.PrivacyRequestFactory.PrivxCreatePrivacyGroupResponse; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
import java.util.List; |
|
||||||
|
|
||||||
public class CreateFlexiblePrivacyGroupTransaction |
|
||||||
implements Transaction<PrivxCreatePrivacyGroupResponse> { |
|
||||||
private final PrivacyNode creator; |
|
||||||
private final List<String> addresses; |
|
||||||
private final String privateFrom; |
|
||||||
|
|
||||||
CreateFlexiblePrivacyGroupTransaction( |
|
||||||
final PrivacyNode creator, final String privateFrom, final List<String> addresses) { |
|
||||||
this.creator = creator; |
|
||||||
this.addresses = addresses; |
|
||||||
this.privateFrom = privateFrom; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public PrivxCreatePrivacyGroupResponse execute(final NodeRequests node) { |
|
||||||
try { |
|
||||||
return node.privacy().privxCreatePrivacyGroup(creator, privateFrom, addresses); |
|
||||||
} catch (final IOException e) { |
|
||||||
throw new RuntimeException(e); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,52 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.privacy.transaction; |
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.NodeRequests; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.PrivacyRequestFactory; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.PrivacyRequestFactory.PrivxFindPrivacyGroupResponse; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
import java.util.List; |
|
||||||
import java.util.stream.Collectors; |
|
||||||
|
|
||||||
import org.web3j.utils.Base64String; |
|
||||||
|
|
||||||
public class FindFlexiblePrivacyGroupTransaction |
|
||||||
implements Transaction<List<PrivacyRequestFactory.FlexiblePrivacyGroup>> { |
|
||||||
private final List<Base64String> nodes; |
|
||||||
|
|
||||||
public FindFlexiblePrivacyGroupTransaction(final List<String> nodeEnclaveKeys) { |
|
||||||
this.nodes = nodeEnclaveKeys.stream().map(Base64String::wrap).collect(Collectors.toList()); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public List<PrivacyRequestFactory.FlexiblePrivacyGroup> execute(final NodeRequests node) { |
|
||||||
try { |
|
||||||
PrivxFindPrivacyGroupResponse result = |
|
||||||
node.privacy().privxFindFlexiblePrivacyGroup(nodes).send(); |
|
||||||
assertThat(result).isNotNull(); |
|
||||||
if (result.hasError()) { |
|
||||||
throw new RuntimeException(result.getError().getMessage()); |
|
||||||
} |
|
||||||
return result.getGroups(); |
|
||||||
} catch (final IOException e) { |
|
||||||
throw new RuntimeException(e); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,45 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.privacy.transaction; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.NodeRequests; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
import java.util.List; |
|
||||||
import java.util.stream.Collectors; |
|
||||||
|
|
||||||
import org.web3j.protocol.besu.Besu; |
|
||||||
import org.web3j.protocol.besu.response.privacy.PrivacyGroup; |
|
||||||
import org.web3j.utils.Base64String; |
|
||||||
|
|
||||||
public class FindPrivacyGroupTransaction implements Transaction<List<PrivacyGroup>> { |
|
||||||
private final List<Base64String> nodes; |
|
||||||
|
|
||||||
public FindPrivacyGroupTransaction(final List<String> nodeEnclaveKeys) { |
|
||||||
|
|
||||||
this.nodes = nodeEnclaveKeys.stream().map(Base64String::wrap).collect(Collectors.toList()); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public List<PrivacyGroup> execute(final NodeRequests node) { |
|
||||||
final Besu besu = node.privacy().getBesuClient(); |
|
||||||
try { |
|
||||||
return besu.privFindPrivacyGroup(nodes).send().getGroups(); |
|
||||||
} catch (IOException e) { |
|
||||||
throw new RuntimeException(e); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,56 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.privacy.transaction; |
|
||||||
|
|
||||||
import static org.hyperledger.besu.ethereum.core.PrivacyParameters.DEFAULT_PRIVACY; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.NodeRequests; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
import java.math.BigInteger; |
|
||||||
import java.util.ArrayList; |
|
||||||
import java.util.List; |
|
||||||
|
|
||||||
import org.web3j.protocol.besu.Besu; |
|
||||||
import org.web3j.protocol.core.DefaultBlockParameter; |
|
||||||
import org.web3j.protocol.core.methods.response.EthBlock; |
|
||||||
|
|
||||||
public class GetAllPrivateMarkerTransactionHashes implements Transaction<List<String>> { |
|
||||||
@Override |
|
||||||
public List<String> execute(final NodeRequests node) { |
|
||||||
final Besu besu = node.privacy().getBesuClient(); |
|
||||||
final List<String> toReturn = new ArrayList<>(); |
|
||||||
try { |
|
||||||
final long blockchainHeight = besu.ethBlockNumber().send().getBlockNumber().longValueExact(); |
|
||||||
for (long i = 0; i <= blockchainHeight; i++) { |
|
||||||
besu.ethGetBlockByNumber(DefaultBlockParameter.valueOf(BigInteger.valueOf(i)), true) |
|
||||||
.send() |
|
||||||
.getBlock() |
|
||||||
.getTransactions() |
|
||||||
.forEach( |
|
||||||
t -> { |
|
||||||
if (((EthBlock.TransactionObject) t).getTo().equals(DEFAULT_PRIVACY.toString())) { |
|
||||||
toReturn.add(((EthBlock.TransactionObject) t).getHash()); |
|
||||||
} |
|
||||||
}); |
|
||||||
} |
|
||||||
} catch (IOException e) { |
|
||||||
throw new RuntimeException(e); |
|
||||||
} |
|
||||||
|
|
||||||
return toReturn; |
|
||||||
} |
|
||||||
} |
|
@ -1,47 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.privacy.transaction; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.privacy.PrivacyNode; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.NodeRequests; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
import org.web3j.crypto.Credentials; |
|
||||||
import org.web3j.protocol.exceptions.TransactionException; |
|
||||||
import org.web3j.utils.Base64String; |
|
||||||
|
|
||||||
public class LockFlexiblePrivacyGroupTransaction implements Transaction<String> { |
|
||||||
private final Base64String privacyGroupId; |
|
||||||
private final PrivacyNode locker; |
|
||||||
private final Credentials signer; |
|
||||||
|
|
||||||
public LockFlexiblePrivacyGroupTransaction( |
|
||||||
final String privacyGroupId, final PrivacyNode locker, final Credentials signer) { |
|
||||||
this.privacyGroupId = Base64String.wrap(privacyGroupId); |
|
||||||
this.locker = locker; |
|
||||||
this.signer = signer; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public String execute(final NodeRequests node) { |
|
||||||
try { |
|
||||||
return node.privacy().privxLockPrivacyGroup(locker, privacyGroupId, signer); |
|
||||||
} catch (final IOException | TransactionException e) { |
|
||||||
throw new RuntimeException(e); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,31 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.privacy.transaction; |
|
||||||
|
|
||||||
import org.hyperledger.besu.crypto.SecureRandomProvider; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.NodeRequests; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; |
|
||||||
|
|
||||||
import org.apache.tuweni.bytes.Bytes; |
|
||||||
|
|
||||||
public class PluginCreateRandomPrivacyGroupIdTransaction implements Transaction<String> { |
|
||||||
|
|
||||||
@Override |
|
||||||
public String execute(final NodeRequests node) { |
|
||||||
final byte[] bytes = new byte[32]; |
|
||||||
SecureRandomProvider.createSecureRandom().nextBytes(bytes); |
|
||||||
return Bytes.wrap(bytes).toBase64String(); |
|
||||||
} |
|
||||||
} |
|
@ -1,40 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.privacy.transaction; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.NodeRequests; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
public class PrivDistributeTransactionTransaction implements Transaction<String> { |
|
||||||
private final String signedPrivateTransaction; |
|
||||||
|
|
||||||
public PrivDistributeTransactionTransaction(final String signedPrivateTransaction) { |
|
||||||
this.signedPrivateTransaction = signedPrivateTransaction; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public String execute(final NodeRequests node) { |
|
||||||
try { |
|
||||||
return node.privacy() |
|
||||||
.privDistributeTransaction(signedPrivateTransaction) |
|
||||||
.send() |
|
||||||
.getTransactionKey(); |
|
||||||
} catch (final IOException e) { |
|
||||||
throw new RuntimeException(e); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,172 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.privacy.transaction; |
|
||||||
|
|
||||||
import org.hyperledger.besu.datatypes.Address; |
|
||||||
import org.hyperledger.besu.datatypes.Hash; |
|
||||||
import org.hyperledger.besu.ethereum.privacy.PrivacyGroupUtil; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.privacy.PrivacyNode; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.privacy.condition.PrivGetTransactionReceiptTransaction; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.privacy.util.LogFilterJsonParameter; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.EeaSendRawTransactionTransaction; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.PrivCallTransaction; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.PrivDebugGetStateRoot; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.PrivGetCodeTransaction; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.PrivGetLogsTransaction; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.PrivGetTransaction; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.PrivTraceTransaction; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.filter.PrivGetFilterChangesTransaction; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.filter.PrivGetFilterLogsTransaction; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.filter.PrivNewFilterTransaction; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.filter.PrivUninstallFilterTransaction; |
|
||||||
|
|
||||||
import java.util.Arrays; |
|
||||||
import java.util.List; |
|
||||||
import java.util.stream.Collectors; |
|
||||||
|
|
||||||
import org.apache.tuweni.bytes.Bytes; |
|
||||||
import org.apache.tuweni.bytes.Bytes32; |
|
||||||
import org.web3j.crypto.Credentials; |
|
||||||
import org.web3j.tx.Contract; |
|
||||||
|
|
||||||
public class PrivacyTransactions { |
|
||||||
|
|
||||||
public PrivGetTransactionReceiptTransaction getPrivateTransactionReceipt( |
|
||||||
final String transactionHash) { |
|
||||||
return new PrivGetTransactionReceiptTransaction(transactionHash); |
|
||||||
} |
|
||||||
|
|
||||||
public RestrictedCreatePrivacyGroupTransaction createPrivacyGroup( |
|
||||||
final String name, final String description, final PrivacyNode... nodes) { |
|
||||||
return new RestrictedCreatePrivacyGroupTransaction(name, description, nodes); |
|
||||||
} |
|
||||||
|
|
||||||
public CreateFlexiblePrivacyGroupTransaction createFlexiblePrivacyGroup( |
|
||||||
final PrivacyNode creator, |
|
||||||
final String privateFrom, |
|
||||||
final List<String> addresses, |
|
||||||
final String token) { |
|
||||||
creator.getBesu().useAuthenticationTokenInHeaderForJsonRpc(token); |
|
||||||
return new CreateFlexiblePrivacyGroupTransaction(creator, privateFrom, addresses); |
|
||||||
} |
|
||||||
|
|
||||||
public CreateFlexiblePrivacyGroupTransaction createFlexiblePrivacyGroup( |
|
||||||
final PrivacyNode creator, final String privateFrom, final List<String> addresses) { |
|
||||||
return new CreateFlexiblePrivacyGroupTransaction(creator, privateFrom, addresses); |
|
||||||
} |
|
||||||
|
|
||||||
public AddToFlexiblePrivacyGroupTransaction addToPrivacyGroup( |
|
||||||
final String privacyGroupId, |
|
||||||
final PrivacyNode adder, |
|
||||||
final Credentials signer, |
|
||||||
final PrivacyNode... nodes) { |
|
||||||
return new AddToFlexiblePrivacyGroupTransaction(privacyGroupId, adder, signer, nodes); |
|
||||||
} |
|
||||||
|
|
||||||
public LockFlexiblePrivacyGroupTransaction privxLockPrivacyGroupAndCheck( |
|
||||||
final String privacyGroupId, final PrivacyNode locker, final Credentials signer) { |
|
||||||
return new LockFlexiblePrivacyGroupTransaction(privacyGroupId, locker, signer); |
|
||||||
} |
|
||||||
|
|
||||||
public UnlockFlexiblePrivacyGroupTransaction privxUnlockPrivacyGroupAndCheck( |
|
||||||
final String privacyGroupId, final PrivacyNode locker, final Credentials signer) { |
|
||||||
return new UnlockFlexiblePrivacyGroupTransaction(privacyGroupId, locker, signer); |
|
||||||
} |
|
||||||
|
|
||||||
public FindPrivacyGroupTransaction findPrivacyGroup(final List<String> nodes) { |
|
||||||
return new FindPrivacyGroupTransaction(nodes); |
|
||||||
} |
|
||||||
|
|
||||||
public FindFlexiblePrivacyGroupTransaction findFlexiblePrivacyGroup(final List<String> nodes) { |
|
||||||
return new FindFlexiblePrivacyGroupTransaction(nodes); |
|
||||||
} |
|
||||||
|
|
||||||
public PrivDistributeTransactionTransaction privDistributeTransaction( |
|
||||||
final String signedPrivateTransaction) { |
|
||||||
return new PrivDistributeTransactionTransaction(signedPrivateTransaction); |
|
||||||
} |
|
||||||
|
|
||||||
public PrivCallTransaction privCall( |
|
||||||
final String privacyGroupId, final Contract contract, final String encoded) { |
|
||||||
return new PrivCallTransaction(privacyGroupId, contract, encoded); |
|
||||||
} |
|
||||||
|
|
||||||
public PrivGetTransaction privGetTransaction(final String transactionHash) { |
|
||||||
return new PrivGetTransaction(transactionHash); |
|
||||||
} |
|
||||||
|
|
||||||
public PrivGetCodeTransaction privGetCode( |
|
||||||
final String privacyGroupId, final Address contractAddress, final String blockParameter) { |
|
||||||
return new PrivGetCodeTransaction(privacyGroupId, contractAddress, blockParameter); |
|
||||||
} |
|
||||||
|
|
||||||
public PrivGetLogsTransaction privGetLogs( |
|
||||||
final String privacyGroupId, final LogFilterJsonParameter filterParameter) { |
|
||||||
return new PrivGetLogsTransaction(privacyGroupId, filterParameter); |
|
||||||
} |
|
||||||
|
|
||||||
public PrivTraceTransaction privTraceTransaction( |
|
||||||
final String privacyGroupId, final Hash transactionHash) { |
|
||||||
return new PrivTraceTransaction(privacyGroupId, transactionHash); |
|
||||||
} |
|
||||||
|
|
||||||
public RemoveFromFlexiblePrivacyGroupTransaction removeFromPrivacyGroup( |
|
||||||
final String privacyGroupId, |
|
||||||
final String remover, |
|
||||||
final Credentials signer, |
|
||||||
final String memberToRemove) { |
|
||||||
return new RemoveFromFlexiblePrivacyGroupTransaction( |
|
||||||
privacyGroupId, remover, signer, memberToRemove); |
|
||||||
} |
|
||||||
|
|
||||||
public EeaSendRawTransactionTransaction sendRawTransaction(final String transaction) { |
|
||||||
return new EeaSendRawTransactionTransaction(transaction); |
|
||||||
} |
|
||||||
|
|
||||||
public PrivNewFilterTransaction newFilter( |
|
||||||
final String privacyGroupId, final LogFilterJsonParameter filterParameter) { |
|
||||||
return new PrivNewFilterTransaction(privacyGroupId, filterParameter); |
|
||||||
} |
|
||||||
|
|
||||||
public PrivUninstallFilterTransaction uninstallFilter( |
|
||||||
final String privacyGroupId, final String filterId) { |
|
||||||
return new PrivUninstallFilterTransaction(privacyGroupId, filterId); |
|
||||||
} |
|
||||||
|
|
||||||
public PrivGetFilterLogsTransaction getFilterLogs( |
|
||||||
final String privacyGroupId, final String filterId) { |
|
||||||
return new PrivGetFilterLogsTransaction(privacyGroupId, filterId); |
|
||||||
} |
|
||||||
|
|
||||||
public PrivGetFilterChangesTransaction getFilterChanges( |
|
||||||
final String privacyGroupId, final String filterId) { |
|
||||||
return new PrivGetFilterChangesTransaction(privacyGroupId, filterId); |
|
||||||
} |
|
||||||
|
|
||||||
public PrivDebugGetStateRoot debugGetStateRoot( |
|
||||||
final String privacyGroupId, final String blockParam) { |
|
||||||
return new PrivDebugGetStateRoot(privacyGroupId, blockParam); |
|
||||||
} |
|
||||||
|
|
||||||
public String getLegacyPrivacyGroupId(final String privateFrom, final String... privateFor) { |
|
||||||
|
|
||||||
final Bytes32 privacyGroupId = |
|
||||||
PrivacyGroupUtil.calculateEeaPrivacyGroupId( |
|
||||||
Bytes.fromBase64String(privateFrom), |
|
||||||
Arrays.stream(privateFor).map(Bytes::fromBase64String).collect(Collectors.toList())); |
|
||||||
|
|
||||||
return privacyGroupId.toBase64String(); |
|
||||||
} |
|
||||||
} |
|
@ -1,50 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.privacy.transaction; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.NodeRequests; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
import org.web3j.crypto.Credentials; |
|
||||||
import org.web3j.utils.Base64String; |
|
||||||
|
|
||||||
public class RemoveFromFlexiblePrivacyGroupTransaction implements Transaction<String> { |
|
||||||
private final Base64String privacyGroupId; |
|
||||||
private final String remover; |
|
||||||
private final String toRemove; |
|
||||||
private final Credentials signer; |
|
||||||
|
|
||||||
public RemoveFromFlexiblePrivacyGroupTransaction( |
|
||||||
final String privacyGroupId, |
|
||||||
final String remover, |
|
||||||
final Credentials signer, |
|
||||||
final String toRemove) { |
|
||||||
this.privacyGroupId = Base64String.wrap(privacyGroupId); |
|
||||||
this.remover = remover; |
|
||||||
this.signer = signer; |
|
||||||
this.toRemove = toRemove; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public String execute(final NodeRequests node) { |
|
||||||
try { |
|
||||||
return node.privacy().privxRemoveFromPrivacyGroup(privacyGroupId, remover, signer, toRemove); |
|
||||||
} catch (final IOException e) { |
|
||||||
throw new RuntimeException(e); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,60 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.privacy.transaction; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.privacy.PrivacyNode; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.NodeRequests; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
import java.util.Arrays; |
|
||||||
import java.util.List; |
|
||||||
import java.util.stream.Collectors; |
|
||||||
|
|
||||||
import org.web3j.protocol.besu.Besu; |
|
||||||
import org.web3j.protocol.besu.response.privacy.PrivCreatePrivacyGroup; |
|
||||||
import org.web3j.utils.Base64String; |
|
||||||
|
|
||||||
public class RestrictedCreatePrivacyGroupTransaction implements Transaction<String> { |
|
||||||
private final String name; |
|
||||||
private final String description; |
|
||||||
private final List<Base64String> addresses; |
|
||||||
|
|
||||||
public RestrictedCreatePrivacyGroupTransaction( |
|
||||||
final String name, final String description, final PrivacyNode... nodes) { |
|
||||||
this.name = name; |
|
||||||
this.description = description; |
|
||||||
this.addresses = |
|
||||||
Arrays.stream(nodes) |
|
||||||
.map(n -> Base64String.wrap(n.getEnclave().getDefaultPublicKey())) |
|
||||||
.collect(Collectors.toList()); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public String execute(final NodeRequests node) { |
|
||||||
final Besu besu = node.privacy().getBesuClient(); |
|
||||||
try { |
|
||||||
final PrivCreatePrivacyGroup result = |
|
||||||
besu.privCreatePrivacyGroup(addresses, name, description).send(); |
|
||||||
if (result.hasError()) { |
|
||||||
throw new RuntimeException(result.getError().getMessage()); |
|
||||||
} else { |
|
||||||
return result.getPrivacyGroupId().toString(); |
|
||||||
} |
|
||||||
} catch (final IOException e) { |
|
||||||
throw new RuntimeException(e); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,47 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.privacy.transaction; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.privacy.PrivacyNode; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.NodeRequests; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
import org.web3j.crypto.Credentials; |
|
||||||
import org.web3j.protocol.exceptions.TransactionException; |
|
||||||
import org.web3j.utils.Base64String; |
|
||||||
|
|
||||||
public class UnlockFlexiblePrivacyGroupTransaction implements Transaction<String> { |
|
||||||
private final Base64String privacyGroupId; |
|
||||||
private final PrivacyNode locker; |
|
||||||
private final Credentials signer; |
|
||||||
|
|
||||||
public UnlockFlexiblePrivacyGroupTransaction( |
|
||||||
final String privacyGroupId, final PrivacyNode locker, final Credentials signer) { |
|
||||||
this.privacyGroupId = Base64String.wrap(privacyGroupId); |
|
||||||
this.locker = locker; |
|
||||||
this.signer = signer; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public String execute(final NodeRequests node) { |
|
||||||
try { |
|
||||||
return node.privacy().privxUnlockPrivacyGroup(locker, privacyGroupId, signer); |
|
||||||
} catch (final IOException | TransactionException e) { |
|
||||||
throw new RuntimeException(e); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,59 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.privacy.util; |
|
||||||
|
|
||||||
import java.util.List; |
|
||||||
|
|
||||||
public class LogFilterJsonParameter { |
|
||||||
|
|
||||||
private final String fromBlock; |
|
||||||
private final String toBlock; |
|
||||||
private final List<String> addresses; |
|
||||||
private final List<List<String>> topics; |
|
||||||
private final String blockhash; |
|
||||||
|
|
||||||
public LogFilterJsonParameter( |
|
||||||
final String fromBlock, |
|
||||||
final String toBlock, |
|
||||||
final List<String> addresses, |
|
||||||
final List<List<String>> topics, |
|
||||||
final String blockhash) { |
|
||||||
this.fromBlock = fromBlock; |
|
||||||
this.toBlock = toBlock; |
|
||||||
this.addresses = addresses; |
|
||||||
this.topics = topics; |
|
||||||
this.blockhash = blockhash; |
|
||||||
} |
|
||||||
|
|
||||||
public String getFromBlock() { |
|
||||||
return fromBlock; |
|
||||||
} |
|
||||||
|
|
||||||
public String getToBlock() { |
|
||||||
return toBlock; |
|
||||||
} |
|
||||||
|
|
||||||
public List<String> getAddresses() { |
|
||||||
return addresses; |
|
||||||
} |
|
||||||
|
|
||||||
public List<List<String>> getTopics() { |
|
||||||
return topics; |
|
||||||
} |
|
||||||
|
|
||||||
public String getBlockhash() { |
|
||||||
return blockhash; |
|
||||||
} |
|
||||||
} |
|
@ -1,47 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy; |
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat; |
|
||||||
|
|
||||||
import org.hyperledger.besu.datatypes.Hash; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.NodeRequests; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
public class EeaSendRawTransactionTransaction implements Transaction<Hash> { |
|
||||||
|
|
||||||
final String transaction; |
|
||||||
|
|
||||||
public EeaSendRawTransactionTransaction(final String transaction) { |
|
||||||
this.transaction = transaction; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public Hash execute(final NodeRequests node) { |
|
||||||
try { |
|
||||||
final PrivacyRequestFactory.SendRawTransactionResponse result = |
|
||||||
node.privacy().eeaSendRawTransaction(transaction).send(); |
|
||||||
assertThat(result).isNotNull(); |
|
||||||
if (result.hasError()) { |
|
||||||
throw new RuntimeException(result.getError().getMessage()); |
|
||||||
} |
|
||||||
return result.getResult(); |
|
||||||
} catch (final IOException e) { |
|
||||||
throw new RuntimeException(e); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,64 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy; |
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.NodeRequests; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
import org.web3j.protocol.core.methods.response.EthCall; |
|
||||||
import org.web3j.tx.Contract; |
|
||||||
|
|
||||||
public class PrivCallTransaction implements Transaction<EthCall> { |
|
||||||
|
|
||||||
private final String privacyGroupId; |
|
||||||
private final Contract contract; |
|
||||||
private final String encoded; |
|
||||||
private final String blockNumberLatestPending; |
|
||||||
|
|
||||||
public PrivCallTransaction( |
|
||||||
final String privacyGroupId, final Contract contract, final String encoded) { |
|
||||||
this(privacyGroupId, contract, encoded, "latest"); |
|
||||||
} |
|
||||||
|
|
||||||
public PrivCallTransaction( |
|
||||||
final String privacyGroupId, |
|
||||||
final Contract contract, |
|
||||||
final String encoded, |
|
||||||
final String blockNumberLatestPending) { |
|
||||||
this.privacyGroupId = privacyGroupId; |
|
||||||
this.contract = contract; |
|
||||||
this.encoded = encoded; |
|
||||||
this.blockNumberLatestPending = blockNumberLatestPending; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public EthCall execute(final NodeRequests node) { |
|
||||||
try { |
|
||||||
final EthCall response = |
|
||||||
node.privacy() |
|
||||||
.privCall(privacyGroupId, contract, encoded, blockNumberLatestPending) |
|
||||||
.send(); |
|
||||||
assertThat(response).as("check response is not null").isNotNull(); |
|
||||||
assertThat(response.getResult()).as("check result in response isn't null").isNotNull(); |
|
||||||
return response; |
|
||||||
} catch (final IOException e) { |
|
||||||
throw new RuntimeException(e); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,46 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy; |
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat; |
|
||||||
|
|
||||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.privacy.parameters.CreatePrivacyGroupParameter; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.NodeRequests; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
import java.util.List; |
|
||||||
|
|
||||||
public class PrivCreatePrivacyGroupTransaction implements Transaction<String> { |
|
||||||
|
|
||||||
final CreatePrivacyGroupParameter params; |
|
||||||
|
|
||||||
public PrivCreatePrivacyGroupTransaction( |
|
||||||
final List<String> addresses, final String groupName, final String groupDescription) { |
|
||||||
this.params = new CreatePrivacyGroupParameter(addresses, groupName, groupDescription); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public String execute(final NodeRequests node) { |
|
||||||
try { |
|
||||||
final PrivacyRequestFactory.CreatePrivacyGroupResponse result = |
|
||||||
node.privacy().privCreatePrivacyGroup(params).send(); |
|
||||||
assertThat(result).isNotNull(); |
|
||||||
return result.getResult(); |
|
||||||
} catch (final IOException e) { |
|
||||||
throw new RuntimeException(e); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,45 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy; |
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.NodeRequests; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
public class PrivDebugGetStateRoot implements Transaction<PrivacyRequestFactory.DebugGetStateRoot> { |
|
||||||
|
|
||||||
private final String privacyGroupId; |
|
||||||
private final String blockParam; |
|
||||||
|
|
||||||
public PrivDebugGetStateRoot(final String privacyGroupId, final String blockParam) { |
|
||||||
this.privacyGroupId = privacyGroupId; |
|
||||||
this.blockParam = blockParam; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public PrivacyRequestFactory.DebugGetStateRoot execute(final NodeRequests node) { |
|
||||||
try { |
|
||||||
final PrivacyRequestFactory.DebugGetStateRoot response = |
|
||||||
node.privacy().privDebugGetStateRoot(privacyGroupId, blockParam).send(); |
|
||||||
assertThat(response).as("check response is not null").isNotNull(); |
|
||||||
return response; |
|
||||||
} catch (final IOException e) { |
|
||||||
throw new RuntimeException(e); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,46 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy; |
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.NodeRequests; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
public class PrivDeletePrivacyGroupTransaction implements Transaction<String> { |
|
||||||
|
|
||||||
final String transactionHash; |
|
||||||
|
|
||||||
public PrivDeletePrivacyGroupTransaction(final String transactionHash) { |
|
||||||
this.transactionHash = transactionHash; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public String execute(final NodeRequests node) { |
|
||||||
try { |
|
||||||
final PrivacyRequestFactory.DeletePrivacyGroupResponse result = |
|
||||||
node.privacy().privDeletePrivacyGroup(transactionHash).send(); |
|
||||||
assertThat(result).isNotNull(); |
|
||||||
if (result.hasError()) { |
|
||||||
throw new RuntimeException(result.getError().getMessage()); |
|
||||||
} |
|
||||||
return result.getResult(); |
|
||||||
} catch (final IOException e) { |
|
||||||
throw new RuntimeException(e); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,46 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy; |
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.NodeRequests; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
public class PrivDistributeRawTransactionTransaction implements Transaction<String> { |
|
||||||
|
|
||||||
final String transaction; |
|
||||||
|
|
||||||
public PrivDistributeRawTransactionTransaction(final String transaction) { |
|
||||||
this.transaction = transaction; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public String execute(final NodeRequests node) { |
|
||||||
try { |
|
||||||
final PrivacyRequestFactory.PrivDistributeTransactionResponse result = |
|
||||||
node.privacy().privDistributeTransaction(transaction).send(); |
|
||||||
assertThat(result).isNotNull(); |
|
||||||
if (result.hasError()) { |
|
||||||
throw new RuntimeException(result.getError().getMessage()); |
|
||||||
} |
|
||||||
return result.getTransactionKey(); |
|
||||||
} catch (final IOException e) { |
|
||||||
throw new RuntimeException(e); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,47 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy; |
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat; |
|
||||||
|
|
||||||
import org.hyperledger.besu.enclave.types.PrivacyGroup; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.NodeRequests; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
public class PrivFindPrivacyGroupTransaction implements Transaction<PrivacyGroup[]> { |
|
||||||
|
|
||||||
final String[] groupMembers; |
|
||||||
|
|
||||||
public PrivFindPrivacyGroupTransaction(final String[] groupMembers) { |
|
||||||
this.groupMembers = groupMembers; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public PrivacyGroup[] execute(final NodeRequests node) { |
|
||||||
try { |
|
||||||
final PrivacyRequestFactory.FindPrivacyGroupResponse result = |
|
||||||
node.privacy().privFindPrivacyGroup(groupMembers).send(); |
|
||||||
assertThat(result).isNotNull(); |
|
||||||
if (result.hasError()) { |
|
||||||
throw new RuntimeException(result.getError().getMessage()); |
|
||||||
} |
|
||||||
return result.getResult(); |
|
||||||
} catch (final IOException e) { |
|
||||||
throw new RuntimeException(e); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,54 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy; |
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat; |
|
||||||
|
|
||||||
import org.hyperledger.besu.datatypes.Address; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.NodeRequests; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
import org.apache.tuweni.bytes.Bytes; |
|
||||||
|
|
||||||
public class PrivGetCodeTransaction implements Transaction<Bytes> { |
|
||||||
|
|
||||||
private final String privacyGroupId; |
|
||||||
private final Address contractAddress; |
|
||||||
private final String blockParameter; |
|
||||||
|
|
||||||
public PrivGetCodeTransaction( |
|
||||||
final String privacyGroupId, final Address contractAddress, final String blockParameter) { |
|
||||||
this.privacyGroupId = privacyGroupId; |
|
||||||
this.contractAddress = contractAddress; |
|
||||||
this.blockParameter = blockParameter; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public Bytes execute(final NodeRequests node) { |
|
||||||
try { |
|
||||||
final PrivacyRequestFactory.GetCodeResponse response = |
|
||||||
node.privacy() |
|
||||||
.privGetCode(privacyGroupId, contractAddress.toHexString(), blockParameter) |
|
||||||
.send(); |
|
||||||
assertThat(response).as("check response is not null").isNotNull(); |
|
||||||
assertThat(response.getResult()).as("check code in response isn't null").isNotNull(); |
|
||||||
return Bytes.fromHexString(response.getResult()); |
|
||||||
} catch (final IOException e) { |
|
||||||
throw new RuntimeException(e); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,47 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy; |
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.NodeRequests; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
public class PrivGetEeaTransactionCountTransaction implements Transaction<Integer> { |
|
||||||
|
|
||||||
private final Object[] params; |
|
||||||
|
|
||||||
public PrivGetEeaTransactionCountTransaction( |
|
||||||
final String accountAddress, final String privateFrom, final String[] privateFor) { |
|
||||||
this.params = new Object[] {accountAddress, privateFrom, privateFor}; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public Integer execute(final NodeRequests node) { |
|
||||||
try { |
|
||||||
final PrivacyRequestFactory.GetTransactionCountResponse result = |
|
||||||
node.privacy().privGetEeaTransactionCount(params).send(); |
|
||||||
assertThat(result).isNotNull(); |
|
||||||
if (result.hasError()) { |
|
||||||
throw new RuntimeException(result.getError().getMessage()); |
|
||||||
} |
|
||||||
return result.getCount(); |
|
||||||
} catch (final IOException e) { |
|
||||||
throw new RuntimeException(e); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,54 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy; |
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.privacy.util.LogFilterJsonParameter; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.NodeRequests; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
import java.util.List; |
|
||||||
|
|
||||||
import org.web3j.protocol.core.methods.response.EthLog; |
|
||||||
import org.web3j.protocol.core.methods.response.EthLog.LogResult; |
|
||||||
|
|
||||||
@SuppressWarnings("rawtypes") |
|
||||||
public class PrivGetLogsTransaction implements Transaction<List<LogResult>> { |
|
||||||
|
|
||||||
private final String privacyGroupId; |
|
||||||
private final LogFilterJsonParameter filterParameter; |
|
||||||
|
|
||||||
public PrivGetLogsTransaction( |
|
||||||
final String privacyGroupId, final LogFilterJsonParameter filterParameter) { |
|
||||||
this.privacyGroupId = privacyGroupId; |
|
||||||
this.filterParameter = filterParameter; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public List<LogResult> execute(final NodeRequests node) { |
|
||||||
try { |
|
||||||
final EthLog response = node.privacy().privGetLogs(privacyGroupId, filterParameter).send(); |
|
||||||
|
|
||||||
assertThat(response).as("check response is not null").isNotNull(); |
|
||||||
assertThat(response.getResult()).as("check result in response isn't null").isNotNull(); |
|
||||||
|
|
||||||
return response.getLogs(); |
|
||||||
} catch (final IOException e) { |
|
||||||
throw new RuntimeException(e); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,38 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy; |
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat; |
|
||||||
|
|
||||||
import org.hyperledger.besu.datatypes.Address; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.NodeRequests; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
public class PrivGetPrivacyPrecompileAddressTransaction implements Transaction<Address> { |
|
||||||
|
|
||||||
@Override |
|
||||||
public Address execute(final NodeRequests node) { |
|
||||||
try { |
|
||||||
final PrivacyRequestFactory.GetPrivacyPrecompileAddressResponse result = |
|
||||||
node.privacy().privGetPrivacyPrecompileAddress().send(); |
|
||||||
assertThat(result).isNotNull(); |
|
||||||
return result.getResult(); |
|
||||||
} catch (final IOException e) { |
|
||||||
throw new RuntimeException(e); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,46 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy; |
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat; |
|
||||||
|
|
||||||
import org.hyperledger.besu.datatypes.Hash; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.privacy.PrivateTransactionGroupResponse; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.NodeRequests; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
public class PrivGetPrivateTransactionTransaction |
|
||||||
implements Transaction<PrivateTransactionGroupResponse> { |
|
||||||
|
|
||||||
private final Hash transactionHash; |
|
||||||
|
|
||||||
public PrivGetPrivateTransactionTransaction(final Hash transactionHash) { |
|
||||||
this.transactionHash = transactionHash; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public PrivateTransactionGroupResponse execute(final NodeRequests node) { |
|
||||||
try { |
|
||||||
final PrivacyRequestFactory.GetPrivateTransactionResponse result = |
|
||||||
node.privacy().privGetPrivateTransaction(transactionHash).send(); |
|
||||||
assertThat(result).isNotNull(); |
|
||||||
return result.getResult(); |
|
||||||
} catch (final IOException e) { |
|
||||||
throw new RuntimeException(e); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,46 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy; |
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat; |
|
||||||
|
|
||||||
import org.hyperledger.besu.datatypes.Hash; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.NodeRequests; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
public class PrivGetTransaction |
|
||||||
implements Transaction<PrivacyRequestFactory.GetPrivateTransactionResponse> { |
|
||||||
|
|
||||||
private final String transactionHash; |
|
||||||
|
|
||||||
public PrivGetTransaction(final String transactionHash) { |
|
||||||
this.transactionHash = transactionHash; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public PrivacyRequestFactory.GetPrivateTransactionResponse execute(final NodeRequests node) { |
|
||||||
try { |
|
||||||
final PrivacyRequestFactory.GetPrivateTransactionResponse response = |
|
||||||
node.privacy().privGetPrivateTransaction(Hash.fromHexString(transactionHash)).send(); |
|
||||||
assertThat(response).as("check response is not null").isNotNull(); |
|
||||||
assertThat(response.getResult()).as("check result in response isn't null").isNotNull(); |
|
||||||
return response; |
|
||||||
} catch (final IOException e) { |
|
||||||
throw new RuntimeException(e); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,47 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy; |
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.NodeRequests; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
public class PrivGetTransactionCountTransaction implements Transaction<Integer> { |
|
||||||
|
|
||||||
private final Object[] params; |
|
||||||
|
|
||||||
public PrivGetTransactionCountTransaction( |
|
||||||
final String accountAddress, final String privacyGroupId) { |
|
||||||
this.params = new String[] {accountAddress, privacyGroupId}; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public Integer execute(final NodeRequests node) { |
|
||||||
try { |
|
||||||
final PrivacyRequestFactory.GetTransactionCountResponse result = |
|
||||||
node.privacy().privGetTransactionCount(params).send(); |
|
||||||
assertThat(result).isNotNull(); |
|
||||||
if (result.hasError()) { |
|
||||||
throw new RuntimeException(result.getError().getMessage()); |
|
||||||
} |
|
||||||
return result.getCount(); |
|
||||||
} catch (final IOException e) { |
|
||||||
throw new RuntimeException(e); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,47 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy; |
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat; |
|
||||||
|
|
||||||
import org.hyperledger.besu.datatypes.Hash; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.NodeRequests; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
import org.web3j.protocol.besu.response.privacy.PrivateTransactionReceipt; |
|
||||||
|
|
||||||
public class PrivGetTransactionReceiptTransaction |
|
||||||
implements Transaction<PrivateTransactionReceipt> { |
|
||||||
|
|
||||||
private final Hash transaction; |
|
||||||
|
|
||||||
public PrivGetTransactionReceiptTransaction(final Hash transaction) { |
|
||||||
this.transaction = transaction; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public PrivateTransactionReceipt execute(final NodeRequests node) { |
|
||||||
try { |
|
||||||
final PrivacyRequestFactory.GetTransactionReceiptResponse result = |
|
||||||
node.privacy().privGetTransactionReceipt(transaction).send(); |
|
||||||
assertThat(result).isNotNull(); |
|
||||||
return result.getResult(); |
|
||||||
} catch (final IOException e) { |
|
||||||
throw new RuntimeException(e); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,40 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright contributors to Hyperledger Besu. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy; |
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.NodeRequests; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
import org.web3j.protocol.core.methods.response.EthSyncing; |
|
||||||
|
|
||||||
public class PrivSyncingTransactions implements Transaction<Boolean> { |
|
||||||
|
|
||||||
PrivSyncingTransactions() {} |
|
||||||
|
|
||||||
@Override |
|
||||||
public Boolean execute(final NodeRequests node) { |
|
||||||
try { |
|
||||||
EthSyncing response = node.eth().ethSyncing().send(); |
|
||||||
assertThat(response).isNotNull(); |
|
||||||
return response.isSyncing(); |
|
||||||
} catch (final IOException e) { |
|
||||||
throw new RuntimeException(e); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,49 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright contributors to Hyperledger Besu. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy; |
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat; |
|
||||||
|
|
||||||
import org.hyperledger.besu.datatypes.Hash; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.NodeRequests; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
public class PrivTraceTransaction implements Transaction<String> { |
|
||||||
|
|
||||||
private final String privacyGroupId; |
|
||||||
private final Hash transactionHash; |
|
||||||
|
|
||||||
public PrivTraceTransaction(final String privacyGroupId, final Hash transactionHash) { |
|
||||||
this.privacyGroupId = privacyGroupId; |
|
||||||
this.transactionHash = transactionHash; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public String execute(final NodeRequests node) { |
|
||||||
try { |
|
||||||
final PrivacyRequestFactory.PrivTraceTransaction response = |
|
||||||
node.privacy().privTraceTransaction(privacyGroupId, transactionHash).send(); |
|
||||||
|
|
||||||
assertThat(response).as("check response is not null").isNotNull(); |
|
||||||
assertThat(response.getResult()).as("check result in response is not null").isNotNull(); |
|
||||||
|
|
||||||
return response.getResult(); |
|
||||||
} catch (final IOException e) { |
|
||||||
throw new RuntimeException(e); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,629 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy; |
|
||||||
|
|
||||||
import static java.util.Collections.singletonList; |
|
||||||
import static org.assertj.core.api.Assertions.assertThat; |
|
||||||
import static org.hyperledger.besu.ethereum.core.PrivacyParameters.FLEXIBLE_PRIVACY_PROXY; |
|
||||||
|
|
||||||
import org.hyperledger.besu.crypto.SecureRandomProvider; |
|
||||||
import org.hyperledger.besu.datatypes.Address; |
|
||||||
import org.hyperledger.besu.datatypes.Hash; |
|
||||||
import org.hyperledger.besu.enclave.types.PrivacyGroup; |
|
||||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.privacy.parameters.CreatePrivacyGroupParameter; |
|
||||||
import org.hyperledger.besu.ethereum.privacy.group.FlexibleGroupManagement; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.privacy.PrivacyNode; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.privacy.PrivateTransactionGroupResponse; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.privacy.util.LogFilterJsonParameter; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
import java.math.BigInteger; |
|
||||||
import java.security.SecureRandom; |
|
||||||
import java.util.Arrays; |
|
||||||
import java.util.Collections; |
|
||||||
import java.util.List; |
|
||||||
import java.util.Objects; |
|
||||||
import java.util.stream.Collectors; |
|
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonCreator; |
|
||||||
import com.fasterxml.jackson.annotation.JsonProperty; |
|
||||||
import org.apache.tuweni.bytes.Bytes; |
|
||||||
import org.web3j.abi.FunctionEncoder; |
|
||||||
import org.web3j.abi.TypeReference; |
|
||||||
import org.web3j.abi.Utils; |
|
||||||
import org.web3j.abi.datatypes.Bool; |
|
||||||
import org.web3j.abi.datatypes.DynamicArray; |
|
||||||
import org.web3j.abi.datatypes.DynamicBytes; |
|
||||||
import org.web3j.abi.datatypes.Function; |
|
||||||
import org.web3j.abi.datatypes.Type; |
|
||||||
import org.web3j.crypto.Credentials; |
|
||||||
import org.web3j.protocol.Web3jService; |
|
||||||
import org.web3j.protocol.besu.Besu; |
|
||||||
import org.web3j.protocol.besu.response.privacy.PrivateTransactionReceipt; |
|
||||||
import org.web3j.protocol.core.Request; |
|
||||||
import org.web3j.protocol.core.Response; |
|
||||||
import org.web3j.protocol.core.methods.response.EthCall; |
|
||||||
import org.web3j.protocol.core.methods.response.EthFilter; |
|
||||||
import org.web3j.protocol.core.methods.response.EthLog; |
|
||||||
import org.web3j.protocol.core.methods.response.EthSendTransaction; |
|
||||||
import org.web3j.protocol.core.methods.response.EthUninstallFilter; |
|
||||||
import org.web3j.protocol.eea.crypto.PrivateTransactionEncoder; |
|
||||||
import org.web3j.protocol.eea.crypto.RawPrivateTransaction; |
|
||||||
import org.web3j.protocol.exceptions.TransactionException; |
|
||||||
import org.web3j.tx.ChainIdLong; |
|
||||||
import org.web3j.tx.Contract; |
|
||||||
import org.web3j.tx.PrivateTransactionManager; |
|
||||||
import org.web3j.tx.response.PollingPrivateTransactionReceiptProcessor; |
|
||||||
import org.web3j.utils.Base64String; |
|
||||||
import org.web3j.utils.Numeric; |
|
||||||
import org.web3j.utils.Restriction; |
|
||||||
|
|
||||||
public class PrivacyRequestFactory { |
|
||||||
|
|
||||||
private final SecureRandom secureRandom; |
|
||||||
|
|
||||||
public PrivateTransactionManager getTransactionManager( |
|
||||||
final Credentials credentials, |
|
||||||
final Base64String privateFrom, |
|
||||||
final List<Base64String> privateFor, |
|
||||||
final Restriction restriction) { |
|
||||||
return new PrivateTransactionManager( |
|
||||||
getBesuClient(), |
|
||||||
credentials, |
|
||||||
new PollingPrivateTransactionReceiptProcessor(getBesuClient(), 1000, 60), |
|
||||||
ChainIdLong.NONE, |
|
||||||
privateFrom, |
|
||||||
privateFor, |
|
||||||
restriction); |
|
||||||
} |
|
||||||
|
|
||||||
public PrivateTransactionManager getTransactionManager( |
|
||||||
final Credentials credentials, |
|
||||||
final Base64String privateFrom, |
|
||||||
final Base64String privacyGroupId, |
|
||||||
final Restriction restriction) { |
|
||||||
return new PrivateTransactionManager( |
|
||||||
getBesuClient(), |
|
||||||
credentials, |
|
||||||
new PollingPrivateTransactionReceiptProcessor(getBesuClient(), 1000, 60), |
|
||||||
ChainIdLong.NONE, |
|
||||||
privateFrom, |
|
||||||
privacyGroupId, |
|
||||||
restriction); |
|
||||||
} |
|
||||||
|
|
||||||
public static class GetPrivacyPrecompileAddressResponse extends Response<Address> {} |
|
||||||
|
|
||||||
public static class GetPrivateTransactionResponse |
|
||||||
extends Response<PrivateTransactionGroupResponse> {} |
|
||||||
|
|
||||||
public static class PrivTraceTransaction extends Response<String> {} |
|
||||||
|
|
||||||
public static class CreatePrivacyGroupResponse extends Response<String> {} |
|
||||||
|
|
||||||
public static class DeletePrivacyGroupResponse extends Response<String> {} |
|
||||||
|
|
||||||
public static class FindPrivacyGroupResponse extends Response<PrivacyGroup[]> {} |
|
||||||
|
|
||||||
public static class SendRawTransactionResponse extends Response<Hash> {} |
|
||||||
|
|
||||||
public static class GetTransactionReceiptResponse extends Response<PrivateTransactionReceipt> {} |
|
||||||
|
|
||||||
public static class GetTransactionCountResponse extends Response<Integer> { |
|
||||||
|
|
||||||
final Integer count; |
|
||||||
|
|
||||||
@JsonCreator |
|
||||||
public GetTransactionCountResponse(@JsonProperty("result") final String result) { |
|
||||||
this.count = result == null ? null : Integer.decode(result); |
|
||||||
} |
|
||||||
|
|
||||||
public Integer getCount() { |
|
||||||
return count; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
public static class GetCodeResponse extends Response<String> {} |
|
||||||
|
|
||||||
public static class DebugGetStateRoot extends Response<Hash> {} |
|
||||||
|
|
||||||
public Request<?, PrivDistributeTransactionResponse> privDistributeTransaction( |
|
||||||
final String signedPrivateTransaction) { |
|
||||||
return new Request<>( |
|
||||||
"priv_distributeRawTransaction", |
|
||||||
singletonList(signedPrivateTransaction), |
|
||||||
web3jService, |
|
||||||
PrivDistributeTransactionResponse.class); |
|
||||||
} |
|
||||||
|
|
||||||
private final Besu besuClient; |
|
||||||
private final Web3jService web3jService; |
|
||||||
|
|
||||||
public PrivacyRequestFactory(final Web3jService web3jService) { |
|
||||||
this.web3jService = web3jService; |
|
||||||
this.besuClient = Besu.build(web3jService); |
|
||||||
this.secureRandom = SecureRandomProvider.createSecureRandom(); |
|
||||||
} |
|
||||||
|
|
||||||
public Besu getBesuClient() { |
|
||||||
return besuClient; |
|
||||||
} |
|
||||||
|
|
||||||
public static class PrivDistributeTransactionResponse extends Response<String> { |
|
||||||
|
|
||||||
public PrivDistributeTransactionResponse() {} |
|
||||||
|
|
||||||
public String getTransactionKey() { |
|
||||||
return getResult(); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
public String privxAddToPrivacyGroup( |
|
||||||
final Base64String privacyGroupId, |
|
||||||
final PrivacyNode adder, |
|
||||||
final Credentials signer, |
|
||||||
final List<String> addresses) |
|
||||||
throws IOException { |
|
||||||
|
|
||||||
final BigInteger nonce = |
|
||||||
besuClient |
|
||||||
.privGetTransactionCount(signer.getAddress(), privacyGroupId) |
|
||||||
.send() |
|
||||||
.getTransactionCount(); |
|
||||||
|
|
||||||
final Bytes payload = |
|
||||||
encodeAddToGroupFunctionCall( |
|
||||||
addresses.stream().map(Bytes::fromBase64String).collect(Collectors.toList())); |
|
||||||
|
|
||||||
final RawPrivateTransaction privateTransaction = |
|
||||||
RawPrivateTransaction.createTransaction( |
|
||||||
nonce, |
|
||||||
BigInteger.valueOf(1000), |
|
||||||
BigInteger.valueOf(3000000), |
|
||||||
FLEXIBLE_PRIVACY_PROXY.toHexString(), |
|
||||||
payload.toHexString(), |
|
||||||
Base64String.wrap(adder.getEnclaveKey()), |
|
||||||
privacyGroupId, |
|
||||||
org.web3j.utils.Restriction.RESTRICTED); |
|
||||||
|
|
||||||
return besuClient |
|
||||||
.eeaSendRawTransaction( |
|
||||||
Numeric.toHexString(PrivateTransactionEncoder.signMessage(privateTransaction, signer))) |
|
||||||
.send() |
|
||||||
.getTransactionHash(); |
|
||||||
} |
|
||||||
|
|
||||||
public String privxRemoveFromPrivacyGroup( |
|
||||||
final Base64String privacyGroupId, |
|
||||||
final String removerTenant, |
|
||||||
final Credentials signer, |
|
||||||
final String toRemove) |
|
||||||
throws IOException { |
|
||||||
|
|
||||||
final BigInteger nonce = |
|
||||||
besuClient |
|
||||||
.privGetTransactionCount(signer.getAddress(), privacyGroupId) |
|
||||||
.send() |
|
||||||
.getTransactionCount(); |
|
||||||
|
|
||||||
final Bytes payload = encodeRemoveFromGroupFunctionCall(Bytes.fromBase64String(toRemove)); |
|
||||||
|
|
||||||
final RawPrivateTransaction privateTransaction = |
|
||||||
RawPrivateTransaction.createTransaction( |
|
||||||
nonce, |
|
||||||
BigInteger.valueOf(1000), |
|
||||||
BigInteger.valueOf(3000000), |
|
||||||
FLEXIBLE_PRIVACY_PROXY.toHexString(), |
|
||||||
payload.toHexString(), |
|
||||||
Base64String.wrap(removerTenant), |
|
||||||
privacyGroupId, |
|
||||||
org.web3j.utils.Restriction.RESTRICTED); |
|
||||||
|
|
||||||
return besuClient |
|
||||||
.eeaSendRawTransaction( |
|
||||||
Numeric.toHexString(PrivateTransactionEncoder.signMessage(privateTransaction, signer))) |
|
||||||
.send() |
|
||||||
.getTransactionHash(); |
|
||||||
} |
|
||||||
|
|
||||||
private Bytes encodeRemoveFromGroupFunctionCall(final Bytes toRemove) { |
|
||||||
final Function function = |
|
||||||
new Function( |
|
||||||
"removeParticipant", |
|
||||||
Arrays.asList(new DynamicBytes(toRemove.toArrayUnsafe())), |
|
||||||
Arrays.asList(new TypeReference<Bool>() {})); |
|
||||||
|
|
||||||
return Bytes.fromHexString(FunctionEncoder.encode(function)); |
|
||||||
} |
|
||||||
|
|
||||||
public String privxLockPrivacyGroup( |
|
||||||
final PrivacyNode locker, final Base64String privacyGroupId, final Credentials signer) |
|
||||||
throws IOException, TransactionException { |
|
||||||
return privxLockOrUnlockPrivacyGroup( |
|
||||||
locker, |
|
||||||
privacyGroupId, |
|
||||||
signer, |
|
||||||
FlexibleGroupManagement.LOCK_GROUP_METHOD_SIGNATURE.toHexString()); |
|
||||||
} |
|
||||||
|
|
||||||
public String privxUnlockPrivacyGroup( |
|
||||||
final PrivacyNode locker, final Base64String privacyGroupId, final Credentials signer) |
|
||||||
throws IOException, TransactionException { |
|
||||||
return privxLockOrUnlockPrivacyGroup( |
|
||||||
locker, |
|
||||||
privacyGroupId, |
|
||||||
signer, |
|
||||||
FlexibleGroupManagement.UNLOCK_GROUP_METHOD_SIGNATURE.toHexString()); |
|
||||||
} |
|
||||||
|
|
||||||
private String privxLockOrUnlockPrivacyGroup( |
|
||||||
final PrivacyNode locker, |
|
||||||
final Base64String privacyGroupId, |
|
||||||
final Credentials signer, |
|
||||||
final String callData) |
|
||||||
throws IOException, TransactionException { |
|
||||||
final BigInteger nonce = |
|
||||||
besuClient |
|
||||||
.privGetTransactionCount(signer.getAddress(), privacyGroupId) |
|
||||||
.send() |
|
||||||
.getTransactionCount(); |
|
||||||
|
|
||||||
final RawPrivateTransaction privateTransaction = |
|
||||||
RawPrivateTransaction.createTransaction( |
|
||||||
nonce, |
|
||||||
BigInteger.valueOf(1000), |
|
||||||
BigInteger.valueOf(3000000), |
|
||||||
FLEXIBLE_PRIVACY_PROXY.toHexString(), |
|
||||||
callData, |
|
||||||
Base64String.wrap(locker.getEnclaveKey()), |
|
||||||
privacyGroupId, |
|
||||||
org.web3j.utils.Restriction.RESTRICTED); |
|
||||||
|
|
||||||
final String transactionHash = |
|
||||||
besuClient |
|
||||||
.eeaSendRawTransaction( |
|
||||||
Numeric.toHexString( |
|
||||||
PrivateTransactionEncoder.signMessage(privateTransaction, signer))) |
|
||||||
.send() |
|
||||||
.getTransactionHash(); |
|
||||||
|
|
||||||
final PrivateTransactionReceipt privateTransactionReceipt = |
|
||||||
new PollingPrivateTransactionReceiptProcessor(besuClient, 3000, 10) |
|
||||||
.waitForTransactionReceipt(transactionHash); |
|
||||||
|
|
||||||
assertThat(privateTransactionReceipt.getStatus()).isEqualTo("0x1"); |
|
||||||
|
|
||||||
return privateTransactionReceipt.getcommitmentHash(); |
|
||||||
} |
|
||||||
|
|
||||||
public PrivxCreatePrivacyGroupResponse privxCreatePrivacyGroup( |
|
||||||
final PrivacyNode creator, final String privateFrom, final List<String> addresses) |
|
||||||
throws IOException { |
|
||||||
|
|
||||||
final byte[] bytes = new byte[32]; |
|
||||||
secureRandom.nextBytes(bytes); |
|
||||||
final Bytes privacyGroupId = Bytes.wrap(bytes); |
|
||||||
|
|
||||||
final Bytes payload = |
|
||||||
encodeAddToGroupFunctionCall( |
|
||||||
addresses.stream().map(Bytes::fromBase64String).collect(Collectors.toList())); |
|
||||||
|
|
||||||
final RawPrivateTransaction privateTransaction = |
|
||||||
RawPrivateTransaction.createTransaction( |
|
||||||
BigInteger.ZERO, |
|
||||||
BigInteger.valueOf(1000), |
|
||||||
BigInteger.valueOf(3000000), |
|
||||||
FLEXIBLE_PRIVACY_PROXY.toHexString(), |
|
||||||
payload.toHexString(), |
|
||||||
Base64String.wrap(privateFrom), |
|
||||||
Base64String.wrap(privacyGroupId.toArrayUnsafe()), |
|
||||||
org.web3j.utils.Restriction.RESTRICTED); |
|
||||||
|
|
||||||
final Request<?, EthSendTransaction> ethSendTransactionRequest = |
|
||||||
besuClient.eeaSendRawTransaction( |
|
||||||
Numeric.toHexString( |
|
||||||
PrivateTransactionEncoder.signMessage( |
|
||||||
privateTransaction, Credentials.create(creator.getTransactionSigningKey())))); |
|
||||||
final String transactionHash = ethSendTransactionRequest.send().getTransactionHash(); |
|
||||||
return new PrivxCreatePrivacyGroupResponse(privacyGroupId.toBase64String(), transactionHash); |
|
||||||
} |
|
||||||
|
|
||||||
public Request<?, PrivxFindPrivacyGroupResponse> privxFindFlexiblePrivacyGroup( |
|
||||||
final List<Base64String> nodes) { |
|
||||||
return new Request<>( |
|
||||||
"privx_findFlexiblePrivacyGroup", |
|
||||||
singletonList(nodes), |
|
||||||
web3jService, |
|
||||||
PrivxFindPrivacyGroupResponse.class); |
|
||||||
} |
|
||||||
|
|
||||||
public Request<?, GetPrivacyPrecompileAddressResponse> privGetPrivacyPrecompileAddress() { |
|
||||||
return new Request<>( |
|
||||||
"priv_getPrivacyPrecompileAddress", |
|
||||||
Collections.emptyList(), |
|
||||||
web3jService, |
|
||||||
GetPrivacyPrecompileAddressResponse.class); |
|
||||||
} |
|
||||||
|
|
||||||
public Request<?, GetPrivateTransactionResponse> privGetPrivateTransaction( |
|
||||||
final Hash transactionHash) { |
|
||||||
return new Request<>( |
|
||||||
"priv_getPrivateTransaction", |
|
||||||
singletonList(transactionHash.toHexString()), |
|
||||||
web3jService, |
|
||||||
GetPrivateTransactionResponse.class); |
|
||||||
} |
|
||||||
|
|
||||||
public Request<?, CreatePrivacyGroupResponse> privCreatePrivacyGroup( |
|
||||||
final CreatePrivacyGroupParameter params) { |
|
||||||
return new Request<>( |
|
||||||
"priv_createPrivacyGroup", |
|
||||||
singletonList(params), |
|
||||||
web3jService, |
|
||||||
CreatePrivacyGroupResponse.class); |
|
||||||
} |
|
||||||
|
|
||||||
public Request<?, DeletePrivacyGroupResponse> privDeletePrivacyGroup(final String groupId) { |
|
||||||
return new Request<>( |
|
||||||
"priv_deletePrivacyGroup", |
|
||||||
singletonList(groupId), |
|
||||||
web3jService, |
|
||||||
DeletePrivacyGroupResponse.class); |
|
||||||
} |
|
||||||
|
|
||||||
public Request<?, FindPrivacyGroupResponse> privFindPrivacyGroup(final String[] groupMembers) { |
|
||||||
return new Request<>( |
|
||||||
"priv_findPrivacyGroup", |
|
||||||
singletonList(groupMembers), |
|
||||||
web3jService, |
|
||||||
FindPrivacyGroupResponse.class); |
|
||||||
} |
|
||||||
|
|
||||||
public Request<?, SendRawTransactionResponse> eeaSendRawTransaction(final String transaction) { |
|
||||||
return new Request<>( |
|
||||||
"eea_sendRawTransaction", |
|
||||||
singletonList(transaction), |
|
||||||
web3jService, |
|
||||||
SendRawTransactionResponse.class); |
|
||||||
} |
|
||||||
|
|
||||||
public Request<?, GetTransactionReceiptResponse> privGetTransactionReceipt( |
|
||||||
final Hash transactionHash) { |
|
||||||
return new Request<>( |
|
||||||
"priv_getTransactionReceipt", |
|
||||||
singletonList(transactionHash.toHexString()), |
|
||||||
web3jService, |
|
||||||
GetTransactionReceiptResponse.class); |
|
||||||
} |
|
||||||
|
|
||||||
public Request<?, GetTransactionCountResponse> privGetTransactionCount(final Object[] params) { |
|
||||||
return new Request<>( |
|
||||||
"priv_getTransactionCount", |
|
||||||
List.of(params), |
|
||||||
web3jService, |
|
||||||
GetTransactionCountResponse.class); |
|
||||||
} |
|
||||||
|
|
||||||
public Request<?, GetTransactionCountResponse> privGetEeaTransactionCount(final Object[] params) { |
|
||||||
return new Request<>( |
|
||||||
"priv_getEeaTransactionCount", |
|
||||||
List.of(params), |
|
||||||
web3jService, |
|
||||||
GetTransactionCountResponse.class); |
|
||||||
} |
|
||||||
|
|
||||||
public Request<?, GetCodeResponse> privGetCode( |
|
||||||
final String privacyGroupId, final String contractAddress, final String blockParameter) { |
|
||||||
return new Request<>( |
|
||||||
"priv_getCode", |
|
||||||
List.of(privacyGroupId, contractAddress, blockParameter), |
|
||||||
web3jService, |
|
||||||
GetCodeResponse.class); |
|
||||||
} |
|
||||||
|
|
||||||
public Request<?, EthCall> privCall( |
|
||||||
final String privacyGroupId, |
|
||||||
final Contract contract, |
|
||||||
final String encoded, |
|
||||||
final String blockNumberLatestPending) { |
|
||||||
|
|
||||||
final org.web3j.protocol.core.methods.request.Transaction transaction = |
|
||||||
org.web3j.protocol.core.methods.request.Transaction.createEthCallTransaction( |
|
||||||
null, contract.getContractAddress(), encoded); |
|
||||||
|
|
||||||
return new Request<>( |
|
||||||
"priv_call", |
|
||||||
Arrays.asList(privacyGroupId, transaction, blockNumberLatestPending), |
|
||||||
web3jService, |
|
||||||
EthCall.class); |
|
||||||
} |
|
||||||
|
|
||||||
public Request<?, EthLog> privGetLogs( |
|
||||||
final String privacyGroupId, final LogFilterJsonParameter filterParameter) { |
|
||||||
|
|
||||||
return new Request<>( |
|
||||||
"priv_getLogs", Arrays.asList(privacyGroupId, filterParameter), web3jService, EthLog.class); |
|
||||||
} |
|
||||||
|
|
||||||
public Request<?, PrivTraceTransaction> privTraceTransaction( |
|
||||||
final String privacyGroupId, final Hash transactionHash) { |
|
||||||
|
|
||||||
return new Request<>( |
|
||||||
"priv_traceTransaction", |
|
||||||
Arrays.asList(privacyGroupId, transactionHash), |
|
||||||
web3jService, |
|
||||||
PrivTraceTransaction.class); |
|
||||||
} |
|
||||||
|
|
||||||
public Request<?, EthFilter> privNewFilter( |
|
||||||
final String privacyGroupId, final LogFilterJsonParameter filterParameter) { |
|
||||||
return new Request<>( |
|
||||||
"priv_newFilter", |
|
||||||
Arrays.asList(privacyGroupId, filterParameter), |
|
||||||
web3jService, |
|
||||||
EthFilter.class); |
|
||||||
} |
|
||||||
|
|
||||||
public Request<?, EthUninstallFilter> privUninstallFilter( |
|
||||||
final String privacyGroupId, final String filterId) { |
|
||||||
return new Request<>( |
|
||||||
"priv_uninstallFilter", |
|
||||||
Arrays.asList(privacyGroupId, filterId), |
|
||||||
web3jService, |
|
||||||
EthUninstallFilter.class); |
|
||||||
} |
|
||||||
|
|
||||||
public Request<?, EthLog> privGetFilterLogs(final String privacyGroupId, final String filterId) { |
|
||||||
|
|
||||||
return new Request<>( |
|
||||||
"priv_getFilterLogs", Arrays.asList(privacyGroupId, filterId), web3jService, EthLog.class); |
|
||||||
} |
|
||||||
|
|
||||||
public Request<?, EthLog> privGetFilterChanges( |
|
||||||
final String privacyGroupId, final String filterId) { |
|
||||||
|
|
||||||
return new Request<>( |
|
||||||
"priv_getFilterChanges", |
|
||||||
Arrays.asList(privacyGroupId, filterId), |
|
||||||
web3jService, |
|
||||||
EthLog.class); |
|
||||||
} |
|
||||||
|
|
||||||
public Request<?, DebugGetStateRoot> privDebugGetStateRoot( |
|
||||||
final String privacyGroupId, final String blockParam) { |
|
||||||
return new Request<>( |
|
||||||
"priv_debugGetStateRoot", |
|
||||||
Arrays.asList(privacyGroupId, blockParam), |
|
||||||
web3jService, |
|
||||||
DebugGetStateRoot.class); |
|
||||||
} |
|
||||||
|
|
||||||
public static class PrivxFindPrivacyGroupResponse extends Response<List<FlexiblePrivacyGroup>> { |
|
||||||
|
|
||||||
public List<FlexiblePrivacyGroup> getGroups() { |
|
||||||
return getResult(); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
public static class FlexiblePrivacyGroup { |
|
||||||
|
|
||||||
private final Base64String privacyGroupId; |
|
||||||
private final List<Base64String> members; |
|
||||||
private final String name; |
|
||||||
private final String description; |
|
||||||
|
|
||||||
public enum Type { |
|
||||||
FLEXIBLE |
|
||||||
} |
|
||||||
|
|
||||||
@JsonCreator |
|
||||||
public FlexiblePrivacyGroup( |
|
||||||
@JsonProperty(value = "privacyGroupId") final String privacyGroupId, |
|
||||||
@JsonProperty(value = "type") final Type type, |
|
||||||
@JsonProperty(value = "name") final String name, |
|
||||||
@JsonProperty(value = "description") final String description, |
|
||||||
@JsonProperty(value = "members") final List<Base64String> members) { |
|
||||||
this(privacyGroupId, members); |
|
||||||
} |
|
||||||
|
|
||||||
public FlexiblePrivacyGroup(final String privacyGroupId, final List<Base64String> members) { |
|
||||||
this.privacyGroupId = Base64String.wrap(privacyGroupId); |
|
||||||
this.name = ""; |
|
||||||
this.description = ""; |
|
||||||
this.members = members; |
|
||||||
} |
|
||||||
|
|
||||||
public Base64String getPrivacyGroupId() { |
|
||||||
return privacyGroupId; |
|
||||||
} |
|
||||||
|
|
||||||
public String getName() { |
|
||||||
return name; |
|
||||||
} |
|
||||||
|
|
||||||
public String getDescription() { |
|
||||||
return description; |
|
||||||
} |
|
||||||
|
|
||||||
public Type getType() { |
|
||||||
return Type.FLEXIBLE; |
|
||||||
} |
|
||||||
|
|
||||||
public List<Base64String> getMembers() { |
|
||||||
return members; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public boolean equals(final Object o) { |
|
||||||
if (this == o) { |
|
||||||
return true; |
|
||||||
} |
|
||||||
if (o == null || getClass() != o.getClass()) { |
|
||||||
return false; |
|
||||||
} |
|
||||||
final FlexiblePrivacyGroup that = (FlexiblePrivacyGroup) o; |
|
||||||
return getPrivacyGroupId().equals(that.getPrivacyGroupId()) |
|
||||||
&& getName().equals(that.getName()) |
|
||||||
&& getDescription().equals(that.getDescription()) |
|
||||||
&& getType() == that.getType() |
|
||||||
&& getMembers().equals(that.getMembers()); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public int hashCode() { |
|
||||||
return Objects.hash( |
|
||||||
getPrivacyGroupId(), getName(), getDescription(), getType(), getMembers()); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
public static class PrivxCreatePrivacyGroupResponse { |
|
||||||
|
|
||||||
final String privacyGroupId; |
|
||||||
final String transactionHash; |
|
||||||
|
|
||||||
@JsonCreator |
|
||||||
public PrivxCreatePrivacyGroupResponse( |
|
||||||
@JsonProperty("privacyGroupId") final String privacyGroupId, |
|
||||||
@JsonProperty("transactionHash") final String transactionHash) { |
|
||||||
this.privacyGroupId = privacyGroupId; |
|
||||||
this.transactionHash = transactionHash; |
|
||||||
} |
|
||||||
|
|
||||||
public String getPrivacyGroupId() { |
|
||||||
return privacyGroupId; |
|
||||||
} |
|
||||||
|
|
||||||
public String getTransactionHash() { |
|
||||||
return transactionHash; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
private Bytes encodeAddToGroupFunctionCall(final List<Bytes> participants) { |
|
||||||
final Function function = |
|
||||||
new Function( |
|
||||||
"addParticipants", |
|
||||||
Arrays.asList( |
|
||||||
new DynamicArray<>( |
|
||||||
DynamicBytes.class, |
|
||||||
Utils.typeMap( |
|
||||||
participants.stream() |
|
||||||
.map(Bytes::toArrayUnsafe) |
|
||||||
.collect(Collectors.toList()), |
|
||||||
DynamicBytes.class))), |
|
||||||
Collections.emptyList()); |
|
||||||
|
|
||||||
return Bytes.fromHexString(FunctionEncoder.encode(function)); |
|
||||||
} |
|
||||||
} |
|
@ -1,69 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy; |
|
||||||
|
|
||||||
import org.hyperledger.besu.datatypes.Hash; |
|
||||||
|
|
||||||
import java.util.List; |
|
||||||
|
|
||||||
public class PrivacyTransactions { |
|
||||||
public PrivGetPrivacyPrecompileAddressTransaction getPrivacyPrecompileAddress() { |
|
||||||
return new PrivGetPrivacyPrecompileAddressTransaction(); |
|
||||||
} |
|
||||||
|
|
||||||
public PrivGetPrivateTransactionTransaction getPrivateTransaction(final Hash transactionHash) { |
|
||||||
return new PrivGetPrivateTransactionTransaction(transactionHash); |
|
||||||
} |
|
||||||
|
|
||||||
public PrivCreatePrivacyGroupTransaction createPrivacyGroup( |
|
||||||
final List<String> addresses, final String groupName, final String groupDescription) { |
|
||||||
return new PrivCreatePrivacyGroupTransaction(addresses, groupName, groupDescription); |
|
||||||
} |
|
||||||
|
|
||||||
public PrivDeletePrivacyGroupTransaction deletePrivacyGroup(final String transactionHash) { |
|
||||||
return new PrivDeletePrivacyGroupTransaction(transactionHash); |
|
||||||
} |
|
||||||
|
|
||||||
public PrivFindPrivacyGroupTransaction findPrivacyGroup(final String[] groupMembers) { |
|
||||||
return new PrivFindPrivacyGroupTransaction(groupMembers); |
|
||||||
} |
|
||||||
|
|
||||||
public EeaSendRawTransactionTransaction sendRawTransaction(final String transaction) { |
|
||||||
return new EeaSendRawTransactionTransaction(transaction); |
|
||||||
} |
|
||||||
|
|
||||||
public PrivDistributeRawTransactionTransaction distributeRawTransaction( |
|
||||||
final String transaction) { |
|
||||||
return new PrivDistributeRawTransactionTransaction(transaction); |
|
||||||
} |
|
||||||
|
|
||||||
public PrivGetTransactionCountTransaction getTransactionCount( |
|
||||||
final String accountAddress, final String privacyGroupId) { |
|
||||||
return new PrivGetTransactionCountTransaction(accountAddress, privacyGroupId); |
|
||||||
} |
|
||||||
|
|
||||||
public PrivGetEeaTransactionCountTransaction getEeaTransactionCount( |
|
||||||
final String accountAddress, final String privateFrom, final String[] privateFor) { |
|
||||||
return new PrivGetEeaTransactionCountTransaction(accountAddress, privateFrom, privateFor); |
|
||||||
} |
|
||||||
|
|
||||||
public PrivGetTransactionReceiptTransaction getTransactionReceipt(final Hash transactionHash) { |
|
||||||
return new PrivGetTransactionReceiptTransaction(transactionHash); |
|
||||||
} |
|
||||||
|
|
||||||
public PrivSyncingTransactions syncing() { |
|
||||||
return new PrivSyncingTransactions(); |
|
||||||
} |
|
||||||
} |
|
@ -1,53 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.filter; |
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.NodeRequests; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
import java.util.List; |
|
||||||
|
|
||||||
import org.web3j.protocol.core.methods.response.EthLog; |
|
||||||
import org.web3j.protocol.core.methods.response.EthLog.LogResult; |
|
||||||
|
|
||||||
@SuppressWarnings("rawtypes") |
|
||||||
public class PrivGetFilterChangesTransaction implements Transaction<List<LogResult>> { |
|
||||||
|
|
||||||
private final String privacyGroupId; |
|
||||||
private final String filterId; |
|
||||||
|
|
||||||
public PrivGetFilterChangesTransaction(final String privacyGroupId, final String filterId) { |
|
||||||
this.privacyGroupId = privacyGroupId; |
|
||||||
this.filterId = filterId; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public List<LogResult> execute(final NodeRequests node) { |
|
||||||
try { |
|
||||||
final EthLog response = node.privacy().privGetFilterChanges(privacyGroupId, filterId).send(); |
|
||||||
|
|
||||||
assertThat(response).as("check response is not null").isNotNull(); |
|
||||||
assertThat(response.getResult()).as("check result in response isn't null").isNotNull(); |
|
||||||
assertThat(response.getLogs()).isNotNull(); |
|
||||||
|
|
||||||
return response.getLogs(); |
|
||||||
} catch (final IOException e) { |
|
||||||
throw new RuntimeException(e); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,53 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.filter; |
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.NodeRequests; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
import java.util.List; |
|
||||||
|
|
||||||
import org.web3j.protocol.core.methods.response.EthLog; |
|
||||||
import org.web3j.protocol.core.methods.response.EthLog.LogResult; |
|
||||||
|
|
||||||
@SuppressWarnings("rawtypes") |
|
||||||
public class PrivGetFilterLogsTransaction implements Transaction<List<LogResult>> { |
|
||||||
|
|
||||||
private final String privacyGroupId; |
|
||||||
private final String filterId; |
|
||||||
|
|
||||||
public PrivGetFilterLogsTransaction(final String privacyGroupId, final String filterId) { |
|
||||||
this.privacyGroupId = privacyGroupId; |
|
||||||
this.filterId = filterId; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public List<LogResult> execute(final NodeRequests node) { |
|
||||||
try { |
|
||||||
final EthLog response = node.privacy().privGetFilterLogs(privacyGroupId, filterId).send(); |
|
||||||
|
|
||||||
assertThat(response).as("check response is not null").isNotNull(); |
|
||||||
assertThat(response.getResult()).as("check result in response isn't null").isNotNull(); |
|
||||||
assertThat(response.getLogs()).isNotNull(); |
|
||||||
|
|
||||||
return response.getLogs(); |
|
||||||
} catch (final IOException e) { |
|
||||||
throw new RuntimeException(e); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,52 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.filter; |
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.privacy.util.LogFilterJsonParameter; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.NodeRequests; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
import org.web3j.protocol.core.methods.response.EthFilter; |
|
||||||
|
|
||||||
public class PrivNewFilterTransaction implements Transaction<String> { |
|
||||||
|
|
||||||
private final String privacyGroupId; |
|
||||||
private final LogFilterJsonParameter filterParameter; |
|
||||||
|
|
||||||
public PrivNewFilterTransaction( |
|
||||||
final String privacyGroupId, final LogFilterJsonParameter filterParameter) { |
|
||||||
this.privacyGroupId = privacyGroupId; |
|
||||||
this.filterParameter = filterParameter; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public String execute(final NodeRequests node) { |
|
||||||
try { |
|
||||||
final EthFilter response = |
|
||||||
node.privacy().privNewFilter(privacyGroupId, filterParameter).send(); |
|
||||||
|
|
||||||
assertThat(response).as("check response is not null").isNotNull(); |
|
||||||
assertThat(response.getResult()).as("check result in response isn't null").isNotNull(); |
|
||||||
|
|
||||||
return response.getResult(); |
|
||||||
} catch (final IOException e) { |
|
||||||
throw new RuntimeException(e); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,50 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.dsl.transaction.privacy.filter; |
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.NodeRequests; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
import org.web3j.protocol.core.methods.response.EthUninstallFilter; |
|
||||||
|
|
||||||
public class PrivUninstallFilterTransaction implements Transaction<Boolean> { |
|
||||||
|
|
||||||
private final String privacyGroupId; |
|
||||||
private final String filterId; |
|
||||||
|
|
||||||
public PrivUninstallFilterTransaction(final String privacyGroupId, final String filterId) { |
|
||||||
this.privacyGroupId = privacyGroupId; |
|
||||||
this.filterId = filterId; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public Boolean execute(final NodeRequests node) { |
|
||||||
try { |
|
||||||
final EthUninstallFilter response = |
|
||||||
node.privacy().privUninstallFilter(privacyGroupId, filterId).send(); |
|
||||||
|
|
||||||
assertThat(response).as("check response is not null").isNotNull(); |
|
||||||
assertThat(response.getResult()).as("check result in response isn't null").isNotNull(); |
|
||||||
|
|
||||||
return response.isUninstalled(); |
|
||||||
} catch (final IOException e) { |
|
||||||
throw new RuntimeException(e); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,195 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.privacy.contracts; |
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat; |
|
||||||
import static org.assertj.core.api.Assertions.assertThatThrownBy; |
|
||||||
|
|
||||||
import org.hyperledger.besu.privacy.contracts.generated.DefaultFlexiblePrivacyGroupManagementContract; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.AcceptanceTestBase; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.node.BesuNode; |
|
||||||
|
|
||||||
import java.util.Arrays; |
|
||||||
import java.util.Collections; |
|
||||||
import java.util.List; |
|
||||||
|
|
||||||
import org.junit.jupiter.api.BeforeEach; |
|
||||||
import org.junit.jupiter.api.Test; |
|
||||||
import org.web3j.protocol.core.RemoteFunctionCall; |
|
||||||
import org.web3j.protocol.core.methods.response.TransactionReceipt; |
|
||||||
import org.web3j.protocol.exceptions.TransactionException; |
|
||||||
import org.web3j.utils.Base64String; |
|
||||||
|
|
||||||
@SuppressWarnings("unchecked") |
|
||||||
public class PrivacyGroupTest extends AcceptanceTestBase { |
|
||||||
|
|
||||||
private final Base64String firstParticipant = |
|
||||||
Base64String.wrap("A1aVtMxLCUHmBVHXoZzzBgPbW/wj5axDpW9X8l91SGo="); |
|
||||||
private final Base64String secondParticipant = |
|
||||||
Base64String.wrap("Ko2bVqD+nNlNYL5EE7y3IdOnviftjiizpjRt+HTuFBs="); |
|
||||||
private final Base64String thirdParticipant = |
|
||||||
Base64String.wrap("Jo2bVqD+nNlNYL5EE7y3IdOnviftjiizpjRt+HTuFBs="); |
|
||||||
private DefaultFlexiblePrivacyGroupManagementContract defaultPrivacyGroupManagementContract; |
|
||||||
|
|
||||||
private static final String RAW_FIRST_PARTICIPANT = "0x5aa68ac0"; |
|
||||||
private static final String RAW_ADD_PARTICIPANT = |
|
||||||
"0x965a25ef00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000202a8d9b56a0fe9cd94d60be4413bcb721d3a7be27ed8e28b3a6346df874ee141b"; |
|
||||||
private static final String RAW_REMOVE_PARTICIPANT = |
|
||||||
"0x1f52a8ee000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000202a8d9b56a0fe9cd94d60be4413bcb721d3a7be27ed8e28b3a6346df874ee141b"; |
|
||||||
private static final String RAW_LOCK = "0xf83d08ba"; |
|
||||||
private static final String RAW_UNLOCK = "0xa69df4b5"; |
|
||||||
private static final String RAW_CAN_EXECUTE = "0x78b90337"; |
|
||||||
private static final String RAW_GET_VERSION = "0x0d8e6e2c"; |
|
||||||
|
|
||||||
private BesuNode minerNode; |
|
||||||
|
|
||||||
@BeforeEach |
|
||||||
public void setUp() throws Exception { |
|
||||||
minerNode = besu.createMinerNode("node"); |
|
||||||
cluster.start(minerNode); |
|
||||||
defaultPrivacyGroupManagementContract = |
|
||||||
minerNode.execute( |
|
||||||
contractTransactions.createSmartContract( |
|
||||||
DefaultFlexiblePrivacyGroupManagementContract.class)); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
public void rlp() throws Exception { |
|
||||||
final String contractAddress = "0x42699a7612a82f1d9c36148af9c77354759b210b"; |
|
||||||
assertThat(defaultPrivacyGroupManagementContract.isValid()).isEqualTo(true); |
|
||||||
contractVerifier |
|
||||||
.validTransactionReceipt(contractAddress) |
|
||||||
.verify(defaultPrivacyGroupManagementContract); |
|
||||||
// 0x0b0235be
|
|
||||||
assertThat(defaultPrivacyGroupManagementContract.getParticipants().encodeFunctionCall()) |
|
||||||
.isEqualTo(RAW_FIRST_PARTICIPANT); |
|
||||||
// 0xf744b089
|
|
||||||
assertThat( |
|
||||||
defaultPrivacyGroupManagementContract |
|
||||||
.addParticipants(Collections.singletonList(secondParticipant.raw())) |
|
||||||
.encodeFunctionCall()) |
|
||||||
.isEqualTo(RAW_ADD_PARTICIPANT); |
|
||||||
// 0xf744b089
|
|
||||||
assertThat( |
|
||||||
defaultPrivacyGroupManagementContract |
|
||||||
.removeParticipant(secondParticipant.raw()) |
|
||||||
.encodeFunctionCall()) |
|
||||||
.isEqualTo(RAW_REMOVE_PARTICIPANT); |
|
||||||
assertThat(defaultPrivacyGroupManagementContract.lock().encodeFunctionCall()) |
|
||||||
.isEqualTo(RAW_LOCK); |
|
||||||
assertThat(defaultPrivacyGroupManagementContract.unlock().encodeFunctionCall()) |
|
||||||
.isEqualTo(RAW_UNLOCK); |
|
||||||
assertThat(defaultPrivacyGroupManagementContract.canExecute().encodeFunctionCall()) |
|
||||||
.isEqualTo(RAW_CAN_EXECUTE); |
|
||||||
assertThat(defaultPrivacyGroupManagementContract.getVersion().encodeFunctionCall()) |
|
||||||
.isEqualTo(RAW_GET_VERSION); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
public void canInitiallyAddParticipants() throws Exception { |
|
||||||
final RemoteFunctionCall<TransactionReceipt> transactionReceiptRemoteFunctionCall = |
|
||||||
defaultPrivacyGroupManagementContract.addParticipants( |
|
||||||
Arrays.asList(firstParticipant.raw(), secondParticipant.raw())); |
|
||||||
transactionReceiptRemoteFunctionCall.send(); |
|
||||||
final List<byte[]> participants = |
|
||||||
defaultPrivacyGroupManagementContract.getParticipants().send(); |
|
||||||
assertThat(participants.size()).isEqualTo(2); |
|
||||||
assertThat(firstParticipant.raw()).isEqualTo(participants.get(0)); |
|
||||||
assertThat(secondParticipant.raw()).isEqualTo(participants.get(1)); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
public void canRemoveParticipant() throws Exception { |
|
||||||
defaultPrivacyGroupManagementContract |
|
||||||
.addParticipants(Arrays.asList(firstParticipant.raw(), secondParticipant.raw())) |
|
||||||
.send(); |
|
||||||
final List<byte[]> participants = |
|
||||||
defaultPrivacyGroupManagementContract.getParticipants().send(); |
|
||||||
assertThat(participants.size()).isEqualTo(2); |
|
||||||
assertThat(firstParticipant.raw()).isEqualTo(participants.get(0)); |
|
||||||
assertThat(secondParticipant.raw()).isEqualTo(participants.get(1)); |
|
||||||
defaultPrivacyGroupManagementContract.removeParticipant(secondParticipant.raw()).send(); |
|
||||||
final List<byte[]> participantsAfterRemove = |
|
||||||
defaultPrivacyGroupManagementContract.getParticipants().send(); |
|
||||||
assertThat(participantsAfterRemove.size()).isEqualTo(1); |
|
||||||
assertThat(firstParticipant.raw()).isEqualTo(participantsAfterRemove.get(0)); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
public void cannotAddToContractWhenNotLocked() throws Exception { |
|
||||||
defaultPrivacyGroupManagementContract |
|
||||||
.addParticipants(Collections.singletonList(thirdParticipant.raw())) |
|
||||||
.send(); |
|
||||||
|
|
||||||
assertThatThrownBy( |
|
||||||
() -> |
|
||||||
defaultPrivacyGroupManagementContract |
|
||||||
.addParticipants(Collections.singletonList(secondParticipant.raw())) |
|
||||||
.send()) |
|
||||||
.isInstanceOf(TransactionException.class); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
public void ensureContractIsLockedAfterDeploy() throws Exception { |
|
||||||
assertThat(defaultPrivacyGroupManagementContract.canExecute().send()).isFalse(); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
public void ensurePrivacyGroupVersionIsAlwaysDifferent() throws Exception { |
|
||||||
defaultPrivacyGroupManagementContract |
|
||||||
.addParticipants(Collections.singletonList(secondParticipant.raw())) |
|
||||||
.send(); |
|
||||||
final byte[] version1 = defaultPrivacyGroupManagementContract.getVersion().send(); |
|
||||||
defaultPrivacyGroupManagementContract.lock().send(); |
|
||||||
defaultPrivacyGroupManagementContract |
|
||||||
.addParticipants(Collections.singletonList(thirdParticipant.raw())) |
|
||||||
.send(); |
|
||||||
final byte[] version2 = defaultPrivacyGroupManagementContract.getVersion().send(); |
|
||||||
defaultPrivacyGroupManagementContract.removeParticipant(secondParticipant.raw()).send(); |
|
||||||
final byte[] version3 = defaultPrivacyGroupManagementContract.getVersion().send(); |
|
||||||
|
|
||||||
assertThat(version1).isNotEqualTo(version2); |
|
||||||
assertThat(version1).isNotEqualTo(version3); |
|
||||||
assertThat(version2).isNotEqualTo(version3); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
public void canAddTwiceToContractWhenCallLock() throws Exception { |
|
||||||
defaultPrivacyGroupManagementContract |
|
||||||
.addParticipants(Arrays.asList(firstParticipant.raw(), thirdParticipant.raw())) |
|
||||||
.send(); |
|
||||||
defaultPrivacyGroupManagementContract.lock().send(); |
|
||||||
defaultPrivacyGroupManagementContract |
|
||||||
.addParticipants(Collections.singletonList(secondParticipant.raw())) |
|
||||||
.send(); |
|
||||||
|
|
||||||
final List<byte[]> participants = |
|
||||||
defaultPrivacyGroupManagementContract.getParticipants().send(); |
|
||||||
assertThat(participants.size()).isEqualTo(3); |
|
||||||
assertThat(firstParticipant.raw()).isEqualTo(participants.get(0)); |
|
||||||
assertThat(thirdParticipant.raw()).isEqualTo(participants.get(1)); |
|
||||||
assertThat(secondParticipant.raw()).isEqualTo(participants.get(2)); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
public void cannotLockTwice() throws Exception { |
|
||||||
defaultPrivacyGroupManagementContract |
|
||||||
.addParticipants(Collections.singletonList(thirdParticipant.raw())) |
|
||||||
.send(); |
|
||||||
defaultPrivacyGroupManagementContract.lock().send(); |
|
||||||
assertThatThrownBy(() -> defaultPrivacyGroupManagementContract.lock().send()) |
|
||||||
.isInstanceOf(TransactionException.class); |
|
||||||
} |
|
||||||
} |
|
@ -1,178 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.privacy.contracts; |
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat; |
|
||||||
import static org.assertj.core.api.Assertions.assertThatThrownBy; |
|
||||||
|
|
||||||
import org.hyperledger.besu.privacy.contracts.generated.DefaultFlexiblePrivacyGroupManagementContract; |
|
||||||
import org.hyperledger.besu.privacy.contracts.generated.FlexiblePrivacyGroupManagementProxy; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.AcceptanceTestBase; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.account.Accounts; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.node.BesuNode; |
|
||||||
|
|
||||||
import java.util.Arrays; |
|
||||||
import java.util.Collections; |
|
||||||
import java.util.List; |
|
||||||
|
|
||||||
import org.junit.jupiter.api.BeforeEach; |
|
||||||
import org.junit.jupiter.api.Test; |
|
||||||
import org.web3j.crypto.Credentials; |
|
||||||
import org.web3j.protocol.Web3j; |
|
||||||
import org.web3j.protocol.exceptions.TransactionException; |
|
||||||
import org.web3j.protocol.http.HttpService; |
|
||||||
import org.web3j.tx.gas.DefaultGasProvider; |
|
||||||
import org.web3j.utils.Base64String; |
|
||||||
|
|
||||||
@SuppressWarnings("unchecked") |
|
||||||
public class PrivacyProxyTest extends AcceptanceTestBase { |
|
||||||
|
|
||||||
private final Base64String firstParticipant = |
|
||||||
Base64String.wrap("93Ky7lXwFkMc7+ckoFgUMku5bpr9tz4zhmWmk9RlNng="); |
|
||||||
private final Base64String secondParticipant = |
|
||||||
Base64String.wrap("9iaJ6OObl6TUWYjXAOyZsL0VaDPwF+tRFkMwwYSeqqw="); |
|
||||||
private final Base64String thirdParticipant = |
|
||||||
Base64String.wrap("Jo2bVqD+nNlNYL5EE7y3IdOnviftjiizpjRt+HTuFBs="); |
|
||||||
private FlexiblePrivacyGroupManagementProxy flexiblePrivacyGroupManagementProxy; |
|
||||||
|
|
||||||
private static final String RAW_GET_PARTICIPANTS = "0x5aa68ac0"; |
|
||||||
private static final String RAW_ADD_PARTICIPANT = |
|
||||||
"0x965a25ef0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020f772b2ee55f016431cefe724a05814324bb96e9afdb73e338665a693d4653678"; |
|
||||||
|
|
||||||
private BesuNode minerNode; |
|
||||||
private DefaultFlexiblePrivacyGroupManagementContract |
|
||||||
defaultFlexiblePrivacyGroupManagementContract; |
|
||||||
|
|
||||||
@BeforeEach |
|
||||||
public void setUp() throws Exception { |
|
||||||
minerNode = besu.createMinerNode("node"); |
|
||||||
cluster.start(minerNode); |
|
||||||
defaultFlexiblePrivacyGroupManagementContract = |
|
||||||
minerNode.execute( |
|
||||||
contractTransactions.createSmartContract( |
|
||||||
DefaultFlexiblePrivacyGroupManagementContract.class)); |
|
||||||
flexiblePrivacyGroupManagementProxy = |
|
||||||
minerNode.execute( |
|
||||||
contractTransactions.createSmartContract( |
|
||||||
FlexiblePrivacyGroupManagementProxy.class, |
|
||||||
defaultFlexiblePrivacyGroupManagementContract.getContractAddress())); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
public void rlp() throws Exception { |
|
||||||
assertThat(flexiblePrivacyGroupManagementProxy.isValid()).isEqualTo(true); |
|
||||||
contractVerifier |
|
||||||
.validTransactionReceipt(flexiblePrivacyGroupManagementProxy.getContractAddress()) |
|
||||||
.verify(flexiblePrivacyGroupManagementProxy); |
|
||||||
assertThat(flexiblePrivacyGroupManagementProxy.getParticipants().encodeFunctionCall()) |
|
||||||
.isEqualTo(RAW_GET_PARTICIPANTS); |
|
||||||
|
|
||||||
assertThat( |
|
||||||
flexiblePrivacyGroupManagementProxy |
|
||||||
.addParticipants(List.of(firstParticipant.raw())) |
|
||||||
.encodeFunctionCall()) |
|
||||||
.isEqualTo(RAW_ADD_PARTICIPANT); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
public void deploysWithNoParticipant() throws Exception { |
|
||||||
final List<byte[]> participants = flexiblePrivacyGroupManagementProxy.getParticipants().send(); |
|
||||||
assertThat(participants.size()).isEqualTo(0); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
public void canAddParticipants() throws Exception { |
|
||||||
flexiblePrivacyGroupManagementProxy |
|
||||||
.addParticipants(Arrays.asList(firstParticipant.raw(), secondParticipant.raw())) |
|
||||||
.send(); |
|
||||||
final List<byte[]> participants = flexiblePrivacyGroupManagementProxy.getParticipants().send(); |
|
||||||
assertThat(participants.size()).isEqualTo(2); |
|
||||||
assertThat(firstParticipant.raw()).isEqualTo(participants.get(0)); |
|
||||||
assertThat(secondParticipant.raw()).isEqualTo(participants.get(1)); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
public void nonOwnerCannotUpgrade() throws Exception { |
|
||||||
flexiblePrivacyGroupManagementProxy |
|
||||||
.addParticipants(Arrays.asList(firstParticipant.raw(), secondParticipant.raw())) |
|
||||||
.send(); |
|
||||||
final List<byte[]> participants = flexiblePrivacyGroupManagementProxy.getParticipants().send(); |
|
||||||
assertThat(participants.size()).isEqualTo(2); |
|
||||||
assertThat(firstParticipant.raw()).isEqualTo(participants.get(0)); |
|
||||||
assertThat(secondParticipant.raw()).isEqualTo(participants.get(1)); |
|
||||||
|
|
||||||
final DefaultFlexiblePrivacyGroupManagementContract upgradedContract = |
|
||||||
minerNode.execute( |
|
||||||
contractTransactions.createSmartContract( |
|
||||||
DefaultFlexiblePrivacyGroupManagementContract.class)); |
|
||||||
|
|
||||||
final HttpService httpService = |
|
||||||
new HttpService( |
|
||||||
"http://" + minerNode.getHostName() + ":" + minerNode.getJsonRpcPort().get()); |
|
||||||
final Web3j web3j = Web3j.build(httpService); |
|
||||||
|
|
||||||
// load the proxy contract, use it with another signer
|
|
||||||
final FlexiblePrivacyGroupManagementProxy proxyContractAccount2 = |
|
||||||
FlexiblePrivacyGroupManagementProxy.load( |
|
||||||
flexiblePrivacyGroupManagementProxy.getContractAddress(), |
|
||||||
web3j, |
|
||||||
Credentials.create(Accounts.GENESIS_ACCOUNT_TWO_PRIVATE_KEY), |
|
||||||
new DefaultGasProvider()); |
|
||||||
// contract is the proxy contract and uses genesis account 2. It should not be able to upgrade
|
|
||||||
// the contract, because it is not the owner of "upgradedContract"
|
|
||||||
assertThatThrownBy( |
|
||||||
() -> proxyContractAccount2.upgradeTo(upgradedContract.getContractAddress()).send()) |
|
||||||
.isInstanceOf(TransactionException.class); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
public void ownerCanUpgrade() throws Exception { |
|
||||||
flexiblePrivacyGroupManagementProxy |
|
||||||
.addParticipants(Arrays.asList(firstParticipant.raw(), secondParticipant.raw())) |
|
||||||
.send(); |
|
||||||
final List<byte[]> participants = flexiblePrivacyGroupManagementProxy.getParticipants().send(); |
|
||||||
assertThat(participants.size()).isEqualTo(2); |
|
||||||
assertThat(firstParticipant.raw()).isEqualTo(participants.get(0)); |
|
||||||
assertThat(secondParticipant.raw()).isEqualTo(participants.get(1)); |
|
||||||
|
|
||||||
final DefaultFlexiblePrivacyGroupManagementContract upgradedContract = |
|
||||||
minerNode.execute( |
|
||||||
contractTransactions.createSmartContract( |
|
||||||
DefaultFlexiblePrivacyGroupManagementContract.class)); |
|
||||||
|
|
||||||
flexiblePrivacyGroupManagementProxy.upgradeTo(upgradedContract.getContractAddress()).send(); |
|
||||||
final List<byte[]> participantsAfterUpgrade = |
|
||||||
flexiblePrivacyGroupManagementProxy.getParticipants().send(); |
|
||||||
assertThat(participantsAfterUpgrade.size()).isEqualTo(2); |
|
||||||
assertThat(firstParticipant.raw()).isEqualTo(participantsAfterUpgrade.get(0)); |
|
||||||
assertThat(secondParticipant.raw()).isEqualTo(participantsAfterUpgrade.get(1)); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
public void canAddTwiceToContractWhenCallLock() throws Exception { |
|
||||||
flexiblePrivacyGroupManagementProxy |
|
||||||
.addParticipants(Arrays.asList(firstParticipant.raw(), thirdParticipant.raw())) |
|
||||||
.send(); |
|
||||||
flexiblePrivacyGroupManagementProxy.lock().send(); |
|
||||||
flexiblePrivacyGroupManagementProxy |
|
||||||
.addParticipants(Collections.singletonList(secondParticipant.raw())) |
|
||||||
.send(); |
|
||||||
final List<byte[]> participants = flexiblePrivacyGroupManagementProxy.getParticipants().send(); |
|
||||||
assertThat(participants.size()).isEqualTo(3); |
|
||||||
assertThat(firstParticipant.raw()).isEqualTo(participants.get(0)); |
|
||||||
assertThat(thirdParticipant.raw()).isEqualTo(participants.get(1)); |
|
||||||
assertThat(secondParticipant.raw()).isEqualTo(participants.get(2)); |
|
||||||
} |
|
||||||
} |
|
@ -1,408 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.privacy.multitenancy; |
|
||||||
|
|
||||||
import static com.github.tomakehurst.wiremock.client.WireMock.ok; |
|
||||||
import static com.github.tomakehurst.wiremock.client.WireMock.post; |
|
||||||
import static com.github.tomakehurst.wiremock.client.WireMock.stubFor; |
|
||||||
import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.options; |
|
||||||
import static java.nio.charset.StandardCharsets.UTF_8; |
|
||||||
import static java.util.Collections.emptyList; |
|
||||||
import static java.util.Collections.singletonList; |
|
||||||
import static org.hyperledger.besu.ethereum.core.PrivacyParameters.DEFAULT_PRIVACY; |
|
||||||
|
|
||||||
import org.hyperledger.besu.crypto.KeyPair; |
|
||||||
import org.hyperledger.besu.crypto.SignatureAlgorithm; |
|
||||||
import org.hyperledger.besu.crypto.SignatureAlgorithmFactory; |
|
||||||
import org.hyperledger.besu.datatypes.Address; |
|
||||||
import org.hyperledger.besu.datatypes.Hash; |
|
||||||
import org.hyperledger.besu.datatypes.Wei; |
|
||||||
import org.hyperledger.besu.enclave.types.PrivacyGroup; |
|
||||||
import org.hyperledger.besu.enclave.types.ReceiveResponse; |
|
||||||
import org.hyperledger.besu.enclave.types.SendResponse; |
|
||||||
import org.hyperledger.besu.ethereum.privacy.PrivacyGroupUtil; |
|
||||||
import org.hyperledger.besu.ethereum.privacy.PrivateTransaction; |
|
||||||
import org.hyperledger.besu.ethereum.rlp.BytesValueRLPOutput; |
|
||||||
import org.hyperledger.besu.plugin.data.Restriction; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.AcceptanceTestBase; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.node.BesuNode; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.node.cluster.Cluster; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.node.cluster.ClusterConfiguration; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.node.cluster.ClusterConfigurationBuilder; |
|
||||||
|
|
||||||
import java.math.BigInteger; |
|
||||||
import java.util.ArrayList; |
|
||||||
import java.util.List; |
|
||||||
import java.util.stream.Collectors; |
|
||||||
import javax.annotation.Nonnull; |
|
||||||
|
|
||||||
import com.fasterxml.jackson.core.JsonProcessingException; |
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper; |
|
||||||
import com.github.tomakehurst.wiremock.junit.WireMockRule; |
|
||||||
import com.google.common.base.Supplier; |
|
||||||
import com.google.common.base.Suppliers; |
|
||||||
import org.apache.tuweni.bytes.Bytes; |
|
||||||
import org.apache.tuweni.bytes.Bytes32; |
|
||||||
import org.junit.After; |
|
||||||
import org.junit.Before; |
|
||||||
import org.junit.Rule; |
|
||||||
import org.junit.Test; |
|
||||||
|
|
||||||
public class MultiTenancyAcceptanceTest extends AcceptanceTestBase { |
|
||||||
private BesuNode node; |
|
||||||
private final ObjectMapper mapper = new ObjectMapper(); |
|
||||||
private Cluster multiTenancyCluster; |
|
||||||
|
|
||||||
private static final Supplier<SignatureAlgorithm> SIGNATURE_ALGORITHM = |
|
||||||
Suppliers.memoize(SignatureAlgorithmFactory::getInstance); |
|
||||||
private static final KeyPair TEST_KEY = |
|
||||||
SIGNATURE_ALGORITHM |
|
||||||
.get() |
|
||||||
.createKeyPair( |
|
||||||
SIGNATURE_ALGORITHM |
|
||||||
.get() |
|
||||||
.createPrivateKey( |
|
||||||
new BigInteger( |
|
||||||
"853d7f0010fd86d0d7811c1f9d968ea89a24484a8127b4a483ddf5d2cfec766d", 16))); |
|
||||||
private static final String PRIVACY_GROUP_ID = "B1aVtMxLCUHmBVHXoZzzBgPbW/wj5axDpW9X8l91SGo="; |
|
||||||
private static final String PARTICIPANT_ENCLAVE_KEY0 = |
|
||||||
"A1aVtMxLCUHmBVHXoZzzBgPbW/wj5axDpW9X8l91SGo="; |
|
||||||
private static final Bytes LEAGCY_PRIVATE_FROM = Bytes.fromBase64String(PARTICIPANT_ENCLAVE_KEY0); |
|
||||||
private static final String PARTICIPANT_ENCLAVE_KEY1 = |
|
||||||
"sgFkVOyFndZe/5SAZJO5UYbrl7pezHetveriBBWWnE8="; |
|
||||||
private static final List<Bytes> LEGACY_PRIVATE_FOR = |
|
||||||
List.of(Bytes.fromBase64String(PARTICIPANT_ENCLAVE_KEY1)); |
|
||||||
private static final String PARTICIPANT_ENCLAVE_KEY2 = |
|
||||||
"R1kW75NQC9XX3kwNpyPjCBFflM29+XvnKKS9VLrUkzo="; |
|
||||||
private static final String PARTICIPANT_ENCLAVE_KEY3 = |
|
||||||
"A1aVtMxLCUHmBVHXoZzzBgPbW/wj5axDpW9X8l91SGo="; |
|
||||||
private final Address senderAddress = |
|
||||||
Address.wrap(Bytes.fromHexString(accounts.getPrimaryBenefactor().getAddress())); |
|
||||||
|
|
||||||
@Rule public WireMockRule wireMockRule = new WireMockRule(options().dynamicPort()); |
|
||||||
|
|
||||||
@Before |
|
||||||
public void setUp() throws Exception { |
|
||||||
final ClusterConfiguration clusterConfiguration = |
|
||||||
new ClusterConfigurationBuilder().awaitPeerDiscovery(false).build(); |
|
||||||
multiTenancyCluster = new Cluster(clusterConfiguration, net); |
|
||||||
node = |
|
||||||
besu.createNodeWithMultiTenantedPrivacy( |
|
||||||
"node1", |
|
||||||
"http://127.0.0.1:" + wireMockRule.port(), |
|
||||||
"authentication/auth_priv.toml", |
|
||||||
"authentication/auth_priv_key", |
|
||||||
false, |
|
||||||
false); |
|
||||||
multiTenancyCluster.start(node); |
|
||||||
final String token = |
|
||||||
node.execute(permissioningTransactions.createSuccessfulLogin("user", "pegasys")); |
|
||||||
node.useAuthenticationTokenInHeaderForJsonRpc(token); |
|
||||||
} |
|
||||||
|
|
||||||
@After |
|
||||||
public void tearDown() { |
|
||||||
multiTenancyCluster.close(); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
public void privGetPrivacyPrecompileAddressShouldReturnExpectedAddress() { |
|
||||||
node.verify(priv.getPrivacyPrecompileAddress(DEFAULT_PRIVACY)); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
public void privGetPrivateTransactionSuccessShouldReturnExpectedPrivateTransaction() |
|
||||||
throws JsonProcessingException { |
|
||||||
final PrivateTransaction validSignedPrivateTransaction = |
|
||||||
getValidSignedPrivateTransaction(senderAddress); |
|
||||||
|
|
||||||
receiveEnclaveStub(validSignedPrivateTransaction); |
|
||||||
retrievePrivacyGroupEnclaveStub(); |
|
||||||
sendEnclaveStub(PARTICIPANT_ENCLAVE_KEY1); |
|
||||||
|
|
||||||
final Hash transactionHash = |
|
||||||
node.execute( |
|
||||||
privacyTransactions.sendRawTransaction( |
|
||||||
getRLPOutput(validSignedPrivateTransaction).encoded().toHexString())); |
|
||||||
node.verify(priv.getSuccessfulTransactionReceipt(transactionHash)); |
|
||||||
node.verify(priv.getPrivateTransaction(transactionHash, validSignedPrivateTransaction)); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
public void privCreatePrivacyGroupSuccessShouldReturnNewId() throws JsonProcessingException { |
|
||||||
createPrivacyGroupEnclaveStub(); |
|
||||||
|
|
||||||
node.verify( |
|
||||||
priv.createPrivacyGroup( |
|
||||||
List.of(PARTICIPANT_ENCLAVE_KEY1, PARTICIPANT_ENCLAVE_KEY2, PARTICIPANT_ENCLAVE_KEY3), |
|
||||||
"GroupName", |
|
||||||
"Group description.", |
|
||||||
PRIVACY_GROUP_ID)); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
public void privDeletePrivacyGroupSuccessShouldReturnId() throws JsonProcessingException { |
|
||||||
retrievePrivacyGroupEnclaveStub(); |
|
||||||
deletePrivacyGroupEnclaveStub(); |
|
||||||
|
|
||||||
node.verify(priv.deletePrivacyGroup(PRIVACY_GROUP_ID)); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
public void privFindPrivacyGroupSuccessShouldReturnExpectedGroupMembership() |
|
||||||
throws JsonProcessingException { |
|
||||||
final List<PrivacyGroup> groupMembership = |
|
||||||
List.of( |
|
||||||
testPrivacyGroup(singletonList(PARTICIPANT_ENCLAVE_KEY0), PrivacyGroup.Type.PANTHEON), |
|
||||||
testPrivacyGroup(singletonList(PARTICIPANT_ENCLAVE_KEY0), PrivacyGroup.Type.PANTHEON), |
|
||||||
testPrivacyGroup(singletonList(PARTICIPANT_ENCLAVE_KEY0), PrivacyGroup.Type.PANTHEON)); |
|
||||||
|
|
||||||
findPrivacyGroupEnclaveStub(groupMembership); |
|
||||||
|
|
||||||
node.verify(priv.findPrivacyGroup(groupMembership.size(), PARTICIPANT_ENCLAVE_KEY0)); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
public void eeaSendRawTransactionSuccessShouldReturnPrivateTransactionHash() |
|
||||||
throws JsonProcessingException { |
|
||||||
final PrivateTransaction validSignedPrivateTransaction = |
|
||||||
getValidSignedPrivateTransaction(senderAddress); |
|
||||||
|
|
||||||
retrievePrivacyGroupEnclaveStub(); |
|
||||||
sendEnclaveStub(PARTICIPANT_ENCLAVE_KEY1); |
|
||||||
receiveEnclaveStub(validSignedPrivateTransaction); |
|
||||||
|
|
||||||
node.verify( |
|
||||||
priv.eeaSendRawTransaction( |
|
||||||
getRLPOutput(validSignedPrivateTransaction).encoded().toHexString())); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
public void privGetTransactionCountSuccessShouldReturnExpectedTransactionCount() |
|
||||||
throws JsonProcessingException { |
|
||||||
final PrivateTransaction validSignedPrivateTransaction = |
|
||||||
getValidSignedPrivateTransaction(senderAddress); |
|
||||||
final String accountAddress = validSignedPrivateTransaction.getSender().toHexString(); |
|
||||||
final BytesValueRLPOutput rlpOutput = getRLPOutput(validSignedPrivateTransaction); |
|
||||||
|
|
||||||
retrievePrivacyGroupEnclaveStub(); |
|
||||||
sendEnclaveStub(PARTICIPANT_ENCLAVE_KEY1); |
|
||||||
receiveEnclaveStub(validSignedPrivateTransaction); |
|
||||||
|
|
||||||
node.verify(priv.getTransactionCount(accountAddress, PRIVACY_GROUP_ID, 0)); |
|
||||||
final Hash transactionReceipt = |
|
||||||
node.execute(privacyTransactions.sendRawTransaction(rlpOutput.encoded().toHexString())); |
|
||||||
|
|
||||||
node.verify(priv.getSuccessfulTransactionReceipt(transactionReceipt)); |
|
||||||
node.verify(priv.getTransactionCount(accountAddress, PRIVACY_GROUP_ID, 1)); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
public void privDistributeRawTransactionSuccessShouldReturnEnclaveKey() |
|
||||||
throws JsonProcessingException { |
|
||||||
final String enclaveResponseKeyBytes = |
|
||||||
Bytes.wrap(Bytes.fromBase64String(PARTICIPANT_ENCLAVE_KEY1)).toString(); |
|
||||||
|
|
||||||
retrievePrivacyGroupEnclaveStub(); |
|
||||||
sendEnclaveStub(PARTICIPANT_ENCLAVE_KEY1); |
|
||||||
|
|
||||||
node.verify( |
|
||||||
priv.distributeRawTransaction( |
|
||||||
getRLPOutput(getValidSignedPrivateTransaction(senderAddress)).encoded().toHexString(), |
|
||||||
enclaveResponseKeyBytes)); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
public void privGetTransactionReceiptSuccessShouldReturnTransactionReceiptAfterMined() |
|
||||||
throws JsonProcessingException { |
|
||||||
final PrivateTransaction validSignedPrivateTransaction = |
|
||||||
getValidSignedPrivateTransaction(senderAddress); |
|
||||||
final BytesValueRLPOutput rlpOutput = getRLPOutput(validSignedPrivateTransaction); |
|
||||||
|
|
||||||
retrievePrivacyGroupEnclaveStub(); |
|
||||||
sendEnclaveStub(PARTICIPANT_ENCLAVE_KEY1); |
|
||||||
receiveEnclaveStub(validSignedPrivateTransaction); |
|
||||||
|
|
||||||
final Hash transactionReceipt = |
|
||||||
node.execute(privacyTransactions.sendRawTransaction(rlpOutput.encoded().toHexString())); |
|
||||||
|
|
||||||
node.verify(priv.getSuccessfulTransactionReceipt(transactionReceipt)); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
public void privGetEeaTransactionCountSuccessShouldReturnExpectedTransactionCount() |
|
||||||
throws JsonProcessingException { |
|
||||||
final PrivateTransaction validSignedPrivateTransaction = |
|
||||||
getValidLegacySignedPrivateTransaction(senderAddress); |
|
||||||
final String accountAddress = validSignedPrivateTransaction.getSender().toHexString(); |
|
||||||
final String privateTxRlp = getRLPOutput(validSignedPrivateTransaction).encoded().toHexString(); |
|
||||||
|
|
||||||
retrieveEeaPrivacyGroupEnclaveStub(validSignedPrivateTransaction); |
|
||||||
sendEnclaveStub( |
|
||||||
Bytes32.ZERO.toBase64String()); // can be any value, as we are stubbing the enclave
|
|
||||||
receiveEnclaveStubEea(validSignedPrivateTransaction); |
|
||||||
|
|
||||||
final String privateFrom = validSignedPrivateTransaction.getPrivateFrom().toBase64String(); |
|
||||||
final String[] privateFor = |
|
||||||
validSignedPrivateTransaction.getPrivateFor().orElseThrow().stream() |
|
||||||
.map(Bytes::toBase64String) |
|
||||||
.toArray(String[]::new); |
|
||||||
node.verify(priv.getEeaTransactionCount(accountAddress, privateFrom, privateFor, 0)); |
|
||||||
|
|
||||||
final Hash transactionHash = node.execute(privacyTransactions.sendRawTransaction(privateTxRlp)); |
|
||||||
|
|
||||||
node.verify(priv.getSuccessfulTransactionReceipt(transactionHash)); |
|
||||||
|
|
||||||
node.verify(priv.getEeaTransactionCount(accountAddress, privateFrom, privateFor, 1)); |
|
||||||
} |
|
||||||
|
|
||||||
@Nonnull |
|
||||||
private Bytes32 getPrivacyGroupIdFromEeaTransaction( |
|
||||||
final PrivateTransaction validSignedPrivateTransaction) { |
|
||||||
return PrivacyGroupUtil.calculateEeaPrivacyGroupId( |
|
||||||
validSignedPrivateTransaction.getPrivateFrom(), |
|
||||||
validSignedPrivateTransaction.getPrivateFor().get()); |
|
||||||
} |
|
||||||
|
|
||||||
private void findPrivacyGroupEnclaveStub(final List<PrivacyGroup> groupMembership) |
|
||||||
throws JsonProcessingException { |
|
||||||
final String findGroupResponse = mapper.writeValueAsString(groupMembership); |
|
||||||
stubFor(post("/findPrivacyGroup").willReturn(ok(findGroupResponse))); |
|
||||||
} |
|
||||||
|
|
||||||
private void createPrivacyGroupEnclaveStub() throws JsonProcessingException { |
|
||||||
final String createGroupResponse = |
|
||||||
mapper.writeValueAsString(testPrivacyGroup(emptyList(), PrivacyGroup.Type.PANTHEON)); |
|
||||||
stubFor(post("/createPrivacyGroup").willReturn(ok(createGroupResponse))); |
|
||||||
} |
|
||||||
|
|
||||||
private void deletePrivacyGroupEnclaveStub() throws JsonProcessingException { |
|
||||||
final String deleteGroupResponse = mapper.writeValueAsString(PRIVACY_GROUP_ID); |
|
||||||
stubFor(post("/deletePrivacyGroup").willReturn(ok(deleteGroupResponse))); |
|
||||||
} |
|
||||||
|
|
||||||
private void retrievePrivacyGroupEnclaveStub() throws JsonProcessingException { |
|
||||||
final String retrieveGroupResponse = |
|
||||||
mapper.writeValueAsString( |
|
||||||
testPrivacyGroup( |
|
||||||
List.of(PARTICIPANT_ENCLAVE_KEY0, PARTICIPANT_ENCLAVE_KEY1), |
|
||||||
PrivacyGroup.Type.PANTHEON)); |
|
||||||
stubFor(post("/retrievePrivacyGroup").willReturn(ok(retrieveGroupResponse))); |
|
||||||
} |
|
||||||
|
|
||||||
private void retrieveEeaPrivacyGroupEnclaveStub(final PrivateTransaction tx) |
|
||||||
throws JsonProcessingException { |
|
||||||
final ArrayList<String> members = new ArrayList<>(); |
|
||||||
members.add(tx.getPrivateFrom().toBase64String()); |
|
||||||
members.addAll( |
|
||||||
tx.getPrivateFor().orElseThrow().stream() |
|
||||||
.map(Bytes::toBase64String) |
|
||||||
.collect(Collectors.toList())); |
|
||||||
final String retrieveGroupResponse = |
|
||||||
mapper.writeValueAsString(testPrivacyGroupEea(members, PrivacyGroup.Type.LEGACY)); |
|
||||||
stubFor(post("/retrievePrivacyGroup").willReturn(ok(retrieveGroupResponse))); |
|
||||||
} |
|
||||||
|
|
||||||
private void sendEnclaveStub(final String testKey) throws JsonProcessingException { |
|
||||||
final String sendResponse = mapper.writeValueAsString(new SendResponse(testKey)); |
|
||||||
stubFor(post("/send").willReturn(ok(sendResponse))); |
|
||||||
} |
|
||||||
|
|
||||||
private void receiveEnclaveStub(final PrivateTransaction privTx) throws JsonProcessingException { |
|
||||||
final BytesValueRLPOutput rlpOutput = getRLPOutputForReceiveResponse(privTx); |
|
||||||
final String senderKey = privTx.getPrivateFrom().toBase64String(); |
|
||||||
final String receiveResponse = |
|
||||||
mapper.writeValueAsString( |
|
||||||
new ReceiveResponse( |
|
||||||
rlpOutput.encoded().toBase64String().getBytes(UTF_8), PRIVACY_GROUP_ID, senderKey)); |
|
||||||
stubFor(post("/receive").willReturn(ok(receiveResponse))); |
|
||||||
} |
|
||||||
|
|
||||||
private void receiveEnclaveStubEea(final PrivateTransaction privTx) |
|
||||||
throws JsonProcessingException { |
|
||||||
final BytesValueRLPOutput rlpOutput = getRLPOutputForReceiveResponse(privTx); |
|
||||||
final String senderKey = privTx.getPrivateFrom().toBase64String(); |
|
||||||
final String receiveResponse = |
|
||||||
mapper.writeValueAsString( |
|
||||||
new ReceiveResponse( |
|
||||||
rlpOutput.encoded().toBase64String().getBytes(UTF_8), |
|
||||||
getPrivacyGroupIdFromEeaTransaction(privTx).toBase64String(), |
|
||||||
senderKey)); |
|
||||||
stubFor(post("/receive").willReturn(ok(receiveResponse))); |
|
||||||
} |
|
||||||
|
|
||||||
private BytesValueRLPOutput getRLPOutputForReceiveResponse( |
|
||||||
final PrivateTransaction privateTransaction) { |
|
||||||
final BytesValueRLPOutput bvrlpo = new BytesValueRLPOutput(); |
|
||||||
privateTransaction.writeTo(bvrlpo); |
|
||||||
return bvrlpo; |
|
||||||
} |
|
||||||
|
|
||||||
private BytesValueRLPOutput getRLPOutput(final PrivateTransaction privateTransaction) { |
|
||||||
final BytesValueRLPOutput bvrlpo = new BytesValueRLPOutput(); |
|
||||||
privateTransaction.writeTo(bvrlpo); |
|
||||||
return bvrlpo; |
|
||||||
} |
|
||||||
|
|
||||||
private PrivacyGroup testPrivacyGroup( |
|
||||||
final List<String> groupMembers, final PrivacyGroup.Type groupType) { |
|
||||||
return new PrivacyGroup(PRIVACY_GROUP_ID, groupType, "test", "testGroup", groupMembers); |
|
||||||
} |
|
||||||
|
|
||||||
private PrivacyGroup testPrivacyGroupEea( |
|
||||||
final List<String> groupMembers, final PrivacyGroup.Type groupType) { |
|
||||||
final Bytes32 privacyGroupId = |
|
||||||
PrivacyGroupUtil.calculateEeaPrivacyGroupId( |
|
||||||
Bytes.fromBase64String(groupMembers.get(0)), |
|
||||||
groupMembers.stream() |
|
||||||
.map(gm -> Bytes.fromBase64String(gm)) |
|
||||||
.collect(Collectors.toList())); |
|
||||||
return new PrivacyGroup( |
|
||||||
privacyGroupId.toBase64String(), groupType, "test", "testGroup", groupMembers); |
|
||||||
} |
|
||||||
|
|
||||||
private static PrivateTransaction getValidSignedPrivateTransaction(final Address senderAddress) { |
|
||||||
return PrivateTransaction.builder() |
|
||||||
.nonce(0) |
|
||||||
.gasPrice(Wei.ZERO) |
|
||||||
.gasLimit(3000000) |
|
||||||
.to(null) |
|
||||||
.value(Wei.ZERO) |
|
||||||
.payload(Bytes.wrap(new byte[] {})) |
|
||||||
.sender(senderAddress) |
|
||||||
.chainId(BigInteger.valueOf(1337)) |
|
||||||
.privateFrom(Bytes.fromBase64String(PARTICIPANT_ENCLAVE_KEY0)) |
|
||||||
.restriction(Restriction.RESTRICTED) |
|
||||||
.privacyGroupId(Bytes.fromBase64String(PRIVACY_GROUP_ID)) |
|
||||||
.signAndBuild(TEST_KEY); |
|
||||||
} |
|
||||||
|
|
||||||
private static PrivateTransaction getValidLegacySignedPrivateTransaction( |
|
||||||
final Address senderAddress) { |
|
||||||
return PrivateTransaction.builder() |
|
||||||
.nonce(0) |
|
||||||
.gasPrice(Wei.ZERO) |
|
||||||
.gasLimit(3000000) |
|
||||||
.to(null) |
|
||||||
.value(Wei.ZERO) |
|
||||||
.payload(Bytes.wrap(new byte[] {})) |
|
||||||
.sender(senderAddress) |
|
||||||
.chainId(BigInteger.valueOf(1337)) |
|
||||||
.privateFrom(LEAGCY_PRIVATE_FROM) |
|
||||||
.privateFor(LEGACY_PRIVATE_FOR) |
|
||||||
.restriction(Restriction.RESTRICTED) |
|
||||||
.signAndBuild(TEST_KEY); |
|
||||||
} |
|
||||||
} |
|
@ -1,58 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.privacy.multitenancy; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.privacy.PrivacyNode; |
|
||||||
|
|
||||||
import java.util.Collection; |
|
||||||
import java.util.HashMap; |
|
||||||
import java.util.List; |
|
||||||
import java.util.Map; |
|
||||||
import java.util.stream.Collectors; |
|
||||||
|
|
||||||
public class MultiTenancyPrivacyGroup { |
|
||||||
|
|
||||||
private final Map<MultiTenancyPrivacyNode, List<String>> map; |
|
||||||
|
|
||||||
public MultiTenancyPrivacyGroup() { |
|
||||||
this.map = new HashMap<>(); |
|
||||||
} |
|
||||||
|
|
||||||
public MultiTenancyPrivacyGroup addNodeWithTenants( |
|
||||||
final MultiTenancyPrivacyNode privacyNode, final List<String> tenants) { |
|
||||||
map.put(privacyNode, tenants); |
|
||||||
return this; |
|
||||||
} |
|
||||||
|
|
||||||
public List<MultiTenancyPrivacyNode> getPrivacyNodes() { |
|
||||||
return map.keySet().stream().collect(Collectors.toList()); |
|
||||||
} |
|
||||||
|
|
||||||
public List<String> getTenantsForNode(final MultiTenancyPrivacyNode privacyNode) { |
|
||||||
return map.get(privacyNode); |
|
||||||
} |
|
||||||
|
|
||||||
public List<String> getTenants() { |
|
||||||
return map.values().stream().flatMap(Collection::stream).collect(Collectors.toList()); |
|
||||||
} |
|
||||||
|
|
||||||
public PrivacyNode getGroupCreatingPrivacyNode() { |
|
||||||
return getPrivacyNodes().get(0).getPrivacyNode(); |
|
||||||
} |
|
||||||
|
|
||||||
public String getGroupCreatingTenant() { |
|
||||||
return getPrivacyNodes().get(0).getTenants().get(0); |
|
||||||
} |
|
||||||
} |
|
@ -1,50 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.privacy.multitenancy; |
|
||||||
|
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.privacy.PrivacyNode; |
|
||||||
|
|
||||||
import java.util.HashMap; |
|
||||||
import java.util.List; |
|
||||||
import java.util.Map; |
|
||||||
import java.util.stream.Collectors; |
|
||||||
|
|
||||||
public class MultiTenancyPrivacyNode { |
|
||||||
|
|
||||||
private final PrivacyNode privacyNode; |
|
||||||
private final Map<String, String> tenantToTokenMap; |
|
||||||
|
|
||||||
public MultiTenancyPrivacyNode(final PrivacyNode privacyNode) { |
|
||||||
this.privacyNode = privacyNode; |
|
||||||
this.tenantToTokenMap = new HashMap<>(); |
|
||||||
} |
|
||||||
|
|
||||||
public MultiTenancyPrivacyNode addTenantWithToken(final String tenant, final String token) { |
|
||||||
tenantToTokenMap.put(tenant, token); |
|
||||||
return this; |
|
||||||
} |
|
||||||
|
|
||||||
public List<String> getTenants() { |
|
||||||
return tenantToTokenMap.keySet().stream().collect(Collectors.toList()); |
|
||||||
} |
|
||||||
|
|
||||||
public String getTokenForTenant(final String tenant) { |
|
||||||
return tenantToTokenMap.get(tenant); |
|
||||||
} |
|
||||||
|
|
||||||
public PrivacyNode getPrivacyNode() { |
|
||||||
return privacyNode; |
|
||||||
} |
|
||||||
} |
|
@ -1,241 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright contributors to Hyperledger Besu. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.privacy.multitenancy; |
|
||||||
|
|
||||||
import static com.github.tomakehurst.wiremock.client.WireMock.ok; |
|
||||||
import static com.github.tomakehurst.wiremock.client.WireMock.post; |
|
||||||
import static com.github.tomakehurst.wiremock.client.WireMock.stubFor; |
|
||||||
import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.options; |
|
||||||
import static java.nio.charset.StandardCharsets.UTF_8; |
|
||||||
|
|
||||||
import org.hyperledger.besu.crypto.KeyPair; |
|
||||||
import org.hyperledger.besu.crypto.SignatureAlgorithm; |
|
||||||
import org.hyperledger.besu.crypto.SignatureAlgorithmFactory; |
|
||||||
import org.hyperledger.besu.datatypes.Address; |
|
||||||
import org.hyperledger.besu.datatypes.Hash; |
|
||||||
import org.hyperledger.besu.datatypes.Wei; |
|
||||||
import org.hyperledger.besu.enclave.types.PrivacyGroup; |
|
||||||
import org.hyperledger.besu.enclave.types.ReceiveResponse; |
|
||||||
import org.hyperledger.besu.enclave.types.SendResponse; |
|
||||||
import org.hyperledger.besu.ethereum.privacy.PrivateTransaction; |
|
||||||
import org.hyperledger.besu.ethereum.rlp.BytesValueRLPOutput; |
|
||||||
import org.hyperledger.besu.plugin.data.Restriction; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.AcceptanceTestBase; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.node.BesuNode; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.node.cluster.Cluster; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.node.cluster.ClusterConfiguration; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.node.cluster.ClusterConfigurationBuilder; |
|
||||||
|
|
||||||
import java.math.BigInteger; |
|
||||||
import java.util.List; |
|
||||||
|
|
||||||
import com.fasterxml.jackson.core.JsonProcessingException; |
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper; |
|
||||||
import com.github.tomakehurst.wiremock.junit.WireMockRule; |
|
||||||
import com.google.common.base.Supplier; |
|
||||||
import com.google.common.base.Suppliers; |
|
||||||
import org.apache.tuweni.bytes.Bytes; |
|
||||||
import org.junit.After; |
|
||||||
import org.junit.Before; |
|
||||||
import org.junit.Rule; |
|
||||||
import org.junit.Test; |
|
||||||
|
|
||||||
public class MultiTenancyPrivateNonceIncrementingTest extends AcceptanceTestBase { |
|
||||||
private BesuNode node; |
|
||||||
private final ObjectMapper mapper = new ObjectMapper(); |
|
||||||
private Cluster multiTenancyCluster; |
|
||||||
|
|
||||||
private static final Supplier<SignatureAlgorithm> SIGNATURE_ALGORITHM = |
|
||||||
Suppliers.memoize(SignatureAlgorithmFactory::getInstance); |
|
||||||
private static final KeyPair TEST_KEY = |
|
||||||
SIGNATURE_ALGORITHM |
|
||||||
.get() |
|
||||||
.createKeyPair( |
|
||||||
SIGNATURE_ALGORITHM |
|
||||||
.get() |
|
||||||
.createPrivateKey( |
|
||||||
new BigInteger( |
|
||||||
"853d7f0010fd86d0d7811c1f9d968ea89a24484a8127b4a483ddf5d2cfec766d", 16))); |
|
||||||
private static final String PRIVACY_GROUP_ID = "B1aVtMxLCUHmBVHXoZzzBgPbW/wj5axDpW9X8l91SGo="; |
|
||||||
private static final String PARTICIPANT_ENCLAVE_KEY0 = |
|
||||||
"A1aVtMxLCUHmBVHXoZzzBgPbW/wj5axDpW9X8l91SGo="; |
|
||||||
private static final String PARTICIPANT_ENCLAVE_KEY1 = |
|
||||||
"sgFkVOyFndZe/5SAZJO5UYbrl7pezHetveriBBWWnE8="; |
|
||||||
private final Address senderAddress = |
|
||||||
Address.wrap(Bytes.fromHexString(accounts.getPrimaryBenefactor().getAddress())); |
|
||||||
|
|
||||||
@Rule public WireMockRule wireMockRule = new WireMockRule(options().dynamicPort()); |
|
||||||
|
|
||||||
@Before |
|
||||||
public void setUp() throws Exception { |
|
||||||
final ClusterConfiguration clusterConfiguration = |
|
||||||
new ClusterConfigurationBuilder().awaitPeerDiscovery(false).build(); |
|
||||||
multiTenancyCluster = new Cluster(clusterConfiguration, net); |
|
||||||
node = |
|
||||||
besu.createNodeWithMultiTenantedPrivacy( |
|
||||||
"node1", |
|
||||||
"http://127.0.0.1:" + wireMockRule.port(), |
|
||||||
"authentication/auth_priv.toml", |
|
||||||
"authentication/auth_priv_key", |
|
||||||
false, |
|
||||||
true); |
|
||||||
multiTenancyCluster.start(node); |
|
||||||
final String token = |
|
||||||
node.execute(permissioningTransactions.createSuccessfulLogin("user", "pegasys")); |
|
||||||
node.useAuthenticationTokenInHeaderForJsonRpc(token); |
|
||||||
} |
|
||||||
|
|
||||||
@After |
|
||||||
public void tearDown() { |
|
||||||
multiTenancyCluster.close(); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
public void validateUnsuccessfulPrivateTransactionsNonceIncrementation() |
|
||||||
throws JsonProcessingException { |
|
||||||
executePrivateFailingTransaction(0, 0, 1); |
|
||||||
executePrivateValidTransaction(1, 1, 2); |
|
||||||
executePrivateFailingTransaction(2, 2, 3); |
|
||||||
executePrivateFailingTransaction(3, 3, 4); |
|
||||||
executePrivateValidTransaction(4, 4, 5); |
|
||||||
} |
|
||||||
|
|
||||||
private void executePrivateValidTransaction( |
|
||||||
final int nonce, |
|
||||||
final int expectedTransactionCountBeforeExecution, |
|
||||||
final int expectedTransactionCountAfterExecution) |
|
||||||
throws JsonProcessingException { |
|
||||||
final PrivateTransaction validSignedPrivateTransaction = |
|
||||||
getValidSignedPrivateTransaction(senderAddress, nonce); |
|
||||||
|
|
||||||
final String accountAddress = validSignedPrivateTransaction.getSender().toHexString(); |
|
||||||
final BytesValueRLPOutput rlpOutput = getRLPOutput(validSignedPrivateTransaction); |
|
||||||
|
|
||||||
processEnclaveStub(validSignedPrivateTransaction); |
|
||||||
|
|
||||||
node.verify( |
|
||||||
priv.getTransactionCount( |
|
||||||
accountAddress, PRIVACY_GROUP_ID, expectedTransactionCountBeforeExecution)); |
|
||||||
|
|
||||||
final Hash transactionReceipt = |
|
||||||
node.execute(privacyTransactions.sendRawTransaction(rlpOutput.encoded().toHexString())); |
|
||||||
|
|
||||||
node.verify(priv.getSuccessfulTransactionReceipt(transactionReceipt)); |
|
||||||
node.verify( |
|
||||||
priv.getTransactionCount( |
|
||||||
accountAddress, PRIVACY_GROUP_ID, expectedTransactionCountAfterExecution)); |
|
||||||
} |
|
||||||
|
|
||||||
private void executePrivateFailingTransaction( |
|
||||||
final int nonce, |
|
||||||
final int expectedTransactionCountBeforeExecution, |
|
||||||
final int expectedTransactionCountAfterExecution) |
|
||||||
throws JsonProcessingException { |
|
||||||
final PrivateTransaction invalidSignedPrivateTransaction = |
|
||||||
getInvalidSignedPrivateTransaction(senderAddress, nonce); |
|
||||||
final String accountAddress = invalidSignedPrivateTransaction.getSender().toHexString(); |
|
||||||
final BytesValueRLPOutput invalidTxRlp = getRLPOutput(invalidSignedPrivateTransaction); |
|
||||||
|
|
||||||
processEnclaveStub(invalidSignedPrivateTransaction); |
|
||||||
|
|
||||||
node.verify( |
|
||||||
priv.getTransactionCount( |
|
||||||
accountAddress, PRIVACY_GROUP_ID, expectedTransactionCountBeforeExecution)); |
|
||||||
final Hash invalidTransactionReceipt = |
|
||||||
node.execute(privacyTransactions.sendRawTransaction(invalidTxRlp.encoded().toHexString())); |
|
||||||
|
|
||||||
node.verify(priv.getFailedTransactionReceipt(invalidTransactionReceipt)); |
|
||||||
node.verify( |
|
||||||
priv.getTransactionCount( |
|
||||||
accountAddress, PRIVACY_GROUP_ID, expectedTransactionCountAfterExecution)); |
|
||||||
} |
|
||||||
|
|
||||||
private void processEnclaveStub(final PrivateTransaction validSignedPrivateTransaction) |
|
||||||
throws JsonProcessingException { |
|
||||||
retrievePrivacyGroupEnclaveStub(); |
|
||||||
sendEnclaveStub(); |
|
||||||
receiveEnclaveStub(validSignedPrivateTransaction); |
|
||||||
} |
|
||||||
|
|
||||||
private void retrievePrivacyGroupEnclaveStub() throws JsonProcessingException { |
|
||||||
final String retrieveGroupResponse = |
|
||||||
mapper.writeValueAsString( |
|
||||||
createPrivacyGroup( |
|
||||||
List.of(PARTICIPANT_ENCLAVE_KEY0, PARTICIPANT_ENCLAVE_KEY1), |
|
||||||
PrivacyGroup.Type.PANTHEON)); |
|
||||||
stubFor(post("/retrievePrivacyGroup").willReturn(ok(retrieveGroupResponse))); |
|
||||||
} |
|
||||||
|
|
||||||
private void sendEnclaveStub() throws JsonProcessingException { |
|
||||||
final String sendResponse = |
|
||||||
mapper.writeValueAsString(new SendResponse(PARTICIPANT_ENCLAVE_KEY1)); |
|
||||||
stubFor(post("/send").willReturn(ok(sendResponse))); |
|
||||||
} |
|
||||||
|
|
||||||
private void receiveEnclaveStub(final PrivateTransaction privTx) throws JsonProcessingException { |
|
||||||
final BytesValueRLPOutput rlpOutput = getRLPOutput(privTx); |
|
||||||
final String senderKey = privTx.getPrivateFrom().toBase64String(); |
|
||||||
final String receiveResponse = |
|
||||||
mapper.writeValueAsString( |
|
||||||
new ReceiveResponse( |
|
||||||
rlpOutput.encoded().toBase64String().getBytes(UTF_8), PRIVACY_GROUP_ID, senderKey)); |
|
||||||
stubFor(post("/receive").willReturn(ok(receiveResponse))); |
|
||||||
} |
|
||||||
|
|
||||||
private BytesValueRLPOutput getRLPOutput(final PrivateTransaction privateTransaction) { |
|
||||||
final BytesValueRLPOutput bvrlpo = new BytesValueRLPOutput(); |
|
||||||
privateTransaction.writeTo(bvrlpo); |
|
||||||
return bvrlpo; |
|
||||||
} |
|
||||||
|
|
||||||
private PrivacyGroup createPrivacyGroup( |
|
||||||
final List<String> groupMembers, final PrivacyGroup.Type groupType) { |
|
||||||
return new PrivacyGroup(PRIVACY_GROUP_ID, groupType, "test", "testGroup", groupMembers); |
|
||||||
} |
|
||||||
|
|
||||||
private static PrivateTransaction getInvalidSignedPrivateTransaction( |
|
||||||
final Address senderAddress, final int nonce) { |
|
||||||
return PrivateTransaction.builder() |
|
||||||
.nonce(nonce) |
|
||||||
.gasPrice(Wei.ZERO) |
|
||||||
.gasLimit(3000000) |
|
||||||
.to(null) |
|
||||||
.value(Wei.ZERO) |
|
||||||
.payload(Bytes.fromHexString("0x1234")) |
|
||||||
.sender(senderAddress) |
|
||||||
.chainId(BigInteger.valueOf(1337)) |
|
||||||
.privateFrom(Bytes.fromBase64String(PARTICIPANT_ENCLAVE_KEY0)) |
|
||||||
.restriction(Restriction.RESTRICTED) |
|
||||||
.privacyGroupId(Bytes.fromBase64String(PRIVACY_GROUP_ID)) |
|
||||||
.signAndBuild(TEST_KEY); |
|
||||||
} |
|
||||||
|
|
||||||
private static PrivateTransaction getValidSignedPrivateTransaction( |
|
||||||
final Address senderAddress, final int nonce) { |
|
||||||
return PrivateTransaction.builder() |
|
||||||
.nonce(nonce) |
|
||||||
.gasPrice(Wei.ZERO) |
|
||||||
.gasLimit(3000000) |
|
||||||
.to(null) |
|
||||||
.value(Wei.ZERO) |
|
||||||
.payload(Bytes.wrap(new byte[] {})) |
|
||||||
.sender(senderAddress) |
|
||||||
.chainId(BigInteger.valueOf(1337)) |
|
||||||
.privateFrom(Bytes.fromBase64String(PARTICIPANT_ENCLAVE_KEY0)) |
|
||||||
.restriction(Restriction.RESTRICTED) |
|
||||||
.privacyGroupId(Bytes.fromBase64String(PRIVACY_GROUP_ID)) |
|
||||||
.signAndBuild(TEST_KEY); |
|
||||||
} |
|
||||||
} |
|
@ -1,232 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright ConsenSys AG. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
|
||||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
|
||||||
* specific language governing permissions and limitations under the License. |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: Apache-2.0 |
|
||||||
*/ |
|
||||||
package org.hyperledger.besu.tests.acceptance.privacy.multitenancy; |
|
||||||
|
|
||||||
import static com.github.tomakehurst.wiremock.client.WireMock.ok; |
|
||||||
import static com.github.tomakehurst.wiremock.client.WireMock.post; |
|
||||||
import static com.github.tomakehurst.wiremock.client.WireMock.stubFor; |
|
||||||
import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.options; |
|
||||||
import static org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.RpcErrorType.DELETE_PRIVACY_GROUP_ERROR; |
|
||||||
import static org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.RpcErrorType.ENCLAVE_ERROR; |
|
||||||
import static org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.RpcErrorType.FIND_PRIVACY_GROUP_ERROR; |
|
||||||
import static org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.RpcErrorType.GET_PRIVATE_TRANSACTION_NONCE_ERROR; |
|
||||||
import static org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.RpcErrorType.PRIVATE_FROM_DOES_NOT_MATCH_ENCLAVE_PUBLIC_KEY; |
|
||||||
|
|
||||||
import org.hyperledger.besu.crypto.SignatureAlgorithm; |
|
||||||
import org.hyperledger.besu.crypto.SignatureAlgorithmFactory; |
|
||||||
import org.hyperledger.besu.datatypes.Address; |
|
||||||
import org.hyperledger.besu.datatypes.Hash; |
|
||||||
import org.hyperledger.besu.datatypes.Wei; |
|
||||||
import org.hyperledger.besu.enclave.types.PrivacyGroup; |
|
||||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.RpcErrorType; |
|
||||||
import org.hyperledger.besu.ethereum.privacy.PrivateTransaction; |
|
||||||
import org.hyperledger.besu.ethereum.rlp.BytesValueRLPOutput; |
|
||||||
import org.hyperledger.besu.plugin.data.Restriction; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.AcceptanceTestBase; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.node.BesuNode; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.node.cluster.Cluster; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.node.cluster.ClusterConfiguration; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.node.cluster.ClusterConfigurationBuilder; |
|
||||||
import org.hyperledger.besu.tests.acceptance.dsl.transaction.Transaction; |
|
||||||
|
|
||||||
import java.math.BigInteger; |
|
||||||
import java.util.List; |
|
||||||
|
|
||||||
import com.fasterxml.jackson.core.JsonProcessingException; |
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper; |
|
||||||
import com.github.tomakehurst.wiremock.junit.WireMockRule; |
|
||||||
import org.apache.tuweni.bytes.Bytes; |
|
||||||
import org.junit.After; |
|
||||||
import org.junit.Before; |
|
||||||
import org.junit.Rule; |
|
||||||
import org.junit.Test; |
|
||||||
|
|
||||||
public class MultiTenancyValidationFailAcceptanceTest extends AcceptanceTestBase { |
|
||||||
private BesuNode node; |
|
||||||
private final ObjectMapper mapper = new ObjectMapper(); |
|
||||||
private Cluster multiTenancyCluster; |
|
||||||
|
|
||||||
private static final String PRIVACY_GROUP_ID = "B1aVtMxLCUHmBVHXoZzzBgPbW/wj5axDpW9X8l91SGo="; |
|
||||||
private static final String ENCLAVE_PUBLIC_KEY = "B1aVtMxLCUHmBVHXoZzzBgPbW/wj5axDpW9X8l91SGo="; |
|
||||||
private static final String OTHER_ENCLAVE_PUBLIC_KEY = |
|
||||||
"A1aVtMxLCUHmBVHXoZzzBgPbW/wj5axDpW9X8l91SGo="; |
|
||||||
private final Address senderAddress = |
|
||||||
Address.wrap(Bytes.fromHexString(accounts.getPrimaryBenefactor().getAddress())); |
|
||||||
|
|
||||||
@Rule public WireMockRule wireMockRule = new WireMockRule(options().dynamicPort()); |
|
||||||
|
|
||||||
@Before |
|
||||||
public void setUp() throws Exception { |
|
||||||
final ClusterConfiguration clusterConfiguration = |
|
||||||
new ClusterConfigurationBuilder().awaitPeerDiscovery(false).build(); |
|
||||||
multiTenancyCluster = new Cluster(clusterConfiguration, net); |
|
||||||
node = |
|
||||||
besu.createNodeWithMultiTenantedPrivacy( |
|
||||||
"node1", |
|
||||||
"http://127.0.0.1:" + wireMockRule.port(), |
|
||||||
"authentication/auth_priv.toml", |
|
||||||
"authentication/auth_priv_key", |
|
||||||
false, |
|
||||||
false); |
|
||||||
multiTenancyCluster.start(node); |
|
||||||
|
|
||||||
final String token = |
|
||||||
node.execute(permissioningTransactions.createSuccessfulLogin("failUser", "pegasys")); |
|
||||||
node.useAuthenticationTokenInHeaderForJsonRpc(token); |
|
||||||
} |
|
||||||
|
|
||||||
@After |
|
||||||
public void tearDown() { |
|
||||||
multiTenancyCluster.close(); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
public void sendRawTransactionShouldFailWhenPrivateFromNotMatchEnclaveKey() |
|
||||||
throws JsonProcessingException { |
|
||||||
final PrivateTransaction validSignedPrivateTransaction = |
|
||||||
getValidSignedPrivateTransaction(senderAddress, OTHER_ENCLAVE_PUBLIC_KEY); |
|
||||||
retrievePrivacyGroupEnclaveStub(); |
|
||||||
final Transaction<Hash> transaction = |
|
||||||
privacyTransactions.sendRawTransaction( |
|
||||||
getRLPOutput(validSignedPrivateTransaction).encoded().toHexString()); |
|
||||||
node.verify( |
|
||||||
priv.multiTenancyValidationFail( |
|
||||||
transaction, RpcErrorType.PRIVATE_FROM_DOES_NOT_MATCH_ENCLAVE_PUBLIC_KEY)); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
public void sendRawTransactionShouldFailWhenPrivacyGroupDoesNotContainEnclaveKey() |
|
||||||
throws JsonProcessingException { |
|
||||||
final PrivateTransaction validSignedPrivateTransaction = |
|
||||||
getValidSignedPrivateTransaction(senderAddress, ENCLAVE_PUBLIC_KEY); |
|
||||||
retrievePrivacyGroupEnclaveStub(); |
|
||||||
final Transaction<Hash> transaction = |
|
||||||
privacyTransactions.sendRawTransaction( |
|
||||||
getRLPOutput(validSignedPrivateTransaction).encoded().toHexString()); |
|
||||||
node.verify(priv.multiTenancyValidationFail(transaction, ENCLAVE_ERROR)); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
public void distributeRawTransactionShouldFailWhenPrivateFromNotMatchEnclaveKey() { |
|
||||||
final Address senderAddress = |
|
||||||
Address.wrap(Bytes.fromHexString(accounts.getPrimaryBenefactor().getAddress())); |
|
||||||
|
|
||||||
final Transaction<String> transaction = |
|
||||||
privacyTransactions.distributeRawTransaction( |
|
||||||
getRLPOutput(getValidSignedPrivateTransaction(senderAddress, OTHER_ENCLAVE_PUBLIC_KEY)) |
|
||||||
.encoded() |
|
||||||
.toHexString()); |
|
||||||
node.verify( |
|
||||||
priv.multiTenancyValidationFail( |
|
||||||
transaction, PRIVATE_FROM_DOES_NOT_MATCH_ENCLAVE_PUBLIC_KEY)); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
public void distributeRawTransactionShouldFailWhenPrivacyGroupDoesNotContainEnclaveKey() |
|
||||||
throws JsonProcessingException { |
|
||||||
final Address senderAddress = |
|
||||||
Address.wrap(Bytes.fromHexString(accounts.getPrimaryBenefactor().getAddress())); |
|
||||||
|
|
||||||
retrievePrivacyGroupEnclaveStub(); |
|
||||||
|
|
||||||
final Transaction<String> transaction = |
|
||||||
privacyTransactions.distributeRawTransaction( |
|
||||||
getRLPOutput(getValidSignedPrivateTransaction(senderAddress, ENCLAVE_PUBLIC_KEY)) |
|
||||||
.encoded() |
|
||||||
.toHexString()); |
|
||||||
node.verify(priv.multiTenancyValidationFail(transaction, ENCLAVE_ERROR)); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
public void deletePrivacyGroupShouldFailWhenEnclaveKeyNotInPrivacyGroup() |
|
||||||
throws JsonProcessingException { |
|
||||||
retrievePrivacyGroupEnclaveStub(); |
|
||||||
final Transaction<String> transaction = |
|
||||||
privacyTransactions.deletePrivacyGroup(PRIVACY_GROUP_ID); |
|
||||||
node.verify(priv.multiTenancyValidationFail(transaction, DELETE_PRIVACY_GROUP_ERROR)); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
public void findPrivacyGroupShouldFailWhenEnclaveKeyNotInPrivacyGroup() { |
|
||||||
final Transaction<PrivacyGroup[]> transaction = |
|
||||||
privacyTransactions.findPrivacyGroup(new String[] {OTHER_ENCLAVE_PUBLIC_KEY}); |
|
||||||
node.verify(priv.multiTenancyValidationFail(transaction, FIND_PRIVACY_GROUP_ERROR)); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
public void determineEeaNonceShouldFailWhenPrivateFromNotMatchEnclaveKey() { |
|
||||||
final String accountAddress = Address.ZERO.toHexString(); |
|
||||||
final String senderAddressBase64 = Bytes.fromHexString(accountAddress).toBase64String(); |
|
||||||
final String[] privateFor = {senderAddressBase64}; |
|
||||||
final Transaction<Integer> transaction = |
|
||||||
privacyTransactions.getEeaTransactionCount( |
|
||||||
accountAddress, OTHER_ENCLAVE_PUBLIC_KEY, privateFor); |
|
||||||
node.verify( |
|
||||||
priv.multiTenancyValidationFail( |
|
||||||
transaction, PRIVATE_FROM_DOES_NOT_MATCH_ENCLAVE_PUBLIC_KEY)); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
public void determineBesuNonceShouldFailWhenEnclaveKeyNotInPrivacyGroup() |
|
||||||
throws JsonProcessingException { |
|
||||||
retrievePrivacyGroupEnclaveStub(); |
|
||||||
final String accountAddress = Address.ZERO.toHexString(); |
|
||||||
final Transaction<Integer> transaction = |
|
||||||
privacyTransactions.getTransactionCount(accountAddress, PRIVACY_GROUP_ID); |
|
||||||
node.verify(priv.multiTenancyValidationFail(transaction, GET_PRIVATE_TRANSACTION_NONCE_ERROR)); |
|
||||||
} |
|
||||||
|
|
||||||
private void retrievePrivacyGroupEnclaveStub() throws JsonProcessingException { |
|
||||||
final String retrieveGroupResponse = |
|
||||||
mapper.writeValueAsString( |
|
||||||
testPrivacyGroup(List.of(OTHER_ENCLAVE_PUBLIC_KEY), PrivacyGroup.Type.PANTHEON)); |
|
||||||
stubFor(post("/retrievePrivacyGroup").willReturn(ok(retrieveGroupResponse))); |
|
||||||
} |
|
||||||
|
|
||||||
private PrivacyGroup testPrivacyGroup( |
|
||||||
final List<String> groupMembers, final PrivacyGroup.Type groupType) { |
|
||||||
return new PrivacyGroup(PRIVACY_GROUP_ID, groupType, "test", "testGroup", groupMembers); |
|
||||||
} |
|
||||||
|
|
||||||
private BytesValueRLPOutput getRLPOutput(final PrivateTransaction validSignedPrivateTransaction) { |
|
||||||
final BytesValueRLPOutput bvrlpo = new BytesValueRLPOutput(); |
|
||||||
validSignedPrivateTransaction.writeTo(bvrlpo); |
|
||||||
return bvrlpo; |
|
||||||
} |
|
||||||
|
|
||||||
private static PrivateTransaction getValidSignedPrivateTransaction( |
|
||||||
final Address senderAddress, final String privateFrom) { |
|
||||||
|
|
||||||
final SignatureAlgorithm signatureAlgorithm = SignatureAlgorithmFactory.getInstance(); |
|
||||||
|
|
||||||
return PrivateTransaction.builder() |
|
||||||
.nonce(0) |
|
||||||
.gasPrice(Wei.ZERO) |
|
||||||
.gasLimit(3000000) |
|
||||||
.to(null) |
|
||||||
.value(Wei.ZERO) |
|
||||||
.payload(Bytes.wrap(new byte[] {})) |
|
||||||
.sender(senderAddress) |
|
||||||
.chainId(BigInteger.valueOf(2018)) |
|
||||||
.privateFrom(Bytes.fromBase64String(privateFrom)) |
|
||||||
.restriction(Restriction.RESTRICTED) |
|
||||||
.privacyGroupId(Bytes.fromBase64String(PRIVACY_GROUP_ID)) |
|
||||||
.signAndBuild( |
|
||||||
signatureAlgorithm.createKeyPair( |
|
||||||
signatureAlgorithm.createPrivateKey( |
|
||||||
new BigInteger( |
|
||||||
"853d7f0010fd86d0d7811c1f9d968ea89a24484a8127b4a483ddf5d2cfec766d", 16)))); |
|
||||||
} |
|
||||||
} |
|
Loading…
Reference in new issue