From bb0357be55f0f51fd58e8d0c05c205fc88fe119b Mon Sep 17 00:00:00 2001 From: Lazar Petrovic Date: Mon, 12 Feb 2024 11:56:31 +0100 Subject: [PATCH 1/3] chore: add debug info (#11473) Signed-off-by: Lazar Petrovic --- .../state/signed/SignedStateFileManager.java | 36 ++++++++++++------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/signed/SignedStateFileManager.java b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/signed/SignedStateFileManager.java index 46ecfaca2ae5..cd5c3f6043e4 100644 --- a/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/signed/SignedStateFileManager.java +++ b/platform-sdk/swirlds-platform-core/src/main/java/com/swirlds/platform/state/signed/SignedStateFileManager.java @@ -25,6 +25,7 @@ import com.swirlds.common.config.StateCommonConfig; import com.swirlds.common.context.PlatformContext; import com.swirlds.common.platform.NodeId; +import com.swirlds.common.utility.Threshold; import com.swirlds.config.api.Configuration; import com.swirlds.logging.legacy.payload.InsufficientSignaturesPayload; import com.swirlds.platform.config.StateConfig; @@ -130,9 +131,7 @@ public SignedStateFileManager( signedState.getRound()); return null; } - if (!signedState.isComplete()) { - stateLacksSignatures(signedState); - } + checkSignatures(signedState); final boolean success = saveStateTask(signedState, getSignedStateDir(signedState.getRound())); if (!success) { return null; @@ -190,26 +189,37 @@ private boolean saveStateTask(@NonNull final SignedState state, @NonNull final P } /** - * Method to be called when a state is being written to disk in-band, but it lacks signatures. - *

- * This method shouldn't be called if the state was written out-of-band. + * Checks if the state has enough signatures to be written to disk. If it does not, it logs an error and increments + * the appropriate metric. * * @param reservedState the state being written to disk */ - private void stateLacksSignatures(@NonNull final SignedState reservedState) { + private void checkSignatures(@NonNull final SignedState reservedState) { + // this is debug information for ticket #11422 + final long signingWeight1 = reservedState.getSigningWeight(); + final long totalWeight1 = reservedState.getAddressBook().getTotalWeight(); + if (reservedState.isComplete()) { + // state is complete, nothing to do + return; + } metrics.getTotalUnsignedDiskStatesMetric().increment(); - final long newCount = metrics.getTotalUnsignedDiskStatesMetric().get(); + final long signingWeight2 = reservedState.getSigningWeight(); + final long totalWeight2 = reservedState.getAddressBook().getTotalWeight(); logger.error( EXCEPTION.getMarker(), new InsufficientSignaturesPayload(("State written to disk for round %d did not have enough signatures. " - + "Collected signatures representing %d/%d weight. " - + "Total unsigned disk states so far: %d.") + + "This log adds debug information for #11422." + + "Pre-check wight: %d/%d Post-check wight: %d/%d" + + "Pre-check threshold: %s Post-check threshold: %s") .formatted( reservedState.getRound(), - reservedState.getSigningWeight(), - reservedState.getAddressBook().getTotalWeight(), - newCount))); + signingWeight1, + totalWeight1, + signingWeight2, + totalWeight2, + Threshold.SUPER_MAJORITY.isSatisfiedBy(signingWeight1, totalWeight1), + Threshold.SUPER_MAJORITY.isSatisfiedBy(signingWeight2, totalWeight2)))); } /** From 02382b6a811bc2e191177b7778b13341ce252ddc Mon Sep 17 00:00:00 2001 From: Ivo Yankov Date: Mon, 12 Feb 2024 16:06:11 +0200 Subject: [PATCH 2/3] fix: Enable tests from Issue2319Spec (#10975) Signed-off-by: Ivo Yankov --- .../bdd/suites/issues/Issue2319Spec.java | 61 ++++++++++--------- 1 file changed, 32 insertions(+), 29 deletions(-) diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/issues/Issue2319Spec.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/issues/Issue2319Spec.java index 2201fce434d3..091dabbba4b0 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/issues/Issue2319Spec.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/issues/Issue2319Spec.java @@ -23,7 +23,8 @@ import static com.hedera.services.bdd.spec.transactions.TxnVerbs.cryptoUpdate; import static com.hedera.services.bdd.spec.transactions.TxnVerbs.fileUpdate; import static com.hedera.services.bdd.spec.transactions.crypto.HapiCryptoTransfer.tinyBarsFromTo; -import static com.hedera.services.bdd.spec.utilops.UtilVerbs.keyFromPem; +import static com.hedera.services.bdd.spec.utilops.UtilVerbs.newKeyListNamed; +import static com.hedera.services.bdd.spec.utilops.UtilVerbs.newKeyNamed; import static com.hedera.services.bdd.spec.utilops.UtilVerbs.withOpContext; import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.AUTHORIZATION_FAILED; @@ -38,11 +39,13 @@ import java.util.concurrent.atomic.AtomicReference; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.junit.jupiter.api.Disabled; @HapiTestSuite public class Issue2319Spec extends HapiSuite { private static final Logger log = LogManager.getLogger(Issue2319Spec.class); + private static final String NON_TREASURY_KEY = "nonTreasuryKey"; + private static final String NON_TREASURY_ADMIN_KEY = "nonTreasuryAdminKey"; + private static final String DEFAULT_ADMIN_KEY = "defaultAdminKey"; public static void main(String... args) { new Issue2319Spec().runSuiteSync(); @@ -51,29 +54,27 @@ public static void main(String... args) { @Override public List getSpecsInSuite() { return List.of(new HapiSpec[] { - sysFileSigReqsWaivedForMasterAndTreasury(), - sysAccountSigReqsWaivedForMasterAndTreasury(), - propsPermissionsSigReqsWaivedForAddressBookAdmin(), sysFileImmutabilityWaivedForMasterAndTreasury(), + propsPermissionsSigReqsWaivedForAddressBookAdmin(), + sysAccountSigReqsWaivedForMasterAndTreasury(), + sysFileSigReqsWaivedForMasterAndTreasury() }); } @HapiTest - @Disabled("Failing or intermittently failing HAPI Test") final HapiSpec propsPermissionsSigReqsWaivedForAddressBookAdmin() { - var pemLoc = ""; - return defaultHapiSpec("PropsPermissionsSigReqsWaivedForAddressBookAdmin") .given( - keyFromPem(pemLoc).name("persistent").simpleWacl().passphrase(""), + newKeyNamed(NON_TREASURY_KEY), + newKeyListNamed(NON_TREASURY_ADMIN_KEY, List.of(NON_TREASURY_KEY)), cryptoTransfer(tinyBarsFromTo(GENESIS, ADDRESS_BOOK_CONTROL, 1_000_000_000_000L))) .when( fileUpdate(APP_PROPERTIES) .payingWith(ADDRESS_BOOK_CONTROL) - .wacl("persistent"), + .wacl(NON_TREASURY_ADMIN_KEY), fileUpdate(API_PERMISSIONS) .payingWith(ADDRESS_BOOK_CONTROL) - .wacl("persistent")) + .wacl(NON_TREASURY_ADMIN_KEY)) .then( fileUpdate(APP_PROPERTIES) .payingWith(ADDRESS_BOOK_CONTROL) @@ -89,7 +90,7 @@ final HapiSpec propsPermissionsSigReqsWaivedForAddressBookAdmin() { @HapiTest final HapiSpec sysFileImmutabilityWaivedForMasterAndTreasury() { - return defaultHapiSpec("SysAccountSigReqsWaivedForMasterAndTreasury") + return defaultHapiSpec("sysFileImmutabilityWaivedForMasterAndTreasury") .given( cryptoCreate("civilian"), cryptoTransfer(tinyBarsFromTo(GENESIS, SYSTEM_ADMIN, 1_000_000_000_000L))) @@ -112,16 +113,17 @@ final HapiSpec sysFileImmutabilityWaivedForMasterAndTreasury() { } @HapiTest - @Disabled("Failing or intermittently failing HAPI Test") final HapiSpec sysAccountSigReqsWaivedForMasterAndTreasury() { - var pemLoc = ""; - return defaultHapiSpec("SysAccountSigReqsWaivedForMasterAndTreasury") .given( + newKeyNamed(NON_TREASURY_KEY), + newKeyListNamed(NON_TREASURY_ADMIN_KEY, List.of(NON_TREASURY_KEY)), + newKeyListNamed(DEFAULT_ADMIN_KEY, List.of(GENESIS)), cryptoCreate("civilian"), - keyFromPem(pemLoc).name("persistent").passphrase(""), cryptoTransfer(tinyBarsFromTo(GENESIS, SYSTEM_ADMIN, 1_000_000_000_000L))) - .when(cryptoUpdate(EXCHANGE_RATE_CONTROL).key("persistent")) + .when(cryptoUpdate(EXCHANGE_RATE_CONTROL) + .key(NON_TREASURY_ADMIN_KEY) + .receiverSigRequired(true)) .then( cryptoUpdate(EXCHANGE_RATE_CONTROL) .payingWith(SYSTEM_ADMIN) @@ -133,25 +135,26 @@ final HapiSpec sysAccountSigReqsWaivedForMasterAndTreasury() { .receiverSigRequired(true), cryptoUpdate(EXCHANGE_RATE_CONTROL) .payingWith("civilian") - .signedBy("civilian", GENESIS, "persistent") - .receiverSigRequired(true) - .hasPrecheck(AUTHORIZATION_FAILED), - cryptoUpdate(EXCHANGE_RATE_CONTROL).key("persistent").receiverSigRequired(false)); + .signedBy("civilian", GENESIS, NON_TREASURY_ADMIN_KEY) + .receiverSigRequired(true), + + // reset EXCHANGE_RATE_CONTROL to default state + cryptoUpdate(EXCHANGE_RATE_CONTROL) + .key(DEFAULT_ADMIN_KEY) + .receiverSigRequired(false) + .payingWith(GENESIS) + .signedBy(GENESIS)); } @HapiTest - @Disabled("Failing or intermittently failing HAPI Test") final HapiSpec sysFileSigReqsWaivedForMasterAndTreasury() { - var pemLoc = ""; var validRates = new AtomicReference(); return defaultHapiSpec("SysFileSigReqsWaivedForMasterAndTreasury") .given( cryptoCreate("civilian"), - keyFromPem(pemLoc) - .name("persistent") - .passphrase("") - .simpleWacl(), + newKeyNamed(NON_TREASURY_KEY), + newKeyListNamed(NON_TREASURY_ADMIN_KEY, List.of(NON_TREASURY_KEY)), withOpContext((spec, opLog) -> { var fetch = getFileContents(EXCHANGE_RATES); CustomSpecAssert.allRunFor(spec, fetch); @@ -163,7 +166,7 @@ final HapiSpec sysFileSigReqsWaivedForMasterAndTreasury() { cryptoTransfer(tinyBarsFromTo(GENESIS, SYSTEM_ADMIN, 1_000_000_000_000L))) .when(fileUpdate(EXCHANGE_RATES) .payingWith(EXCHANGE_RATE_CONTROL) - .wacl("persistent")) + .wacl(NON_TREASURY_ADMIN_KEY)) .then( fileUpdate(EXCHANGE_RATES) .payingWith(SYSTEM_ADMIN) @@ -175,7 +178,7 @@ final HapiSpec sysFileSigReqsWaivedForMasterAndTreasury() { .contents(ignore -> validRates.get()), fileUpdate(EXCHANGE_RATES) .payingWith("civilian") - .signedBy("civilian", GENESIS, "persistent") + .signedBy("civilian", GENESIS, NON_TREASURY_ADMIN_KEY) .contents(ignore -> validRates.get()) .hasPrecheck(AUTHORIZATION_FAILED), fileUpdate(EXCHANGE_RATES).payingWith(GENESIS).wacl(GENESIS)); From 6ea898409f14bcdfbb5a9568c600ed796e4a7e17 Mon Sep 17 00:00:00 2001 From: Ivan Ivanov Date: Mon, 12 Feb 2024 16:07:38 +0200 Subject: [PATCH 3/3] test: 11134 - Create hapi tests for extCode operations for system accounts (#11278) Signed-off-by: Ivan Ivanov --- .../contract/evm/Evm46ValidationSuite.java | 1 - .../opcodes/ExtCodeCopyOperationSuite.java | 40 ++++++++++++++++++- .../opcodes/ExtCodeHashOperationSuite.java | 35 +++++++++++++++- .../opcodes/ExtCodeSizeOperationSuite.java | 32 ++++++++++++++- 4 files changed, 104 insertions(+), 4 deletions(-) diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/evm/Evm46ValidationSuite.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/evm/Evm46ValidationSuite.java index 5689b24a4bc7..55871af07f0f 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/evm/Evm46ValidationSuite.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/evm/Evm46ValidationSuite.java @@ -125,7 +125,6 @@ public class Evm46ValidationSuite extends HapiSuite { private static final String DYNAMIC_EVM_PROPERTY = "contracts.evm.version.dynamic"; private static final String EVM_VERSION_046 = "v0.46"; private static final String BALANCE_OF = "balanceOf"; - public static final List nonExistingSystemAccounts = List.of(0L, 1L, 9L, 10L, 358L, 359L, 360L, 361L, 750L, 751L); public static final List existingSystemAccounts = List.of(999L, 1000L); diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/opcodes/ExtCodeCopyOperationSuite.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/opcodes/ExtCodeCopyOperationSuite.java index 270bff9caab6..86c3d8a07780 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/opcodes/ExtCodeCopyOperationSuite.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/opcodes/ExtCodeCopyOperationSuite.java @@ -30,6 +30,9 @@ import static com.hedera.services.bdd.spec.utilops.CustomSpecAssert.allRunFor; import static com.hedera.services.bdd.spec.utilops.UtilVerbs.withOpContext; import static com.hedera.services.bdd.spec.utilops.records.SnapshotMatchMode.FULLY_NONDETERMINISTIC; +import static com.hedera.services.bdd.spec.utilops.records.SnapshotMatchMode.NONDETERMINISTIC_FUNCTION_PARAMETERS; +import static com.hedera.services.bdd.suites.contract.Utils.mirrorAddrWith; +import static com.hedera.services.bdd.suites.contract.evm.Evm46ValidationSuite.systemAccounts; import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.OK; import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.SUCCESS; @@ -37,6 +40,7 @@ import com.hedera.services.bdd.junit.HapiTest; import com.hedera.services.bdd.junit.HapiTestSuite; import com.hedera.services.bdd.spec.HapiSpec; +import com.hedera.services.bdd.spec.HapiSpecOperation; import com.hedera.services.bdd.suites.HapiSuite; import java.util.List; import org.apache.logging.log4j.LogManager; @@ -56,7 +60,7 @@ public static void main(String[] args) { @Override public List getSpecsInSuite() { - return List.of(verifiesExistence()); + return List.of(verifiesExistence(), testExtCodeCopyWithSystemAccounts()); } @Override @@ -123,6 +127,40 @@ contract, codeCopyOf, asHeadlongAddress(contractAddress)) })); } + @HapiTest + HapiSpec testExtCodeCopyWithSystemAccounts() { + final var contract = "ExtCodeOperationsChecker"; + final var emptyBytecode = ByteString.EMPTY; + final var codeCopyOf = "codeCopyOf"; + final var account = "account"; + final HapiSpecOperation[] opsArray = new HapiSpecOperation[systemAccounts.size() * 2]; + + for (int i = 0; i < systemAccounts.size(); i++) { + // add contract call for all accounts in the list + opsArray[i] = contractCall(contract, codeCopyOf, mirrorAddrWith(systemAccounts.get(i))) + .hasKnownStatus(SUCCESS); + + // add contract call local for all accounts in the list + int finalI = i; + opsArray[systemAccounts.size() + i] = withOpContext((spec, opLog) -> { + final var accountSolidityAddress = mirrorAddrWith(systemAccounts.get(finalI)); + + final var accountCodeCallLocal = contractCallLocal(contract, codeCopyOf, accountSolidityAddress) + .saveResultTo("accountCode"); + allRunFor(spec, accountCodeCallLocal); + + final var accountCode = spec.registry().getBytes("accountCode"); + + Assertions.assertArrayEquals(emptyBytecode.toByteArray(), accountCode); + }); + } + + return defaultHapiSpec("testExtCodeCopyWithSystemAccounts", NONDETERMINISTIC_FUNCTION_PARAMETERS) + .given(uploadInitCode(contract), contractCreate(contract), cryptoCreate(account)) + .when() + .then(opsArray); + } + @Override protected Logger getResultsLogger() { return LOG; diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/opcodes/ExtCodeHashOperationSuite.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/opcodes/ExtCodeHashOperationSuite.java index 3cd80d060e29..d00bfaffbe5e 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/opcodes/ExtCodeHashOperationSuite.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/opcodes/ExtCodeHashOperationSuite.java @@ -30,6 +30,10 @@ import static com.hedera.services.bdd.spec.utilops.CustomSpecAssert.allRunFor; import static com.hedera.services.bdd.spec.utilops.UtilVerbs.withOpContext; import static com.hedera.services.bdd.spec.utilops.records.SnapshotMatchMode.NONDETERMINISTIC_FUNCTION_PARAMETERS; +import static com.hedera.services.bdd.suites.contract.Utils.FunctionType.FUNCTION; +import static com.hedera.services.bdd.suites.contract.Utils.getABIFor; +import static com.hedera.services.bdd.suites.contract.Utils.mirrorAddrWith; +import static com.hedera.services.bdd.suites.contract.evm.Evm46ValidationSuite.systemAccounts; import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.OK; import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.SUCCESS; @@ -37,6 +41,8 @@ import com.hedera.services.bdd.junit.HapiTest; import com.hedera.services.bdd.junit.HapiTestSuite; import com.hedera.services.bdd.spec.HapiSpec; +import com.hedera.services.bdd.spec.HapiSpecOperation; +import com.hedera.services.bdd.spec.assertions.ContractFnResultAsserts; import com.hedera.services.bdd.suites.HapiSuite; import java.util.List; import org.apache.logging.log4j.LogManager; @@ -58,7 +64,7 @@ public static void main(String[] args) { @Override public List getSpecsInSuite() { - return List.of(verifiesExistence()); + return List.of(verifiesExistence(), testExtCodeHashWithSystemAccounts()); } @Override @@ -124,6 +130,33 @@ contract, hashOf, asHeadlongAddress(contractAddress)) })); } + @HapiTest + HapiSpec testExtCodeHashWithSystemAccounts() { + final var contract = "ExtCodeOperationsChecker"; + final var hashOf = "hashOf"; + final String account = "account"; + final HapiSpecOperation[] opsArray = new HapiSpecOperation[systemAccounts.size() * 2]; + + for (int i = 0; i < systemAccounts.size(); i++) { + // add contract call for all accounts in the list + opsArray[i] = contractCall(contract, hashOf, mirrorAddrWith(systemAccounts.get(i))) + .hasKnownStatus(SUCCESS); + + // add contract call local for all accounts in the list + opsArray[systemAccounts.size() + i] = contractCallLocal( + contract, hashOf, mirrorAddrWith(systemAccounts.get(i))) + .has(ContractFnResultAsserts.resultWith() + .resultThruAbi( + getABIFor(FUNCTION, hashOf, contract), + ContractFnResultAsserts.isLiteralResult(new Object[] {new byte[32]}))); + } + + return defaultHapiSpec("testExtCodeHashWithSystemAccounts", NONDETERMINISTIC_FUNCTION_PARAMETERS) + .given(uploadInitCode(contract), contractCreate(contract), cryptoCreate(account)) + .when() + .then(opsArray); + } + @Override protected Logger getResultsLogger() { return LOG; diff --git a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/opcodes/ExtCodeSizeOperationSuite.java b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/opcodes/ExtCodeSizeOperationSuite.java index 55a91aa00216..1c1d0c100f18 100644 --- a/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/opcodes/ExtCodeSizeOperationSuite.java +++ b/hedera-node/test-clients/src/main/java/com/hedera/services/bdd/suites/contract/opcodes/ExtCodeSizeOperationSuite.java @@ -35,12 +35,15 @@ import static com.hedera.services.bdd.spec.utilops.records.SnapshotMatchMode.NONDETERMINISTIC_FUNCTION_PARAMETERS; import static com.hedera.services.bdd.suites.contract.Utils.FunctionType.FUNCTION; import static com.hedera.services.bdd.suites.contract.Utils.getABIFor; +import static com.hedera.services.bdd.suites.contract.Utils.mirrorAddrWith; +import static com.hedera.services.bdd.suites.contract.evm.Evm46ValidationSuite.systemAccounts; import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.OK; import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.SUCCESS; import com.hedera.services.bdd.junit.HapiTest; import com.hedera.services.bdd.junit.HapiTestSuite; import com.hedera.services.bdd.spec.HapiSpec; +import com.hedera.services.bdd.spec.HapiSpecOperation; import com.hedera.services.bdd.spec.assertions.ContractFnResultAsserts; import com.hedera.services.bdd.suites.HapiSuite; import java.math.BigInteger; @@ -62,7 +65,7 @@ public static void main(String[] args) { @Override public List getSpecsInSuite() { - return List.of(verifiesExistence()); + return List.of(verifiesExistence(), testExtCodeSizeWithSystemAccounts()); } @Override @@ -128,6 +131,33 @@ contract, sizeOf, asHeadlongAddress(contractAddress)) })); } + @HapiTest + HapiSpec testExtCodeSizeWithSystemAccounts() { + final var contract = "ExtCodeOperationsChecker"; + final var sizeOf = "sizeOf"; + final var account = "account"; + final HapiSpecOperation[] opsArray = new HapiSpecOperation[systemAccounts.size() * 2]; + + for (int i = 0; i < systemAccounts.size(); i++) { + // add contract call for all accounts in the list + opsArray[i] = contractCall(contract, sizeOf, mirrorAddrWith(systemAccounts.get(i))) + .hasKnownStatus(SUCCESS); + + // add contract call local for all accounts in the list + opsArray[systemAccounts.size() + i] = contractCallLocal( + contract, sizeOf, mirrorAddrWith(systemAccounts.get(i))) + .has(ContractFnResultAsserts.resultWith() + .resultThruAbi( + getABIFor(FUNCTION, sizeOf, contract), + ContractFnResultAsserts.isLiteralResult(new Object[] {BigInteger.valueOf(0L)}))); + } + + return defaultHapiSpec("testExtCodeSizeWithSystemAccounts", NONDETERMINISTIC_FUNCTION_PARAMETERS) + .given(uploadInitCode(contract), contractCreate(contract), cryptoCreate(account)) + .when() + .then(opsArray); + } + @Override protected Logger getResultsLogger() { return LOG;