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