diff --git a/actuator/src/main/java/org/tron/core/actuator/TransferActuator.java b/actuator/src/main/java/org/tron/core/actuator/TransferActuator.java index 12536a7f92f..94fef0b5c12 100755 --- a/actuator/src/main/java/org/tron/core/actuator/TransferActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/TransferActuator.java @@ -150,8 +150,8 @@ public boolean validate() throws ContractValidateException { "Account type is Contract, but it is not exist in contract store."); } else if (contractCapsule.getContractVersion() == 1) { throw new ContractValidateException( - "Cannot transfer TRX to a smartContract which version is one. " + - "Instead please use TriggerSmartContract "); + "Cannot transfer TRX to a smartContract which version is one. " + + "Instead please use TriggerSmartContract "); } } diff --git a/actuator/src/main/java/org/tron/core/actuator/VMActuator.java b/actuator/src/main/java/org/tron/core/actuator/VMActuator.java index 299c9f1dc99..75e96145602 100644 --- a/actuator/src/main/java/org/tron/core/actuator/VMActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/VMActuator.java @@ -4,8 +4,6 @@ import static java.lang.Math.min; import static org.apache.commons.lang3.ArrayUtils.getLength; import static org.apache.commons.lang3.ArrayUtils.isNotEmpty; -import static org.tron.core.vm.utils.MUtil.transfer; -import static org.tron.core.vm.utils.MUtil.transferToken; import com.google.protobuf.ByteString; import java.math.BigInteger; @@ -30,7 +28,6 @@ import org.tron.core.capsule.BlockCapsule; import org.tron.core.capsule.ContractCapsule; import org.tron.core.capsule.ReceiptCapsule; -import org.tron.core.capsule.TransactionCapsule; import org.tron.core.db.TransactionContext; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; @@ -49,9 +46,9 @@ import org.tron.core.vm.program.ProgramPrecompile; import org.tron.core.vm.program.invoke.ProgramInvoke; import org.tron.core.vm.program.invoke.ProgramInvokeFactory; -import org.tron.core.vm.program.invoke.ProgramInvokeFactoryImpl; import org.tron.core.vm.repository.Repository; import org.tron.core.vm.repository.RepositoryImpl; +import org.tron.core.vm.utils.MUtil; import org.tron.protos.Protocol; import org.tron.protos.Protocol.Block; import org.tron.protos.Protocol.Transaction; @@ -64,17 +61,17 @@ @Slf4j(topic = "VM") public class VMActuator implements Actuator2 { + /* tx and block info */ private Transaction trx; private BlockCapsule blockCap; - private Repository repository; - private InternalTransaction rootInternalTransaction; - private ProgramInvokeFactory programInvokeFactory; - private ReceiptCapsule receipt; - - private VM vm; + /* tvm execution context */ + private Repository rootRepository; private Program program; - private VMConfig vmConfig = VMConfig.getInstance(); + private InternalTransaction rootInternalTx; + + /* tx receipt */ + private ReceiptCapsule receipt; @Getter @Setter @@ -90,10 +87,8 @@ public class VMActuator implements Actuator2 { private LogInfoTriggerParser logInfoTriggerParser; - public VMActuator(boolean isConstantCall) { this.isConstantCall = isConstantCall; - programInvokeFactory = new ProgramInvokeFactoryImpl(); } private static long getEnergyFee(long callerEnergyUsage, long callerEnergyFrozen, @@ -123,7 +118,7 @@ public void validate(Object object) throws ContractValidateException { //Route Type ContractType contractType = this.trx.getRawData().getContract(0).getType(); //Prepare Repository - repository = RepositoryImpl.createRoot(context.getStoreFactory()); + rootRepository = RepositoryImpl.createRoot(context.getStoreFactory()); enableEventListener = context.isEventPluginLoaded(); @@ -161,7 +156,7 @@ public void execute(Object object) throws ContractExeException { ProgramResult result = context.getProgramResult(); try { - if (vm != null) { + if (program != null) { if (null != blockCap && blockCap.generatedByMyself && blockCap.hasWitnessSignature() && null != TransactionUtil.getContractRet(trx) && contractResult.OUT_OF_TIME == TransactionUtil.getContractRet(trx)) { @@ -174,18 +169,17 @@ public void execute(Object object) throws ContractExeException { throw e; } - vm.play(program); + VM.play(program); result = program.getResult(); if (TrxType.TRX_CONTRACT_CREATION_TYPE == trxType && !result.isRevert()) { byte[] code = program.getResult().getHReturn(); - if (code.length != 0 && vmConfig.allowTvmLondon() && code[0] == (byte) 0xEF) { + if (code.length != 0 && VMConfig.allowTvmLondon() && code[0] == (byte) 0xEF) { if (null == result.getException()) { - result.setException(Program.Exception - .invalidCodeException()); + result.setException(Program.Exception.invalidCodeException()); } } - long saveCodeEnergy = (long) getLength(code) * EnergyCost.getInstance().getCREATE_DATA(); + long saveCodeEnergy = (long) getLength(code) * EnergyCost.getCreateData(); long afterSpend = program.getEnergyLimitLeft().longValue() - saveCodeEnergy; if (afterSpend < 0) { if (null == result.getException()) { @@ -196,7 +190,7 @@ public void execute(Object object) throws ContractExeException { } else { result.spendEnergy(saveCodeEnergy); if (VMConfig.allowTvmConstantinople()) { - repository.saveCode(program.getContractAddress().getNoLeadZeroesData(), code); + rootRepository.saveCode(program.getContractAddress().getNoLeadZeroesData(), code); } } } @@ -213,7 +207,7 @@ public void execute(Object object) throws ContractExeException { if (result.getException() != null || result.isRevert()) { result.getDeleteAccounts().clear(); result.getLogInfoList().clear(); - result.resetFutureRefund(); + //result.resetFutureRefund(); result.rejectInternalTransactions(); if (result.getException() != null) { @@ -226,17 +220,17 @@ public void execute(Object object) throws ContractExeException { result.setRuntimeError("REVERT opcode executed"); } } else { - repository.commit(); + rootRepository.commit(); if (logInfoTriggerParser != null) { List triggers = logInfoTriggerParser - .parseLogInfos(program.getResult().getLogInfoList(), repository); + .parseLogInfos(program.getResult().getLogInfoList(), rootRepository); program.getResult().setTriggerList(triggers); } } } else { - repository.commit(); + rootRepository.commit(); } } catch (JVMStackOverFlowException e) { program.spendAllEnergy(); @@ -280,7 +274,7 @@ public void execute(Object object) throws ContractExeException { traceContent = VMUtils.zipAndEncode(traceContent); } - String txHash = Hex.toHexString(rootInternalTransaction.getHash()); + String txHash = Hex.toHexString(rootInternalTx.getHash()); VMUtils.saveProgramTraceFile(txHash, traceContent); } @@ -288,7 +282,7 @@ public void execute(Object object) throws ContractExeException { private void create() throws ContractValidateException { - if (!repository.getDynamicPropertiesStore().supportVM()) { + if (!rootRepository.getDynamicPropertiesStore().supportVM()) { throw new ContractValidateException("vm work is off, need to be opened by the committee"); } @@ -320,7 +314,7 @@ private void create() byte[] contractAddress = WalletUtil.generateContractAddress(trx); // insure the new contract address haven't exist - if (repository.getAccount(contractAddress) != null) { + if (rootRepository.getAccount(contractAddress) != null) { throw new ContractValidateException( "Trying to create a contract with existing contract address: " + StringUtil .encode58Check(contractAddress)); @@ -339,12 +333,12 @@ private void create() // create vm to constructor smart contract try { long feeLimit = trx.getRawData().getFeeLimit(); - if (feeLimit < 0 || feeLimit > repository.getDynamicPropertiesStore().getMaxFeeLimit()) { + if (feeLimit < 0 || feeLimit > rootRepository.getDynamicPropertiesStore().getMaxFeeLimit()) { logger.info("invalid feeLimit {}", feeLimit); throw new ContractValidateException( - "feeLimit must be >= 0 and <= " + repository.getDynamicPropertiesStore().getMaxFeeLimit()); + "feeLimit must be >= 0 and <= " + rootRepository.getDynamicPropertiesStore().getMaxFeeLimit()); } - AccountCapsule creator = this.repository + AccountCapsule creator = rootRepository .getAccount(newSmartContract.getOriginAddress().toByteArray()); long energyLimit; @@ -372,19 +366,18 @@ private void create() checkTokenValueAndId(tokenValue, tokenId); byte[] ops = newSmartContract.getBytecode().toByteArray(); - rootInternalTransaction = new InternalTransaction(trx, trxType); + rootInternalTx = new InternalTransaction(trx, trxType); - long maxCpuTimeOfOneTx = repository.getDynamicPropertiesStore() + long maxCpuTimeOfOneTx = rootRepository.getDynamicPropertiesStore() .getMaxCpuTimeOfOneTx() * VMConstant.ONE_THOUSAND; long thisTxCPULimitInUs = (long) (maxCpuTimeOfOneTx * getCpuLimitInUsRatio()); long vmStartInUs = System.nanoTime() / VMConstant.ONE_THOUSAND; long vmShouldEndInUs = vmStartInUs + thisTxCPULimitInUs; - ProgramInvoke programInvoke = programInvokeFactory + ProgramInvoke programInvoke = ProgramInvokeFactory .createProgramInvoke(TrxType.TRX_CONTRACT_CREATION_TYPE, executorType, trx, - tokenValue, tokenId, blockCap.getInstance(), repository, vmStartInUs, + tokenValue, tokenId, blockCap.getInstance(), rootRepository, vmStartInUs, vmShouldEndInUs, energyLimit); - this.vm = new VM(); - this.program = new Program(ops, programInvoke, rootInternalTransaction, vmConfig); + this.program = new Program(ops, programInvoke, rootInternalTx); if (VMConfig.allowTvmCompatibleEvm()) { this.program.setContractVersion(1); } @@ -400,20 +393,20 @@ private void create() } program.getResult().setContractAddress(contractAddress); - repository.createAccount(contractAddress, newSmartContract.getName(), + rootRepository.createAccount(contractAddress, newSmartContract.getName(), Protocol.AccountType.Contract); - repository.createContract(contractAddress, new ContractCapsule(newSmartContract)); + rootRepository.createContract(contractAddress, new ContractCapsule(newSmartContract)); byte[] code = newSmartContract.getBytecode().toByteArray(); if (!VMConfig.allowTvmConstantinople()) { - repository.saveCode(contractAddress, ProgramPrecompile.getCode(code)); + rootRepository.saveCode(contractAddress, ProgramPrecompile.getCode(code)); } // transfer from callerAddress to contractAddress according to callValue if (callValue > 0) { - transfer(this.repository, callerAddress, contractAddress, callValue); + MUtil.transfer(rootRepository, callerAddress, contractAddress, callValue); } if (VMConfig.allowTvmTransferTrc10() && tokenValue > 0) { - transferToken(this.repository, callerAddress, contractAddress, String.valueOf(tokenId), + MUtil.transferToken(rootRepository, callerAddress, contractAddress, String.valueOf(tokenId), tokenValue); } @@ -426,7 +419,7 @@ private void create() private void call() throws ContractValidateException { - if (!repository.getDynamicPropertiesStore().supportVM()) { + if (!rootRepository.getDynamicPropertiesStore().supportVM()) { logger.info("vm work is off, need to be opened by the committee"); throw new ContractValidateException("VM work is off, need to be opened by the committee"); } @@ -442,7 +435,7 @@ private void call() byte[] contractAddress = contract.getContractAddress().toByteArray(); - ContractCapsule deployedContract = repository.getContract(contractAddress); + ContractCapsule deployedContract = rootRepository.getContract(contractAddress); if (null == deployedContract) { logger.info("No contract or not a smart contract"); throw new ContractValidateException("No contract or not a smart contract"); @@ -468,40 +461,39 @@ private void call() byte[] callerAddress = contract.getOwnerAddress().toByteArray(); checkTokenValueAndId(tokenValue, tokenId); - byte[] code = repository.getCode(contractAddress); + byte[] code = rootRepository.getCode(contractAddress); if (isNotEmpty(code)) { long feeLimit = trx.getRawData().getFeeLimit(); - if (feeLimit < 0 || feeLimit > repository.getDynamicPropertiesStore().getMaxFeeLimit()) { + if (feeLimit < 0 || feeLimit > rootRepository.getDynamicPropertiesStore().getMaxFeeLimit()) { logger.info("invalid feeLimit {}", feeLimit); throw new ContractValidateException( - "feeLimit must be >= 0 and <= " + repository.getDynamicPropertiesStore().getMaxFeeLimit()); + "feeLimit must be >= 0 and <= " + rootRepository.getDynamicPropertiesStore().getMaxFeeLimit()); } - AccountCapsule caller = repository.getAccount(callerAddress); + AccountCapsule caller = rootRepository.getAccount(callerAddress); long energyLimit; if (isConstantCall) { energyLimit = CommonParameter.getInstance().maxEnergyLimitForConstant; } else { - AccountCapsule creator = repository + AccountCapsule creator = rootRepository .getAccount(deployedContract.getInstance().getOriginAddress().toByteArray()); energyLimit = getTotalEnergyLimit(creator, caller, contract, feeLimit, callValue); } - long maxCpuTimeOfOneTx = repository.getDynamicPropertiesStore() + long maxCpuTimeOfOneTx = rootRepository.getDynamicPropertiesStore() .getMaxCpuTimeOfOneTx() * VMConstant.ONE_THOUSAND; long thisTxCPULimitInUs = (long) (maxCpuTimeOfOneTx * getCpuLimitInUsRatio()); long vmStartInUs = System.nanoTime() / VMConstant.ONE_THOUSAND; long vmShouldEndInUs = vmStartInUs + thisTxCPULimitInUs; - ProgramInvoke programInvoke = programInvokeFactory + ProgramInvoke programInvoke = ProgramInvokeFactory .createProgramInvoke(TrxType.TRX_CONTRACT_CALL_TYPE, executorType, trx, - tokenValue, tokenId, blockCap.getInstance(), repository, vmStartInUs, + tokenValue, tokenId, blockCap.getInstance(), rootRepository, vmStartInUs, vmShouldEndInUs, energyLimit); if (isConstantCall) { programInvoke.setConstantCall(); } - this.vm = new VM(); - rootInternalTransaction = new InternalTransaction(trx, trxType); - this.program = new Program(code, programInvoke, rootInternalTransaction, vmConfig); + rootInternalTx = new InternalTransaction(trx, trxType); + this.program = new Program(code, programInvoke, rootInternalTx); if (VMConfig.allowTvmCompatibleEvm()) { this.program.setContractVersion(deployedContract.getContractVersion()); } @@ -518,10 +510,10 @@ private void call() //transfer from callerAddress to targetAddress according to callValue if (callValue > 0) { - transfer(this.repository, callerAddress, contractAddress, callValue); + MUtil.transfer(rootRepository, callerAddress, contractAddress, callValue); } if (VMConfig.allowTvmTransferTrc10() && tokenValue > 0) { - transferToken(this.repository, callerAddress, contractAddress, String.valueOf(tokenId), + MUtil.transferToken(rootRepository, callerAddress, contractAddress, String.valueOf(tokenId), tokenValue); } @@ -531,11 +523,11 @@ public long getAccountEnergyLimitWithFixRatio(AccountCapsule account, long feeLi long callValue) { long sunPerEnergy = VMConstant.SUN_PER_ENERGY; - if (repository.getDynamicPropertiesStore().getEnergyFee() > 0) { - sunPerEnergy = repository.getDynamicPropertiesStore().getEnergyFee(); + if (rootRepository.getDynamicPropertiesStore().getEnergyFee() > 0) { + sunPerEnergy = rootRepository.getDynamicPropertiesStore().getEnergyFee(); } - long leftFrozenEnergy = repository.getAccountLeftEnergyFromFreeze(account); + long leftFrozenEnergy = rootRepository.getAccountLeftEnergyFromFreeze(account); if (VMConfig.allowTvmFreeze()) { receipt.setCallerEnergyLeft(leftFrozenEnergy); } @@ -552,11 +544,11 @@ private long getAccountEnergyLimitWithFloatRatio(AccountCapsule account, long fe long callValue) { long sunPerEnergy = VMConstant.SUN_PER_ENERGY; - if (repository.getDynamicPropertiesStore().getEnergyFee() > 0) { - sunPerEnergy = repository.getDynamicPropertiesStore().getEnergyFee(); + if (rootRepository.getDynamicPropertiesStore().getEnergyFee() > 0) { + sunPerEnergy = rootRepository.getDynamicPropertiesStore().getEnergyFee(); } // can change the calc way - long leftEnergyFromFreeze = repository.getAccountLeftEnergyFromFreeze(account); + long leftEnergyFromFreeze = rootRepository.getAccountLeftEnergyFromFreeze(account); callValue = max(callValue, 0); long energyFromBalance = Math .floorDiv(max(account.getBalance() - callValue, 0), sunPerEnergy); @@ -567,7 +559,7 @@ private long getAccountEnergyLimitWithFloatRatio(AccountCapsule account, long fe energyFromFeeLimit = feeLimit / sunPerEnergy; } else { - long totalEnergyFromFreeze = repository + long totalEnergyFromFreeze = rootRepository .calculateGlobalEnergyLimit(account); long leftBalanceForEnergyFreeze = getEnergyFee(totalBalanceForEnergyFreeze, leftEnergyFromFreeze, @@ -612,8 +604,8 @@ public void checkTokenValueAndId(long tokenValue, long tokenId) throws ContractV // tokenid can only be 0 when tokenvalue = 0, // or (MIN_TOKEN_ID, Long.Max] if (tokenValue > 0 && tokenId == 0) { - throw new ContractValidateException("invalid arguments with tokenValue = " + tokenValue + - ", tokenId = " + tokenId); + throw new ContractValidateException("invalid arguments with tokenValue = " + + tokenValue + ", tokenId = " + tokenId); } } } @@ -625,8 +617,8 @@ private double getCpuLimitInUsRatio() { if (ExecutorType.ET_NORMAL_TYPE == executorType) { // self witness generates block - if (this.blockCap != null && blockCap.generatedByMyself && - !this.blockCap.hasWitnessSignature()) { + if (blockCap != null && blockCap.generatedByMyself + && !blockCap.hasWitnessSignature()) { cpuLimitRatio = 1.0; } else { // self witness or other witness or fullnode verifies block @@ -657,7 +649,7 @@ public long getTotalEnergyLimitWithFixRatio(AccountCapsule creator, AccountCapsu } long creatorEnergyLimit = 0; - ContractCapsule contractCapsule = repository + ContractCapsule contractCapsule = rootRepository .getContract(contract.getContractAddress().toByteArray()); long consumeUserResourcePercent = contractCapsule.getConsumeUserResourcePercent(); @@ -668,7 +660,7 @@ public long getTotalEnergyLimitWithFixRatio(AccountCapsule creator, AccountCapsu long originEnergyLeft = 0; if (consumeUserResourcePercent < VMConstant.ONE_HUNDRED) { - originEnergyLeft = repository.getAccountLeftEnergyFromFreeze(creator); + originEnergyLeft = rootRepository.getAccountLeftEnergyFromFreeze(creator); if (VMConfig.allowTvmFreeze()) { receipt.setOriginEnergyLeft(originEnergyLeft); } @@ -700,9 +692,9 @@ private long getTotalEnergyLimitWithFloatRatio(AccountCapsule creator, AccountCa } // creatorEnergyFromFreeze - long creatorEnergyLimit = repository.getAccountLeftEnergyFromFreeze(creator); + long creatorEnergyLimit = rootRepository.getAccountLeftEnergyFromFreeze(creator); - ContractCapsule contractCapsule = repository + ContractCapsule contractCapsule = rootRepository .getContract(contract.getContractAddress().toByteArray()); long consumeUserResourcePercent = contractCapsule.getConsumeUserResourcePercent(); diff --git a/actuator/src/main/java/org/tron/core/vm/EnergyCost.java b/actuator/src/main/java/org/tron/core/vm/EnergyCost.java index fda84df5b71..f4d435e2d70 100644 --- a/actuator/src/main/java/org/tron/core/vm/EnergyCost.java +++ b/actuator/src/main/java/org/tron/core/vm/EnergyCost.java @@ -1,175 +1,442 @@ package org.tron.core.vm; +import java.math.BigInteger; +import org.tron.common.runtime.vm.DataWord; +import org.tron.core.vm.program.Program; +import org.tron.core.vm.program.Stack; public class EnergyCost { - private static EnergyCost instance = null; - private final int BALANCE = 20; - private final int SHA3 = 30; - private final int SHA3_WORD = 6; - private final int SLOAD = 50; - private final int STOP = 0; - private final int SUICIDE = 0; - private final int CLEAR_SSTORE = 5000; - private final int SET_SSTORE = 20000; - private final int RESET_SSTORE = 5000; - private final int REFUND_SSTORE = 15000; - private final int CREATE = 32000; - private final int CALL = 40; - private final int STIPEND_CALL = 2300; - private final int VT_CALL = 9000; // value transfer call - private final int NEW_ACCT_CALL = 25000; // new account call - private final int MEMORY = 3; - private final int CREATE_DATA = 200; - private final int LOG_ENERGY = 375; - private final int LOG_DATA_ENERGY = 8; - private final int LOG_TOPIC_ENERGY = 375; - private final int COPY_ENERGY = 3; - private final int EXP_ENERGY = 10; - private final int EXP_BYTE_ENERGY = 10; - private final int EXT_CODE_SIZE = 20; - private final int EXT_CODE_COPY = 20; - private final int EXT_CODE_HASH = 400; - private final int NEW_ACCT_SUICIDE = 0; - private final int FREEZE = 20000; - private final int UNFREEZE = 20000; - private final int FREEZE_EXPIRE_TIME = 50; - private final int VOTE_WITNESS = 30000; - private final int WITHDRAW_REWARD = 20000; - - public static EnergyCost getInstance() { - if (instance == null) { - instance = new EnergyCost(); - } + private static final long ZERO_TIER = 0; + private static final long BASE_TIER = 2; + private static final long VERY_LOW_TIER = 3; + private static final long LOW_TIER = 5; + private static final long MID_TIER = 8; + private static final long HIGH_TIER = 10; + private static final long EXT_TIER = 20; + private static final long SPECIAL_TIER = 1; - return instance; - } + private static final long EXP_ENERGY = 10; + private static final long EXP_BYTE_ENERGY = 10; + private static final long SHA3 = 30; + // 3MB + private static final BigInteger MEM_LIMIT = BigInteger.valueOf(3L * 1024 * 1024); + private static final long MEMORY = 3; + private static final long COPY_ENERGY = 3; + private static final long SHA3_WORD = 6; + private static final long SLOAD = 50; + private static final long CLEAR_SSTORE = 5000; + private static final long SET_SSTORE = 20000; + private static final long RESET_SSTORE = 5000; + private static final long LOG_DATA_ENERGY = 8; + private static final long LOG_ENERGY = 375; + private static final long LOG_TOPIC_ENERGY = 375; + private static final long BALANCE = 20; + private static final long FREEZE = 20000; + private static final long NEW_ACCT_CALL = 25000; + private static final long UNFREEZE = 20000; + private static final long FREEZE_EXPIRE_TIME = 50; + private static final long VOTE_WITNESS = 30000; + private static final long WITHDRAW_REWARD = 20000; + private static final long CREATE = 32000; + private static final long CALL_ENERGY = 40; + private static final long VT_CALL = 9000; + private static final long STIPEND_CALL = 2300; + private static final long EXT_CODE_COPY = 20; + private static final long EXT_CODE_SIZE = 20; + private static final long EXT_CODE_HASH = 400; + private static final long SUICIDE = 0; + private static final long STOP = 0; + private static final long CREATE_DATA = 200; - public int getBalance() { - return BALANCE; + public static long getZeroTierCost(Program program) { + return ZERO_TIER; } - public int getSha3() { - return SHA3; + public static long getVeryLowTierCost(Program program) { + return VERY_LOW_TIER; } - public int getSha3Word() { - return SHA3_WORD; + public static long getLowTierCost(Program program) { + return LOW_TIER; } - public int getSLoad() { - return SLOAD; + public static long getMidTierCost(Program program) { + return MID_TIER; } - public int getStop() { - return STOP; + public static long getBaseTierCost(Program program) { + return BASE_TIER; } - public int getSuicide() { - return SUICIDE; + public static long getExtTierCost(Program program) { + return EXT_TIER; } - public int getClearSStore() { - return CLEAR_SSTORE; + public static long getHighTierCost(Program program) { + return HIGH_TIER; } - public int getSetSStore() { - return SET_SSTORE; + public static long getSpecialTierCost(Program program) { + return SPECIAL_TIER; } - public int getResetSStore() { - return RESET_SSTORE; + public static long getStipendCallCost() { + return STIPEND_CALL; } - public int getRefundSStore() { - return REFUND_SSTORE; + public static long getExpCost(Program program) { + Stack stack = program.getStack(); + DataWord exp = stack.get(stack.size() - 2); + int bytesOccupied = exp.bytesOccupied(); + return EXP_ENERGY + EXP_BYTE_ENERGY * bytesOccupied; } - public int getCreate() { - return CREATE; + public static long getExtCodeSizeCost(Program program) { + return EXT_CODE_SIZE; } - public int getCall() { - return CALL; + public static long getSha3Cost(Program program) { + Stack stack = program.getStack(); + long oldMemSize = program.getMemSize(); + long energyCost = SHA3 + calcMemEnergy(oldMemSize, + memNeeded(stack.peek(), stack.get(stack.size() - 2)), 0, Op.SHA3); + DataWord size = stack.get(stack.size() - 2); + long chunkUsed = (size.longValueSafe() + 31) / 32; + energyCost += chunkUsed * SHA3_WORD; + return energyCost; } - public int getStipendCall() { - return STIPEND_CALL; + public static long getCodeCopyCost(Program program) { + Stack stack = program.getStack(); + long oldMemSize = program.getMemSize(); + long energyCost = calcMemEnergy(oldMemSize, + memNeeded(stack.peek(), stack.get(stack.size() - 3)), + stack.get(stack.size() - 3).longValueSafe(), Op.CODECOPY); + return energyCost; } - public int getVtCall() { - return VT_CALL; + public static long getReturnDataCopyCost(Program program) { + Stack stack = program.getStack(); + long oldMemSize = program.getMemSize(); + long energyCost = calcMemEnergy(oldMemSize, + memNeeded(stack.peek(), stack.get(stack.size() - 3)), + stack.get(stack.size() - 3).longValueSafe(), Op.RETURNDATACOPY); + return energyCost; } - public int getNewAcctCall() { - return NEW_ACCT_CALL; + public static long getCallDataCopyCost(Program program) { + Stack stack = program.getStack(); + long oldMemSize = program.getMemSize(); + long energyCost = calcMemEnergy(oldMemSize, + memNeeded(stack.peek(), stack.get(stack.size() - 3)), + stack.get(stack.size() - 3).longValueSafe(), Op.CALLDATACOPY); + return energyCost; } - public int getNewAcctSuicide() { - return NEW_ACCT_SUICIDE; + public static long getExtCodeCopyCost(Program program) { + Stack stack = program.getStack(); + long oldMemSize = program.getMemSize(); + long energyCost = EXT_CODE_COPY + calcMemEnergy(oldMemSize, + memNeeded(stack.get(stack.size() - 2), stack.get(stack.size() - 4)), + stack.get(stack.size() - 4).longValueSafe(), Op.EXTCODECOPY); + return energyCost; } - public int getMemory() { - return MEMORY; + public static long getExtCodeHashCost(Program program) { + return EXT_CODE_HASH; } - public int getCREATE_DATA() { - return CREATE_DATA; + public static long getMloadCost(Program program) { + Stack stack = program.getStack(); + long oldMemSize = program.getMemSize(); + long energyCost = calcMemEnergy(oldMemSize, + memNeeded(stack.peek(), new DataWord(32)), + 0, Op.MLOAD); + return energyCost; } - public int getLogEnergy() { - return LOG_ENERGY; + public static long getMStoreCost(Program program) { + Stack stack = program.getStack(); + long oldMemSize = program.getMemSize(); + long energyCost = calcMemEnergy(oldMemSize, + memNeeded(stack.peek(), new DataWord(32)), + 0, Op.MSTORE); + return energyCost; } - public int getLogDataEnergy() { - return LOG_DATA_ENERGY; + public static long getMStore8Cost(Program program) { + Stack stack = program.getStack(); + long oldMemSize = program.getMemSize(); + long energyCost = calcMemEnergy(oldMemSize, + memNeeded(stack.peek(), DataWord.ONE()), + 0, Op.MSTORE8); + return energyCost; } - public int getLogTopicEnergy() { - return LOG_TOPIC_ENERGY; + public static long getSloadCost(Program program) { + return SLOAD; } - public int getCopyEnergy() { - return COPY_ENERGY; + public static long getReturnCost(Program program) { + Stack stack = program.getStack(); + long oldMemSize = program.getMemSize(); + long energyCost = STOP + calcMemEnergy(oldMemSize, + memNeeded(stack.peek(), stack.get(stack.size() - 2)), 0, Op.RETURN); + return energyCost; } - public int getExpEnergy() { - return EXP_ENERGY; + public static long getRevertCost(Program program) { + Stack stack = program.getStack(); + long oldMemSize = program.getMemSize(); + long energyCost = STOP + calcMemEnergy(oldMemSize, + memNeeded(stack.peek(), stack.get(stack.size() - 2)), 0, Op.REVERT); + return energyCost; } - public int getExpByteEnergy() { - return EXP_BYTE_ENERGY; + public static long getSstoreCost(Program program) { + Stack stack = program.getStack(); + DataWord newValue = stack.get(stack.size() - 2); + DataWord oldValue = program.storageLoad(stack.peek()); + + if (oldValue == null && !newValue.isZero()) { + // set a new not-zero value + return SET_SSTORE; + } + if (oldValue != null && newValue.isZero()) { + // set zero to an old value + return CLEAR_SSTORE; + } + // include: + // [1] oldValue == null && newValue == 0 + // [2] oldValue != null && newValue != 0 + return RESET_SSTORE; + } - public int getExtCodeSize() { - return EXT_CODE_SIZE; + public static long getLogCost(Program program) { + Stack stack = program.getStack(); + long oldMemSize = program.getMemSize(); + int opIntValue = program.getCurrentOpIntValue(); + int nTopics = opIntValue - Op.LOG0; + BigInteger dataSize = stack.get(stack.size() - 2).value(); + BigInteger dataCost = dataSize + .multiply(BigInteger.valueOf(LOG_DATA_ENERGY)); + if (program.getEnergyLimitLeft().value().compareTo(dataCost) < 0) { + throw new Program.OutOfEnergyException( + "Not enough energy for '%s' operation executing: opEnergy[%d], programEnergy[%d]", + Op.getNameOf(opIntValue), + dataCost.longValueExact(), program.getEnergyLimitLeft().longValueSafe()); + } + long energyCost = LOG_ENERGY + LOG_TOPIC_ENERGY * nTopics + + LOG_DATA_ENERGY * stack.get(stack.size() - 2).longValue() + + calcMemEnergy(oldMemSize, + memNeeded(stack.peek(), stack.get(stack.size() - 2)), 0, opIntValue); + + checkMemorySize(opIntValue, memNeeded(stack.peek(), stack.get(stack.size() - 2))); + return energyCost; } - public int getExtCodeCopy() { - return EXT_CODE_COPY; + public static long getSuicideCost(Program program) { + return SUICIDE; } - public int getExtCodeHash() { - return EXT_CODE_HASH; + public static long getBalanceCost(Program program) { + return BALANCE; } - public int getFreeze() { + public static long getFreezeCost(Program program) { + + Stack stack = program.getStack(); + DataWord receiverAddressWord = stack.get(stack.size() - 3); + if (isDeadAccount(program, receiverAddressWord)) { + return FREEZE + NEW_ACCT_CALL; + } return FREEZE; } - public int getUnfreeze() { + public static long getUnfreezeCost(Program program) { return UNFREEZE; } - public int getFreezeExpireTime() { + public static long getFreezeExpireTimeCost(Program program) { return FREEZE_EXPIRE_TIME; } - public int getVoteWitness() { - return VOTE_WITNESS; + public static long getVoteWitnessCost(Program program) { + + Stack stack = program.getStack(); + long oldMemSize = program.getMemSize(); + DataWord amountArrayLength = stack.get(stack.size() - 1).clone(); + DataWord amountArrayOffset = stack.get(stack.size() - 2); + DataWord witnessArrayLength = stack.get(stack.size() - 3).clone(); + DataWord witnessArrayOffset = stack.get(stack.size() - 4); + + DataWord wordSize = new DataWord(DataWord.WORD_SIZE); + + amountArrayLength.mul(wordSize); + BigInteger amountArrayMemoryNeeded = memNeeded(amountArrayOffset, amountArrayLength); + + witnessArrayLength.mul(wordSize); + BigInteger witnessArrayMemoryNeeded = memNeeded(witnessArrayOffset, witnessArrayLength); + + return VOTE_WITNESS + calcMemEnergy(oldMemSize, + (amountArrayMemoryNeeded.compareTo(witnessArrayMemoryNeeded) > 0 + ? amountArrayMemoryNeeded : witnessArrayMemoryNeeded), 0, Op.VOTEWITNESS); } - public int getWithdrawReward() { + public static long getWithdrawRewardCost(Program program) { return WITHDRAW_REWARD; } + + public static long getCreateCost(Program program) { + Stack stack = program.getStack(); + long oldMemSize = program.getMemSize(); + return CREATE + calcMemEnergy(oldMemSize, + memNeeded(stack.get(stack.size() - 2), stack.get(stack.size() - 3)), 0, Op.CREATE); + } + + public static long getCreate2Cost(Program program) { + Stack stack = program.getStack(); + long oldMemSize = program.getMemSize(); + DataWord codeSize = stack.get(stack.size() - 3); + long energyCost = CREATE; + energyCost += calcMemEnergy(oldMemSize, + memNeeded(stack.get(stack.size() - 2), stack.get(stack.size() - 3)), + 0, Op.CREATE2); + return energyCost + DataWord.sizeInWords(codeSize.intValueSafe()) * SHA3_WORD; + } + + public static long getCallCost(Program program) { + Stack stack = program.getStack(); + // here, contract call an other contract, or a library, and so on + long energyCost = CALL_ENERGY; + DataWord callAddressWord = stack.get(stack.size() - 2); + DataWord value = stack.get(stack.size() - 3); + int opOff = 4; + //check to see if account does not exist and is not a precompiled contract + if (!value.isZero()) { + energyCost += VT_CALL; + if (isDeadAccount(program, callAddressWord)) { + energyCost += NEW_ACCT_CALL; + } + } + return getCalculateCallCost(stack, program, energyCost, opOff); + } + + public static long getStaticCallCost(Program program) { + Stack stack = program.getStack(); + long energyCost = CALL_ENERGY; + int opOff = 3; + return getCalculateCallCost(stack, program, energyCost, opOff); + } + + public static long getDelegateCallCost(Program program) { + Stack stack = program.getStack(); + long energyCost = CALL_ENERGY; + int opOff = 3; + return getCalculateCallCost(stack, program, energyCost, opOff); + } + + public static long getCallCodeCost(Program program) { + Stack stack = program.getStack(); + long energyCost = CALL_ENERGY; + DataWord value = stack.get(stack.size() - 3); + int opOff = 4; + if (!value.isZero()) { + energyCost += VT_CALL; + } + return getCalculateCallCost(stack, program, energyCost, opOff); + } + + public static long getCallTokenCost(Program program) { + Stack stack = program.getStack(); + long energyCost = CALL_ENERGY; + DataWord callAddressWord = stack.get(stack.size() - 2); + DataWord value = stack.get(stack.size() - 3); + int opOff = 5; + //check to see if account does not exist and is not a precompiled contract + if (!value.isZero()) { + energyCost += VT_CALL; + if (isDeadAccount(program, callAddressWord)) { + energyCost += NEW_ACCT_CALL; + } + } + return getCalculateCallCost(stack, program, energyCost, opOff); + } + + public static long getCalculateCallCost(Stack stack, Program program, + long energyCost, int opOff) { + int op = program.getCurrentOpIntValue(); + long oldMemSize = program.getMemSize(); + DataWord callEnergyWord = stack.get(stack.size() - 1); + // in offset+size + BigInteger in = memNeeded(stack.get(stack.size() - opOff), + stack.get(stack.size() - opOff - 1)); + // out offset+size + BigInteger out = memNeeded(stack.get(stack.size() - opOff - 2), + stack.get(stack.size() - opOff - 3)); + energyCost += calcMemEnergy(oldMemSize, in.max(out), + 0, op); + + if (energyCost > program.getEnergyLimitLeft().longValueSafe()) { + throw new Program.OutOfEnergyException( + "Not enough energy for '%s' operation executing: opEnergy[%d], programEnergy[%d]", + Op.getNameOf(op), + energyCost, program.getEnergyLimitLeft().longValueSafe()); + } + DataWord getEnergyLimitLeft = program.getEnergyLimitLeft().clone(); + getEnergyLimitLeft.sub(new DataWord(energyCost)); + + DataWord adjustedCallEnergy = program.getCallEnergy(callEnergyWord, getEnergyLimitLeft); + program.setAdjustedCallEnergy(adjustedCallEnergy); + energyCost += adjustedCallEnergy.longValueSafe(); + return energyCost; + } + + public static long getNewAcctCall() { + return NEW_ACCT_CALL; + } + + public static long getCreateData() { + return CREATE_DATA; + } + + + private static long calcMemEnergy(long oldMemSize, BigInteger newMemSize, + long copySize, int op) { + long energyCost = 0; + + checkMemorySize(op, newMemSize); + + // memory SUN consume calc + long memoryUsage = (newMemSize.longValueExact() + 31) / 32 * 32; + if (memoryUsage > oldMemSize) { + long memWords = (memoryUsage / 32); + long memWordsOld = (oldMemSize / 32); + long memEnergy = (MEMORY * memWords + memWords * memWords / 512) + - (MEMORY * memWordsOld + memWordsOld * memWordsOld / 512); + energyCost += memEnergy; + } + + if (copySize > 0) { + long copyEnergy = COPY_ENERGY * ((copySize + 31) / 32); + energyCost += copyEnergy; + } + return energyCost; + } + + private static void checkMemorySize(int op, BigInteger newMemSize) { + if (newMemSize.compareTo(MEM_LIMIT) > 0) { + throw Program.Exception.memoryOverflow(op); + } + } + + private static BigInteger memNeeded(DataWord offset, DataWord size) { + return size.isZero() ? BigInteger.ZERO : offset.value().add(size.value()); + } + + private static boolean isDeadAccount(Program program, DataWord address) { + return program.getContractState().getAccount(address.toTronAddress()) == null; + } } diff --git a/actuator/src/main/java/org/tron/core/vm/MessageCall.java b/actuator/src/main/java/org/tron/core/vm/MessageCall.java index e4897f76e47..ca68cba56dd 100644 --- a/actuator/src/main/java/org/tron/core/vm/MessageCall.java +++ b/actuator/src/main/java/org/tron/core/vm/MessageCall.java @@ -1,20 +1,3 @@ -/* - * Copyright (c) [2016] [ ] - * This file is part of the ethereumJ library. - * - * The ethereumJ library is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * The ethereumJ library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with the ethereumJ library. If not, see . - */ package org.tron.core.vm; import org.tron.common.runtime.vm.DataWord; @@ -28,7 +11,7 @@ public class MessageCall { /** * Type of internal call. Either CALL, CALLCODE or POST */ - private final OpCode type; + private final int opCode; /** * energy to pay for the call, remaining energy will be refunded to the caller @@ -63,10 +46,10 @@ public class MessageCall { private boolean isTokenTransferMsg; - public MessageCall(OpCode type, DataWord energy, DataWord codeAddress, + public MessageCall(int opCode, DataWord energy, DataWord codeAddress, DataWord endowment, DataWord inDataOffs, DataWord inDataSize, DataWord tokenId, boolean isTokenTransferMsg) { - this.type = type; + this.opCode = opCode; this.energy = energy; this.codeAddress = codeAddress; this.endowment = endowment; @@ -76,16 +59,16 @@ public MessageCall(OpCode type, DataWord energy, DataWord codeAddress, this.isTokenTransferMsg = isTokenTransferMsg; } - public MessageCall(OpCode type, DataWord energy, DataWord codeAddress, + public MessageCall(int opCode, DataWord energy, DataWord codeAddress, DataWord endowment, DataWord inDataOffs, DataWord inDataSize, DataWord outDataOffs, DataWord outDataSize, DataWord tokenId, boolean isTokenTransferMsg) { - this(type, energy, codeAddress, endowment, inDataOffs, inDataSize, tokenId, isTokenTransferMsg); + this(opCode, energy, codeAddress, endowment, inDataOffs, inDataSize, tokenId, isTokenTransferMsg); this.outDataOffs = outDataOffs; this.outDataSize = outDataSize; } - public OpCode getType() { - return type; + public int getOpCode() { + return opCode; } public DataWord getEnergy() { diff --git a/actuator/src/main/java/org/tron/core/vm/Op.java b/actuator/src/main/java/org/tron/core/vm/Op.java new file mode 100644 index 00000000000..6abf6a04632 --- /dev/null +++ b/actuator/src/main/java/org/tron/core/vm/Op.java @@ -0,0 +1,292 @@ +package org.tron.core.vm; + +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.Map; +import lombok.extern.slf4j.Slf4j; + +@Slf4j(topic = "VM") +public class Op { + + // Halts execution (0x00) + public static final int STOP = 0x00; + + /* Arithmetic Operations */ + // (0x01) Addition operation + public static final int ADD = 0x01; + // (0x02) Multiplication operation + public static final int MUL = 0x02; + // (0x03) Subtraction operations + public static final int SUB = 0x03; + // (0x04) Integer division operation + public static final int DIV = 0x04; + // (0x05) Signed integer division operation + public static final int SDIV = 0x05; + // (0x06) Modulo remainder operation + public static final int MOD = 0x06; + // (0x07) Signed modulo remainder operation + public static final int SMOD = 0x07; + // (0x08) Addition combined with modulo remainder operation + public static final int ADDMOD = 0x08; + // (0x09) Multiplication combined with modulo remainder operation + public static final int MULMOD = 0x09; + // (0x0a) Exponential operation + public static final int EXP = 0x0a; + // (0x0b) Extend length of signed integer + public static final int SIGNEXTEND = 0x0b; + + /* Bitwise Logic & Comparison Operations */ + // (0x10) Less-than comparison + public static final int LT = 0X10; + // (0x11) Greater-than comparison + public static final int GT = 0X11; + // (0x12) Signed less-than comparison + public static final int SLT = 0X12; + // (0x13) Signed greater-than comparison + public static final int SGT = 0X13; + // (0x14) Equality comparison + public static final int EQ = 0X14; + // (0x15) Negation operation + public static final int ISZERO = 0x15; + // (0x16) Bitwise AND operation + public static final int AND = 0x16; + // (0x17) Bitwise OR operation + public static final int OR = 0x17; + // (0x18) Bitwise XOR operation + public static final int XOR = 0x18; + // (0x19) Bitwise NOT operation + public static final int NOT = 0x19; + // (0x1a) Retrieve single byte from word + public static final int BYTE = 0x1a; + // (0x1b) Shift left + public static final int SHL = 0x1b; + // (0x1c) Logical shift right + public static final int SHR = 0x1c; + // (0x1d) Arithmetic shift right + public static final int SAR = 0x1d; + + /* Cryptographic Operations */ + // (0x20) Compute SHA3-256 hash + public static final int SHA3 = 0x20; + + /* Environmental Information */ + // (0x30) Get address of currently executing account + public static final int ADDRESS = 0x30; + // (0x31) Get balance of the given account + public static final int BALANCE = 0x31; + // (0x32) Get execution origination address + public static final int ORIGIN = 0x32; + // (0x33) Get caller address + public static final int CALLER = 0x33; + // (0x34) Get deposited value by the instruction/transaction responsible for this execution + public static final int CALLVALUE = 0x34; + // (0x35) Get input data of current environment + public static final int CALLDATALOAD = 0x35; + // (0x36) Get size of input data in current environment + public static final int CALLDATASIZE = 0x36; + // (0x37) Copy input data in current environment to memory + public static final int CALLDATACOPY = 0x37; + // (0x38) Get size of code running in current environment + public static final int CODESIZE = 0x38; + // (0x39) Copy code running in current environment to memory + public static final int CODECOPY = 0x39; + public static final int RETURNDATASIZE = 0x3d; + public static final int RETURNDATACOPY = 0x3e; + // (0x3a) Get price of gas in current environment + public static final int GASPRICE = 0x3a; + // (0x3b) Get size of code running in current environment with given offset + public static final int EXTCODESIZE = 0x3b; + // (0x3c) Copy code running in current environment to memory with given offset + public static final int EXTCODECOPY = 0x3c; + // (0x3f) Returns the keccak256 hash of a contract’s code + public static final int EXTCODEHASH = 0x3f; + + /* Block Information */ + // (0x40) Get hash of most recent complete block + public static final int BLOCKHASH = 0x40; + // (0x41) Get the block’s coinbase address + public static final int COINBASE = 0x41; + // (x042) Get the block’s timestamp + public static final int TIMESTAMP = 0x42; + // (0x43) Get the block’s number + public static final int NUMBER = 0x43; + // (0x44) Get the block’s difficulty + public static final int DIFFICULTY = 0x44; + // (0x45) Get the block’s gas limit + public static final int GASLIMIT = 0x45; + // (0x46) Get the chain id + public static final int CHAINID = 0x46; + // (0x47) Get current account balance + public static final int SELFBALANCE = 0x47; + // (0x48) Get block's basefee + public static final int BASEFEE = 0x48; + + /* Memory, Storage and Flow Operations */ + // (0x50) Remove item from stack + public static final int POP = 0x50; + // (0x51) Load word from memory + public static final int MLOAD = 0x51; + // (0x52) Save word to memory + public static final int MSTORE = 0x52; + // (0x53) Save byte to memory + public static final int MSTORE8 = 0x53; + // (0x54) Load word from storage + public static final int SLOAD = 0x54; + // (0x55) Save word to storage + public static final int SSTORE = 0x55; + // (0x56) Alter the program counter + public static final int JUMP = 0x56; + // (0x57) Conditionally alter the program counter + public static final int JUMPI = 0x57; + // (0x58) Get the program counter + public static final int PC = 0x58; + // (0x59) Get the size of active memory + public static final int MSIZE = 0x59; + // (0x5a) Get the amount of available gas + public static final int GAS = 0x5a; + public static final int JUMPDEST = 0x5b; + + /* Push Operations */ + // Place item on stack + public static final int PUSH1 = 0x60; + public static final int PUSH2 = 0x61; + public static final int PUSH3 = 0x62; + public static final int PUSH4 = 0x63; + public static final int PUSH5 = 0x64; + public static final int PUSH6 = 0x65; + public static final int PUSH7 = 0x66; + public static final int PUSH8 = 0x67; + public static final int PUSH9 = 0x68; + public static final int PUSH10 = 0x69; + public static final int PUSH11 = 0x6a; + public static final int PUSH12 = 0x6b; + public static final int PUSH13 = 0x6c; + public static final int PUSH14 = 0x6d; + public static final int PUSH15 = 0x6e; + public static final int PUSH16 = 0x6f; + public static final int PUSH17 = 0x70; + public static final int PUSH18 = 0x71; + public static final int PUSH19 = 0x72; + public static final int PUSH20 = 0x73; + public static final int PUSH21 = 0x74; + public static final int PUSH22 = 0x75; + public static final int PUSH23 = 0x76; + public static final int PUSH24 = 0x77; + public static final int PUSH25 = 0x78; + public static final int PUSH26 = 0x79; + public static final int PUSH27 = 0x7a; + public static final int PUSH28 = 0x7b; + public static final int PUSH29 = 0x7c; + public static final int PUSH30 = 0x7d; + public static final int PUSH31 = 0x7e; + public static final int PUSH32 = 0x7f; + + /* Duplicate Nth item from the stack */ + public static final int DUP1 = 0x80; + public static final int DUP2 = 0x81; + public static final int DUP3 = 0x82; + public static final int DUP4 = 0x83; + public static final int DUP5 = 0x84; + public static final int DUP6 = 0x85; + public static final int DUP7 = 0x86; + public static final int DUP8 = 0x87; + public static final int DUP9 = 0x88; + public static final int DUP10 = 0x89; + public static final int DUP11 = 0x8a; + public static final int DUP12 = 0x8b; + public static final int DUP13 = 0x8c; + public static final int DUP14 = 0x8d; + public static final int DUP15 = 0x8e; + public static final int DUP16 = 0x8f; + + /* Swap the Nth item from the stack with the top */ + public static final int SWAP1 = 0x90; + public static final int SWAP2 = 0x91; + public static final int SWAP3 = 0x92; + public static final int SWAP4 = 0x93; + public static final int SWAP5 = 0x94; + public static final int SWAP6 = 0x95; + public static final int SWAP7 = 0x96; + public static final int SWAP8 = 0x97; + public static final int SWAP9 = 0x98; + public static final int SWAP10 = 0x99; + public static final int SWAP11 = 0x9a; + public static final int SWAP12 = 0x9b; + public static final int SWAP13 = 0x9c; + public static final int SWAP14 = 0x9d; + public static final int SWAP15 = 0x9e; + public static final int SWAP16 = 0x9f; + + // (0xa[n]) log some data for some addres with 0..n tags [addr [tag0..tagn] data] + public static final int LOG0 = 0xa0; + public static final int LOG1 = 0xa1; + public static final int LOG2 = 0xa2; + public static final int LOG3 = 0xa3; + public static final int LOG4 = 0xa4; + + + /* System operations */ + public static final int CALLTOKEN = 0xd0; + public static final int TOKENBALANCE = 0xd1; + public static final int CALLTOKENVALUE = 0xd2; + public static final int CALLTOKENID = 0xd3; + public static final int ISCONTRACT = 0xd4; + public static final int FREEZE = 0xd5; + public static final int UNFREEZE = 0xd6; + public static final int FREEZEEXPIRETIME = 0xd7; + public static final int VOTEWITNESS = 0xd8; + public static final int WITHDRAWREWARD = 0xd9; + + // (0xf0) Create a new account with associated code + public static final int CREATE = 0xf0; + // Message-call into an account + public static final int CALL = 0xf1; + public static final int CALLCODE = 0xf2; + public static final int DELEGATECALL = 0xf4; + public static final int STATICCALL = 0xfa; + // (0xf3) Halt execution returning output data + public static final int RETURN = 0xf3; + // (0xf5) Skinny CREATE2, same as CREATE but with deterministic address + public static final int CREATE2 = 0xf5; + /* + * (0xfd) The `REVERT` instruction will stop execution, roll back all state changes done so far + * and provide a pointer to a memory section, which can be interpreted as an error code or + * message. While doing so, it will not consume all the remaining gas. + */ + public static final int REVERT = 0xfd; + // (0xff) Halt execution and register account for later deletion + public static final int SUICIDE = 0xff; + + private static final String[] OpName = new String[256]; + + private static final Map stringToByteMap = new HashMap<>(); + + static { + Field[] fields = Op.class.getDeclaredFields(); + for (Field field : fields) { + try { + int op; + if (field.getType() == int.class) { + op = field.getInt(Op.class); + OpName[op] = field.getName(); + stringToByteMap.put(field.getName(), (byte) op); + } + } catch (IllegalAccessException e) { + logger.error(e.getMessage()); + } + } + } + + public static String getNameOf(int opCode) { + return OpName[opCode]; + } + + public static String getNameOf(byte opCode) { + return OpName[opCode & 0xff]; + } + + public static byte getOpOf(String opCode) { + return stringToByteMap.get(opCode); + } + +} diff --git a/actuator/src/main/java/org/tron/core/vm/OpCode.java b/actuator/src/main/java/org/tron/core/vm/OpCode.java deleted file mode 100644 index 31dc72fab28..00000000000 --- a/actuator/src/main/java/org/tron/core/vm/OpCode.java +++ /dev/null @@ -1,820 +0,0 @@ -/* - * Copyright (c) [2016] [ ] - * This file is part of the ethereumJ library. - * - * The ethereumJ library is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * The ethereumJ library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with the ethereumJ library. If not, see . - */ -package org.tron.core.vm; - -import java.util.Arrays; -import java.util.EnumSet; -import java.util.HashMap; -import java.util.Map; - - -/** - * Instruction set for the Ethereum Virtual Machine See Yellow Paper: - * http://www.gavwood.com/Paper.pdf - Appendix G. Virtual Machine Specification - */ -public enum OpCode { - // TODO #POC9 Need to make tiers more accurate - /** - * Halts execution (0x00) - */ - STOP(0x00, 0, 0, OpCode.Tier.ZeroTier), - - /* Arithmetic Operations */ - - /** - * (0x01) Addition operation - */ - ADD(0x01, 2, 1, OpCode.Tier.VeryLowTier), - /** - * (0x02) Multiplication operation - */ - MUL(0x02, 2, 1, OpCode.Tier.LowTier), - /** - * (0x03) Subtraction operations - */ - SUB(0x03, 2, 1, OpCode.Tier.VeryLowTier), - /** - * (0x04) Integer division operation - */ - DIV(0x04, 2, 1, OpCode.Tier.LowTier), - /** - * (0x05) Signed integer division operation - */ - SDIV(0x05, 2, 1, OpCode.Tier.LowTier), - /** - * (0x06) Modulo remainder operation - */ - MOD(0x06, 2, 1, OpCode.Tier.LowTier), - /** - * (0x07) Signed modulo remainder operation - */ - SMOD(0x07, 2, 1, OpCode.Tier.LowTier), - /** - * (0x08) Addition combined with modulo remainder operation - */ - ADDMOD(0x08, 3, 1, OpCode.Tier.MidTier), - /** - * (0x09) Multiplication combined with modulo remainder operation - */ - MULMOD(0x09, 3, 1, OpCode.Tier.MidTier), - /** - * (0x0a) Exponential operation - */ - EXP(0x0a, 2, 1, OpCode.Tier.SpecialTier), - /** - * (0x0b) Extend length of signed integer - */ - SIGNEXTEND(0x0b, 2, 1, OpCode.Tier.LowTier), - - /* Bitwise Logic & Comparison Operations */ - - /** - * (0x10) Less-than comparison - */ - LT(0X10, 2, 1, OpCode.Tier.VeryLowTier), - /** - * (0x11) Greater-than comparison - */ - GT(0X11, 2, 1, OpCode.Tier.VeryLowTier), - /** - * (0x12) Signed less-than comparison - */ - SLT(0X12, 2, 1, OpCode.Tier.VeryLowTier), - /** - * (0x13) Signed greater-than comparison - */ - SGT(0X13, 2, 1, OpCode.Tier.VeryLowTier), - /** - * (0x14) Equality comparison - */ - EQ(0X14, 2, 1, OpCode.Tier.VeryLowTier), - /** - * (0x15) Negation operation - */ - ISZERO(0x15, 1, 1, OpCode.Tier.VeryLowTier), - /** - * (0x16) Bitwise AND operation - */ - AND(0x16, 2, 1, OpCode.Tier.VeryLowTier), - /** - * (0x17) Bitwise OR operation - */ - OR(0x17, 2, 1, OpCode.Tier.VeryLowTier), - /** - * (0x18) Bitwise XOR operation - */ - XOR(0x18, 2, 1, OpCode.Tier.VeryLowTier), - /** - * (0x19) Bitwise NOT operationr - */ - NOT(0x19, 1, 1, OpCode.Tier.VeryLowTier), - /** - * (0x1a) Retrieve single byte from word - */ - BYTE(0x1a, 2, 1, OpCode.Tier.VeryLowTier), - /** - * (0x1b) Shift left - */ - SHL(0x1b, 2, 1, OpCode.Tier.VeryLowTier), - /** - * (0x1c) Logical shift right - */ - SHR(0x1c, 2, 1, OpCode.Tier.VeryLowTier), - /** - * (0x1d) Arithmetic shift right - */ - SAR(0x1d, 2, 1, OpCode.Tier.VeryLowTier), - - /* Cryptographic Operations */ - - /** - * (0x20) Compute SHA3-256 hash - */ - SHA3(0x20, 2, 1, OpCode.Tier.SpecialTier), - - /* Environmental Information */ - - /** - * (0x30) Get address of currently executing account - */ - ADDRESS(0x30, 0, 1, OpCode.Tier.BaseTier), - /** - * (0x31) Get balance of the given account - */ - BALANCE(0x31, 1, 1, OpCode.Tier.ExtTier), - /** - * (0x32) Get execution origination address - */ - ORIGIN(0x32, 0, 1, OpCode.Tier.BaseTier), - /** - * (0x33) Get caller address - */ - CALLER(0x33, 0, 1, OpCode.Tier.BaseTier), - /** - * (0x34) Get deposited value by the instruction/transaction responsible for this execution - */ - CALLVALUE(0x34, 0, 1, OpCode.Tier.BaseTier), - /** - * (0x35) Get input data of current environment - */ - CALLDATALOAD(0x35, 1, 1, OpCode.Tier.VeryLowTier), - /** - * (0x36) Get size of input data in current environment - */ - CALLDATASIZE(0x36, 0, 1, OpCode.Tier.BaseTier), - /** - * (0x37) Copy input data in current environment to memory - */ - CALLDATACOPY(0x37, 3, 0, OpCode.Tier.VeryLowTier), - /** - * (0x38) Get size of code running in current environment - */ - CODESIZE(0x38, 0, 1, OpCode.Tier.BaseTier), - /** - * (0x39) Copy code running in current environment to memory - */ - CODECOPY(0x39, 3, 0, OpCode.Tier.VeryLowTier), // [len code_start mem_start CODECOPY] - - RETURNDATASIZE(0x3d, 0, 1, OpCode.Tier.BaseTier), - - RETURNDATACOPY(0x3e, 3, 0, OpCode.Tier.VeryLowTier), - /** - * (0x3a) Get price of gas in current environment - */ - GASPRICE(0x3a, 0, 1, OpCode.Tier.BaseTier), - /** - * (0x3b) Get size of code running in current environment with given offset - */ - EXTCODESIZE(0x3b, 1, 1, OpCode.Tier.ExtTier), - /** - * (0x3c) Copy code running in current environment to memory with given offset - */ - EXTCODECOPY(0x3c, 4, 0, OpCode.Tier.ExtTier), - /** - * (0x3f) Returns the keccak256 hash of a contract’s code - */ - EXTCODEHASH(0x3f, 1, 1, OpCode.Tier.ExtTier), - - /* Block Information */ - - /** - * (0x40) Get hash of most recent complete block - */ - BLOCKHASH(0x40, 1, 1, OpCode.Tier.ExtTier), - /** - * (0x41) Get the block’s coinbase address - */ - COINBASE(0x41, 0, 1, OpCode.Tier.BaseTier), - /** - * (x042) Get the block’s timestamp - */ - TIMESTAMP(0x42, 0, 1, OpCode.Tier.BaseTier), - /** - * (0x43) Get the block’s number - */ - NUMBER(0x43, 0, 1, OpCode.Tier.BaseTier), - /** - * (0x44) Get the block’s difficulty - */ - DIFFICULTY(0x44, 0, 1, OpCode.Tier.BaseTier), - /** - * (0x45) Get the block’s gas limit - */ - GASLIMIT(0x45, 0, 1, OpCode.Tier.BaseTier), - /** - * (0x46) Get the chain id - */ - CHAINID(0x46, 0, 1, OpCode.Tier.BaseTier), - /** - * (0x47) Get current account balance - */ - SELFBALANCE(0x47, 0, 1, Tier.LowTier), - /** - * (0x48) Get block's basefee - */ - BASEFEE(0x48, 0, 1, Tier.BaseTier), - - - /* Memory, Storage and Flow Operations */ - - /** - * (0x50) Remove item from stack - */ - POP(0x50, 1, 0, OpCode.Tier.BaseTier), - /** - * (0x51) Load word from memory - */ - MLOAD(0x51, 1, 1, OpCode.Tier.VeryLowTier), - /** - * (0x52) Save word to memory - */ - MSTORE(0x52, 2, 0, OpCode.Tier.VeryLowTier), - /** - * (0x53) Save byte to memory - */ - MSTORE8(0x53, 2, 0, OpCode.Tier.VeryLowTier), - /** - * (0x54) Load word from storage - */ - SLOAD(0x54, 1, 1, OpCode.Tier.SpecialTier), - /** - * (0x55) Save word to storage - */ - SSTORE(0x55, 2, 0, OpCode.Tier.SpecialTier), - /** - * (0x56) Alter the program counter - */ - JUMP(0x56, 1, 0, OpCode.Tier.MidTier), - /** - * (0x57) Conditionally alter the program counter - */ - JUMPI(0x57, 2, 0, OpCode.Tier.HighTier), - /** - * (0x58) Get the program counter - */ - PC(0x58, 0, 1, OpCode.Tier.BaseTier), - /** - * (0x59) Get the size of active memory - */ - MSIZE(0x59, 0, 1, OpCode.Tier.BaseTier), - /** - * (0x5a) Get the amount of available gas - */ - GAS(0x5a, 0, 1, OpCode.Tier.BaseTier), - /** - * (0x5b) - */ - JUMPDEST(0x5b, 0, 0, OpCode.Tier.SpecialTier), - - /* Push Operations */ - - /** - * (0x60) Place 1-byte item on stack - */ - PUSH1(0x60, 0, 1, OpCode.Tier.VeryLowTier), - /** - * (0x61) Place 2-byte item on stack - */ - PUSH2(0x61, 0, 1, OpCode.Tier.VeryLowTier), - /** - * (0x62) Place 3-byte item on stack - */ - PUSH3(0x62, 0, 1, OpCode.Tier.VeryLowTier), - /** - * (0x63) Place 4-byte item on stack - */ - PUSH4(0x63, 0, 1, OpCode.Tier.VeryLowTier), - /** - * (0x64) Place 5-byte item on stack - */ - PUSH5(0x64, 0, 1, OpCode.Tier.VeryLowTier), - /** - * (0x65) Place 6-byte item on stack - */ - PUSH6(0x65, 0, 1, OpCode.Tier.VeryLowTier), - /** - * (0x66) Place 7-byte item on stack - */ - PUSH7(0x66, 0, 1, OpCode.Tier.VeryLowTier), - /** - * (0x67) Place 8-byte item on stack - */ - PUSH8(0x67, 0, 1, OpCode.Tier.VeryLowTier), - /** - * (0x68) Place 9-byte item on stack - */ - PUSH9(0x68, 0, 1, OpCode.Tier.VeryLowTier), - /** - * (0x69) Place 10-byte item on stack - */ - PUSH10(0x69, 0, 1, OpCode.Tier.VeryLowTier), - /** - * (0x6a) Place 11-byte item on stack - */ - PUSH11(0x6a, 0, 1, OpCode.Tier.VeryLowTier), - /** - * (0x6b) Place 12-byte item on stack - */ - PUSH12(0x6b, 0, 1, OpCode.Tier.VeryLowTier), - /** - * (0x6c) Place 13-byte item on stack - */ - PUSH13(0x6c, 0, 1, OpCode.Tier.VeryLowTier), - /** - * (0x6d) Place 14-byte item on stack - */ - PUSH14(0x6d, 0, 1, OpCode.Tier.VeryLowTier), - /** - * (0x6e) Place 15-byte item on stack - */ - PUSH15(0x6e, 0, 1, OpCode.Tier.VeryLowTier), - /** - * (0x6f) Place 16-byte item on stack - */ - PUSH16(0x6f, 0, 1, OpCode.Tier.VeryLowTier), - /** - * (0x70) Place 17-byte item on stack - */ - PUSH17(0x70, 0, 1, OpCode.Tier.VeryLowTier), - /** - * (0x71) Place 18-byte item on stack - */ - PUSH18(0x71, 0, 1, OpCode.Tier.VeryLowTier), - /** - * (0x72) Place 19-byte item on stack - */ - PUSH19(0x72, 0, 1, OpCode.Tier.VeryLowTier), - /** - * (0x73) Place 20-byte item on stack - */ - PUSH20(0x73, 0, 1, OpCode.Tier.VeryLowTier), - /** - * (0x74) Place 21-byte item on stack - */ - PUSH21(0x74, 0, 1, OpCode.Tier.VeryLowTier), - /** - * (0x75) Place 22-byte item on stack - */ - PUSH22(0x75, 0, 1, OpCode.Tier.VeryLowTier), - /** - * (0x76) Place 23-byte item on stack - */ - PUSH23(0x76, 0, 1, OpCode.Tier.VeryLowTier), - /** - * (0x77) Place 24-byte item on stack - */ - PUSH24(0x77, 0, 1, OpCode.Tier.VeryLowTier), - /** - * (0x78) Place 25-byte item on stack - */ - PUSH25(0x78, 0, 1, OpCode.Tier.VeryLowTier), - /** - * (0x79) Place 26-byte item on stack - */ - PUSH26(0x79, 0, 1, OpCode.Tier.VeryLowTier), - /** - * (0x7a) Place 27-byte item on stack - */ - PUSH27(0x7a, 0, 1, OpCode.Tier.VeryLowTier), - /** - * (0x7b) Place 28-byte item on stack - */ - PUSH28(0x7b, 0, 1, OpCode.Tier.VeryLowTier), - /** - * (0x7c) Place 29-byte item on stack - */ - PUSH29(0x7c, 0, 1, OpCode.Tier.VeryLowTier), - /** - * (0x7d) Place 30-byte item on stack - */ - PUSH30(0x7d, 0, 1, OpCode.Tier.VeryLowTier), - /** - * (0x7e) Place 31-byte item on stack - */ - PUSH31(0x7e, 0, 1, OpCode.Tier.VeryLowTier), - /** - * (0x7f) Place 32-byte (full word) item on stack - */ - PUSH32(0x7f, 0, 1, OpCode.Tier.VeryLowTier), - - /* Duplicate Nth item from the stack */ - - /** - * (0x80) Duplicate 1st item on stack - */ - DUP1(0x80, 1, 2, OpCode.Tier.VeryLowTier), - /** - * (0x81) Duplicate 2nd item on stack - */ - DUP2(0x81, 2, 3, OpCode.Tier.VeryLowTier), - /** - * (0x82) Duplicate 3rd item on stack - */ - DUP3(0x82, 3, 4, OpCode.Tier.VeryLowTier), - /** - * (0x83) Duplicate 4th item on stack - */ - DUP4(0x83, 4, 5, OpCode.Tier.VeryLowTier), - /** - * (0x84) Duplicate 5th item on stack - */ - DUP5(0x84, 5, 6, OpCode.Tier.VeryLowTier), - /** - * (0x85) Duplicate 6th item on stack - */ - DUP6(0x85, 6, 7, OpCode.Tier.VeryLowTier), - /** - * (0x86) Duplicate 7th item on stack - */ - DUP7(0x86, 7, 8, OpCode.Tier.VeryLowTier), - /** - * (0x87) Duplicate 8th item on stack - */ - DUP8(0x87, 8, 9, OpCode.Tier.VeryLowTier), - /** - * (0x88) Duplicate 9th item on stack - */ - DUP9(0x88, 9, 10, OpCode.Tier.VeryLowTier), - /** - * (0x89) Duplicate 10th item on stack - */ - DUP10(0x89, 10, 11, OpCode.Tier.VeryLowTier), - /** - * (0x8a) Duplicate 11th item on stack - */ - DUP11(0x8a, 11, 12, OpCode.Tier.VeryLowTier), - /** - * (0x8b) Duplicate 12th item on stack - */ - DUP12(0x8b, 12, 13, OpCode.Tier.VeryLowTier), - /** - * (0x8c) Duplicate 13th item on stack - */ - DUP13(0x8c, 13, 14, OpCode.Tier.VeryLowTier), - /** - * (0x8d) Duplicate 14th item on stack - */ - DUP14(0x8d, 14, 15, OpCode.Tier.VeryLowTier), - /** - * (0x8e) Duplicate 15th item on stack - */ - DUP15(0x8e, 15, 16, OpCode.Tier.VeryLowTier), - /** - * (0x8f) Duplicate 16th item on stack - */ - DUP16(0x8f, 16, 17, OpCode.Tier.VeryLowTier), - - /* Swap the Nth item from the stack with the top */ - - /** - * (0x90) Exchange 2nd item from stack with the top - */ - SWAP1(0x90, 2, 2, OpCode.Tier.VeryLowTier), - /** - * (0x91) Exchange 3rd item from stack with the top - */ - SWAP2(0x91, 3, 3, OpCode.Tier.VeryLowTier), - /** - * (0x92) Exchange 4th item from stack with the top - */ - SWAP3(0x92, 4, 4, OpCode.Tier.VeryLowTier), - /** - * (0x93) Exchange 5th item from stack with the top - */ - SWAP4(0x93, 5, 5, OpCode.Tier.VeryLowTier), - /** - * (0x94) Exchange 6th item from stack with the top - */ - SWAP5(0x94, 6, 6, OpCode.Tier.VeryLowTier), - /** - * (0x95) Exchange 7th item from stack with the top - */ - SWAP6(0x95, 7, 7, OpCode.Tier.VeryLowTier), - /** - * (0x96) Exchange 8th item from stack with the top - */ - SWAP7(0x96, 8, 8, OpCode.Tier.VeryLowTier), - /** - * (0x97) Exchange 9th item from stack with the top - */ - SWAP8(0x97, 9, 9, OpCode.Tier.VeryLowTier), - /** - * (0x98) Exchange 10th item from stack with the top - */ - SWAP9(0x98, 10, 10, OpCode.Tier.VeryLowTier), - /** - * (0x99) Exchange 11th item from stack with the top - */ - SWAP10(0x99, 11, 11, OpCode.Tier.VeryLowTier), - /** - * (0x9a) Exchange 12th item from stack with the top - */ - SWAP11(0x9a, 12, 12, OpCode.Tier.VeryLowTier), - /** - * (0x9b) Exchange 13th item from stack with the top - */ - SWAP12(0x9b, 13, 13, OpCode.Tier.VeryLowTier), - /** - * (0x9c) Exchange 14th item from stack with the top - */ - SWAP13(0x9c, 14, 14, OpCode.Tier.VeryLowTier), - /** - * (0x9d) Exchange 15th item from stack with the top - */ - SWAP14(0x9d, 15, 15, OpCode.Tier.VeryLowTier), - /** - * (0x9e) Exchange 16th item from stack with the top - */ - SWAP15(0x9e, 16, 16, OpCode.Tier.VeryLowTier), - /** - * (0x9f) Exchange 17th item from stack with the top - */ - SWAP16(0x9f, 17, 17, OpCode.Tier.VeryLowTier), - - /** - * (0xa[n]) log some data for some addres with 0..n tags [addr [tag0..tagn] data] - */ - LOG0(0xa0, 2, 0, OpCode.Tier.SpecialTier), - LOG1(0xa1, 3, 0, OpCode.Tier.SpecialTier), - LOG2(0xa2, 4, 0, OpCode.Tier.SpecialTier), - LOG3(0xa3, 5, 0, OpCode.Tier.SpecialTier), - LOG4(0xa4, 6, 0, OpCode.Tier.SpecialTier), - - /* System operations */ - - /** - * (0xd0) Message-call into an account with trc10 token - */ - CALLTOKEN(0xd0, 8, 1, OpCode.Tier.SpecialTier, CallFlags.Call, CallFlags.HasValue), - - TOKENBALANCE(0xd1, 2, 1, OpCode.Tier.ExtTier), - - CALLTOKENVALUE(0xd2, 0, 1, OpCode.Tier.BaseTier), - - CALLTOKENID(0xd3, 0, 1, OpCode.Tier.BaseTier), - - ISCONTRACT(0xd4, 1, 1, OpCode.Tier.ExtTier), - - FREEZE(0xd5, 3, 1, OpCode.Tier.ExtTier), - - UNFREEZE(0xd6, 2, 1, OpCode.Tier.ExtTier), - - FREEZEEXPIRETIME(0xd7, 2, 1, OpCode.Tier.ExtTier), - - VOTEWITNESS(0xd8, 4, 1, OpCode.Tier.ExtTier), - - WITHDRAWREWARD(0xd9, 0, 1, OpCode.Tier.ExtTier), - - /** - * (0xf0) Create a new account with associated code - */ - CREATE(0xf0, 3, 1, OpCode.Tier.SpecialTier), // [in_size] [in_offs] [gas_val] CREATE - /** - * (cxf1) Message-call into an account - */ - CALL(0xf1, 7, 1, OpCode.Tier.SpecialTier, CallFlags.Call, CallFlags.HasValue), - // [out_data_size] [out_data_start] [in_data_size] [in_data_start] [value] [to_addr] - // [gas] CALL - /** - * (0xf2) Calls self, but grabbing the code from the TO argument instead of from one's own - * address - */ - CALLCODE(0xf2, 7, 1, OpCode.Tier.SpecialTier, CallFlags.Call, CallFlags.HasValue, - CallFlags.Stateless), - /** - * (0xf3) Halt execution returning output data - */ - RETURN(0xf3, 2, 0, OpCode.Tier.ZeroTier), - - /** - * (0xf4) similar in idea to CALLCODE, except that it propagates the sender and value from the - * parent scope to the child scope, ie. the call created has the same sender and value as the - * original call. also the Value parameter is omitted for this opCode - */ - DELEGATECALL(0xf4, 6, 1, OpCode.Tier.SpecialTier, CallFlags.Call, CallFlags.Stateless, - CallFlags.Delegate), - - /** - * (0xf5) Skinny CREATE2, same as CREATE but with deterministic address - */ - CREATE2(0xf5, 4, 1, OpCode.Tier.SpecialTier), - - /** - * opcode that can be used to call another contract (or itself) while disallowing any - * modifications to the state during the call (and its subcalls, if present). Any opcode that - * attempts to perform such a modification (see below for details) will result in an exception - * instead of performing the modification. - */ - STATICCALL(0xfa, 6, 1, OpCode.Tier.SpecialTier, CallFlags.Call, CallFlags.Static), - - /** - * (0xfd) The `REVERT` instruction will stop execution, roll back all state changes done so far - * and provide a pointer to a memory section, which can be interpreted as an error code or - * message. While doing so, it will not consume all the remaining gas. - */ - REVERT(0xfd, 2, 0, OpCode.Tier.ZeroTier), - /** - * (0xff) Halt execution and register account for later deletion - */ - SUICIDE(0xff, 1, 0, OpCode.Tier.ZeroTier); - - private static final OpCode[] intToTypeMap = new OpCode[256]; - private static final Map stringToByteMap = new HashMap<>(); - - static { - for (OpCode type : OpCode.values()) { - intToTypeMap[type.opcode & 0xFF] = type; - stringToByteMap.put(type.name(), type.opcode); - } - } - - private final byte opcode; - private final int require; - private final Tier tier; - private final int ret; - private final EnumSet callFlags; - - //require = required args - //return = required return - private OpCode(int op, int require, int ret, Tier tier, CallFlags... callFlags) { - this.opcode = (byte) op; - this.require = require; - this.tier = tier; - this.ret = ret; - this.callFlags = callFlags.length == 0 ? EnumSet.noneOf(CallFlags.class) : - EnumSet.copyOf(Arrays.asList(callFlags)); - } - - public static boolean contains(String code) { - return stringToByteMap.containsKey(code.trim()); - } - - public static byte byteVal(String code) { - return stringToByteMap.get(code); - } - - public static OpCode code(byte code) { - return intToTypeMap[code & 0xFF]; - } - - public byte val() { - return opcode; - } - - /** - * Returns the mininum amount of items required on the stack for this operation - * - * @return minimum amount of expected items on the stack - */ - public int require() { - return require; - } - - public int ret() { - return ret; - } - - public int asInt() { - return opcode; - } - - private EnumSet getCallFlags() { - return callFlags; - } - - /** - * Indicates that opcode is a call - */ - public boolean isCall() { - return getCallFlags().contains(CallFlags.Call); - } - - private void checkCall() { - if (!isCall()) { - throw new RuntimeException("Opcode is not a call: " + this); - } - } - - /** - * Indicates that the code is executed in the context of the caller - */ - public boolean callIsStateless() { - checkCall(); - return getCallFlags().contains(CallFlags.Stateless); - } - - /** - * Indicates that the opcode has value parameter (3rd on stack) - */ - public boolean callHasValue() { - checkCall(); - return getCallFlags().contains(CallFlags.HasValue); - } - - /** - * Indicates that any state modifications are disallowed during the call - */ - public boolean callIsStatic() { - checkCall(); - return getCallFlags().contains(CallFlags.Static); - } - - /** - * Indicates that value and message sender are propagated from parent to child scope - */ - public boolean callIsDelegate() { - checkCall(); - return getCallFlags().contains(CallFlags.Delegate); - } - - public Tier getTier() { - return this.tier; - } - - public enum Tier { - ZeroTier(0), - BaseTier(2), - VeryLowTier(3), - LowTier(5), - MidTier(8), - HighTier(10), - ExtTier(20), - SpecialTier(1), //TODO #POC9 is this correct?? "multiparam" from cpp - InvalidTier(0); - - - private final int level; - - private Tier(int level) { - this.level = level; - } - - public int asInt() { - return level; - } - } - - private enum CallFlags { - /** - * Indicates that opcode is a call - */ - Call, - - /** - * Indicates that the code is executed in the context of the caller - */ - Stateless, - - /** - * Indicates that the opcode has value parameter (3rd on stack) - */ - HasValue, - - /** - * Indicates that any state modifications are disallowed during the call - */ - Static, - - /** - * Indicates that value and message sender are propagated from parent to child scope - */ - Delegate - } -} - - diff --git a/actuator/src/main/java/org/tron/core/vm/Operation.java b/actuator/src/main/java/org/tron/core/vm/Operation.java new file mode 100644 index 00000000000..0e4c24ad94b --- /dev/null +++ b/actuator/src/main/java/org/tron/core/vm/Operation.java @@ -0,0 +1,43 @@ +package org.tron.core.vm; + +import java.util.function.Consumer; +import java.util.function.Function; +import org.tron.core.vm.program.Program; + +public class Operation { + + private final int opcode; + private final int require; + private final int ret; + private final Function cost; + private final Consumer action; + + public Operation(int opcode, int require, int ret, + Function cost, Consumer action) { + this.opcode = opcode; + this.require = require; + this.ret = ret; + this.cost = cost; + this.action = action; + } + + public int getOpcode() { + return opcode; + } + + public int getRequire() { + return require; + } + + public int getRet() { + return ret; + } + + public long getEnergyCost(Program program) { + return this.cost.apply(program); + } + + public void execute(Program program) { + this.action.accept(program); + } +} diff --git a/actuator/src/main/java/org/tron/core/vm/OperationActions.java b/actuator/src/main/java/org/tron/core/vm/OperationActions.java new file mode 100644 index 00000000000..c7a9c2cc2e3 --- /dev/null +++ b/actuator/src/main/java/org/tron/core/vm/OperationActions.java @@ -0,0 +1,946 @@ +package org.tron.core.vm; + +import static org.tron.common.crypto.Hash.sha3; +import static org.tron.common.utils.ByteUtil.EMPTY_BYTE_ARRAY; + +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.List; + +import org.tron.common.runtime.vm.DataWord; +import org.tron.common.runtime.vm.LogInfo; +import org.tron.core.vm.config.VMConfig; +import org.tron.core.vm.program.Program; +import org.tron.core.vm.program.Stack; + +public class OperationActions { + + private static final BigInteger _32_ = BigInteger.valueOf(32); + + public static void stopAction(Program program) { + program.setHReturn(EMPTY_BYTE_ARRAY); + program.stop(); + } + + public static void addAction(Program program) { + DataWord word1 = program.stackPop(); + DataWord word2 = program.stackPop(); + + word1.add(word2); + program.stackPush(word1); + program.step(); + } + + public static void mulAction(Program program) { + DataWord word1 = program.stackPop(); + DataWord word2 = program.stackPop(); + + word1.mul(word2); + program.stackPush(word1); + program.step(); + } + + public static void subAction(Program program) { + DataWord word1 = program.stackPop(); + DataWord word2 = program.stackPop(); + + word1.sub(word2); + program.stackPush(word1); + program.step(); + } + + public static void divAction(Program program) { + DataWord word1 = program.stackPop(); + DataWord word2 = program.stackPop(); + + word1.div(word2); + program.stackPush(word1); + program.step(); + } + + public static void sdivAction(Program program) { + DataWord word1 = program.stackPop(); + DataWord word2 = program.stackPop(); + + word1.sDiv(word2); + program.stackPush(word1); + program.step(); + } + + public static void modAction(Program program) { + DataWord word1 = program.stackPop(); + DataWord word2 = program.stackPop(); + + word1.mod(word2); + program.stackPush(word1); + program.step(); + } + + public static void sModAction(Program program) { + DataWord word1 = program.stackPop(); + DataWord word2 = program.stackPop(); + + word1.sMod(word2); + program.stackPush(word1); + program.step(); + } + + public static void addModAction(Program program) { + DataWord word1 = program.stackPop(); + DataWord word2 = program.stackPop(); + DataWord word3 = program.stackPop(); + + word1.addmod(word2, word3); + program.stackPush(word1); + program.step(); + } + + public static void mulModAction(Program program) { + DataWord word1 = program.stackPop(); + DataWord word2 = program.stackPop(); + DataWord word3 = program.stackPop(); + + word1.mulmod(word2, word3); + program.stackPush(word1); + program.step(); + } + + public static void expAction(Program program) { + DataWord word1 = program.stackPop(); + DataWord word2 = program.stackPop(); + + word1.exp(word2); + program.stackPush(word1); + program.step(); + } + + public static void signExtendAction(Program program) { + DataWord word1 = program.stackPop(); + BigInteger k = word1.value(); + + if (k.compareTo(_32_) < 0) { + DataWord word2 = program.stackPop(); + word2.signExtend(k.byteValue()); + program.stackPush(word2); + } + program.step(); + } + + public static void ltAction(Program program) { + DataWord word1 = program.stackPop(); + DataWord word2 = program.stackPop(); + + if (word1.value().compareTo(word2.value()) < 0) { + word1.and(DataWord.ZERO); + word1.getData()[31] = 1; + } else { + word1.and(DataWord.ZERO); + } + program.stackPush(word1); + program.step(); + } + + public static void gtAction(Program program) { + DataWord word1 = program.stackPop(); + DataWord word2 = program.stackPop(); + + if (word1.value().compareTo(word2.value()) > 0) { + word1.and(DataWord.ZERO); + word1.getData()[31] = 1; + } else { + word1.and(DataWord.ZERO); + } + program.stackPush(word1); + program.step(); + } + + public static void sltAction(Program program) { + DataWord word1 = program.stackPop(); + DataWord word2 = program.stackPop(); + + if (word1.sValue().compareTo(word2.sValue()) < 0) { + word1.and(DataWord.ZERO); + word1.getData()[31] = 1; + } else { + word1.and(DataWord.ZERO); + } + program.stackPush(word1); + program.step(); + } + + public static void sgtAction(Program program) { + DataWord word1 = program.stackPop(); + DataWord word2 = program.stackPop(); + + if (word1.sValue().compareTo(word2.sValue()) > 0) { + word1.and(DataWord.ZERO); + word1.getData()[31] = 1; + } else { + word1.and(DataWord.ZERO); + } + program.stackPush(word1); + program.step(); + } + + public static void eqAction(Program program) { + DataWord word1 = program.stackPop(); + DataWord word2 = program.stackPop(); + + if (word1.xor(word2).isZero()) { + word1.and(DataWord.ZERO); + word1.getData()[31] = 1; + } else { + word1.and(DataWord.ZERO); + } + program.stackPush(word1); + program.step(); + } + + public static void isZeroAction(Program program) { + DataWord word1 = program.stackPop(); + if (word1.isZero()) { + word1.getData()[31] = 1; + } else { + word1.and(DataWord.ZERO); + } + + program.stackPush(word1); + program.step(); + } + + public static void andAction(Program program) { + DataWord word1 = program.stackPop(); + DataWord word2 = program.stackPop(); + + word1.and(word2); + program.stackPush(word1); + program.step(); + } + + public static void orAction(Program program) { + DataWord word1 = program.stackPop(); + DataWord word2 = program.stackPop(); + + word1.or(word2); + program.stackPush(word1); + program.step(); + } + + public static void xorAction(Program program) { + DataWord word1 = program.stackPop(); + DataWord word2 = program.stackPop(); + + word1.xor(word2); + program.stackPush(word1); + program.step(); + } + + public static void notAction(Program program) { + DataWord word1 = program.stackPop(); + word1.bnot(); + + program.stackPush(word1); + program.step(); + } + + public static void byteAction(Program program) { + DataWord word1 = program.stackPop(); + DataWord word2 = program.stackPop(); + + final DataWord result; + if (word1.value().compareTo(_32_) < 0) { + byte tmp = word2.getData()[word1.intValue()]; + word2.and(DataWord.ZERO); + word2.getData()[31] = tmp; + result = word2; + } else { + result = new DataWord(); + } + + program.stackPush(result); + program.step(); + } + + public static void shlAction(Program program) { + DataWord word1 = program.stackPop(); + DataWord word2 = program.stackPop(); + + final DataWord result = word2.shiftLeft(word1); + program.stackPush(result); + program.step(); + } + + public static void shrAction(Program program) { + DataWord word1 = program.stackPop(); + DataWord word2 = program.stackPop(); + + final DataWord result = word2.shiftRight(word1); + program.stackPush(result); + program.step(); + } + + public static void sarAction(Program program) { + DataWord word1 = program.stackPop(); + DataWord word2 = program.stackPop(); + + final DataWord result = word2.shiftRightSigned(word1); + program.stackPush(result); + program.step(); + } + + public static void sha3Action(Program program) { + DataWord memOffsetData = program.stackPop(); + DataWord lengthData = program.stackPop(); + byte[] buffer = program + .memoryChunk(memOffsetData.intValueSafe(), lengthData.intValueSafe()); + + byte[] encoded = sha3(buffer); + DataWord word = new DataWord(encoded); + + program.stackPush(word); + program.step(); + } + + public static void addressAction(Program program) { + DataWord address = program.getContractAddress(); + // allowMultiSigns proposal + if (VMConfig.allowMultiSign()) { + address = new DataWord(address.getLast20Bytes()); + } + + program.stackPush(address); + program.step(); + } + + public static void balanceAction(Program program) { + DataWord address = program.stackPop(); + DataWord balance = program.getBalance(address); + + program.stackPush(balance); + program.step(); + } + + public static void originAction(Program program) { + DataWord originAddress = program.getOriginAddress(); + //allowMultiSign proposal + if (VMConfig.allowMultiSign()) { + originAddress = new DataWord(originAddress.getLast20Bytes()); + } + + program.stackPush(originAddress); + program.step(); + } + + public static void callerAction(Program program) { + DataWord callerAddress = program.getCallerAddress(); + /* + since we use 21 bytes address instead of 20 as etherum, we need to make sure + the address length in vm is matching with 20 + */ + callerAddress = new DataWord(callerAddress.getLast20Bytes()); + + program.stackPush(callerAddress); + program.step(); + } + + public static void callValueAction(Program program) { + DataWord callValue = program.getCallValue(); + + program.stackPush(callValue); + program.step(); + } + + public static void callDataLoadAction(Program program) { + DataWord dataOffs = program.stackPop(); + DataWord value = program.getDataValue(dataOffs); + + program.stackPush(value); + program.step(); + } + + public static void callDataSizeAction(Program program) { + DataWord dataSize = program.getDataSize(); + + program.stackPush(dataSize); + program.step(); + } + + public static void callDataCopyAction(Program program) { + DataWord memOffsetData = program.stackPop(); + DataWord dataOffsetData = program.stackPop(); + DataWord lengthData = program.stackPop(); + + byte[] msgData = program.getDataCopy(dataOffsetData, lengthData); + + program.memorySave(memOffsetData.intValueSafe(), msgData); + program.step(); + } + + public static void codeSizeAction(Program program) { + int length = program.getCode().length; + + DataWord codeLength = new DataWord(length); + program.stackPush(codeLength); + program.step(); + } + + public static void codeCopyAction(Program program) { + byte[] fullCode = program.getCode(); + + int memOffset = program.stackPop().intValueSafe(); + int codeOffset = program.stackPop().intValueSafe(); + int lengthData = program.stackPop().intValueSafe(); + + int sizeToBeCopied = lengthData; + if ((long) codeOffset + lengthData > fullCode.length) { + sizeToBeCopied = fullCode.length < codeOffset ? 0 : fullCode.length - codeOffset; + } + + byte[] codeCopy = new byte[lengthData]; + + if (codeOffset < fullCode.length) { + System.arraycopy(fullCode, codeOffset, codeCopy, 0, sizeToBeCopied); + } + + program.memorySave(memOffset, codeCopy); + program.step(); + } + + public static void returnDataSizeAction(Program program) { + DataWord dataSize = program.getReturnDataBufferSize(); + + program.stackPush(dataSize); + program.step(); + } + + public static void returnDataCopyAction(Program program) { + DataWord memOffsetData = program.stackPop(); + DataWord dataOffsetData = program.stackPop(); + DataWord lengthData = program.stackPop(); + + byte[] msgData = program.getReturnDataBufferData(dataOffsetData, lengthData); + + if (msgData == null) { + throw new Program.ReturnDataCopyIllegalBoundsException(dataOffsetData, lengthData, + program.getReturnDataBufferSize().longValueSafe()); + } + + program.memorySave(memOffsetData.intValueSafe(), msgData); + program.step(); + } + + public static void gasPriceAction(Program program) { + DataWord energyPrice = DataWord.ZERO(); + if (VMConfig.allowTvmCompatibleEvm() && program.getContractVersion() == 1) { + energyPrice = new DataWord(program.getContractState() + .getDynamicPropertiesStore().getEnergyFee()); + } + program.stackPush(energyPrice); + program.step(); + } + + public static void extCodeSizeAction(Program program) { + DataWord address = program.stackPop(); + + int length = program.getCodeAt(address).length; + DataWord codeLength = new DataWord(length); + + program.stackPush(codeLength); + program.step(); + } + + public static void extCodeCopyAction(Program program) { + DataWord address = program.stackPop(); + byte[] fullCode = program.getCodeAt(address); + + int memOffset = program.stackPop().intValueSafe(); + int codeOffset = program.stackPop().intValueSafe(); + int lengthData = program.stackPop().intValueSafe(); + + int sizeToBeCopied = lengthData; + if ((long) codeOffset + lengthData > fullCode.length) { + sizeToBeCopied = fullCode.length < codeOffset ? 0 : fullCode.length - codeOffset; + } + + byte[] codeCopy = new byte[lengthData]; + + if (codeOffset < fullCode.length) { + System.arraycopy(fullCode, codeOffset, codeCopy, 0, sizeToBeCopied); + } + + program.memorySave(memOffset, codeCopy); + program.step(); + } + + public static void extCodeHashAction(Program program) { + DataWord address = program.stackPop(); + byte[] codeHash = program.getCodeHashAt(address); + program.stackPush(new DataWord(codeHash)); + program.step(); + } + + public static void blockHashAction(Program program) { + int blockIndex = program.stackPop().intValueSafe(); + DataWord blockHash = program.getBlockHash(blockIndex); + + program.stackPush(blockHash); + program.step(); + } + + public static void coinBaseAction(Program program) { + DataWord coinbase = program.getCoinbase(); + + program.stackPush(coinbase); + program.step(); + } + + public static void timeStampAction(Program program) { + DataWord timestamp = program.getTimestamp(); + + program.stackPush(timestamp); + program.step(); + } + + public static void numberAction(Program program) { + DataWord number = program.getNumber(); + + program.stackPush(number); + program.step(); + } + + public static void difficultyAction(Program program) { + DataWord result = DataWord.ZERO(); + + program.stackPush(result); + program.step(); + } + + public static void gasLimitAction(Program program) { + DataWord result = DataWord.ZERO(); + + program.stackPush(result); + program.step(); + } + + public static void chainIdAction(Program program) { + DataWord chainId = program.getChainId(); + + program.stackPush(chainId); + program.step(); + } + + public static void selfBalanceAction(Program program) { + DataWord selfBalance = program.getBalance(program.getContractAddress()); + + program.stackPush(selfBalance); + program.step(); + } + + public static void baseFeeAction(Program program) { + DataWord energyFee = + new DataWord(program.getContractState().getDynamicPropertiesStore().getEnergyFee()); + + program.stackPush(energyFee); + program.step(); + } + + public static void popAction(Program program) { + program.stackPop(); + program.step(); + } + + public static void mLoadAction(Program program) { + DataWord addr = program.stackPop(); + DataWord data = program.memoryLoad(addr); + + program.stackPush(data); + program.step(); + } + + public static void mStoreAction(Program program) { + DataWord addr = program.stackPop(); + DataWord value = program.stackPop(); + + program.memorySave(addr, value); + program.step(); + } + + public static void mStore8Action(Program program) { + DataWord addr = program.stackPop(); + DataWord value = program.stackPop(); + + byte[] byteVal = {value.getData()[31]}; + program.memorySave(addr.intValueSafe(), byteVal); + program.step(); + } + + public static void sLoadAction(Program program) { + DataWord key = program.stackPop(); + DataWord val = program.storageLoad(key); + + if (val == null) { + val = key.and(DataWord.ZERO); + } + + program.stackPush(val); + program.step(); + } + + public static void sStoreAction(Program program) { + if (program.isStaticCall()) { + throw new Program.StaticCallModificationException(); + } + + DataWord addr = program.stackPop(); + DataWord value = program.stackPop(); + + program.storageSave(addr, value); + program.step(); + } + + public static void jumpAction(Program program) { + DataWord pos = program.stackPop(); + int nextPC = program.verifyJumpDest(pos); + + program.setPC(nextPC); + } + + public static void jumpIAction(Program program) { + DataWord pos = program.stackPop(); + DataWord cond = program.stackPop(); + + if (!cond.isZero()) { + int nextPC = program.verifyJumpDest(pos); + program.setPC(nextPC); + } else { + program.step(); + } + } + + public static void pcAction(Program program) { + int pc = program.getPC(); + DataWord pcWord = new DataWord(pc); + + program.stackPush(pcWord); + program.step(); + } + + public static void mSizeAction(Program program) { + int memSize = program.getMemSize(); + DataWord wordMemSize = new DataWord(memSize); + + program.stackPush(wordMemSize); + program.step(); + } + + public static void gasAction(Program program) { + DataWord energy = program.getEnergyLimitLeft(); + + program.stackPush(energy); + program.step(); + } + + public static void jumpDestAction(Program program) { + program.step(); + } + + public static void pushAction(Program program) { + int n = program.getCurrentOpIntValue() - Op.PUSH1 + 1; + program.step(); + byte[] data = program.sweep(n); + + program.stackPush(new DataWord(data)); + } + + public static void dupAction(Program program) { + Stack stack = program.getStack(); + int n = program.getCurrentOpIntValue() - Op.DUP1 + 1; + DataWord word_1 = stack.get(stack.size() - n); + + program.stackPush(word_1.clone()); + program.step(); + } + + public static void swapAction(Program program) { + Stack stack = program.getStack(); + int n = program.getCurrentOpIntValue() - Op.SWAP1 + 2; + stack.swap(stack.size() - 1, stack.size() - n); + + program.step(); + } + + public static void logAction(Program program) { + Stack stack = program.getStack(); + if (program.isStaticCall()) { + throw new Program.StaticCallModificationException(); + } + DataWord address = program.getContractAddress(); + + DataWord memStart = stack.pop(); + DataWord memOffset = stack.pop(); + + int nTopics = program.getCurrentOpIntValue() - Op.LOG0; + + List topics = new ArrayList<>(); + for (int i = 0; i < nTopics; ++i) { + DataWord topic = stack.pop(); + topics.add(topic); + } + + byte[] data = program.memoryChunk(memStart.intValueSafe(), memOffset.intValueSafe()); + + LogInfo logInfo = + new LogInfo(address.getLast20Bytes(), topics, data); + + program.getResult().addLogInfo(logInfo); + program.step(); + } + + public static void tokenBalanceAction(Program program) { + DataWord tokenId = program.stackPop(); + DataWord address = program.stackPop(); + DataWord tokenBalance = program.getTokenBalance(address, tokenId); + + program.stackPush(tokenBalance); + program.step(); + } + + public static void callTokenValueAction(Program program) { + DataWord tokenValue = program.getTokenValue(); + + program.stackPush(tokenValue); + program.step(); + } + + public static void callTokenIdAction(Program program) { + DataWord _tokenId = program.getTokenId(); + + program.stackPush(_tokenId); + program.step(); + } + + public static void isContractAction(Program program) { + DataWord address = program.stackPop(); + DataWord isContract = program.isContract(address); + + program.stackPush(isContract); + program.step(); + } + + public static void freezeAction(Program program) { + // after allow vote, check static + if (VMConfig.allowTvmVote() && program.isStaticCall()) { + throw new Program.StaticCallModificationException(); + } + // 0 as bandwidth, 1 as energy + DataWord resourceType = program.stackPop(); + DataWord frozenBalance = program.stackPop(); + DataWord receiverAddress = program.stackPop(); + + boolean result = program.freeze(receiverAddress, frozenBalance, resourceType ); + program.stackPush(result ? DataWord.ONE() : DataWord.ZERO()); + program.step(); + } + + public static void unfreezeAction(Program program) { + if (VMConfig.allowTvmVote() && program.isStaticCall()) { + throw new Program.StaticCallModificationException(); + } + + DataWord resourceType = program.stackPop(); + DataWord receiverAddress = program.stackPop(); + + boolean result = program.unfreeze(receiverAddress, resourceType); + program.stackPush(result ? DataWord.ONE() : DataWord.ZERO()); + program.step(); + } + + public static void freezeExpireTimeAction(Program program) { + DataWord resourceType = program.stackPop(); + DataWord targetAddress = program.stackPop(); + + long expireTime = program.freezeExpireTime(targetAddress, resourceType); + program.stackPush(new DataWord(expireTime / 1000)); + program.step(); + } + + public static void voteWitnessAction(Program program) { + if (program.isStaticCall()) { + throw new Program.StaticCallModificationException(); + } + + int amountArrayLength = program.stackPop().intValueSafe(); + int amountArrayOffset = program.stackPop().intValueSafe(); + int witnessArrayLength = program.stackPop().intValueSafe(); + int witnessArrayOffset = program.stackPop().intValueSafe(); + + boolean result = program.voteWitness(witnessArrayOffset, witnessArrayLength, + amountArrayOffset, amountArrayLength); + program.stackPush(result ? DataWord.ONE() : DataWord.ZERO()); + program.step(); + } + + public static void withdrawRewardAction(Program program) { + if (program.isStaticCall()) { + throw new Program.StaticCallModificationException(); + } + + long allowance = program.withdrawReward(); + program.stackPush(new DataWord(allowance)); + program.step(); + } + + public static void createAction(Program program) { + if (program.isStaticCall()) { + throw new Program.StaticCallModificationException(); + } + + DataWord value = program.stackPop(); + DataWord inOffset = program.stackPop(); + DataWord inSize = program.stackPop(); + + program.createContract(value, inOffset, inSize); + program.step(); + } + + public static void returnAction(Program program) { + DataWord offset = program.stackPop(); + DataWord size = program.stackPop(); + + byte[] hReturn = program.memoryChunk(offset.intValueSafe(), size.intValueSafe()); + program.setHReturn(hReturn); + + program.step(); + program.stop(); + } + + public static void create2Action(Program program) { + if (program.isStaticCall()) { + throw new Program.StaticCallModificationException(); + } + + DataWord value = program.stackPop(); + DataWord inOffset = program.stackPop(); + DataWord inSize = program.stackPop(); + DataWord salt = program.stackPop(); + + program.createContract2(value, inOffset, inSize, salt); + program.step(); + } + + public static void callAction(Program program) { + // use adjustedCallEnergy instead of requested + program.stackPop(); + DataWord codeAddress = program.stackPop(); + DataWord value = program.stackPop(); + + if (program.isStaticCall() && !value.isZero()) { + throw new Program.StaticCallModificationException(); + } + DataWord adjustedCallEnergy = program.getAdjustedCallEnergy(); + if (!value.isZero()) { + adjustedCallEnergy.add(new DataWord(EnergyCost.getStipendCallCost())); + } + exeCall(program, adjustedCallEnergy, codeAddress, value, DataWord.ZERO(), false); + } + + public static void callTokenAction(Program program) { + program.stackPop(); + DataWord codeAddress = program.stackPop(); + DataWord value = program.stackPop(); + + if (program.isStaticCall() && !value.isZero()) { + throw new Program.StaticCallModificationException(); + } + DataWord adjustedCallEnergy = program.getAdjustedCallEnergy(); + if (!value.isZero()) { + adjustedCallEnergy.add(new DataWord(EnergyCost.getStipendCallCost())); + } + DataWord tokenId = program.stackPop(); + exeCall(program, adjustedCallEnergy, codeAddress, value, tokenId, VMConfig.allowMultiSign()); + } + + public static void callCodeAction(Program program) { + program.stackPop(); + DataWord codeAddress = program.stackPop(); + DataWord value = program.stackPop(); + + DataWord adjustedCallEnergy = program.getAdjustedCallEnergy(); + if (!value.isZero()) { + adjustedCallEnergy.add(new DataWord(EnergyCost.getStipendCallCost())); + } + exeCall(program, adjustedCallEnergy, codeAddress, value, DataWord.ZERO(), false); + } + + public static void delegateCallAction(Program program) { + program.stackPop(); + DataWord codeAddress = program.stackPop(); + DataWord value = DataWord.ZERO; + + DataWord adjustedCallEnergy = program.getAdjustedCallEnergy(); + exeCall(program, adjustedCallEnergy, codeAddress, value, DataWord.ZERO(), false); + } + + public static void staticCallAction(Program program) { + program.stackPop(); + DataWord codeAddress = program.stackPop(); + DataWord value = DataWord.ZERO; + + DataWord adjustedCallEnergy = program.getAdjustedCallEnergy(); + exeCall(program, adjustedCallEnergy, codeAddress, value, DataWord.ZERO(), false); + } + + public static void exeCall(Program program, DataWord adjustedCallEnergy, + DataWord codeAddress, DataWord value, DataWord tokenId, boolean isTokenTransferMsg) { + + DataWord inDataOffs = program.stackPop(); + DataWord inDataSize = program.stackPop(); + + DataWord outDataOffs = program.stackPop(); + DataWord outDataSize = program.stackPop(); + + program.memoryExpand(outDataOffs, outDataSize); + int op = program.getCurrentOpIntValue(); + MessageCall msg = new MessageCall( + op, adjustedCallEnergy, codeAddress, value, inDataOffs, inDataSize, + outDataOffs, outDataSize, tokenId, isTokenTransferMsg); + + PrecompiledContracts.PrecompiledContract contract = + PrecompiledContracts.getContractForAddress(codeAddress); + if (contract != null) { + program.callToPrecompiledAddress(msg, contract); + } else { + program.callToAddress(msg); + } + program.step(); + } + + public static void revertAction(Program program) { + DataWord offset = program.stackPop(); + DataWord size = program.stackPop(); + + byte[] hReturn = program.memoryChunk(offset.intValueSafe(), size.intValueSafe()); + program.setHReturn(hReturn); + + program.step(); + program.stop(); + + program.getResult().setRevert(); + } + + public static void suicideAction(Program program) { + if (program.isStaticCall()) { + throw new Program.StaticCallModificationException(); + } + + if (!program.canSuicide()) { + program.getResult().setRevert(); + } else { + DataWord address = program.stackPop(); + program.suicide(address); + } + + program.stop(); + } + +} diff --git a/actuator/src/main/java/org/tron/core/vm/OperationRegistry.java b/actuator/src/main/java/org/tron/core/vm/OperationRegistry.java new file mode 100644 index 00000000000..ad51f8a59af --- /dev/null +++ b/actuator/src/main/java/org/tron/core/vm/OperationRegistry.java @@ -0,0 +1,342 @@ +package org.tron.core.vm; + +public class OperationRegistry { + + private static final int NUM_OPERATIONS = 256; + + private static final Operation[] operations = new Operation[NUM_OPERATIONS]; + + public static Operation get(final int opcode) { + return operations[opcode]; + } + + public static Operation get(final byte opcode) { + return operations[opcode & 0xff]; + } + + // only for test + public static void clearOperations() { + for (int i = 0; i < NUM_OPERATIONS; i++) { + operations[i] = null; + } + } + + public static void newBaseOperation() { + // if already loaded, return + if (operations[Op.SUICIDE] != null) { + return; + } + + operations[Op.STOP] = new Operation(Op.STOP, 0, 0, + EnergyCost::getZeroTierCost, OperationActions::stopAction); + + operations[Op.ADD] = new Operation(Op.ADD, 2, 1, + EnergyCost::getVeryLowTierCost, OperationActions::addAction); + + operations[Op.MUL] = new Operation(Op.MUL, 2, 1, + EnergyCost::getLowTierCost, OperationActions::mulAction); + + operations[Op.SUB] = new Operation(Op.SUB, 2, 1, + EnergyCost::getVeryLowTierCost, OperationActions::subAction); + + operations[Op.DIV] = new Operation(Op.DIV, 2, 1, + EnergyCost::getLowTierCost, OperationActions::divAction); + + operations[Op.SDIV] = new Operation(Op.SDIV, 2, 1, + EnergyCost::getLowTierCost, OperationActions::sdivAction); + + operations[Op.MOD] = new Operation(Op.MOD, 2, 1, + EnergyCost::getLowTierCost, OperationActions::modAction); + + operations[Op.SMOD] = new Operation(Op.SMOD, 2, 1, + EnergyCost::getLowTierCost, OperationActions::sModAction); + + operations[Op.ADDMOD] = new Operation(Op.ADDMOD, 3, 1, + EnergyCost::getMidTierCost, OperationActions::addModAction); + + operations[Op.MULMOD] = new Operation(Op.MULMOD, 3, 1, + EnergyCost::getMidTierCost, OperationActions::mulModAction); + + operations[Op.EXP] = new Operation(Op.EXP, 2, 1, + EnergyCost::getExpCost, OperationActions::expAction); + + operations[Op.SIGNEXTEND] = new Operation(Op.SIGNEXTEND, 2, 1, + EnergyCost::getLowTierCost, OperationActions::signExtendAction); + + operations[Op.LT] = new Operation(Op.LT, 2, 1, + EnergyCost::getVeryLowTierCost, OperationActions::ltAction); + + operations[Op.GT] = new Operation(Op.GT, 2, 1, + EnergyCost::getVeryLowTierCost, OperationActions::gtAction); + + operations[Op.SLT] = new Operation(Op.SLT, 2, 1, + EnergyCost::getVeryLowTierCost, OperationActions::sltAction); + + operations[Op.SGT] = new Operation(Op.SGT, 2, 1, + EnergyCost::getVeryLowTierCost, OperationActions::sgtAction); + + operations[Op.EQ] = new Operation(Op.EQ, 2, 1, + EnergyCost::getVeryLowTierCost, OperationActions::eqAction); + + operations[Op.ISZERO] = new Operation(Op.ISZERO, 1, 1, + EnergyCost::getVeryLowTierCost, OperationActions::isZeroAction); + + operations[Op.AND] = new Operation(Op.AND, 2, 1, + EnergyCost::getVeryLowTierCost, OperationActions::andAction); + + operations[Op.OR] = new Operation(Op.OR, 2, 1, + EnergyCost::getVeryLowTierCost, OperationActions::orAction); + + operations[Op.XOR] = new Operation(Op.XOR, 2, 1, + EnergyCost::getVeryLowTierCost, OperationActions::xorAction); + + operations[Op.NOT] = new Operation(Op.NOT, 1, 1, + EnergyCost::getVeryLowTierCost, OperationActions::notAction); + + operations[Op.BYTE] = new Operation(Op.BYTE, 2, 1, + EnergyCost::getVeryLowTierCost, OperationActions::byteAction); + + operations[Op.SHA3] = new Operation(Op.SHA3, 2, 1, + EnergyCost::getSha3Cost, OperationActions::sha3Action); + + operations[Op.ADDRESS] = new Operation(Op.ADDRESS, 0, 1, + EnergyCost::getBaseTierCost, OperationActions::addressAction); + + operations[Op.BALANCE] = new Operation(Op.BALANCE, 1, 1, + EnergyCost::getBalanceCost, OperationActions::balanceAction); + + operations[Op.ORIGIN] = new Operation(Op.ORIGIN, 0, 1, + EnergyCost::getBaseTierCost, OperationActions::originAction); + + operations[Op.CALLER] = new Operation(Op.CALLER, 0, 1, + EnergyCost::getBaseTierCost, OperationActions::callerAction); + + operations[Op.CALLVALUE] = new Operation(Op.CALLVALUE, 0, 1, + EnergyCost::getBaseTierCost, OperationActions::callValueAction); + + operations[Op.CALLDATALOAD] = new Operation(Op.CALLDATALOAD, 1, 1, + EnergyCost::getVeryLowTierCost, OperationActions::callDataLoadAction); + + operations[Op.CALLDATASIZE] = new Operation(Op.CALLDATASIZE, 0, 1, + EnergyCost::getBaseTierCost, OperationActions::callDataSizeAction); + + operations[Op.CALLDATACOPY] = new Operation(Op.CALLDATACOPY, 3, 0, + EnergyCost::getCallDataCopyCost, OperationActions::callDataCopyAction); + + operations[Op.CODESIZE] = new Operation(Op.CODESIZE, 0, 1, + EnergyCost::getBaseTierCost, OperationActions::codeSizeAction); + + operations[Op.CODECOPY] = new Operation(Op.CODECOPY, 3, 0, + EnergyCost::getCodeCopyCost, OperationActions::codeCopyAction); + + operations[Op.RETURNDATASIZE] = new Operation(Op.RETURNDATASIZE, 0, 1, + EnergyCost::getBaseTierCost, OperationActions::returnDataSizeAction); + + operations[Op.RETURNDATACOPY] = new Operation(Op.RETURNDATACOPY, 3, 0, + EnergyCost::getReturnDataCopyCost, OperationActions::returnDataCopyAction); + + operations[Op.GASPRICE] = new Operation(Op.GASPRICE, 0, 1, + EnergyCost::getBaseTierCost, OperationActions::gasPriceAction); + + operations[Op.EXTCODESIZE] = new Operation(Op.EXTCODESIZE, 1, 1, + EnergyCost::getExtCodeSizeCost, OperationActions::extCodeSizeAction); + + operations[Op.EXTCODECOPY] = new Operation(Op.EXTCODECOPY, 4, 0, + EnergyCost::getExtCodeCopyCost, OperationActions::extCodeCopyAction); + + operations[Op.BLOCKHASH] = new Operation(Op.BLOCKHASH, 1, 1, + EnergyCost::getExtTierCost, OperationActions::blockHashAction); + + operations[Op.COINBASE] = new Operation(Op.COINBASE, 0, 1, + EnergyCost::getBaseTierCost, OperationActions::coinBaseAction); + + operations[Op.TIMESTAMP] = new Operation(Op.TIMESTAMP, 0, 1, + EnergyCost::getBaseTierCost, OperationActions::timeStampAction); + + operations[Op.NUMBER] = new Operation(Op.NUMBER, 0, 1, + EnergyCost::getBaseTierCost, OperationActions::numberAction); + + operations[Op.DIFFICULTY] = new Operation(Op.DIFFICULTY, 0, 1, + EnergyCost::getBaseTierCost, OperationActions::difficultyAction); + + operations[Op.GASLIMIT] = new Operation(Op.GASLIMIT, 0, 1, + EnergyCost::getBaseTierCost, OperationActions::gasLimitAction); + + operations[Op.POP] = new Operation(Op.POP, 1, 0, + EnergyCost::getBaseTierCost, OperationActions::popAction); + + operations[Op.MLOAD] = new Operation(Op.MLOAD, 1, 1, + EnergyCost::getMloadCost, OperationActions::mLoadAction); + + operations[Op.MSTORE] = new Operation(Op.MSTORE, 2, 0, + EnergyCost::getMStoreCost, OperationActions::mStoreAction); + + operations[Op.MSTORE8] = new Operation(Op.MSTORE8, 2, 0, + EnergyCost::getMStore8Cost, OperationActions::mStore8Action); + + operations[Op.SLOAD] = new Operation(Op.SLOAD, 1, 1, + EnergyCost::getSloadCost, OperationActions::sLoadAction); + + operations[Op.SSTORE] = new Operation(Op.SSTORE, 2, 0, + EnergyCost::getSstoreCost, OperationActions::sStoreAction); + + operations[Op.JUMP] = new Operation(Op.JUMP, 1, 0, + EnergyCost::getMidTierCost, OperationActions::jumpAction); + + operations[Op.JUMPI] = new Operation(Op.JUMPI, 2, 0, + EnergyCost::getHighTierCost, OperationActions::jumpIAction); + + operations[Op.PC] = new Operation(Op.PC, 0, 1, + EnergyCost::getBaseTierCost, OperationActions::pcAction); + + operations[Op.MSIZE] = new Operation(Op.MSIZE, 0, 1, + EnergyCost::getBaseTierCost, OperationActions::mSizeAction); + + operations[Op.GAS] = new Operation(Op.GAS, 0, 1, + EnergyCost::getBaseTierCost, OperationActions::gasAction); + + operations[Op.JUMPDEST] = new Operation(Op.JUMPDEST, 0, 0, + EnergyCost::getSpecialTierCost, OperationActions::jumpDestAction); + + for (int i = 0; i < 32; i++) { + operations[Op.PUSH1 + i] = new Operation(Op.PUSH1 + i, 0, 1, + EnergyCost::getVeryLowTierCost, OperationActions::pushAction); + } + + for (int i = 0; i < 16; i++) { + operations[Op.DUP1 + i] = new Operation(Op.DUP1 + i, 1 + i, 2 + i, + EnergyCost::getVeryLowTierCost, OperationActions::dupAction); + } + + for (int i = 0; i < 16; i++) { + operations[Op.SWAP1 + i] = new Operation(Op.SWAP1 + i, 2 + i, 2 + i, + EnergyCost::getVeryLowTierCost, OperationActions::swapAction); + } + + for (int i = 0; i <= 4; i++) { + operations[Op.LOG0 + i] = new Operation(Op.LOG0 + i, 2 + i, 0, + EnergyCost::getLogCost, OperationActions::logAction); + } + + operations[Op.CREATE] = new Operation(Op.CREATE, 3, 1, + EnergyCost::getCreateCost, OperationActions::createAction); + + operations[Op.CALL] = new Operation(Op.CALL, 7, 1, + EnergyCost::getCallCost, OperationActions::callAction); + + operations[Op.CALLCODE] = new Operation(Op.CALLCODE, 7, 1, + EnergyCost::getCallCodeCost, OperationActions::callCodeAction); + + operations[Op.RETURN] = new Operation(Op.RETURN, 2, 0, + EnergyCost::getReturnCost, OperationActions::returnAction); + + operations[Op.DELEGATECALL] = new Operation(Op.DELEGATECALL, 6, 1, + EnergyCost::getDelegateCallCost, OperationActions::delegateCallAction); + + operations[Op.STATICCALL] = new Operation(Op.STATICCALL, 6, 1, + EnergyCost::getStaticCallCost, OperationActions::staticCallAction); + + operations[Op.REVERT] = new Operation(Op.REVERT, 2, 0, + EnergyCost::getRevertCost, OperationActions::revertAction); + + operations[Op.SUICIDE] = new Operation(Op.SUICIDE, 1, 0, + EnergyCost::getSuicideCost, OperationActions::suicideAction); + } + + public static void newAllowTvmTransferTrc10Operation() { + // if already loaded, return + if (operations[Op.CALLTOKENID] != null) { + return; + } + operations[Op.CALLTOKEN] = new Operation(Op.CALLTOKEN, 8, 1, + EnergyCost::getCallTokenCost, OperationActions::callTokenAction); + + operations[Op.TOKENBALANCE] = new Operation(Op.TOKENBALANCE, 2, 1, + EnergyCost::getBalanceCost, OperationActions::tokenBalanceAction); + + operations[Op.CALLTOKENVALUE] = new Operation(Op.CALLTOKENVALUE, 0, 1, + EnergyCost::getBaseTierCost, OperationActions::callTokenValueAction); + + operations[Op.CALLTOKENID] = new Operation(Op.CALLTOKENID, 0, 1, + EnergyCost::getBaseTierCost, OperationActions::callTokenIdAction); + } + + public static void newAllowTvmConstantinopleOperation() { + // if already loaded, return + if (operations[Op.EXTCODEHASH] != null) { + return; + } + operations[Op.SHL] = new Operation(Op.SHL, 2, 1, + EnergyCost::getVeryLowTierCost, OperationActions::shlAction); + + operations[Op.SHR] = new Operation(Op.SHR, 2, 1, + EnergyCost::getVeryLowTierCost, OperationActions::shrAction); + + operations[Op.SAR] = new Operation(Op.SAR, 2, 1, + EnergyCost::getVeryLowTierCost, OperationActions::sarAction); + + operations[Op.CREATE2] = new Operation(Op.CREATE2, 4, 1, + EnergyCost::getCreate2Cost, OperationActions::create2Action); + + operations[Op.EXTCODEHASH] = new Operation(Op.EXTCODEHASH, 1, 1, + EnergyCost::getExtCodeHashCost, OperationActions::extCodeHashAction); + } + + public static void newAllowTvmSolidity059Operation() { + // if already loaded, return + if (operations[Op.ISCONTRACT] != null) { + return; + } + operations[Op.ISCONTRACT] = new Operation(Op.ISCONTRACT, 1, 1, + EnergyCost::getBalanceCost, OperationActions::isContractAction); + } + + public static void newAllowTvmIstanbulOperation() { + // if already loaded, return + if (operations[Op.SELFBALANCE] != null) { + return; + } + operations[Op.CHAINID] = new Operation(Op.CHAINID, 0, 1, + EnergyCost::getBaseTierCost, OperationActions::chainIdAction); + + operations[Op.SELFBALANCE] = new Operation(Op.SELFBALANCE, 0, 1, + EnergyCost::getLowTierCost, OperationActions::selfBalanceAction); + } + + public static void newAllowTvmFreezeOperation() { + // if already loaded, return + if (operations[Op.FREEZEEXPIRETIME] != null) { + return; + } + operations[Op.FREEZE] = new Operation(Op.FREEZE, 3, 1, + EnergyCost::getFreezeCost, OperationActions::freezeAction); + + operations[Op.UNFREEZE] = new Operation(Op.UNFREEZE, 2, 1, + EnergyCost::getUnfreezeCost, OperationActions::unfreezeAction); + + operations[Op.FREEZEEXPIRETIME] = new Operation(Op.FREEZEEXPIRETIME, 2, 1, + EnergyCost::getFreezeExpireTimeCost, OperationActions::freezeExpireTimeAction); + } + + public static void newAllowTvmVoteOperation() { + // if already loaded, return + if (operations[Op.WITHDRAWREWARD] != null) { + return; + } + operations[Op.VOTEWITNESS] = new Operation(Op.VOTEWITNESS, 4, 1, + EnergyCost::getVoteWitnessCost, OperationActions::voteWitnessAction); + + operations[Op.WITHDRAWREWARD] = new Operation(Op.WITHDRAWREWARD, 0, 1, + EnergyCost::getWithdrawRewardCost, OperationActions::withdrawRewardAction); + } + + public static void newAllowTvmLondonOperation() { + // if already loaded, return + if (operations[Op.BASEFEE] != null) { + return; + } + operations[Op.BASEFEE] = new Operation(Op.BASEFEE, 0, 1, + EnergyCost::getBaseTierCost, OperationActions::baseFeeAction); + } + +} diff --git a/actuator/src/main/java/org/tron/core/vm/PrecompiledContracts.java b/actuator/src/main/java/org/tron/core/vm/PrecompiledContracts.java index 7043bf6663d..437ecdd1d8f 100644 --- a/actuator/src/main/java/org/tron/core/vm/PrecompiledContracts.java +++ b/actuator/src/main/java/org/tron/core/vm/PrecompiledContracts.java @@ -1,31 +1,21 @@ -/* - * Copyright (c) [2016] [ ] - * This file is part of the ethereumJ library. - * - * The ethereumJ library is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * The ethereumJ library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with the ethereumJ library. If not, see . - */ - package org.tron.core.vm; +import static java.util.Arrays.copyOfRange; import static org.tron.common.runtime.vm.DataWord.WORD_SIZE; import static org.tron.common.utils.BIUtil.addSafely; import static org.tron.common.utils.BIUtil.isLessThan; import static org.tron.common.utils.BIUtil.isZero; -import static org.tron.common.utils.ByteUtil.*; -import static org.tron.core.db.TransactionTrace.convertToTronAddress; -import static java.util.Arrays.copyOfRange; +import static org.tron.common.utils.ByteUtil.EMPTY_BYTE_ARRAY; +import static org.tron.common.utils.ByteUtil.bytesToBigInteger; +import static org.tron.common.utils.ByteUtil.longTo32Bytes; +import static org.tron.common.utils.ByteUtil.merge; +import static org.tron.common.utils.ByteUtil.numberOfLeadingZeros; +import static org.tron.common.utils.ByteUtil.parseBytes; +import static org.tron.common.utils.ByteUtil.parseWord; +import static org.tron.common.utils.ByteUtil.stripLeadingZeroes; +import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION; +import com.google.protobuf.ByteString; import java.math.BigInteger; import java.security.MessageDigest; import java.util.ArrayList; @@ -39,8 +29,6 @@ import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; - -import com.google.protobuf.ByteString; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; @@ -69,19 +57,15 @@ import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.TransactionCapsule; import org.tron.core.capsule.WitnessCapsule; +import org.tron.core.db.TransactionTrace; import org.tron.core.exception.ZksnarkException; import org.tron.core.vm.config.VMConfig; -import org.tron.core.vm.utils.VoteRewardUtil; import org.tron.core.vm.program.Program; import org.tron.core.vm.repository.Repository; +import org.tron.core.vm.utils.VoteRewardUtil; + import org.tron.protos.Protocol; import org.tron.protos.Protocol.Permission; -import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION; - -/** - * @author Roman Mandeleil - * @since 09.01.2015 - */ @Slf4j(topic = "VM") public class PrecompiledContracts { @@ -305,7 +289,7 @@ private static byte[] extractBytes(byte[] data, int offset, int len) { return Arrays.copyOfRange(data, offset, offset + len); } - public static abstract class PrecompiledContract { + public abstract static class PrecompiledContract { protected static final byte[] DATA_FALSE = new byte[WORD_SIZE]; private byte[] callerAddress; @@ -832,12 +816,11 @@ public long getEnergyForData(byte[] data) { @Override public Pair execute(byte[] rawData) { DataWord[] words = DataWord.parseArray(rawData); - byte[] addr = words[0].getLast20Bytes(); + byte[] address = words[0].toTronAddress(); int permissionId = words[1].intValueSafe(); byte[] data = words[2].getData(); - byte[] combine = ByteUtil - .merge(convertToTronAddress(addr), ByteArray.fromInt(permissionId), data); + byte[] combine = ByteUtil.merge(address, ByteArray.fromInt(permissionId), data); byte[] hash = Sha256Hash.hash(CommonParameter .getInstance().isECKeyCryptoEngine(), combine); @@ -848,7 +831,7 @@ public Pair execute(byte[] rawData) { return Pair.of(true, DATA_FALSE); } - AccountCapsule account = this.getDeposit().getAccount(convertToTronAddress(addr)); + AccountCapsule account = this.getDeposit().getAccount(address); if (account != null) { try { Permission permission = account.getPermissionById(permissionId); @@ -1576,13 +1559,10 @@ public long getEnergyForData(byte[] data) { @Override public Pair execute(byte[] data) { - byte[] callerAddress = getCallerAddress(); - long rewardBalance = - VoteRewardUtil.queryReward(convertToTronAddress(callerAddress), getDeposit()); + long rewardBalance = VoteRewardUtil.queryReward( + TransactionTrace.convertToTronAddress(getCallerAddress()), getDeposit()); return Pair.of(true, longTo32Bytes(rewardBalance)); - } - } public static class IsSrCandidate extends PrecompiledContract { @@ -1594,29 +1574,22 @@ public long getEnergyForData(byte[] data) { @Override public Pair execute(byte[] data) { - if (data == null || data.length != WORD_SIZE) { return Pair.of(true, dataBoolean(false)); } - DataWord[] words = DataWord.parseArray(data); - byte[] addr = words[0].getLast20Bytes(); - - WitnessCapsule witnessCapsule = this.getDeposit() - .getWitness(convertToTronAddress(addr)); + byte[] address = new DataWord(data).toTronAddress(); + WitnessCapsule witnessCapsule = this.getDeposit().getWitness(address); if (witnessCapsule != null) { return Pair.of(true, dataBoolean(true)); } else { return Pair.of(true, dataBoolean(false)); } - } } public static class VoteCount extends PrecompiledContract { - private static final int SIZE = 64; - @Override public long getEnergyForData(byte[] data) { return 500; @@ -1624,29 +1597,25 @@ public long getEnergyForData(byte[] data) { @Override public Pair execute(byte[] data) { - - if (data == null || data.length != SIZE) { + if (data == null || data.length != 2 * WORD_SIZE) { return Pair.of(true, longTo32Bytes(0L)); } DataWord[] words = DataWord.parseArray(data); - byte[] voteTronAddr = convertToTronAddress(words[0].getLast20Bytes()); - byte[] targetTronAddr = convertToTronAddress(words[1].getLast20Bytes()); + byte[] address = words[0].toTronAddress(); + AccountCapsule accountCapsule = this.getDeposit().getAccount(address); long voteCount = 0; - AccountCapsule voteAccountCapsule = this.getDeposit().getAccount(voteTronAddr); - if (voteAccountCapsule != null && !voteAccountCapsule.getVotesList().isEmpty()) { - List voteList = - voteAccountCapsule.getVotesList(); - for (Protocol.Vote vote : voteList) { - if (ByteString.copyFrom(targetTronAddr).equals(vote.getVoteAddress())) { + if (accountCapsule != null && !accountCapsule.getVotesList().isEmpty()) { + ByteString witness = ByteString.copyFrom(words[1].toTronAddress()); + for (Protocol.Vote vote : accountCapsule.getVotesList()) { + if (witness.equals(vote.getVoteAddress())) { voteCount += vote.getVoteCount(); } } } return Pair.of(true, longTo32Bytes(voteCount)); - } } @@ -1659,26 +1628,21 @@ public long getEnergyForData(byte[] data) { @Override public Pair execute(byte[] data) { - if (data == null || data.length != WORD_SIZE) { return Pair.of(true, longTo32Bytes(0L)); } - DataWord[] words = DataWord.parseArray(data); - byte[] voteTronAddr = convertToTronAddress(words[0].getLast20Bytes()); + byte[] address = new DataWord(data).toTronAddress(); + AccountCapsule accountCapsule = this.getDeposit().getAccount(address); - long voteCount = 0; - AccountCapsule voteAccountCapsule = this.getDeposit().getAccount(voteTronAddr); - if (voteAccountCapsule != null && !voteAccountCapsule.getVotesList().isEmpty()) { - List voteList = - voteAccountCapsule.getVotesList(); - for (Protocol.Vote vote : voteList) { - voteCount += vote.getVoteCount(); + long usedVoteCount = 0; + if (accountCapsule != null && !accountCapsule.getVotesList().isEmpty()) { + for (Protocol.Vote vote : accountCapsule.getVotesList()) { + usedVoteCount += vote.getVoteCount(); } } - return Pair.of(true, longTo32Bytes(voteCount)); - + return Pair.of(true, longTo32Bytes(usedVoteCount)); } } @@ -1691,23 +1655,15 @@ public long getEnergyForData(byte[] data) { @Override public Pair execute(byte[] data) { - if (data == null || data.length != WORD_SIZE) { return Pair.of(true, longTo32Bytes(0L)); } - DataWord[] words = DataWord.parseArray(data); - byte[] targetTronAddr = convertToTronAddress(words[0].getLast20Bytes()); - - long voteCount = 0; - WitnessCapsule witnessCapsule = - this.getDeposit().getWitness(targetTronAddr); - if (witnessCapsule != null) { - voteCount = witnessCapsule.getVoteCount(); - } + byte[] address = new DataWord(data).toTronAddress(); + WitnessCapsule witnessCapsule = this.getDeposit().getWitness(address); + long voteCount = witnessCapsule != null ? witnessCapsule.getVoteCount() : 0; return Pair.of(true, longTo32Bytes(voteCount)); - } } @@ -1720,40 +1676,31 @@ public long getEnergyForData(byte[] data) { @Override public Pair execute(byte[] data) { - if (data == null || data.length != WORD_SIZE) { return Pair.of(true, longTo32Bytes(0L)); } - DataWord[] words = DataWord.parseArray(data); - byte[] voteTronAddr = convertToTronAddress(words[0].getLast20Bytes()); - - AccountCapsule accountCapsule = this.getDeposit().getAccount(voteTronAddr); - if (accountCapsule != null) { - return Pair.of(true, - longTo32Bytes(accountCapsule.getTronPower() / TRX_PRECISION)); - } - - return Pair.of(true, longTo32Bytes(0L)); + byte[] address = new DataWord(data).toTronAddress(); + AccountCapsule accountCapsule = this.getDeposit().getAccount(address); + long tronPower = accountCapsule != null + ? accountCapsule.getTronPower() / TRX_PRECISION : 0; + return Pair.of(true, longTo32Bytes(tronPower)); } } public static class EthRipemd160 extends PrecompiledContract { - @Override public long getEnergyForData(byte[] data) { - if (data == null) { return 600; } - return 600L + (data.length + 31) / 32 * 120; + return 600L + (data.length + 31) / 32 * 120L; } @Override public Pair execute(byte[] data) { - byte[] result; if (data == null) { result = Hash.ripemd160(EMPTY_BYTE_ARRAY); @@ -1766,10 +1713,8 @@ public Pair execute(byte[] data) { public static class Blake2F extends PrecompiledContract { - @Override public long getEnergyForData(byte[] data) { - if (data.length != 213 || (data[212] & 0xFE) != 0) { return 0; } @@ -1780,13 +1725,12 @@ public long getEnergyForData(byte[] data) { @Override public Pair execute(byte[] data) { - if (data.length != 213) { - logger.info("Incorrect input length. Expected {} and got {}", 213, data.length); + logger.warn("Incorrect input length. Expected {} and got {}", 213, data.length); return Pair.of(false, DataWord.ZERO().getData()); } if ((data[212] & 0xFE) != 0) { - logger.info("Incorrect finalization flag, expected 0 or 1 and got {}", data[212]); + logger.warn("Incorrect finalization flag, expected 0 or 1 and got {}", data[212]); return Pair.of(false, DataWord.ZERO().getData()); } final MessageDigest digest = new Blake2bfMessageDigest(); @@ -1800,5 +1744,4 @@ public Pair execute(byte[] data) { return Pair.of(true, result); } } - } diff --git a/actuator/src/main/java/org/tron/core/vm/VM.java b/actuator/src/main/java/org/tron/core/vm/VM.java index b3b7e1c40da..616afb35d13 100644 --- a/actuator/src/main/java/org/tron/core/vm/VM.java +++ b/actuator/src/main/java/org/tron/core/vm/VM.java @@ -1,1288 +1,58 @@ package org.tron.core.vm; -import static org.tron.common.crypto.Hash.sha3; -import static org.tron.common.utils.ByteUtil.EMPTY_BYTE_ARRAY; -import static org.tron.core.db.TransactionTrace.convertToTronAddress; -import static org.tron.core.vm.OpCode.CALL; -import static org.tron.core.vm.OpCode.CALLTOKEN; -import static org.tron.core.vm.OpCode.CALLTOKENID; -import static org.tron.core.vm.OpCode.CALLTOKENVALUE; -import static org.tron.core.vm.OpCode.CHAINID; -import static org.tron.core.vm.OpCode.CREATE2; -import static org.tron.core.vm.OpCode.EXTCODEHASH; -import static org.tron.core.vm.OpCode.FREEZE; -import static org.tron.core.vm.OpCode.FREEZEEXPIRETIME; -import static org.tron.core.vm.OpCode.ISCONTRACT; -import static org.tron.core.vm.OpCode.PUSH1; -import static org.tron.core.vm.OpCode.REVERT; -import static org.tron.core.vm.OpCode.SAR; -import static org.tron.core.vm.OpCode.SELFBALANCE; -import static org.tron.core.vm.OpCode.SHL; -import static org.tron.core.vm.OpCode.SHR; -import static org.tron.core.vm.OpCode.TOKENBALANCE; -import static org.tron.core.vm.OpCode.UNFREEZE; -import static org.tron.core.vm.OpCode.VOTEWITNESS; -import static org.tron.core.vm.OpCode.WITHDRAWREWARD; -import static org.tron.core.vm.OpCode.BASEFEE; - -import java.math.BigInteger; -import java.util.ArrayList; -import java.util.List; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; import org.springframework.util.StringUtils; -import org.tron.common.runtime.vm.DataWord; -import org.tron.common.runtime.vm.LogInfo; import org.tron.core.vm.config.VMConfig; import org.tron.core.vm.program.Program; import org.tron.core.vm.program.Program.JVMStackOverFlowException; -import org.tron.core.vm.program.Program.OutOfEnergyException; import org.tron.core.vm.program.Program.OutOfTimeException; import org.tron.core.vm.program.Program.TransferException; -import org.tron.core.vm.program.Stack; @Slf4j(topic = "VM") public class VM { - private static final BigInteger _32_ = BigInteger.valueOf(32); - private static final BigInteger MEM_LIMIT = BigInteger.valueOf(3L * 1024 * 1024); // 3MB - private final VMConfig config; - - public VM() { - config = VMConfig.getInstance(); - } - - public VM(VMConfig config) { - this.config = config; - } - - /** - * Utility to calculate new total memory size needed for an operation.
Basically just offset - * + size, unless size is 0, in which case the result is also 0. - * - * @param offset starting position of the memory - * @param size number of bytes needed - * @return offset + size, unless size is 0. In that case memNeeded is also 0. - */ - private static BigInteger memNeeded(DataWord offset, DataWord size) { - return size.isZero() ? BigInteger.ZERO : offset.value().add(size.value()); - } - - private void checkMemorySize(OpCode op, BigInteger newMemSize) { - if (newMemSize.compareTo(MEM_LIMIT) > 0) { - throw Program.Exception.memoryOverflow(op); - } - } - - private long calcMemEnergy(EnergyCost energyCosts, long oldMemSize, BigInteger newMemSize, - long copySize, OpCode op) { - long energyCost = 0; - - checkMemorySize(op, newMemSize); - - // memory SUN consume calc - long memoryUsage = (newMemSize.longValueExact() + 31) / 32 * 32; - if (memoryUsage > oldMemSize) { - long memWords = (memoryUsage / 32); - long memWordsOld = (oldMemSize / 32); - //TODO #POC9 c_quadCoeffDiv = 512, this should be a constant, not magic number - long memEnergy = (energyCosts.getMemory() * memWords + memWords * memWords / 512) - - (energyCosts.getMemory() * memWordsOld + memWordsOld * memWordsOld / 512); - energyCost += memEnergy; - } - - if (copySize > 0) { - long copyEnergy = energyCosts.getCopyEnergy() * ((copySize + 31) / 32); - energyCost += copyEnergy; - } - return energyCost; - } - - public void step(Program program) { - if (config.vmTrace()) { - program.saveOpTrace(); - } - + public static void play(Program program) { try { - OpCode op = OpCode.code(program.getCurrentOp()); - if (op == null - || (!VMConfig.allowTvmTransferTrc10() - && (op == CALLTOKEN || op == TOKENBALANCE - || op == CALLTOKENVALUE || op == CALLTOKENID)) - || (!VMConfig.allowTvmConstantinople() - && (op == SHL || op == SHR || op == SAR - || op == CREATE2 || op == EXTCODEHASH)) - || (!VMConfig.allowTvmSolidity059() - && op == ISCONTRACT) - || (!VMConfig.allowTvmIstanbul() - && (op == SELFBALANCE || op == CHAINID)) - || (!VMConfig.allowTvmFreeze() - && (op == FREEZE || op == UNFREEZE || op == FREEZEEXPIRETIME)) - || (!VMConfig.allowTvmVote() - && (op == VOTEWITNESS || op == WITHDRAWREWARD)) - || (!VMConfig.allowTvmLondon() && (op == BASEFEE)) - ) { - throw Program.Exception.invalidOpCode(program.getCurrentOp()); - } - - program.setLastOp(op.val()); - program.verifyStackSize(op.require()); - program.verifyStackOverflow(op.require(), op.ret()); //Check not exceeding stack limits - - long oldMemSize = program.getMemSize(); - Stack stack = program.getStack(); - - long energyCost = op.getTier().asInt(); - EnergyCost energyCosts = EnergyCost.getInstance(); - DataWord adjustedCallEnergy = null; - - // Calculate fees and spend energy - switch (op) { - case STOP: - energyCost = energyCosts.getStop(); - break; - case SUICIDE: - energyCost = energyCosts.getSuicide(); - DataWord suicideAddressWord = stack.get(stack.size() - 1); - if (isDeadAccount(program, suicideAddressWord) - && !program.getBalance(program.getContractAddress()).isZero()) { - energyCost += energyCosts.getNewAcctSuicide(); - } - break; - case SSTORE: - // todo: check the reset to 0, refund or not - DataWord newValue = stack.get(stack.size() - 2); - DataWord oldValue = program.storageLoad(stack.peek()); - if (oldValue == null && !newValue.isZero()) { - // set a new not-zero value - energyCost = energyCosts.getSetSStore(); - } else if (oldValue != null && newValue.isZero()) { - // set zero to an old value - program.futureRefundEnergy(energyCosts.getRefundSStore()); - energyCost = energyCosts.getClearSStore(); - } else { - // include: - // [1] oldValue == null && newValue == 0 - // [2] oldValue != null && newValue != 0 - energyCost = energyCosts.getResetSStore(); - } - break; - case SLOAD: - energyCost = energyCosts.getSLoad(); - break; - case TOKENBALANCE: - case BALANCE: - case ISCONTRACT: - energyCost = energyCosts.getBalance(); - break; - case FREEZE: - energyCost = energyCosts.getFreeze(); - DataWord receiverAddressWord = stack.get(stack.size() - 3); - if (isDeadAccount(program, receiverAddressWord)) { - energyCost += energyCosts.getNewAcctCall(); - } - break; - case UNFREEZE: - energyCost = energyCosts.getUnfreeze(); - break; - case FREEZEEXPIRETIME: - energyCost = energyCosts.getFreezeExpireTime(); - break; - case VOTEWITNESS: - energyCost = energyCosts.getVoteWitness(); - DataWord amountArrayLength = stack.get(stack.size() - 1).clone(); - DataWord amountArrayOffset = stack.get(stack.size() - 2); - DataWord witnessArrayLength = stack.get(stack.size() - 3).clone(); - DataWord witnessArrayOffset = stack.get(stack.size() - 4); - - DataWord wordSize = new DataWord(DataWord.WORD_SIZE); - - amountArrayLength.mul(wordSize); - BigInteger amountArrayMemoryNeeded = memNeeded(amountArrayOffset, amountArrayLength); - - witnessArrayLength.mul(wordSize); - BigInteger witnessArrayMemoryNeeded = memNeeded(witnessArrayOffset, witnessArrayLength); - - energyCost += calcMemEnergy(energyCosts, oldMemSize, - (amountArrayMemoryNeeded.compareTo(witnessArrayMemoryNeeded) > 0 ? - amountArrayMemoryNeeded : witnessArrayMemoryNeeded), 0, op); - break; - case WITHDRAWREWARD: - energyCost = energyCosts.getWithdrawReward(); - break; - - // These all operate on memory and therefore potentially expand it: - case MSTORE: - energyCost = calcMemEnergy(energyCosts, oldMemSize, - memNeeded(stack.peek(), new DataWord(32)), - 0, op); - break; - case MSTORE8: - energyCost = calcMemEnergy(energyCosts, oldMemSize, - memNeeded(stack.peek(), new DataWord(1)), - 0, op); - break; - case MLOAD: - energyCost = calcMemEnergy(energyCosts, oldMemSize, - memNeeded(stack.peek(), new DataWord(32)), - 0, op); - break; - case RETURN: - case REVERT: - energyCost = energyCosts.getStop() + calcMemEnergy(energyCosts, oldMemSize, - memNeeded(stack.peek(), stack.get(stack.size() - 2)), 0, op); - break; - case SHA3: - energyCost = energyCosts.getSha3() + calcMemEnergy(energyCosts, oldMemSize, - memNeeded(stack.peek(), stack.get(stack.size() - 2)), 0, op); - DataWord size = stack.get(stack.size() - 2); - long chunkUsed = (size.longValueSafe() + 31) / 32; - energyCost += chunkUsed * energyCosts.getSha3Word(); - break; - case CALLDATACOPY: - case RETURNDATACOPY: - energyCost = calcMemEnergy(energyCosts, oldMemSize, - memNeeded(stack.peek(), stack.get(stack.size() - 3)), - stack.get(stack.size() - 3).longValueSafe(), op); - break; - case CODECOPY: - energyCost = calcMemEnergy(energyCosts, oldMemSize, - memNeeded(stack.peek(), stack.get(stack.size() - 3)), - stack.get(stack.size() - 3).longValueSafe(), op); - break; - case EXTCODESIZE: - energyCost = energyCosts.getExtCodeSize(); - break; - case EXTCODECOPY: - energyCost = energyCosts.getExtCodeCopy() + calcMemEnergy(energyCosts, oldMemSize, - memNeeded(stack.get(stack.size() - 2), stack.get(stack.size() - 4)), - stack.get(stack.size() - 4).longValueSafe(), op); - break; - case EXTCODEHASH: - energyCost = energyCosts.getExtCodeHash(); - break; - case CALL: - case CALLCODE: - case DELEGATECALL: - case STATICCALL: - case CALLTOKEN: - // here, contract call an other contract, or a library, and so on - energyCost = energyCosts.getCall(); - DataWord callEnergyWord = stack.get(stack.size() - 1); - DataWord callAddressWord = stack.get(stack.size() - 2); - DataWord value = op.callHasValue() ? stack.get(stack.size() - 3) : DataWord.ZERO; - - //check to see if account does not exist and is not a precompiled contract - if ((op == CALL || op == CALLTOKEN) - && isDeadAccount(program, callAddressWord) - && !value.isZero()) { - energyCost += energyCosts.getNewAcctCall(); - } - - // TODO #POC9 Make sure this is converted to BigInteger (256num support) - if (!value.isZero()) { - energyCost += energyCosts.getVtCall(); - } - - int opOff = op.callHasValue() ? 4 : 3; - if (op == CALLTOKEN) { - opOff++; - } - BigInteger in = memNeeded(stack.get(stack.size() - opOff), - stack.get(stack.size() - opOff - 1)); // in offset+size - BigInteger out = memNeeded(stack.get(stack.size() - opOff - 2), - stack.get(stack.size() - opOff - 3)); // out offset+size - energyCost += calcMemEnergy(energyCosts, oldMemSize, in.max(out), 0, op); - checkMemorySize(op, in.max(out)); - - if (energyCost > program.getEnergyLimitLeft().longValueSafe()) { - throw new OutOfEnergyException( - "Not enough energy for '%s' operation executing: opEnergy[%d], programEnergy[%d]", - op.name(), - energyCost, program.getEnergyLimitLeft().longValueSafe()); - } - DataWord getEnergyLimitLeft = program.getEnergyLimitLeft().clone(); - getEnergyLimitLeft.sub(new DataWord(energyCost)); - - adjustedCallEnergy = program.getCallEnergy(op, callEnergyWord, getEnergyLimitLeft); - energyCost += adjustedCallEnergy.longValueSafe(); - break; - case CREATE: - energyCost = energyCosts.getCreate() + calcMemEnergy(energyCosts, oldMemSize, - memNeeded(stack.get(stack.size() - 2), stack.get(stack.size() - 3)), 0, op); - break; - case CREATE2: - DataWord codeSize = stack.get(stack.size() - 3); - energyCost = energyCosts.getCreate(); - energyCost += calcMemEnergy(energyCosts, oldMemSize, - memNeeded(stack.get(stack.size() - 2), stack.get(stack.size() - 3)), 0, op); - energyCost += DataWord.sizeInWords(codeSize.intValueSafe()) * energyCosts.getSha3Word(); - - break; - case LOG0: - case LOG1: - case LOG2: - case LOG3: - case LOG4: - int nTopics = op.val() - OpCode.LOG0.val(); - BigInteger dataSize = stack.get(stack.size() - 2).value(); - BigInteger dataCost = dataSize - .multiply(BigInteger.valueOf(energyCosts.getLogDataEnergy())); - if (program.getEnergyLimitLeft().value().compareTo(dataCost) < 0) { - throw new OutOfEnergyException( - "Not enough energy for '%s' operation executing: opEnergy[%d], programEnergy[%d]", - op.name(), - dataCost.longValueExact(), program.getEnergyLimitLeft().longValueSafe()); - } - energyCost = energyCosts.getLogEnergy() - + energyCosts.getLogTopicEnergy() * nTopics - + energyCosts.getLogDataEnergy() * stack.get(stack.size() - 2).longValue() - + calcMemEnergy(energyCosts, oldMemSize, - memNeeded(stack.peek(), stack.get(stack.size() - 2)), 0, op); - - checkMemorySize(op, memNeeded(stack.peek(), stack.get(stack.size() - 2))); - break; - case EXP: - - DataWord exp = stack.get(stack.size() - 2); - int bytesOccupied = exp.bytesOccupied(); - energyCost = - (long) energyCosts.getExpEnergy() + energyCosts.getExpByteEnergy() * bytesOccupied; - break; - default: - break; - } - - program.spendEnergy(energyCost, op.name()); - program.checkCPUTimeLimit(op.name()); - - // Execute operation - switch (op) { - /** - * Stop and Arithmetic Operations - */ - case STOP: { - program.setHReturn(EMPTY_BYTE_ARRAY); - program.stop(); - } - break; - case ADD: { - DataWord word1 = program.stackPop(); - DataWord word2 = program.stackPop(); - - word1.add(word2); - program.stackPush(word1); - program.step(); - } - break; - case MUL: { - DataWord word1 = program.stackPop(); - DataWord word2 = program.stackPop(); - - word1.mul(word2); - program.stackPush(word1); - program.step(); - } - break; - case SUB: { - DataWord word1 = program.stackPop(); - DataWord word2 = program.stackPop(); - - word1.sub(word2); - program.stackPush(word1); - program.step(); - } - break; - case DIV: { - DataWord word1 = program.stackPop(); - DataWord word2 = program.stackPop(); - - word1.div(word2); - program.stackPush(word1); - program.step(); - } - break; - case SDIV: { - DataWord word1 = program.stackPop(); - DataWord word2 = program.stackPop(); - - word1.sDiv(word2); - program.stackPush(word1); - program.step(); - } - break; - case MOD: { - DataWord word1 = program.stackPop(); - DataWord word2 = program.stackPop(); - - word1.mod(word2); - program.stackPush(word1); - program.step(); - } - break; - case SMOD: { - DataWord word1 = program.stackPop(); - DataWord word2 = program.stackPop(); - - word1.sMod(word2); - program.stackPush(word1); - program.step(); - } - break; - case EXP: { - DataWord word1 = program.stackPop(); - DataWord word2 = program.stackPop(); - - word1.exp(word2); - program.stackPush(word1); - program.step(); - } - break; - case SIGNEXTEND: { - DataWord word1 = program.stackPop(); - BigInteger k = word1.value(); - - if (k.compareTo(_32_) < 0) { - DataWord word2 = program.stackPop(); - word2.signExtend(k.byteValue()); - program.stackPush(word2); - } - program.step(); - } - break; - case NOT: { - DataWord word1 = program.stackPop(); - word1.bnot(); - - program.stackPush(word1); - program.step(); - } - break; - case LT: { - DataWord word1 = program.stackPop(); - DataWord word2 = program.stackPop(); - - if (word1.value().compareTo(word2.value()) < 0) { - word1.and(DataWord.ZERO); - word1.getData()[31] = 1; - } else { - word1.and(DataWord.ZERO); - } - program.stackPush(word1); - program.step(); - } - break; - case SLT: { - DataWord word1 = program.stackPop(); - DataWord word2 = program.stackPop(); - - if (word1.sValue().compareTo(word2.sValue()) < 0) { - word1.and(DataWord.ZERO); - word1.getData()[31] = 1; - } else { - word1.and(DataWord.ZERO); - } - program.stackPush(word1); - program.step(); - } - break; - case SGT: { - DataWord word1 = program.stackPop(); - DataWord word2 = program.stackPop(); - - if (word1.sValue().compareTo(word2.sValue()) > 0) { - word1.and(DataWord.ZERO); - word1.getData()[31] = 1; - } else { - word1.and(DataWord.ZERO); - } - program.stackPush(word1); - program.step(); - } - break; - case GT: { - DataWord word1 = program.stackPop(); - DataWord word2 = program.stackPop(); - - if (word1.value().compareTo(word2.value()) > 0) { - word1.and(DataWord.ZERO); - word1.getData()[31] = 1; - } else { - word1.and(DataWord.ZERO); - } - program.stackPush(word1); - program.step(); - } - break; - case EQ: { - DataWord word1 = program.stackPop(); - DataWord word2 = program.stackPop(); - - if (word1.xor(word2).isZero()) { - word1.and(DataWord.ZERO); - word1.getData()[31] = 1; - } else { - word1.and(DataWord.ZERO); - } - program.stackPush(word1); - program.step(); - } - break; - case ISZERO: { - DataWord word1 = program.stackPop(); - if (word1.isZero()) { - word1.getData()[31] = 1; - } else { - word1.and(DataWord.ZERO); - } - - program.stackPush(word1); - program.step(); - } - break; - - /** - * Bitwise Logic Operations - */ - case AND: { - DataWord word1 = program.stackPop(); - DataWord word2 = program.stackPop(); - - word1.and(word2); - program.stackPush(word1); - program.step(); - } - break; - case OR: { - DataWord word1 = program.stackPop(); - DataWord word2 = program.stackPop(); - - word1.or(word2); - program.stackPush(word1); - program.step(); - } - break; - case XOR: { - DataWord word1 = program.stackPop(); - DataWord word2 = program.stackPop(); - - word1.xor(word2); - program.stackPush(word1); - program.step(); - } - break; - case BYTE: { - DataWord word1 = program.stackPop(); - DataWord word2 = program.stackPop(); - - final DataWord result; - if (word1.value().compareTo(_32_) < 0) { - byte tmp = word2.getData()[word1.intValue()]; - word2.and(DataWord.ZERO); - word2.getData()[31] = tmp; - result = word2; - } else { - result = new DataWord(); - } - - program.stackPush(result); - program.step(); - } - break; - case SHL: { - DataWord word1 = program.stackPop(); - DataWord word2 = program.stackPop(); - - final DataWord result = word2.shiftLeft(word1); - program.stackPush(result); - program.step(); - } - break; - case SHR: { - DataWord word1 = program.stackPop(); - DataWord word2 = program.stackPop(); - - final DataWord result = word2.shiftRight(word1); - program.stackPush(result); - program.step(); - } - break; - case SAR: { - DataWord word1 = program.stackPop(); - DataWord word2 = program.stackPop(); - - final DataWord result = word2.shiftRightSigned(word1); - program.stackPush(result); - program.step(); - } - break; - case ADDMOD: { - DataWord word1 = program.stackPop(); - DataWord word2 = program.stackPop(); - DataWord word3 = program.stackPop(); - - word1.addmod(word2, word3); - program.stackPush(word1); - program.step(); - } - break; - case MULMOD: { - DataWord word1 = program.stackPop(); - DataWord word2 = program.stackPop(); - DataWord word3 = program.stackPop(); - - word1.mulmod(word2, word3); - program.stackPush(word1); - program.step(); - } - break; - - /** - * SHA3 - */ - case SHA3: { - DataWord memOffsetData = program.stackPop(); - DataWord lengthData = program.stackPop(); - byte[] buffer = program - .memoryChunk(memOffsetData.intValueSafe(), lengthData.intValueSafe()); - - byte[] encoded = sha3(buffer); - DataWord word = new DataWord(encoded); - - program.stackPush(word); - program.step(); - } - break; - - /** - * Environmental Information - */ - case ADDRESS: { - DataWord address = program.getContractAddress(); - if (VMConfig.allowMultiSign()) { // allowMultiSigns proposal - address = new DataWord(address.getLast20Bytes()); - } - - program.stackPush(address); - program.step(); - } - break; - case BALANCE: { - DataWord address = program.stackPop(); - DataWord balance = program.getBalance(address); - - program.stackPush(balance); - program.step(); - } - break; - case ISCONTRACT: { - DataWord address = program.stackPop(); - DataWord isContract = program.isContract(address); - - program.stackPush(isContract); - program.step(); - } - break; - case ORIGIN: { - DataWord originAddress = program.getOriginAddress(); - - if (VMConfig.allowMultiSign()) { //allowMultiSign proposal - originAddress = new DataWord(originAddress.getLast20Bytes()); - } - - program.stackPush(originAddress); - program.step(); - } - break; - case CALLER: { - DataWord callerAddress = program.getCallerAddress(); - /** - since we use 21 bytes address instead of 20 as etherum, we need to make sure - the address length in vm is matching with 20 - */ - callerAddress = new DataWord(callerAddress.getLast20Bytes()); - - program.stackPush(callerAddress); - program.step(); - } - break; - case CALLVALUE: { - DataWord callValue = program.getCallValue(); - - program.stackPush(callValue); - program.step(); - } - break; - case CALLTOKENVALUE: { - DataWord tokenValue = program.getTokenValue(); - - program.stackPush(tokenValue); - program.step(); - } - break; - case CALLTOKENID: { - DataWord _tokenId = program.getTokenId(); - - program.stackPush(_tokenId); - program.step(); - } - break; - case CALLDATALOAD: { - DataWord dataOffs = program.stackPop(); - DataWord value = program.getDataValue(dataOffs); - - program.stackPush(value); - program.step(); - } - break; - case CALLDATASIZE: { - DataWord dataSize = program.getDataSize(); - - program.stackPush(dataSize); - program.step(); - } - break; - case CALLDATACOPY: { - DataWord memOffsetData = program.stackPop(); - DataWord dataOffsetData = program.stackPop(); - DataWord lengthData = program.stackPop(); - - byte[] msgData = program.getDataCopy(dataOffsetData, lengthData); - - program.memorySave(memOffsetData.intValueSafe(), msgData); - program.step(); - } - break; - case RETURNDATASIZE: { - DataWord dataSize = program.getReturnDataBufferSize(); - - program.stackPush(dataSize); - program.step(); - } - break; - case RETURNDATACOPY: { - DataWord memOffsetData = program.stackPop(); - DataWord dataOffsetData = program.stackPop(); - DataWord lengthData = program.stackPop(); - - byte[] msgData = program.getReturnDataBufferData(dataOffsetData, lengthData); - - if (msgData == null) { - throw new Program.ReturnDataCopyIllegalBoundsException(dataOffsetData, lengthData, - program.getReturnDataBufferSize().longValueSafe()); - } - - program.memorySave(memOffsetData.intValueSafe(), msgData); - program.step(); - } - break; - case CODESIZE: - case EXTCODESIZE: { - int length; - if (op == OpCode.CODESIZE) { - length = program.getCode().length; - } else { - DataWord address = program.stackPop(); - length = program.getCodeAt(address).length; - } - DataWord codeLength = new DataWord(length); - - program.stackPush(codeLength); - program.step(); - } - break; - case CODECOPY: - case EXTCODECOPY: { - byte[] fullCode = EMPTY_BYTE_ARRAY; - if (op == OpCode.CODECOPY) { - fullCode = program.getCode(); - } - - if (op == OpCode.EXTCODECOPY) { - DataWord address = program.stackPop(); - fullCode = program.getCodeAt(address); - } - - int memOffset = program.stackPop().intValueSafe(); - int codeOffset = program.stackPop().intValueSafe(); - int lengthData = program.stackPop().intValueSafe(); - - int sizeToBeCopied = - (long) codeOffset + lengthData > fullCode.length - ? (fullCode.length < codeOffset ? 0 : fullCode.length - codeOffset) - : lengthData; - - byte[] codeCopy = new byte[lengthData]; - - if (codeOffset < fullCode.length) { - System.arraycopy(fullCode, codeOffset, codeCopy, 0, sizeToBeCopied); - } - - program.memorySave(memOffset, codeCopy); - program.step(); - } - break; - case EXTCODEHASH: { - DataWord address = program.stackPop(); - byte[] codeHash = program.getCodeHashAt(address); - program.stackPush(codeHash); - program.step(); - } - break; - case GASPRICE: { - DataWord energyPrice = new DataWord(0); - if (VMConfig.allowTvmCompatibleEvm() && program.getContractVersion() == 1) { - energyPrice = new DataWord(program.getContractState() - .getDynamicPropertiesStore().getEnergyFee()); - } - program.stackPush(energyPrice); - program.step(); - } - break; - - /** - * Block Information - */ - case BLOCKHASH: { - int blockIndex = program.stackPop().intValueSafe(); - DataWord blockHash = program.getBlockHash(blockIndex); - - program.stackPush(blockHash); - program.step(); - } - break; - case COINBASE: { - DataWord coinbase = program.getCoinbase(); - - program.stackPush(coinbase); - program.step(); - } - break; - case TIMESTAMP: { - DataWord timestamp = program.getTimestamp(); - - program.stackPush(timestamp); - program.step(); - } - break; - case NUMBER: { - DataWord number = program.getNumber(); - - program.stackPush(number); - program.step(); - } - break; - case DIFFICULTY: - case GASLIMIT: { - DataWord result = new DataWord(0); - - program.stackPush(result); - program.step(); - } - break; - case BASEFEE: { - DataWord energyFee = - new DataWord(program.getContractState().getDynamicPropertiesStore().getEnergyFee()); - - program.stackPush(energyFee); - program.step(); - } - break; - case CHAINID: { - DataWord chainId = program.getChainId(); - - program.stackPush(chainId); - program.step(); - } - break; - case SELFBALANCE: { - DataWord selfBalance = program.getBalance(program.getContractAddress()); - - program.stackPush(selfBalance); - program.step(); - } - break; - case POP: { - program.stackPop(); - program.step(); - } - break; - case DUP1: case DUP2: case DUP3: case DUP4: - case DUP5: case DUP6: case DUP7: case DUP8: - case DUP9: case DUP10: case DUP11: case DUP12: - case DUP13: case DUP14: case DUP15: case DUP16: { - int n = op.val() - OpCode.DUP1.val() + 1; - DataWord word_1 = stack.get(stack.size() - n); - - program.stackPush(word_1.clone()); - program.step(); - } - break; - case SWAP1: case SWAP2: case SWAP3: case SWAP4: - case SWAP5: case SWAP6: case SWAP7: case SWAP8: - case SWAP9: case SWAP10: case SWAP11: case SWAP12: - case SWAP13: case SWAP14: case SWAP15: case SWAP16: { - int n = op.val() - OpCode.SWAP1.val() + 2; - stack.swap(stack.size() - 1, stack.size() - n); - - program.step(); - } - break; - case LOG0: case LOG1: case LOG2: case LOG3: case LOG4: { - if (program.isStaticCall()) { - throw new Program.StaticCallModificationException(); - } - DataWord address = program.getContractAddress(); - - DataWord memStart = stack.pop(); - DataWord memOffset = stack.pop(); - - int nTopics = op.val() - OpCode.LOG0.val(); - - List topics = new ArrayList<>(); - for (int i = 0; i < nTopics; ++i) { - DataWord topic = stack.pop(); - topics.add(topic); - } - - byte[] data = program.memoryChunk(memStart.intValueSafe(), memOffset.intValueSafe()); - - LogInfo logInfo = - new LogInfo(address.getLast20Bytes(), topics, data); - - program.getResult().addLogInfo(logInfo); - program.step(); - } - break; - case MLOAD: { - DataWord addr = program.stackPop(); - DataWord data = program.memoryLoad(addr); - - program.stackPush(data); - program.step(); - } - break; - case MSTORE: { - DataWord addr = program.stackPop(); - DataWord value = program.stackPop(); - - program.memorySave(addr, value); - program.step(); - } - break; - case MSTORE8: { - DataWord addr = program.stackPop(); - DataWord value = program.stackPop(); - - byte[] byteVal = {value.getData()[31]}; - program.memorySave(addr.intValueSafe(), byteVal); - program.step(); - } - break; - case SLOAD: { - DataWord key = program.stackPop(); - DataWord val = program.storageLoad(key); - - if (val == null) { - val = key.and(DataWord.ZERO); - } - - program.stackPush(val); - program.step(); - } - break; - case SSTORE: { - if (program.isStaticCall()) { - throw new Program.StaticCallModificationException(); - } - - DataWord addr = program.stackPop(); - DataWord value = program.stackPop(); - - program.storageSave(addr, value); - program.step(); - } - break; - case JUMP: { - DataWord pos = program.stackPop(); - int nextPC = program.verifyJumpDest(pos); - - program.setPC(nextPC); - } - break; - case JUMPI: { - DataWord pos = program.stackPop(); - DataWord cond = program.stackPop(); - - if (!cond.isZero()) { - int nextPC = program.verifyJumpDest(pos); - program.setPC(nextPC); - } else { - program.step(); - } - } - break; - case PC: { - int pc = program.getPC(); - DataWord pcWord = new DataWord(pc); - - program.stackPush(pcWord); - program.step(); - } - break; - case MSIZE: { - int memSize = program.getMemSize(); - DataWord wordMemSize = new DataWord(memSize); - - program.stackPush(wordMemSize); - program.step(); - } - break; - case GAS: { - DataWord energy = program.getEnergyLimitLeft(); - - program.stackPush(energy); - program.step(); - } - break; - case PUSH1: case PUSH2: case PUSH3: case PUSH4: - case PUSH5: case PUSH6: case PUSH7: case PUSH8: - case PUSH9: case PUSH10: case PUSH11: case PUSH12: - case PUSH13: case PUSH14: case PUSH15: case PUSH16: - case PUSH17: case PUSH18: case PUSH19: case PUSH20: - case PUSH21: case PUSH22: case PUSH23: case PUSH24: - case PUSH25: case PUSH26: case PUSH27: case PUSH28: - case PUSH29: case PUSH30: case PUSH31: case PUSH32: { - program.step(); - int nPush = op.val() - PUSH1.val() + 1; - - byte[] data = program.sweep(nPush); - - program.stackPush(data); - break; - } - case JUMPDEST: { - program.step(); - } - break; - case CREATE: { - if (program.isStaticCall()) { - throw new Program.StaticCallModificationException(); - } - - DataWord value = program.stackPop(); - DataWord inOffset = program.stackPop(); - DataWord inSize = program.stackPop(); - - program.createContract(value, inOffset, inSize); - program.step(); - } - break; - case CREATE2: { - if (program.isStaticCall()) { - throw new Program.StaticCallModificationException(); - } - - DataWord value = program.stackPop(); - DataWord inOffset = program.stackPop(); - DataWord inSize = program.stackPop(); - DataWord salt = program.stackPop(); - - program.createContract2(value, inOffset, inSize, salt); - program.step(); - } - break; - case TOKENBALANCE: { - DataWord tokenId = program.stackPop(); - DataWord address = program.stackPop(); - DataWord tokenBalance = program.getTokenBalance(address, tokenId); - - program.stackPush(tokenBalance); - program.step(); - } - break; - case CALL: - case CALLCODE: - case CALLTOKEN: - case DELEGATECALL: - case STATICCALL: { - program.stackPop(); // use adjustedCallEnergy instead of requested - DataWord codeAddress = program.stackPop(); - - DataWord value; - if (op.callHasValue()) { - value = program.stackPop(); - } else { - value = DataWord.ZERO; - } - - if (program.isStaticCall() && (op == CALL || op == CALLTOKEN) && !value.isZero()) { - throw new Program.StaticCallModificationException(); - } - - if (!value.isZero()) { - adjustedCallEnergy.add(new DataWord(energyCosts.getStipendCall())); - } - - DataWord tokenId = new DataWord(0); - boolean isTokenTransferMsg = false; - if (op == CALLTOKEN) { - tokenId = program.stackPop(); - if (VMConfig.allowMultiSign()) { // allowMultiSign proposal - isTokenTransferMsg = true; - } - } - - DataWord inDataOffs = program.stackPop(); - DataWord inDataSize = program.stackPop(); - - DataWord outDataOffs = program.stackPop(); - DataWord outDataSize = program.stackPop(); - - program.memoryExpand(outDataOffs, outDataSize); - - MessageCall msg = new MessageCall( - op, adjustedCallEnergy, codeAddress, value, inDataOffs, inDataSize, - outDataOffs, outDataSize, tokenId, isTokenTransferMsg); - - PrecompiledContracts.PrecompiledContract contract = - PrecompiledContracts.getContractForAddress(codeAddress); - - if (!op.callIsStateless()) { - program.getResult().addTouchAccount(codeAddress.getLast20Bytes()); - } - - if (contract != null) { - program.callToPrecompiledAddress(msg, contract); - } else { - program.callToAddress(msg); - } - - program.step(); - } - break; - case FREEZE: { - if (VMConfig.allowTvmVote() && program.isStaticCall()) { // after allow vote, check static - throw new Program.StaticCallModificationException(); - } - - DataWord resourceType = program.stackPop(); // 0 as bandwidth, 1 as energy. - DataWord frozenBalance = program.stackPop(); - DataWord receiverAddress = program.stackPop(); - - boolean result = program.freeze(receiverAddress, frozenBalance, resourceType ); - program.stackPush(result ? DataWord.ONE() : DataWord.ZERO()); - program.step(); - } - break; - case UNFREEZE: { - if (VMConfig.allowTvmVote() && program.isStaticCall()) { // after allow vote, check static - throw new Program.StaticCallModificationException(); - } - - DataWord resourceType = program.stackPop(); // 0 as bandwidth, 1 as energy. - DataWord receiverAddress = program.stackPop(); - - boolean result = program.unfreeze(receiverAddress, resourceType); - program.stackPush(result ? DataWord.ONE() : DataWord.ZERO()); - program.step(); + while (!program.isStopped()) { + if (VMConfig.vmTrace()) { + program.saveOpTrace(); } - break; - case FREEZEEXPIRETIME: { - DataWord resourceType = program.stackPop(); // 0 as bandwidth, 1 as energy. - DataWord targetAddress = program.stackPop(); - long expireTime = program.freezeExpireTime(targetAddress, resourceType); - program.stackPush(new DataWord(expireTime / 1000)); - program.step(); - } - break; - case VOTEWITNESS: { - if (program.isStaticCall()) { - throw new Program.StaticCallModificationException(); + try { + Operation op = OperationRegistry.get(program.getCurrentOpIntValue()); + if (op == null) { + throw Program.Exception.invalidOpCode(program.getCurrentOp()); } + program.setLastOp((byte) op.getOpcode()); - int amountArrayLength = program.stackPop().intValueSafe(); - int amountArrayOffset = program.stackPop().intValueSafe(); - int witnessArrayLength = program.stackPop().intValueSafe(); - int witnessArrayOffset = program.stackPop().intValueSafe(); + /* stack underflow/overflow check */ + program.verifyStackSize(op.getRequire()); + program.verifyStackOverflow(op.getRequire(), op.getRet()); - boolean result = program.voteWitness(witnessArrayOffset, witnessArrayLength, - amountArrayOffset, amountArrayLength); - program.stackPush(result ? DataWord.ONE() : DataWord.ZERO()); - program.step(); - } - break; - case WITHDRAWREWARD: { - if (program.isStaticCall()) { - throw new Program.StaticCallModificationException(); - } + String opName = Op.getNameOf(op.getOpcode()); + /* spend energy before execution */ + program.spendEnergy(op.getEnergyCost(program), opName); - long allowance = program.withdrawReward(); - program.stackPush(new DataWord(allowance)); - program.step(); - } - break; - case RETURN: - case REVERT: { - DataWord offset = program.stackPop(); - DataWord size = program.stackPop(); + /* check if cpu time out */ + program.checkCPUTimeLimit(opName); - byte[] hReturn = program.memoryChunk(offset.intValueSafe(), size.intValueSafe()); - program.setHReturn(hReturn); - - program.step(); - program.stop(); - - if (op == REVERT) { - program.getResult().setRevert(); - } - } - break; - case SUICIDE: { - if (program.isStaticCall()) { - throw new Program.StaticCallModificationException(); - } + /* exec op action */ + op.execute(program); - if (!program.canSuicide()) { - program.getResult().setRevert(); - } else { - DataWord address = program.stackPop(); - program.suicide(address); - program.getResult().addTouchAccount(address.getLast20Bytes()); + program.setPreviouslyExecutedOp((byte) op.getOpcode()); + } catch (RuntimeException e) { + logger.info("VM halted: [{}]", e.getMessage()); + if (!(e instanceof TransferException)) { + program.spendAllEnergy(); } - + //program.resetFutureRefund(); program.stop(); + throw e; + } finally { + program.fullTrace(); } - break; - default: - break; - } - - program.setPreviouslyExecutedOp(op.val()); - } catch (RuntimeException e) { - logger.info("VM halted: [{}]", e.getMessage()); - if (!(e instanceof TransferException)) { - program.spendAllEnergy(); - } - program.resetFutureRefund(); - program.stop(); - throw e; - } finally { - program.fullTrace(); - } - } - - public void play(Program program) { - try { - if (program.byTestingSuite()) { - return; } - - while (!program.isStopped()) { - this.step(program); - } - } catch (JVMStackOverFlowException | OutOfTimeException e) { throw e; } catch (RuntimeException e) { @@ -1298,9 +68,4 @@ public void play(Program program) { throw new JVMStackOverFlowException(); } } - - private boolean isDeadAccount(Program program, DataWord address) { - return program.getContractState().getAccount(convertToTronAddress(address.getLast20Bytes())) - == null; - } } diff --git a/actuator/src/main/java/org/tron/core/vm/VMConstant.java b/actuator/src/main/java/org/tron/core/vm/VMConstant.java index 7b73efbfcdf..4e7f6b29e3f 100644 --- a/actuator/src/main/java/org/tron/core/vm/VMConstant.java +++ b/actuator/src/main/java/org/tron/core/vm/VMConstant.java @@ -4,12 +4,11 @@ public class VMConstant { public static final int CONTRACT_NAME_LENGTH = 32; public static final int MIN_TOKEN_ID = 1_000_000; + // Numbers public static final int ONE_HUNDRED = 100; public static final int ONE_THOUSAND = 1000; - public static final long SUN_PER_ENERGY = 100; // 1 us = 100 SUN = 100 * 10^-6 TRX - public static final long ENERGY_LIMIT_IN_CONSTANT_TX = 3_000_000L; // ref: 1 us = 1 energy - + public static final long SUN_PER_ENERGY = 100; private VMConstant() { } diff --git a/actuator/src/main/java/org/tron/core/vm/VMUtils.java b/actuator/src/main/java/org/tron/core/vm/VMUtils.java index a29366ff3f7..7d080b23b37 100644 --- a/actuator/src/main/java/org/tron/core/vm/VMUtils.java +++ b/actuator/src/main/java/org/tron/core/vm/VMUtils.java @@ -1,20 +1,3 @@ -/* - * Copyright (c) [2016] [ ] - * This file is part of the ethereumJ library. - * - * The ethereumJ library is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * The ethereumJ library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with the ethereumJ library. If not, see . - */ package org.tron.core.vm; import static java.lang.String.format; @@ -42,7 +25,6 @@ import org.tron.core.vm.config.VMConfig; import org.tron.core.vm.repository.Repository; - @Slf4j(topic = "VM") public final class VMUtils { diff --git a/actuator/src/main/java/org/tron/core/vm/config/ConfigLoader.java b/actuator/src/main/java/org/tron/core/vm/config/ConfigLoader.java index 00f2bacedfc..88dbba7372a 100644 --- a/actuator/src/main/java/org/tron/core/vm/config/ConfigLoader.java +++ b/actuator/src/main/java/org/tron/core/vm/config/ConfigLoader.java @@ -1,12 +1,12 @@ package org.tron.core.vm.config; - import static org.tron.core.capsule.ReceiptCapsule.checkForEnergyLimit; import lombok.extern.slf4j.Slf4j; import org.tron.common.parameter.CommonParameter; import org.tron.core.store.DynamicPropertiesStore; import org.tron.core.store.StoreFactory; +import org.tron.core.vm.OperationRegistry; @Slf4j(topic = "VMConfigLoader") public class ConfigLoader { @@ -15,7 +15,9 @@ public class ConfigLoader { public static boolean disable = false; public static void load(StoreFactory storeFactory) { - if (!disable) { + if (disable) { + OperationRegistry.clearOperations(); + } else { DynamicPropertiesStore ds = storeFactory.getChainBaseManager().getDynamicPropertiesStore(); VMConfig.setVmTrace(CommonParameter.getInstance().isVmTrace()); if (ds != null) { @@ -32,5 +34,34 @@ public static void load(StoreFactory storeFactory) { VMConfig.initAllowTvmCompatibleEvm(ds.getAllowTvmCompatibleEvm()); } } + OperationRegistry.newBaseOperation(); + + if (VMConfig.allowTvmTransferTrc10()) { + OperationRegistry.newAllowTvmTransferTrc10Operation(); + } + + if (VMConfig.allowTvmConstantinople()) { + OperationRegistry.newAllowTvmConstantinopleOperation(); + } + + if (VMConfig.allowTvmSolidity059()) { + OperationRegistry.newAllowTvmSolidity059Operation(); + } + + if (VMConfig.allowTvmIstanbul()) { + OperationRegistry.newAllowTvmIstanbulOperation(); + } + + if (VMConfig.allowTvmFreeze()) { + OperationRegistry.newAllowTvmFreezeOperation(); + } + + if (VMConfig.allowTvmVote()) { + OperationRegistry.newAllowTvmVoteOperation(); + } + + if (VMConfig.allowTvmLondon()) { + OperationRegistry.newAllowTvmLondonOperation(); + } } } diff --git a/actuator/src/main/java/org/tron/core/vm/config/VMConfig.java b/actuator/src/main/java/org/tron/core/vm/config/VMConfig.java index 9d4b9ab27c9..1eb91e15796 100644 --- a/actuator/src/main/java/org/tron/core/vm/config/VMConfig.java +++ b/actuator/src/main/java/org/tron/core/vm/config/VMConfig.java @@ -1,35 +1,13 @@ -/* - * Copyright (c) [2016] [ ] - * This file is part of the ethereumJ library. - * - * The ethereumJ library is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * The ethereumJ library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with the ethereumJ library. If not, see . - */ package org.tron.core.vm.config; - -import static org.tron.common.parameter.CommonParameter.ENERGY_LIMIT_HARD_FORK; - import lombok.Setter; +import org.tron.common.parameter.CommonParameter; /** * For developer only */ public class VMConfig { - //1000 TRX - //public static final int MAX_FEE_LIMIT = 1_000_000_000; - private static boolean vmTraceCompressed = false; @Setter @@ -58,10 +36,6 @@ public class VMConfig { private VMConfig() { } - public static VMConfig getInstance() { - return SystemPropertiesInstance.INSTANCE; - } - public static boolean vmTrace() { return vmTrace; } @@ -71,7 +45,7 @@ public static boolean vmTraceCompressed() { } public static void initVmHardFork(boolean pass) { - ENERGY_LIMIT_HARD_FORK = pass; + CommonParameter.ENERGY_LIMIT_HARD_FORK = pass; } public static void initAllowMultiSign(long allow) { @@ -115,7 +89,7 @@ public static void initAllowTvmCompatibleEvm(long allow) { } public static boolean getEnergyLimitHardFork() { - return ENERGY_LIMIT_HARD_FORK; + return CommonParameter.ENERGY_LIMIT_HARD_FORK; } public static boolean allowTvmTransferTrc10() { @@ -157,9 +131,4 @@ public static boolean allowTvmLondon() { public static boolean allowTvmCompatibleEvm() { return ALLOW_TVM_COMPATIBLE_EVM; } - - private static class SystemPropertiesInstance { - - private static final VMConfig INSTANCE = new VMConfig(); - } } diff --git a/actuator/src/main/java/org/tron/core/vm/nativecontract/FreezeBalanceProcessor.java b/actuator/src/main/java/org/tron/core/vm/nativecontract/FreezeBalanceProcessor.java index deab57ea0b3..9a1af3c9cec 100644 --- a/actuator/src/main/java/org/tron/core/vm/nativecontract/FreezeBalanceProcessor.java +++ b/actuator/src/main/java/org/tron/core/vm/nativecontract/FreezeBalanceProcessor.java @@ -9,14 +9,13 @@ import org.tron.common.utils.FastByteComparisons; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.DelegatedResourceCapsule; -import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.core.store.DynamicPropertiesStore; import org.tron.core.vm.nativecontract.param.FreezeBalanceParam; import org.tron.core.vm.repository.Repository; import org.tron.protos.Protocol; -@Slf4j(topic = "Processor") +@Slf4j(topic = "VMProcessor") public class FreezeBalanceProcessor { public void validate(FreezeBalanceParam param, Repository repo) throws ContractValidateException { diff --git a/actuator/src/main/java/org/tron/core/vm/nativecontract/UnfreezeBalanceProcessor.java b/actuator/src/main/java/org/tron/core/vm/nativecontract/UnfreezeBalanceProcessor.java index e9017a279ff..0eda888d3ca 100644 --- a/actuator/src/main/java/org/tron/core/vm/nativecontract/UnfreezeBalanceProcessor.java +++ b/actuator/src/main/java/org/tron/core/vm/nativecontract/UnfreezeBalanceProcessor.java @@ -19,7 +19,7 @@ import org.tron.core.vm.utils.VoteRewardUtil; import org.tron.protos.Protocol; -@Slf4j(topic = "Processor") +@Slf4j(topic = "VMProcessor") public class UnfreezeBalanceProcessor { public void validate(UnfreezeBalanceParam param, Repository repo) diff --git a/actuator/src/main/java/org/tron/core/vm/nativecontract/VoteWitnessProcessor.java b/actuator/src/main/java/org/tron/core/vm/nativecontract/VoteWitnessProcessor.java index 2af4d690684..ddc28bc2a41 100644 --- a/actuator/src/main/java/org/tron/core/vm/nativecontract/VoteWitnessProcessor.java +++ b/actuator/src/main/java/org/tron/core/vm/nativecontract/VoteWitnessProcessor.java @@ -1,6 +1,7 @@ package org.tron.core.vm.nativecontract; import static org.tron.core.actuator.ActuatorConstant.NOT_EXIST_STR; +import static org.tron.core.actuator.ActuatorConstant.STORE_NOT_EXIST; import static org.tron.core.actuator.ActuatorConstant.WITNESS_EXCEPTION_STR; import static org.tron.core.config.Parameter.ChainConstant.MAX_VOTE_NUMBER; import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION; @@ -14,7 +15,6 @@ import lombok.extern.slf4j.Slf4j; import org.tron.common.utils.StringUtil; -import static org.tron.core.actuator.ActuatorConstant.*; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.VotesCapsule; import org.tron.core.exception.ContractExeException; @@ -24,7 +24,7 @@ import org.tron.core.vm.utils.VoteRewardUtil; import org.tron.protos.Protocol; -@Slf4j(topic = "Processor") +@Slf4j(topic = "VMProcessor") public class VoteWitnessProcessor { public void validate(VoteWitnessParam param, Repository repo) throws ContractValidateException { diff --git a/actuator/src/main/java/org/tron/core/vm/nativecontract/WithdrawRewardProcessor.java b/actuator/src/main/java/org/tron/core/vm/nativecontract/WithdrawRewardProcessor.java index 0f2cd150026..577e51e379a 100644 --- a/actuator/src/main/java/org/tron/core/vm/nativecontract/WithdrawRewardProcessor.java +++ b/actuator/src/main/java/org/tron/core/vm/nativecontract/WithdrawRewardProcessor.java @@ -15,7 +15,7 @@ import org.tron.core.vm.repository.Repository; import org.tron.core.vm.utils.VoteRewardUtil; -@Slf4j(topic = "Processor") +@Slf4j(topic = "VMProcessor") public class WithdrawRewardProcessor { public void validate(WithdrawRewardParam param, Repository repo) throws ContractValidateException { diff --git a/actuator/src/main/java/org/tron/core/vm/nativecontract/param/VoteWitnessParam.java b/actuator/src/main/java/org/tron/core/vm/nativecontract/param/VoteWitnessParam.java index 435779f9ca8..6f831987519 100644 --- a/actuator/src/main/java/org/tron/core/vm/nativecontract/param/VoteWitnessParam.java +++ b/actuator/src/main/java/org/tron/core/vm/nativecontract/param/VoteWitnessParam.java @@ -1,12 +1,12 @@ package org.tron.core.vm.nativecontract.param; import com.google.protobuf.ByteString; -import org.tron.common.utils.StringUtil; -import org.tron.protos.Protocol; - import java.util.ArrayList; import java.util.List; +import org.tron.common.utils.StringUtil; +import org.tron.protos.Protocol; + /** * Param used by VoteWitnessProcessor */ diff --git a/actuator/src/main/java/org/tron/core/vm/program/ContractState.java b/actuator/src/main/java/org/tron/core/vm/program/ContractState.java index 980921ddf02..458d83f5110 100644 --- a/actuator/src/main/java/org/tron/core/vm/program/ContractState.java +++ b/actuator/src/main/java/org/tron/core/vm/program/ContractState.java @@ -1,26 +1,18 @@ -/* - * Copyright (c) [2016] [ ] - * This file is part of the ethereumJ library. - * - * The ethereumJ library is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * The ethereumJ library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with the ethereumJ library. If not, see . - */ package org.tron.core.vm.program; - import org.tron.common.runtime.vm.DataWord; -import org.tron.core.capsule.*; -import org.tron.core.store.*; +import org.tron.core.capsule.AccountCapsule; +import org.tron.core.capsule.AssetIssueCapsule; +import org.tron.core.capsule.BlockCapsule; +import org.tron.core.capsule.BytesCapsule; +import org.tron.core.capsule.ContractCapsule; +import org.tron.core.capsule.DelegatedResourceCapsule; +import org.tron.core.capsule.VotesCapsule; +import org.tron.core.capsule.WitnessCapsule; +import org.tron.core.store.AssetIssueStore; +import org.tron.core.store.AssetIssueV2Store; +import org.tron.core.store.DelegationStore; +import org.tron.core.store.DynamicPropertiesStore; import org.tron.core.vm.program.invoke.ProgramInvoke; import org.tron.core.vm.program.listener.ProgramListener; import org.tron.core.vm.program.listener.ProgramListenerAware; diff --git a/actuator/src/main/java/org/tron/core/vm/program/Memory.java b/actuator/src/main/java/org/tron/core/vm/program/Memory.java index 58f4f7651ad..e5cbebad2b9 100644 --- a/actuator/src/main/java/org/tron/core/vm/program/Memory.java +++ b/actuator/src/main/java/org/tron/core/vm/program/Memory.java @@ -1,20 +1,3 @@ -/* - * Copyright (c) [2016] [ ] - * This file is part of the ethereumJ library. - * - * The ethereumJ library is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * The ethereumJ library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with the ethereumJ library. If not, see . - */ package org.tron.core.vm.program; import static java.lang.Math.ceil; diff --git a/actuator/src/main/java/org/tron/core/vm/program/Program.java b/actuator/src/main/java/org/tron/core/vm/program/Program.java index fc22f708e5f..b68efe29ebe 100644 --- a/actuator/src/main/java/org/tron/core/vm/program/Program.java +++ b/actuator/src/main/java/org/tron/core/vm/program/Program.java @@ -1,21 +1,3 @@ -/* - * Copyright (c) [2016] [ ] - * This file is part of the ethereumJ library. - * - * The ethereumJ library is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * The ethereumJ library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with the ethereumJ library. If not, see . - */ - package org.tron.core.vm.program; import static java.lang.StrictMath.min; @@ -29,15 +11,11 @@ import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION; import com.google.protobuf.ByteString; -import java.io.ByteArrayOutputStream; import java.math.BigInteger; import java.util.Arrays; -import java.util.BitSet; import java.util.HashMap; import java.util.Map; -import java.util.NavigableSet; import java.util.Objects; -import java.util.TreeSet; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.tuple.Pair; @@ -58,14 +36,13 @@ import org.tron.core.capsule.DelegatedResourceCapsule; import org.tron.core.capsule.VotesCapsule; import org.tron.core.capsule.WitnessCapsule; -import org.tron.core.db.TransactionTrace; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.core.exception.TronException; import org.tron.core.utils.TransactionUtil; import org.tron.core.vm.EnergyCost; import org.tron.core.vm.MessageCall; -import org.tron.core.vm.OpCode; +import org.tron.core.vm.Op; import org.tron.core.vm.PrecompiledContracts; import org.tron.core.vm.VM; import org.tron.core.vm.VMConstant; @@ -81,7 +58,6 @@ import org.tron.core.vm.nativecontract.param.WithdrawRewardParam; import org.tron.core.vm.program.invoke.ProgramInvoke; import org.tron.core.vm.program.invoke.ProgramInvokeFactory; -import org.tron.core.vm.program.invoke.ProgramInvokeFactoryImpl; import org.tron.core.vm.program.listener.CompositeProgramListener; import org.tron.core.vm.program.listener.ProgramListenerAware; import org.tron.core.vm.program.listener.ProgramStorageChangeListener; @@ -96,11 +72,6 @@ import org.tron.protos.contract.SmartContractOuterClass.SmartContract; import org.tron.protos.contract.SmartContractOuterClass.SmartContract.Builder; -/** - * @author Roman Mandeleil - * @since 01.06.2014 - */ - @Slf4j(topic = "VM") public class Program { @@ -112,12 +83,10 @@ public class Program { private static final String INVALID_TOKEN_ID_MSG = "not valid token id"; private static final String REFUND_ENERGY_FROM_MESSAGE_CALL = "refund energy from message call"; private static final String CALL_PRE_COMPILED = "call pre-compiled"; - private final VMConfig config; private long nonce; private byte[] rootTransactionId; private InternalTransaction internalTransaction; private ProgramInvoke invoke; - private ProgramInvokeFactory programInvokeFactory = new ProgramInvokeFactoryImpl(); private ProgramOutListener listener; private ProgramTraceListener traceListener; private ProgramStorageChangeListener storageDiffListener = new ProgramStorageChangeListener(); @@ -135,6 +104,7 @@ public class Program { private boolean stopped; private ProgramPrecompile programPrecompile; private int contractVersion; + private DataWord adjustedCallEnergy; public Program(byte[] ops, ProgramInvoke programInvoke) { @@ -142,21 +112,15 @@ public Program(byte[] ops, ProgramInvoke programInvoke) { } public Program(byte[] ops, ProgramInvoke programInvoke, InternalTransaction internalTransaction) { - this(ops, programInvoke, internalTransaction, VMConfig.getInstance()); - } - - public Program(byte[] ops, ProgramInvoke programInvoke, InternalTransaction internalTransaction, - VMConfig config) { - this.config = config; this.invoke = programInvoke; this.internalTransaction = internalTransaction; this.ops = nullToEmpty(ops); - traceListener = new ProgramTraceListener(config.vmTrace()); + traceListener = new ProgramTraceListener(VMConfig.vmTrace()); this.memory = setupProgramListener(new Memory()); this.stack = setupProgramListener(new Stack()); this.contractState = setupProgramListener(new ContractState(programInvoke)); - this.trace = new ProgramTrace(config, programInvoke); + this.trace = new ProgramTrace(programInvoke); this.nonce = internalTransaction.getNonce(); } @@ -171,135 +135,6 @@ static String formatBinData(byte[] binData, int startPC) { return ret.toString(); } - public static String stringifyMultiline(byte[] code) { - int index = 0; - StringBuilder sb = new StringBuilder(); - BitSet mask = buildReachableBytecodesMask(code); - ByteArrayOutputStream binData = new ByteArrayOutputStream(); - int binDataStartPC = -1; - - while (index < code.length) { - final byte opCode = code[index]; - OpCode op = OpCode.code(opCode); - - if (!mask.get(index)) { - if (binDataStartPC == -1) { - binDataStartPC = index; - } - binData.write(code[index]); - index++; - if (index < code.length) { - continue; - } - } - - if (binDataStartPC != -1) { - sb.append(formatBinData(binData.toByteArray(), binDataStartPC)); - binDataStartPC = -1; - binData = new ByteArrayOutputStream(); - if (index == code.length) { - continue; - } - } - - sb.append(Utils.align("" + Integer.toHexString(index) + ":", ' ', 8, false)); - - if (op == null) { - sb.append(": ").append(0xFF & opCode).append("\n"); - index++; - continue; - } - - if (op.name().startsWith("PUSH")) { - sb.append(' ').append(op.name()).append(' '); - - int nPush = op.val() - OpCode.PUSH1.val() + 1; - byte[] data = Arrays.copyOfRange(code, index + 1, index + nPush + 1); - BigInteger bi = new BigInteger(1, data); - sb.append("0x").append(bi.toString(16)); - if (bi.bitLength() <= 32) { - sb.append(" (").append(new BigInteger(1, data).toString()).append(") "); - } - - index += nPush + 1; - } else { - sb.append(' ').append(op.name()); - index++; - } - sb.append('\n'); - } - - return sb.toString(); - } - - static BitSet buildReachableBytecodesMask(byte[] code) { - NavigableSet gotos = new TreeSet<>(); - ByteCodeIterator it = new ByteCodeIterator(code); - BitSet ret = new BitSet(code.length); - int lastPush = 0; - int lastPushPC = 0; - do { - ret.set(it.getPC()); // reachable bytecode - if (it.isPush()) { - lastPush = new BigInteger(1, it.getCurOpcodeArg()).intValue(); - lastPushPC = it.getPC(); - } - if (it.getCurOpcode() == OpCode.JUMP || it.getCurOpcode() == OpCode.JUMPI) { - if (it.getPC() != lastPushPC + 1) { - // some PC arithmetic we totally can't deal with - // assuming all bytecodes are reachable as a fallback - ret.set(0, code.length); - return ret; - } - int jumpPC = lastPush; - if (!ret.get(jumpPC)) { - // code was not explored yet - gotos.add(jumpPC); - } - } - if (it.getCurOpcode() == OpCode.JUMP || it.getCurOpcode() == OpCode.RETURN - || it.getCurOpcode() == OpCode.STOP) { - if (gotos.isEmpty()) { - break; - } - it.setPC(gotos.pollFirst()); - } - } while (it.next()); - return ret; - } - - public static String stringify(byte[] code) { - int index = 0; - StringBuilder sb = new StringBuilder(); - - while (index < code.length) { - final byte opCode = code[index]; - OpCode op = OpCode.code(opCode); - - if (op == null) { - sb.append(" : ").append(0xFF & opCode).append(" "); - index++; - continue; - } - - if (op.name().startsWith("PUSH")) { - sb.append(' ').append(op.name()).append(' '); - - int nPush = op.val() - OpCode.PUSH1.val() + 1; - byte[] data = Arrays.copyOfRange(code, index + 1, index + nPush + 1); - BigInteger bi = new BigInteger(1, data); - sb.append("0x").append(bi.toString(16)).append(" "); - - index += nPush + 1; - } else { - sb.append(' ').append(op.name()); - index++; - } - } - - return sb.toString(); - } - public byte[] getRootTransactionId() { return rootTransactionId.clone(); } @@ -316,6 +151,14 @@ public int getContractVersion() { return this.contractVersion; } + public void setAdjustedCallEnergy(DataWord adjustedCallEnergy) { + this.adjustedCallEnergy = adjustedCallEnergy; + } + + public DataWord getAdjustedCallEnergy() { + return this.adjustedCallEnergy; + } + public long getNonce() { return nonce; } @@ -376,6 +219,10 @@ public byte getCurrentOp() { return isEmpty(ops) ? 0 : ops[pc]; } + public int getCurrentOpIntValue() { + return getCurrentOp() & 0xff; + } + /** * Last Op can only be set publicly (no getLastOp method), is used for logging. */ @@ -407,12 +254,11 @@ public void stackPush(DataWord stackWord) { } public void stackPushZero() { - stackPush(new DataWord(0)); + stackPush(DataWord.ZERO()); } public void stackPushOne() { - DataWord stackWord = new DataWord(1); - stackPush(stackWord); + stackPush(DataWord.ONE()); } public Stack getStack() { @@ -546,8 +392,8 @@ public void allocateMemory(int offset, int size) { public void suicide(DataWord obtainerAddress) { - byte[] owner = TransactionTrace.convertToTronAddress(getContractAddress().getLast20Bytes()); - byte[] obtainer = TransactionTrace.convertToTronAddress(obtainerAddress.getLast20Bytes()); + byte[] owner = getContextAddress(); + byte[] obtainer = obtainerAddress.toTronAddress(); if (VMConfig.allowTvmVote()) { withdrawRewardAndCancelVote(owner, getContractState()); @@ -661,7 +507,7 @@ private void withdrawRewardAndCancelVote(byte[] owner, Repository repo) { } public boolean canSuicide() { - byte[] owner = TransactionTrace.convertToTronAddress(getContractAddress().getLast20Bytes()); + byte[] owner = getContextAddress(); AccountCapsule accountCapsule = getContractState().getAccount(owner); return !VMConfig.allowTvmFreeze() || (accountCapsule.getDelegatedFrozenBalanceForBandwidth() == 0 @@ -693,8 +539,7 @@ public void createContract(DataWord value, DataWord memStart, DataWord memSize) private void createContractImpl(DataWord value, byte[] programCode, byte[] newAddress, boolean isCreate2) { - byte[] senderAddress = TransactionTrace - .convertToTronAddress(this.getContractAddress().getLast20Bytes()); + byte[] senderAddress = getContextAddress(); if (logger.isDebugEnabled()) { logger.debug("creating a new contract inside contract run: [{}]", @@ -777,9 +622,9 @@ private void createContractImpl(DataWord value, byte[] programCode, byte[] newAd InternalTransaction internalTx = addInternalTx(null, senderAddress, newAddress, endowment, programCode, "create", nonce, null); long vmStartInUs = System.nanoTime() / 1000; - ProgramInvoke programInvoke = programInvokeFactory.createProgramInvoke( - this, new DataWord(newAddress), getContractAddress(), value, new DataWord(0), - new DataWord(0), + ProgramInvoke programInvoke = ProgramInvokeFactory.createProgramInvoke( + this, new DataWord(newAddress), getContractAddress(), value, DataWord.ZERO(), + DataWord.ZERO(), newBalance, null, deposit, false, byTestingSuite(), vmStartInUs, getVmShouldEndInUs(), energyLimit.longValueSafe()); if (isConstantCall()) { @@ -792,13 +637,12 @@ this, new DataWord(newAddress), getContractAddress(), value, new DataWord(0), "Trying to create a contract with existing contract address: 0x" + Hex .toHexString(newAddress))); } else if (isNotEmpty(programCode)) { - VM vm = new VM(config); - Program program = new Program(programCode, programInvoke, internalTx, config); + Program program = new Program(programCode, programInvoke, internalTx); program.setRootTransactionId(this.rootTransactionId); if (VMConfig.allowTvmCompatibleEvm()) { program.setContractVersion(getContractVersion()); } - vm.play(program); + VM.play(program); createResult = program.getResult(); getTrace().merge(program.getTrace()); // always commit nonce @@ -809,12 +653,12 @@ this, new DataWord(newAddress), getContractAddress(), value, new DataWord(0), // 4. CREATE THE CONTRACT OUT OF RETURN byte[] code = createResult.getHReturn(); - if (code.length != 0 && config.allowTvmLondon() && code[0] == (byte) 0xEF) { - createResult.setException(Program.Exception - .invalidCodeException()); + if (code.length != 0 && VMConfig.allowTvmLondon() && code[0] == (byte) 0xEF) { + createResult.setException(Program.Exception + .invalidCodeException()); } - long saveCodeEnergy = (long) getLength(code) * EnergyCost.getInstance().getCREATE_DATA(); + long saveCodeEnergy = (long) getLength(code) * EnergyCost.getCreateData(); long afterSpend = programInvoke.getEnergyLimit() - createResult.getEnergyUsed() - saveCodeEnergy; @@ -869,9 +713,7 @@ public void refundEnergyAfterVM(DataWord energyLimit, ProgramResult result) { refundEnergy(refundEnergy, "remain energy from the internal call"); if (logger.isDebugEnabled()) { logger.debug("The remaining energy is refunded, account: [{}], energy: [{}] ", - Hex.toHexString( - TransactionTrace.convertToTronAddress(getContractAddress().getLast20Bytes())), - refundEnergy); + Hex.toHexString(getContextAddress()), refundEnergy); } } } @@ -896,19 +738,24 @@ public void callToAddress(MessageCall msg) { byte[] data = memoryChunk(msg.getInDataOffs().intValue(), msg.getInDataSize().intValue()); // FETCH THE SAVED STORAGE - byte[] codeAddress = TransactionTrace - .convertToTronAddress(msg.getCodeAddress().getLast20Bytes()); - byte[] senderAddress = TransactionTrace - .convertToTronAddress(getContractAddress().getLast20Bytes()); - byte[] contextAddress = msg.getType().callIsStateless() ? senderAddress : codeAddress; + byte[] codeAddress = msg.getCodeAddress().toTronAddress(); + byte[] senderAddress = getContextAddress(); + + byte[] contextAddress; + if (msg.getOpCode() == Op.CALLCODE || msg.getOpCode() == Op.DELEGATECALL) { + contextAddress = senderAddress; + } else { + contextAddress = codeAddress; + } if (logger.isDebugEnabled()) { - logger.debug(msg.getType().name() + logger.debug(Op.getNameOf(msg.getOpCode()) + " for existing contract: address: [{}], outDataOffs: [{}], outDataSize: [{}] ", Hex.toHexString(contextAddress), msg.getOutDataOffs().longValue(), msg.getOutDataSize().longValue()); } + Repository deposit = getContractState().newRepositoryChild(); // 2.1 PERFORM THE VALUE (endowment) PART @@ -1005,26 +852,31 @@ public void callToAddress(MessageCall msg) { ProgramResult callResult = null; if (isNotEmpty(programCode)) { long vmStartInUs = System.nanoTime() / 1000; - DataWord callValue = msg.getType().callIsDelegate() ? getCallValue() : msg.getEndowment(); - ProgramInvoke programInvoke = programInvokeFactory.createProgramInvoke( + DataWord callValue; + if (msg.getOpCode() == Op.DELEGATECALL) { + callValue = getCallValue(); + } else { + callValue = msg.getEndowment(); + } + ProgramInvoke programInvoke = ProgramInvokeFactory.createProgramInvoke( this, new DataWord(contextAddress), - msg.getType().callIsDelegate() ? getCallerAddress() : getContractAddress(), - !isTokenTransfer ? callValue : new DataWord(0), - !isTokenTransfer ? new DataWord(0) : callValue, - !isTokenTransfer ? new DataWord(0) : msg.getTokenId(), - contextBalance, data, deposit, msg.getType().callIsStatic() || isStaticCall(), + msg.getOpCode() == Op.DELEGATECALL ? getCallerAddress() : getContractAddress(), + !isTokenTransfer ? callValue : DataWord.ZERO(), + !isTokenTransfer ? DataWord.ZERO() : callValue, + !isTokenTransfer ? DataWord.ZERO() : msg.getTokenId(), + contextBalance, data, deposit, + msg.getOpCode() == Op.STATICCALL || isStaticCall(), byTestingSuite(), vmStartInUs, getVmShouldEndInUs(), msg.getEnergy().longValueSafe()); if (isConstantCall()) { programInvoke.setConstantCall(); } - VM vm = new VM(config); - Program program = new Program(programCode, programInvoke, internalTx, config); + Program program = new Program(programCode, programInvoke, internalTx); program.setRootTransactionId(this.rootTransactionId); if (VMConfig.allowTvmCompatibleEvm()) { program.setContractVersion( invoke.getDeposit().getContract(codeAddress).getContractVersion()); } - vm.play(program); + VM.play(program); callResult = program.getResult(); getTrace().merge(program.getTrace()); @@ -1036,10 +888,7 @@ this, new DataWord(contextAddress), logger.debug("contract run halted by Exception: contract: [{}], exception: [{}]", Hex.toHexString(contextAddress), callResult.getException()); - - if(internalTx != null){ - internalTx.reject(); - } + internalTx.reject(); callResult.rejectInternalTransactions(); @@ -1140,22 +989,19 @@ public void refundEnergy(long energyValue, String cause) { getResult().refundEnergy(energyValue); } - public void futureRefundEnergy(long energyValue) { - logger.debug("Future refund added: [{}]", energyValue); - getResult().addFutureRefund(energyValue); - } - - public void resetFutureRefund() { - getResult().resetFutureRefund(); - } +// public void futureRefundEnergy(long energyValue) { +// logger.debug("Future refund added: [{}]", energyValue); +// getResult().addFutureRefund(energyValue); +// } +// +// public void resetFutureRefund() { +// getResult().resetFutureRefund(); +// } public void storageSave(DataWord word1, DataWord word2) { DataWord keyWord = word1.clone(); DataWord valWord = word2.clone(); - getContractState() - .putStorageValue( - TransactionTrace.convertToTronAddress(getContractAddress().getLast20Bytes()), keyWord, - valWord); + getContractState().putStorageValue(getContextAddress(), keyWord, valWord); } public byte[] getCode() { @@ -1163,13 +1009,12 @@ public byte[] getCode() { } public byte[] getCodeAt(DataWord address) { - byte[] code = invoke.getDeposit() - .getCode(TransactionTrace.convertToTronAddress(address.getLast20Bytes())); + byte[] code = invoke.getDeposit().getCode(address.toTronAddress()); return nullToEmpty(code); } public byte[] getCodeHashAt(DataWord address) { - byte[] tronAddr = TransactionTrace.convertToTronAddress(address.getLast20Bytes()); + byte[] tronAddr = address.toTronAddress(); AccountCapsule account = getContractState().getAccount(tronAddr); if (account != null) { ContractCapsule contract = getContractState().getContract(tronAddr); @@ -1191,6 +1036,10 @@ public byte[] getCodeHashAt(DataWord address) { } } + public byte[] getContextAddress() { + return invoke.getContractAddress().toTronAddress(); + } + public DataWord getContractAddress() { return invoke.getContractAddress().clone(); } @@ -1213,27 +1062,23 @@ public DataWord getBlockHash(int index) { } public DataWord getBalance(DataWord address) { - long balance = getContractState() - .getBalance(TransactionTrace.convertToTronAddress(address.getLast20Bytes())); + long balance = getContractState().getBalance(address.toTronAddress()); return new DataWord(balance); } public DataWord getRewardBalance(DataWord address) { - long rewardBalance = VoteRewardUtil.queryReward( - TransactionTrace.convertToTronAddress(address.getLast20Bytes()), getContractState()); + long rewardBalance = VoteRewardUtil.queryReward(address.toTronAddress(), getContractState()); return new DataWord(rewardBalance); } public DataWord isContract(DataWord address) { - ContractCapsule contract = getContractState() - .getContract(TransactionTrace.convertToTronAddress(address.getLast20Bytes())); - return contract != null ? new DataWord(1) : new DataWord(0); + ContractCapsule contract = getContractState().getContract(address.toTronAddress()); + return contract != null ? DataWord.ONE() : DataWord.ZERO(); } public DataWord isSRCandidate(DataWord address) { - WitnessCapsule witnessCapsule = getContractState() - .getWitness(TransactionTrace.convertToTronAddress(address.getLast20Bytes())); - return witnessCapsule != null ? new DataWord(1) : new DataWord(0); + WitnessCapsule witnessCapsule = getContractState().getWitness(address.toTronAddress()); + return witnessCapsule != null ? DataWord.ONE() : DataWord.ZERO(); } public DataWord getOriginAddress() { @@ -1249,10 +1094,7 @@ public DataWord getChainId() { if (VMConfig.allowTvmCompatibleEvm()) { chainId = Arrays.copyOfRange(chainId, chainId.length - 4, chainId.length); } - return new DataWord(chainId); - } - public DataWord getDropPrice() { - return new DataWord(1); + return new DataWord(chainId).clone(); } public long getEnergylimitLeftLong() { @@ -1301,19 +1143,15 @@ public byte[] getReturnDataBufferData(DataWord off, DataWord size) { } public DataWord storageLoad(DataWord key) { - DataWord ret = getContractState() - .getStorageValue( - TransactionTrace.convertToTronAddress(getContractAddress().getLast20Bytes()), - key.clone()); + DataWord ret = getContractState().getStorageValue(getContextAddress(), key.clone()); return ret == null ? null : ret.clone(); } public DataWord getTokenBalance(DataWord address, DataWord tokenId) { checkTokenIdInTokenBalance(tokenId); - long ret = getContractState() - .getTokenBalance(TransactionTrace.convertToTronAddress(address.getLast20Bytes()), - String.valueOf(tokenId.longValue()).getBytes()); - return ret == 0 ? new DataWord(0) : new DataWord(ret); + long ret = getContractState().getTokenBalance(address.toTronAddress(), + String.valueOf(tokenId.longValue()).getBytes()); + return new DataWord(ret); } public DataWord getTokenValue() { @@ -1442,7 +1280,7 @@ public void fullTrace() { } if (pc != 0) { - globalOutput.append("[Op: ").append(OpCode.code(lastOp).name()).append("]\n"); + globalOutput.append("[Op: ").append(Op.getNameOf(lastOp)).append("]\n"); } globalOutput.append(" -- OPS -- ").append(opsString).append("\n"); @@ -1484,12 +1322,10 @@ public void createContract2(DataWord value, DataWord memStart, DataWord memSize, stackPushZero(); return; } - if(VMConfig.allowTvmIstanbul()) { - senderAddress = TransactionTrace - .convertToTronAddress(this.getContractAddress().getLast20Bytes()); + if (VMConfig.allowTvmIstanbul()) { + senderAddress = getContextAddress(); } else { - senderAddress = TransactionTrace - .convertToTronAddress(this.getCallerAddress().getLast20Bytes()); + senderAddress = getCallerAddress().toTronAddress(); } byte[] programCode = memoryChunk(memStart.intValue(), memSize.intValue()); @@ -1523,13 +1359,16 @@ public void callToPrecompiledAddress(MessageCall msg, return; } + Repository deposit = getContractState().newRepositoryChild(); - byte[] senderAddress = TransactionTrace - .convertToTronAddress(this.getContractAddress().getLast20Bytes()); - byte[] codeAddress = TransactionTrace - .convertToTronAddress(msg.getCodeAddress().getLast20Bytes()); - byte[] contextAddress = msg.getType().callIsStateless() ? senderAddress : codeAddress; + byte[] senderAddress = getContextAddress(); + byte[] contextAddress; + if (msg.getOpCode() == Op.CALLCODE || msg.getOpCode() == Op.DELEGATECALL) { + contextAddress = senderAddress; + } else { + contextAddress = msg.getCodeAddress().toTronAddress(); + } long endowment = msg.getEndowment().value().longValueExact(); long senderBalance = 0; @@ -1583,8 +1422,11 @@ public void callToPrecompiledAddress(MessageCall msg, this.stackPushZero(); } else { // Delegate or not. if is delegated, we will use msg sender, otherwise use contract address - contract.setCallerAddress(TransactionTrace.convertToTronAddress(msg.getType().callIsDelegate() - ? getCallerAddress().getLast20Bytes() : getContractAddress().getLast20Bytes())); + if (msg.getOpCode() == Op.DELEGATECALL) { + contract.setCallerAddress(getCallerAddress().toTronAddress()); + } else { + contract.setCallerAddress(getContextAddress()); + } // this is the depositImpl, not contractState as above contract.setRepository(deposit); contract.setResult(this.result); @@ -1687,7 +1529,7 @@ public void checkTokenIdInTokenBalance(DataWord tokenIdDataWord) { } } - public DataWord getCallEnergy(OpCode op, DataWord requestedEnergy, DataWord availableEnergy) { + public DataWord getCallEnergy(DataWord requestedEnergy, DataWord availableEnergy) { if (VMConfig.allowTvmCompatibleEvm() && getContractVersion() == 1) { DataWord availableEnergyReduce = availableEnergy.clone(); availableEnergyReduce.div(new DataWord(64)); @@ -1759,34 +1601,12 @@ public void setPC(int pc) { this.pc = pc; } - public OpCode getCurOpcode() { - return pc < code.length ? OpCode.code(code[pc]) : null; - } - - public boolean isPush() { - return getCurOpcode() != null && getCurOpcode().name().startsWith("PUSH"); - } - - public byte[] getCurOpcodeArg() { - if (isPush()) { - int nPush = getCurOpcode().val() - OpCode.PUSH1.val() + 1; - byte[] data = Arrays.copyOfRange(code, pc + 1, pc + nPush + 1); - return data; - } else { - return new byte[0]; - } - } - - public boolean next() { - pc += 1 + getCurOpcodeArg().length; - return pc < code.length; - } } public boolean freeze(DataWord receiverAddress, DataWord frozenBalance, DataWord resourceType) { Repository repository = getContractState().newRepositoryChild(); - byte[] owner = TransactionTrace.convertToTronAddress(getContractAddress().getLast20Bytes()); - byte[] receiver = TransactionTrace.convertToTronAddress(receiverAddress.getLast20Bytes()); + byte[] owner = getContextAddress(); + byte[] receiver = receiverAddress.toTronAddress(); increaseNonce(); InternalTransaction internalTx = addInternalTx(null, owner, receiver, @@ -1798,8 +1618,8 @@ public boolean freeze(DataWord receiverAddress, DataWord frozenBalance, DataWord param.setReceiverAddress(receiver); boolean needCheckFrozenTime = CommonParameter.getInstance() .getCheckFrozenTime() == 1; // for test - param.setFrozenDuration(needCheckFrozenTime ? - repository.getDynamicPropertiesStore().getMinFrozenTime() : 0); + param.setFrozenDuration(needCheckFrozenTime + ? repository.getDynamicPropertiesStore().getMinFrozenTime() : 0); param.setResourceType(parseResourceCode(resourceType)); try { FreezeBalanceProcessor processor = new FreezeBalanceProcessor(); @@ -1821,8 +1641,8 @@ public boolean freeze(DataWord receiverAddress, DataWord frozenBalance, DataWord public boolean unfreeze(DataWord receiverAddress, DataWord resourceType) { Repository repository = getContractState().newRepositoryChild(); - byte[] owner = TransactionTrace.convertToTronAddress(getContractAddress().getLast20Bytes()); - byte[] receiver = TransactionTrace.convertToTronAddress(receiverAddress.getLast20Bytes()); + byte[] owner = getContextAddress(); + byte[] receiver = receiverAddress.toTronAddress(); increaseNonce(); InternalTransaction internalTx = addInternalTx(null, owner, receiver, 0, null, @@ -1851,8 +1671,8 @@ public boolean unfreeze(DataWord receiverAddress, DataWord resourceType) { } public long freezeExpireTime(DataWord targetAddress, DataWord resourceType) { - byte[] owner = TransactionTrace.convertToTronAddress(getContractAddress().getLast20Bytes()); - byte[] target = TransactionTrace.convertToTronAddress(targetAddress.getLast20Bytes()); + byte[] owner = getContextAddress(); + byte[] target = targetAddress.toTronAddress(); int resourceCode = resourceType.intValue(); if (FastByteComparisons.isEqual(owner, target)) { AccountCapsule ownerCapsule = getContractState().getAccount(owner); @@ -1907,9 +1727,9 @@ private String convertResourceToString(DataWord resourceType) { } public boolean voteWitness(int witnessArrayOffset, int witnessArrayLength, - int amountArrayOffset, int amountArrayLength) { + int amountArrayOffset, int amountArrayLength) { Repository repository = getContractState().newRepositoryChild(); - byte[] owner = TransactionTrace.convertToTronAddress(getContractAddress().getLast20Bytes()); + byte[] owner = getContextAddress(); increaseNonce(); InternalTransaction internalTx = addInternalTx(null, owner, null, 0, null, @@ -1942,8 +1762,7 @@ public boolean voteWitness(int witnessArrayOffset, int witnessArrayLength, i * DataWord.WORD_SIZE, (i + 1) * DataWord.WORD_SIZE)); DataWord amount = new DataWord(Arrays.copyOfRange(amountArrayData, i * DataWord.WORD_SIZE, (i + 1) * DataWord.WORD_SIZE)); - param.addVote(TransactionTrace.convertToTronAddress(witness.getLast20Bytes()), - amount.sValue().longValueExact()); + param.addVote(witness.toTronAddress(), amount.sValue().longValueExact()); } if (internalTx != null) { internalTx.setExtra(param.toJsonStr()); @@ -1969,7 +1788,7 @@ public boolean voteWitness(int witnessArrayOffset, int witnessArrayLength, public long withdrawReward() { Repository repository = getContractState().newRepositoryChild(); - byte[] owner = TransactionTrace.convertToTronAddress(getContractAddress().getLast20Bytes()); + byte[] owner = getContextAddress(); increaseNonce(); InternalTransaction internalTx = addInternalTx(null, owner, owner, 0, null, @@ -2134,19 +1953,6 @@ public static class Exception { private Exception() { } - public static OutOfEnergyException notEnoughOpEnergy(OpCode op, long opEnergy, - long programEnergy) { - return new OutOfEnergyException( - "Not enough energy for '%s' operation executing: opEnergy[%d], programEnergy[%d];", op, - opEnergy, - programEnergy); - } - - public static OutOfEnergyException notEnoughOpEnergy(OpCode op, DataWord opEnergy, - DataWord programEnergy) { - return notEnoughOpEnergy(op, opEnergy.longValue(), programEnergy.longValue()); - } - public static OutOfEnergyException notEnoughSpendEnergy(String hint, long needEnergy, long leftEnergy) { return new OutOfEnergyException( @@ -2163,9 +1969,9 @@ public static OutOfTimeException alreadyTimeOut() { return new OutOfTimeException("Already Time Out"); } - - public static OutOfMemoryException memoryOverflow(OpCode op) { - return new OutOfMemoryException("Out of Memory when '%s' operation executing", op.name()); + public static OutOfMemoryException memoryOverflow(int op) { + return new OutOfMemoryException("Out of Memory when '%s' operation executing", + Op.getNameOf(op)); } public static OutOfStorageException notEnoughStorage() { diff --git a/actuator/src/main/java/org/tron/core/vm/program/ProgramPrecompile.java b/actuator/src/main/java/org/tron/core/vm/program/ProgramPrecompile.java index e8a841131ae..280d4239f54 100644 --- a/actuator/src/main/java/org/tron/core/vm/program/ProgramPrecompile.java +++ b/actuator/src/main/java/org/tron/core/vm/program/ProgramPrecompile.java @@ -1,54 +1,28 @@ -/* - * Copyright (c) [2016] [ ] - * This file is part of the ethereumJ library. - * - * The ethereumJ library is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * The ethereumJ library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with the ethereumJ library. If not, see . - */ package org.tron.core.vm.program; import java.util.HashSet; import java.util.Set; import lombok.extern.slf4j.Slf4j; import org.tron.common.runtime.vm.DataWord; -import org.tron.core.vm.OpCode; +import org.tron.core.vm.Op; import org.tron.core.vm.config.VMConfig; - @Slf4j(topic = "VM") -/** - * Created by Anton Nashatyrev on 06.02.2017. - */ public class ProgramPrecompile { - private Set jumpdest = new HashSet<>(); + private final Set jumpDest = new HashSet<>(); public static ProgramPrecompile compile(byte[] ops) { ProgramPrecompile ret = new ProgramPrecompile(); for (int i = 0; i < ops.length; ++i) { + int op = ops[i] & 0xff; - OpCode op = OpCode.code(ops[i]); - if (op == null) { - continue; - } - - if (op.equals(OpCode.JUMPDEST)) { - logger.debug("JUMPDEST:" + i); - ret.jumpdest.add(i); + if (op == Op.JUMPDEST) { + ret.jumpDest.add(i); } - if (op.asInt() >= OpCode.PUSH1.asInt() && op.asInt() <= OpCode.PUSH32.asInt()) { - i += op.asInt() - OpCode.PUSH1.asInt() + 1; + if (op >= Op.PUSH1 && op <= Op.PUSH32) { + i += op - Op.PUSH1 + 1; } } return ret; @@ -57,17 +31,9 @@ public static ProgramPrecompile compile(byte[] ops) { public static byte[] getCode(byte[] ops) { for (int i = 0; i < ops.length; ++i) { - OpCode op = OpCode.code(ops[i]); - if (op == null) { - continue; - } - - if (op.equals(OpCode.RETURN)) { - logger.debug("return"); - } + int op = ops[i] & 0xff; - if (op.equals(OpCode.RETURN) && i + 1 < ops.length && OpCode.code(ops[i + 1]) != null - && OpCode.code(ops[i + 1]).equals(OpCode.STOP)) { + if (op == Op.RETURN && i + 1 < ops.length && ((ops[i + 1]) & 0xff) == Op.STOP) { byte[] ret; i++; ret = new byte[ops.length - i - 1]; @@ -76,18 +42,18 @@ public static byte[] getCode(byte[] ops) { return ret; } - if (op.asInt() >= OpCode.PUSH1.asInt() && op.asInt() <= OpCode.PUSH32.asInt()) { - i += op.asInt() - OpCode.PUSH1.asInt() + 1; + if (op >= Op.PUSH1 && op <= Op.PUSH32) { + i += op - Op.PUSH1 + 1; } } if (VMConfig.allowTvmConstantinople()) { return new byte[0]; } else { - return new DataWord(0).getData(); + return new byte[DataWord.WORD_SIZE]; } } public boolean hasJumpDest(int pc) { - return jumpdest.contains(pc); + return jumpDest.contains(pc); } } diff --git a/actuator/src/main/java/org/tron/core/vm/program/Stack.java b/actuator/src/main/java/org/tron/core/vm/program/Stack.java index e03b8124d65..08921f70962 100644 --- a/actuator/src/main/java/org/tron/core/vm/program/Stack.java +++ b/actuator/src/main/java/org/tron/core/vm/program/Stack.java @@ -1,20 +1,3 @@ -/* - * Copyright (c) [2016] [ ] - * This file is part of the ethereumJ library. - * - * The ethereumJ library is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * The ethereumJ library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with the ethereumJ library. If not, see . - */ package org.tron.core.vm.program; import java.util.Objects; diff --git a/actuator/src/main/java/org/tron/core/vm/program/Storage.java b/actuator/src/main/java/org/tron/core/vm/program/Storage.java index 61eef46f4bd..7e21d187a37 100644 --- a/actuator/src/main/java/org/tron/core/vm/program/Storage.java +++ b/actuator/src/main/java/org/tron/core/vm/program/Storage.java @@ -46,7 +46,7 @@ public Storage(Storage storage) { private byte[] compose(byte[] key, byte[] addrHash) { if (VMConfig.allowTvmCompatibleEvm() && contractVersion == 1) { - return Hash.sha3(ByteUtil.merge(addrHash, key)); + key = Hash.sha3(key); } byte[] result = new byte[key.length]; arraycopy(addrHash, 0, result, 0, PREFIX_BYTES); diff --git a/actuator/src/main/java/org/tron/core/vm/program/invoke/ProgramInvoke.java b/actuator/src/main/java/org/tron/core/vm/program/invoke/ProgramInvoke.java index 2cc65be2df5..ab54e7f5382 100644 --- a/actuator/src/main/java/org/tron/core/vm/program/invoke/ProgramInvoke.java +++ b/actuator/src/main/java/org/tron/core/vm/program/invoke/ProgramInvoke.java @@ -1,30 +1,8 @@ -/* - * Copyright (c) [2016] [ ] - * This file is part of the ethereumJ library. - * - * The ethereumJ library is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * The ethereumJ library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with the ethereumJ library. If not, see . - */ package org.tron.core.vm.program.invoke; - import org.tron.common.runtime.vm.DataWord; import org.tron.core.vm.repository.Repository; -/** - * @author Roman Mandeleil - * @since 03.06.2014 - */ public interface ProgramInvoke { DataWord getContractAddress(); diff --git a/actuator/src/main/java/org/tron/core/vm/program/invoke/ProgramInvokeFactory.java b/actuator/src/main/java/org/tron/core/vm/program/invoke/ProgramInvokeFactory.java index 0f0ab35096a..832aae2b00a 100644 --- a/actuator/src/main/java/org/tron/core/vm/program/invoke/ProgramInvokeFactory.java +++ b/actuator/src/main/java/org/tron/core/vm/program/invoke/ProgramInvokeFactory.java @@ -1,49 +1,152 @@ -/* - * Copyright (c) [2016] [ ] - * This file is part of the ethereumJ library. - * - * The ethereumJ library is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * The ethereumJ library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with the ethereumJ library. If not, see . - */ package org.tron.core.vm.program.invoke; +import static org.tron.common.runtime.InternalTransaction.TrxType.TRX_CONTRACT_CALL_TYPE; +import static org.tron.common.runtime.InternalTransaction.TrxType.TRX_CONTRACT_CREATION_TYPE; +import static org.tron.common.utils.WalletUtil.generateContractAddress; +import lombok.extern.slf4j.Slf4j; +import org.bouncycastle.util.Arrays; import org.tron.common.runtime.InternalTransaction; import org.tron.common.runtime.vm.DataWord; +import org.tron.common.utils.ByteUtil; +import org.tron.core.capsule.ContractCapsule; import org.tron.core.exception.ContractValidateException; import org.tron.core.vm.program.Program; import org.tron.core.vm.repository.Repository; import org.tron.protos.Protocol.Block; import org.tron.protos.Protocol.Transaction; +import org.tron.protos.contract.SmartContractOuterClass.CreateSmartContract; +import org.tron.protos.contract.SmartContractOuterClass.TriggerSmartContract; -/** - * @author Roman Mandeleil - * @since 19.12.2014 - */ -public interface ProgramInvokeFactory { - - ProgramInvoke createProgramInvoke(InternalTransaction.TrxType trxType, - InternalTransaction.ExecutorType executorType, - Transaction tx, long tokenValue, long tokenId, Block block, Repository deposit, - long vmStartInUs, - long vmShouldEndInUs, - long energyLimit) throws ContractValidateException; - - ProgramInvoke createProgramInvoke(Program program, DataWord toAddress, DataWord callerAddress, - DataWord inValue, DataWord tokenValue, DataWord tokenId, - long balanceInt, byte[] dataIn, Repository deposit, boolean staticCall, - boolean byTestingSuite, - long vmStartInUs, long vmShouldEndInUs, long energyLimit); +@Slf4j(topic = "vm") +public class ProgramInvokeFactory { + + /** + * Invocation by the wire tx + */ + public static ProgramInvoke createProgramInvoke(InternalTransaction.TrxType trxType, + InternalTransaction.ExecutorType executorType, Transaction tx, long tokenValue, long tokenId, + Block block, + Repository deposit, long vmStartInUs, + long vmShouldEndInUs, long energyLimit) throws ContractValidateException { + byte[] contractAddress; + byte[] ownerAddress; + long balance; + byte[] data; + byte[] lastHash = null; + byte[] coinbase = null; + long timestamp = 0L; + long number = -1L; + + if (trxType == TRX_CONTRACT_CREATION_TYPE) { + CreateSmartContract contract = ContractCapsule.getSmartContractFromTransaction(tx); + contractAddress = generateContractAddress(tx); + ownerAddress = contract.getOwnerAddress().toByteArray(); + balance = deposit.getBalance(ownerAddress); + data = ByteUtil.EMPTY_BYTE_ARRAY; + long callValue = contract.getNewContract().getCallValue(); + + switch (executorType) { + case ET_NORMAL_TYPE: + case ET_PRE_TYPE: + if (null != block) { + lastHash = block.getBlockHeader().getRawDataOrBuilder().getParentHash().toByteArray(); + coinbase = block.getBlockHeader().getRawDataOrBuilder().getWitnessAddress() + .toByteArray(); + timestamp = block.getBlockHeader().getRawDataOrBuilder().getTimestamp() / 1000; + number = block.getBlockHeader().getRawDataOrBuilder().getNumber(); + } + break; + default: + break; + } + + return new ProgramInvokeImpl(contractAddress, ownerAddress, ownerAddress, balance, callValue, + tokenValue, tokenId, data, lastHash, coinbase, timestamp, number, deposit, vmStartInUs, + vmShouldEndInUs, energyLimit); + + } else if (trxType == TRX_CONTRACT_CALL_TYPE) { + TriggerSmartContract contract = ContractCapsule + .getTriggerContractFromTransaction(tx); + /*** ADDRESS op ***/ + // YP: Get address of currently executing account. + byte[] address = contract.getContractAddress().toByteArray(); + + /*** ORIGIN op ***/ + // YP: This is the sender of original transaction; it is never a contract. + byte[] origin = contract.getOwnerAddress().toByteArray(); + + /*** CALLER op ***/ + // YP: This is the address of the account that is directly responsible for this execution. + byte[] caller = contract.getOwnerAddress().toByteArray(); + + /*** BALANCE op ***/ + balance = deposit.getBalance(caller); + + /*** CALLVALUE op ***/ + long callValue = contract.getCallValue(); + + /*** CALLDATALOAD op ***/ + /*** CALLDATACOPY op ***/ + /*** CALLDATASIZE op ***/ + data = contract.getData().toByteArray(); + + switch (executorType) { + case ET_CONSTANT_TYPE: + break; + case ET_PRE_TYPE: + case ET_NORMAL_TYPE: + if (null != block) { + /*** PREVHASH op ***/ + lastHash = block.getBlockHeader().getRawDataOrBuilder().getParentHash().toByteArray(); + /*** COINBASE op ***/ + coinbase = block.getBlockHeader().getRawDataOrBuilder().getWitnessAddress() + .toByteArray(); + /*** TIMESTAMP op ***/ + timestamp = block.getBlockHeader().getRawDataOrBuilder().getTimestamp() / 1000; + /*** NUMBER op ***/ + number = block.getBlockHeader().getRawDataOrBuilder().getNumber(); + } + break; + default: + break; + } + + return new ProgramInvokeImpl(address, origin, caller, balance, callValue, tokenValue, tokenId, + data, + lastHash, coinbase, timestamp, number, deposit, vmStartInUs, vmShouldEndInUs, + energyLimit); + } + throw new ContractValidateException("Unknown contract type"); + } + + /** + * This invocation created for contract call contract + */ + public static ProgramInvoke createProgramInvoke(Program program, DataWord toAddress, + DataWord callerAddress, + DataWord inValue, DataWord tokenValue, DataWord tokenId, long balanceInt, byte[] dataIn, + Repository deposit, boolean isStaticCall, boolean byTestingSuite, long vmStartInUs, + long vmShouldEndInUs, long energyLimit) { + + DataWord address = toAddress; + DataWord origin = program.getOriginAddress(); + DataWord caller = callerAddress; + DataWord balance = new DataWord(balanceInt); + DataWord callValue = inValue; + + byte[] data = Arrays.clone(dataIn); + DataWord lastHash = program.getPrevHash(); + DataWord coinbase = program.getCoinbase(); + DataWord timestamp = program.getTimestamp(); + DataWord number = program.getNumber(); + DataWord difficulty = program.getDifficulty(); + + return new ProgramInvokeImpl(address, origin, caller, balance, callValue, tokenValue, tokenId, + data, lastHash, coinbase, timestamp, number, difficulty, + deposit, program.getCallDeep() + 1, isStaticCall, byTestingSuite, vmStartInUs, + vmShouldEndInUs, energyLimit); + } } diff --git a/actuator/src/main/java/org/tron/core/vm/program/invoke/ProgramInvokeFactoryImpl.java b/actuator/src/main/java/org/tron/core/vm/program/invoke/ProgramInvokeFactoryImpl.java deleted file mode 100644 index 50ed45ccf43..00000000000 --- a/actuator/src/main/java/org/tron/core/vm/program/invoke/ProgramInvokeFactoryImpl.java +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Copyright (c) [2016] [ ] - * This file is part of the ethereumJ library. - * - * The ethereumJ library is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * The ethereumJ library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with the ethereumJ library. If not, see . - */ -package org.tron.core.vm.program.invoke; - -import static org.tron.common.runtime.InternalTransaction.TrxType.TRX_CONTRACT_CALL_TYPE; -import static org.tron.common.runtime.InternalTransaction.TrxType.TRX_CONTRACT_CREATION_TYPE; -import static org.tron.common.utils.WalletUtil.generateContractAddress; - -import lombok.extern.slf4j.Slf4j; -import org.bouncycastle.util.Arrays; -import org.springframework.stereotype.Component; -import org.tron.common.runtime.InternalTransaction; -import org.tron.common.runtime.vm.DataWord; -import org.tron.common.utils.ByteUtil; -import org.tron.core.capsule.ContractCapsule; -import org.tron.core.exception.ContractValidateException; -import org.tron.core.vm.program.Program; -import org.tron.core.vm.repository.Repository; -import org.tron.protos.Protocol.Block; -import org.tron.protos.Protocol.Transaction; -import org.tron.protos.contract.SmartContractOuterClass.CreateSmartContract; -import org.tron.protos.contract.SmartContractOuterClass.TriggerSmartContract; - - -/** - * @author Roman Mandeleil - * @since 08.06.2014 - */ -@Component("ProgramInvokeFactory") -@Slf4j(topic = "vm") -public class ProgramInvokeFactoryImpl implements ProgramInvokeFactory { - - // Invocation by the wire tx - @Override - public ProgramInvoke createProgramInvoke(InternalTransaction.TrxType trxType, - InternalTransaction.ExecutorType executorType, Transaction tx, long tokenValue, long tokenId, - Block block, - Repository deposit, long vmStartInUs, - long vmShouldEndInUs, long energyLimit) throws ContractValidateException { - byte[] contractAddress; - byte[] ownerAddress; - long balance; - byte[] data; - byte[] lastHash = null; - byte[] coinbase = null; - long timestamp = 0L; - long number = -1L; - - if (trxType == TRX_CONTRACT_CREATION_TYPE) { - CreateSmartContract contract = ContractCapsule.getSmartContractFromTransaction(tx); - contractAddress = generateContractAddress(tx); - ownerAddress = contract.getOwnerAddress().toByteArray(); - balance = deposit.getBalance(ownerAddress); - data = ByteUtil.EMPTY_BYTE_ARRAY; - long callValue = contract.getNewContract().getCallValue(); - - switch (executorType) { - case ET_NORMAL_TYPE: - case ET_PRE_TYPE: - if (null != block) { - lastHash = block.getBlockHeader().getRawDataOrBuilder().getParentHash().toByteArray(); - coinbase = block.getBlockHeader().getRawDataOrBuilder().getWitnessAddress() - .toByteArray(); - timestamp = block.getBlockHeader().getRawDataOrBuilder().getTimestamp() / 1000; - number = block.getBlockHeader().getRawDataOrBuilder().getNumber(); - } - break; - default: - break; - } - - return new ProgramInvokeImpl(contractAddress, ownerAddress, ownerAddress, balance, callValue, - tokenValue, tokenId, data, lastHash, coinbase, timestamp, number, deposit, vmStartInUs, - vmShouldEndInUs, energyLimit); - - } else if (trxType == TRX_CONTRACT_CALL_TYPE) { - TriggerSmartContract contract = ContractCapsule - .getTriggerContractFromTransaction(tx); - /*** ADDRESS op ***/ - // YP: Get address of currently executing account. - byte[] address = contract.getContractAddress().toByteArray(); - - /*** ORIGIN op ***/ - // YP: This is the sender of original transaction; it is never a contract. - byte[] origin = contract.getOwnerAddress().toByteArray(); - - /*** CALLER op ***/ - // YP: This is the address of the account that is directly responsible for this execution. - byte[] caller = contract.getOwnerAddress().toByteArray(); - - /*** BALANCE op ***/ - balance = deposit.getBalance(caller); - - /*** CALLVALUE op ***/ - long callValue = contract.getCallValue(); - - /*** CALLDATALOAD op ***/ - /*** CALLDATACOPY op ***/ - /*** CALLDATASIZE op ***/ - data = contract.getData().toByteArray(); - - switch (executorType) { - case ET_CONSTANT_TYPE: - break; - case ET_PRE_TYPE: - case ET_NORMAL_TYPE: - if (null != block) { - /*** PREVHASH op ***/ - lastHash = block.getBlockHeader().getRawDataOrBuilder().getParentHash().toByteArray(); - /*** COINBASE op ***/ - coinbase = block.getBlockHeader().getRawDataOrBuilder().getWitnessAddress() - .toByteArray(); - /*** TIMESTAMP op ***/ - timestamp = block.getBlockHeader().getRawDataOrBuilder().getTimestamp() / 1000; - /*** NUMBER op ***/ - number = block.getBlockHeader().getRawDataOrBuilder().getNumber(); - } - break; - default: - break; - } - - return new ProgramInvokeImpl(address, origin, caller, balance, callValue, tokenValue, tokenId, - data, - lastHash, coinbase, timestamp, number, deposit, vmStartInUs, vmShouldEndInUs, - energyLimit); - } - throw new ContractValidateException("Unknown contract type"); - } - - /** - * This invocation created for contract call contract - */ - @Override - public ProgramInvoke createProgramInvoke(Program program, DataWord toAddress, - DataWord callerAddress, - DataWord inValue, DataWord tokenValue, DataWord tokenId, long balanceInt, byte[] dataIn, - Repository deposit, boolean isStaticCall, boolean byTestingSuite, long vmStartInUs, - long vmShouldEndInUs, long energyLimit) { - - DataWord address = toAddress; - DataWord origin = program.getOriginAddress(); - DataWord caller = callerAddress; - DataWord balance = new DataWord(balanceInt); - DataWord callValue = inValue; - - byte[] data = Arrays.clone(dataIn); - DataWord lastHash = program.getPrevHash(); - DataWord coinbase = program.getCoinbase(); - DataWord timestamp = program.getTimestamp(); - DataWord number = program.getNumber(); - DataWord difficulty = program.getDifficulty(); - - return new ProgramInvokeImpl(address, origin, caller, balance, callValue, tokenValue, tokenId, - data, lastHash, coinbase, timestamp, number, difficulty, - deposit, program.getCallDeep() + 1, isStaticCall, byTestingSuite, vmStartInUs, - vmShouldEndInUs, energyLimit); - } - - -} diff --git a/actuator/src/main/java/org/tron/core/vm/program/invoke/ProgramInvokeImpl.java b/actuator/src/main/java/org/tron/core/vm/program/invoke/ProgramInvokeImpl.java index daa7c47a03d..7997aaedcd5 100644 --- a/actuator/src/main/java/org/tron/core/vm/program/invoke/ProgramInvokeImpl.java +++ b/actuator/src/main/java/org/tron/core/vm/program/invoke/ProgramInvokeImpl.java @@ -1,20 +1,3 @@ -/* - * Copyright (c) [2016] [ ] - * This file is part of the ethereumJ library. - * - * The ethereumJ library is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * The ethereumJ library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with the ethereumJ library. If not, see . - */ package org.tron.core.vm.program.invoke; import java.math.BigInteger; @@ -27,8 +10,8 @@ @Slf4j public class ProgramInvokeImpl implements ProgramInvoke { - /*****************/ - /* NOTE: In the protocol there is no restriction on the maximum message data, + /* + * NOTE: In the protocol there is no restriction on the maximum message data, * However msgData here is a byte[] and this can't hold more than 2^32-1 */ private static final BigInteger MAX_MSG_DATA = BigInteger.valueOf(Integer.MAX_VALUE); @@ -242,7 +225,7 @@ public DataWord getNumber() { /* DIFFICULTY op */ public DataWord getDifficulty() { - return new DataWord(0); + return DataWord.ZERO(); } public long getVmShouldEndInUs() { diff --git a/actuator/src/main/java/org/tron/core/vm/program/invoke/ProgramInvokeMockImpl.java b/actuator/src/main/java/org/tron/core/vm/program/invoke/ProgramInvokeMockImpl.java index 04648023db1..71fd484c7a3 100644 --- a/actuator/src/main/java/org/tron/core/vm/program/invoke/ProgramInvokeMockImpl.java +++ b/actuator/src/main/java/org/tron/core/vm/program/invoke/ProgramInvokeMockImpl.java @@ -1,21 +1,3 @@ -/* - * Copyright (c) [2016] [ ] - * This file is part of the ethereumJ library. - * - * The ethereumJ library is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * The ethereumJ library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with the ethereumJ library. If not, see . - */ - package org.tron.core.vm.program.invoke; import com.google.protobuf.ByteString; @@ -31,19 +13,12 @@ import org.tron.protos.Protocol; import org.tron.protos.contract.SmartContractOuterClass.SmartContract; - -/** - * . - * - * @author Roman Mandeleil - * @since 03.06.2014 - */ public class ProgramInvokeMockImpl implements ProgramInvoke { - private final byte[] contractAddress = Hex.decode("471fd3ad3e9eeadeec4608b92d16ce6b500704cc"); + private final byte[] contractAddress = Hex.decode("41471fd3ad3e9eeadeec4608b92d16ce6b500704cc"); private byte[] msgData; private Repository deposit; - private byte[] ownerAddress = Hex.decode("cd2a3d9f938e13cd947ec05abc7fe734df8dd826"); + private byte[] ownerAddress = Hex.decode("41cd2a3d9f938e13cd947ec05abc7fe734df8dd826"); private boolean isConstantCall; private boolean isStaticCall; private long energyLimit = 50; @@ -76,7 +51,7 @@ public ProgramInvokeMockImpl(boolean defaults) { /* ADDRESS op */ public DataWord getContractAddress() { - return new DataWord(ownerAddress); + return new DataWord(contractAddress); } /* BALANCE op */ @@ -252,7 +227,7 @@ public void setConstantCall() { @Override public boolean byTestingSuite() { - return true; + return false; } @Override diff --git a/actuator/src/main/java/org/tron/core/vm/repository/RepositoryImpl.java b/actuator/src/main/java/org/tron/core/vm/repository/RepositoryImpl.java index e3712594ff5..807f267b9db 100644 --- a/actuator/src/main/java/org/tron/core/vm/repository/RepositoryImpl.java +++ b/actuator/src/main/java/org/tron/core/vm/repository/RepositoryImpl.java @@ -60,10 +60,9 @@ @Slf4j(topic = "Repository") public class RepositoryImpl implements Repository { - //for energycal private final long precision = Parameter.ChainConstant.PRECISION; - private final long windowSize = Parameter.ChainConstant.WINDOW_SIZE_MS / - BLOCK_PRODUCED_INTERVAL; + private final long windowSize = Parameter.ChainConstant.WINDOW_SIZE_MS + / BLOCK_PRODUCED_INTERVAL; private static final byte[] TOTAL_NET_WEIGHT = "TOTAL_NET_WEIGHT".getBytes(); private static final byte[] TOTAL_ENERGY_WEIGHT = "TOTAL_ENERGY_WEIGHT".getBytes(); diff --git a/actuator/src/main/java/org/tron/core/vm/repository/Value.java b/actuator/src/main/java/org/tron/core/vm/repository/Value.java index 44dc8d293a2..88ae1d1f7b7 100644 --- a/actuator/src/main/java/org/tron/core/vm/repository/Value.java +++ b/actuator/src/main/java/org/tron/core/vm/repository/Value.java @@ -2,7 +2,17 @@ import java.util.Arrays; import org.apache.commons.lang3.ArrayUtils; -import org.tron.core.capsule.*; +import org.tron.core.capsule.AccountCapsule; +import org.tron.core.capsule.AssetIssueCapsule; +import org.tron.core.capsule.BlockCapsule; +import org.tron.core.capsule.BytesCapsule; +import org.tron.core.capsule.CodeCapsule; +import org.tron.core.capsule.ContractCapsule; +import org.tron.core.capsule.DelegatedResourceCapsule; +import org.tron.core.capsule.ProposalCapsule; +import org.tron.core.capsule.TransactionCapsule; +import org.tron.core.capsule.VotesCapsule; +import org.tron.core.capsule.WitnessCapsule; import org.tron.core.exception.BadItemException; import org.tron.core.vm.config.VMConfig; diff --git a/actuator/src/main/java/org/tron/core/vm/trace/Op.java b/actuator/src/main/java/org/tron/core/vm/trace/Op.java index b9b84734a19..b7c333ca0f6 100644 --- a/actuator/src/main/java/org/tron/core/vm/trace/Op.java +++ b/actuator/src/main/java/org/tron/core/vm/trace/Op.java @@ -1,38 +1,20 @@ -/* - * Copyright (c) [2016] [ ] - * This file is part of the ethereumJ library. - * - * The ethereumJ library is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * The ethereumJ library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with the ethereumJ library. If not, see . - */ package org.tron.core.vm.trace; import java.math.BigInteger; -import org.tron.core.vm.OpCode; public class Op { - private OpCode code; + private int code; private int deep; private int pc; private BigInteger energy; private OpActions actions; - public OpCode getCode() { + public int getCode() { return code; } - public void setCode(OpCode code) { + public void setCode(int code) { this.code = code; } diff --git a/actuator/src/main/java/org/tron/core/vm/trace/OpActions.java b/actuator/src/main/java/org/tron/core/vm/trace/OpActions.java index 4880ca15925..d03f9688658 100644 --- a/actuator/src/main/java/org/tron/core/vm/trace/OpActions.java +++ b/actuator/src/main/java/org/tron/core/vm/trace/OpActions.java @@ -1,20 +1,3 @@ -/* - * Copyright (c) [2016] [ ] - * This file is part of the ethereumJ library. - * - * The ethereumJ library is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * The ethereumJ library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with the ethereumJ library. If not, see . - */ package org.tron.core.vm.trace; import static org.tron.common.utils.ByteArray.toHexString; diff --git a/actuator/src/main/java/org/tron/core/vm/trace/ProgramTrace.java b/actuator/src/main/java/org/tron/core/vm/trace/ProgramTrace.java index 390a04402aa..bd8bc18e78e 100644 --- a/actuator/src/main/java/org/tron/core/vm/trace/ProgramTrace.java +++ b/actuator/src/main/java/org/tron/core/vm/trace/ProgramTrace.java @@ -1,32 +1,13 @@ -/* - * Copyright (c) [2016] [ ] - * This file is part of the ethereumJ library. - * - * The ethereumJ library is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * The ethereumJ library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with the ethereumJ library. If not, see . - */ package org.tron.core.vm.trace; import static java.lang.String.format; import static org.tron.common.utils.ByteArray.toHexString; -import static org.tron.core.db.TransactionTrace.convertToTronAddress; import static org.tron.core.vm.trace.Serializers.serializeFieldsOnly; import java.util.ArrayList; import java.util.List; import org.bouncycastle.util.encoders.Hex; import org.tron.common.runtime.vm.DataWord; -import org.tron.core.vm.OpCode; import org.tron.core.vm.config.VMConfig; import org.tron.core.vm.program.invoke.ProgramInvoke; @@ -38,13 +19,12 @@ public class ProgramTrace { private String contractAddress; public ProgramTrace() { - this(null, null); + this(null); } - public ProgramTrace(VMConfig config, ProgramInvoke programInvoke) { - if (programInvoke != null && config.vmTrace()) { - contractAddress = Hex - .toHexString(convertToTronAddress(programInvoke.getContractAddress().getLast20Bytes())); + public ProgramTrace(ProgramInvoke programInvoke) { + if (programInvoke != null && VMConfig.vmTrace()) { + contractAddress = Hex.toHexString(programInvoke.getContractAddress().toTronAddress()); } } @@ -93,7 +73,7 @@ public ProgramTrace error(Exception error) { public Op addOp(byte code, int pc, int deep, DataWord energy, OpActions actions) { Op op = new Op(); op.setActions(actions); - op.setCode(OpCode.code(code)); + op.setCode(code & 0xff); op.setDeep(deep); op.setEnergy(energy.value()); op.setPc(pc); diff --git a/actuator/src/main/java/org/tron/core/vm/trace/ProgramTraceListener.java b/actuator/src/main/java/org/tron/core/vm/trace/ProgramTraceListener.java index 214c0024429..4893a66ebcc 100644 --- a/actuator/src/main/java/org/tron/core/vm/trace/ProgramTraceListener.java +++ b/actuator/src/main/java/org/tron/core/vm/trace/ProgramTraceListener.java @@ -1,20 +1,3 @@ -/* - * Copyright (c) [2016] [ ] - * This file is part of the ethereumJ library. - * - * The ethereumJ library is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * The ethereumJ library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with the ethereumJ library. If not, see . - */ package org.tron.core.vm.trace; import org.tron.common.runtime.vm.DataWord; diff --git a/actuator/src/main/java/org/tron/core/vm/trace/Serializers.java b/actuator/src/main/java/org/tron/core/vm/trace/Serializers.java index f8806f35259..69056d359c5 100644 --- a/actuator/src/main/java/org/tron/core/vm/trace/Serializers.java +++ b/actuator/src/main/java/org/tron/core/vm/trace/Serializers.java @@ -1,20 +1,3 @@ -/* - * Copyright (c) [2016] [ ] - * This file is part of the ethereumJ library. - * - * The ethereumJ library is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * The ethereumJ library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with the ethereumJ library. If not, see . - */ package org.tron.core.vm.trace; import com.fasterxml.jackson.annotation.JsonAutoDetect; @@ -29,7 +12,7 @@ import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; import org.tron.common.runtime.vm.DataWord; -import org.tron.core.vm.OpCode; +import org.tron.core.vm.Op; @Slf4j(topic = "VM") public final class Serializers { @@ -84,7 +67,7 @@ public static class OpCodeSerializer extends JsonSerializer { @Override public void serialize(Byte op, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { - jgen.writeString(OpCode.code(op).name()); + jgen.writeString(Op.getNameOf(op)); } } } diff --git a/actuator/src/main/java/org/tron/core/vm/utils/VoteRewardUtil.java b/actuator/src/main/java/org/tron/core/vm/utils/VoteRewardUtil.java index f0cf5fa6b1a..70a73c0fc91 100644 --- a/actuator/src/main/java/org/tron/core/vm/utils/VoteRewardUtil.java +++ b/actuator/src/main/java/org/tron/core/vm/utils/VoteRewardUtil.java @@ -2,7 +2,6 @@ import java.math.BigInteger; import org.apache.commons.collections4.CollectionUtils; -import org.bouncycastle.util.encoders.Hex; import org.tron.core.capsule.AccountCapsule; import org.tron.core.store.DelegationStore; import org.tron.core.vm.config.VMConfig; diff --git a/chainbase/src/main/java/org/tron/common/bloom/Bloom.java b/chainbase/src/main/java/org/tron/common/bloom/Bloom.java new file mode 100644 index 00000000000..19d2bf53097 --- /dev/null +++ b/chainbase/src/main/java/org/tron/common/bloom/Bloom.java @@ -0,0 +1,137 @@ +package org.tron.common.bloom; + +import com.google.protobuf.ByteString; +import java.util.Arrays; +import java.util.Iterator; +import org.tron.common.crypto.Hash; +import org.tron.common.utils.ByteArray; +import org.tron.common.utils.ByteUtil; +import org.tron.core.capsule.TransactionRetCapsule; +import org.tron.protos.Protocol.TransactionInfo; +import org.tron.protos.Protocol.TransactionInfo.Log; + +public class Bloom { + + public static final int BLOOM_BIT_SIZE = 2048; + public static final int BLOOM_BYTE_SIZE = BLOOM_BIT_SIZE / 8; + private static final int STEPS_8 = 8; + private static final int ENSURE_BYTE = 255; + private static final int LOW_3_BITS = getLowBits(BLOOM_BIT_SIZE); + private byte[] data = new byte[BLOOM_BYTE_SIZE]; + + public Bloom() { + } + + public Bloom(byte[] data) { + if (data.length != this.data.length) { + throw new RuntimeException( + "input data length is not equal to Bloom size " + this.data.length); + } + this.data = data; + } + + //get several low bit. 512 -> 0b1, 1024 -> 0b11, 2048 -> 0b111, 4096-> 0b1111 + public static int getLowBits(int bloomBitSize) { + return ENSURE_BYTE >> (16 + 1 - Integer.toBinaryString(bloomBitSize).length()); + } + + //only use first six byte + public static Bloom create(byte[] toBloom) { + + int mov1 = + (((toBloom[0] & ENSURE_BYTE) & (LOW_3_BITS)) << STEPS_8) + ((toBloom[1]) & ENSURE_BYTE); + int mov2 = + (((toBloom[2] & ENSURE_BYTE) & (LOW_3_BITS)) << STEPS_8) + ((toBloom[3]) & ENSURE_BYTE); + int mov3 = + (((toBloom[4] & ENSURE_BYTE) & (LOW_3_BITS)) << STEPS_8) + ((toBloom[5]) & ENSURE_BYTE); + + byte[] data = new byte[BLOOM_BYTE_SIZE]; + Bloom bloom = new Bloom(data); + + ByteUtil.setBit(data, mov1, 1); + ByteUtil.setBit(data, mov2, 1); + ByteUtil.setBit(data, mov3, 1); + + return bloom; + } + + public static Bloom createBloom(TransactionRetCapsule transactionRetCapsule) { + if (transactionRetCapsule == null) { + return null; + } + Iterator it = + transactionRetCapsule.getInstance().getTransactioninfoList().iterator(); + Bloom blockBloom = null; + + while (it.hasNext()) { + TransactionInfo transactionInfo = it.next(); + if (transactionInfo == null || transactionInfo.getLogCount() == 0) { + continue; + } + + if (blockBloom == null) { + blockBloom = new Bloom(); + } + + for (Log log : transactionInfo.getLogList()) { + //log.address doesn't have "41" ahead + Bloom bloom = Bloom.create(Hash.sha3(log.getAddress().toByteArray())); + blockBloom.or(bloom); + + for (ByteString topic : log.getTopicsList()) { + bloom = Bloom.create(Hash.sha3(topic.toByteArray())); + blockBloom.or(bloom); + } + } + } + + return blockBloom; + } + + public void or(Bloom bloom) { + for (int i = 0; i < data.length; ++i) { + data[i] |= bloom.data[i]; + } + } + + /** + * (this || topicBloom) == this + */ + public boolean matches(Bloom topicBloom) { + Bloom copy = copy(); + copy.or(topicBloom); + return this.equals(copy); + } + + public byte[] getData() { + return data; + } + + public Bloom copy() { + return new Bloom(Arrays.copyOf(getData(), getData().length)); + } + + @Override + public String toString() { + return ByteArray.toHexString(data); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + Bloom bloom = (Bloom) o; + + return Arrays.equals(data, bloom.data); + } + + @Override + public int hashCode() { + return data != null ? Arrays.hashCode(data) : 0; + } +} diff --git a/chainbase/src/main/java/org/tron/common/error/TronDBException.java b/chainbase/src/main/java/org/tron/common/error/TronDBException.java new file mode 100644 index 00000000000..ef2c36f88d0 --- /dev/null +++ b/chainbase/src/main/java/org/tron/common/error/TronDBException.java @@ -0,0 +1,18 @@ +package org.tron.common.error; + +public class TronDBException extends RuntimeException { + public TronDBException() { + } + + public TronDBException(String s) { + super(s); + } + + public TronDBException(String s, Throwable throwable) { + super(s, throwable); + } + + public TronDBException(Throwable throwable) { + super(throwable); + } +} diff --git a/chainbase/src/main/java/org/tron/common/runtime/ProgramResult.java b/chainbase/src/main/java/org/tron/common/runtime/ProgramResult.java index 83c65a2ae97..112b7f921af 100644 --- a/chainbase/src/main/java/org/tron/common/runtime/ProgramResult.java +++ b/chainbase/src/main/java/org/tron/common/runtime/ProgramResult.java @@ -23,7 +23,7 @@ public class ProgramResult { private long energyUsed = 0; - private long futureRefund = 0; + //private long futureRefund = 0; private byte[] hReturn = EMPTY_BYTE_ARRAY; private byte[] contractAddress = EMPTY_BYTE_ARRAY; @@ -31,7 +31,7 @@ public class ProgramResult { private boolean revert; private Set deleteAccounts; - private ByteArraySet touchedAccounts = new ByteArraySet(); + //private ByteArraySet touchedAccounts = new ByteArraySet(); private List internalTransactions; private List logInfoList; private TransactionResultCapsule ret = new TransactionResultCapsule(); @@ -134,19 +134,19 @@ public void addDeleteAccounts(Set accounts) { } } - public void addTouchAccount(byte[] addr) { - touchedAccounts.add(addr); - } +// public void addTouchAccount(byte[] addr) { +// touchedAccounts.add(addr); +// } - public Set getTouchedAccounts() { - return touchedAccounts; - } +// public Set getTouchedAccounts() { +// return touchedAccounts; +// } - public void addTouchAccounts(Set accounts) { - if (!isEmpty(accounts)) { - getTouchedAccounts().addAll(accounts); - } - } +// public void addTouchAccounts(Set accounts) { +// if (!isEmpty(accounts)) { +// getTouchedAccounts().addAll(accounts); +// } +// } public List getLogInfoList() { if (logInfoList == null) { @@ -207,22 +207,22 @@ public void rejectInternalTransactions() { } } - public void addFutureRefund(long energyValue) { - futureRefund += energyValue; - } +// public void addFutureRefund(long energyValue) { +// futureRefund += energyValue; +// } - public long getFutureRefund() { - return futureRefund; - } +// public long getFutureRefund() { +// return futureRefund; +// } - public void resetFutureRefund() { - futureRefund = 0; - } +// public void resetFutureRefund() { +// futureRefund = 0; +// } public void reset() { getDeleteAccounts().clear(); getLogInfoList().clear(); - resetFutureRefund(); + //resetFutureRefund(); } public void merge(ProgramResult another) { @@ -230,8 +230,8 @@ public void merge(ProgramResult another) { if (another.getException() == null && !another.isRevert()) { addDeleteAccounts(another.getDeleteAccounts()); addLogInfos(another.getLogInfoList()); - addFutureRefund(another.getFutureRefund()); - addTouchAccounts(another.getTouchedAccounts()); + //addFutureRefund(another.getFutureRefund()); + //addTouchAccounts(another.getTouchedAccounts()); } } diff --git a/chainbase/src/main/java/org/tron/common/storage/leveldb/LevelDbDataSourceImpl.java b/chainbase/src/main/java/org/tron/common/storage/leveldb/LevelDbDataSourceImpl.java index d76742eef96..df75d0ecd68 100644 --- a/chainbase/src/main/java/org/tron/common/storage/leveldb/LevelDbDataSourceImpl.java +++ b/chainbase/src/main/java/org/tron/common/storage/leveldb/LevelDbDataSourceImpl.java @@ -39,12 +39,11 @@ import lombok.extern.slf4j.Slf4j; import org.iq80.leveldb.CompressionType; import org.iq80.leveldb.DB; -import org.iq80.leveldb.DBException; import org.iq80.leveldb.DBIterator; import org.iq80.leveldb.Options; +import org.iq80.leveldb.ReadOptions; import org.iq80.leveldb.WriteBatch; import org.iq80.leveldb.WriteOptions; -import org.iq80.leveldb.ReadOptions; import org.tron.common.parameter.CommonParameter; import org.tron.common.storage.WriteOptionsWrapper; import org.tron.common.utils.FileUtil; @@ -127,6 +126,9 @@ private void openDatabase(Options dbOptions) throws IOException { } try { database = factory.open(dbPath.toFile(), dbOptions); + logger.info("DB {} open success with : writeBufferSize {}M,cacheSize {}M,maxOpenFiles {}.", + this.getDBName(), dbOptions.writeBufferSize() / 1024 / 1024, + dbOptions.cacheSize() / 1024 / 1024, dbOptions.maxOpenFiles()); } catch (IOException e) { if (e.getMessage().contains("Corruption:")) { factory.repair(dbPath.toFile(), dbOptions); @@ -202,12 +204,9 @@ public byte[] getData(byte[] key) { resetDbLock.readLock().lock(); try { return database.get(key); - } catch (DBException e) { - logger.debug(e.getMessage(), e); } finally { resetDbLock.readLock().unlock(); } - return null; } @Override diff --git a/chainbase/src/main/java/org/tron/common/utils/StorageUtils.java b/chainbase/src/main/java/org/tron/common/utils/StorageUtils.java index f62e65a621b..16df43f1534 100644 --- a/chainbase/src/main/java/org/tron/common/utils/StorageUtils.java +++ b/chainbase/src/main/java/org/tron/common/utils/StorageUtils.java @@ -1,7 +1,6 @@ package org.tron.common.utils; import static org.tron.common.parameter.CommonParameter.ENERGY_LIMIT_HARD_FORK; -import static org.tron.common.utils.DbOptionalsUtils.createDefaultDbOptions; import java.io.File; import org.apache.commons.lang3.StringUtils; @@ -56,15 +55,6 @@ public static Options getOptionsByDbName(String dbName) { if (hasProperty(dbName)) { return getProperty(dbName).getDbOptions(); } - Options options = createDefaultDbOptions(); - switch (dbName) { - case "block": - case "transactionHistoryStore": - case "transactionRetStore": - case "trans": options.writeBufferSize(256 * 1024 * 1024); - break; - default: - } - return options; + return CommonParameter.getInstance().getStorage().newDefaultDbOptions(dbName); } } diff --git a/chainbase/src/main/java/org/tron/core/ChainBaseManager.java b/chainbase/src/main/java/org/tron/core/ChainBaseManager.java index d313dc8a79f..7cbb842f622 100644 --- a/chainbase/src/main/java/org/tron/core/ChainBaseManager.java +++ b/chainbase/src/main/java/org/tron/core/ChainBaseManager.java @@ -55,6 +55,7 @@ import org.tron.core.store.MarketPairToPriceStore; import org.tron.core.store.NullifierStore; import org.tron.core.store.ProposalStore; +import org.tron.core.store.SectionBloomStore; import org.tron.core.store.StorageRowStore; import org.tron.core.store.TransactionHistoryStore; import org.tron.core.store.TransactionRetStore; @@ -216,6 +217,10 @@ public class ChainBaseManager { @Setter private TreeBlockIndexStore merkleTreeIndexStore; + @Autowired + @Getter + private SectionBloomStore sectionBloomStore; + public void closeOneStore(ITronChainBase database) { logger.info("******** begin to close " + database.getName() + " ********"); try { @@ -258,6 +263,7 @@ public void closeAllStore() { closeOneStore(commonStore); closeOneStore(commonDataBase); closeOneStore(pbftSignDataStore); + closeOneStore(sectionBloomStore); } // for test only diff --git a/chainbase/src/main/java/org/tron/core/capsule/BlockCapsule.java b/chainbase/src/main/java/org/tron/core/capsule/BlockCapsule.java index df498c43407..5979ae5bf83 100755 --- a/chainbase/src/main/java/org/tron/core/capsule/BlockCapsule.java +++ b/chainbase/src/main/java/org/tron/core/capsule/BlockCapsule.java @@ -28,7 +28,7 @@ import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; -import org.bouncycastle.util.encoders.Hex; +import org.tron.common.bloom.Bloom; import org.tron.common.crypto.SignInterface; import org.tron.common.crypto.SignUtils; import org.tron.common.parameter.CommonParameter; @@ -58,6 +58,9 @@ public class BlockCapsule implements ProtoCapsule { private List transactions = new ArrayList<>(); private StringBuilder toStringBuff = new StringBuilder(); private boolean isSwitch; + @Getter + @Setter + private Bloom bloom; public boolean isSwitch() { return isSwitch; diff --git a/chainbase/src/main/java/org/tron/core/db/TransactionTrace.java b/chainbase/src/main/java/org/tron/core/db/TransactionTrace.java index 76910495ec4..6a74d6d015f 100644 --- a/chainbase/src/main/java/org/tron/core/db/TransactionTrace.java +++ b/chainbase/src/main/java/org/tron/core/db/TransactionTrace.java @@ -209,7 +209,7 @@ public void finalization() throws ContractExeException { } if (StringUtils.isEmpty(transactionContext.getProgramResult().getRuntimeError())) { for (DataWord contract : transactionContext.getProgramResult().getDeleteAccounts()) { - deleteContract(convertToTronAddress((contract.getLast20Bytes()))); + deleteContract(contract.toTronAddress()); } } } diff --git a/chainbase/src/main/java/org/tron/core/db2/core/SnapshotManager.java b/chainbase/src/main/java/org/tron/core/db2/core/SnapshotManager.java index b2e59374a8b..7e2d8f5074a 100644 --- a/chainbase/src/main/java/org/tron/core/db2/core/SnapshotManager.java +++ b/chainbase/src/main/java/org/tron/core/db2/core/SnapshotManager.java @@ -16,11 +16,14 @@ import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.locks.LockSupport; import java.util.stream.Collectors; +import javax.annotation.PostConstruct; import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.tron.common.error.TronDBException; import org.tron.common.parameter.CommonParameter; import org.tron.common.storage.WriteOptionsWrapper; import org.tron.core.db.RevokingDatabase; @@ -55,6 +58,9 @@ public class SnapshotManager implements RevokingDatabase { private volatile int flushCount = 0; + private Thread exitThread; + private volatile boolean hitDown; + private Map flushServices = new HashMap<>(); @Autowired @@ -68,6 +74,19 @@ public class SnapshotManager implements RevokingDatabase { public SnapshotManager(String checkpointPath) { } + @PostConstruct + public void init() { + exitThread = new Thread(() -> { + LockSupport.park(); + // to Guarantee Some other thread invokes unpark with the current thread as the target + if (hitDown) { + System.exit(1); + } + }); + exitThread.setName("exit-thread"); + exitThread.start(); + } + public static String simpleDecode(byte[] bytes) { byte[] lengthBytes = Arrays.copyOf(bytes, 4); int length = Ints.fromByteArray(lengthBytes); @@ -89,7 +108,7 @@ public synchronized ISession buildSession(boolean forceEnable) { disabled = false; } - if (size > maxSize.get()) { + if (size > maxSize.get() && !hitDown) { flushCount = flushCount + (size - maxSize.get()); updateSolidity(size - maxSize.get()); size = maxSize.get(); @@ -249,8 +268,9 @@ private void refresh() { future.get(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); + throw new TronDBException(e); } catch (ExecutionException e) { - logger.error(e.getMessage(), e); + throw new TronDBException(e); } } @@ -285,59 +305,74 @@ public void flush() { } if (shouldBeRefreshed()) { - long start = System.currentTimeMillis(); - deleteCheckpoint(); - createCheckpoint(); - long checkPointEnd = System.currentTimeMillis(); - refresh(); - flushCount = 0; - logger.info("flush cost:{}, create checkpoint cost:{}, refresh cost:{}", - System.currentTimeMillis() - start, - checkPointEnd - start, - System.currentTimeMillis() - checkPointEnd - ); + try { + long start = System.currentTimeMillis(); + deleteCheckpoint(); + createCheckpoint(); + long checkPointEnd = System.currentTimeMillis(); + refresh(); + flushCount = 0; + logger.info("flush cost:{}, create checkpoint cost:{}, refresh cost:{}", + System.currentTimeMillis() - start, + checkPointEnd - start, + System.currentTimeMillis() - checkPointEnd + ); + } catch (TronDBException e) { + logger.error(" Find fatal error , program will be exited soon", e); + hitDown = true; + LockSupport.unpark(exitThread); + } } } private void createCheckpoint() { - Map batch = new HashMap<>(); - for (Chainbase db : dbs) { - Snapshot head = db.getHead(); - if (Snapshot.isRoot(head)) { - return; - } + try { + Map batch = new HashMap<>(); + for (Chainbase db : dbs) { + Snapshot head = db.getHead(); + if (Snapshot.isRoot(head)) { + return; + } - String dbName = db.getDbName(); - Snapshot next = head.getRoot(); - for (int i = 0; i < flushCount; ++i) { - next = next.getNext(); - SnapshotImpl snapshot = (SnapshotImpl) next; - DB keyValueDB = snapshot.getDb(); - for (Map.Entry e : keyValueDB) { - Key k = e.getKey(); - Value v = e.getValue(); - batch.put(WrappedByteArray.of(Bytes.concat(simpleEncode(dbName), k.getBytes())), - WrappedByteArray.of(v.encode())); + String dbName = db.getDbName(); + Snapshot next = head.getRoot(); + for (int i = 0; i < flushCount; ++i) { + next = next.getNext(); + SnapshotImpl snapshot = (SnapshotImpl) next; + DB keyValueDB = snapshot.getDb(); + for (Map.Entry e : keyValueDB) { + Key k = e.getKey(); + Value v = e.getValue(); + batch.put(WrappedByteArray.of(Bytes.concat(simpleEncode(dbName), k.getBytes())), + WrappedByteArray.of(v.encode())); + } } } - } - checkTmpStore.getDbSource().updateByBatch(batch.entrySet().stream() - .map(e -> Maps.immutableEntry(e.getKey().getBytes(), e.getValue().getBytes())) - .collect(HashMap::new, (m, k) -> m.put(k.getKey(), k.getValue()), HashMap::putAll), - WriteOptionsWrapper.getInstance().sync(CommonParameter - .getInstance().getStorage().isDbSync())); + checkTmpStore.getDbSource().updateByBatch(batch.entrySet().stream() + .map(e -> Maps.immutableEntry(e.getKey().getBytes(), e.getValue().getBytes())) + .collect(HashMap::new, (m, k) -> m.put(k.getKey(), k.getValue()), HashMap::putAll), + WriteOptionsWrapper.getInstance().sync(CommonParameter + .getInstance().getStorage().isDbSync())); + + } catch ( Exception e) { + throw new TronDBException(e); + } } private void deleteCheckpoint() { - Map hmap = new HashMap(); - if (!checkTmpStore.getDbSource().allKeys().isEmpty()) { - for (Map.Entry e : checkTmpStore.getDbSource()) { - hmap.put(e.getKey(), null); + try { + Map hmap = new HashMap<>(); + if (!checkTmpStore.getDbSource().allKeys().isEmpty()) { + for (Map.Entry e : checkTmpStore.getDbSource()) { + hmap.put(e.getKey(), null); + } } - } - checkTmpStore.getDbSource().updateByBatch(hmap); + checkTmpStore.getDbSource().updateByBatch(hmap); + } catch (Exception e) { + throw new TronDBException(e); + } } // ensure run this method first after process start. diff --git a/chainbase/src/main/java/org/tron/core/store/SectionBloomStore.java b/chainbase/src/main/java/org/tron/core/store/SectionBloomStore.java new file mode 100644 index 00000000000..ae82561844a --- /dev/null +++ b/chainbase/src/main/java/org/tron/core/store/SectionBloomStore.java @@ -0,0 +1,115 @@ +package org.tron.core.store; + +import java.util.ArrayList; +import java.util.BitSet; +import java.util.List; +import java.util.Objects; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.ArrayUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import org.tron.common.bloom.Bloom; +import org.tron.common.utils.ByteUtil; +import org.tron.core.capsule.BytesCapsule; +import org.tron.core.capsule.TransactionRetCapsule; +import org.tron.core.db.TronStoreWithRevoking; +import org.tron.core.exception.EventBloomException; + +@Slf4j(topic = "DB") +@Component +public class SectionBloomStore extends TronStoreWithRevoking { + + public static final int BLOCK_PER_SECTION = 2048; + private List bitList; + + @Autowired + public SectionBloomStore(@Value("section-bloom") String dbName) { + super(dbName); + } + + @Override + public BytesCapsule get(byte[] key) { + byte[] value = revokingDB.getUnchecked(key); + if (ArrayUtils.isEmpty(value)) { + return null; + } + return new BytesCapsule(value); + } + + @Override + public boolean has(byte[] key) { + byte[] value = revokingDB.getUnchecked(key); + + return !ArrayUtils.isEmpty(value); + } + + private long combineKey(int section, int bitIndex) { + return section * 1_000_000L + bitIndex; + } + + public BitSet get(int section, int bitIndex) throws EventBloomException { + long keyLong = combineKey(section, bitIndex); + byte[] key = Long.toHexString(keyLong).getBytes(); + BytesCapsule bytesCapsule = get(key); + if (bytesCapsule == null) { + return null; + } + byte[] data; + try { + data = ByteUtil.decompress(bytesCapsule.getData()); + } catch (Exception e) { + throw new EventBloomException("decompress byte failed"); + } + return BitSet.valueOf(data); + } + + public void put(int section, int bitIndex, BitSet bitSet) throws EventBloomException { + long keyLong = combineKey(section, bitIndex); + byte[] key = Long.toHexString(keyLong).getBytes(); + byte[] compressData = ByteUtil.compress(bitSet.toByteArray()); + super.put(key, new BytesCapsule(compressData)); + } + + public Bloom initBlockSection(TransactionRetCapsule transactionRetCapsule) { + Bloom blockBloom = Bloom.createBloom(transactionRetCapsule); + + if (Objects.isNull(blockBloom)) { + bitList = null; + return null; + } + + bitList = new ArrayList<>(); + BitSet bs = BitSet.valueOf(blockBloom.getData()); + for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1)) { + // operate on index i here + if (i == Integer.MAX_VALUE) { + break; // or (i+1) would overflow + } + bitList.add(i); + } + + return blockBloom; + } + + public void write(long blockNum) throws EventBloomException { + if (CollectionUtils.isEmpty(bitList)) { + return; + } + + int section = (int) (blockNum / BLOCK_PER_SECTION); + int blockNumOffset = (int) (blockNum % BLOCK_PER_SECTION); + for (int bitIndex : bitList) { + // get first from leveldb + BitSet bitSet = get(section, bitIndex); + if (Objects.isNull(bitSet)) { + bitSet = new BitSet(BLOCK_PER_SECTION); + } + // update + bitSet.set(blockNumOffset); + // put into leveldb + put(section, bitIndex, bitSet); + } + } +} diff --git a/common/src/main/java/org/tron/common/parameter/CommonParameter.java b/common/src/main/java/org/tron/common/parameter/CommonParameter.java index a9d4faafaaf..f105eb6402d 100644 --- a/common/src/main/java/org/tron/common/parameter/CommonParameter.java +++ b/common/src/main/java/org/tron/common/parameter/CommonParameter.java @@ -358,7 +358,7 @@ public class CommonParameter { public long allowAccountStateRoot; @Getter @Setter - public int validContractProtoThreadNum; + public int validContractProtoThreadNum = 1; @Getter @Setter public int shieldedTransInPendingMaxCounts; @@ -525,4 +525,8 @@ public boolean isECKeyCryptoEngine() { return cryptoEngine.equalsIgnoreCase(Constant.ECKey_ENGINE); } + + public boolean isJsonRpcFilterEnabled() { + return jsonRpcHttpFullNodeEnable || jsonRpcHttpSolidityNodeEnable; + } } diff --git a/common/src/main/java/org/tron/common/runtime/vm/DataWord.java b/common/src/main/java/org/tron/common/runtime/vm/DataWord.java index c4adcd4f49d..0eb0487a534 100644 --- a/common/src/main/java/org/tron/common/runtime/vm/DataWord.java +++ b/common/src/main/java/org/tron/common/runtime/vm/DataWord.java @@ -25,6 +25,7 @@ import org.bouncycastle.util.encoders.Hex; import org.tron.common.utils.ByteArray; import org.tron.common.utils.ByteUtil; +import org.tron.common.utils.DecodeUtil; import org.tron.common.utils.FastByteComparisons; import org.tron.core.db.ByteArrayWrapper; @@ -182,6 +183,13 @@ public byte[] getLast20Bytes() { return Arrays.copyOfRange(data, 12, data.length); } + public byte[] toTronAddress() { + byte[] ret = new byte[21]; + ret[0] = DecodeUtil.addressPreFixByte; + System.arraycopy(data, 12, ret, 1, 20); + return ret; + } + public BigInteger value() { return new BigInteger(1, data); } diff --git a/common/src/main/java/org/tron/common/utils/ByteArray.java b/common/src/main/java/org/tron/common/utils/ByteArray.java index 801c64bd68a..b77dd310380 100644 --- a/common/src/main/java/org/tron/common/utils/ByteArray.java +++ b/common/src/main/java/org/tron/common/utils/ByteArray.java @@ -14,6 +14,7 @@ import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import org.bouncycastle.util.encoders.Hex; +import org.tron.core.exception.JsonRpcInvalidParamsException; /* * Copyright (c) [2016] [ ] @@ -138,6 +139,10 @@ public static String toJsonHex(int x) { return toJsonHex((long) x); } + public static String toJsonHex(String x) { + return "0x" + x; + } + public static BigInteger hexToBigInteger(String input) { if (input.startsWith("0x")) { return new BigInteger(input.substring(2), 16); @@ -146,16 +151,18 @@ public static BigInteger hexToBigInteger(String input) { } } - public static long jsonHexToLong(String x) throws Exception { - if (!x.startsWith("0x")) - throw new Exception("Incorrect hex syntax"); + public static long jsonHexToLong(String x) throws JsonRpcInvalidParamsException { + if (!x.startsWith("0x")) { + throw new JsonRpcInvalidParamsException("Incorrect hex syntax"); + } x = x.substring(2); return Long.parseLong(x, 16); } public static int jsonHexToInt(String x) throws Exception { - if (!x.startsWith("0x")) + if (!x.startsWith("0x")) { throw new Exception("Incorrect hex syntax"); + } x = x.substring(2); return Integer.parseInt(x, 16); } @@ -187,4 +194,14 @@ public static boolean matrixContains(List source, byte[] obj) { } return false; } + + public static String fromHex(String x) { + if (x.startsWith("0x")) { + x = x.substring(2); + } + if (x.length() % 2 != 0) { + x = "0" + x; + } + return x; + } } diff --git a/common/src/main/java/org/tron/common/utils/ByteUtil.java b/common/src/main/java/org/tron/common/utils/ByteUtil.java index b849e509a35..54d637d3f01 100644 --- a/common/src/main/java/org/tron/common/utils/ByteUtil.java +++ b/common/src/main/java/org/tron/common/utils/ByteUtil.java @@ -20,11 +20,17 @@ import com.google.common.base.Preconditions; import com.google.common.primitives.UnsignedBytes; +import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.math.BigInteger; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.zip.DataFormatException; +import java.util.zip.Deflater; +import java.util.zip.Inflater; +import org.tron.core.exception.EventBloomException; public class ByteUtil { @@ -440,9 +446,71 @@ public static void reverse(byte[] bytes) { } public static byte[] longTo32Bytes(long value) { + if (value == 0) { + return new byte[32]; + } byte[] longBytes = ByteArray.fromLong(value); byte[] zeroBytes = new byte[24]; return ByteUtil.merge(zeroBytes, longBytes); } + public static byte[] setBit(byte[] data, int pos, int val) { + + if ((data.length * 8) - 1 < pos) { + throw new Error("outside byte array limit, pos: " + pos); + } + + int posByte = data.length - 1 - (pos) / 8; + int posBit = (pos) % 8; + byte setter = (byte) (1 << (posBit)); + byte toBeSet = data[posByte]; + byte result; + if (val == 1) { + result = (byte) (toBeSet | setter); + } else { + result = (byte) (toBeSet & ~setter); + } + + data[posByte] = result; + return data; + } + + public static byte[] compress(byte[] data) throws EventBloomException { + Deflater deflater = new Deflater(); + deflater.setInput(data); + + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(data.length); + + deflater.finish(); + byte[] buffer = new byte[1024]; + while (!deflater.finished()) { + int count = deflater.deflate(buffer); // returns the generated code... index + outputStream.write(buffer, 0, count); + } + try { + outputStream.close(); + } catch (IOException e) { + throw new EventBloomException("compress data failed"); + } + byte[] output = outputStream.toByteArray(); + + return output; + } + + public static byte[] decompress(byte[] data) throws IOException, DataFormatException { + Inflater inflater = new Inflater(); + inflater.setInput(data); + + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(data.length); + byte[] buffer = new byte[1024]; + while (!inflater.finished()) { + int count = inflater.inflate(buffer); + outputStream.write(buffer, 0, count); + } + outputStream.close(); + byte[] output = outputStream.toByteArray(); + + return output; + } + } diff --git a/common/src/main/java/org/tron/common/utils/DbOptionalsUtils.java b/common/src/main/java/org/tron/common/utils/DbOptionalsUtils.java index 61af37b1060..69965bf39ab 100644 --- a/common/src/main/java/org/tron/common/utils/DbOptionalsUtils.java +++ b/common/src/main/java/org/tron/common/utils/DbOptionalsUtils.java @@ -1,5 +1,7 @@ package org.tron.common.utils; +import java.util.Arrays; +import java.util.List; import org.iq80.leveldb.CompressionType; import org.iq80.leveldb.Options; @@ -8,9 +10,37 @@ public class DbOptionalsUtils { public static final CompressionType DEFAULT_COMPRESSION_TYPE = CompressionType.SNAPPY; public static final int DEFAULT_BLOCK_SIZE = 4 * 1024; - public static final int DEFAULT_WRITE_BUFFER_SIZE = 64 * 1024 * 1024; + public static final int DEFAULT_WRITE_BUFFER_SIZE = 16 * 1024 * 1024; + public static final int DEFAULT_WRITE_BUFFER_SIZE_M = 64 * 1024 * 1024; + public static final int DEFAULT_WRITE_BUFFER_SIZE_L = 256 * 1024 * 1024; public static final long DEFAULT_CACHE_SIZE = 32 * 1024 * 1024L; - public static final int DEFAULT_MAX_OPEN_FILES = 5000; + public static final int DEFAULT_MAX_OPEN_FILES = 100; + /** + * defaultM = { + * maxOpenFiles = 500 + * } + * add defaultL settings into storage to overwrite 100 + */ + public static final int DEFAULT_MAX_OPEN_FILES_M = 100; + /** + * defaultL = { + * maxOpenFiles = 1000 + * } + * add defaultL settings into storage to overwrite 100 + */ + public static final int DEFAULT_MAX_OPEN_FILES_L = 100; + // Read a lot + public static final List DB_M = Arrays.asList( "code", "contract"); + // Read frequently + public static final List DB_L = Arrays.asList("account", "delegation", + "storage-row"); + // Write frequently + public static final List DB_WRITE_L = Arrays.asList("block", "account", + "transactionRetStore", "storage-row", "trans"); + + private DbOptionalsUtils() { + throw new IllegalStateException("DbOptionalsUtils class"); + } public static Options createDefaultDbOptions() { Options dbOptions = new Options(); @@ -27,4 +57,48 @@ public static Options createDefaultDbOptions() { return dbOptions; } + + public static Options newDefaultDbOptions(String name ,Options defaultOptions) { + Options dbOptions = new Options(); + + dbOptions.createIfMissing(defaultOptions.createIfMissing()); + dbOptions.paranoidChecks(defaultOptions.paranoidChecks()); + dbOptions.verifyChecksums(defaultOptions.verifyChecksums()); + + dbOptions.compressionType(defaultOptions.compressionType()); + dbOptions.blockSize(defaultOptions.blockSize()); + dbOptions.writeBufferSize(defaultOptions.writeBufferSize()); + dbOptions.cacheSize(defaultOptions.cacheSize()); + dbOptions.maxOpenFiles(defaultOptions.maxOpenFiles()); + + + if (DB_M.contains(name)) { + adjustDefaultDbOptionsForM(dbOptions); + } + + if (DB_L.contains(name)) { + adjustDefaultDbOptionsForL(dbOptions); + } + + if (DB_WRITE_L.contains(name)) { + adjustDefaultDbOptionsForWriteL(dbOptions); + } + + return dbOptions; + } + + private static void adjustDefaultDbOptionsForM(Options defaultOptions) { + defaultOptions.maxOpenFiles(DEFAULT_MAX_OPEN_FILES_M); + defaultOptions.writeBufferSize(DEFAULT_WRITE_BUFFER_SIZE_M); + } + + private static void adjustDefaultDbOptionsForL(Options defaultOptions) { + defaultOptions.maxOpenFiles(DEFAULT_MAX_OPEN_FILES_L); + defaultOptions.writeBufferSize(DEFAULT_WRITE_BUFFER_SIZE_M); + } + + private static void adjustDefaultDbOptionsForWriteL(Options defaultOptions) { + + defaultOptions.writeBufferSize(DEFAULT_WRITE_BUFFER_SIZE_L); + } } diff --git a/common/src/main/java/org/tron/core/config/args/Storage.java b/common/src/main/java/org/tron/core/config/args/Storage.java index 870e5dd9f32..021accb808a 100644 --- a/common/src/main/java/org/tron/core/config/args/Storage.java +++ b/common/src/main/java/org/tron/core/config/args/Storage.java @@ -36,7 +36,6 @@ * @version 1.0 * @since 2018/5/25 */ - public class Storage { /** @@ -50,6 +49,10 @@ public class Storage { private static final String INDEX_SWITCH_CONFIG_KEY = "storage.index.switch"; private static final String TRANSACTIONHISTORY_SWITCH_CONFIG_KEY = "storage.transHistory.switch"; private static final String PROPERTIES_CONFIG_KEY = "storage.properties"; + private static final String PROPERTIES_CONFIG_DB_KEY = "storage"; + private static final String PROPERTIES_CONFIG_DEFAULT_KEY = "default"; + private static final String PROPERTIES_CONFIG_DEFAULT_M_KEY = "defaultM"; + private static final String PROPERTIES_CONFIG_DEFAULT_L_KEY = "defaultL"; private static final String DEFAULT_TRANSACTIONHISTORY_SWITCH = "on"; private static final String NAME_CONFIG_KEY = "name"; @@ -74,6 +77,7 @@ public class Storage { private static final String DEFAULT_DB_DIRECTORY = "database"; private static final String DEFAULT_INDEX_DIRECTORY = "index"; private static final String DEFAULT_INDEX_SWITCH = "on"; + private Config storage; /** * Database storage directory: /path/to/{dbDirectory} @@ -113,6 +117,8 @@ public class Storage { @Setter private String transactionHistorySwitch; + private Options defaultDbOptions; + /** * Key: dbName, Value: Property object of that database */ @@ -162,7 +168,7 @@ public static String getTransactionHistorySwitchFromConfig(final Config config) : DEFAULT_TRANSACTIONHISTORY_SWITCH; } - private static Property createProperty(final ConfigObject conf) { + private Property createProperty(final ConfigObject conf) { Property property = new Property(); @@ -191,8 +197,15 @@ private static Property createProperty(final ConfigObject conf) { } // Check, get and set fields of Options - Options dbOptions = DbOptionalsUtils.createDefaultDbOptions(); + Options dbOptions = newDefaultDbOptions(property.getName()); + + setIfNeeded(conf, dbOptions); + property.setDbOptions(dbOptions); + return property; + } + + private static void setIfNeeded(ConfigObject conf, Options dbOptions) { if (conf.containsKey(CREATE_IF_MISSING_CONFIG_KEY)) { dbOptions.createIfMissing( Boolean.parseBoolean( @@ -281,9 +294,6 @@ private static Property createProperty(final ConfigObject conf) { "[storage.properties] maxOpenFiles must be Integer type."); } } - - property.setDbOptions(dbOptions); - return property; } /** @@ -294,7 +304,7 @@ private static Property createProperty(final ConfigObject conf) { public void setPropertyMapFromConfig(final Config config) { if (config.hasPath(PROPERTIES_CONFIG_KEY)) { propertyMap = config.getObjectList(PROPERTIES_CONFIG_KEY).stream() - .map(Storage::createProperty) + .map(this::createProperty) .collect(Collectors.toMap(Property::getName, p -> p)); } } @@ -314,5 +324,31 @@ public void deleteAllStoragePaths() { } } } -} + public void setDefaultDbOptions(final Config config) { + this.defaultDbOptions = DbOptionalsUtils.createDefaultDbOptions(); + storage = config.getConfig(PROPERTIES_CONFIG_DB_KEY); + } + + public Options newDefaultDbOptions(String name ) { + // first fetch origin default + Options options = DbOptionalsUtils.newDefaultDbOptions(name, this.defaultDbOptions); + + // then fetch from config for default + if (storage.hasPath(PROPERTIES_CONFIG_DEFAULT_KEY)) { + setIfNeeded(storage.getObject(PROPERTIES_CONFIG_DEFAULT_KEY), options); + } + + // check if has middle config + if (storage.hasPath(PROPERTIES_CONFIG_DEFAULT_M_KEY) && DbOptionalsUtils.DB_M.contains(name)) { + setIfNeeded(storage.getObject(PROPERTIES_CONFIG_DEFAULT_M_KEY), options); + + } + // check if has large config + if (storage.hasPath(PROPERTIES_CONFIG_DEFAULT_L_KEY) && DbOptionalsUtils.DB_L.contains(name)) { + setIfNeeded(storage.getObject(PROPERTIES_CONFIG_DEFAULT_L_KEY), options); + } + + return options; + } +} diff --git a/common/src/main/java/org/tron/core/exception/EventBloomException.java b/common/src/main/java/org/tron/core/exception/EventBloomException.java new file mode 100644 index 00000000000..5cbf456278a --- /dev/null +++ b/common/src/main/java/org/tron/core/exception/EventBloomException.java @@ -0,0 +1,16 @@ +package org.tron.core.exception; + +public class EventBloomException extends TronException { + + public EventBloomException() { + super(); + } + + public EventBloomException(String message) { + super(message); + } + + public EventBloomException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/common/src/main/java/org/tron/core/exception/JsonRpcTooManyResultException.java b/common/src/main/java/org/tron/core/exception/JsonRpcTooManyResultException.java new file mode 100644 index 00000000000..e8e183d49c1 --- /dev/null +++ b/common/src/main/java/org/tron/core/exception/JsonRpcTooManyResultException.java @@ -0,0 +1,16 @@ +package org.tron.core.exception; + +public class JsonRpcTooManyResultException extends TronException { + + public JsonRpcTooManyResultException() { + super(); + } + + public JsonRpcTooManyResultException(String message) { + super(message); + } + + public JsonRpcTooManyResultException(String message, Throwable cause) { + super(message, cause); + } +} \ No newline at end of file diff --git a/framework/src/main/java/org/tron/common/application/ApplicationImpl.java b/framework/src/main/java/org/tron/common/application/ApplicationImpl.java index 8e80a568a96..1aa158d4be2 100644 --- a/framework/src/main/java/org/tron/common/application/ApplicationImpl.java +++ b/framework/src/main/java/org/tron/common/application/ApplicationImpl.java @@ -73,6 +73,7 @@ public void shutdown() { dbManager.stopRePushThread(); dbManager.stopRePushTriggerThread(); EventPluginLoader.getInstance().stopPlugin(); + dbManager.stopFilterProcessThread(); logger.info("******** end to shutdown ********"); FullNode.shutDownSign = true; } diff --git a/framework/src/main/java/org/tron/common/application/TronApplicationContext.java b/framework/src/main/java/org/tron/common/application/TronApplicationContext.java index 21177b736fb..204b5dc5a68 100644 --- a/framework/src/main/java/org/tron/common/application/TronApplicationContext.java +++ b/framework/src/main/java/org/tron/common/application/TronApplicationContext.java @@ -41,6 +41,7 @@ public void destroy() { Manager dbManager = getBean(Manager.class); dbManager.stopRePushThread(); dbManager.stopRePushTriggerThread(); + dbManager.stopFilterProcessThread(); super.destroy(); } } diff --git a/framework/src/main/java/org/tron/common/logsfilter/capsule/BlockFilterCapsule.java b/framework/src/main/java/org/tron/common/logsfilter/capsule/BlockFilterCapsule.java new file mode 100644 index 00000000000..9cf3c0c690e --- /dev/null +++ b/framework/src/main/java/org/tron/common/logsfilter/capsule/BlockFilterCapsule.java @@ -0,0 +1,38 @@ +package org.tron.common.logsfilter.capsule; + +import static org.tron.core.services.jsonrpc.TronJsonRpcImpl.handleBLockFilter; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.extern.slf4j.Slf4j; +import org.tron.core.capsule.BlockCapsule; + +@Slf4j(topic = "API") +@ToString +public class BlockFilterCapsule extends FilterTriggerCapsule { + + @Getter + @Setter + private String blockHash; + @Getter + @Setter + private boolean solidified; + + public BlockFilterCapsule(BlockCapsule block, boolean solidified) { + blockHash = block.getBlockId().toString(); + this.solidified = solidified; + } + + public BlockFilterCapsule(String blockHash, boolean solidified) { + this.blockHash = blockHash; + this.solidified = solidified; + } + + @Override + public void processFilterTrigger() { + handleBLockFilter(this); + } + +} + diff --git a/framework/src/main/java/org/tron/common/logsfilter/capsule/ContractTriggerCapsule.java b/framework/src/main/java/org/tron/common/logsfilter/capsule/ContractTriggerCapsule.java index 60e15d91d5d..cc5b2ce473c 100644 --- a/framework/src/main/java/org/tron/common/logsfilter/capsule/ContractTriggerCapsule.java +++ b/framework/src/main/java/org/tron/common/logsfilter/capsule/ContractTriggerCapsule.java @@ -54,8 +54,8 @@ public void processTrigger() { ABI.Entry eventEntry = null; if (abi != null && abi.getEntrysCount() > 0 && topics != null && !topics.isEmpty() - && !ArrayUtils.isEmpty(topics.get(0).getData()) && Args.getInstance().getStorage() - .isContractParseSwitch()) { + && !ArrayUtils.isEmpty(topics.get(0).getData()) + && Args.getInstance().getStorage().isContractParseSwitch()) { String logHash = topics.get(0).toString(); for (ABI.Entry entry : abi.getEntrysList()) { diff --git a/framework/src/main/java/org/tron/common/logsfilter/capsule/FilterTriggerCapsule.java b/framework/src/main/java/org/tron/common/logsfilter/capsule/FilterTriggerCapsule.java new file mode 100644 index 00000000000..0280f0c96a7 --- /dev/null +++ b/framework/src/main/java/org/tron/common/logsfilter/capsule/FilterTriggerCapsule.java @@ -0,0 +1,8 @@ +package org.tron.common.logsfilter.capsule; + +public class FilterTriggerCapsule extends TriggerCapsule { + + public void processFilterTrigger() { + throw new UnsupportedOperationException(); + } +} \ No newline at end of file diff --git a/framework/src/main/java/org/tron/common/logsfilter/capsule/LogsFilterCapsule.java b/framework/src/main/java/org/tron/common/logsfilter/capsule/LogsFilterCapsule.java new file mode 100644 index 00000000000..8a8e122d9a0 --- /dev/null +++ b/framework/src/main/java/org/tron/common/logsfilter/capsule/LogsFilterCapsule.java @@ -0,0 +1,50 @@ +package org.tron.common.logsfilter.capsule; + +import static org.tron.core.services.jsonrpc.TronJsonRpcImpl.handleLogsFilter; + +import java.util.List; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.extern.slf4j.Slf4j; +import org.tron.common.bloom.Bloom; +import org.tron.protos.Protocol.TransactionInfo; + +@Slf4j(topic = "API") +@ToString +public class LogsFilterCapsule extends FilterTriggerCapsule { + + @Getter + @Setter + private long blockNumber; + @Getter + @Setter + private String blockHash; + @Getter + @Setter + private Bloom bloom; // if solidified is true or remove is true, bloom will be null + @Getter + @Setter + private List txInfoList; + @Getter + @Setter + private boolean solidified; + @Getter + @Setter + private boolean removed; + + public LogsFilterCapsule(long blockNumber, String blockHash, Bloom bloom, + List txInfoList, boolean solidified, boolean removed) { + this.blockNumber = blockNumber; + this.blockHash = blockHash; + this.bloom = bloom; + this.txInfoList = txInfoList; + this.solidified = solidified; + this.removed = removed; + } + + @Override + public void processFilterTrigger() { + handleLogsFilter(this); + } +} \ No newline at end of file diff --git a/framework/src/main/java/org/tron/common/storage/DepositImpl.java b/framework/src/main/java/org/tron/common/storage/DepositImpl.java index 96717ad6885..7793c46a6e2 100644 --- a/framework/src/main/java/org/tron/common/storage/DepositImpl.java +++ b/framework/src/main/java/org/tron/common/storage/DepositImpl.java @@ -1,7 +1,5 @@ package org.tron.common.storage; -import static org.tron.core.db.TransactionTrace.convertToTronAddress; - import com.google.common.primitives.Longs; import com.google.protobuf.ByteString; import java.util.HashMap; @@ -27,6 +25,7 @@ import org.tron.core.db.BlockStore; import org.tron.core.db.Manager; import org.tron.core.db.TransactionStore; +import org.tron.core.db.TransactionTrace; import org.tron.core.exception.BadItemException; import org.tron.core.exception.ItemNotFoundException; import org.tron.core.store.AccountStore; @@ -379,7 +378,7 @@ public synchronized AssetIssueCapsule getAssetIssue(byte[] tokenId) { @Override public synchronized void putStorageValue(byte[] address, DataWord key, DataWord value) { - address = convertToTronAddress(address); + address = TransactionTrace.convertToTronAddress(address); if (getAccount(address) == null) { return; } @@ -396,7 +395,7 @@ public synchronized void putStorageValue(byte[] address, DataWord key, DataWord @Override public synchronized DataWord getStorageValue(byte[] address, DataWord key) { - address = convertToTronAddress(address); + address = TransactionTrace.convertToTronAddress(address); if (getAccount(address) == null) { return null; } diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index ce61cdb915e..21b8a7238a9 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -526,7 +526,7 @@ public GrpcAPI.Return broadcastTransaction(Transaction signedTransaction) { } dbManager.pushTransaction(trx); int num = tronNetService.fastBroadcastTransaction(message); - if (num == 0) { + if (num == 0 && minEffectiveConnection != 0) { return builder.setResult(false).setCode(response_code.NOT_ENOUGH_EFFECTIVE_CONNECTION) .setMessage(ByteString.copyFromUtf8("P2P broadcast failed.")).build(); } else { diff --git a/framework/src/main/java/org/tron/core/config/args/Args.java b/framework/src/main/java/org/tron/core/config/args/Args.java index d8ae045f908..b1337454dc0 100644 --- a/framework/src/main/java/org/tron/core/config/args/Args.java +++ b/framework/src/main/java/org/tron/core/config/args/Args.java @@ -374,6 +374,7 @@ public static void setParam(final String[] args, final String confFileName) { .filter(StringUtils::isNotEmpty) .orElse(Storage.getTransactionHistorySwitchFromConfig(config))); + PARAMETER.storage.setDefaultDbOptions(config); PARAMETER.storage.setPropertyMapFromConfig(config); PARAMETER.seedNode = new SeedNode(); diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index 3baf5568741..54db6c5c290 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -43,10 +43,14 @@ import org.springframework.stereotype.Component; import org.tron.api.GrpcAPI.TransactionInfoList; import org.tron.common.args.GenesisBlock; +import org.tron.common.bloom.Bloom; import org.tron.common.logsfilter.EventPluginLoader; import org.tron.common.logsfilter.FilterQuery; +import org.tron.common.logsfilter.capsule.BlockFilterCapsule; import org.tron.common.logsfilter.capsule.BlockLogTriggerCapsule; import org.tron.common.logsfilter.capsule.ContractTriggerCapsule; +import org.tron.common.logsfilter.capsule.FilterTriggerCapsule; +import org.tron.common.logsfilter.capsule.LogsFilterCapsule; import org.tron.common.logsfilter.capsule.SolidityTriggerCapsule; import org.tron.common.logsfilter.capsule.TransactionLogTriggerCapsule; import org.tron.common.logsfilter.capsule.TriggerCapsule; @@ -100,6 +104,7 @@ import org.tron.core.exception.ContractSizeNotEqualToOneException; import org.tron.core.exception.ContractValidateException; import org.tron.core.exception.DupTransactionException; +import org.tron.core.exception.EventBloomException; import org.tron.core.exception.ItemNotFoundException; import org.tron.core.exception.NonCommonBlockException; import org.tron.core.exception.ReceiptCheckErrException; @@ -192,8 +197,8 @@ public class Manager { private BlockingQueue pushTransactionQueue = new LinkedBlockingQueue<>(); @Getter private Cache transactionIdCache = CacheBuilder - .newBuilder().maximumSize(TX_ID_CACHE_SIZE) - .expireAfterWrite(1, TimeUnit.HOURS).recordStats().build(); + .newBuilder().maximumSize(TX_ID_CACHE_SIZE) + .expireAfterWrite(1, TimeUnit.HOURS).recordStats().build(); @Autowired private AccountStateCallBack accountStateCallBack; @Autowired @@ -217,6 +222,9 @@ public class Manager { // the capacity is equal to Integer.MAX_VALUE default private BlockingQueue rePushTransactions; private BlockingQueue triggerCapsuleQueue; + // log filter + private boolean isRunFilterProcessThread = true; + private BlockingQueue filterCapsuleQueue; /** * Cycle thread to rePush Transactions @@ -261,6 +269,26 @@ public class Manager { } }; + private Runnable filterProcessLoop = + () -> { + while (isRunFilterProcessThread) { + try { + FilterTriggerCapsule filterCapsule = filterCapsuleQueue.poll(1, TimeUnit.SECONDS); + if (filterCapsule != null) { + filterCapsule.processFilterTrigger(); + } + } catch (InterruptedException e) { + logger.error("filterProcessLoop get InterruptedException, error is {}", e.getMessage()); + Thread.currentThread().interrupt(); + } catch (Throwable throwable) { + logger.error("unknown throwable happened in filterProcessLoop: ", throwable); + } + } + }; + + private Comparator downComparator = (Comparator) (o1, o2) -> Long + .compare(o2.getOrder(), o1.getOrder()); + public WitnessStore getWitnessStore() { return chainBaseManager.getWitnessStore(); } @@ -273,7 +301,7 @@ public boolean needToMoveAbi() { return getDynamicPropertiesStore().getAbiMoveDone() == 0L; } - public boolean needToLoadEnergyPriceHistory() { + private boolean needToLoadEnergyPriceHistory() { return getDynamicPropertiesStore().getEnergyPriceHistoryDone() == 0L; } @@ -370,8 +398,9 @@ public void stopRePushTriggerThread() { isRunTriggerCapsuleProcessThread = false; } - private Comparator downComparator = (Comparator) (o1, o2) -> Long - .compare(o2.getOrder(), o1.getOrder()); + public void stopFilterProcessThread() { + isRunFilterProcessThread = false; + } @PostConstruct public void init() { @@ -395,6 +424,7 @@ public void init() { this.rePushTransactions = new LinkedBlockingQueue<>(); } this.triggerCapsuleQueue = new LinkedBlockingQueue<>(); + this.filterCapsuleQueue = new LinkedBlockingQueue<>(); chainBaseManager.setMerkleContainer(getMerkleContainer()); chainBaseManager.setMortgageService(mortgageService); chainBaseManager.init(); @@ -453,6 +483,12 @@ public void init() { triggerCapsuleProcessThread.start(); } + // start json rpc filter process + if (CommonParameter.getInstance().isJsonRpcFilterEnabled()) { + Thread filterProcessThread = new Thread(filterProcessLoop); + filterProcessThread.start(); + } + //initStoreFactory prepareStoreFactory(); //initActuatorCreator @@ -768,7 +804,8 @@ public void pushVerifiedBlock(BlockCapsule block) throws ContractValidateExcepti TransactionExpirationException, TooBigTransactionException, DupTransactionException, TaposException, ValidateScheduleException, ReceiptCheckErrException, VMIllegalException, TooBigTransactionResultException, UnLinkedBlockException, - NonCommonBlockException, BadNumberBlockException, BadBlockException, ZksnarkException { + NonCommonBlockException, BadNumberBlockException, BadBlockException, ZksnarkException, + EventBloomException { block.generatedByMyself = true; long start = System.currentTimeMillis(); pushBlock(block); @@ -780,20 +817,20 @@ public void pushVerifiedBlock(BlockCapsule block) throws ContractValidateExcepti } private void applyBlock(BlockCapsule block) throws ContractValidateException, - ContractExeException, ValidateSignatureException, AccountResourceInsufficientException, - TransactionExpirationException, TooBigTransactionException, DupTransactionException, - TaposException, ValidateScheduleException, ReceiptCheckErrException, - VMIllegalException, TooBigTransactionResultException, - ZksnarkException, BadBlockException { + ContractExeException, ValidateSignatureException, AccountResourceInsufficientException, + TransactionExpirationException, TooBigTransactionException, DupTransactionException, + TaposException, ValidateScheduleException, ReceiptCheckErrException, + VMIllegalException, TooBigTransactionResultException, + ZksnarkException, BadBlockException, EventBloomException { applyBlock(block, block.getTransactions()); } private void applyBlock(BlockCapsule block, List txs) - throws ContractValidateException, ContractExeException, ValidateSignatureException, - AccountResourceInsufficientException, TransactionExpirationException, - TooBigTransactionException,DupTransactionException, TaposException, - ValidateScheduleException, ReceiptCheckErrException, VMIllegalException, - TooBigTransactionResultException, ZksnarkException, BadBlockException { + throws ContractValidateException, ContractExeException, ValidateSignatureException, + AccountResourceInsufficientException, TransactionExpirationException, + TooBigTransactionException, DupTransactionException, TaposException, + ValidateScheduleException, ReceiptCheckErrException, VMIllegalException, + TooBigTransactionResultException, ZksnarkException, BadBlockException, EventBloomException { processBlock(block, txs); chainBaseManager.getBlockStore().put(block.getBlockId().getBytes(), block); chainBaseManager.getBlockIndexStore().put(block.getBlockId()); @@ -815,7 +852,7 @@ private void switchFork(BlockCapsule newHead) ValidateScheduleException, AccountResourceInsufficientException, TaposException, TooBigTransactionException, TooBigTransactionResultException, DupTransactionException, TransactionExpirationException, NonCommonBlockException, ReceiptCheckErrException, - VMIllegalException, ZksnarkException, BadBlockException { + VMIllegalException, ZksnarkException, BadBlockException, EventBloomException { MetricsUtil.meterMark(MetricsKey.BLOCKCHAIN_FORK_COUNT); @@ -843,6 +880,7 @@ private void switchFork(BlockCapsule newHead) .getLatestBlockHeaderHash() .equals(binaryTree.getValue().peekLast().getParentHash())) { reOrgContractTrigger(); + reOrgLogsFilter(); eraseBlock(); } } @@ -959,13 +997,13 @@ public synchronized void pushBlock(final BlockCapsule block) TaposException, TooBigTransactionException, TooBigTransactionResultException, DupTransactionException, TransactionExpirationException, BadNumberBlockException, BadBlockException, NonCommonBlockException, - ReceiptCheckErrException, VMIllegalException, ZksnarkException { + ReceiptCheckErrException, VMIllegalException, ZksnarkException, EventBloomException { long start = System.currentTimeMillis(); List txs = getVerifyTxs(block); logger.info("Block num: {}, re-push-size: {}, pending-size: {}, " - + "block-tx-size: {}, verify-tx-size: {}", - block.getNum(), rePushTransactions.size(), pendingTransactions.size(), - block.getTransactions().size(), txs.size()); + + "block-tx-size: {}, verify-tx-size: {}", + block.getNum(), rePushTransactions.size(), pendingTransactions.size(), + block.getTransactions().size(), txs.size()); try (PendingManager pm = new PendingManager(this)) { if (!block.generatedByMyself) { @@ -1060,12 +1098,16 @@ public synchronized void pushBlock(final BlockCapsule block) } try (ISession tmpSession = revokingStore.buildSession()) { + long oldSolidNum = + chainBaseManager.getDynamicPropertiesStore().getLatestSolidifiedBlockNum(); + applyBlock(newBlock, txs); tmpSession.commit(); // if event subscribe is enabled, post block trigger to queue postBlockTrigger(newBlock); // if event subscribe is enabled, post solidity trigger to queue - postSolidityTrigger(getDynamicPropertiesStore().getLatestSolidifiedBlockNum()); + postSolidityTrigger(oldSolidNum, + getDynamicPropertiesStore().getLatestSolidifiedBlockNum()); } catch (Throwable throwable) { logger.error(throwable.getMessage(), throwable); khaosDb.removeBlk(block.getBlockId()); @@ -1408,7 +1450,7 @@ private void processBlock(BlockCapsule block, List txs) AccountResourceInsufficientException, TaposException, TooBigTransactionException, DupTransactionException, TransactionExpirationException, ValidateScheduleException, ReceiptCheckErrException, VMIllegalException, TooBigTransactionResultException, - ZksnarkException, BadBlockException { + ZksnarkException, BadBlockException, EventBloomException { // todo set revoking db max size. // checkWitness @@ -1477,6 +1519,13 @@ private void processBlock(BlockCapsule block, List txs) updateDynamicProperties(block); chainBaseManager.getBalanceTraceStore().resetCurrentBlockTrace(); + + if (CommonParameter.getInstance().isJsonRpcFilterEnabled()) { + Bloom blockBloom = chainBaseManager.getSectionBloomStore() + .initBlockSection(transactionRetCapsule); + chainBaseManager.getSectionBloomStore().write(block.getNum()); + block.setBloom(blockBloom); + } } private void payReward(BlockCapsule block) { @@ -1723,17 +1772,39 @@ private void startEventSubscribing() { } } - private void postSolidityTrigger(final long latestSolidifiedBlockNumber) { + private void postSolidityFilter(final long oldSolidNum, final long latestSolidifiedBlockNumber) { + if (oldSolidNum >= latestSolidifiedBlockNumber) { + logger.warn("post solidity filter failed, oldSolidity: {} >= latestSolidity: {}", + oldSolidNum, latestSolidifiedBlockNumber); + return; + } + + BlockCapsule blockCapsule; + try { + blockCapsule = chainBaseManager.getBlockByNum(latestSolidifiedBlockNumber); + } catch (Exception e) { + logger.error("postSolidityFilter getBlockByNum={} except, {}", + latestSolidifiedBlockNumber, e.getMessage()); + return; + } + + postBlockFilter(blockCapsule, true); + postLogsFilter(blockCapsule, true, false); + } + + private void postSolidityTrigger(final long oldSolidNum, final long latestSolidifiedBlockNumber) { if (eventPluginLoaded && EventPluginLoader.getInstance().isSolidityLogTriggerEnable()) { for (Long i : Args.getSolidityContractLogTriggerMap().keySet()) { postSolidityLogContractTrigger(i, latestSolidifiedBlockNumber); } } + if (eventPluginLoaded && EventPluginLoader.getInstance().isSolidityEventTriggerEnable()) { for (Long i : Args.getSolidityContractEventTriggerMap().keySet()) { postSolidityEventContractTrigger(i, latestSolidifiedBlockNumber); } } + if (eventPluginLoaded && EventPluginLoader.getInstance().isSolidityTriggerEnable()) { SolidityTriggerCapsule solidityTriggerCapsule = new SolidityTriggerCapsule(latestSolidifiedBlockNumber); @@ -1753,11 +1824,127 @@ private void postSolidityTrigger(final long latestSolidifiedBlockNumber) { + "block number: {}", latestSolidifiedBlockNumber); } } + + if (CommonParameter.getInstance().isJsonRpcHttpSolidityNodeEnable()) { + postSolidityFilter(oldSolidNum, latestSolidifiedBlockNumber); + } + } + + private void processTransactionTrigger(BlockCapsule newBlock) { + List transactionCapsuleList = newBlock.getTransactions(); + + // need to set eth compatible data from transactionInfoList + if (EventPluginLoader.getInstance().isTransactionLogTriggerEthCompatible()) { + TransactionInfoList transactionInfoList = TransactionInfoList.newBuilder().build(); + TransactionInfoList.Builder transactionInfoListBuilder = TransactionInfoList.newBuilder(); + + try { + TransactionRetCapsule result = chainBaseManager.getTransactionRetStore() + .getTransactionInfoByBlockNum(ByteArray.fromLong(newBlock.getNum())); + + if (!Objects.isNull(result) && !Objects.isNull(result.getInstance())) { + result.getInstance().getTransactioninfoList().forEach( + transactionInfoListBuilder::addTransactionInfo + ); + + transactionInfoList = transactionInfoListBuilder.build(); + } + } catch (BadItemException e) { + logger.error("postBlockTrigger getTransactionInfoList blockNum={}, error is {}", + newBlock.getNum(), e.getMessage()); + } + + if (transactionCapsuleList.size() == transactionInfoList.getTransactionInfoCount()) { + long cumulativeEnergyUsed = 0; + long cumulativeLogCount = 0; + long energyUnitPrice = chainBaseManager.getDynamicPropertiesStore().getEnergyFee(); + + for (int i = 0; i < transactionCapsuleList.size(); i++) { + TransactionInfo transactionInfo = transactionInfoList.getTransactionInfo(i); + TransactionCapsule transactionCapsule = transactionCapsuleList.get(i); + // reset block num to ignore value is -1 + transactionCapsule.setBlockNum(newBlock.getNum()); + + cumulativeEnergyUsed += postTransactionTrigger(transactionCapsule, newBlock, i, + cumulativeEnergyUsed, cumulativeLogCount, transactionInfo, energyUnitPrice); + + cumulativeLogCount += transactionInfo.getLogCount(); + } + } else { + logger.error("postBlockTrigger blockNum={} has no transactions or " + + "the sizes of transactionInfoList and transactionCapsuleList are not equal", + newBlock.getNum()); + for (TransactionCapsule e : newBlock.getTransactions()) { + postTransactionTrigger(e, newBlock); + } + } + } else { + for (TransactionCapsule e : newBlock.getTransactions()) { + postTransactionTrigger(e, newBlock); + } + } + } + + private void reOrgLogsFilter() { + if (CommonParameter.getInstance().isJsonRpcHttpFullNodeEnable()) { + logger.info("switch fork occurred, post reOrgLogsFilter"); + + try { + BlockCapsule oldHeadBlock = chainBaseManager.getBlockById( + getDynamicPropertiesStore().getLatestBlockHeaderHash()); + postLogsFilter(oldHeadBlock, false, true); + } catch (BadItemException | ItemNotFoundException e) { + logger.error("block header hash does not exist or is bad: {}", + getDynamicPropertiesStore().getLatestBlockHeaderHash()); + } + } + } + + private void postBlockFilter(final BlockCapsule blockCapsule, boolean solidified) { + BlockFilterCapsule blockFilterCapsule = new BlockFilterCapsule(blockCapsule, solidified); + if (!filterCapsuleQueue.offer(blockFilterCapsule)) { + logger.info("too many filters, block filter lost: {}", blockCapsule.getBlockId()); + } + } + + private void postLogsFilter(final BlockCapsule blockCapsule, boolean solidified, + boolean removed) { + if (!blockCapsule.getTransactions().isEmpty()) { + long blockNumber = blockCapsule.getNum(); + List transactionInfoList = new ArrayList<>(); + + try { + TransactionRetCapsule result = chainBaseManager.getTransactionRetStore() + .getTransactionInfoByBlockNum(ByteArray.fromLong(blockNumber)); + + if (!Objects.isNull(result) && !Objects.isNull(result.getInstance())) { + transactionInfoList.addAll(result.getInstance().getTransactioninfoList()); + } + } catch (BadItemException e) { + logger.error("processLogsFilter getTransactionInfoList blockNum={}, error is {}", + blockNumber, e.getMessage()); + return; + } + + LogsFilterCapsule logsFilterCapsule = new LogsFilterCapsule(blockNumber, + blockCapsule.getBlockId().toString(), blockCapsule.getBloom(), transactionInfoList, + solidified, removed); + + if (!filterCapsuleQueue.offer(logsFilterCapsule)) { + logger.info("too many filters, logs filter lost: {}", blockNumber); + } + } } private void postBlockTrigger(final BlockCapsule blockCapsule) { BlockCapsule newBlock = blockCapsule; + // post block and logs for jsonrpc + if (CommonParameter.getInstance().isJsonRpcHttpFullNodeEnable()) { + postBlockFilter(blockCapsule, false); + postLogsFilter(blockCapsule, false, false); + } + // process block trigger if (eventPluginLoaded && EventPluginLoader.getInstance().isBlockLogTriggerEnable()) { if (EventPluginLoader.getInstance().isBlockLogTriggerSolidified()) { @@ -1781,11 +1968,11 @@ private void postBlockTrigger(final BlockCapsule blockCapsule) { // process transaction trigger if (eventPluginLoaded && EventPluginLoader.getInstance().isTransactionLogTriggerEnable()) { + // set newBlock if (EventPluginLoader.getInstance().isTransactionLogTriggerSolidified()) { long solidityBlkNum = getDynamicPropertiesStore().getLatestSolidifiedBlockNum(); try { - newBlock = chainBaseManager - .getBlockByNum(solidityBlkNum); + newBlock = chainBaseManager.getBlockByNum(solidityBlkNum); } catch (Exception e) { logger.error("postBlockTrigger getBlockByNum blkNum={} except, error is {}", solidityBlkNum, e.getMessage()); @@ -1795,58 +1982,7 @@ private void postBlockTrigger(final BlockCapsule blockCapsule) { newBlock = blockCapsule; } - List transactionCapsuleList = newBlock.getTransactions(); - - // get transactionInfoList - if (EventPluginLoader.getInstance().isTransactionLogTriggerEthCompatible()) { - TransactionInfoList transactionInfoList = TransactionInfoList.newBuilder().build(); - TransactionInfoList.Builder transactionInfoListBuilder = TransactionInfoList.newBuilder(); - - try { - TransactionRetCapsule result = chainBaseManager.getTransactionRetStore() - .getTransactionInfoByBlockNum(ByteArray.fromLong(newBlock.getNum())); - - if (!Objects.isNull(result) && !Objects.isNull(result.getInstance())) { - result.getInstance().getTransactioninfoList().forEach( - transactionInfoListBuilder::addTransactionInfo - ); - - transactionInfoList = transactionInfoListBuilder.build(); - } - } catch (BadItemException e) { - logger.error("postBlockTrigger getTransactionInfoList blockNum={}, error is {}", - newBlock.getNum(), e.getMessage()); - } - - if (transactionCapsuleList.size() == transactionInfoList.getTransactionInfoCount()) { - long cumulativeEnergyUsed = 0; - long cumulativeLogCount = 0; - long energyUnitPrice = chainBaseManager.getDynamicPropertiesStore().getEnergyFee(); - - for (int i = 0; i < transactionCapsuleList.size(); i++) { - TransactionInfo transactionInfo = transactionInfoList.getTransactionInfo(i); - TransactionCapsule transactionCapsule = transactionCapsuleList.get(i); - // reset block num to ignore value is -1 - transactionCapsule.setBlockNum(newBlock.getNum()); - - cumulativeEnergyUsed += postTransactionTrigger(transactionCapsule, newBlock, i, - cumulativeEnergyUsed, cumulativeLogCount, transactionInfo, energyUnitPrice); - - cumulativeLogCount += transactionInfo.getLogCount(); - } - } else { - logger.error("postBlockTrigger blockNum={} has no transactions or " - + "the sizes of transactionInfoList and transactionCapsuleList are not equal", - newBlock.getNum()); - for (TransactionCapsule e : newBlock.getTransactions()) { - postTransactionTrigger(e, newBlock); - } - } - } else { - for (TransactionCapsule e : newBlock.getTransactions()) { - postTransactionTrigger(e, newBlock); - } - } + processTransactionTrigger(newBlock); } } @@ -1913,8 +2049,8 @@ private void postContractTrigger(final TransactionTrace trace, boolean remove, S contractTriggerCapsule.setBlockHash(blockHash); if (!triggerCapsuleQueue.offer(contractTriggerCapsule)) { - logger - .info("too many triggers, contract log trigger lost: {}", trigger.getTransactionId()); + logger.info("too many triggers, contract log trigger lost: {}", + trigger.getTransactionId()); } } } @@ -1925,32 +2061,6 @@ private void prepareStoreFactory() { StoreFactory.getInstance().setChainBaseManager(chainBaseManager); } - private static class ValidateSignTask implements Callable { - - private TransactionCapsule trx; - private CountDownLatch countDownLatch; - private ChainBaseManager manager; - - ValidateSignTask(TransactionCapsule trx, CountDownLatch countDownLatch, - ChainBaseManager manager) { - this.trx = trx; - this.countDownLatch = countDownLatch; - this.manager = manager; - } - - @Override - public Boolean call() throws ValidateSignatureException { - try { - trx.validateSignature(manager.getAccountStore(), manager.getDynamicPropertiesStore()); - } catch (ValidateSignatureException e) { - throw e; - } finally { - countDownLatch.countDown(); - } - return true; - } - } - public TransactionCapsule getTxFromPending(String txId) { AtomicReference transactionCapsule = new AtomicReference<>(); Sha256Hash txHash = Sha256Hash.wrap(ByteArray.fromHexString(txId)); @@ -1988,4 +2098,30 @@ public long getPendingSize() { + getPoppedTransactions().size(); return value; } + + private static class ValidateSignTask implements Callable { + + private TransactionCapsule trx; + private CountDownLatch countDownLatch; + private ChainBaseManager manager; + + ValidateSignTask(TransactionCapsule trx, CountDownLatch countDownLatch, + ChainBaseManager manager) { + this.trx = trx; + this.countDownLatch = countDownLatch; + this.manager = manager; + } + + @Override + public Boolean call() throws ValidateSignatureException { + try { + trx.validateSignature(manager.getAccountStore(), manager.getDynamicPropertiesStore()); + } catch (ValidateSignatureException e) { + throw e; + } finally { + countDownLatch.countDown(); + } + return true; + } + } } diff --git a/framework/src/main/java/org/tron/core/net/TronNetDelegate.java b/framework/src/main/java/org/tron/core/net/TronNetDelegate.java index 0787981893d..e6ee870b3de 100644 --- a/framework/src/main/java/org/tron/core/net/TronNetDelegate.java +++ b/framework/src/main/java/org/tron/core/net/TronNetDelegate.java @@ -30,6 +30,7 @@ import org.tron.core.exception.ContractSizeNotEqualToOneException; import org.tron.core.exception.ContractValidateException; import org.tron.core.exception.DupTransactionException; +import org.tron.core.exception.EventBloomException; import org.tron.core.exception.ItemNotFoundException; import org.tron.core.exception.NonCommonBlockException; import org.tron.core.exception.P2pException; @@ -234,7 +235,8 @@ public void processBlock(BlockCapsule block, boolean isSync) throws P2pException | NonCommonBlockException | ReceiptCheckErrException | VMIllegalException - | ZksnarkException e) { + | ZksnarkException + | EventBloomException e) { metricsService.failProcessBlock(block.getNum(), e.getMessage()); logger.error("Process block failed, {}, reason: {}.", blockId.getString(), e.getMessage()); throw new P2pException(TypeEnum.BAD_BLOCK, e); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java index c44f3f1911a..95a2dc7c292 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java @@ -1,9 +1,12 @@ package org.tron.core.services.jsonrpc; +import static org.tron.common.utils.DecodeUtil.addressPreFixString; + import com.google.common.base.Throwables; import com.google.common.primitives.Longs; import com.google.protobuf.Any; import com.google.protobuf.ByteString; +import java.security.SecureRandom; import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -13,6 +16,7 @@ import org.tron.api.GrpcAPI.AssetIssueList; import org.tron.common.crypto.Hash; import org.tron.common.parameter.CommonParameter; +import org.tron.common.runtime.vm.DataWord; import org.tron.common.utils.ByteArray; import org.tron.common.utils.ByteUtil; import org.tron.common.utils.DecodeUtil; @@ -47,6 +51,7 @@ @Slf4j(topic = "API") public class JsonRpcApiUtil { + public static byte[] convertToTronAddress(byte[] address) { byte[] newAddress = new byte[21]; byte[] temp = new byte[] {Wallet.getAddressPreFixByte()}; @@ -361,22 +366,53 @@ public static long getUnfreezeAssetAmount(byte[] addressBytes, Wallet wallet) { return amount; } - public static byte[] addressHashToByteArray(String hash) throws JsonRpcInvalidParamsException { - byte[] bHash; + /** + * convert 40 or 42 hex string of address to byte array, compatible with "41"(T) ahead, + * padding 0 ahead if length is odd. + */ + public static byte[] addressCompatibleToByteArray(String hexAddress) + throws JsonRpcInvalidParamsException { + byte[] addressByte; try { - bHash = ByteArray.fromHexString(hash); - if (bHash.length != DecodeUtil.ADDRESS_SIZE / 2 - && bHash.length != DecodeUtil.ADDRESS_SIZE / 2 - 1) { + addressByte = ByteArray.fromHexString(hexAddress); + if (addressByte.length != DecodeUtil.ADDRESS_SIZE / 2 + && addressByte.length != DecodeUtil.ADDRESS_SIZE / 2 - 1) { throw new JsonRpcInvalidParamsException("invalid address hash value"); } - if (bHash.length == DecodeUtil.ADDRESS_SIZE / 2 - 1) { - bHash = ByteUtil.merge(new byte[] {DecodeUtil.addressPreFixByte}, bHash); + if (addressByte.length == DecodeUtil.ADDRESS_SIZE / 2 - 1) { + addressByte = ByteUtil.merge(new byte[] {DecodeUtil.addressPreFixByte}, addressByte); + } else if (addressByte[0] != ByteArray.fromHexString(DecodeUtil.addressPreFixString)[0]) { + // addressByte.length == DecodeUtil.ADDRESS_SIZE / 2 + throw new JsonRpcInvalidParamsException("invalid address hash value"); } } catch (Exception e) { throw new JsonRpcInvalidParamsException(e.getMessage()); } - return bHash; + return addressByte; + } + + /** + * convert 40 hex string of address to byte array, padding 0 ahead if length is odd. + */ + public static byte[] addressToByteArray(String hexAddress) throws JsonRpcInvalidParamsException { + byte[] addressByte = ByteArray.fromHexString(hexAddress); + if (addressByte.length != DecodeUtil.ADDRESS_SIZE / 2 - 1) { + throw new JsonRpcInvalidParamsException("invalid address: " + hexAddress); + } + byte[] last20Bytes = new DataWord(addressByte).getLast20Bytes(); + return last20Bytes; + } + + /** + * check if topic is hex string of size 64, padding 0 ahead if length is odd. + */ + public static byte[] topicToByteArray(String hexTopic) throws JsonRpcInvalidParamsException { + byte[] topicByte = ByteArray.fromHexString(hexTopic); + if (topicByte.length != 32) { + throw new JsonRpcInvalidParamsException("invalid topic: " + hexTopic); + } + return topicByte; } public static boolean paramStringIsNull(String string) { @@ -462,4 +498,24 @@ public static long parseEnergyFee(long timestamp, String energyPriceHistory) { return -1; } + + public static long getByJsonBlockId(String blockNumOrTag) throws JsonRpcInvalidParamsException { + if ("pending".equalsIgnoreCase(blockNumOrTag)) { + throw new JsonRpcInvalidParamsException("TAG pending not supported"); + } + if (StringUtils.isEmpty(blockNumOrTag) || "latest".equalsIgnoreCase(blockNumOrTag)) { + return -1; + } else if ("earliest".equalsIgnoreCase(blockNumOrTag)) { + return 0; + } else { + return ByteArray.jsonHexToLong(blockNumOrTag); + } + } + + public static String generateFilterId() { + SecureRandom random = new SecureRandom(); + byte[] uid = new byte[16]; // 128 bits are converted to 16 bytes + random.nextBytes(uid); + return ByteArray.toHexString(uid); + } } diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java index efb40cc680f..4a6f5193c0e 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java @@ -5,99 +5,32 @@ import com.googlecode.jsonrpc4j.JsonRpcError; import com.googlecode.jsonrpc4j.JsonRpcErrors; import com.googlecode.jsonrpc4j.JsonRpcMethod; +import java.io.IOException; import java.util.List; +import java.util.concurrent.ExecutionException; import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; import lombok.ToString; import lombok.Value; import org.springframework.stereotype.Component; +import org.tron.common.runtime.vm.DataWord; +import org.tron.common.utils.ByteArray; +import org.tron.core.exception.BadItemException; +import org.tron.core.exception.ItemNotFoundException; import org.tron.core.exception.JsonRpcInternalException; import org.tron.core.exception.JsonRpcInvalidParamsException; import org.tron.core.exception.JsonRpcInvalidRequestException; import org.tron.core.exception.JsonRpcMethodNotFoundException; +import org.tron.core.exception.JsonRpcTooManyResultException; +import org.tron.core.services.jsonrpc.types.BlockResult; +import org.tron.core.services.jsonrpc.types.BuildArguments; +import org.tron.core.services.jsonrpc.types.CallArguments; +import org.tron.core.services.jsonrpc.types.TransactionReceipt; +import org.tron.core.services.jsonrpc.types.TransactionResult; @Component public interface TronJsonRpc { - @Value - @AllArgsConstructor - @ToString - class SyncingResult { - - private final String startingBlock; - private final String currentBlock; - private final String highestBlock; - } - - @JsonPropertyOrder(alphabetic = true) - class BlockResult { - - public String number; - public String hash; - public String parentHash; - public String nonce; - public String sha3Uncles; - public String logsBloom; - public String transactionsRoot; - public String stateRoot; - public String receiptsRoot; - public String miner; - public String difficulty; - public String totalDifficulty; - public String extraData; - public String size; - public String gasLimit; - public String gasUsed; - public String timestamp; - public Object[] transactions; //TransactionResult or byte32 - public String[] uncles; - - public String baseFeePerGas = null; - public String mixHash = null; - } - - class CompilationResult { - - public String code; - public CompilationInfo info; - - @Override - public String toString() { - return "CompilationResult{" - + "code='" + code + '\'' - + ", info=" + info - + '}'; - } - } - - class CompilationInfo { - - public String source; - public String language; - public String languageVersion; - public String compilerVersion; - // public CallTransaction.Function[] abiDefinition; - public String userDoc; - public String developerDoc; - - @Override - public String toString() { - return "CompilationInfo{" - + "source='" + source + '\'' - + ", language='" + language + '\'' - + ", languageVersion='" + languageVersion + '\'' - + ", compilerVersion='" + compilerVersion + '\'' - // + ", abiDefinition=" + abiDefinition + '\'' - + ", userDoc='" + userDoc + '\'' - + ", developerDoc='" + developerDoc + '\'' - + '}'; - } - } - - class TransactionJson { - - public JSONObject transaction; - } - @JsonRpcMethod("web3_clientVersion") String web3ClientVersion(); @@ -335,4 +268,167 @@ String getSendTransactionCountOfAddress(String address, String blockNumOrTag) }) CompilationResult ethSubmitHashrate(String hashrate, String id) throws JsonRpcMethodNotFoundException; + + // filter + @JsonRpcMethod("eth_newFilter") + @JsonRpcErrors({ + @JsonRpcError(exception = JsonRpcMethodNotFoundException.class, code = -32601, data = "{}"), + @JsonRpcError(exception = JsonRpcInvalidParamsException.class, code = -32602, data = "{}"), + }) + String newFilter(FilterRequest fr) throws JsonRpcInvalidParamsException, + JsonRpcMethodNotFoundException; + + @JsonRpcMethod("eth_newBlockFilter") + @JsonRpcErrors({ + @JsonRpcError(exception = JsonRpcMethodNotFoundException.class, code = -32601, data = "{}"), + }) + String newBlockFilter() throws JsonRpcMethodNotFoundException; + + @JsonRpcMethod("eth_uninstallFilter") + @JsonRpcErrors({ + @JsonRpcError(exception = JsonRpcMethodNotFoundException.class, code = -32601, data = "{}"), + @JsonRpcError(exception = JsonRpcInvalidParamsException.class, code = -32602, data = "{}"), + @JsonRpcError(exception = ItemNotFoundException.class, code = -32000, data = "{}"), + }) + boolean uninstallFilter(String filterId) throws JsonRpcInvalidParamsException, + JsonRpcMethodNotFoundException, ItemNotFoundException; + + @JsonRpcMethod("eth_getFilterChanges") + @JsonRpcErrors({ + @JsonRpcError(exception = JsonRpcMethodNotFoundException.class, code = -32601, data = "{}"), + @JsonRpcError(exception = JsonRpcInvalidParamsException.class, code = -32602, data = "{}"), + @JsonRpcError(exception = ItemNotFoundException.class, code = -32000, data = "{}"), + }) + Object[] getFilterChanges(String filterId) + throws JsonRpcInvalidParamsException, IOException, ExecutionException, InterruptedException, + JsonRpcMethodNotFoundException, ItemNotFoundException; + + @JsonRpcMethod("eth_getLogs") + @JsonRpcErrors({ + @JsonRpcError(exception = JsonRpcInvalidParamsException.class, code = -32602, data = "{}"), + @JsonRpcError(exception = JsonRpcMethodNotFoundException.class, code = -32601, data = "{}"), + @JsonRpcError(exception = JsonRpcTooManyResultException.class, code = -32005, data = "{}"), + @JsonRpcError(exception = BadItemException.class, code = -32000, data = "{}"), + @JsonRpcError(exception = ExecutionException.class, code = -32000, data = "{}"), + @JsonRpcError(exception = InterruptedException.class, code = -32000, data = "{}"), + @JsonRpcError(exception = ItemNotFoundException.class, code = -32000, data = "{}"), + }) + LogFilterElement[] getLogs(FilterRequest fr) throws JsonRpcInvalidParamsException, + ExecutionException, InterruptedException, BadItemException, ItemNotFoundException, + JsonRpcMethodNotFoundException, JsonRpcTooManyResultException; + + @JsonRpcMethod("eth_getFilterLogs") + @JsonRpcErrors({ + @JsonRpcError(exception = JsonRpcInvalidParamsException.class, code = -32602, data = "{}"), + @JsonRpcError(exception = JsonRpcMethodNotFoundException.class, code = -32601, data = "{}"), + @JsonRpcError(exception = JsonRpcTooManyResultException.class, code = -32005, data = "{}"), + @JsonRpcError(exception = BadItemException.class, code = -32000, data = "{}"), + @JsonRpcError(exception = ExecutionException.class, code = -32000, data = "{}"), + @JsonRpcError(exception = InterruptedException.class, code = -32000, data = "{}"), + @JsonRpcError(exception = ItemNotFoundException.class, code = -32000, data = "{}"), + }) + LogFilterElement[] getFilterLogs(String filterId) throws JsonRpcInvalidParamsException, + ExecutionException, InterruptedException, BadItemException, ItemNotFoundException, + JsonRpcMethodNotFoundException, JsonRpcTooManyResultException; + + @Value + @AllArgsConstructor + @ToString + class SyncingResult { + + private final String startingBlock; + private final String currentBlock; + private final String highestBlock; + } + + @ToString + class CompilationResult { + + public String code; + public CompilationInfo info; + } + + @ToString + class CompilationInfo { + + public String source; + public String language; + public String languageVersion; + public String compilerVersion; + // public CallTransaction.Function[] abiDefinition; + public String userDoc; + public String developerDoc; + + } + + class TransactionJson { + + public JSONObject transaction; + } + + /** + * FILTER OBJECT + *
  • address [optional] + * - a contract address or a list of addresses from which logs should originate. + *
  • fromBlock [optional, default is "latest"] + * - an integer block number, or the string "latest", "earliest" or "pending" + *
  • toBlock [optional, default is "latest"] + * - an integer block number, or the string "latest", "earliest" or "pending" + *
  • topics[optional] - Array of 32 Bytes DATA topics. Topics are order-dependent. + *
    + *
    A note on specifying topic filters: Topics are order-dependent. + * A transaction with a log with topics [A, B] will be matched by the following topic filters: + * + *
  • [] - anything" + *
  • [A] - A in first position (and anything after) + *
  • [null, B] - anything in first position AND B in second position (and anything after) + *
  • [A, B] - A in first position AND B in second position (and anything after)" + *
  • [[A, B], [A, B]] - (A OR B) in first position AND (A OR B) in second position (and + * anything after) + * + *
    Filter IDs will be valid for up to fifteen minutes, and can polled by any connection using + * the same v3 project ID. + */ + @NoArgsConstructor + @AllArgsConstructor + class FilterRequest { + + public String fromBlock; + public String toBlock; + public Object address; + public Object[] topics; + public String blockHash; // EIP-234: makes fromBlock = toBlock = blockHash + + } + + @JsonPropertyOrder(alphabetic = true) + class LogFilterElement { + + public String logIndex; + public String transactionIndex; + public String transactionHash; + public String blockHash; + public String blockNumber; + public String address; + public String data; + public String[] topics; + public boolean removed; + + public LogFilterElement(String blockHash, Long blockNum, String txId, Integer txIndex, + String contractAddress, List topicList, String logData, int logIdx, + boolean removed) { + logIndex = ByteArray.toJsonHex(logIdx); + this.blockNumber = blockNum == null ? null : ByteArray.toJsonHex(blockNum); + this.blockHash = blockHash == null ? null : ByteArray.toJsonHex(blockHash); + transactionIndex = txIndex == null ? null : ByteArray.toJsonHex(txIndex); + transactionHash = ByteArray.toJsonHex(txId); + address = ByteArray.toJsonHex(contractAddress); + data = logData == null ? "0x" : ByteArray.toJsonHex(logData); + topics = new String[topicList.size()]; + for (int i = 0; i < topics.length; i++) { + topics[i] = ByteArray.toJsonHex(topicList.get(i).getData()); + } + this.removed = removed; + } + } } diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 80d63382d2b..a30968b62d9 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -4,7 +4,8 @@ import static org.tron.core.Wallet.CONTRACT_VALIDATE_EXCEPTION; import static org.tron.core.services.http.Util.setTransactionExtraData; import static org.tron.core.services.http.Util.setTransactionPermissionId; -import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.addressHashToByteArray; +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.addressCompatibleToByteArray; +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.generateFilterId; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getEnergyUsageTotal; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getTransactionIndex; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getTxID; @@ -13,40 +14,62 @@ import com.alibaba.fastjson.JSON; import com.google.protobuf.ByteString; import com.google.protobuf.GeneratedMessageV3; -import java.util.ArrayList; import java.util.Arrays; +import java.util.Iterator; import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; +import lombok.Getter; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.tron.api.GrpcAPI.BytesMessage; import org.tron.api.GrpcAPI.Return; import org.tron.api.GrpcAPI.Return.response_code; import org.tron.api.GrpcAPI.TransactionExtention; import org.tron.common.crypto.Hash; -import org.tron.common.parameter.CommonParameter; +import org.tron.common.logsfilter.capsule.BlockFilterCapsule; +import org.tron.common.logsfilter.capsule.LogsFilterCapsule; import org.tron.common.runtime.vm.DataWord; import org.tron.common.utils.ByteArray; import org.tron.common.utils.ByteUtil; -import org.tron.common.utils.Sha256Hash; import org.tron.core.Wallet; import org.tron.core.capsule.BlockCapsule; import org.tron.core.capsule.TransactionCapsule; import org.tron.core.db.Manager; import org.tron.core.db2.core.Chainbase; +import org.tron.core.exception.BadItemException; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.core.exception.HeaderNotFound; +import org.tron.core.exception.ItemNotFoundException; import org.tron.core.exception.JsonRpcInternalException; import org.tron.core.exception.JsonRpcInvalidParamsException; import org.tron.core.exception.JsonRpcInvalidRequestException; import org.tron.core.exception.JsonRpcMethodNotFoundException; +import org.tron.core.exception.JsonRpcTooManyResultException; import org.tron.core.exception.VMIllegalException; import org.tron.core.services.NodeInfoService; import org.tron.core.services.http.JsonFormat; import org.tron.core.services.http.Util; +import org.tron.core.services.jsonrpc.filters.BlockFilterAndResult; +import org.tron.core.services.jsonrpc.filters.LogBlockQuery; +import org.tron.core.services.jsonrpc.filters.LogFilter; +import org.tron.core.services.jsonrpc.filters.LogFilterAndResult; +import org.tron.core.services.jsonrpc.filters.LogFilterWrapper; +import org.tron.core.services.jsonrpc.filters.LogMatch; +import org.tron.core.services.jsonrpc.types.BlockResult; +import org.tron.core.services.jsonrpc.types.BuildArguments; +import org.tron.core.services.jsonrpc.types.CallArguments; +import org.tron.core.services.jsonrpc.types.TransactionReceipt; +import org.tron.core.services.jsonrpc.types.TransactionResult; import org.tron.core.store.StorageRowStore; import org.tron.core.vm.config.VMConfig; import org.tron.core.vm.program.Storage; @@ -73,10 +96,38 @@ public enum RequestSource { PBFT } + private static final String FILTER_NOT_FOUND = "filter not found"; + public static final int EXPIRE_SECONDS = 5 * 60; + /** + * for log filter in Full Json-RPC + */ + @Getter + private static Map eventFilter2ResultFull = new ConcurrentHashMap<>(); + /** + * for block in Full Json-RPC + */ + @Getter + private static Map blockFilter2ResultFull = + new ConcurrentHashMap<>(); + /** + * for log filter in solidity Json-RPC + */ + @Getter + private static Map eventFilter2ResultSolidity = + new ConcurrentHashMap<>(); + /** + * for block in solidity Json-RPC + */ + @Getter + private static Map blockFilter2ResultSolidity = + new ConcurrentHashMap<>(); + String regexHash = "(0x)?[a-zA-Z0-9]{64}$"; - private final int chainId = 100; - private final int networkId = 100; + /** + * thread pool of query section bloom store + */ + private ExecutorService sectionExecutor; private NodeInfoService nodeInfoService; private Wallet wallet; private Manager manager; @@ -85,6 +136,67 @@ public TronJsonRpcImpl(NodeInfoService nodeInfoService, Wallet wallet, Manager m this.nodeInfoService = nodeInfoService; this.wallet = wallet; this.manager = manager; + this.sectionExecutor = Executors.newFixedThreadPool(5); + } + + public static void handleBLockFilter(BlockFilterCapsule blockFilterCapsule) { + Iterator> it; + + if (blockFilterCapsule.isSolidified()) { + it = getBlockFilter2ResultSolidity().entrySet().iterator(); + } else { + it = getBlockFilter2ResultFull().entrySet().iterator(); + } + + while (it.hasNext()) { + Entry entry = it.next(); + if (entry.getValue().isExpire()) { + it.remove(); + continue; + } + entry.getValue().getResult().add(ByteArray.toJsonHex(blockFilterCapsule.getBlockHash())); + } + } + + public static void handleLogsFilter(LogsFilterCapsule logsFilterCapsule) { + Iterator> it; + + if (logsFilterCapsule.isSolidified()) { + it = getEventFilter2ResultSolidity().entrySet().iterator(); + } else { + it = getEventFilter2ResultFull().entrySet().iterator(); + } + + while (it.hasNext()) { + Entry entry = it.next(); + if (entry.getValue().isExpire()) { + it.remove(); + continue; + } + + LogFilterAndResult logFilterAndResult = entry.getValue(); + long fromBlock = logFilterAndResult.getLogFilterWrapper().getFromBlock(); + long toBlock = logFilterAndResult.getLogFilterWrapper().getToBlock(); + if (!(fromBlock <= logsFilterCapsule.getBlockNumber() + && logsFilterCapsule.getBlockNumber() <= toBlock)) { + continue; + } + + if (logsFilterCapsule.getBloom() != null + && !logFilterAndResult.getLogFilterWrapper().getLogFilter() + .matchBloom(logsFilterCapsule.getBloom())) { + continue; + } + + LogFilter logFilter = logFilterAndResult.getLogFilterWrapper().getLogFilter(); + List elements = + LogMatch.matchBlock(logFilter, logsFilterCapsule.getBlockNumber(), + logsFilterCapsule.getBlockHash(), logsFilterCapsule.getTxInfoList(), + logsFilterCapsule.isRemoved()); + if (CollectionUtils.isNotEmpty(elements)) { + logFilterAndResult.getResult().addAll(elements); + } + } } @Override @@ -176,65 +288,7 @@ private BlockResult getBlockResult(Block block, boolean fullTx) { return null; } - BlockCapsule blockCapsule = new BlockCapsule(block); - BlockResult br = new BlockResult(); - br.number = ByteArray.toJsonHex(blockCapsule.getNum()); - br.hash = ByteArray.toJsonHex(blockCapsule.getBlockId().getBytes()); - br.parentHash = ByteArray.toJsonHex(blockCapsule.getParentBlockId().getBytes()); - br.nonce = null; // no value - br.sha3Uncles = null; // no value - br.logsBloom = ByteArray.toJsonHex(new byte[256]); // no value - br.transactionsRoot = ByteArray - .toJsonHex(block.getBlockHeader().getRawData().getTxTrieRoot().toByteArray()); - br.stateRoot = ByteArray - .toJsonHex(block.getBlockHeader().getRawData().getAccountStateRoot().toByteArray()); - br.receiptsRoot = null; // no value - br.miner = ByteArray.toJsonHexAddress(blockCapsule.getWitnessAddress().toByteArray()); - br.difficulty = null; // no value - br.totalDifficulty = null; // no value - br.extraData = null; // no value - br.size = ByteArray.toJsonHex(block.getSerializedSize()); - br.timestamp = ByteArray.toJsonHex(blockCapsule.getTimeStamp()); - - long gasUsedInBlock = 0; - long gasLimitInBlock = 0; - - List txes = new ArrayList<>(); - List transactionsList = block.getTransactionsList(); - List transactionInfoList = - wallet.getTransactionInfoByBlockNum(blockCapsule.getNum()).getTransactionInfoList(); - if (fullTx) { - long energyFee = wallet.getEnergyFee(blockCapsule.getTimeStamp()); - - for (int i = 0; i < transactionsList.size(); i++) { - Transaction transaction = transactionsList.get(i); - gasLimitInBlock += transaction.getRawData().getFeeLimit(); - - long energyUsageTotal = getEnergyUsageTotal(transactionInfoList, i, blockCapsule.getNum()); - gasUsedInBlock += energyUsageTotal; - - txes.add(new TransactionResult(blockCapsule, i, transaction, - energyUsageTotal, energyFee, wallet)); - } - } else { - for (int i = 0; i < transactionsList.size(); i++) { - gasLimitInBlock += transactionsList.get(i).getRawData().getFeeLimit(); - gasUsedInBlock += getEnergyUsageTotal(transactionInfoList, i, blockCapsule.getNum()); - - byte[] txHash = Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), - transactionsList.get(i).getRawData().toByteArray()); - txes.add(ByteArray.toJsonHex(txHash)); - } - } - br.transactions = txes.toArray(); - - br.gasLimit = ByteArray.toJsonHex(gasLimitInBlock); - br.gasUsed = ByteArray.toJsonHex(gasUsedInBlock); - List ul = new ArrayList<>(); - br.uncles = ul.toArray(new String[0]); - - return br; + return new BlockResult(block, fullTx, wallet); } @Override @@ -276,7 +330,7 @@ public String getTrxBalance(String address, String blockNumOrTag) || "pending".equalsIgnoreCase(blockNumOrTag)) { throw new JsonRpcInvalidParamsException("TAG [earliest | pending] not supported"); } else if ("latest".equalsIgnoreCase(blockNumOrTag)) { - byte[] addressData = addressHashToByteArray(address); + byte[] addressData = addressCompatibleToByteArray(address); Account account = Account.newBuilder().setAddress(ByteString.copyFrom(addressData)).build(); Account reply = wallet.getAccount(account); @@ -326,14 +380,15 @@ private void callTriggerConstantContract(byte[] ownerAddressByte, byte[] contrac * @param data Hash of the method signature and encoded parameters. for example: * getMethodSign(methodName(uint256,uint256)) || data1 || data2 */ - private String call(byte[] ownerAddressByte, byte[] contractAddressByte, byte[] data) { + private String call(byte[] ownerAddressByte, byte[] contractAddressByte, long value, + byte[] data) { TransactionExtention.Builder trxExtBuilder = TransactionExtention.newBuilder(); Return.Builder retBuilder = Return.newBuilder(); TransactionExtention trxExt; try { - callTriggerConstantContract(ownerAddressByte, contractAddressByte, 0, data, + callTriggerConstantContract(ownerAddressByte, contractAddressByte, value, data, trxExtBuilder, retBuilder); } catch (ContractValidateException | VMIllegalException e) { @@ -378,7 +433,7 @@ public String getStorageAt(String address, String storageIdx, String blockNumOrT || "pending".equalsIgnoreCase(blockNumOrTag)) { throw new JsonRpcInvalidParamsException("TAG [earliest | pending] not supported"); } else if ("latest".equalsIgnoreCase(blockNumOrTag)) { - byte[] addressByte = addressHashToByteArray(address); + byte[] addressByte = addressCompatibleToByteArray(address); // get contract from contractStore BytesMessage.Builder build = BytesMessage.newBuilder(); @@ -415,7 +470,7 @@ public String getABIOfSmartContract(String contractAddress, String blockNumOrTag || "pending".equalsIgnoreCase(blockNumOrTag)) { throw new JsonRpcInvalidParamsException("TAG [earliest | pending] not supported"); } else if ("latest".equalsIgnoreCase(blockNumOrTag)) { - byte[] addressData = addressHashToByteArray(contractAddress); + byte[] addressData = addressCompatibleToByteArray(contractAddress); BytesMessage.Builder build = BytesMessage.newBuilder(); BytesMessage bytesMessage = build.setValue(ByteString.copyFrom(addressData)).build(); @@ -458,7 +513,7 @@ public String gasPrice() { @Override public String estimateGas(CallArguments args) throws JsonRpcInvalidRequestException, JsonRpcInvalidParamsException, JsonRpcInternalException { - byte[] ownerAddress = addressHashToByteArray(args.from); + byte[] ownerAddress = addressCompatibleToByteArray(args.from); ContractType contractType = args.getContractType(wallet); if (contractType == ContractType.TransferContract) { @@ -473,7 +528,7 @@ public String estimateGas(CallArguments args) throws JsonRpcInvalidRequestExcept byte[] contractAddress; if (contractType == ContractType.TriggerSmartContract) { - contractAddress = addressHashToByteArray(args.to); + contractAddress = addressCompatibleToByteArray(args.to); } else { contractAddress = new byte[0]; } @@ -634,10 +689,11 @@ public String getCall(CallArguments transactionCall, String blockNumOrTag) || "pending".equalsIgnoreCase(blockNumOrTag)) { throw new JsonRpcInvalidParamsException("TAG [earliest | pending] not supported"); } else if ("latest".equalsIgnoreCase(blockNumOrTag)) { - byte[] addressData = addressHashToByteArray(transactionCall.from); - byte[] contractAddressData = addressHashToByteArray(transactionCall.to); + byte[] addressData = addressCompatibleToByteArray(transactionCall.from); + byte[] contractAddressData = addressCompatibleToByteArray(transactionCall.to); - return call(addressData, contractAddressData, ByteArray.fromHexString(transactionCall.data)); + return call(addressData, contractAddressData, transactionCall.parseValue(), + ByteArray.fromHexString(transactionCall.data)); } else { try { ByteArray.hexToBigInteger(blockNumOrTag).longValue(); @@ -787,7 +843,7 @@ private TransactionJson buildCreateSmartContractTransaction(byte[] ownerAddress, private TransactionJson buildTriggerSmartContractTransaction(byte[] ownerAddress, BuildArguments args) throws JsonRpcInvalidParamsException, JsonRpcInvalidRequestException, JsonRpcInternalException { - byte[] contractAddress = addressHashToByteArray(args.to); + byte[] contractAddress = addressCompatibleToByteArray(args.to); TriggerSmartContract.Builder build = TriggerSmartContract.newBuilder(); TransactionExtention.Builder trxExtBuilder = TransactionExtention.newBuilder(); @@ -871,7 +927,7 @@ private TransactionJson buildTransferContractTransaction(byte[] ownerAddress, TransferContract.Builder build = TransferContract.newBuilder(); build.setOwnerAddress(ByteString.copyFrom(ownerAddress)) - .setToAddress(ByteString.copyFrom(addressHashToByteArray(args.to))) + .setToAddress(ByteString.copyFrom(addressCompatibleToByteArray(args.to))) .setAmount(amount); return createTransactionJson(build, ContractType.TransferContract, args); @@ -888,7 +944,7 @@ private TransactionJson buildTransferAssetContractTransaction(byte[] ownerAddres TransferAssetContract.Builder build = TransferAssetContract.newBuilder(); build.setOwnerAddress(ByteString.copyFrom(ownerAddress)) - .setToAddress(ByteString.copyFrom(addressHashToByteArray(args.to))) + .setToAddress(ByteString.copyFrom(addressCompatibleToByteArray(args.to))) .setAssetName(ByteString.copyFrom(tokenIdArr)) .setAmount(args.tokenValue); @@ -907,6 +963,13 @@ public RequestSource getSource() { } } + private void disableInPBFT(String method) throws JsonRpcMethodNotFoundException { + if (getSource() == RequestSource.PBFT) { + String msg = String.format("the method %s does not exist/is not available in PBFT", method); + throw new JsonRpcMethodNotFoundException(msg); + } + } + @Override public TransactionJson buildTransaction(BuildArguments args) throws JsonRpcInvalidParamsException, JsonRpcInvalidRequestException, @@ -921,7 +984,7 @@ public TransactionJson buildTransaction(BuildArguments args) byte[] fromAddressData; try { - fromAddressData = addressHashToByteArray(args.from); + fromAddressData = addressCompatibleToByteArray(args.from); } catch (JsonRpcInvalidParamsException e) { throw new JsonRpcInvalidRequestException("invalid json request"); } @@ -1021,4 +1084,161 @@ public CompilationResult ethSubmitHashrate(String hashrate, String id) throw new JsonRpcMethodNotFoundException( "the method eth_submitHashrate does not exist/is not available"); } + + @Override + public String newFilter(FilterRequest fr) throws JsonRpcInvalidParamsException, + JsonRpcMethodNotFoundException { + disableInPBFT("eth_newFilter"); + + Map eventFilter2Result; + if (getSource() == RequestSource.FULLNODE) { + eventFilter2Result = eventFilter2ResultFull; + } else { + eventFilter2Result = eventFilter2ResultSolidity; + } + + long currentMaxFullNum = wallet.getNowBlock().getBlockHeader().getRawData().getNumber(); + LogFilterAndResult logFilterAndResult = new LogFilterAndResult(fr, currentMaxFullNum, wallet); + String filterID = generateFilterId(); + eventFilter2Result.put(filterID, logFilterAndResult); + return ByteArray.toJsonHex(filterID); + } + + @Override + public String newBlockFilter() throws JsonRpcMethodNotFoundException { + disableInPBFT("eth_newBlockFilter"); + + Map blockFilter2Result; + if (getSource() == RequestSource.FULLNODE) { + blockFilter2Result = blockFilter2ResultFull; + } else { + blockFilter2Result = blockFilter2ResultSolidity; + } + + BlockFilterAndResult filterAndResult = new BlockFilterAndResult(); + String filterID = generateFilterId(); + blockFilter2Result.put(filterID, filterAndResult); + return ByteArray.toJsonHex(filterID); + } + + @Override + public boolean uninstallFilter(String filterId) throws ItemNotFoundException, + JsonRpcMethodNotFoundException { + disableInPBFT("eth_uninstallFilter"); + + Map blockFilter2Result; + Map eventFilter2Result; + if (getSource() == RequestSource.FULLNODE) { + blockFilter2Result = blockFilter2ResultFull; + eventFilter2Result = eventFilter2ResultFull; + } else { + blockFilter2Result = blockFilter2ResultSolidity; + eventFilter2Result = eventFilter2ResultSolidity; + } + + filterId = ByteArray.fromHex(filterId); + if (eventFilter2Result.containsKey(filterId)) { + eventFilter2Result.remove(filterId); + } else if (blockFilter2Result.containsKey(filterId)) { + blockFilter2Result.remove(filterId); + } else { + throw new ItemNotFoundException(FILTER_NOT_FOUND); + } + + return true; + } + + @Override + public Object[] getFilterChanges(String filterId) throws ItemNotFoundException, + JsonRpcMethodNotFoundException { + disableInPBFT("eth_getFilterChanges"); + + Map blockFilter2Result; + Map eventFilter2Result; + if (getSource() == RequestSource.FULLNODE) { + blockFilter2Result = blockFilter2ResultFull; + eventFilter2Result = eventFilter2ResultFull; + } else { + blockFilter2Result = blockFilter2ResultSolidity; + eventFilter2Result = eventFilter2ResultSolidity; + } + + filterId = ByteArray.fromHex(filterId); + + return getFilterResult(filterId, blockFilter2Result, eventFilter2Result); + } + + @Override + public LogFilterElement[] getLogs(FilterRequest fr) throws JsonRpcInvalidParamsException, + ExecutionException, InterruptedException, BadItemException, ItemNotFoundException, + JsonRpcMethodNotFoundException, JsonRpcTooManyResultException { + disableInPBFT("eth_getLogs"); + + long currentMaxBlockNum = wallet.getNowBlock().getBlockHeader().getRawData().getNumber(); + //convert FilterRequest to LogFilterWrapper + LogFilterWrapper logFilterWrapper = new LogFilterWrapper(fr, currentMaxBlockNum, wallet); + + return getLogsByLogFilterWrapper(logFilterWrapper, currentMaxBlockNum); + } + + @Override + public LogFilterElement[] getFilterLogs(String filterId) throws ExecutionException, + InterruptedException, BadItemException, ItemNotFoundException, + JsonRpcMethodNotFoundException, JsonRpcTooManyResultException { + disableInPBFT("eth_getFilterLogs"); + + Map eventFilter2Result; + if (getSource() == RequestSource.FULLNODE) { + eventFilter2Result = eventFilter2ResultFull; + } else { + eventFilter2Result = eventFilter2ResultSolidity; + } + + filterId = ByteArray.fromHex(filterId); + if (!eventFilter2Result.containsKey(filterId)) { + throw new ItemNotFoundException(FILTER_NOT_FOUND); + } + + LogFilterWrapper logFilterWrapper = eventFilter2Result.get(filterId).getLogFilterWrapper(); + long currentMaxBlockNum = wallet.getNowBlock().getBlockHeader().getRawData().getNumber(); + + return getLogsByLogFilterWrapper(logFilterWrapper, currentMaxBlockNum); + } + + private LogFilterElement[] getLogsByLogFilterWrapper(LogFilterWrapper logFilterWrapper, + long currentMaxBlockNum) throws JsonRpcTooManyResultException, ExecutionException, + InterruptedException, BadItemException, ItemNotFoundException { + //query possible block + LogBlockQuery logBlockQuery = new LogBlockQuery(logFilterWrapper, manager.getChainBaseManager() + .getSectionBloomStore(), currentMaxBlockNum, sectionExecutor); + List possibleBlockList = logBlockQuery.getPossibleBlock(); + + //match event from block one by one exactly + LogMatch logMatch = + new LogMatch(logFilterWrapper, possibleBlockList, manager); + return logMatch.matchBlockOneByOne(); + } + + public static Object[] getFilterResult(String filterId, Map + blockFilter2Result, Map eventFilter2Result) + throws ItemNotFoundException { + Object[] result; + + if (blockFilter2Result.containsKey(filterId)) { + List blockHashList = blockFilter2Result.get(filterId).popAll(); + result = blockHashList.toArray(new String[blockHashList.size()]); + blockFilter2Result.get(filterId).updateExpireTime(); + + } else if (eventFilter2Result.containsKey(filterId)) { + List logElementList = eventFilter2Result.get(filterId).popAll(); + result = logElementList.toArray(new LogFilterElement[logElementList.size()]); + eventFilter2Result.get(filterId).updateExpireTime(); + + } else { + throw new ItemNotFoundException(FILTER_NOT_FOUND); + } + + return result; + } + } diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/filters/BlockFilterAndResult.java b/framework/src/main/java/org/tron/core/services/jsonrpc/filters/BlockFilterAndResult.java new file mode 100644 index 00000000000..a429fb3b3ab --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/filters/BlockFilterAndResult.java @@ -0,0 +1,25 @@ +package org.tron.core.services.jsonrpc.filters; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.LinkedBlockingQueue; + +public class BlockFilterAndResult extends FilterResult { + + public BlockFilterAndResult() { + this.updateExpireTime(); + result = new LinkedBlockingQueue<>(); + } + + @Override + public void add(String s) { + result.add(s); + } + + @Override + public List popAll() { + List elements = new ArrayList<>(); + result.drainTo(elements); + return elements; + } +} diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/filters/FilterResult.java b/framework/src/main/java/org/tron/core/services/jsonrpc/filters/FilterResult.java new file mode 100644 index 00000000000..0fb60e90126 --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/filters/FilterResult.java @@ -0,0 +1,26 @@ +package org.tron.core.services.jsonrpc.filters; + +import java.util.List; +import java.util.concurrent.BlockingQueue; +import lombok.Getter; +import org.tron.core.services.jsonrpc.TronJsonRpcImpl; + +public abstract class FilterResult { + + private long expireTimeStamp; + + @Getter + protected BlockingQueue result; + + public void updateExpireTime() { + expireTimeStamp = System.currentTimeMillis() + TronJsonRpcImpl.EXPIRE_SECONDS * 1000; + } + + public boolean isExpire() { + return expireTimeStamp < System.currentTimeMillis(); + } + + public abstract void add(T t); + + public abstract List popAll(); +} diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogBlockQuery.java b/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogBlockQuery.java new file mode 100644 index 00000000000..b03f3da7ec0 --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogBlockQuery.java @@ -0,0 +1,212 @@ +package org.tron.core.services.jsonrpc.filters; + +import java.util.ArrayList; +import java.util.BitSet; +import java.util.List; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Future; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ArrayUtils; +import org.tron.common.bloom.Bloom; +import org.tron.common.crypto.Hash; +import org.tron.core.exception.JsonRpcTooManyResultException; +import org.tron.core.store.SectionBloomStore; + +/** + * query possible block list by logFilterWrapper + * warning: must not use bitSet.set(0, bitSet.length()) ! + */ +@Slf4j(topic = "API") +public class LogBlockQuery { + + public static final int MAX_RESULT = 10000; + private LogFilterWrapper logFilterWrapper; + private SectionBloomStore sectionBloomStore; + private ExecutorService sectionExecutor; + + private int minSection; + private int maxSection; + private long minBlock; + private long maxBlock; + private long currentMaxBlockNum; + + public LogBlockQuery(LogFilterWrapper logFilterWrapper, SectionBloomStore sectionBloomStore, + long currentMaxBlockNum, ExecutorService executor) { + this.logFilterWrapper = logFilterWrapper; + this.sectionBloomStore = sectionBloomStore; + this.sectionExecutor = executor; + this.currentMaxBlockNum = currentMaxBlockNum; + + if (logFilterWrapper.getFromBlock() == Long.MAX_VALUE) { + minSection = (int) (currentMaxBlockNum / Bloom.BLOOM_BIT_SIZE); + minBlock = currentMaxBlockNum; + } else { + minSection = (int) (logFilterWrapper.getFromBlock() / Bloom.BLOOM_BIT_SIZE); + minBlock = logFilterWrapper.getFromBlock(); + } + + if (logFilterWrapper.getToBlock() == Long.MAX_VALUE) { + maxSection = (int) (currentMaxBlockNum / Bloom.BLOOM_BIT_SIZE); + maxBlock = currentMaxBlockNum; + } else { + maxSection = (int) (logFilterWrapper.getToBlock() / Bloom.BLOOM_BIT_SIZE); + maxBlock = logFilterWrapper.getToBlock(); + if (maxBlock > currentMaxBlockNum) { + maxBlock = currentMaxBlockNum; + } + } + } + + public List getPossibleBlock() throws ExecutionException, InterruptedException, + JsonRpcTooManyResultException { + List blockNumList = new ArrayList<>(); + if (minBlock > currentMaxBlockNum) { + return blockNumList; + } + + int[][][] allConditionsIndex = getConditions(); + + int capacity = (maxSection - minSection + 1) * SectionBloomStore.BLOCK_PER_SECTION; + BitSet blockNumBitSet = new BitSet(capacity); + blockNumBitSet.set(0, capacity); + + //works serial + for (int conditionIndex = 0; conditionIndex < allConditionsIndex.length; conditionIndex++) { + BitSet bitSet = subMatch(allConditionsIndex[conditionIndex]); + blockNumBitSet.and(bitSet); + } + + for (int i = blockNumBitSet.nextSetBit(0); i >= 0; i = blockNumBitSet.nextSetBit(i + 1)) { + // operate on index i here + if (i == Integer.MAX_VALUE) { + break; // or (i+1) would overflow + } + long blockNum = minSection * SectionBloomStore.BLOCK_PER_SECTION + i; + if (minBlock <= blockNum && blockNum <= maxBlock) { + blockNumList.add(blockNum); + } + } + + if (blockNumList.size() >= MAX_RESULT) { + throw new JsonRpcTooManyResultException( + "query returned more than " + MAX_RESULT + " results"); + } + + return blockNumList; + } + + /** + * address -> subMatch0, + * topic1 -> subMatch1, topic2 -> subMatch2, topic3 -> subMatch3, topic4 -> subMatch4 + * works serial, return a BitSet with capacity of section num * blockPerSection + */ + private BitSet subMatch(int[][] bitIndexes) throws ExecutionException, InterruptedException { + + int capacity = (maxSection - minSection + 1) * SectionBloomStore.BLOCK_PER_SECTION; + BitSet subBitSet = new BitSet(capacity); + + for (int section = minSection; section <= maxSection; section++) { + BitSet partialBitSet = partialMatch(bitIndexes, section); + + for (int i = partialBitSet.nextSetBit(0); i >= 0; i = partialBitSet.nextSetBit(i + 1)) { + // operate on index i here + if (i == Integer.MAX_VALUE) { + break; // or (i+1) would overflow + } + int offset = (section - minSection) * SectionBloomStore.BLOCK_PER_SECTION + i; + subBitSet.set(offset); + } + } + + return subBitSet; + } + + /** + * every section has a compound query of sectionBloomStore, works parallel + * "and" condition in second dimension of query, "or" condition in first dimension + * return a BitSet whose capacity is blockPerSection + */ + private BitSet partialMatch(final int[][] bitIndexes, int section) + throws ExecutionException, InterruptedException { + List>> bitSetList = new ArrayList<>(); + + for (int i = 0; i < bitIndexes.length; i++) { + List> futureList = new ArrayList<>(); + for (int j = 0; j < bitIndexes[i].length; j++) { //must be 3 + final int bitIndex = bitIndexes[i][j]; + Future bitSetFuture = + sectionExecutor.submit(() -> sectionBloomStore.get(section, bitIndex)); + futureList.add(bitSetFuture); + } + bitSetList.add(futureList); + } + + BitSet bitSet = new BitSet(SectionBloomStore.BLOCK_PER_SECTION); + + for (List> futureList : bitSetList) { + // initial a BitSet with all 1 + BitSet subBitSet = new BitSet(SectionBloomStore.BLOCK_PER_SECTION); + subBitSet.set(0, SectionBloomStore.BLOCK_PER_SECTION); + // and condition in second dimension + for (Future future : futureList) { + BitSet one = future.get(); + if (one == null) { //match nothing + subBitSet.clear(); + break; + } + // "and" condition in second dimension + subBitSet.and(one); + } + // "or" condition in first dimension + bitSet.or(subBitSet); + } + return bitSet; + } + + /** + * convert LogFilter to the condition as 3 dimension array + */ + public int[][][] getConditions() { + + LogFilter logFilter = logFilterWrapper.getLogFilter(); + List conditions = new ArrayList<>(); + if (ArrayUtils.isNotEmpty(logFilter.getContractAddresses())) { + conditions.add(logFilter.getContractAddresses()); + } + for (byte[][] topicList : logFilter.getTopics()) { + if (ArrayUtils.isNotEmpty(topicList)) { + conditions.add(topicList); + } + } + + int[][][] allConditionsIndex = new int[conditions.size()][][]; + + for (int k = 0; k < conditions.size(); k++) { + byte[][] conditionByte = conditions.get(k); + + int[][] bitIndexes = new int[conditionByte.length][]; + for (int j = 0; j < conditionByte.length; j++) { + + byte[] hash = Hash.sha3(conditionByte[j]); + Bloom bloom = Bloom.create(hash); + BitSet bs = BitSet.valueOf(bloom.getData()); + + int[] bitIndex = new int[3]; //must same as the number of hash function in Bloom + int nonZeroCount = 0; + for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1)) { + // operate on index i here + if (i == Integer.MAX_VALUE) { + break; // or (i+1) would overflow + } + bitIndex[nonZeroCount++] = i; + } + + bitIndexes[j] = bitIndex; + } + allConditionsIndex[k] = bitIndexes; + } + + return allConditionsIndex; + } +} diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogFilter.java b/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogFilter.java new file mode 100644 index 00000000000..485c601b155 --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogFilter.java @@ -0,0 +1,202 @@ +package org.tron.core.services.jsonrpc.filters; + +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.addressToByteArray; +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.topicToByteArray; + +import com.google.protobuf.ByteString; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import lombok.Getter; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import org.tron.common.bloom.Bloom; +import org.tron.common.crypto.Hash; +import org.tron.common.runtime.vm.DataWord; +import org.tron.core.exception.JsonRpcInvalidParamsException; +import org.tron.core.services.jsonrpc.TronJsonRpc.FilterRequest; +import org.tron.protos.Protocol.TransactionInfo.Log; + +@Slf4j(topic = "API") +public class LogFilter { + + // example: [addr1, addr2] + // come from log.address + @Getter + @Setter + private byte[][] contractAddresses = new byte[0][]; + // example: [[func1, func2], null, [A, B], [C]] + // first topic must be func1 or func2,second can be any,third must be A or B,forth must be C + // [A, null] is not allowed. + @Getter + @Setter + private List topics = new ArrayList<>(); + // [[func1, func2], null, [A, B], [C]] + [addr1, addr2] => Bloom[][] + @Setter + private Bloom[][] filterBlooms; + + + public LogFilter() { + } + + /** + * construct one LogFilter from part parameters of FilterRequest + */ + public LogFilter(FilterRequest fr) throws JsonRpcInvalidParamsException { + if (fr.address instanceof String) { + withContractAddress(addressToByteArray((String) fr.address)); + + } else if (fr.address instanceof ArrayList) { + List addr = new ArrayList<>(); + int i = 0; + for (Object s : (ArrayList) fr.address) { + try { + addr.add(addressToByteArray((String) s)); + i++; + } catch (JsonRpcInvalidParamsException e) { + throw new JsonRpcInvalidParamsException( + String.format("invalid address at index %d: %s", i, s)); + } + } + withContractAddress(addr.toArray(new byte[addr.size()][])); + + } else if (fr.address != null) { + throw new JsonRpcInvalidParamsException("invalid addresses in query"); + } + + if (fr.topics != null) { + //restrict depth of topics, because event has a signature and most 3 indexed parameters + if (fr.topics.length > 4) { + throw new JsonRpcInvalidParamsException("topics size should be <= 4"); + } + for (Object topic : fr.topics) { + if (topic == null) { + withTopic((byte[][]) null); + } else if (topic instanceof String) { + try { + withTopic(new DataWord(topicToByteArray((String) topic)).getData()); + } catch (JsonRpcInvalidParamsException e) { + throw new JsonRpcInvalidParamsException("invalid topic(s): " + topic); + } + } else if (topic instanceof ArrayList) { + + List t = new ArrayList<>(); + for (Object s : ((ArrayList) topic)) { + try { + t.add(new DataWord(topicToByteArray((String) s)).getData()); + } catch (JsonRpcInvalidParamsException e) { + throw new JsonRpcInvalidParamsException("invalid topic(s): " + s); + } + } + withTopic(t.toArray(new byte[t.size()][])); + } else { + throw new JsonRpcInvalidParamsException("invalid topic(s)"); + } + } + } + + } + + /** + * add contractAddress + */ + private LogFilter withContractAddress(byte[]... orAddress) { + contractAddresses = orAddress; + return this; + } + + /** + * add one or more topic + */ + private LogFilter withTopic(byte[]... orTopic) { + topics.add(orTopic); + return this; + } + + /** + * generate filterBlooms from contractAddresses、topics + */ + private void initBlooms() { + if (filterBlooms != null) { + return; + } + + //topics ahead,address last + List addrAndTopics = new ArrayList<>(topics); + addrAndTopics.add(contractAddresses); + + filterBlooms = new Bloom[addrAndTopics.size()][]; + for (int i = 0; i < addrAndTopics.size(); i++) { + byte[][] orTopics = addrAndTopics.get(i); + if (orTopics == null || orTopics.length == 0) { + filterBlooms[i] = new Bloom[] {new Bloom()}; // always matches + } else { + filterBlooms[i] = new Bloom[orTopics.length]; + for (int j = 0; j < orTopics.length; j++) { + filterBlooms[i][j] = Bloom.create(Hash.sha3(orTopics[j])); + } + } + } + } + + /** + * match this logFilter with a block bloom sketchy first. if matched, the match exactly + */ + public boolean matchBloom(Bloom blockBloom) { + initBlooms(); + for (Bloom[] andBloom : filterBlooms) { + boolean orMatches = false; + for (Bloom orBloom : andBloom) { + if (blockBloom.matches(orBloom)) { + orMatches = true; + break; + } + } + if (!orMatches) { + return false; + } + } + return true; + } + + private boolean matchesContractAddress(byte[] toAddr) { + //not have 41 ahead both + for (byte[] address : contractAddresses) { + if (Arrays.equals(address, toAddr)) { + return true; + } + } + return contractAddresses.length == 0; + } + + /** + * match any event + */ + public boolean matchesExactly(Log logInfo) { + + if (!matchesContractAddress(logInfo.getAddress().toByteArray())) { + return false; + } + List logTopics = logInfo.getTopicsList(); + for (int i = 0; i < this.topics.size(); i++) { + if (i >= logTopics.size()) { + return false; + } + byte[][] orTopics = topics.get(i); + if (orTopics != null && orTopics.length > 0) { + boolean orMatches = false; + byte[] logTopic = logTopics.get(i).toByteArray(); + for (byte[] orTopic : orTopics) { + if (new DataWord(orTopic).equals(new DataWord(logTopic))) { + orMatches = true; + break; + } + } + if (!orMatches) { + return false; + } + } + } + return true; + } +} diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogFilterAndResult.java b/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogFilterAndResult.java new file mode 100644 index 00000000000..7fcc596f915 --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogFilterAndResult.java @@ -0,0 +1,35 @@ +package org.tron.core.services.jsonrpc.filters; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.LinkedBlockingQueue; +import lombok.Getter; +import org.tron.core.Wallet; +import org.tron.core.exception.JsonRpcInvalidParamsException; +import org.tron.core.services.jsonrpc.TronJsonRpc.FilterRequest; +import org.tron.core.services.jsonrpc.TronJsonRpc.LogFilterElement; + +public class LogFilterAndResult extends FilterResult { + + @Getter + private LogFilterWrapper logFilterWrapper; + + public LogFilterAndResult(FilterRequest fr, long currentMaxBlockNum, Wallet wallet) + throws JsonRpcInvalidParamsException { + this.logFilterWrapper = new LogFilterWrapper(fr, currentMaxBlockNum, wallet); + result = new LinkedBlockingQueue<>(); + this.updateExpireTime(); + } + + @Override + public void add(LogFilterElement logFilterElement) { + result.add(logFilterElement); + } + + @Override + public List popAll() { + List elements = new ArrayList<>(); + result.drainTo(elements); + return elements; + } +} diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogFilterWrapper.java b/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogFilterWrapper.java new file mode 100644 index 00000000000..e5267182e96 --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogFilterWrapper.java @@ -0,0 +1,95 @@ +package org.tron.core.services.jsonrpc.filters; + +import com.google.protobuf.ByteString; +import lombok.Getter; +import org.apache.commons.lang3.StringUtils; +import org.tron.common.utils.ByteArray; +import org.tron.core.Wallet; +import org.tron.core.exception.JsonRpcInvalidParamsException; +import org.tron.core.services.jsonrpc.JsonRpcApiUtil; +import org.tron.core.services.jsonrpc.TronJsonRpc.FilterRequest; +import org.tron.protos.Protocol.Block; + +public class LogFilterWrapper { + + @Getter + private LogFilter logFilter; + + @Getter + private long fromBlock; + + @Getter + private long toBlock; + + public LogFilterWrapper(FilterRequest fr, long currentMaxBlockNum, Wallet wallet) + throws JsonRpcInvalidParamsException { + + // 1.convert FilterRequest to LogFilter + this.logFilter = new LogFilter(fr); + + // 2. get fromBlock、toBlock from FilterRequest + long fromBlock; + long toBlock; + if (fr.blockHash != null) { + String blockHash = ByteArray.fromHex(fr.blockHash); + if (fr.fromBlock != null || fr.toBlock != null) { + throw new JsonRpcInvalidParamsException( + "cannot specify both BlockHash and FromBlock/ToBlock, choose one or the other"); + } + Block block = null; + if (wallet != null) { + block = wallet.getBlockById(ByteString.copyFrom(ByteArray.fromHexString(blockHash))); + } + if (block == null) { + throw new JsonRpcInvalidParamsException("invalid blockHash"); + } + fromBlock = block.getBlockHeader().getRawData().getNumber(); + toBlock = fromBlock; + } else { + + // if fromBlock is empty but toBlock is not empty, + // then if toBlock < maxBlockNum, set fromBlock = toBlock + // then if toBlock >= maxBlockNum, set fromBlock = maxBlockNum + if (StringUtils.isEmpty(fr.fromBlock) && StringUtils.isNotEmpty(fr.toBlock)) { + toBlock = JsonRpcApiUtil.getByJsonBlockId(fr.toBlock); + if (toBlock == -1) { + toBlock = Long.MAX_VALUE; + } + if (toBlock < currentMaxBlockNum) { + fromBlock = toBlock; + } else { + fromBlock = currentMaxBlockNum; + } + + } else if (StringUtils.isNotEmpty(fr.fromBlock) && StringUtils.isEmpty(fr.toBlock)) { + fromBlock = JsonRpcApiUtil.getByJsonBlockId(fr.fromBlock); + if (fromBlock == -1) { + fromBlock = currentMaxBlockNum; + } + toBlock = Long.MAX_VALUE; + + } else if (StringUtils.isEmpty(fr.fromBlock) && StringUtils.isEmpty(fr.toBlock)) { + fromBlock = currentMaxBlockNum; + toBlock = Long.MAX_VALUE; + + } else { + fromBlock = JsonRpcApiUtil.getByJsonBlockId(fr.fromBlock); + toBlock = JsonRpcApiUtil.getByJsonBlockId(fr.toBlock); + if (fromBlock == -1 && toBlock == -1) { + fromBlock = currentMaxBlockNum; + toBlock = Long.MAX_VALUE; + } else if (fromBlock == -1 && toBlock >= 0) { + fromBlock = currentMaxBlockNum; + } else if (fromBlock >= 0 && toBlock == -1) { + toBlock = Long.MAX_VALUE; + } + if (fromBlock > toBlock) { + throw new JsonRpcInvalidParamsException("please verify: fromBlock <= toBlock"); + } + } + } + + this.fromBlock = fromBlock; + this.toBlock = toBlock; + } +} diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogMatch.java b/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogMatch.java new file mode 100644 index 00000000000..3c438a2cbd3 --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/filters/LogMatch.java @@ -0,0 +1,113 @@ +package org.tron.core.services.jsonrpc.filters; + +import com.google.protobuf.ByteString; +import java.util.ArrayList; +import java.util.List; +import lombok.extern.slf4j.Slf4j; +import org.tron.common.runtime.vm.DataWord; +import org.tron.common.utils.ByteArray; +import org.tron.core.capsule.TransactionRetCapsule; +import org.tron.core.db.Manager; +import org.tron.core.exception.BadItemException; +import org.tron.core.exception.ItemNotFoundException; +import org.tron.core.exception.JsonRpcTooManyResultException; +import org.tron.core.services.jsonrpc.TronJsonRpc.LogFilterElement; +import org.tron.protos.Protocol.TransactionInfo; +import org.tron.protos.Protocol.TransactionInfo.Log; +import org.tron.protos.Protocol.TransactionRet; + +/** + * match events from possible blocks one by one + */ +@Slf4j(topic = "API") +public class LogMatch { + + /** + * query criteria + */ + private LogFilterWrapper logFilterWrapper; + /** + * possible block number list + */ + private List blockNumList; + private Manager manager; + + public LogMatch(LogFilterWrapper logFilterWrapper, List blockNumList, Manager manager) { + this.logFilterWrapper = logFilterWrapper; + this.blockNumList = blockNumList; + this.manager = manager; + } + + public static List matchBlock(LogFilter logFilter, long blockNum, + String blockHash, List transactionInfoList, boolean removed) { + + int txCount = transactionInfoList.size(); + List matchedLog = new ArrayList<>(); + int logIndexInBlock = 0; + + for (int i = 0; i < txCount; i++) { + TransactionInfo transactionInfo = transactionInfoList.get(i); + int logCount = transactionInfo.getLogCount(); + + for (int j = 0; j < logCount; j++) { + Log log = transactionInfo.getLog(j); + + if (logFilter.matchesExactly(log)) { + List topicList = new ArrayList<>(); + for (ByteString topic : log.getTopicsList()) { + topicList.add(new DataWord(topic.toByteArray())); + } + + LogFilterElement logFilterElement = new LogFilterElement(blockHash, + blockNum, + ByteArray.toHexString(transactionInfo.getId().toByteArray()), + i, + ByteArray.toHexString(log.getAddress().toByteArray()), + topicList, + ByteArray.toHexString(log.getData().toByteArray()), + logIndexInBlock, + removed + ); + matchedLog.add(logFilterElement); + } + + logIndexInBlock += 1; + } + } + + return matchedLog; + } + + public LogFilterElement[] matchBlockOneByOne() + throws BadItemException, ItemNotFoundException, JsonRpcTooManyResultException { + List logFilterElementList = new ArrayList<>(); + + for (long blockNum : blockNumList) { + TransactionRetCapsule transactionRetCapsule = + manager.getTransactionRetStore() + .getTransactionInfoByBlockNum(ByteArray.fromLong(blockNum)); + if (transactionRetCapsule == null) { + //if query condition (address and topics) is empty, we will traversal every block, + //include empty block + continue; + } + TransactionRet transactionRet = transactionRetCapsule.getInstance(); + List transactionInfoList = transactionRet.getTransactioninfoList(); + + String blockHash = manager.getChainBaseManager().getBlockIdByNum(blockNum).toString(); + List matchedLog = matchBlock(logFilterWrapper.getLogFilter(), blockNum, + blockHash, transactionInfoList, false); + if (!matchedLog.isEmpty()) { + logFilterElementList.addAll(matchedLog); + } + + if (logFilterElementList.size() > LogBlockQuery.MAX_RESULT) { + throw new JsonRpcTooManyResultException( + "query returned more than " + LogBlockQuery.MAX_RESULT + " results"); + } + } + + return logFilterElementList.toArray(new LogFilterElement[logFilterElementList.size()]); + } + +} diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/types/BlockResult.java b/framework/src/main/java/org/tron/core/services/jsonrpc/types/BlockResult.java new file mode 100644 index 00000000000..162d93aab80 --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/types/BlockResult.java @@ -0,0 +1,102 @@ +package org.tron.core.services.jsonrpc.types; + +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getEnergyUsageTotal; + +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import java.util.ArrayList; +import java.util.List; +import org.tron.common.parameter.CommonParameter; +import org.tron.common.utils.ByteArray; +import org.tron.common.utils.Sha256Hash; +import org.tron.core.Wallet; +import org.tron.core.capsule.BlockCapsule; +import org.tron.protos.Protocol.Block; +import org.tron.protos.Protocol.Transaction; +import org.tron.protos.Protocol.TransactionInfo; + +@JsonPropertyOrder(alphabetic = true) +public class BlockResult { + + public String number; + public String hash; + public String parentHash; + public String nonce; + public String sha3Uncles; + public String logsBloom; + public String transactionsRoot; + public String stateRoot; + public String receiptsRoot; + public String miner; + public String difficulty; + public String totalDifficulty; + public String extraData; + public String size; + public String gasLimit; + public String gasUsed; + public String timestamp; + public Object[] transactions; //TransactionResult or byte32 + public String[] uncles; + + public String baseFeePerGas = null; + public String mixHash = null; + + public BlockResult(Block block, boolean fullTx, Wallet wallet) { + BlockCapsule blockCapsule = new BlockCapsule(block); + + number = ByteArray.toJsonHex(blockCapsule.getNum()); + hash = ByteArray.toJsonHex(blockCapsule.getBlockId().getBytes()); + parentHash = + ByteArray.toJsonHex(block.getBlockHeader().getRawData().getParentHash().toByteArray()); + nonce = null; // no value + sha3Uncles = null; // no value + logsBloom = ByteArray.toJsonHex(new byte[256]); // no value + transactionsRoot = ByteArray + .toJsonHex(block.getBlockHeader().getRawData().getTxTrieRoot().toByteArray()); + stateRoot = ByteArray + .toJsonHex(block.getBlockHeader().getRawData().getAccountStateRoot().toByteArray()); + receiptsRoot = null; // no value + miner = ByteArray.toJsonHexAddress(blockCapsule.getWitnessAddress().toByteArray()); + difficulty = null; // no value + totalDifficulty = null; // no value + extraData = null; // no value + size = ByteArray.toJsonHex(block.getSerializedSize()); + timestamp = ByteArray.toJsonHex(blockCapsule.getTimeStamp()); + + long gasUsedInBlock = 0; + long gasLimitInBlock = 0; + + List txes = new ArrayList<>(); + List transactionsList = block.getTransactionsList(); + List transactionInfoList = + wallet.getTransactionInfoByBlockNum(blockCapsule.getNum()).getTransactionInfoList(); + if (fullTx) { + long energyFee = wallet.getEnergyFee(blockCapsule.getTimeStamp()); + + for (int i = 0; i < transactionsList.size(); i++) { + Transaction transaction = transactionsList.get(i); + gasLimitInBlock += transaction.getRawData().getFeeLimit(); + + long energyUsageTotal = getEnergyUsageTotal(transactionInfoList, i, blockCapsule.getNum()); + gasUsedInBlock += energyUsageTotal; + + txes.add(new TransactionResult(blockCapsule, i, transaction, + energyUsageTotal, energyFee, wallet)); + } + } else { + for (int i = 0; i < transactionsList.size(); i++) { + gasLimitInBlock += transactionsList.get(i).getRawData().getFeeLimit(); + gasUsedInBlock += getEnergyUsageTotal(transactionInfoList, i, blockCapsule.getNum()); + + byte[] txHash = Sha256Hash + .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), + transactionsList.get(i).getRawData().toByteArray()); + txes.add(ByteArray.toJsonHex(txHash)); + } + } + transactions = txes.toArray(); + + gasLimit = ByteArray.toJsonHex(gasLimitInBlock); + gasUsed = ByteArray.toJsonHex(gasUsedInBlock); + uncles = new String[0]; + } +} \ No newline at end of file diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/BuildArguments.java b/framework/src/main/java/org/tron/core/services/jsonrpc/types/BuildArguments.java similarity index 95% rename from framework/src/main/java/org/tron/core/services/jsonrpc/BuildArguments.java rename to framework/src/main/java/org/tron/core/services/jsonrpc/types/BuildArguments.java index 57f8798e0e3..c45012f4088 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/BuildArguments.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/types/BuildArguments.java @@ -1,6 +1,6 @@ -package org.tron.core.services.jsonrpc; +package org.tron.core.services.jsonrpc.types; -import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.addressHashToByteArray; +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.addressCompatibleToByteArray; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.paramQuantityIsNull; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.paramStringIsNull; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.parseQuantityValue; @@ -65,7 +65,7 @@ public ContractType getContractType(Wallet wallet) throws JsonRpcInvalidRequestE contractType = ContractType.CreateSmartContract; } else { // to is not null - byte[] contractAddressData = addressHashToByteArray(to); + byte[] contractAddressData = addressCompatibleToByteArray(to); BytesMessage.Builder build = BytesMessage.newBuilder(); BytesMessage bytesMessage = build.setValue(ByteString.copyFrom(contractAddressData)).build(); SmartContract smartContract = wallet.getContract(bytesMessage); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/CallArguments.java b/framework/src/main/java/org/tron/core/services/jsonrpc/types/CallArguments.java similarity index 91% rename from framework/src/main/java/org/tron/core/services/jsonrpc/CallArguments.java rename to framework/src/main/java/org/tron/core/services/jsonrpc/types/CallArguments.java index b7d8ae711d7..7455247516a 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/CallArguments.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/types/CallArguments.java @@ -1,6 +1,6 @@ -package org.tron.core.services.jsonrpc; +package org.tron.core.services.jsonrpc.types; -import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.addressHashToByteArray; +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.addressCompatibleToByteArray; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.paramStringIsNull; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.parseQuantityValue; @@ -21,7 +21,7 @@ @ToString public class CallArguments { - public String from; + public String from = "0x0000000000000000000000000000000000000000"; public String to; public String gas = ""; //not used public String gasPrice = ""; //not used @@ -47,7 +47,7 @@ public ContractType getContractType(Wallet wallet) throws JsonRpcInvalidRequestE contractType = ContractType.CreateSmartContract; } else { - byte[] contractAddressData = addressHashToByteArray(to); + byte[] contractAddressData = addressCompatibleToByteArray(to); BytesMessage.Builder build = BytesMessage.newBuilder(); BytesMessage bytesMessage = build.setValue(ByteString.copyFrom(contractAddressData)).build(); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java b/framework/src/main/java/org/tron/core/services/jsonrpc/types/TransactionReceipt.java similarity index 99% rename from framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java rename to framework/src/main/java/org/tron/core/services/jsonrpc/types/TransactionReceipt.java index b1f9d6d9fe0..7c64251eb42 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionReceipt.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/types/TransactionReceipt.java @@ -1,4 +1,4 @@ -package org.tron.core.services.jsonrpc; +package org.tron.core.services.jsonrpc.types; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.convertToTronAddress; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getToAddress; diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java b/framework/src/main/java/org/tron/core/services/jsonrpc/types/TransactionResult.java similarity index 88% rename from framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java rename to framework/src/main/java/org/tron/core/services/jsonrpc/types/TransactionResult.java index 828fb95426e..635c89c59f5 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TransactionResult.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/types/TransactionResult.java @@ -1,4 +1,4 @@ -package org.tron.core.services.jsonrpc; +package org.tron.core.services.jsonrpc.types; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getToAddress; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getTransactionAmount; @@ -19,24 +19,24 @@ @ToString public class TransactionResult { - public String hash; - public String nonce; - public String blockHash; - public String blockNumber; - public String transactionIndex; + private String hash; + private String nonce; + private String blockHash; + private String blockNumber; + private String transactionIndex; - public String from; - public String to; - public String gas; - public String gasPrice; - public String value; - public String input; + private String from; + private String to; + private String gas; + private String gasPrice; + private String value; + private String input; - public String v; - public String r; - public String s; + private String v; + private String r; + private String s; - public String type = "0x0"; + private String type = "0x0"; private void parseSignature(Transaction tx) { diff --git a/framework/src/main/java/org/tron/program/Version.java b/framework/src/main/java/org/tron/program/Version.java index 4184985c33b..5aef3e72648 100644 --- a/framework/src/main/java/org/tron/program/Version.java +++ b/framework/src/main/java/org/tron/program/Version.java @@ -4,7 +4,7 @@ public class Version { public static final String VERSION_NAME = "GreatVoyage-v4.3.0-460-g973a4dc82"; public static final String VERSION_CODE = "16334"; - private static final String VERSION = "4.4.1"; + private static final String VERSION = "4.4.2"; public static String getVersion() { return VERSION; diff --git a/framework/src/main/resources/config.conf b/framework/src/main/resources/config.conf index 1d5551a0485..46dcb2e375e 100644 --- a/framework/src/main/resources/config.conf +++ b/framework/src/main/resources/config.conf @@ -46,194 +46,6 @@ storage { // cacheSize = 10485760, // 10 MB = 10 * 1024 * 1024 B // maxOpenFiles = 100 // }, - { - name = "DelegatedResource", - maxOpenFiles = 100 - }, - { - name = "DelegatedResourceAccountIndex", - maxOpenFiles = 100 - }, - { - name = "IncrementalMerkleTree", - maxOpenFiles = 100 - }, - { - name = "IncrementalMerkleVoucher", - maxOpenFiles = 100 - }, - { - name = "abi", - maxOpenFiles = 100 - }, - { - name = "account", - maxOpenFiles = 100 - }, - { - name = "account-asset-issue", - maxOpenFiles = 100 - }, - { - name = "account-index", - maxOpenFiles = 100 - }, - { - name = "account-trace", - maxOpenFiles = 100 - }, - { - name = "accountTrie", - maxOpenFiles = 100 - }, - { - name = "accountid-index", - maxOpenFiles = 100 - }, - { - name = "asset-issue", - maxOpenFiles = 100 - }, - { - name = "asset-issue-v2", - maxOpenFiles = 100 - }, - { - name = "balance-trace", - maxOpenFiles = 100 - }, - { - name = "block", - maxOpenFiles = 100 - }, - { - name = "block-index", - maxOpenFiles = 100 - }, - { - name = "block_KDB", - maxOpenFiles = 100 - }, - { - name = "code", - maxOpenFiles = 100 - }, - { - name = "common", - maxOpenFiles = 100 - }, - { - name = "common-database", - maxOpenFiles = 100 - }, - { - name = "contract", - maxOpenFiles = 100 - }, - { - name = "delegation", - maxOpenFiles = 100 - }, - { - name = "exchange", - maxOpenFiles = 100 - }, - { - name = "exchange-v2", - maxOpenFiles = 100 - }, - { - name = "info", - maxOpenFiles = 100 - }, - { - name = "market_account", - maxOpenFiles = 100 - }, - { - name = "market_order", - maxOpenFiles = 100 - }, - { - name = "market_pair_price_to_order", - maxOpenFiles = 100 - }, - { - name = "market_pair_to_price", - maxOpenFiles = 100 - }, - { - name = "nullifier", - maxOpenFiles = 100 - }, - { - name = "pbft-sign-data", - maxOpenFiles = 100 - }, - { - name = "peers", - maxOpenFiles = 100 - }, - { - name = "properties", - maxOpenFiles = 100 - }, - { - name = "proposal", - maxOpenFiles = 100 - }, - { - name = "recent-block", - maxOpenFiles = 100 - }, - { - name = "storage-row", - maxOpenFiles = 100 - }, - { - name = "tmp", - maxOpenFiles = 100 - }, - { - name = "trans", - maxOpenFiles = 100 - }, - { - name = "trans-cache", - maxOpenFiles = 100 - }, - { - name = "transactionHistoryStore", - maxOpenFiles = 100 - }, - { - name = "transactionRetStore", - maxOpenFiles = 100 - }, - { - name = "tree-block-index", - maxOpenFiles = 100 - }, - { - name = "utxo", - maxOpenFiles = 100 - }, - { - name = "votes", - maxOpenFiles = 100 - }, - { - name = "witness", - maxOpenFiles = 100 - }, - { - name = "witness_schedule", - maxOpenFiles = 100 - }, - { - name = "zkProof", - maxOpenFiles = 100 - } ] needToUpdateAsset = true @@ -406,6 +218,9 @@ node { # openHistoryQueryWhenLiteFN = false jsonrpc { + # Note: If you turn on jsonrpc and run it for a while and then turn it off, you will not + # be able to get the data from eth_getLogs for that period of time. + # httpFullNodeEnable = true # httpFullNodePort = 8545 # httpSolidityEnable = true diff --git a/framework/src/test/java/org/tron/common/runtime/vm/BytecodeCompiler.java b/framework/src/test/java/org/tron/common/runtime/vm/BytecodeCompiler.java new file mode 100644 index 00000000000..48355f137f4 --- /dev/null +++ b/framework/src/test/java/org/tron/common/runtime/vm/BytecodeCompiler.java @@ -0,0 +1,54 @@ +package org.tron.common.runtime.vm; + +import java.util.ArrayList; +import java.util.List; + +import org.bouncycastle.util.encoders.Hex; +import org.tron.core.vm.Op; + +public class BytecodeCompiler { + + public byte[] compile(String code) { + return compile(code.split("\\s+")); + } + + private byte[] compile(String[] tokens) { + List bytecodes = new ArrayList<>(); + int ntokens = tokens.length; + + for (String s : tokens) { + String token = s.trim().toUpperCase(); + + if (token.isEmpty()) { + continue; + } + + if (isHexadecimal(token)) { + compileHexadecimal(token, bytecodes); + } else { + bytecodes.add(Op.getOpOf(token)); + } + } + + int nBytes = bytecodes.size(); + byte[] bytes = new byte[nBytes]; + + for (int k = 0; k < nBytes; k++) { + bytes[k] = bytecodes.get(k); + } + + return bytes; + } + + private static boolean isHexadecimal(String token) { + return token.startsWith("0X"); + } + + private static void compileHexadecimal(String token, List bytecodes) { + byte[] bytes = Hex.decode(token.substring(2)); + + for (byte aByte : bytes) { + bytecodes.add(aByte); + } + } +} diff --git a/framework/src/test/java/org/tron/common/runtime/vm/BytecodeCompilerTest.java b/framework/src/test/java/org/tron/common/runtime/vm/BytecodeCompilerTest.java new file mode 100644 index 00000000000..f09c8d18e04 --- /dev/null +++ b/framework/src/test/java/org/tron/common/runtime/vm/BytecodeCompilerTest.java @@ -0,0 +1,99 @@ +package org.tron.common.runtime.vm; + +import org.junit.Assert; +import org.junit.Test; + +public class BytecodeCompilerTest { + @Test + public void compileSimpleOpcode() { + BytecodeCompiler compiler = new BytecodeCompiler(); + + byte[] result = compiler.compile("ADD"); + + Assert.assertNotNull(result); + Assert.assertEquals(1, result.length); + Assert.assertEquals(1, result[0]); + } + + @Test + public void compileSimpleOpcodeWithSpaces() { + BytecodeCompiler compiler = new BytecodeCompiler(); + + byte[] result = compiler.compile(" ADD "); + + Assert.assertNotNull(result); + Assert.assertEquals(1, result.length); + Assert.assertEquals(1, result[0]); + } + + @Test + public void compileTwoOpcodes() { + BytecodeCompiler compiler = new BytecodeCompiler(); + + byte[] result = compiler.compile("ADD SUB"); + + Assert.assertNotNull(result); + Assert.assertEquals(2, result.length); + Assert.assertEquals(1, result[0]); + Assert.assertEquals(3, result[1]); + } + + @Test + public void compileFourOpcodes() { + BytecodeCompiler compiler = new BytecodeCompiler(); + + byte[] result = compiler.compile("ADD MUL SUB DIV"); + + Assert.assertNotNull(result); + Assert.assertEquals(4, result.length); + Assert.assertEquals(1, result[0]); + Assert.assertEquals(2, result[1]); + Assert.assertEquals(3, result[2]); + Assert.assertEquals(4, result[3]); + } + + @Test + public void compileHexadecimalValueOneByte() { + BytecodeCompiler compiler = new BytecodeCompiler(); + + byte[] result = compiler.compile("0x01"); + + Assert.assertNotNull(result); + Assert.assertEquals(1, result.length); + Assert.assertEquals(1, result[0]); + } + + @Test + public void compileHexadecimalValueTwoByte() { + BytecodeCompiler compiler = new BytecodeCompiler(); + + byte[] result = compiler.compile("0x0102"); + + Assert.assertNotNull(result); + Assert.assertEquals(2, result.length); + Assert.assertEquals(1, result[0]); + Assert.assertEquals(2, result[1]); + } + + @Test + public void compileSimpleOpcodeInLowerCase() { + BytecodeCompiler compiler = new BytecodeCompiler(); + + byte[] result = compiler.compile("add"); + + Assert.assertNotNull(result); + Assert.assertEquals(1, result.length); + Assert.assertEquals(1, result[0]); + } + + @Test + public void compileSimpleOpcodeInMixedCase() { + BytecodeCompiler compiler = new BytecodeCompiler(); + + byte[] result = compiler.compile("Add"); + + Assert.assertNotNull(result); + Assert.assertEquals(1, result.length); + Assert.assertEquals(1, result[0]); + } +} diff --git a/framework/src/test/java/org/tron/common/runtime/vm/FreezeTest.java b/framework/src/test/java/org/tron/common/runtime/vm/FreezeTest.java index 8fea80d691a..3b3168132f2 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/FreezeTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/FreezeTest.java @@ -334,7 +334,7 @@ public void testFreezeAndUnfreeze() throws Exception { long energyWithoutCreatingAccountA = freezeForOther(contract, userA, frozenBalance, 0) .getReceipt().getEnergyUsageTotal(); - Assert.assertEquals(energyWithCreatingAccountA - EnergyCost.getInstance().getNewAcctCall(), + Assert.assertEquals(energyWithCreatingAccountA - EnergyCost.getNewAcctCall(), energyWithoutCreatingAccountA); freezeForOther(contract, userA, frozenBalance, 1); @@ -344,7 +344,7 @@ public void testFreezeAndUnfreeze() throws Exception { long energyWithoutCreatingAccountB = freezeForOther(contract, userB, frozenBalance, 1) .getReceipt().getEnergyUsageTotal(); - Assert.assertEquals(energyWithCreatingAccountB - EnergyCost.getInstance().getNewAcctCall(), + Assert.assertEquals(energyWithCreatingAccountB - EnergyCost.getNewAcctCall(), energyWithoutCreatingAccountB); freezeForOther(contract, userB, frozenBalance, 0); diff --git a/framework/src/test/java/org/tron/common/runtime/vm/InterpreterTest.java b/framework/src/test/java/org/tron/common/runtime/vm/InterpreterTest.java index cd9e2a85cda..28a6449d464 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/InterpreterTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/InterpreterTest.java @@ -27,7 +27,9 @@ import org.tron.common.runtime.InternalTransaction.TrxType; import org.tron.core.config.args.Args; import org.tron.core.exception.ContractValidateException; -import org.tron.core.vm.VM; +import org.tron.core.vm.Op; +import org.tron.core.vm.Operation; +import org.tron.core.vm.OperationRegistry; import org.tron.core.vm.program.Program; import org.tron.core.vm.program.invoke.ProgramInvokeMockImpl; import org.tron.protos.Protocol.Transaction; @@ -40,6 +42,7 @@ public class InterpreterTest { @BeforeClass public static void init() { + OperationRegistry.newBaseOperation(); CommonParameter.getInstance().setDebug(true); } @@ -50,7 +53,6 @@ public static void destroy() { @Test public void testVMException() throws ContractValidateException { - VM vm = new VM(); invoke = new ProgramInvokeMockImpl(); byte[] op = {0x5b, 0x60, 0x00, 0x56}; // 0x5b - JUMPTEST @@ -64,7 +66,20 @@ public void testVMException() throws ContractValidateException { try { while (!program.isStopped()) { - vm.step(program); + Operation operation = OperationRegistry.get(program.getCurrentOpIntValue()); + if (operation == null) { + throw Program.Exception.invalidOpCode(program.getCurrentOp()); + } + program.setLastOp((byte) operation.getOpcode()); + program.verifyStackSize(operation.getRequire()); + //Check not exceeding stack limits + program.verifyStackOverflow(operation.getRequire(), operation.getRet()); + + program.spendEnergy(operation.getEnergyCost(program), + Op.getNameOf(operation.getOpcode())); + program.checkCPUTimeLimit(Op.getNameOf(operation.getOpcode())); + operation.execute(program); + program.setPreviouslyExecutedOp((byte) operation.getOpcode()); } } catch (Program.OutOfEnergyException e) { result = true; @@ -75,7 +90,6 @@ public void testVMException() throws ContractValidateException { @Test public void JumpSingleOperation() throws ContractValidateException { - VM vm = new VM(); invoke = new ProgramInvokeMockImpl(); byte[] op = {0x56}; // 0x56 - JUMP @@ -87,7 +101,20 @@ public void JumpSingleOperation() throws ContractValidateException { try { while (!program.isStopped()) { - vm.step(program); + Operation operation = OperationRegistry.get(program.getCurrentOpIntValue()); + if (operation == null) { + throw Program.Exception.invalidOpCode(program.getCurrentOp()); + } + program.setLastOp((byte) operation.getOpcode()); + program.verifyStackSize(operation.getRequire()); + //Check not exceeding stack limits + program.verifyStackOverflow(operation.getRequire(), operation.getRet()); + + program.spendEnergy(operation.getEnergyCost(program), + Op.getNameOf(operation.getOpcode())); + program.checkCPUTimeLimit(Op.getNameOf(operation.getOpcode())); + operation.execute(program); + program.setPreviouslyExecutedOp((byte) operation.getOpcode()); } } catch (Program.StackTooSmallException e) { // except to get stack too small exception for Jump @@ -99,7 +126,6 @@ public void JumpSingleOperation() throws ContractValidateException { @Test public void JumpToInvalidDestination() throws ContractValidateException { - VM vm = new VM(); invoke = new ProgramInvokeMockImpl(); byte[] op = {0x60, 0x20, 0x56}; // 0x60 - PUSH1 @@ -113,7 +139,20 @@ public void JumpToInvalidDestination() throws ContractValidateException { try { while (!program.isStopped()) { - vm.step(program); + Operation operation = OperationRegistry.get(program.getCurrentOpIntValue()); + if (operation == null) { + throw Program.Exception.invalidOpCode(program.getCurrentOp()); + } + program.setLastOp((byte) operation.getOpcode()); + program.verifyStackSize(operation.getRequire()); + //Check not exceeding stack limits + program.verifyStackOverflow(operation.getRequire(), operation.getRet()); + + program.spendEnergy(operation.getEnergyCost(program), + Op.getNameOf(operation.getOpcode())); + program.checkCPUTimeLimit(Op.getNameOf(operation.getOpcode())); + operation.execute(program); + program.setPreviouslyExecutedOp((byte) operation.getOpcode()); } } catch (Program.BadJumpDestinationException e) { // except to get BadJumpDestinationException for Jump @@ -126,7 +165,6 @@ public void JumpToInvalidDestination() throws ContractValidateException { @Test public void JumpToLargeNumberDestination() throws ContractValidateException { - VM vm = new VM(); invoke = new ProgramInvokeMockImpl(); byte[] op = {0x64, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x56}; // 0x60 - PUSH5 @@ -140,7 +178,20 @@ public void JumpToLargeNumberDestination() throws ContractValidateException { try { while (!program.isStopped()) { - vm.step(program); + Operation operation = OperationRegistry.get(program.getCurrentOpIntValue()); + if (operation == null) { + throw Program.Exception.invalidOpCode(program.getCurrentOp()); + } + program.setLastOp((byte) operation.getOpcode()); + program.verifyStackSize(operation.getRequire()); + //Check not exceeding stack limits + program.verifyStackOverflow(operation.getRequire(), operation.getRet()); + + program.spendEnergy(operation.getEnergyCost(program), + Op.getNameOf(operation.getOpcode())); + program.checkCPUTimeLimit(Op.getNameOf(operation.getOpcode())); + operation.execute(program); + program.setPreviouslyExecutedOp((byte) operation.getOpcode()); } } catch (Program.BadJumpDestinationException e) { // except to get BadJumpDestinationException for Jump diff --git a/framework/src/test/java/org/tron/common/runtime/vm/IsSRCandidateTest.java b/framework/src/test/java/org/tron/common/runtime/vm/IsSRCandidateTest.java index 9521d238cf0..46445e92826 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/IsSRCandidateTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/IsSRCandidateTest.java @@ -19,7 +19,6 @@ import org.tron.core.vm.program.Program; import org.tron.core.vm.program.invoke.ProgramInvoke; import org.tron.core.vm.program.invoke.ProgramInvokeFactory; -import org.tron.core.vm.program.invoke.ProgramInvokeFactoryImpl; import org.tron.core.vm.repository.Repository; import org.tron.core.vm.repository.RepositoryImpl; import org.tron.protos.Protocol.Transaction; @@ -140,8 +139,6 @@ public void testIsSRCandidate() Repository repository; StoreFactory storeFactory = StoreFactory.getInstance(); - ProgramInvokeFactory programInvokeFactory = new ProgramInvokeFactoryImpl(); - VMConfig vmConfig = VMConfig.getInstance(); // deploy contract Transaction trx = @@ -166,7 +163,7 @@ public void testIsSRCandidate() new InternalTransaction(trx, InternalTransaction.TrxType.TRX_CONTRACT_CALL_TYPE); repository = RepositoryImpl.createRoot(storeFactory); ProgramInvoke programInvoke = - programInvokeFactory.createProgramInvoke( + ProgramInvokeFactory.createProgramInvoke( InternalTransaction.TrxType.TRX_CONTRACT_CALL_TYPE, InternalTransaction.ExecutorType.ET_PRE_TYPE, trx, @@ -177,7 +174,7 @@ public void testIsSRCandidate() System.nanoTime() / 1000, System.nanoTime() / 1000 + 50000, 3_000_000L); - Program program = new Program(null, programInvoke, rootInternalTransaction, vmConfig); + Program program = new Program(null, programInvoke, rootInternalTransaction); byte[] programResult = program.isSRCandidate(new DataWord(nonexistentAddr)).getData(); Assert.assertEquals( Hex.toHexString(programResult), @@ -193,7 +190,7 @@ public void testIsSRCandidate() new InternalTransaction(trx, InternalTransaction.TrxType.TRX_CONTRACT_CALL_TYPE); repository = RepositoryImpl.createRoot(storeFactory); programInvoke = - programInvokeFactory.createProgramInvoke( + ProgramInvokeFactory.createProgramInvoke( InternalTransaction.TrxType.TRX_CONTRACT_CALL_TYPE, InternalTransaction.ExecutorType.ET_PRE_TYPE, trx, @@ -204,7 +201,7 @@ public void testIsSRCandidate() System.nanoTime() / 1000, System.nanoTime() / 1000 + 50000, 3_000_000L); - program = new Program(null, programInvoke, rootInternalTransaction, vmConfig); + program = new Program(null, programInvoke, rootInternalTransaction); programResult = program.isSRCandidate(new DataWord(factoryAddress)).getData(); Assert.assertEquals( Hex.toHexString(programResult), @@ -222,7 +219,7 @@ public void testIsSRCandidate() new InternalTransaction(trx, InternalTransaction.TrxType.TRX_CONTRACT_CALL_TYPE); repository = RepositoryImpl.createRoot(storeFactory); programInvoke = - programInvokeFactory.createProgramInvoke( + ProgramInvokeFactory.createProgramInvoke( InternalTransaction.TrxType.TRX_CONTRACT_CALL_TYPE, InternalTransaction.ExecutorType.ET_PRE_TYPE, trx, @@ -233,7 +230,7 @@ public void testIsSRCandidate() System.nanoTime() / 1000, System.nanoTime() / 1000 + 50000, 3_000_000L); - program = new Program(null, programInvoke, rootInternalTransaction, vmConfig); + program = new Program(null, programInvoke, rootInternalTransaction); programResult = program.isSRCandidate(new DataWord(witnessAddr)).getData(); Assert.assertEquals( Hex.toHexString(programResult), @@ -250,7 +247,7 @@ public void testIsSRCandidate() new InternalTransaction(trx, InternalTransaction.TrxType.TRX_CONTRACT_CALL_TYPE); repository = RepositoryImpl.createRoot(storeFactory); programInvoke = - programInvokeFactory.createProgramInvoke( + ProgramInvokeFactory.createProgramInvoke( InternalTransaction.TrxType.TRX_CONTRACT_CALL_TYPE, InternalTransaction.ExecutorType.ET_PRE_TYPE, trx, @@ -261,7 +258,7 @@ public void testIsSRCandidate() System.nanoTime() / 1000, System.nanoTime() / 1000 + 50000, 3_000_000L); - program = new Program(null, programInvoke, rootInternalTransaction, vmConfig); + program = new Program(null, programInvoke, rootInternalTransaction); programResult = program.isSRCandidate(new DataWord()).getData(); Assert.assertEquals( Hex.toHexString(programResult), diff --git a/framework/src/test/java/org/tron/common/runtime/vm/OperationsTest.java b/framework/src/test/java/org/tron/common/runtime/vm/OperationsTest.java new file mode 100644 index 00000000000..ae040bd81f1 --- /dev/null +++ b/framework/src/test/java/org/tron/common/runtime/vm/OperationsTest.java @@ -0,0 +1,928 @@ +package org.tron.common.runtime.vm; + +import static org.junit.Assert.assertEquals; + +import java.util.List; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.bouncycastle.util.encoders.Hex; +import org.junit.AfterClass; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Ignore; +import org.junit.Test; +import org.springframework.util.StringUtils; +import org.tron.common.parameter.CommonParameter; +import org.tron.common.runtime.InternalTransaction; +import org.tron.core.config.args.Args; +import org.tron.core.exception.ContractValidateException; +import org.tron.core.vm.Op; +import org.tron.core.vm.Operation; +import org.tron.core.vm.OperationRegistry; +import org.tron.core.vm.VM; +import org.tron.core.vm.config.VMConfig; +import org.tron.core.vm.program.Program; +import org.tron.core.vm.program.invoke.ProgramInvokeMockImpl; +import org.tron.protos.Protocol; + +@Slf4j +public class OperationsTest { + + private ProgramInvokeMockImpl invoke; + private Program program; + + @BeforeClass + public static void init() { + CommonParameter.getInstance().setDebug(true); + VMConfig.initAllowTvmTransferTrc10(1); + VMConfig.initAllowTvmConstantinople(1); + VMConfig.initAllowTvmSolidity059(1); + VMConfig.initAllowTvmIstanbul(1); + VMConfig.initAllowTvmLondon(1); + VMConfig.initAllowTvmCompatibleEvm(1); + OperationRegistry.newBaseOperation(); + OperationRegistry.newAllowTvmTransferTrc10Operation(); + OperationRegistry.newAllowTvmConstantinopleOperation(); + OperationRegistry.newAllowTvmSolidity059Operation(); + OperationRegistry.newAllowTvmIstanbulOperation(); + OperationRegistry.newAllowTvmFreezeOperation(); + OperationRegistry.newAllowTvmVoteOperation(); + OperationRegistry.newAllowTvmLondonOperation(); + } + + @AfterClass + public static void destroy() { + Args.clearParam(); + VMConfig.initAllowTvmTransferTrc10(0); + VMConfig.initAllowTvmConstantinople(0); + VMConfig.initAllowTvmSolidity059(0); + VMConfig.initAllowTvmIstanbul(0); + VMConfig.initAllowTvmLondon(0); + VMConfig.initAllowTvmCompatibleEvm(0); + } + + @Test + public void testStackUnderFlow() { + for (int i = 0; i < 256; i++) { + Operation op = OperationRegistry.get(i); + if (op != null) { + Program context = buildEmptyContext(new byte[]{(byte) op.getOpcode()}); + VM.play(context); + + if (op.getRequire() != 0) { + Assert.assertTrue(context.getResult().getException() + instanceof Program.StackTooSmallException); + } + } + } + } + + @Test + public void testStackOverFlow() { + for (int i = 0; i < 256; i++) { + Operation op = OperationRegistry.get(i); + if (op != null) { + Program context = buildEmptyContext(new byte[]{(byte) op.getOpcode()}); + for (int j = 0; j < 1024; j++) { + context.stackPushZero(); + } + VM.play(context); + + if (op.getRet() - op.getRequire() > 0) { + Assert.assertTrue(context.getResult().getException() + instanceof Program.StackTooLargeException); + } + } + } + } + + @SneakyThrows + private Program buildEmptyContext(byte[] ops) { + Program context = new Program( + ops, + new ProgramInvokeMockImpl(), + new InternalTransaction( + Protocol.Transaction.getDefaultInstance(), + InternalTransaction.TrxType.TRX_UNKNOWN_TYPE)); + context.setRootTransactionId(new byte[32]); + return context; + } + + // test Arithmetic Operations + @Test + public void testArithmeticOperations() throws ContractValidateException { + invoke = new ProgramInvokeMockImpl(); + Protocol.Transaction trx = Protocol.Transaction.getDefaultInstance(); + InternalTransaction interTrx = + new InternalTransaction(trx, InternalTransaction.TrxType.TRX_UNKNOWN_TYPE); + + // test ADD + byte[] op = {0x60, 0x01, 0x60, 0x01, 0x01}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(9, program.getResult().getEnergyUsed()); + Assert.assertEquals(new DataWord(0x02), program.getStack().pop()); + + // test MUL + op = new byte[]{0x60, 0x01, 0x60, 0x01, 0x02}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(11, program.getResult().getEnergyUsed()); + Assert.assertEquals(new DataWord(0x01), program.getStack().pop()); + + // test SUB + op = new byte[]{0x60, 0x01, 0x60, 0x01, 0x03}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(9, program.getResult().getEnergyUsed()); + Assert.assertEquals(new DataWord(0x00), program.getStack().pop()); + + // test DIV + op = new byte[]{0x60, 0x01, 0x60, 0x02, 0x04}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(11, program.getResult().getEnergyUsed()); + Assert.assertEquals(new DataWord(0x02), program.getStack().pop()); + + // test SDIV + op = new byte[]{0x60, 0x01, 0x60, 0x01, 0x05}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(11, program.getResult().getEnergyUsed()); + Assert.assertEquals(new DataWord(0x01),program.getStack().pop()); + + // test MOD + op = new byte[]{0x60, 0x02, 0x60, 0x01, 0x06}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(11, program.getResult().getEnergyUsed()); + Assert.assertEquals(new DataWord(0x01), program.getStack().pop()); + + // test SMOD + op = new byte[]{0x60, 0x02, 0x60, 0x01, 0x07}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(11, program.getResult().getEnergyUsed()); + Assert.assertEquals(new DataWord(0x01), program.getStack().pop()); + + // test ADDMOD + op = new byte[]{0x60, 0x02, 0x60, 0x01, 0x60, 0x01, 0x08}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(17, program.getResult().getEnergyUsed()); + Assert.assertEquals(new DataWord(0x00), program.getStack().pop()); + + // test MULMOD + op = new byte[]{0x60, 0x02, 0x60, 0x01, 0x60, 0x01, 0x09}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(17, program.getResult().getEnergyUsed()); + Assert.assertEquals(new DataWord(0x01), program.getStack().pop()); + + // test EXP + op = new byte[]{0x60, 0x02, 0x60, 0x02, 0x0a}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(26, program.getResult().getEnergyUsed()); + Assert.assertEquals(new DataWord(0x04), program.getStack().pop()); + + // test SIGNEXTEND + op = new byte[]{0x60, 0x02, 0x60, 0x02, 0x0b}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(11, program.getResult().getEnergyUsed()); + Assert.assertEquals(new DataWord(0x02), program.getStack().pop()); + } + + // test Bitwise Logic & Comparison Operations + @Test + public void testLogicAndComparisonOperations() throws ContractValidateException { + invoke = new ProgramInvokeMockImpl(); + Protocol.Transaction trx = Protocol.Transaction.getDefaultInstance(); + InternalTransaction interTrx = + new InternalTransaction(trx, InternalTransaction.TrxType.TRX_UNKNOWN_TYPE); + + // test LT = 0x10 + byte[] op = {0x60, 0x01, 0x60, 0x02, 0x10}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(9, program.getResult().getEnergyUsed()); + Assert.assertEquals(new DataWord(0x00), program.getStack().pop()); + + // test GT = 0X11 + op = new byte[]{0x60, 0x01, 0x60, 0x02, 0X11}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(9, program.getResult().getEnergyUsed()); + Assert.assertEquals(new DataWord(0x01), program.getStack().pop()); + + // test SLT = 0X12 + op = new byte[]{0x60, 0x01, 0x60, 0x02, 0X12}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(9, program.getResult().getEnergyUsed()); + Assert.assertEquals(new DataWord(0x00), program.getStack().pop()); + + // test SGT = 0X13 + op = new byte[]{0x60, 0x01, 0x60, 0x02, 0X13}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(9, program.getResult().getEnergyUsed()); + Assert.assertEquals(new DataWord(0x01), program.getStack().pop()); + + // test EQ = 0X14 + op = new byte[]{0x60, 0x01, 0x60, 0x02, 0X14}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(9, program.getResult().getEnergyUsed()); + Assert.assertEquals(new DataWord(0x00), program.getStack().pop()); + + // test ISZERO = 0x15 + op = new byte[]{0x60, 0x01, 0x15}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(6, program.getResult().getEnergyUsed()); + Assert.assertEquals(new DataWord(0x00), program.getStack().pop()); + + // test AND = 0x16 + op = new byte[]{0x60, 0x01, 0x60, 0x02, 0x16}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(9, program.getResult().getEnergyUsed()); + Assert.assertEquals(new DataWord(0x00), program.getStack().pop()); + + // test OR = 0x17 + op = new byte[]{0x60, 0x01, 0x60, 0x02, 0x17}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(9, program.getResult().getEnergyUsed()); + Assert.assertEquals(new DataWord(0x03), program.getStack().pop()); + + // test XOR = 0x18 + op = new byte[]{0x60, 0x01, 0x60, 0x02, 0x18}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(9, program.getResult().getEnergyUsed()); + Assert.assertEquals(new DataWord(0x03), program.getStack().pop()); + + // test NOT = 0x19 + op = new byte[]{0x60, 0x00, 0x19}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(6, program.getResult().getEnergyUsed()); + Assert.assertEquals((byte) (-0x01), program.getStack().pop().getData()[31]); + + // test BYTE = 0x1a + op = new byte[]{0x60, 0x01, 0x60, 0x01, 0x1a}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(9, program.getResult().getEnergyUsed()); + Assert.assertEquals(new DataWord(0x00), program.getStack().pop()); + + // test SHL = 0x1b + op = new byte[]{0x60, 0x01, 0x60, 0x01, 0x1b}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(9, program.getResult().getEnergyUsed()); + Assert.assertEquals(new DataWord(0x02), program.getStack().pop()); + + // test SHR = 0x1c + op = new byte[]{0x60, 0x01, 0x60, 0x02, 0x1c}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(9, program.getResult().getEnergyUsed()); + Assert.assertEquals(new DataWord(0x00), program.getStack().pop()); + + // test SAR = 0x1d + op = new byte[]{0x60, 0x01, 0x60, 0x02, 0x1d}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(9, program.getResult().getEnergyUsed()); + Assert.assertEquals(new DataWord(0x00), program.getStack().pop()); + + } + + // test Cryptographic Operations and Environmental Information + @Test + public void testCryptographicAndEnvironmentalOperations() throws ContractValidateException { + invoke = new ProgramInvokeMockImpl(); + Protocol.Transaction trx = Protocol.Transaction.getDefaultInstance(); + InternalTransaction interTrx = + new InternalTransaction(trx, InternalTransaction.TrxType.TRX_UNKNOWN_TYPE); + + // test SHA3 = 0x20 + byte[] op = {0x60, 0x01, 0x60, 0x01, 0x20}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(45, program.getResult().getEnergyUsed()); + Assert.assertEquals("bc36789e7a1e281436464229828f817d6612f7b477d66591ff96a9e064bcc98a", + program.getStack().pop().toHexString()); + + // test ADDRESS = 0x30 + op = new byte[]{0x30}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(2, program.getResult().getEnergyUsed()); + Assert.assertEquals(invoke.getContractAddress(), program.getStack().pop()); + + // test ORIGIN = 0x32 + op = new byte[]{0x32}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(2, program.getResult().getEnergyUsed()); + Assert.assertEquals(invoke.getOriginAddress(), program.getStack().pop()); + + // test CALLER = 0x33 + op = new byte[]{0x33}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(2, program.getResult().getEnergyUsed()); + Assert.assertEquals(new DataWord(invoke.getCallerAddress().getLast20Bytes()), + program.getStack().pop()); + + // CALLVALUE = 0x34 + op = new byte[]{0x34}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(2, program.getResult().getEnergyUsed()); + Assert.assertEquals(invoke.getCallValue(), program.getStack().pop()); + + // CALLDATALOAD = 0x35 + op = new byte[]{0x60, 0x01, 0x35}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(6, program.getResult().getEnergyUsed()); + Assert.assertEquals(invoke.getDataValue(new DataWord(0x01)), program.getStack().pop()); + + // CALLDATASIZE = 0x36 + op = new byte[]{0x60, 0x01, 0x36}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(5, program.getResult().getEnergyUsed()); + Assert.assertEquals(invoke.getDataSize(), program.getStack().pop()); + + // CALLDATACOPY = 0x37 + op = new byte[]{0x60, 0x01, 0x60, 0x01, 0x60, 0x01, 0x37}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(15, program.getResult().getEnergyUsed()); + Assert.assertEquals(new DataWord(invoke.getDataCopy(new DataWord(0x01), + new DataWord(0x01))), + new DataWord(program.getDataCopy(new DataWord(0x01), new DataWord(0x01)))); + + // CODESIZE = 0x38 + op = new byte[]{0x38}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(2, program.getResult().getEnergyUsed()); + Assert.assertEquals(new DataWord(0x01), program.getStack().pop()); + + // CODECOPY = 0x39 + op = new byte[]{0x60, 0x01, 0x60, 0x01, 0x60, 0x01, 0x39}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(15, program.getResult().getEnergyUsed()); + Assert.assertEquals(new DataWord(0x00), new DataWord( + program.getDataCopy(new DataWord(0x01), new DataWord(0x01)))); + + // RETURNDATASIZE = 0x3d + op = new byte[]{0x3d}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(2, program.getResult().getEnergyUsed()); + Assert.assertEquals(new DataWord(0x00), program.getStack().pop()); + + // RETURNDATACOPY = 0x3e + op = new byte[]{0x60, 0x01, 0x60, 0x01, 0x60, 0x01, 0x3e}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(50, program.getResult().getEnergyUsed()); + Assert.assertNull( + program.getReturnDataBufferData(new DataWord(0x01), new DataWord(0x01))); + + // GASPRICE = 0x3a + op = new byte[]{0x3a}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(2, program.getResult().getEnergyUsed()); + Assert.assertEquals(new DataWord(0), program.getStack().pop()); + } + + // test Block Information + @Test + public void testBlockInformationOperations() throws ContractValidateException { + invoke = new ProgramInvokeMockImpl(); + Protocol.Transaction trx = Protocol.Transaction.getDefaultInstance(); + InternalTransaction interTrx = + new InternalTransaction(trx, InternalTransaction.TrxType.TRX_UNKNOWN_TYPE); + + // BLOCKHASH = 0x40 + byte[] op = {0x40}; + program = new Program(op, invoke, interTrx); + program.stackPush(new DataWord(33)); + testOperations(program); + Assert.assertEquals(20, program.getResult().getEnergyUsed()); + Assert.assertEquals(new DataWord(0), program.getStack().pop()); + + // COINBASE = 0x41 + op = new byte[]{0x41}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(2, program.getResult().getEnergyUsed()); + Assert.assertEquals(new DataWord(invoke.getCoinbase().getLast20Bytes()), + program.getStack().pop()); + + // TIMESTAMP = 0x42 + op = new byte[]{0x42}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(2, program.getResult().getEnergyUsed()); + Assert.assertEquals(invoke.getTimestamp(), program.getStack().pop()); + + // NUMBER = 0x43 + op = new byte[]{0x43}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(2, program.getResult().getEnergyUsed()); + Assert.assertEquals(invoke.getNumber(), program.getStack().pop()); + + // DIFFICULTY = 0x44 + op = new byte[]{0x44}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(2, program.getResult().getEnergyUsed()); + Assert.assertEquals(new DataWord(0), program.getStack().pop()); + + // GASLIMIT = 0x45 + op = new byte[]{0x45}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(2, program.getResult().getEnergyUsed()); + Assert.assertEquals(new DataWord(0), program.getStack().pop()); + + // CHAINID = 0x46 + + // BASEFEE = 0x48 + + } + + // test Memory, Storage and Flow Operations + @Test + public void testMemoryStorageAndFlowOperations() throws ContractValidateException { + invoke = new ProgramInvokeMockImpl(); + Protocol.Transaction trx = Protocol.Transaction.getDefaultInstance(); + InternalTransaction interTrx = + new InternalTransaction(trx, InternalTransaction.TrxType.TRX_UNKNOWN_TYPE); + + // POP = 0x50 + byte[] op = {0x60, 0x01, 0x50}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(5, program.getResult().getEnergyUsed()); + Assert.assertEquals(0, program.getStack().size()); + + // MLOAD = 0x51 + op = new byte[]{0x60, 0x01, 0x51}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(9, program.getResult().getEnergyUsed()); + Assert.assertEquals(new DataWord(0x00), program.getStack().pop()); + + // MSTORE = 0x52 + op = new byte[]{0x60, 0x01, 0x60, 0x01, 0x52}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(12, program.getResult().getEnergyUsed()); + Assert.assertEquals(64, program.getMemSize()); + + // MSTORE8 = 0x53 + op = new byte[]{0x60, 0x01, 0x60, 0x01, 0x53}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(9, program.getResult().getEnergyUsed(), 41); + Assert.assertEquals(32, program.getMemSize()); + + // JUMP = 0x56 + // JUMPI = 0x57 + // JUMPDEST = 0x5b + program = new Program(compile( + "PUSH1 0x01 PUSH1 0x05 JUMPI JUMPDEST PUSH1 0xCC"), invoke, interTrx); + testSingleOperation(program); + testSingleOperation(program); + testSingleOperation(program); + testSingleOperation(program); + testSingleOperation(program); + Assert.assertEquals(20, program.getResult().getEnergyUsed()); + Assert.assertEquals("00000000000000000000000000000000000000000000000000000000000000CC", + Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); + + // PC = 0x58 + op = new byte[]{0x60, 0x01, 0x60, 0x00, 0x58}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(8, program.getResult().getEnergyUsed()); + Assert.assertEquals(5, program.getPC()); + + // MSIZE = 0x59 + op = new byte[]{0x60, 0x01, 0x60, 0x00, 0x59}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(8, program.getResult().getEnergyUsed()); + Assert.assertEquals(0, program.getMemSize()); + + // GAS = 0x5a + op = new byte[]{0x60, 0x01, 0x60, 0x00, 0x5a}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(8, program.getResult().getEnergyUsed()); + Assert.assertEquals(new DataWord(0x2a), program.getStack().pop()); + + } + + // test push, dup, swap, log + @Test + public void testPushDupSwapAndLogOperations() throws ContractValidateException { + invoke = new ProgramInvokeMockImpl(); + Protocol.Transaction trx = Protocol.Transaction.getDefaultInstance(); + InternalTransaction interTrx = + new InternalTransaction(trx, InternalTransaction.TrxType.TRX_UNKNOWN_TYPE); + + // test push(1-32) + // byte[] op = {0x60, 0x01}; + // program = new Program(op, invoke, interTrx); + // testOperations(program); + // Assert.assertEquals(program.getResult().getEnergyUsed(), 47); + // Assert.assertEquals(program.getStack().pop(), new DataWord(0x01)); + // + // op = new byte[]{0x61, 0x01, 0x02}; + // program = new Program(op, invoke, interTrx); + // testOperations(program); + // Assert.assertEquals(program.getResult().getEnergyUsed(), 47); + // Assert.assertEquals(program.getStack().pop(), new DataWord(new byte[]{0x01, 0x02})); + for (int i = 0; i <= 31; i++) { + byte[] op = new byte[i + 2]; + op[0] = (byte) (0x60 + i); + for (int j = 0; j <= i; j++) { + op[j + 1] = 0x01; + } + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(3, program.getResult().getEnergyUsed()); + byte[] result = new byte[i + 1]; + for (int k = 0; k <= i; k++) { + result[k] = 0x01; + } + Assert.assertEquals(new DataWord(result), program.getStack().pop()); + } + + // test dup(1-16) + // byte[] op = {0x60, 0x01, (byte) 0x80}; + // program = new Program(op, invoke, interTrx); + // testOperations(program); + // Assert.assertEquals(program.getResult().getEnergyUsed(), 44); + // Assert.assertEquals(program.getStack().size(), 2); + // + // op = new byte[]{0x60, 0x01, 0x60, 0x02, (byte) 0x80}; + // program = new Program(op, invoke, interTrx); + // testOperations(program); + // Assert.assertEquals(program.getResult().getEnergyUsed(), 41); + // Assert.assertEquals(program.getStack().size(), 3); + // Assert.assertEquals(program.getStack().pop(), new DataWord(0x02)); + + invoke.setEnergyLimit(100); + for (int i = 0; i <= 15; i++) { + byte[] op = new byte[i * 2 + 3]; + op[op.length - 1] = (byte) (0x80 + i); + for (int j = 0; j <= i; j++) { + op[2 * j] = 0x60; + op[2 * j + 1] = (byte) i; + } + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(3L * (i + 2), program.getResult().getEnergyUsed()); + Assert.assertEquals(new DataWord(i), program.getStack().pop()); + } + + // test swap(1-16) + // byte[] op = {0x60, 0x01, 0x60, 0x02, (byte) 0x90}; + // program = new Program(op, invoke, interTrx); + // testOperations(program); + // Assert.assertEquals(program.getResult().getEnergyUsed(), 91); + // Assert.assertEquals(program.getStack().pop(), new DataWord(0x01)); + // + // op = new byte[]{0x60, 0x01, 0x60, 0x02, 0x60, 0x03, (byte) 0x91}; + // program = new Program(op, invoke, interTrx); + // testOperations(program); + // Assert.assertEquals(program.getResult().getEnergyUsed(), 88); + // Assert.assertEquals(program.getStack().pop(), new DataWord(0x01)); + + for (int i = 0; i <= 15; i++) { + byte[] op = new byte[i * 2 + 5]; + op[op.length - 1] = (byte) (0x90 + i); + op[0] = 0x60; + op[1] = 0x01; + for (int j = 0; j <= i; j++) { + op[2 * (j + 1)] = 0x60; + op[2 * (j + 1) + 1] = (byte) i; + } + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals((3L * (i + 3)), program.getResult().getEnergyUsed()); + Assert.assertEquals(new DataWord(0x01), program.getStack().pop()); + } + + // test log(0-4) + invoke.setEnergyLimit(5000); + program = new Program(compile( + "PUSH2 0x1234 PUSH1 0x00 MSTORE PUSH1 0x20 PUSH1 0x00 LOG0"), invoke, interTrx); + testSingleOperation(program); + testSingleOperation(program); + testSingleOperation(program); + testSingleOperation(program); + testSingleOperation(program); + testSingleOperation(program); + List logInfoList = program.getResult().getLogInfoList(); + LogInfo logInfo = logInfoList.get(0); + assertEquals("471fd3ad3e9eeadeec4608b92d16ce6b500704cc", + Hex.toHexString(logInfo.getAddress())); + assertEquals(0, logInfo.getTopics().size()); + assertEquals("0000000000000000000000000000000000000000000000000000000000001234", + Hex.toHexString(logInfo + .getData())); + Assert.assertEquals(646, program.getResult().getEnergyUsed()); + + program = new Program(compile( + "PUSH2 0x1234 PUSH1 0x00 MSTORE PUSH2 0x9999 PUSH1 0x20 PUSH1 0x00 LOG1"), + invoke, interTrx); + testSingleOperation(program); + testSingleOperation(program); + testSingleOperation(program); + testSingleOperation(program); + testSingleOperation(program); + testSingleOperation(program); + testSingleOperation(program); + logInfoList = program.getResult().getLogInfoList(); + logInfo = logInfoList.get(0); + assertEquals("471fd3ad3e9eeadeec4608b92d16ce6b500704cc", + Hex.toHexString(logInfo.getAddress())); + assertEquals(1, logInfo.getTopics().size()); + assertEquals("0000000000000000000000000000000000000000000000000000000000001234", + Hex.toHexString(logInfo + .getData())); + Assert.assertEquals(1024, program.getResult().getEnergyUsed()); + + program = new Program(compile( + "PUSH2 0x1234 PUSH1 0x00 MSTORE PUSH2 0x9999 PUSH2 0x6666 PUSH1 0x20 PUSH1 0x00 LOG2"), + invoke, interTrx); + testSingleOperation(program); + testSingleOperation(program); + testSingleOperation(program); + testSingleOperation(program); + testSingleOperation(program); + testSingleOperation(program); + testSingleOperation(program); + testSingleOperation(program); + logInfoList = program.getResult().getLogInfoList(); + logInfo = logInfoList.get(0); + assertEquals("471fd3ad3e9eeadeec4608b92d16ce6b500704cc", + Hex.toHexString(logInfo.getAddress())); + assertEquals(2, logInfo.getTopics().size()); + assertEquals("0000000000000000000000000000000000000000000000000000000000001234", + Hex.toHexString(logInfo + .getData())); + Assert.assertEquals(1402, program.getResult().getEnergyUsed()); + + program = new Program(compile("PUSH2 0x1234 PUSH1 0x00 MSTORE PUSH2 0x9999" + + " PUSH2 0x6666 PUSH2 0x3333 PUSH1 0x20 PUSH1 0x00 LOG3"), invoke, interTrx); + testSingleOperation(program); + testSingleOperation(program); + testSingleOperation(program); + testSingleOperation(program); + testSingleOperation(program); + testSingleOperation(program); + testSingleOperation(program); + testSingleOperation(program); + testSingleOperation(program); + logInfoList = program.getResult().getLogInfoList(); + logInfo = logInfoList.get(0); + assertEquals("471fd3ad3e9eeadeec4608b92d16ce6b500704cc", + Hex.toHexString(logInfo.getAddress())); + assertEquals(3, logInfo.getTopics().size()); + assertEquals("0000000000000000000000000000000000000000000000000000000000001234", + Hex.toHexString(logInfo + .getData())); + Assert.assertEquals(1780, program.getResult().getEnergyUsed()); + + program = new Program(compile("PUSH2 0x1234 PUSH1 0x00 MSTORE PUSH2 0x9999 PUSH2" + + " 0x6666 PUSH2 0x3333 PUSH2 0x5555 PUSH1 0x20 PUSH1 0x00 LOG4"), invoke, interTrx); + testSingleOperation(program); + testSingleOperation(program); + testSingleOperation(program); + testSingleOperation(program); + testSingleOperation(program); + testSingleOperation(program); + testSingleOperation(program); + testSingleOperation(program); + testSingleOperation(program); + testSingleOperation(program); + logInfoList = program.getResult().getLogInfoList(); + logInfo = logInfoList.get(0); + assertEquals("471fd3ad3e9eeadeec4608b92d16ce6b500704cc", + Hex.toHexString(logInfo.getAddress())); + assertEquals(4, logInfo.getTopics().size()); + assertEquals("0000000000000000000000000000000000000000000000000000000000001234", + Hex.toHexString(logInfo.getData())); + Assert.assertEquals(2158, program.getResult().getEnergyUsed()); + } + + @Test + public void testOtherOperations() throws ContractValidateException { + invoke = new ProgramInvokeMockImpl(); + Protocol.Transaction trx = Protocol.Transaction.getDefaultInstance(); + InternalTransaction interTrx = + new InternalTransaction(trx, InternalTransaction.TrxType.TRX_UNKNOWN_TYPE); + + // STOP = 0x00 + byte[] op = {0x00}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(0, program.getResult().getEnergyUsed()); + Assert.assertTrue(program.isStopped()); + + // return = 0xf3 + op = new byte[]{0x60, 0x01, 0x60, 0x01, (byte) 0xf3}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(9, program.getResult().getEnergyUsed()); + Assert.assertEquals(1, program.getResult().getHReturn().length); + Assert.assertTrue(program.isStopped()); + + // revert = 0xfd + op = new byte[]{0x60, 0x01, 0x60, 0x01, (byte) 0xfd}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(9, program.getResult().getEnergyUsed()); + Assert.assertEquals(1, program.getResult().getHReturn().length); + Assert.assertTrue(program.isStopped()); + Assert.assertTrue(program.getResult().isRevert()); + } + + @Ignore + @Test + public void testComplexOperations() throws ContractValidateException { + invoke = new ProgramInvokeMockImpl(); + Protocol.Transaction trx = Protocol.Transaction.getDefaultInstance(); + InternalTransaction interTrx = + new InternalTransaction(trx, InternalTransaction.TrxType.TRX_UNKNOWN_TYPE); + + // test BALANCE = 0x31 + byte[] op = new byte[]{0x31}; + program = new Program(op, invoke, interTrx); + program.stackPush(new DataWord("41471fd3ad3e9eeadeec4608b92d16ce6b500704cc")); + testOperations(program); + Assert.assertEquals(20, program.getResult().getEnergyUsed()); + Assert.assertEquals(new DataWord(0), program.getStack().pop()); + + // SELFBALANCE = 0x47 + op = new byte[]{0x47}; + program = new Program(op, invoke, interTrx); + testOperations(program); + Assert.assertEquals(5, program.getResult().getEnergyUsed()); + Assert.assertEquals(new DataWord(0),program.getStack().pop()); + + // SLOAD = 0x54, SSTORE = 0x55 + invoke.setEnergyLimit(20000); + invoke.getDeposit().putStorageValue(Hex.decode( + "41471fd3ad3e9eeadeec4608b92d16ce6b500704cc"), new DataWord(0xAA), + new DataWord(0x01)); + invoke.getDeposit().putStorageValue(Hex.decode( + "41471fd3ad3e9eeadeec4608b92d16ce6b500704cc"), new DataWord(0xCC), + new DataWord(0x01)); + program = new Program( + compile("PUSH1 0x22 PUSH1 0xAA SSTORE PUSH1 0x33 PUSH1 0xCC SSTORE PUSH1 0xCC SLOAD"), + invoke, interTrx); + testSingleOperation(program); + testSingleOperation(program); + testSingleOperation(program); + testSingleOperation(program); + testSingleOperation(program); + testSingleOperation(program); + testSingleOperation(program); + testSingleOperation(program); + Assert.assertEquals(10065, program.getResult().getEnergyUsed()); + Assert.assertEquals("0000000000000000000000000000000000000000000000000000000000000033", + Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); + + // EXTCODESIZE = 0x3b + op = new byte[]{0x3b}; + program = new Program(op, invoke, interTrx); + program.stackPush(new DataWord("471fd3ad3e9eeadeec4608b92d16ce6b500704cc")); + testOperations(program); + Assert.assertEquals(20, program.getResult().getEnergyUsed()); + Assert.assertEquals(new DataWord(0x62), program.getStack().pop()); + + // EXTCODECOPY = 0x3c + op = Hex.decode("60036007600073471FD3AD3E9EEADEEC4608B92D16CE6B500704CC3C123456"); + program = new Program(op, invoke, interTrx); + testSingleOperation(program); + testSingleOperation(program); + testSingleOperation(program); + testSingleOperation(program); + testSingleOperation(program); + Assert.assertEquals(38, program.getResult().getEnergyUsed()); + Assert.assertEquals("6000600000000000000000000000000000000000000000000000000000000000", + Hex.toHexString(program.getMemory()).toUpperCase()); + + } + + private void testOperations(Program program) { + try { + while (!program.isStopped()) { + if (VMConfig.vmTrace()) { + program.saveOpTrace(); + } + try { + Operation op = OperationRegistry.get(program.getCurrentOpIntValue()); + if (op == null) { + throw Program.Exception.invalidOpCode(program.getCurrentOp()); + } + program.setLastOp((byte) op.getOpcode()); + program.verifyStackSize(op.getRequire()); + //Check not exceeding stack limits + program.verifyStackOverflow(op.getRequire(), op.getRet()); + + program.spendEnergy(op.getEnergyCost(program), Op.getNameOf(op.getOpcode())); + program.checkCPUTimeLimit(Op.getNameOf(op.getOpcode())); + op.execute(program); + program.setPreviouslyExecutedOp((byte) op.getOpcode()); + } catch (RuntimeException e) { + logger.info("VM halted: [{}]", e.getMessage()); + if (!(e instanceof Program.TransferException)) { + program.spendAllEnergy(); + } + program.stop(); + throw e; + } finally { + program.fullTrace(); + } + } + + } catch (Program.JVMStackOverFlowException | Program.OutOfTimeException e) { + throw e; + } catch (RuntimeException e) { + if (StringUtils.isEmpty(e.getMessage())) { + program.setRuntimeFailure(new RuntimeException("Unknown Exception")); + } else { + program.setRuntimeFailure(e); + } + } catch (StackOverflowError soe) { + logger.info("\n !!! StackOverflowError: update your java run command with -Xss !!!\n", soe); + throw new Program.JVMStackOverFlowException(); + } + } + + private void testSingleOperation(Program program) { + try { + try { + Operation op = OperationRegistry.get(program.getCurrentOpIntValue()); + if (op == null) { + throw Program.Exception.invalidOpCode(program.getCurrentOp()); + } + program.setLastOp((byte) op.getOpcode()); + program.verifyStackSize(op.getRequire()); + //Check not exceeding stack limits + program.verifyStackOverflow(op.getRequire(), op.getRet()); + + program.spendEnergy(op.getEnergyCost(program), Op.getNameOf(op.getOpcode())); + program.checkCPUTimeLimit(Op.getNameOf(op.getOpcode())); + op.execute(program); + program.setPreviouslyExecutedOp((byte) op.getOpcode()); + } catch (RuntimeException e) { + logger.info("VM halted: [{}]", e.getMessage()); + if (!(e instanceof Program.TransferException)) { + program.spendAllEnergy(); + } + program.stop(); + throw e; + } finally { + program.fullTrace(); + } + } catch (Program.JVMStackOverFlowException | Program.OutOfTimeException e) { + throw e; + } catch (RuntimeException e) { + if (StringUtils.isEmpty(e.getMessage())) { + program.setRuntimeFailure(new RuntimeException("Unknown Exception")); + } else { + program.setRuntimeFailure(e); + } + } catch (StackOverflowError soe) { + logger.info("\n !!! StackOverflowError: update your java run command with -Xss !!!\n", soe); + throw new Program.JVMStackOverFlowException(); + } + } + + private byte[] compile(String code) { + return new BytecodeCompiler().compile(code); + } + +} diff --git a/framework/src/test/java/org/tron/common/runtime/vm/RewardBalanceTest.java b/framework/src/test/java/org/tron/common/runtime/vm/RewardBalanceTest.java index 5ec8f3d7bec..5fc95be728f 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/RewardBalanceTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/RewardBalanceTest.java @@ -21,7 +21,6 @@ import org.tron.core.vm.program.Program; import org.tron.core.vm.program.invoke.ProgramInvoke; import org.tron.core.vm.program.invoke.ProgramInvokeFactory; -import org.tron.core.vm.program.invoke.ProgramInvokeFactoryImpl; import org.tron.core.vm.repository.Repository; import org.tron.core.vm.repository.RepositoryImpl; import org.tron.protos.Protocol; @@ -88,8 +87,6 @@ public void testRewardBalance() manager.getDynamicPropertiesStore().saveChangeDelegation(1); StoreFactory storeFactory = StoreFactory.getInstance(); Repository repository; - ProgramInvokeFactory programInvokeFactory = new ProgramInvokeFactoryImpl(); - VMConfig vmConfig = VMConfig.getInstance(); String contractName = "TestRewardBalance"; byte[] address = Hex.decode(OWNER_ADDRESS); @@ -166,12 +163,12 @@ public void testRewardBalance() InternalTransaction rootInternalTransaction = new InternalTransaction(trx, InternalTransaction.TrxType.TRX_CONTRACT_CALL_TYPE); repository = RepositoryImpl.createRoot(storeFactory); - ProgramInvoke programInvoke = programInvokeFactory + ProgramInvoke programInvoke = ProgramInvokeFactory .createProgramInvoke(InternalTransaction.TrxType.TRX_CONTRACT_CALL_TYPE, InternalTransaction.ExecutorType.ET_PRE_TYPE, trx, 0, 0, blockCap.getInstance(), repository, System.nanoTime() / 1000, System.nanoTime() / 1000 + 50000, 3_000_000L); - Program program = new Program(null, programInvoke, rootInternalTransaction, vmConfig); + Program program = new Program(null, programInvoke, rootInternalTransaction); byte[] result = program.getRewardBalance(new DataWord(Base58.decode(nonexistentAccount))) .getData(); @@ -186,12 +183,12 @@ public void testRewardBalance() rootInternalTransaction = new InternalTransaction(trx, InternalTransaction.TrxType.TRX_CONTRACT_CALL_TYPE); repository = RepositoryImpl.createRoot(storeFactory); - programInvoke = programInvokeFactory + programInvoke = ProgramInvokeFactory .createProgramInvoke(InternalTransaction.TrxType.TRX_CONTRACT_CALL_TYPE, InternalTransaction.ExecutorType.ET_PRE_TYPE, trx, 0, 0, blockCap.getInstance(), repository, System.nanoTime() / 1000, System.nanoTime() / 1000 + 50000, 3_000_000L); - program = new Program(null, programInvoke, rootInternalTransaction, vmConfig); + program = new Program(null, programInvoke, rootInternalTransaction); result = program.getRewardBalance(new DataWord(Base58.decode(factoryAddressStr))).getData(); Assert.assertEquals(Hex.toHexString(result), "0000000000000000000000000000000000000000000000000000000000000000"); @@ -205,12 +202,12 @@ public void testRewardBalance() rootInternalTransaction = new InternalTransaction(trx, InternalTransaction.TrxType.TRX_CONTRACT_CALL_TYPE); repository = RepositoryImpl.createRoot(storeFactory); - programInvoke = programInvokeFactory + programInvoke = ProgramInvokeFactory .createProgramInvoke(InternalTransaction.TrxType.TRX_CONTRACT_CALL_TYPE, InternalTransaction.ExecutorType.ET_PRE_TYPE, trx, 0, 0, blockCap.getInstance(), repository, System.nanoTime() / 1000, System.nanoTime() / 1000 + 50000, 3_000_000L); - program = new Program(null, programInvoke, rootInternalTransaction, vmConfig); + program = new Program(null, programInvoke, rootInternalTransaction); result = program.getRewardBalance(new DataWord(Base58.decode(witnessAccount))).getData(); Assert.assertEquals(Hex.toHexString(result), "0000000000000000000000000000000000000000000000000000000000000000"); @@ -224,12 +221,12 @@ public void testRewardBalance() rootInternalTransaction = new InternalTransaction(trx, InternalTransaction.TrxType.TRX_CONTRACT_CALL_TYPE); repository = RepositoryImpl.createRoot(storeFactory); - programInvoke = programInvokeFactory + programInvoke = ProgramInvokeFactory .createProgramInvoke(InternalTransaction.TrxType.TRX_CONTRACT_CALL_TYPE, InternalTransaction.ExecutorType.ET_PRE_TYPE, trx, 0, 0, blockCap.getInstance(), repository, System.nanoTime() / 1000, System.nanoTime() / 1000 + 50000, 3_000_000L); - program = new Program(null, programInvoke, rootInternalTransaction, vmConfig); + program = new Program(null, programInvoke, rootInternalTransaction); result = program.getRewardBalance(DataWord.ZERO()).getData(); Assert.assertEquals(Hex.toHexString(result), "0000000000000000000000000000000000000000000000000000000000000000"); @@ -243,12 +240,12 @@ public void testRewardBalance() rootInternalTransaction = new InternalTransaction(trx, InternalTransaction.TrxType.TRX_CONTRACT_CALL_TYPE); repository = RepositoryImpl.createRoot(storeFactory); - programInvoke = programInvokeFactory + programInvoke = ProgramInvokeFactory .createProgramInvoke(InternalTransaction.TrxType.TRX_CONTRACT_CALL_TYPE, InternalTransaction.ExecutorType.ET_PRE_TYPE, trx, 0, 0, blockCap.getInstance(), repository, System.nanoTime() / 1000, System.nanoTime() / 1000 + 50000, 3_000_000L); - program = new Program(null, programInvoke, rootInternalTransaction, vmConfig); + program = new Program(null, programInvoke, rootInternalTransaction); result = program.getRewardBalance(new DataWord(Base58.decode(factoryAddressStr))).getData(); Assert.assertEquals(Hex.toHexString(result), "0000000000000000000000000000000000000000000000000000000000000000"); diff --git a/framework/src/test/java/org/tron/common/runtime/vm/StakeTest.java b/framework/src/test/java/org/tron/common/runtime/vm/StakeTest.java deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/framework/src/test/java/org/tron/common/runtime/vm/TransferToAccountTest.java b/framework/src/test/java/org/tron/common/runtime/vm/TransferToAccountTest.java index 4e6b5299cb3..4d7fa13109d 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/TransferToAccountTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/TransferToAccountTest.java @@ -198,7 +198,7 @@ public void TransferTokenTest() long energyCostWhenNonExist = runtime.getResult().getEnergyUsed(); //4.Test Energy Assert.assertEquals(energyCostWhenNonExist - energyCostWhenExist, - EnergyCost.getInstance().getNewAcctCall()); + EnergyCost.getNewAcctCall()); //5. Test transfer Trx with exsit account selectorStr = "transferTo(address,uint256)"; @@ -233,7 +233,7 @@ public void TransferTokenTest() //7.test energy Assert.assertEquals(energyCostWhenNonExist - energyCostWhenExist, - EnergyCost.getInstance().getNewAcctCall()); + EnergyCost.getNewAcctCall()); //8.test transfer to itself selectorStr = "transferTo(address,uint256)"; diff --git a/framework/src/test/java/org/tron/core/actuator/vm/ProgramTraceTest.java b/framework/src/test/java/org/tron/core/actuator/vm/ProgramTraceTest.java index 1c6c60415f4..c9c4966e208 100644 --- a/framework/src/test/java/org/tron/core/actuator/vm/ProgramTraceTest.java +++ b/framework/src/test/java/org/tron/core/actuator/vm/ProgramTraceTest.java @@ -11,7 +11,6 @@ import org.tron.common.utils.FileUtil; import org.tron.core.Constant; import org.tron.core.config.args.Args; -import org.tron.core.vm.OpCode; import org.tron.core.vm.trace.Op; import org.tron.core.vm.trace.OpActions; import org.tron.core.vm.trace.ProgramTrace; @@ -37,8 +36,8 @@ public void programTraceTest() { ProgramTrace anotherProgramTrace = new ProgramTrace(); DataWord energyDataWord = new DataWord(4); OpActions opActions = new OpActions(); - byte addOpCode = OpCode.ADD.val(); - byte subOpCode = OpCode.SUB.val(); + byte addOpCode = org.tron.core.vm.Op.ADD; + byte subOpCode = org.tron.core.vm.Op.SUB; programTrace.addOp(addOpCode, 2, 3, energyDataWord, opActions); anotherProgramTrace.addOp(subOpCode, 5, 6, energyDataWord, opActions); @@ -48,11 +47,11 @@ public void programTraceTest() { Assert.assertFalse(ops.isEmpty()); Assert.assertEquals(2, ops.size()); for (Op op : ops) { - if (op.getCode() == OpCode.ADD) { + if (op.getCode() == org.tron.core.vm.Op.ADD) { Assert.assertEquals(3, op.getDeep()); Assert.assertEquals(2, op.getPc()); Assert.assertEquals(BigInteger.valueOf(4), op.getEnergy()); - } else if (op.getCode() == OpCode.SUB) { + } else if (op.getCode() == org.tron.core.vm.Op.SUB) { Assert.assertEquals(6, op.getDeep()); Assert.assertEquals(5, op.getPc()); Assert.assertEquals(BigInteger.valueOf(4), op.getEnergy()); diff --git a/framework/src/test/java/org/tron/core/config/args/StorageTest.java b/framework/src/test/java/org/tron/core/config/args/StorageTest.java index c025acc4ea0..a6d9d9e7f73 100644 --- a/framework/src/test/java/org/tron/core/config/args/StorageTest.java +++ b/framework/src/test/java/org/tron/core/config/args/StorageTest.java @@ -80,9 +80,21 @@ public void getOptions() { Assert.assertTrue(options.verifyChecksums()); Assert.assertEquals(CompressionType.SNAPPY, options.compressionType()); Assert.assertEquals(4 * 1024, options.blockSize()); - Assert.assertEquals(64 * 1024 * 1024, options.writeBufferSize()); + Assert.assertEquals(16 * 1024 * 1024, options.writeBufferSize()); Assert.assertEquals(32 * 1024 * 1024L, options.cacheSize()); - Assert.assertEquals(5000, options.maxOpenFiles()); + Assert.assertEquals(50, options.maxOpenFiles()); + + options = StorageUtils.getOptionsByDbName("code"); + Assert.assertEquals(64 * 1024 * 1024, options.writeBufferSize()); + Assert.assertEquals(500, options.maxOpenFiles()); + + options = StorageUtils.getOptionsByDbName("delegation"); + Assert.assertEquals(64 * 1024 * 1024, options.writeBufferSize()); + Assert.assertEquals(1000, options.maxOpenFiles()); + + options = StorageUtils.getOptionsByDbName("trans"); + Assert.assertEquals(256 * 1024 * 1024, options.writeBufferSize()); + Assert.assertEquals(50, options.maxOpenFiles()); } } diff --git a/framework/src/test/java/org/tron/core/db/ManagerTest.java b/framework/src/test/java/org/tron/core/db/ManagerTest.java index 645a1543fb2..47e506a808f 100755 --- a/framework/src/test/java/org/tron/core/db/ManagerTest.java +++ b/framework/src/test/java/org/tron/core/db/ManagerTest.java @@ -11,12 +11,10 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; import java.util.stream.IntStream; import lombok.extern.slf4j.Slf4j; -import org.bouncycastle.util.encoders.Hex; import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -48,6 +46,7 @@ import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.core.exception.DupTransactionException; +import org.tron.core.exception.EventBloomException; import org.tron.core.exception.HeaderNotFound; import org.tron.core.exception.ItemNotFoundException; import org.tron.core.exception.NonCommonBlockException; @@ -66,7 +65,6 @@ import org.tron.core.store.ExchangeStore; import org.tron.core.store.ExchangeV2Store; import org.tron.core.store.IncrementalMerkleTreeStore; -import org.tron.protos.Protocol; import org.tron.protos.Protocol.Account; import org.tron.protos.Protocol.Block; import org.tron.protos.Protocol.Transaction; @@ -75,7 +73,6 @@ import org.tron.protos.contract.AssetIssueContractOuterClass; import org.tron.protos.contract.BalanceContract.TransferContract; import org.tron.protos.contract.ShieldContract; -import stest.tron.wallet.dailybuild.operationupdate.MutiSignSmartContractTest; @Slf4j @@ -136,7 +133,7 @@ public void setBlockReference() AccountResourceInsufficientException, TransactionExpirationException, TooBigTransactionException, DupTransactionException, TaposException, BadNumberBlockException, NonCommonBlockException, ReceiptCheckErrException, VMIllegalException, - TooBigTransactionResultException, ZksnarkException { + TooBigTransactionResultException, ZksnarkException, EventBloomException { BlockCapsule blockCapsule = new BlockCapsule( @@ -438,7 +435,7 @@ public void pushSwitchFork() BadNumberBlockException, DupTransactionException, ContractExeException, ValidateSignatureException, TooBigTransactionResultException, TransactionExpirationException, TaposException, ReceiptCheckErrException, TooBigTransactionException, - AccountResourceInsufficientException { + AccountResourceInsufficientException, EventBloomException { String key = "f31db24bfbd1a2ef19beddca0a0fa37632eded9ac666a05d3bd925f01dde1f62"; byte[] privateKey = ByteArray.fromHexString(key); @@ -546,7 +543,7 @@ public void fork() TransactionExpirationException, TooBigTransactionException, DupTransactionException, BadBlockException, TaposException, BadNumberBlockException, NonCommonBlockException, ReceiptCheckErrException, VMIllegalException, TooBigTransactionResultException, - ZksnarkException { + ZksnarkException, EventBloomException { Args.setParam(new String[]{"--witness"}, Constant.TEST_CONF); long size = chainManager.getBlockStore().size(); // System.out.print("block store size:" + size + "\n"); @@ -665,7 +662,7 @@ public void doNotSwitch() DupTransactionException, BadBlockException, TaposException, BadNumberBlockException, NonCommonBlockException, ReceiptCheckErrException, VMIllegalException, TooBigTransactionResultException, - ZksnarkException { + ZksnarkException, EventBloomException { Args.setParam(new String[]{"--witness"}, Constant.TEST_CONF); long size = chainManager.getBlockStore().size(); System.out.print("block store size:" + size + "\n"); @@ -771,7 +768,7 @@ public void switchBack() TransactionExpirationException, TooBigTransactionException, DupTransactionException, BadBlockException, TaposException, BadNumberBlockException, NonCommonBlockException, ReceiptCheckErrException, VMIllegalException, TooBigTransactionResultException, - ZksnarkException { + ZksnarkException, EventBloomException { Args.setParam(new String[]{"--witness"}, Constant.TEST_CONF); long size = chainManager.getBlockStore().size(); System.out.print("block store size:" + size + "\n"); diff --git a/framework/src/test/java/org/tron/core/jsonrpc/BloomTest.java b/framework/src/test/java/org/tron/core/jsonrpc/BloomTest.java new file mode 100644 index 00000000000..2964e24232f --- /dev/null +++ b/framework/src/test/java/org/tron/core/jsonrpc/BloomTest.java @@ -0,0 +1,181 @@ +package org.tron.core.jsonrpc; + +import static org.tron.common.bloom.Bloom.BLOOM_BYTE_SIZE; +import static org.tron.common.bloom.Bloom.getLowBits; + +import java.util.ArrayList; +import java.util.List; +import org.bouncycastle.util.encoders.Hex; +import org.junit.Test; +import org.testng.Assert; +import org.tron.common.bloom.Bloom; +import org.tron.common.crypto.Hash; +import org.tron.common.runtime.vm.DataWord; +import org.tron.common.runtime.vm.LogInfo; +import org.tron.core.capsule.TransactionRetCapsule; +import org.tron.protos.Protocol.TransactionInfo; +import org.tron.protos.Protocol.TransactionInfo.Log; + +public class BloomTest { + + @Test + public void testGetLowBits() { + Assert.assertEquals(getLowBits(512), 1); + Assert.assertEquals(getLowBits(1024), 3); + Assert.assertEquals(getLowBits(2048), 7); + Assert.assertEquals(getLowBits(4096), 15); + } + + @Test + public void testBloom() { + List positive = new ArrayList<>(); + positive.add("testtest"); + positive.add("test"); + positive.add("hallo"); + positive.add("other"); + + List negative = new ArrayList<>(); + negative.add("tes"); + negative.add("lo"); + + Bloom bloom = new Bloom(); + for (String str : positive) { + bloom.or(Bloom.create(Hash.sha3(str.getBytes()))); + } + + for (String str : positive) { + Assert.assertTrue(bloom.matches(Bloom.create(Hash.sha3(str.getBytes())))); + } + + for (String str : negative) { + if (!bloom.matches(Bloom.create(Hash.sha3(str.getBytes())))) { + Assert.assertFalse(positive.contains(str)); + } + } + } + + @Test + public void testBloomExtensively() { + String exp = "c8d3ca65cdb4874300a9e39475508f23ed6da09fdbc487f89a2dcf50b09eb263"; + Bloom b = new Bloom(); + + for (int i = 0; i < 100; i++) { + String data = String.format("xxxxxxxxxx data %d yyyyyyyyyyyyyy", i); + b.or(Bloom.create(Hash.sha3(data.getBytes()))); + } + String got = Hex.toHexString(Hash.sha3(b.getData())); + + Assert.assertEquals(got, exp); + + Bloom b2 = new Bloom(b.getData()); + Assert.assertEquals(Hex.toHexString(Hash.sha3(b2.getData())), exp); + } + + @Test + public void benchmarkNewBloom() { + int times = 100000; + byte[] data = new byte[BLOOM_BYTE_SIZE]; + byte[] test = "testestestest".getBytes(); + System.arraycopy(test, 0, data, 0, test.length); + + long start = System.currentTimeMillis(); + + for (int i = 0; i < times; i++) { + Bloom bloom = new Bloom(data); + } + + long end = System.currentTimeMillis(); + System.out + .println(String.format("benchmarkNewBloom total %d times cost %d ms", times, end - start)); + } + + @Test + public void benchmarkMatches() { + int times = 100000; + byte[] test = "testtest".getBytes(); + + long start = System.currentTimeMillis(); + Bloom bloom = new Bloom(); + for (int i = 0; i < times; i++) { + bloom.matches(Bloom.create(Hash.sha3(test))); + } + + long end = System.currentTimeMillis(); + System.out.println( + String.format("benchmarkMatches total %d times cost %d ms", times, end - start)); + } + + private byte[] bytesToAddress(byte[] address) { + byte[] data = new byte[20]; + System.arraycopy(address, 0, data, 20 - address.length, address.length); + return data; + } + + private TransactionInfo createTransactionInfo(byte[] address1, byte[] address2) { + List logList = new ArrayList<>(); + List topics = new ArrayList<>(); + + TransactionInfo.Builder builder = TransactionInfo.newBuilder(); + + LogInfo logInfo = + new LogInfo(bytesToAddress(address1), topics, new byte[0]); + logList.add(LogInfo.buildLog(logInfo)); + logInfo = + new LogInfo(bytesToAddress(address2), topics, new byte[0]); + logList.add(LogInfo.buildLog(logInfo)); + builder.addAllLog(logList); + + return builder.build(); + + } + + @Test + public void benchmarkCreateByTransaction() { + int times = 10000; + + // small + TransactionRetCapsule smallCapsule = new TransactionRetCapsule(); + smallCapsule.addTransactionInfo(createTransactionInfo(new byte[] {0x11}, + new byte[] {0x01, 0x11})); + smallCapsule.addTransactionInfo(createTransactionInfo(new byte[] {0x22}, + new byte[] {0x02, 0x22})); + + long start = System.currentTimeMillis(); + + Bloom sBloom = new Bloom(); + for (int i = 0; i < times; i++) { + sBloom = Bloom.createBloom(smallCapsule); + } + + long end = System.currentTimeMillis(); + System.out.println( + String.format("benchmarkCreateByTransaction %d times cost %d ms", times, end - start)); + + String exp = "c384c56ece49458a427c67b90fefe979ebf7104795be65dc398b280f24104949"; + String got = Hex.toHexString(Hash.sha3(sBloom.getData())); + Assert.assertEquals(got, exp); + + // large + TransactionRetCapsule largeCapsule = new TransactionRetCapsule(); + for (int i = 0; i < 200; i++) { + largeCapsule.addTransactionInfo(createTransactionInfo(new byte[] {0x11}, + new byte[] {0x01, 0x11})); + largeCapsule.addTransactionInfo(createTransactionInfo(new byte[] {0x22}, + new byte[] {0x02, 0x22})); + } + + start = System.currentTimeMillis(); + + Bloom lBloom = new Bloom(); + for (int i = 0; i < times; i++) { + lBloom = Bloom.createBloom(largeCapsule); + } + + end = System.currentTimeMillis(); + System.out.println( + String.format("benchmarkCreateByTransaction %d times cost %d ms", times, end - start)); + + got = Hex.toHexString(Hash.sha3(lBloom.getData())); + Assert.assertEquals(got, exp); + } +} diff --git a/framework/src/test/java/org/tron/core/jsonrpc/BuildTransactionTest.java b/framework/src/test/java/org/tron/core/jsonrpc/BuildTransactionTest.java new file mode 100644 index 00000000000..c5e775b1869 --- /dev/null +++ b/framework/src/test/java/org/tron/core/jsonrpc/BuildTransactionTest.java @@ -0,0 +1,201 @@ +package org.tron.core.jsonrpc; + +import com.google.protobuf.ByteString; +import java.io.File; +import lombok.extern.slf4j.Slf4j; +import org.junit.AfterClass; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; +import org.tron.common.application.TronApplicationContext; +import org.tron.common.utils.ByteArray; +import org.tron.common.utils.FileUtil; +import org.tron.core.Constant; +import org.tron.core.Wallet; +import org.tron.core.capsule.AccountCapsule; +import org.tron.core.capsule.ContractCapsule; +import org.tron.core.config.DefaultConfig; +import org.tron.core.config.args.Args; +import org.tron.core.db.Manager; +import org.tron.core.services.jsonrpc.types.BuildArguments; +import org.tron.protos.Protocol; +import org.tron.protos.Protocol.Transaction.Contract.ContractType; +import org.tron.protos.contract.SmartContractOuterClass.SmartContract; + +@Slf4j +public class BuildTransactionTest { + + private static String dbPath = "output_build_transaction_test"; + private static final String OWNER_ADDRESS; + private static final String OWNER_ADDRESS_ACCOUNT_NAME = "first"; + + private static final String SMART_CONTRACT_NAME = "smart_contarct"; + private static final String CONTRACT_ADDRESS; + private static final long SOURCE_PERCENT = 10L; + + private static TronApplicationContext context; + private static Manager dbManager; + private static Wallet wallet; + + static { + Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); + context = new TronApplicationContext(DefaultConfig.class); + + OWNER_ADDRESS = + Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; + CONTRACT_ADDRESS = Wallet.getAddressPreFixString() + "f859b5c93f789f4bcffbe7cc95a71e28e5e6a5bd"; + } + + @BeforeClass + public static void init() { + dbManager = context.getBean(Manager.class); + wallet = context.getBean(Wallet.class); + + AccountCapsule accountCapsule = + new AccountCapsule( + ByteString.copyFrom(ByteArray.fromHexString(OWNER_ADDRESS)), + ByteString.copyFromUtf8(OWNER_ADDRESS_ACCOUNT_NAME), + Protocol.AccountType.Normal); + dbManager.getAccountStore().put(accountCapsule.getAddress().toByteArray(), accountCapsule); + + AccountCapsule contractCapsule = + new AccountCapsule( + ByteString.copyFrom(ByteArray.fromHexString(CONTRACT_ADDRESS)), + ByteString.copyFromUtf8(OWNER_ADDRESS_ACCOUNT_NAME), + Protocol.AccountType.Normal); + dbManager.getAccountStore().put(contractCapsule.getAddress().toByteArray(), contractCapsule); + + // smartContarct in contractStore + SmartContract.Builder builder = SmartContract.newBuilder(); + builder.setName(SMART_CONTRACT_NAME); + builder.setOriginAddress(ByteString.copyFrom(ByteArray.fromHexString(OWNER_ADDRESS))); + builder.setContractAddress(ByteString.copyFrom(ByteArray.fromHexString(CONTRACT_ADDRESS))); + builder.setConsumeUserResourcePercent(SOURCE_PERCENT); + dbManager.getContractStore().put( + contractCapsule.getAddress().toByteArray(), + new ContractCapsule(builder.build())); + } + + @AfterClass + public static void removeDb() { + Args.clearParam(); + context.destroy(); + if (FileUtil.deleteDir(new File(dbPath))) { + logger.info("Release resources successful."); + } else { + logger.info("Release resources failure."); + } + } + + @Test + public void testTransferContract() { + BuildArguments buildArguments = new BuildArguments(); + buildArguments.from = "0xabd4b9367799eaa3197fecb144eb71de1e049abc"; + buildArguments.to = "0x548794500882809695a8a687866e76d4271a1abc"; + buildArguments.value = "0x1f4"; + + try { + ContractType contractType = buildArguments.getContractType(wallet); + Assert.assertEquals(ContractType.TransferContract, contractType); + } catch (Exception e) { + Assert.fail(); + } + } + + @Test + public void testTransferAssertContract() { + BuildArguments buildArguments = new BuildArguments(); + buildArguments.from = "0xabd4b9367799eaa3197fecb144eb71de1e049abc"; + buildArguments.to = "0x548794500882809695a8a687866e76d4271a1abc"; + buildArguments.tokenId = 1000016L; + buildArguments.tokenValue = 20L; + + try { + ContractType contractType = buildArguments.getContractType(wallet); + Assert.assertEquals(ContractType.TransferAssetContract, contractType); + } catch (Exception e) { + Assert.fail(); + } + } + + @Test + public void testCreateSmartContract() { + BuildArguments buildArguments = new BuildArguments(); + buildArguments.from = "0xabd4b9367799eaa3197fecb144eb71de1e049abc"; + buildArguments.name = "transferTokenContract"; + buildArguments.gas = "0x245498"; + buildArguments.abi = + "[{\"constant\":false,\"inputs\":[],\"name\":\"getResultInCon\",\"outputs\":" + + "[{\"name\":\"\",\"type\":\"trcToken\"},{\"name\":\"\",\"type\":\"uint256\"}," + + "{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":true," + + "\"stateMutability\":\"payable\",\"type\":\"function\"}," + + "{\"constant\":false,\"inputs\":[{\"name\":\"toAddress\",\"type\":\"address\"}," + + "{\"name\":\"id\",\"type\":\"trcToken\"},{\"name\":\"amount\",\"type\":\"uint256\"}]," + + "\"name\":\"TransferTokenTo\",\"outputs\":[],\"payable\":true," + + "\"stateMutability\":\"payable\",\"type\":\"function\"}," + + "{\"constant\":false,\"inputs\":[],\"name\":\"msgTokenValueAndTokenIdTest\"," + + "\"outputs\":[{\"name\":\"\",\"type\":\"trcToken\"}," + + "{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\"}]," + + "\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"}," + + "{\"inputs\":[],\"payable\":true,\"stateMutability\":\"payable\"," + + "\"type\":\"constructor\"}]\n"; + buildArguments.data = + "6080604052d3600055d2600155346002556101418061001f6000396000f30060806040526004361061005657" + + "63ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166305" + + "c24200811461005b5780633be9ece71461008157806371dc08ce146100aa575b600080fd5b610063610" + + "0b2565b60408051938452602084019290925282820152519081900360600190f35b6100a873fffffff" + + "fffffffffffffffffffffffffffffffff600435166024356044356100c0565b005b61006361010d565" + + "b600054600154600254909192565b60405173ffffffffffffffffffffffffffffffffffffffff84169" + + "082156108fc029083908590600081818185878a8ad0945050505050158015610107573d6000803e3d6" + + "000fd5b50505050565bd3d2349091925600a165627a7a72305820a2fb39541e90eda9a2f5f9e7905ef" + + "98e66e60dd4b38e00b05de418da3154e7570029"; + buildArguments.consumeUserResourcePercent = 100L; + buildArguments.originEnergyLimit = 11111111111111L; + buildArguments.value = "0x1f4"; + buildArguments.tokenId = 1000033L; + buildArguments.tokenValue = 100000L; + + try { + ContractType contractType = buildArguments.getContractType(wallet); + Assert.assertEquals(ContractType.CreateSmartContract, contractType); + } catch (Exception e) { + Assert.fail(); + } + } + + @Test + public void testTriggerSmartContract() { + BuildArguments buildArguments = new BuildArguments(); + buildArguments.from = "0xabd4b9367799eaa3197fecb144eb71de1e049abc"; + buildArguments.to = "0x" + CONTRACT_ADDRESS; + buildArguments.data = + "0x3be9ece7000000000000000000000000ba8e28bdb6e49fbb3f5cd82a9f5ce8363587f1f6000000000000000" + + "00000000000000000000000000000000000000000000f42630000000000000000000000000000000000" + + "000000000000000000000000000001"; + buildArguments.gas = "0x245498"; + buildArguments.value = "0xA"; + buildArguments.tokenId = 1000035L; + buildArguments.tokenValue = 20L; + + try { + ContractType contractType = buildArguments.getContractType(wallet); + Assert.assertEquals(ContractType.TriggerSmartContract, contractType); + } catch (Exception e) { + Assert.fail(); + } + } + + @Test + public void testNoToNoData() { + BuildArguments buildArguments = new BuildArguments(); + buildArguments.from = "0xabd4b9367799eaa3197fecb144eb71de1e049abc"; + buildArguments.to = "0x548794500882809695a8a687866e76d4271a1abc"; + + try { + ContractType contractType = buildArguments.getContractType(wallet); + Assert.assertEquals(ContractType.TriggerSmartContract, contractType); + } catch (Exception e) { + Assert.assertEquals("invalid json request", e.getMessage()); + } + } +} \ No newline at end of file diff --git a/framework/src/test/java/org/tron/core/jsonrpc/ConcurrentHashMapTest.java b/framework/src/test/java/org/tron/core/jsonrpc/ConcurrentHashMapTest.java new file mode 100644 index 00000000000..ea0c0354bb0 --- /dev/null +++ b/framework/src/test/java/org/tron/core/jsonrpc/ConcurrentHashMapTest.java @@ -0,0 +1,205 @@ +package org.tron.core.jsonrpc; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import lombok.extern.slf4j.Slf4j; +import org.junit.Assert; +import org.junit.Test; +import org.tron.common.logsfilter.capsule.BlockFilterCapsule; +import org.tron.common.utils.ByteArray; +import org.tron.core.exception.ItemNotFoundException; +import org.tron.core.services.jsonrpc.TronJsonRpcImpl; +import org.tron.core.services.jsonrpc.filters.BlockFilterAndResult; + +@Slf4j +public class ConcurrentHashMapTest { + + private static int randomInt(int minInt, int maxInt) { + return (int) Math.round(Math.random() * (maxInt - minInt) + minInt); + } + + /** + * test producer and consumer model in getFilterChanges after newBlockFilter. + * Firstly, sum of all consumers' number of messages is same as producer generates. + * Secondly, message of every consumer is continuous, not interject with another + * when consumes parallel. + */ + @Test + public void testHandleBlockHash() { + int times = 200; + int eachCount = 200; + + Map conMap = TronJsonRpcImpl.getBlockFilter2ResultFull(); + Map> resultMap1 = new ConcurrentHashMap<>(); // used to check result + Map> resultMap2 = new ConcurrentHashMap<>(); // used to check result + Map> resultMap3 = new ConcurrentHashMap<>(); // used to check result + + for (int i = 0; i < 5; i++) { + BlockFilterAndResult filterAndResult = new BlockFilterAndResult(); + String filterID = String.valueOf(i); + + conMap.put(filterID, filterAndResult); + resultMap1.put(filterID, new ArrayList<>()); + resultMap2.put(filterID, new ArrayList<>()); + resultMap3.put(filterID, new ArrayList<>()); + } + + try { + Thread.sleep(200); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + Thread putThread = new Thread(new Runnable() { + public void run() { + + for (int i = 1; i <= times; i++) { + logger.info("put time {}, from {} to {}", i, (1 + (i - 1) * eachCount), i * eachCount); + + for (int j = 1 + (i - 1) * eachCount; j <= i * eachCount; j++) { + BlockFilterCapsule blockFilterCapsule = + new BlockFilterCapsule(String.valueOf(j), false); + TronJsonRpcImpl.handleBLockFilter(blockFilterCapsule); + } + try { + Thread.sleep(randomInt(100, 200)); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + + }); + + Thread getThread1 = new Thread(new Runnable() { + public void run() { + for (int t = 1; t <= times * 2; t++) { + + try { + Thread.sleep(randomInt(100, 200)); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + logger.info("Thread1 get time {}", t); + + for (int k = 0; k < 5; k++) { + try { + Object[] blockHashList = TronJsonRpcImpl.getFilterResult(String.valueOf(k), conMap, + TronJsonRpcImpl.getEventFilter2ResultFull()); + + for (Object str : blockHashList) { + resultMap1.get(String.valueOf(k)).add(str.toString()); + } + + } catch (ItemNotFoundException e) { + e.printStackTrace(); + // Assert.fail(e.getMessage()); + } + } + } + } + }); + + Thread getThread2 = new Thread(new Runnable() { + public void run() { + for (int t = 1; t <= times * 2; t++) { + + try { + Thread.sleep(randomInt(100, 200)); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + logger.info("Thread2 get time {}", t); + + for (int k = 0; k < 5; k++) { + try { + Object[] blockHashList = TronJsonRpcImpl.getFilterResult(String.valueOf(k), conMap, + TronJsonRpcImpl.getEventFilter2ResultFull()); + + // if (blockHashList.length == 0) { + // continue; + // } + + for (Object str : blockHashList) { + resultMap2.get(String.valueOf(k)).add(str.toString()); + } + + } catch (ItemNotFoundException e) { + // Assert.fail(e.getMessage()); + } + } + } + } + }); + + Thread getThread3 = new Thread(new Runnable() { + public void run() { + for (int t = 1; t <= times * 2; t++) { + + try { + Thread.sleep(randomInt(100, 200)); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + logger.info("Thread3 get time {}", t); + + for (int k = 0; k < 5; k++) { + try { + Object[] blockHashList = TronJsonRpcImpl.getFilterResult(String.valueOf(k), conMap, + TronJsonRpcImpl.getEventFilter2ResultFull()); + + for (Object str : blockHashList) { + try { + resultMap3.get(String.valueOf(k)).add(str.toString()); + } catch (Exception e) { + logger.error("resultMap3 get {} exception {}", k, e.getMessage()); + e.printStackTrace(); + } + } + + } catch (ItemNotFoundException e) { + // Assert.fail(e.getMessage()); + } + } + } + } + }); + + putThread.start(); + getThread1.start(); + getThread2.start(); + getThread3.start(); + + try { + putThread.join(); + getThread1.join(); + getThread2.join(); + getThread3.join(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + logger.info("-----------------------------------------------------------------------"); + + for (int i = 0; i < 5; i++) { + List pResult = resultMap1.get(String.valueOf(i)); + pResult.addAll(resultMap2.get(String.valueOf(i))); + pResult.addAll(resultMap3.get(String.valueOf(i))); + + for (int j = 1; j <= times * eachCount; j++) { + // if (!pResult.contains(ByteArray.toJsonHex(String.valueOf(j)))) { + // logger.info("key {} not contains {}", i, j); + // } + Assert.assertTrue(pResult.contains(ByteArray.toJsonHex(String.valueOf(j)))); + } + + Assert.assertEquals(times * eachCount, pResult.size()); + } + } + +} \ No newline at end of file diff --git a/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java b/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java index 7c9d2f5ba23..7c4172dae27 100644 --- a/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java +++ b/framework/src/test/java/org/tron/core/jsonrpc/JsonRpcTest.java @@ -1,17 +1,29 @@ package org.tron.core.jsonrpc; +import static org.tron.common.utils.DecodeUtil.addressPreFixString; +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.addressCompatibleToByteArray; +import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.addressToByteArray; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.getMethodSign; import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.parseEnergyFee; +import java.util.ArrayList; +import java.util.BitSet; +import java.util.List; import org.bouncycastle.util.encoders.Hex; import org.junit.Assert; import org.junit.Test; +import org.tron.common.bloom.Bloom; import org.tron.common.crypto.Hash; import org.tron.common.runtime.vm.DataWord; import org.tron.common.utils.ByteArray; import org.tron.common.utils.ByteUtil; import org.tron.common.utils.Commons; -import org.tron.core.services.jsonrpc.CallArguments; +import org.tron.core.exception.JsonRpcInvalidParamsException; +import org.tron.core.services.jsonrpc.TronJsonRpc.FilterRequest; +import org.tron.core.services.jsonrpc.filters.LogBlockQuery; +import org.tron.core.services.jsonrpc.filters.LogFilter; +import org.tron.core.services.jsonrpc.filters.LogFilterWrapper; +import org.tron.core.services.jsonrpc.types.CallArguments; public class JsonRpcTest { @@ -81,8 +93,7 @@ private String generateStorageParameter() { } private String constructData(String functionSelector, String parameter) { - String data = getMethodSign(functionSelector) + parameter; - return data; + return getMethodSign(functionSelector) + parameter; } @Test @@ -109,4 +120,300 @@ public void testGetEnergyPrice() { Assert.assertEquals(40L, parseEnergyFee(1606240810000L, energyPriceHistory)); Assert.assertEquals(140L, parseEnergyFee(1613044810000L, energyPriceHistory)); } + + @Test + public void testAddressCompatibleToByteArray() { + String rawAddress = "548794500882809695a8a687866e76d4271a1abc"; + byte[] expectedBytes = ByteArray.fromHexString(addressPreFixString + rawAddress); + + String addressNoPre = "0x" + rawAddress; + String addressWithPre = "0x" + addressPreFixString + rawAddress; + + try { + Assert.assertArrayEquals(expectedBytes, addressCompatibleToByteArray(rawAddress)); + Assert.assertArrayEquals(expectedBytes, addressCompatibleToByteArray(addressNoPre)); + Assert.assertArrayEquals(expectedBytes, addressCompatibleToByteArray(addressWithPre)); + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } + + try { + addressCompatibleToByteArray(rawAddress.substring(1)); + } catch (JsonRpcInvalidParamsException e) { + Assert.assertEquals("invalid address hash value", e.getMessage()); + } + + try { + addressCompatibleToByteArray(rawAddress + "00"); + } catch (JsonRpcInvalidParamsException e) { + Assert.assertEquals("invalid address hash value", e.getMessage()); + } + + } + + @Test + public void testAddressToByteArray() { + String rawAddress = "548794500882809695a8a687866e76d4271a1abc"; + byte[] expectedBytes = ByteArray.fromHexString(rawAddress); + String addressNoPre = "0x" + rawAddress; + try { + Assert.assertArrayEquals(expectedBytes, addressToByteArray(rawAddress)); + Assert.assertArrayEquals(expectedBytes, addressToByteArray(addressNoPre)); + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } + + //test padding 0 ahead if length(address) = 39 + String address1 = "048794500882809695a8a687866e76d4271a1abc"; + byte[] expectedBytes2 = ByteArray.fromHexString(address1); + Assert.assertEquals(address1.length(), 40); + String address2 = address1.substring(1); + try { + Assert.assertArrayEquals(addressToByteArray(address1), expectedBytes2); + Assert.assertArrayEquals(addressToByteArray(address1), addressToByteArray(address2)); + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } + } + + /** + * test address and topic parameters + */ + @Test + public void testLogFilter() { + + //topic must be 64 hex string + try { + new LogFilter(new FilterRequest(null, null, null, + new String[] {"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"}, + null)); + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } + try { + new LogFilter(new FilterRequest(null, null, null, new String[] {"0x0"}, null)); + } catch (JsonRpcInvalidParamsException e) { + Assert.assertTrue(e.getMessage().contains("invalid topic")); + } + + // not empty topic and null cannot be in same level + try { + new LogFilter(new FilterRequest(null, null, null, new String[][] { + {"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", null}, + }, null)); + } catch (JsonRpcInvalidParamsException e) { + Assert.assertTrue(e.getMessage().contains("invalid topic")); + } + + // topic size should be <= 4 + try { + new LogFilter(new FilterRequest(null, null, null, + new String[] {"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"}, null)); + } catch (JsonRpcInvalidParamsException e) { + Assert.assertEquals("topics size should be <= 4", e.getMessage()); + } + + //address must be 40 hex string, not 41 ahead + try { + new LogFilter(new FilterRequest(null, null, "0x0", null, null)); + } catch (JsonRpcInvalidParamsException e) { + Assert.assertTrue(e.getMessage().contains("invalid address")); + } + try { + new LogFilter( + new FilterRequest(null, null, "0xaa6612f03443517ced2bdcf27958c22353ceeab9", null, null)); + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } + + //address length of 42 hex string with 41 ahead will be invalid + try { + new LogFilter( + new FilterRequest(null, null, "0x41aa6612f03443517ced2bdcf27958c22353ceeab9", null, + null)); + } catch (JsonRpcInvalidParamsException e) { + Assert.assertTrue(e.getMessage().contains("invalid address")); + } + } + + /** + * test fromBlock and toBlock parameters + */ + @Test + public void testLogFilterWrapper() { + + // fromBlock and toBlock are both empty + try { + LogFilterWrapper logFilterWrapper = + new LogFilterWrapper(new FilterRequest(null, null, null, null, null), 100, null); + Assert.assertEquals(logFilterWrapper.getFromBlock(), 100); + Assert.assertEquals(logFilterWrapper.getToBlock(), Long.MAX_VALUE); + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } + + // fromBlock is not empty and smaller than currentMaxBlockNum, toBlock is empty + try { + LogFilterWrapper logFilterWrapper = + new LogFilterWrapper(new FilterRequest("0x14", null, null, null, null), 100, null); + Assert.assertEquals(logFilterWrapper.getFromBlock(), 20); + Assert.assertEquals(logFilterWrapper.getToBlock(), Long.MAX_VALUE); + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } + + // fromBlock is not empty and bigger than currentMaxBlockNum, toBlock is empty + try { + LogFilterWrapper logFilterWrapper = + new LogFilterWrapper(new FilterRequest("0x78", null, null, null, null), 100, null); + Assert.assertEquals(logFilterWrapper.getFromBlock(), 120); + Assert.assertEquals(logFilterWrapper.getToBlock(), Long.MAX_VALUE); + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } + + // fromBlock is empty, toBlock is not empty and smaller than currentMaxBlockNum + try { + LogFilterWrapper logFilterWrapper = + new LogFilterWrapper(new FilterRequest(null, "0x14", null, null, null), 100, null); + Assert.assertEquals(logFilterWrapper.getFromBlock(), 20); + Assert.assertEquals(logFilterWrapper.getToBlock(), 20); + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } + + // fromBlock is empty, toBlock is not empty and bigger than currentMaxBlockNum + try { + LogFilterWrapper logFilterWrapper = + new LogFilterWrapper(new FilterRequest(null, "0x78", null, null, null), 100, null); + Assert.assertEquals(logFilterWrapper.getFromBlock(), 100); + Assert.assertEquals(logFilterWrapper.getToBlock(), 120); + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } + + // fromBlock is not empty, toBlock is not empty + try { + LogFilterWrapper logFilterWrapper = + new LogFilterWrapper(new FilterRequest("0x14", "0x78", null, null, null), 100, null); + Assert.assertEquals(logFilterWrapper.getFromBlock(), 20); + Assert.assertEquals(logFilterWrapper.getToBlock(), 120); + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } + try { + LogFilterWrapper logFilterWrapper = + new LogFilterWrapper(new FilterRequest("0x78", "0x14", null, null, null), 100, null); + } catch (JsonRpcInvalidParamsException e) { + Assert.assertEquals("please verify: fromBlock <= toBlock", e.getMessage()); + } + + //fromBlock or toBlock is not hex num + try { + LogFilterWrapper logFilterWrapper = + new LogFilterWrapper(new FilterRequest("earliest", null, null, null, null), 100, null); + Assert.assertEquals(logFilterWrapper.getFromBlock(), 0); + Assert.assertEquals(logFilterWrapper.getToBlock(), Long.MAX_VALUE); + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } + try { + LogFilterWrapper logFilterWrapper = + new LogFilterWrapper(new FilterRequest("latest", null, null, null, null), 100, null); + Assert.assertEquals(logFilterWrapper.getFromBlock(), 100); + Assert.assertEquals(logFilterWrapper.getToBlock(), Long.MAX_VALUE); + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } + try { + LogFilterWrapper logFilterWrapper = + new LogFilterWrapper(new FilterRequest("pending", null, null, null, null), 100, null); + } catch (JsonRpcInvalidParamsException e) { + Assert.assertEquals("TAG pending not supported", e.getMessage()); + } + try { + LogFilterWrapper logFilterWrapper = + new LogFilterWrapper(new FilterRequest("test", null, null, null, null), 100, null); + } catch (JsonRpcInvalidParamsException e) { + Assert.assertEquals("Incorrect hex syntax", e.getMessage()); + } + } + + private int[] getBloomIndex(String s) { + Bloom bloom = Bloom.create(Hash.sha3(ByteArray.fromHexString(s))); + BitSet bs = BitSet.valueOf(bloom.getData()); + + int[] bitIndex = new int[3]; //must same as the number of hash function in Bloom + int nonZeroCount = 0; + for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1)) { + // operate on index i here + if (i == Integer.MAX_VALUE) { + break; // or (i+1) would overflow + } + bitIndex[nonZeroCount++] = i; + } + + return bitIndex; + } + + @Test + public void testGetConditions() { + try { + List addressList = new ArrayList<>(); + addressList.add("0x57f1887a8bf19b14fc0df6fd9b2acc9af147ea85"); + addressList.add("0x0bc529c00c6401aef6d220be8c6ea1667f6ad93e"); + Object address = addressList; + + Object[] topics = new Object[3]; + topics[0] = "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"; + topics[1] = null; + List topicList = new ArrayList<>(); + topicList.add("0x000000000000000000000000088ee5007c98a9677165d78dd2109ae4a3d04d0c"); + topicList.add("0x00000000000000000000000056178a0d5f301baf6cf3e1cd53d9863437345bf9"); + topicList.add("0x000000000000000000000000bb2b8038a1640196fbe3e38816f3e67cba72d940"); + topicList.add("0x00000000000000000000000056178a0d5f301baf6cf3e1cd53d9863437345bf9"); + topicList.add("0x00000000000000000000000056178a0d5f301baf6cf3e1cd53d9863437345bf9"); + topics[2] = topicList; + + LogFilterWrapper logFilterWrapper = + new LogFilterWrapper(new FilterRequest(null, + null, + address, + topics, + null), + 100, + null); + + LogBlockQuery logBlockQuery = new LogBlockQuery(logFilterWrapper, null, 100, null); + int[][][] conditions = logBlockQuery.getConditions(); + //level = depth(address) + depth(topics), skip null + Assert.assertEquals(3, conditions.length); + //elements number + Assert.assertEquals(2, conditions[0].length); + Assert.assertEquals(1, conditions[1].length); + Assert.assertEquals(5, conditions[2].length); + + for (int i = 0; i < conditions.length; i++) { + for (int j = 0; j < conditions[i].length; j++) { + Assert.assertEquals(3, conditions[i][j].length); + } + } + + Assert.assertArrayEquals(conditions[0][0], + getBloomIndex("0x57f1887a8bf19b14fc0df6fd9b2acc9af147ea85")); + Assert.assertArrayEquals(conditions[0][1], + getBloomIndex("0x0bc529c00c6401aef6d220be8c6ea1667f6ad93e")); + Assert.assertArrayEquals(conditions[1][0], + getBloomIndex("0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef")); + Assert.assertArrayEquals(conditions[2][4], + getBloomIndex("0x00000000000000000000000056178a0d5f301baf6cf3e1cd53d9863437345bf9")); + + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } + } } diff --git a/framework/src/test/java/org/tron/core/jsonrpc/LogMatchExactlyTest.java b/framework/src/test/java/org/tron/core/jsonrpc/LogMatchExactlyTest.java new file mode 100644 index 00000000000..600cc52b58e --- /dev/null +++ b/framework/src/test/java/org/tron/core/jsonrpc/LogMatchExactlyTest.java @@ -0,0 +1,227 @@ +package org.tron.core.jsonrpc; + +import static org.tron.core.services.jsonrpc.filters.LogMatch.matchBlock; + +import java.util.ArrayList; +import java.util.List; +import org.junit.Assert; +import org.junit.Test; +import org.tron.common.runtime.vm.DataWord; +import org.tron.common.runtime.vm.LogInfo; +import org.tron.common.utils.ByteArray; +import org.tron.core.exception.JsonRpcInvalidParamsException; +import org.tron.core.services.jsonrpc.TronJsonRpc.FilterRequest; +import org.tron.core.services.jsonrpc.TronJsonRpc.LogFilterElement; +import org.tron.core.services.jsonrpc.filters.LogFilter; +import org.tron.protos.Protocol.TransactionInfo; +import org.tron.protos.Protocol.TransactionInfo.Log; + +public class LogMatchExactlyTest { + + String addressTest = "0xd4048be096f969f51fd5642a9c744ec2a7eb89fe"; + String topicTest1 = "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"; + String topicTest2 = "0x0000000000000000000000000000000000000000000000000000000000000000"; + String topicTest3 = "0x00000000000000000000000098ff8c0e1effbc70b23de702f415ec1e5ed76d42"; + String topicTest4 = "0x0000000000000000000000000000000000000000000000000000000000000783"; + + private TransactionInfo createTransactionInfo(byte[] address, byte[][] topicArray, byte[] data) { + List logList = new ArrayList<>(); + List topics = new ArrayList<>(); + for (byte[] topic : topicArray) { + topics.add(new DataWord(topic)); + } + + TransactionInfo.Builder builder = TransactionInfo.newBuilder(); + + LogInfo logInfo = new LogInfo(address, topics, data); + logList.add(LogInfo.buildLog(logInfo)); + builder.addAllLog(logList); + + return builder.build(); + } + + private TransactionInfo createTransactionInfo() { + + byte[] address = ByteArray.fromHexString(addressTest); + byte[] topic1 = ByteArray.fromHexString(topicTest1); + byte[] topic2 = ByteArray.fromHexString(topicTest2); + byte[] topic3 = ByteArray.fromHexString(topicTest3); + byte[] topic4 = ByteArray.fromHexString(topicTest4); + + return createTransactionInfo(address, new byte[][] {topic1, topic2, topic3, topic4}, null); + } + + @Test + public void testMatchOneAddress1() { + TransactionInfo transactionInfo = createTransactionInfo(); + try { + LogFilter logFilter = new LogFilter( + new FilterRequest(null, null, addressTest, null, + null)); + Assert.assertTrue(logFilter.matchesExactly(transactionInfo.getLog(0))); + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } + } + + @Test + public void testMatchOneAddress2() { + TransactionInfo transactionInfo = createTransactionInfo(); + try { + LogFilter logFilter = new LogFilter( + new FilterRequest(null, null, addressTest.substring(2), null, + null)); + Assert.assertTrue(logFilter.matchesExactly(transactionInfo.getLog(0))); + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } + } + + @Test + public void testMatchOneAddress3() { + TransactionInfo transactionInfo = createTransactionInfo(); + try { + LogFilter logFilter = new LogFilter( + new FilterRequest(null, null, "0x1111111111111111111111111111111111111111", null, + null)); + Assert.assertFalse(logFilter.matchesExactly(transactionInfo.getLog(0))); + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } + } + + @Test + public void testMatchMultiAddress() { + TransactionInfo transactionInfo = createTransactionInfo(); + List addressList = new ArrayList<>(); + addressList.add(addressTest); + addressList.add("0x0000000000000000000000000000000000000000"); + try { + LogFilter logFilter = new LogFilter( + new FilterRequest(null, null, addressList, null, + null)); + Assert.assertTrue(logFilter.matchesExactly(transactionInfo.getLog(0))); + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } + } + + @Test + public void testMatchOneTopic1() { + TransactionInfo transactionInfo = createTransactionInfo(); + try { + LogFilter logFilter = new LogFilter(new FilterRequest(null, null, null, + new String[] {topicTest1}, null)); + Assert.assertTrue(logFilter.matchesExactly(transactionInfo.getLog(0))); + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } + } + + @Test + public void testMatchOneTopic2() { + TransactionInfo transactionInfo = createTransactionInfo(); + try { + LogFilter logFilter = new LogFilter(new FilterRequest(null, null, null, + new String[] {topicTest2}, null)); + Assert.assertFalse(logFilter.matchesExactly(transactionInfo.getLog(0))); + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } + } + + @Test + public void testMatchMultiTopic1() { + TransactionInfo transactionInfo = createTransactionInfo(); + List topicList = new ArrayList<>(); + topicList.add(topicTest1); + topicList.add(topicTest2); + try { + LogFilter logFilter = new LogFilter(new FilterRequest(null, null, null, + new Object[] {topicList}, null)); + Assert.assertTrue(logFilter.matchesExactly(transactionInfo.getLog(0))); + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } + } + + @Test + public void testMatchMultiTopic2() { + TransactionInfo transactionInfo = createTransactionInfo(); + List topicList = new ArrayList<>(); + topicList.add(topicTest1); + topicList.add(topicTest3); + topicList.add(topicTest4); + + try { + LogFilter logFilter = new LogFilter(new FilterRequest(null, null, null, + new Object[] {null, topicList}, null)); + Assert.assertFalse(logFilter.matchesExactly(transactionInfo.getLog(0))); + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } + } + + @Test + public void testMatchMultiTopic3() { + TransactionInfo transactionInfo = createTransactionInfo(); + List topicList1 = new ArrayList<>(); + topicList1.add(topicTest1); + topicList1.add(topicTest2); + + List topicList2 = new ArrayList<>(); + topicList2.add(topicTest3); + topicList2.add(topicTest4); + try { + LogFilter logFilter = new LogFilter(new FilterRequest(null, null, null, + new Object[] {topicList1, null, topicList2}, null)); + Assert.assertTrue(logFilter.matchesExactly(transactionInfo.getLog(0))); + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } + } + + @Test + public void testMatchAddressMultiTopic() { + TransactionInfo transactionInfo = createTransactionInfo(); + List addressList = new ArrayList<>(); + addressList.add(addressTest); + addressList.add("0x0000000000000000000000000000000000000000"); + + List topicList2 = new ArrayList<>(); + topicList2.add(topicTest3); + topicList2.add(topicTest4); + try { + LogFilter logFilter = new LogFilter(new FilterRequest(null, null, addressList, + new Object[] {topicTest1, null, topicList2}, null)); + Assert.assertTrue(logFilter.matchesExactly(transactionInfo.getLog(0))); + + logFilter = new LogFilter(new FilterRequest(null, null, addressList, + new Object[] {topicTest1, null, topicTest4}, null)); + Assert.assertFalse(logFilter.matchesExactly(transactionInfo.getLog(0))); + + logFilter = new LogFilter(new FilterRequest(null, null, addressList, + new Object[] {topicTest2, null, topicList2}, null)); + Assert.assertFalse(logFilter.matchesExactly(transactionInfo.getLog(0))); + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } + } + + @Test + public void testMatchBlock() { + TransactionInfo transactionInfo = createTransactionInfo(); + List transactionInfoList = new ArrayList<>(); + transactionInfoList.add(transactionInfo); + + try { + LogFilter logFilter = new LogFilter(new FilterRequest(null, null, addressTest, + null, null)); + List elementList = + matchBlock(logFilter, 100, null, transactionInfoList, false); + Assert.assertEquals(1, elementList.size()); + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } + } +} diff --git a/framework/src/test/java/org/tron/core/jsonrpc/SectionBloomStoreTest.java b/framework/src/test/java/org/tron/core/jsonrpc/SectionBloomStoreTest.java new file mode 100644 index 00000000000..4fa40e42807 --- /dev/null +++ b/framework/src/test/java/org/tron/core/jsonrpc/SectionBloomStoreTest.java @@ -0,0 +1,258 @@ +package org.tron.core.jsonrpc; + +import java.io.File; +import java.util.ArrayList; +import java.util.BitSet; +import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import org.testng.Assert; +import org.tron.common.application.TronApplicationContext; +import org.tron.common.runtime.vm.DataWord; +import org.tron.common.runtime.vm.LogInfo; +import org.tron.common.utils.ByteArray; +import org.tron.common.utils.FileUtil; +import org.tron.core.Constant; +import org.tron.core.capsule.TransactionRetCapsule; +import org.tron.core.config.DefaultConfig; +import org.tron.core.config.args.Args; +import org.tron.core.exception.EventBloomException; +import org.tron.core.services.jsonrpc.TronJsonRpc.FilterRequest; +import org.tron.core.services.jsonrpc.filters.LogBlockQuery; +import org.tron.core.services.jsonrpc.filters.LogFilterWrapper; +import org.tron.core.store.SectionBloomStore; +import org.tron.protos.Protocol.TransactionInfo; +import org.tron.protos.Protocol.TransactionInfo.Log; + +public class SectionBloomStoreTest { + + private static final String dbPath = "output-sectionBloomStore-test"; + static SectionBloomStore sectionBloomStore; + private static TronApplicationContext context; + + static { + Args.setParam(new String[] {"--output-directory", dbPath}, + Constant.TEST_CONF); + context = new TronApplicationContext(DefaultConfig.class); + } + + @BeforeClass + public static void init() { + sectionBloomStore = context.getBean(SectionBloomStore.class); + } + + @AfterClass + public static void destroy() { + Args.clearParam(); + context.destroy(); + FileUtil.deleteDir(new File(dbPath)); + } + + @Test + public void testPutAndGet() { + BitSet bitSet = new BitSet(SectionBloomStore.BLOCK_PER_SECTION); + bitSet.set(1); + bitSet.set(100); + bitSet.set(1000); + try { + sectionBloomStore.put(100, 101, bitSet); + Assert.assertEquals(bitSet, sectionBloomStore.get(100, 101)); + } catch (EventBloomException e) { + Assert.fail(); + } + } + + private byte[] bytesToAddress(byte[] address) { + byte[] data = new byte[20]; + System.arraycopy(address, 0, data, 20 - address.length, address.length); + return data; + } + + private TransactionInfo createTransactionInfo(byte[] address1, byte[] address2, byte[] topic) { + List logList = new ArrayList<>(); + List topics = new ArrayList<>(); + topics.add(new DataWord(topic)); + + TransactionInfo.Builder builder = TransactionInfo.newBuilder(); + + LogInfo logInfo = new LogInfo(address1, topics, null); + logList.add(LogInfo.buildLog(logInfo)); + logInfo = new LogInfo(address2, topics, null); + logList.add(LogInfo.buildLog(logInfo)); + builder.addAllLog(logList); + + return builder.build(); + } + + private TransactionInfo createTransactionInfo(byte[] address, byte[] topic) { + List logList = new ArrayList<>(); + List topics = new ArrayList<>(); + topics.add(new DataWord(topic)); + + TransactionInfo.Builder builder = TransactionInfo.newBuilder(); + + LogInfo logInfo = new LogInfo(address, topics, null); + logList.add(LogInfo.buildLog(logInfo)); + builder.addAllLog(logList); + + return builder.build(); + } + + @Test + public void testWriteAndQuery() { + + byte[] address1 = bytesToAddress(new byte[] {0x11}); + byte[] address2 = bytesToAddress(new byte[] {0x22}); + byte[] address3 = bytesToAddress(new byte[] {0x33}); + byte[] address4 = bytesToAddress(new byte[] {0x44}); + byte[] address5 = bytesToAddress(new byte[] {0x55}); + byte[] topic1 = ByteArray + .fromHexString("0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"); + byte[] topic2 = ByteArray + .fromHexString("0xc42079f94a6350d7e6235f29174924f928cc2ac818eb64fed8004e115fbcca67"); + + //add1 + TransactionRetCapsule capsule1 = new TransactionRetCapsule(); + capsule1.addTransactionInfo(createTransactionInfo(address1, address2, topic1)); + sectionBloomStore.initBlockSection(capsule1); + try { + sectionBloomStore.write(10000); + } catch (EventBloomException e) { + Assert.fail(); + } + + //add2 + TransactionRetCapsule capsule2 = new TransactionRetCapsule(); + capsule2.addTransactionInfo(createTransactionInfo(address3, address4, topic1)); + sectionBloomStore.initBlockSection(capsule2); + try { + sectionBloomStore.write(20000); + } catch (EventBloomException e) { + Assert.fail(); + } + + //add3 + TransactionRetCapsule capsule3 = new TransactionRetCapsule(); + capsule3.addTransactionInfo(createTransactionInfo(address5, topic2)); + sectionBloomStore.initBlockSection(capsule3); + try { + sectionBloomStore.write(30000); + } catch (EventBloomException e) { + Assert.fail(); + } + + long currentMaxBlockNum = 50000; + ExecutorService sectionExecutor = Executors.newFixedThreadPool(5); + + //query one address + try { + LogFilterWrapper logFilterWrapper = new LogFilterWrapper( + new FilterRequest("earliest", "latest", ByteArray.toJsonHex(address1), null, null), + currentMaxBlockNum, null); + LogBlockQuery logBlockQuery = + new LogBlockQuery(logFilterWrapper, sectionBloomStore, currentMaxBlockNum, + sectionExecutor); + List possibleBlockList = logBlockQuery.getPossibleBlock(); + Assert.assertTrue(possibleBlockList.contains(10000L)); + } catch (Exception e) { + Assert.fail(); + } + + //query multi address + List addressList = new ArrayList<>(); + addressList.add(ByteArray.toJsonHex(address1)); + addressList.add(ByteArray.toJsonHex(address5)); + try { + LogFilterWrapper logFilterWrapper = new LogFilterWrapper( + new FilterRequest("earliest", "latest", addressList, null, null), + currentMaxBlockNum, null); + LogBlockQuery logBlockQuery = + new LogBlockQuery(logFilterWrapper, sectionBloomStore, currentMaxBlockNum, + sectionExecutor); + List possibleBlockList = logBlockQuery.getPossibleBlock(); + Assert.assertTrue(possibleBlockList.contains(10000L)); + Assert.assertTrue(possibleBlockList.contains(30000L)); + } catch (Exception e) { + Assert.fail(); + } + + //query one topic + try { + LogFilterWrapper logFilterWrapper = new LogFilterWrapper( + new FilterRequest("earliest", "latest", null, + new String[] {ByteArray.toHexString(topic1)}, null), + currentMaxBlockNum, null); + LogBlockQuery logBlockQuery = + new LogBlockQuery(logFilterWrapper, sectionBloomStore, currentMaxBlockNum, + sectionExecutor); + List possibleBlockList = logBlockQuery.getPossibleBlock(); + Assert.assertTrue(possibleBlockList.contains(10000L)); + Assert.assertTrue(possibleBlockList.contains(20000L)); + } catch (Exception e) { + Assert.fail(); + } + + //query another topic + try { + LogFilterWrapper logFilterWrapper = new LogFilterWrapper( + new FilterRequest("earliest", "latest", null, + new String[] {ByteArray.toHexString(topic2)}, null), + currentMaxBlockNum, null); + LogBlockQuery logBlockQuery = + new LogBlockQuery(logFilterWrapper, sectionBloomStore, currentMaxBlockNum, + sectionExecutor); + List possibleBlockList = logBlockQuery.getPossibleBlock(); + Assert.assertTrue(possibleBlockList.contains(30000L)); + } catch (Exception e) { + Assert.fail(); + } + + //query multi topic in "or" condition + List topicList = new ArrayList<>(); + topicList.add(ByteArray.toJsonHex(topic1)); + topicList.add(ByteArray.toJsonHex(topic2)); + try { + LogFilterWrapper logFilterWrapper = new LogFilterWrapper( + new FilterRequest("earliest", "latest", null, + new Object[] {topicList}, null), + currentMaxBlockNum, null); + LogBlockQuery logBlockQuery = + new LogBlockQuery(logFilterWrapper, sectionBloomStore, currentMaxBlockNum, + sectionExecutor); + List possibleBlockList = logBlockQuery.getPossibleBlock(); + Assert.assertTrue(possibleBlockList.contains(10000L)); + Assert.assertTrue(possibleBlockList.contains(20000L)); + Assert.assertTrue(possibleBlockList.contains(30000L)); + } catch (Exception e) { + Assert.fail(); + } + + //add4 + TransactionRetCapsule capsule4 = new TransactionRetCapsule(); + capsule4.addTransactionInfo(createTransactionInfo(address1, address2, topic2)); + sectionBloomStore.initBlockSection(capsule4); + try { + sectionBloomStore.write(10000); + } catch (EventBloomException e) { + Assert.fail(); + } + + //query multi topic in "and" condition. Match Bloom only, but not match exactly. + try { + LogFilterWrapper logFilterWrapper = new LogFilterWrapper( + new FilterRequest("earliest", "latest", null, + new Object[] {ByteArray.toJsonHex(topic1), ByteArray.toJsonHex(topic2)}, null), + currentMaxBlockNum, null); + LogBlockQuery logBlockQuery = + new LogBlockQuery(logFilterWrapper, sectionBloomStore, currentMaxBlockNum, + sectionExecutor); + List possibleBlockList = logBlockQuery.getPossibleBlock(); + Assert.assertTrue(possibleBlockList.contains(10000L)); + } catch (Exception e) { + Assert.fail(); + } + } +} diff --git a/framework/src/test/java/org/tron/core/jsonrpc/WalletCursorTest.java b/framework/src/test/java/org/tron/core/jsonrpc/WalletCursorTest.java new file mode 100644 index 00000000000..73d344acb53 --- /dev/null +++ b/framework/src/test/java/org/tron/core/jsonrpc/WalletCursorTest.java @@ -0,0 +1,152 @@ +package org.tron.core.jsonrpc; + +import com.google.protobuf.ByteString; +import java.io.File; +import lombok.extern.slf4j.Slf4j; +import org.junit.AfterClass; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; +import org.tron.common.application.TronApplicationContext; +import org.tron.common.utils.ByteArray; +import org.tron.common.utils.FileUtil; +import org.tron.core.Constant; +import org.tron.core.Wallet; +import org.tron.core.capsule.AccountCapsule; +import org.tron.core.config.DefaultConfig; +import org.tron.core.config.args.Args; +import org.tron.core.db.Manager; +import org.tron.core.db2.core.Chainbase.Cursor; +import org.tron.core.services.NodeInfoService; +import org.tron.core.services.jsonrpc.TronJsonRpcImpl; +import org.tron.core.services.jsonrpc.TronJsonRpcImpl.RequestSource; +import org.tron.core.services.jsonrpc.types.BuildArguments; +import org.tron.protos.Protocol; + +@Slf4j +public class WalletCursorTest { + private static String dbPath = "output_wallet_cursor_test"; + private static final String OWNER_ADDRESS; + private static final String OWNER_ADDRESS_ACCOUNT_NAME = "first"; + + private static TronApplicationContext context; + private static Manager dbManager; + private static Wallet wallet; + private static NodeInfoService nodeInfoService; + + static { + Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); + context = new TronApplicationContext(DefaultConfig.class); + + OWNER_ADDRESS = + Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; + nodeInfoService = context.getBean("nodeInfoService", NodeInfoService.class); + } + + @BeforeClass + public static void init() { + dbManager = context.getBean(Manager.class); + wallet = context.getBean(Wallet.class); + + AccountCapsule accountCapsule = + new AccountCapsule( + ByteString.copyFromUtf8(OWNER_ADDRESS_ACCOUNT_NAME), + ByteString.copyFrom(ByteArray.fromHexString(OWNER_ADDRESS)), + Protocol.AccountType.Normal, + 10000_000_000L); + dbManager.getAccountStore().put(accountCapsule.getAddress().toByteArray(), accountCapsule); + } + + @AfterClass + public static void removeDb() { + Args.clearParam(); + context.destroy(); + if (FileUtil.deleteDir(new File(dbPath))) { + logger.info("Release resources successful."); + } else { + logger.info("Release resources failure."); + } + } + + @Test + public void testSource() { + TronJsonRpcImpl tronJsonRpc = new TronJsonRpcImpl(nodeInfoService, wallet, dbManager); + + Assert.assertEquals(Cursor.HEAD, wallet.getCursor()); + Assert.assertEquals(RequestSource.FULLNODE, tronJsonRpc.getSource()); + + dbManager.setCursor(Cursor.HEAD); + Assert.assertEquals(Cursor.HEAD, wallet.getCursor()); + Assert.assertEquals(RequestSource.FULLNODE, tronJsonRpc.getSource()); + dbManager.resetCursor(); + + dbManager.setCursor(Cursor.SOLIDITY); + Assert.assertEquals(Cursor.SOLIDITY, wallet.getCursor()); + Assert.assertEquals(RequestSource.SOLIDITY, tronJsonRpc.getSource()); + dbManager.resetCursor(); + + dbManager.setCursor(Cursor.PBFT); + Assert.assertEquals(Cursor.PBFT, wallet.getCursor()); + Assert.assertEquals(RequestSource.PBFT, tronJsonRpc.getSource()); + dbManager.resetCursor(); + } + + @Test + public void testDisableInSolidity() { + BuildArguments buildArguments = new BuildArguments(); + buildArguments.from = "0xabd4b9367799eaa3197fecb144eb71de1e049abc"; + buildArguments.to = "0x548794500882809695a8a687866e76d4271a1abc"; + buildArguments.tokenId = 1000016L; + buildArguments.tokenValue = 20L; + + dbManager.setCursor(Cursor.SOLIDITY); + + TronJsonRpcImpl tronJsonRpc = new TronJsonRpcImpl(nodeInfoService, wallet, dbManager); + try { + tronJsonRpc.buildTransaction(buildArguments); + } catch (Exception e) { + Assert.assertEquals("the method buildTransaction does not exist/is not available in " + + "SOLIDITY", e.getMessage()); + } + + dbManager.resetCursor(); + } + + @Test + public void testDisableInPBFT() { + BuildArguments buildArguments = new BuildArguments(); + buildArguments.from = "0xabd4b9367799eaa3197fecb144eb71de1e049abc"; + buildArguments.to = "0x548794500882809695a8a687866e76d4271a1abc"; + buildArguments.tokenId = 1000016L; + buildArguments.tokenValue = 20L; + + dbManager.setCursor(Cursor.PBFT); + + TronJsonRpcImpl tronJsonRpc = new TronJsonRpcImpl(nodeInfoService, wallet, dbManager); + try { + tronJsonRpc.buildTransaction(buildArguments); + } catch (Exception e) { + Assert.assertEquals("the method buildTransaction does not exist/is not available in " + + "PBFT", e.getMessage()); + } + + dbManager.resetCursor(); + } + + @Test + public void testEnableInFullNode() { + BuildArguments buildArguments = new BuildArguments(); + buildArguments.from = "0xabd4b9367799eaa3197fecb144eb71de1e049abc"; + buildArguments.to = "0x548794500882809695a8a687866e76d4271a1abc"; + buildArguments.value = "0x1f4"; + + TronJsonRpcImpl tronJsonRpc = new TronJsonRpcImpl(nodeInfoService, wallet, dbManager); + + try { + tronJsonRpc.buildTransaction(buildArguments); + } catch (Exception e) { + Assert.fail(); + } + } + +} \ No newline at end of file diff --git a/framework/src/test/java/stest/tron/wallet/common/client/utils/HttpMethed.java b/framework/src/test/java/stest/tron/wallet/common/client/utils/HttpMethed.java index b3cad3f11dd..8ef8fecbd8e 100644 --- a/framework/src/test/java/stest/tron/wallet/common/client/utils/HttpMethed.java +++ b/framework/src/test/java/stest/tron/wallet/common/client/utils/HttpMethed.java @@ -8,12 +8,14 @@ import com.google.gson.JsonParser; import com.google.protobuf.ByteString; import io.netty.util.internal.StringUtil; + import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; + import lombok.extern.slf4j.Slf4j; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; @@ -38,15 +40,29 @@ public class HttpMethed { static HttpClient httpClient; static HttpPost httppost; static HttpResponse response; - static Integer connectionTimeout = Configuration.getByPath("testng.conf") - .getInt("defaultParameter.httpConnectionTimeout"); - static Integer soTimeout = Configuration.getByPath("testng.conf") - .getInt("defaultParameter.httpSoTimeout"); + static Integer connectionTimeout = + Configuration.getByPath("testng.conf").getInt("defaultParameter.httpConnectionTimeout"); + static Integer soTimeout = + Configuration.getByPath("testng.conf").getInt("defaultParameter.httpSoTimeout"); static String transactionString; static String transactionSignString; static JSONObject responseContent; static JSONObject signResponseContent; static JSONObject transactionApprovedListContent; + public static volatile Integer witnessNum; + + /** constructor. */ + private static volatile String httpnode = + Configuration.getByPath("testng.conf").getStringList("httpnode.ip.list").get(1); + + /** constructor. */ + public static Integer getWitnessNum() { + if (null == witnessNum) { + witnessNum = parseResponseContent(listwitnesses(httpnode)).getJSONArray("witnesses").size(); + } + + return witnessNum; + } static { PoolingClientConnectionManager pccm = new PoolingClientConnectionManager(); @@ -56,11 +72,9 @@ public class HttpMethed { httpClient = new DefaultHttpClient(pccm); } - /** - * constructor. - */ - public static HttpResponse updateAccount(String httpNode, byte[] updateAccountAddress, - String accountName, String fromKey) { + /** constructor. */ + public static HttpResponse updateAccount( + String httpNode, byte[] updateAccountAddress, String accountName, String fromKey) { try { final String requestUrl = "http://" + httpNode + "/wallet/updateaccount"; JsonObject userBaseObj2 = new JsonObject(); @@ -80,17 +94,19 @@ public static HttpResponse updateAccount(String httpNode, byte[] updateAccountAd return response; } - /** - * constructor. - */ - public static HttpResponse setAccountId(String httpNode, byte[] setAccountIdAddress, - String accountId, Boolean visable, String fromKey) { + /** constructor. */ + public static HttpResponse setAccountId( + String httpNode, + byte[] setAccountIdAddress, + String accountId, + Boolean visable, + String fromKey) { try { final String requestUrl = "http://" + httpNode + "/wallet/setaccountid"; JsonObject userBaseObj2 = new JsonObject(); userBaseObj2.addProperty("account_id", accountId); - userBaseObj2.addProperty("owner_address", - Base58.encode58Check(PublicMethed.getFinalAddress(fromKey))); + userBaseObj2.addProperty( + "owner_address", Base58.encode58Check(PublicMethed.getFinalAddress(fromKey))); userBaseObj2.addProperty("visible", visable); response = createConnect(requestUrl, userBaseObj2); transactionString = EntityUtils.toString(response.getEntity()); @@ -106,12 +122,9 @@ public static HttpResponse setAccountId(String httpNode, byte[] setAccountIdAddr return response; } - - /** - * constructor. - */ - public static HttpResponse updateWitness(String httpNode, byte[] witnessAddress, String updateUrl, - String fromKey) { + /** constructor. */ + public static HttpResponse updateWitness( + String httpNode, byte[] witnessAddress, String updateUrl, String fromKey) { try { final String requestUrl = "http://" + httpNode + "/wallet/updatewitness"; JsonObject userBaseObj2 = new JsonObject(); @@ -131,12 +144,9 @@ public static HttpResponse updateWitness(String httpNode, byte[] witnessAddress, return response; } - - /** - * constructor. - */ - public static HttpResponse voteWitnessAccount(String httpNode, byte[] ownerAddress, - JsonArray voteArray, String fromKey) { + /** constructor. */ + public static HttpResponse voteWitnessAccount( + String httpNode, byte[] ownerAddress, JsonArray voteArray, String fromKey) { try { final String requestUrl = "http://" + httpNode + "/wallet/votewitnessaccount"; JsonObject userBaseObj2 = new JsonObject(); @@ -157,11 +167,9 @@ public static HttpResponse voteWitnessAccount(String httpNode, byte[] ownerAddre return response; } - /** - * constructor. - */ - public static HttpResponse createAccount(String httpNode, byte[] ownerAddress, - byte[] accountAddress, String fromKey) { + /** constructor. */ + public static HttpResponse createAccount( + String httpNode, byte[] ownerAddress, byte[] accountAddress, String fromKey) { try { final String requestUrl = "http://" + httpNode + "/wallet/createaccount"; JsonObject userBaseObj2 = new JsonObject(); @@ -179,9 +187,7 @@ public static HttpResponse createAccount(String httpNode, byte[] ownerAddress, return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse createWitness(String httpNode, byte[] ownerAddress, String url) { try { final String requestUrl = "http://" + httpNode + "/wallet/createwitness"; @@ -190,9 +196,9 @@ public static HttpResponse createWitness(String httpNode, byte[] ownerAddress, S userBaseObj2.addProperty("owner_address", ByteArray.toHexString(ownerAddress)); response = createConnect(requestUrl, userBaseObj2); logger.info(userBaseObj2.toString()); - //transactionString = EntityUtils.toString(response.getEntity()); - //transactionSignString = gettransactionsign(httpNode,transactionString,fromKey); - //response = broadcastTransaction(httpNode,transactionSignString); + // transactionString = EntityUtils.toString(response.getEntity()); + // transactionSignString = gettransactionsign(httpNode,transactionString,fromKey); + // response = broadcastTransaction(httpNode,transactionSignString); } catch (Exception e) { e.printStackTrace(); httppost.releaseConnection(); @@ -201,9 +207,7 @@ public static HttpResponse createWitness(String httpNode, byte[] ownerAddress, S return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse withdrawBalance(String httpNode, byte[] witnessAddress) { try { final String requestUrl = "http://" + httpNode + "/wallet/withdrawbalance"; @@ -211,9 +215,9 @@ public static HttpResponse withdrawBalance(String httpNode, byte[] witnessAddres userBaseObj2.addProperty("owner_address", ByteArray.toHexString(witnessAddress)); response = createConnect(requestUrl, userBaseObj2); logger.info(userBaseObj2.toString()); - //transactionString = EntityUtils.toString(response.getEntity()); - //transactionSignString = gettransactionsign(httpNode,transactionString,fromKey); - //response = broadcastTransaction(httpNode,transactionSignString); + // transactionString = EntityUtils.toString(response.getEntity()); + // transactionSignString = gettransactionsign(httpNode,transactionString,fromKey); + // response = broadcastTransaction(httpNode,transactionSignString); } catch (Exception e) { e.printStackTrace(); httppost.releaseConnection(); @@ -222,12 +226,9 @@ public static HttpResponse withdrawBalance(String httpNode, byte[] witnessAddres return response; } - - /** - * constructor. - */ - public static HttpResponse sendCoin(String httpNode, byte[] fromAddress, byte[] toAddress, - Long amount, String fromKey) { + /** constructor. */ + public static HttpResponse sendCoin( + String httpNode, byte[] fromAddress, byte[] toAddress, Long amount, String fromKey) { try { final String requestUrl = "http://" + httpNode + "/wallet/createtransaction"; JsonObject userBaseObj2 = new JsonObject(); @@ -246,11 +247,14 @@ public static HttpResponse sendCoin(String httpNode, byte[] fromAddress, byte[] return response; } - /** - * constructor. - */ - public static HttpResponse sendCoin(String httpNode, byte[] fromAddress, byte[] toAddress, - Long amount, Integer permissionId, String[] managerKeys) { + /** constructor. */ + public static HttpResponse sendCoin( + String httpNode, + byte[] fromAddress, + byte[] toAddress, + Long amount, + Integer permissionId, + String[] managerKeys) { try { final String requestUrl = "http://" + httpNode + "/wallet/createtransaction"; JsonObject userBaseObj2 = new JsonObject(); @@ -273,8 +277,6 @@ public static HttpResponse sendCoin(String httpNode, byte[] fromAddress, byte[] signResponseContent = parseResponseContent(getSignWeightResponse); logger.info("-----------get Transaction Approved List-----------------"); printJsonContent(signResponseContent); - - } response = broadcastTransaction(httpNode, transactionSignString); } catch (Exception e) { @@ -285,11 +287,14 @@ public static HttpResponse sendCoin(String httpNode, byte[] fromAddress, byte[] return response; } - /** - * constructor. - */ - public static String sendCoin(String httpNode, byte[] fromAddress, byte[] toAddress, Long amount, - String notes, String fromKey) { + /** constructor. */ + public static String sendCoin( + String httpNode, + byte[] fromAddress, + byte[] toAddress, + Long amount, + String notes, + String fromKey) { try { final String requestUrl = "http://" + httpNode + "/wallet/createtransaction"; JsonObject userBaseObj2 = new JsonObject(); @@ -310,11 +315,9 @@ public static String sendCoin(String httpNode, byte[] fromAddress, byte[] toAddr return responseContent.getString("txID"); } - /** - * constructor. - */ - public static String sendCoinGetTxid(String httpNode, byte[] fromAddress, byte[] toAddress, - Long amount, String fromKey) { + /** constructor. */ + public static String sendCoinGetTxid( + String httpNode, byte[] fromAddress, byte[] toAddress, Long amount, String fromKey) { try { final String requestUrl = "http://" + httpNode + "/wallet/createtransaction"; JsonObject userBaseObj2 = new JsonObject(); @@ -337,11 +340,9 @@ public static String sendCoinGetTxid(String httpNode, byte[] fromAddress, byte[] return responseContent.getString("txID"); } - /** - * constructor. - */ - public static HttpResponse createProposal(String httpNode, byte[] ownerAddress, Long proposalKey, - Long proposalValue, String fromKey) { + /** constructor. */ + public static HttpResponse createProposal( + String httpNode, byte[] ownerAddress, Long proposalKey, Long proposalValue, String fromKey) { try { final String requestUrl = "http://" + httpNode + "/wallet/proposalcreate"; JsonObject userBaseObj2 = new JsonObject(); @@ -365,11 +366,13 @@ public static HttpResponse createProposal(String httpNode, byte[] ownerAddress, return response; } - /** - * constructor. - */ - public static HttpResponse approvalProposal(String httpNode, byte[] ownerAddress, - Integer proposalId, Boolean isAddApproval, String fromKey) { + /** constructor. */ + public static HttpResponse approvalProposal( + String httpNode, + byte[] ownerAddress, + Integer proposalId, + Boolean isAddApproval, + String fromKey) { try { final String requestUrl = "http://" + httpNode + "/wallet/proposalapprove"; JsonObject userBaseObj2 = new JsonObject(); @@ -390,11 +393,9 @@ public static HttpResponse approvalProposal(String httpNode, byte[] ownerAddress return response; } - /** - * constructor. - */ - public static HttpResponse deleteProposal(String httpNode, byte[] ownerAddress, - Integer proposalId, String fromKey) { + /** constructor. */ + public static HttpResponse deleteProposal( + String httpNode, byte[] ownerAddress, Integer proposalId, String fromKey) { try { final String requestUrl = "http://" + httpNode + "/wallet/proposaldelete"; JsonObject userBaseObj2 = new JsonObject(); @@ -414,10 +415,7 @@ public static HttpResponse deleteProposal(String httpNode, byte[] ownerAddress, return response; } - - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getEnergyPric(String httpNode) { try { final String requestUrl = "http://" + httpNode + "/wallet/getenergyprices"; @@ -429,10 +427,8 @@ public static HttpResponse getEnergyPric(String httpNode) { } return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getChainParameters(String httpNode) { try { final String requestUrl = "http://" + httpNode + "/wallet/getchainparameters"; @@ -445,17 +441,20 @@ public static HttpResponse getChainParameters(String httpNode) { return response; } - /** - * constructor. - */ - public static HttpResponse accountPermissionUpdate(String httpNode, byte[] ownerAddress, - JsonObject ownerObject, JsonObject witnessObject, JsonObject activesObject, String fromKey) { + /** constructor. */ + public static HttpResponse accountPermissionUpdate( + String httpNode, + byte[] ownerAddress, + JsonObject ownerObject, + JsonObject witnessObject, + JsonObject activesObject, + String fromKey) { try { final String requestUrl = "http://" + httpNode + "/wallet/accountpermissionupdate"; JsonObject userBaseObj2 = new JsonObject(); userBaseObj2.addProperty("owner_address", ByteArray.toHexString(ownerAddress)); userBaseObj2.add("owner", ownerObject); - //userBaseObj2.add("witness", witnessObject); + // userBaseObj2.add("witness", witnessObject); userBaseObj2.add("actives", activesObject); logger.info(userBaseObj2.toString()); response = createConnect(requestUrl, userBaseObj2); @@ -473,12 +472,14 @@ public static HttpResponse accountPermissionUpdate(String httpNode, byte[] owner return response; } - - /** - * constructor. - */ - public static HttpResponse exchangeCreate(String httpNode, byte[] ownerAddress, - String firstTokenId, Long firstTokenBalance, String secondTokenId, Long secondTokenBalance, + /** constructor. */ + public static HttpResponse exchangeCreate( + String httpNode, + byte[] ownerAddress, + String firstTokenId, + Long firstTokenBalance, + String secondTokenId, + Long secondTokenBalance, String fromKey) { try { final String requestUrl = "http://" + httpNode + "/wallet/exchangecreate"; @@ -500,11 +501,14 @@ public static HttpResponse exchangeCreate(String httpNode, byte[] ownerAddress, return response; } - /** - * constructor. - */ - public static HttpResponse exchangeInject(String httpNode, byte[] ownerAddress, - Integer exchangeId, String tokenId, Long quant, String fromKey) { + /** constructor. */ + public static HttpResponse exchangeInject( + String httpNode, + byte[] ownerAddress, + Integer exchangeId, + String tokenId, + Long quant, + String fromKey) { try { final String requestUrl = "http://" + httpNode + "/wallet/exchangeinject"; JsonObject userBaseObj2 = new JsonObject(); @@ -524,11 +528,14 @@ public static HttpResponse exchangeInject(String httpNode, byte[] ownerAddress, return response; } - /** - * constructor. - */ - public static HttpResponse exchangeWithdraw(String httpNode, byte[] ownerAddress, - Integer exchangeId, String tokenId, Long quant, String fromKey) { + /** constructor. */ + public static HttpResponse exchangeWithdraw( + String httpNode, + byte[] ownerAddress, + Integer exchangeId, + String tokenId, + Long quant, + String fromKey) { try { final String requestUrl = "http://" + httpNode + "/wallet/exchangewithdraw"; JsonObject userBaseObj2 = new JsonObject(); @@ -548,11 +555,15 @@ public static HttpResponse exchangeWithdraw(String httpNode, byte[] ownerAddress return response; } - /** - * constructor. - */ - public static HttpResponse exchangeTransaction(String httpNode, byte[] ownerAddress, - Integer exchangeId, String tokenId, Long quant, Long expected, String fromKey) { + /** constructor. */ + public static HttpResponse exchangeTransaction( + String httpNode, + byte[] ownerAddress, + Integer exchangeId, + String tokenId, + Long quant, + Long expected, + String fromKey) { try { final String requestUrl = "http://" + httpNode + "/wallet/exchangetransaction"; JsonObject userBaseObj2 = new JsonObject(); @@ -573,14 +584,24 @@ public static HttpResponse exchangeTransaction(String httpNode, byte[] ownerAddr return response; } - - /** - * constructor. - */ - public static HttpResponse assetIssue(String httpNode, byte[] ownerAddress, String name, - String abbr, Long totalSupply, Integer trxNum, Integer num, Long startTime, Long endTime, - Integer voteScore, Integer precision, String description, String url, Long freeAssetNetLimit, - Long publicFreeAssetNetLimit, String fromKey) { + /** constructor. */ + public static HttpResponse assetIssue( + String httpNode, + byte[] ownerAddress, + String name, + String abbr, + Long totalSupply, + Integer trxNum, + Integer num, + Long startTime, + Long endTime, + Integer voteScore, + Integer precision, + String description, + String url, + Long freeAssetNetLimit, + Long publicFreeAssetNetLimit, + String fromKey) { try { final String requestUrl = "http://" + httpNode + "/wallet/createassetissue"; JsonObject userBaseObj2 = new JsonObject(); @@ -610,11 +631,14 @@ public static HttpResponse assetIssue(String httpNode, byte[] ownerAddress, Stri return response; } - /** - * constructor. - */ - public static HttpResponse transferAsset(String httpNode, byte[] ownerAddress, byte[] toAddress, - String assetIssueById, Long amount, String fromKey) { + /** constructor. */ + public static HttpResponse transferAsset( + String httpNode, + byte[] ownerAddress, + byte[] toAddress, + String assetIssueById, + Long amount, + String fromKey) { try { final String requestUrl = "http://" + httpNode + "/wallet/transferasset"; JsonObject userBaseObj2 = new JsonObject(); @@ -634,17 +658,25 @@ public static HttpResponse transferAsset(String httpNode, byte[] ownerAddress, b return response; } - /** - * constructor. - */ - public static HttpResponse deployContract(String httpNode, String name, String abi, - String bytecode, Long bandwidthLimit, Long feeLimit, Integer consumeUserResourcePercent, - Long originEnergyLimit, Long callValue, Integer tokenId, Long tokenValue, byte[] ownerAddress, + /** constructor. */ + public static HttpResponse deployContract( + String httpNode, + String name, + String abi, + String bytecode, + Long bandwidthLimit, + Long feeLimit, + Integer consumeUserResourcePercent, + Long originEnergyLimit, + Long callValue, + Integer tokenId, + Long tokenValue, + byte[] ownerAddress, String fromKey) { try { final String requestUrl = "http://" + httpNode + "/wallet/deploycontract"; JsonObject userBaseObj2 = new JsonObject(); - //userBaseObj2.addProperty("name", str2hex(name)); + // userBaseObj2.addProperty("name", str2hex(name)); userBaseObj2.addProperty("name", name); userBaseObj2.addProperty("abi", abi); userBaseObj2.addProperty("bytecode", bytecode); @@ -670,17 +702,25 @@ public static HttpResponse deployContract(String httpNode, String name, String a return response; } - /** - * constructor. - */ - public static String deployContractGetTxid(String httpNode, String name, String abi, - String bytecode, Long bandwidthLimit, Long feeLimit, Integer consumeUserResourcePercent, - Long originEnergyLimit, Long callValue, Integer tokenId, Long tokenValue, byte[] ownerAddress, + /** constructor. */ + public static String deployContractGetTxid( + String httpNode, + String name, + String abi, + String bytecode, + Long bandwidthLimit, + Long feeLimit, + Integer consumeUserResourcePercent, + Long originEnergyLimit, + Long callValue, + Integer tokenId, + Long tokenValue, + byte[] ownerAddress, String fromKey) { try { final String requestUrl = "http://" + httpNode + "/wallet/deploycontract"; JsonObject userBaseObj2 = new JsonObject(); - //userBaseObj2.addProperty("name", str2hex(name)); + // userBaseObj2.addProperty("name", str2hex(name)); userBaseObj2.addProperty("name", name); userBaseObj2.addProperty("abi", abi); userBaseObj2.addProperty("bytecode", bytecode); @@ -709,13 +749,21 @@ public static String deployContractGetTxid(String httpNode, String name, String return responseContent.getString("txID"); } - /** - * constructor. - */ - public static HttpResponse deployContractGetTxidWithTooBigLong(String httpNode, String name, - String abi, String bytecode, Long bandwidthLimit, Long feeLimit, - Integer consumeUserResourcePercent, Long originEnergyLimit, Long callValue, Integer tokenId, - Long tokenValue, byte[] ownerAddress, String fromKey) { + /** constructor. */ + public static HttpResponse deployContractGetTxidWithTooBigLong( + String httpNode, + String name, + String abi, + String bytecode, + Long bandwidthLimit, + Long feeLimit, + Integer consumeUserResourcePercent, + Long originEnergyLimit, + Long callValue, + Integer tokenId, + Long tokenValue, + byte[] ownerAddress, + String fromKey) { try { final String requestUrl = "http://" + httpNode + "/wallet/deploycontract"; @@ -748,13 +796,18 @@ public static HttpResponse deployContractGetTxidWithTooBigLong(String httpNode, return response; } - - /** - * constructor. - */ - public static String triggerContractGetTxid(String httpNode, byte[] ownerAddress, - String contractAddress, String functionSelector, String parameter, Long feeLimit, - Long callValue, Integer tokenId, Long tokenValue, String fromKey) { + /** constructor. */ + public static String triggerContractGetTxid( + String httpNode, + byte[] ownerAddress, + String contractAddress, + String functionSelector, + String parameter, + Long feeLimit, + Long callValue, + Integer tokenId, + Long tokenValue, + String fromKey) { try { final String requestUrl = "http://" + httpNode + "/wallet/triggersmartcontract"; JsonObject userBaseObj2 = new JsonObject(); @@ -770,8 +823,9 @@ public static String triggerContractGetTxid(String httpNode, byte[] ownerAddress transactionString = EntityUtils.toString(response.getEntity()); logger.info(transactionString); - transactionSignString = gettransactionsign(httpNode, - parseStringContent(transactionString).getString("transaction"), fromKey); + transactionSignString = + gettransactionsign( + httpNode, parseStringContent(transactionString).getString("transaction"), fromKey); logger.info(transactionSignString); response = broadcastTransaction(httpNode, transactionSignString); } catch (Exception e) { @@ -783,27 +837,45 @@ public static String triggerContractGetTxid(String httpNode, byte[] ownerAddress return responseContent.getString("txID"); } - - /** - * constructor. - */ - public static String triggerContractGetTxidWithVisibleTrue(String httpNode, String ownerAddress, - String contractAddress, String functionSelector, String parameter, Long feeLimit, - Long callValue, Integer tokenId, Long tokenValue, String fromKey) { - return triggerContractGetTxidWithVisibleTrue(httpNode, "", ownerAddress, - contractAddress, functionSelector, parameter, feeLimit, callValue, tokenId, tokenValue, + /** constructor. */ + public static String triggerContractGetTxidWithVisibleTrue( + String httpNode, + String ownerAddress, + String contractAddress, + String functionSelector, + String parameter, + Long feeLimit, + Long callValue, + Integer tokenId, + Long tokenValue, + String fromKey) { + return triggerContractGetTxidWithVisibleTrue( + httpNode, + "", + ownerAddress, + contractAddress, + functionSelector, + parameter, + feeLimit, + callValue, + tokenId, + tokenValue, fromKey); - } - /** - * constructor. - */ - public static String triggerContractGetTxidWithVisibleTrue(String httpNode, + /** constructor. */ + public static String triggerContractGetTxidWithVisibleTrue( + String httpNode, String anotherHttpNode, String ownerAddress, - String contractAddress, String functionSelector, String parameter, Long feeLimit, - Long callValue, Integer tokenId, Long tokenValue, String fromKey) { + String contractAddress, + String functionSelector, + String parameter, + Long feeLimit, + Long callValue, + Integer tokenId, + Long tokenValue, + String fromKey) { try { final String requestUrl = "http://" + httpNode + "/wallet/triggersmartcontract"; JsonObject userBaseObj2 = new JsonObject(); @@ -820,8 +892,9 @@ public static String triggerContractGetTxidWithVisibleTrue(String httpNode, transactionString = EntityUtils.toString(response.getEntity()); logger.info(transactionString); - transactionSignString = gettransactionsign(httpNode, - parseStringContent(transactionString).getString("transaction"), fromKey); + transactionSignString = + gettransactionsign( + httpNode, parseStringContent(transactionString).getString("transaction"), fromKey); logger.info(transactionSignString); response = broadcastTransaction(httpNode, transactionSignString); if (!anotherHttpNode.isEmpty()) { @@ -836,12 +909,14 @@ public static String triggerContractGetTxidWithVisibleTrue(String httpNode, return responseContent.getString("txID"); } - - /** - * constructor. - */ - public static HttpResponse triggerConstantContract(String httpNode, byte[] ownerAddress, - String contractAddress, String functionSelector, String parameter, Long feeLimit, + /** constructor. */ + public static HttpResponse triggerConstantContract( + String httpNode, + byte[] ownerAddress, + String contractAddress, + String functionSelector, + String parameter, + Long feeLimit, String fromKey) { try { final String requestUrl = "http://" + httpNode + "/wallet/triggerconstantcontract"; @@ -862,11 +937,13 @@ public static HttpResponse triggerConstantContract(String httpNode, byte[] owner return response; } - /** - * constructor. - */ - public static HttpResponse triggerConstantContract(String httpNode, byte[] ownerAddress, - String contractAddress, String functionSelector, String parameter) { + /** constructor. */ + public static HttpResponse triggerConstantContract( + String httpNode, + byte[] ownerAddress, + String contractAddress, + String functionSelector, + String parameter) { try { final String requestUrl = "http://" + httpNode + "/wallet/triggerconstantcontract"; JsonObject userBaseObj2 = new JsonObject(); @@ -883,12 +960,13 @@ public static HttpResponse triggerConstantContract(String httpNode, byte[] owner } } - /** - * constructor. - */ - public static HttpResponse triggerConstantContractFromSolidity(String httSoliditypNode, + /** constructor. */ + public static HttpResponse triggerConstantContractFromSolidity( + String httSoliditypNode, byte[] ownerAddress, - String contractAddress, String functionSelector, String parameter) { + String contractAddress, + String functionSelector, + String parameter) { try { final String requestUrl = "http://" + httSoliditypNode + "/walletsolidity/triggerconstantcontract"; @@ -906,12 +984,13 @@ public static HttpResponse triggerConstantContractFromSolidity(String httSolidit } } - /** - * constructor. - */ - public static HttpResponse triggerConstantContractFromPbft(String httpPbftNode, + /** constructor. */ + public static HttpResponse triggerConstantContractFromPbft( + String httpPbftNode, byte[] ownerAddress, - String contractAddress, String functionSelector, String parameter) { + String contractAddress, + String functionSelector, + String parameter) { try { final String requestUrl = "http://" + httpPbftNode + "/walletpbft/triggerconstantcontract"; JsonObject userBaseObj2 = new JsonObject(); @@ -928,11 +1007,14 @@ public static HttpResponse triggerConstantContractFromPbft(String httpPbftNode, } } - /** - * constructor. - */ - public static HttpResponse participateAssetIssue(String httpNode, byte[] toAddress, - byte[] ownerAddress, String assetIssueById, Long amount, String fromKey) { + /** constructor. */ + public static HttpResponse participateAssetIssue( + String httpNode, + byte[] toAddress, + byte[] ownerAddress, + String assetIssueById, + Long amount, + String fromKey) { try { final String requestUrl = "http://" + httpNode + "/wallet/participateassetissue"; JsonObject userBaseObj2 = new JsonObject(); @@ -954,11 +1036,15 @@ public static HttpResponse participateAssetIssue(String httpNode, byte[] toAddre return response; } - /** - * constructor. - */ - public static HttpResponse updateAssetIssue(String httpNode, byte[] ownerAddress, - String description, String url, Long newLimit, Long newPublicLimit, String fromKey) { + /** constructor. */ + public static HttpResponse updateAssetIssue( + String httpNode, + byte[] ownerAddress, + String description, + String url, + Long newLimit, + Long newPublicLimit, + String fromKey) { try { final String requestUrl = "http://" + httpNode + "/wallet/updateasset"; JsonObject userBaseObj2 = new JsonObject(); @@ -981,34 +1067,38 @@ public static HttpResponse updateAssetIssue(String httpNode, byte[] ownerAddress return response; } - - /** - * constructor. - */ + /** constructor. */ public static Boolean verificationResult(HttpResponse response) { if (response.getStatusLine().getStatusCode() != 200) { return false; } Assert.assertEquals(response.getStatusLine().getStatusCode(), 200); responseContent = HttpMethed.parseResponseContent(response); - //HttpMethed.printJsonContent(responseContent); + // HttpMethed.printJsonContent(responseContent); return Boolean.valueOf(responseContent.getString("result")).booleanValue(); } - /** - * constructor. - */ - public static HttpResponse freezeBalance(String httpNode, byte[] ownerAddress, Long frozenBalance, - Integer frozenDuration, Integer resourceCode, String fromKey) { - return freezeBalance(httpNode, ownerAddress, frozenBalance, frozenDuration, resourceCode, null, - fromKey); + /** constructor. */ + public static HttpResponse freezeBalance( + String httpNode, + byte[] ownerAddress, + Long frozenBalance, + Integer frozenDuration, + Integer resourceCode, + String fromKey) { + return freezeBalance( + httpNode, ownerAddress, frozenBalance, frozenDuration, resourceCode, null, fromKey); } - /** - * constructor. - */ - public static HttpResponse freezeBalance(String httpNode, byte[] ownerAddress, Long frozenBalance, - Integer frozenDuration, Integer resourceCode, byte[] receiverAddress, String fromKey) { + /** constructor. */ + public static HttpResponse freezeBalance( + String httpNode, + byte[] ownerAddress, + Long frozenBalance, + Integer frozenDuration, + Integer resourceCode, + byte[] receiverAddress, + String fromKey) { try { final String requestUrl = "http://" + httpNode + "/wallet/freezebalance"; JsonObject userBaseObj2 = new JsonObject(); @@ -1039,19 +1129,19 @@ public static HttpResponse freezeBalance(String httpNode, byte[] ownerAddress, L return response; } - /** - * constructor. - */ - public static HttpResponse unFreezeBalance(String httpNode, byte[] ownerAddress, - Integer resourceCode, String fromKey) { + /** constructor. */ + public static HttpResponse unFreezeBalance( + String httpNode, byte[] ownerAddress, Integer resourceCode, String fromKey) { return unFreezeBalance(httpNode, ownerAddress, resourceCode, null, fromKey); } - /** - * constructor. - */ - public static HttpResponse unFreezeBalance(String httpNode, byte[] ownerAddress, - Integer resourceCode, byte[] receiverAddress, String fromKey) { + /** constructor. */ + public static HttpResponse unFreezeBalance( + String httpNode, + byte[] ownerAddress, + Integer resourceCode, + byte[] receiverAddress, + String fromKey) { try { final String requestUrl = "http://" + httpNode + "/wallet/unfreezebalance"; JsonObject userBaseObj2 = new JsonObject(); @@ -1080,11 +1170,9 @@ public static HttpResponse unFreezeBalance(String httpNode, byte[] ownerAddress, return response; } - /** - * constructor. - */ - public static String gettransactionsign(String httpNode, String transactionString, - String privateKey) { + /** constructor. */ + public static String gettransactionsign( + String httpNode, String transactionString, String privateKey) { try { String requestUrl = "http://" + httpNode + "/wallet/gettransactionsign"; JsonObject userBaseObj2 = new JsonObject(); @@ -1100,13 +1188,12 @@ public static String gettransactionsign(String httpNode, String transactionStrin return transactionSignString; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse broadcastTransaction(String httpNode, String transactionSignString) { try { String requestUrl = "http://" + httpNode + "/wallet/broadcasttransaction"; - httpClient.getParams() + httpClient + .getParams() .setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, connectionTimeout); httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, soTimeout); httppost = new HttpPost(requestUrl); @@ -1128,8 +1215,9 @@ public static HttpResponse broadcastTransaction(String httpNode, String transact responseContent = HttpMethed.parseResponseContent(response); Integer times = 0; - while (times++ <= 10 && responseContent.getString("code") != null && responseContent - .getString("code").equalsIgnoreCase("SERVER_BUSY")) { + while (times++ <= 10 + && responseContent.getString("code") != null + && responseContent.getString("code").equalsIgnoreCase("SERVER_BUSY")) { logger.info("retry num are " + times); try { response = httpClient.execute(httppost); @@ -1149,9 +1237,7 @@ public static HttpResponse broadcastTransaction(String httpNode, String transact return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse broadcasthex(String httpNode, String transactionHex) { try { String requestUrl = "http://" + httpNode + "/wallet/broadcasthex"; @@ -1166,10 +1252,7 @@ public static HttpResponse broadcasthex(String httpNode, String transactionHex) return response; } - - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getAccountById(String httpNode, String accountId, Boolean visable) { try { String requestUrl = "http://" + httpNode + "/wallet/getaccountbyid"; @@ -1185,11 +1268,9 @@ public static HttpResponse getAccountById(String httpNode, String accountId, Boo return response; } - /** - * constructor. - */ - public static HttpResponse getAccountByIdFromSolidity(String httpSolidityNode, String accountId, - Boolean visable) { + /** constructor. */ + public static HttpResponse getAccountByIdFromSolidity( + String httpSolidityNode, String accountId, Boolean visable) { try { String requestUrl = "http://" + httpSolidityNode + "/walletsolidity/getaccountbyid"; JsonObject userBaseObj2 = new JsonObject(); @@ -1204,11 +1285,9 @@ public static HttpResponse getAccountByIdFromSolidity(String httpSolidityNode, S return response; } - /** - * constructor. - */ - public static HttpResponse getAccountByIdFromPbft(String httpSolidityNode, String accountId, - Boolean visable) { + /** constructor. */ + public static HttpResponse getAccountByIdFromPbft( + String httpSolidityNode, String accountId, Boolean visable) { try { String requestUrl = "http://" + httpSolidityNode + "/walletpbft/getaccountbyid"; JsonObject userBaseObj2 = new JsonObject(); @@ -1223,9 +1302,7 @@ public static HttpResponse getAccountByIdFromPbft(String httpSolidityNode, Strin return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getAccount(String httpNode, byte[] queryAddress) { try { String requestUrl = "http://" + httpNode + "/wallet/getaccount"; @@ -1240,9 +1317,7 @@ public static HttpResponse getAccount(String httpNode, byte[] queryAddress) { return response; } - /** - * constructor. - */ + /** constructor. */ public static Long getAccountForResponse(String httpNode, byte[] queryAddress, Integer times) { try { String requestUrl = "http://" + httpNode + "/wallet/getaccount"; @@ -1257,10 +1332,7 @@ public static Long getAccountForResponse(String httpNode, byte[] queryAddress, I } } - - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getAccountFromSolidity(String httpSolidityNode, byte[] queryAddress) { try { String requestUrl = "http://" + httpSolidityNode + "/walletsolidity/getaccount"; @@ -1277,9 +1349,7 @@ public static HttpResponse getAccountFromSolidity(String httpSolidityNode, byte[ return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getAccountFromPbft(String httpSolidityNode, byte[] queryAddress) { try { String requestUrl = "http://" + httpSolidityNode + "/walletpbft/getaccount"; @@ -1293,9 +1363,7 @@ public static HttpResponse getAccountFromPbft(String httpSolidityNode, byte[] qu return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getContract(String httpNode, String contractAddress) { try { String requestUrl = "http://" + httpNode + "/wallet/getcontract"; @@ -1310,13 +1378,12 @@ public static HttpResponse getContract(String httpNode, String contractAddress) return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getSignWeight(String httpNode, String transactionSignString) { try { String requestUrl = "http://" + httpNode + "/wallet/getsignweight"; - httpClient.getParams() + httpClient + .getParams() .setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, connectionTimeout); httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, soTimeout); httppost = new HttpPost(requestUrl); @@ -1334,18 +1401,17 @@ public static HttpResponse getSignWeight(String httpNode, String transactionSign httppost.releaseConnection(); return null; } - //httppost.releaseConnection(); + // httppost.releaseConnection(); return response; } - /** - * constructor. - */ - public static HttpResponse getTransactionApprovedList(String httpNode, - String transactionSignString) { + /** constructor. */ + public static HttpResponse getTransactionApprovedList( + String httpNode, String transactionSignString) { try { String requestUrl = "http://" + httpNode + "/wallet/getapprovedlist"; - httpClient.getParams() + httpClient + .getParams() .setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, connectionTimeout); httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, soTimeout); httppost = new HttpPost(requestUrl); @@ -1363,14 +1429,11 @@ public static HttpResponse getTransactionApprovedList(String httpNode, httppost.releaseConnection(); return null; } - //httppost.releaseConnection(); + // httppost.releaseConnection(); return response; } - - /** - * constructor. - */ + /** constructor. */ public static HttpResponse listExchanges(String httpNode) { try { String requestUrl = "http://" + httpNode + "/wallet/listexchanges"; @@ -1383,9 +1446,7 @@ public static HttpResponse listExchanges(String httpNode) { return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse listExchangesFromSolidity(String httpSolidityNode) { try { String requestUrl = "http://" + httpSolidityNode + "/walletsolidity/listexchanges"; @@ -1398,10 +1459,7 @@ public static HttpResponse listExchangesFromSolidity(String httpSolidityNode) { return response; } - - /** - * constructor. - */ + /** constructor. */ public static HttpResponse listExchangesFromPbft(String httpSolidityNode) { try { String requestUrl = "http://" + httpSolidityNode + "/walletpbft/listexchanges"; @@ -1414,10 +1472,7 @@ public static HttpResponse listExchangesFromPbft(String httpSolidityNode) { return response; } - - /** - * constructor. - */ + /** constructor. */ public static HttpResponse listNodes(String httpNode) { try { String requestUrl = "http://" + httpNode + "/wallet/listnodes"; @@ -1430,10 +1485,7 @@ public static HttpResponse listNodes(String httpNode) { return response; } - - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getStatsInfo(String httpNode) { try { String requestUrl = "http://" + httpNode + "/monitor/getstatsinfo"; @@ -1446,9 +1498,7 @@ public static HttpResponse getStatsInfo(String httpNode) { return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getNextmaintenanceTime(String httpNode) { try { String requestUrl = "http://" + httpNode + "/wallet/getnextmaintenancetime"; @@ -1461,9 +1511,7 @@ public static HttpResponse getNextmaintenanceTime(String httpNode) { return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getChainParameter(String httpNode) { try { String requestUrl = "http://" + httpNode + "/wallet/getchainparameters"; @@ -1476,9 +1524,7 @@ public static HttpResponse getChainParameter(String httpNode) { return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getNodeInfo(String httpNode) { try { String requestUrl = "http://" + httpNode + "/wallet/getnodeinfo"; @@ -1491,9 +1537,7 @@ public static HttpResponse getNodeInfo(String httpNode) { return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse listwitnesses(String httpNode) { try { String requestUrl = "http://" + httpNode + "/wallet/listwitnesses"; @@ -1506,9 +1550,7 @@ public static HttpResponse listwitnesses(String httpNode) { return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse listwitnessesFromSolidity(String httpSolidityNode) { try { String requestUrl = "http://" + httpSolidityNode + "/walletsolidity/listwitnesses"; @@ -1521,9 +1563,7 @@ public static HttpResponse listwitnessesFromSolidity(String httpSolidityNode) { return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse listwitnessesFromPbft(String httpSolidityNode) { try { String requestUrl = "http://" + httpSolidityNode + "/walletpbft/listwitnesses"; @@ -1536,10 +1576,7 @@ public static HttpResponse listwitnessesFromPbft(String httpSolidityNode) { return response; } - - /** - * constructor. - */ + /** constructor. */ public static HttpResponse listProposals(String httpNode) { try { String requestUrl = "http://" + httpNode + "/wallet/listproposals"; @@ -1552,9 +1589,7 @@ public static HttpResponse listProposals(String httpNode) { return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getExchangeById(String httpNode, Integer exchangeId) { try { String requestUrl = "http://" + httpNode + "/wallet/getexchangebyid"; @@ -1569,11 +1604,9 @@ public static HttpResponse getExchangeById(String httpNode, Integer exchangeId) return response; } - /** - * constructor. - */ - public static HttpResponse getExchangeByIdFromSolidity(String httpSolidityNode, - Integer exchangeId) { + /** constructor. */ + public static HttpResponse getExchangeByIdFromSolidity( + String httpSolidityNode, Integer exchangeId) { try { String requestUrl = "http://" + httpSolidityNode + "/walletsolidity/getexchangebyid"; JsonObject userBaseObj2 = new JsonObject(); @@ -1587,9 +1620,7 @@ public static HttpResponse getExchangeByIdFromSolidity(String httpSolidityNode, return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getExchangeByIdFromPbft(String httpSolidityNode, Integer exchangeId) { try { String requestUrl = "http://" + httpSolidityNode + "/walletpbft/getexchangebyid"; @@ -1604,10 +1635,7 @@ public static HttpResponse getExchangeByIdFromPbft(String httpSolidityNode, Inte return response; } - - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getProposalById(String httpNode, Integer proposalId) { try { String requestUrl = "http://" + httpNode + "/wallet/getproposalbyid"; @@ -1622,9 +1650,7 @@ public static HttpResponse getProposalById(String httpNode, Integer proposalId) return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getAssetIssueListByName(String httpNode, String name) { try { String requestUrl = "http://" + httpNode + "/wallet/getassetissuelistbyname"; @@ -1639,11 +1665,9 @@ public static HttpResponse getAssetIssueListByName(String httpNode, String name) return response; } - /** - * constructor. - */ - public static HttpResponse getAssetIssueListByNameFromSolidity(String httpSolidityNode, - String name) { + /** constructor. */ + public static HttpResponse getAssetIssueListByNameFromSolidity( + String httpSolidityNode, String name) { try { String requestUrl = "http://" + httpSolidityNode + "/walletsolidity/getassetissuelistbyname"; JsonObject userBaseObj2 = new JsonObject(); @@ -1657,11 +1681,8 @@ public static HttpResponse getAssetIssueListByNameFromSolidity(String httpSolidi return response; } - /** - * constructor. - */ - public static HttpResponse getAssetIssueListByNameFromPbft(String httpPbftNode, - String name) { + /** constructor. */ + public static HttpResponse getAssetIssueListByNameFromPbft(String httpPbftNode, String name) { try { String requestUrl = "http://" + httpPbftNode + "/walletpbft/getassetissuelistbyname"; JsonObject userBaseObj2 = new JsonObject(); @@ -1675,9 +1696,7 @@ public static HttpResponse getAssetIssueListByNameFromPbft(String httpPbftNode, return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getAssetIssueById(String httpNode, String assetIssueId) { try { String requestUrl = "http://" + httpNode + "/wallet/getassetissuebyid"; @@ -1692,11 +1711,9 @@ public static HttpResponse getAssetIssueById(String httpNode, String assetIssueI return response; } - /** - * constructor. - */ - public static HttpResponse getAssetIssueByIdFromSolidity(String httpSolidityNode, - String assetIssueId) { + /** constructor. */ + public static HttpResponse getAssetIssueByIdFromSolidity( + String httpSolidityNode, String assetIssueId) { try { String requestUrl = "http://" + httpSolidityNode + "/walletsolidity/getassetissuebyid"; JsonObject userBaseObj2 = new JsonObject(); @@ -1710,11 +1727,9 @@ public static HttpResponse getAssetIssueByIdFromSolidity(String httpSolidityNode return response; } - /** - * constructor. - */ - public static HttpResponse getAssetIssueByIdFromPbft(String httpSolidityNode, - String assetIssueId) { + /** constructor. */ + public static HttpResponse getAssetIssueByIdFromPbft( + String httpSolidityNode, String assetIssueId) { try { String requestUrl = "http://" + httpSolidityNode + "/walletpbft/getassetissuebyid"; JsonObject userBaseObj2 = new JsonObject(); @@ -1728,10 +1743,7 @@ public static HttpResponse getAssetIssueByIdFromPbft(String httpSolidityNode, return response; } - - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getTransactionById(String httpNode, String txid) { try { String requestUrl = "http://" + httpNode + "/wallet/gettransactionbyid"; @@ -1746,9 +1758,7 @@ public static HttpResponse getTransactionById(String httpNode, String txid) { return response; } - /** - * constructor. - */ + /** constructor. */ public static Long getTransactionByIdForResponse(String httpNode, String txid, Integer times) { try { String requestUrl = "http://" + httpNode + "/wallet/gettransactionbyid"; @@ -1763,10 +1773,7 @@ public static Long getTransactionByIdForResponse(String httpNode, String txid, I } } - - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getTransactionByIdFromSolidity(String httpSolidityNode, String txid) { try { String requestUrl = "http://" + httpSolidityNode + "/walletsolidity/gettransactionbyid"; @@ -1781,9 +1788,7 @@ public static HttpResponse getTransactionByIdFromSolidity(String httpSolidityNod return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getTransactionByIdFromPbft(String httpSolidityNode, String txid) { try { String requestUrl = "http://" + httpSolidityNode + "/walletpbft/gettransactionbyid"; @@ -1798,17 +1803,12 @@ public static HttpResponse getTransactionByIdFromPbft(String httpSolidityNode, S return response; } - - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getTransactionInfoById(String httpNode, String txid) { return getTransactionInfoById(httpNode, txid, false); } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getTransactionInfoById(String httpNode, String txid, Boolean visible) { try { String requestUrl = "http://" + httpNode + "/wallet/gettransactioninfobyid"; @@ -1824,12 +1824,9 @@ public static HttpResponse getTransactionInfoById(String httpNode, String txid, return response; } - - /** - * constructor. - */ - public static HttpResponse getTransactionInfoByIdFromSolidity(String httpSolidityNode, - String txid) { + /** constructor. */ + public static HttpResponse getTransactionInfoByIdFromSolidity( + String httpSolidityNode, String txid) { try { String requestUrl = "http://" + httpSolidityNode + "/walletsolidity/gettransactioninfobyid"; JsonObject userBaseObj2 = new JsonObject(); @@ -1843,9 +1840,7 @@ public static HttpResponse getTransactionInfoByIdFromSolidity(String httpSolidit return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getTransactionInfoByIdFromPbft(String httpSolidityNode, String txid) { try { String requestUrl = "http://" + httpSolidityNode + "/walletpbft/gettransactioninfobyid"; @@ -1860,9 +1855,7 @@ public static HttpResponse getTransactionInfoByIdFromPbft(String httpSolidityNod return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getTransactionInfoByBlocknum(String httpNode, long blocknum) { try { String requestUrl = "http://" + httpNode + "/wallet/gettransactioninfobyblocknum"; @@ -1877,11 +1870,9 @@ public static HttpResponse getTransactionInfoByBlocknum(String httpNode, long bl return response; } - /** - * constructor. - */ - public static HttpResponse getTransactionInfoByBlocknumFromSolidity(String httpSolidityNode, - long blocknum) { + /** constructor. */ + public static HttpResponse getTransactionInfoByBlocknumFromSolidity( + String httpSolidityNode, long blocknum) { try { String requestUrl = "http://" + httpSolidityNode + "/walletsolidity/gettransactioninfobyblocknum"; @@ -1896,11 +1887,9 @@ public static HttpResponse getTransactionInfoByBlocknumFromSolidity(String httpS return response; } - /** - * constructor. - */ - public static HttpResponse getTransactionCountByBlocknumFromSolidity(String httpSolidityNode, - long blocknum) { + /** constructor. */ + public static HttpResponse getTransactionCountByBlocknumFromSolidity( + String httpSolidityNode, long blocknum) { try { String requestUrl = "http://" + httpSolidityNode + "/walletsolidity/gettransactioncountbyblocknum"; @@ -1915,11 +1904,9 @@ public static HttpResponse getTransactionCountByBlocknumFromSolidity(String http return response; } - /** - * constructor. - */ - public static HttpResponse getTransactionCountByBlocknumFromPbft(String httpSolidityNode, - long blocknum) { + /** constructor. */ + public static HttpResponse getTransactionCountByBlocknumFromPbft( + String httpSolidityNode, long blocknum) { try { String requestUrl = "http://" + httpSolidityNode + "/walletpbft/gettransactioncountbyblocknum"; @@ -1934,12 +1921,9 @@ public static HttpResponse getTransactionCountByBlocknumFromPbft(String httpSoli return response; } - - /** - * constructor. - */ - public static HttpResponse getTransactionsFromThisFromSolidity(String httpSolidityNode, - byte[] fromAddress, long offset, long limit) { + /** constructor. */ + public static HttpResponse getTransactionsFromThisFromSolidity( + String httpSolidityNode, byte[] fromAddress, long offset, long limit) { try { Map map1 = new HashMap(); Map map = new HashMap(); @@ -1959,11 +1943,9 @@ public static HttpResponse getTransactionsFromThisFromSolidity(String httpSolidi return response; } - /** - * constructor. - */ - public static HttpResponse getTransactionsToThisFromSolidity(String httpSolidityNode, - byte[] toAddress, long offset, long limit) { + /** constructor. */ + public static HttpResponse getTransactionsToThisFromSolidity( + String httpSolidityNode, byte[] toAddress, long offset, long limit) { try { Map map1 = new HashMap(); Map map = new HashMap(); @@ -1983,9 +1965,7 @@ public static HttpResponse getTransactionsToThisFromSolidity(String httpSolidity return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getAssetIssueByName(String httpNode, String name) { try { String requestUrl = "http://" + httpNode + "/wallet/getassetissuebyname"; @@ -2000,10 +1980,7 @@ public static HttpResponse getAssetIssueByName(String httpNode, String name) { return response; } - - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getAssetIssueByNameFromSolidity(String httpSolidityNode, String name) { try { String requestUrl = "http://" + httpSolidityNode + "/walletsolidity/getassetissuebyname"; @@ -2018,9 +1995,7 @@ public static HttpResponse getAssetIssueByNameFromSolidity(String httpSolidityNo return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getAssetIssueByNameFromPbft(String httpSolidityNode, String name) { try { String requestUrl = "http://" + httpSolidityNode + "/walletpbft/getassetissuebyname"; @@ -2035,10 +2010,7 @@ public static HttpResponse getAssetIssueByNameFromPbft(String httpSolidityNode, return response; } - - /** - * constructor. - */ + /** constructor. */ public static Long getBalance(String httpNode, byte[] queryAddress) { try { String requestUrl = "http://" + httpNode + "/wallet/getaccount"; @@ -2051,18 +2023,15 @@ public static Long getBalance(String httpNode, byte[] queryAddress) { return null; } responseContent = HttpMethed.parseResponseContent(response); - //HttpMethed.printJsonContent(responseContent); - //httppost.releaseConnection(); + // HttpMethed.printJsonContent(responseContent); + // httppost.releaseConnection(); if (!responseContent.containsKey("balance")) { return 0L; } return Long.parseLong(responseContent.get("balance").toString()); } - - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getAccountNet(String httpNode, byte[] queryAddress) { try { String requestUrl = "http://" + httpNode + "/wallet/getaccountnet"; @@ -2077,9 +2046,7 @@ public static HttpResponse getAccountNet(String httpNode, byte[] queryAddress) { return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getAccountReource(String httpNode, byte[] queryAddress) { try { String requestUrl = "http://" + httpNode + "/wallet/getaccountresource"; @@ -2094,11 +2061,9 @@ public static HttpResponse getAccountReource(String httpNode, byte[] queryAddres return response; } - /** - * constructor. - */ - public static HttpResponse getAccountBalance(String httpNode, - byte[] queryAddress, Integer blockNum, String blockHash) { + /** constructor. */ + public static HttpResponse getAccountBalance( + String httpNode, byte[] queryAddress, Integer blockNum, String blockHash) { try { final String requestUrl = "http://" + httpNode + "/wallet/getaccountbalance"; JsonObject addressObj = new JsonObject(); @@ -2120,9 +2085,7 @@ public static HttpResponse getAccountBalance(String httpNode, return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getBlockBalance(String httpNode, Integer blockNum, String blockHash) { try { final String requestUrl = "http://" + httpNode + "/wallet/getblockbalance"; @@ -2139,9 +2102,7 @@ public static HttpResponse getBlockBalance(String httpNode, Integer blockNum, St return response; } - /** - * constructor. - */ + /** constructor. */ public static Long getBurnTrx(String httpNode) { try { final String requestUrl = "http://" + httpNode + "/wallet/getburntrx"; @@ -2156,9 +2117,7 @@ public static Long getBurnTrx(String httpNode) { return responseContent.getLong("burnTrxAmount"); } - /** - * constructor. - */ + /** constructor. */ public static Long getBurnTrxFromSolidity(String httpNode) { try { final String requestUrl = "http://" + httpNode + "/walletsolidity/getburntrx"; @@ -2173,9 +2132,7 @@ public static Long getBurnTrxFromSolidity(String httpNode) { return responseContent.getLong("burnTrxAmount"); } - /** - * constructor. - */ + /** constructor. */ public static Long getBurnTrxFromPbft(String httpNode) { try { final String requestUrl = "http://" + httpNode + "/walletpbft/getburntrx"; @@ -2190,19 +2147,12 @@ public static Long getBurnTrxFromPbft(String httpNode) { return responseContent.getLong("burnTrxAmount"); } - - - - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getNowBlock(String httpNode) { return getNowBlock(httpNode, false); } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getNowBlock(String httpNode, Boolean visible) { try { String requestUrl = "http://" + httpNode + "/wallet/getnowblock"; @@ -2217,9 +2167,7 @@ public static HttpResponse getNowBlock(String httpNode, Boolean visible) { return response; } - /** - * constructor. - */ + /** constructor. */ public static Long getNowBlockNum(String httpNode) { try { String requestUrl = "http://" + httpNode + "/wallet/getnowblock"; @@ -2229,13 +2177,13 @@ public static Long getNowBlockNum(String httpNode) { httppost.releaseConnection(); return null; } - return parseResponseContent(response).getJSONObject("block_header").getJSONObject("raw_data") + return parseResponseContent(response) + .getJSONObject("block_header") + .getJSONObject("raw_data") .getLong("number"); } - /** - * constructor. - */ + /** constructor. */ public static Long getNowBlockNumOnSolidity(String httpNode) { try { String requestUrl = "http://" + httpNode + "/walletsolidity/getnowblock"; @@ -2245,14 +2193,13 @@ public static Long getNowBlockNumOnSolidity(String httpNode) { httppost.releaseConnection(); return null; } - return parseResponseContent(response).getJSONObject("block_header").getJSONObject("raw_data") + return parseResponseContent(response) + .getJSONObject("block_header") + .getJSONObject("raw_data") .getLong("number"); } - - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getNowBlockFromSolidity(String httpSolidityNode) { try { String requestUrl = "http://" + httpSolidityNode + "/walletsolidity/getnowblock"; @@ -2265,9 +2212,7 @@ public static HttpResponse getNowBlockFromSolidity(String httpSolidityNode) { return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getNowBlockFromPbft(String httpSolidityNode) { try { String requestUrl = "http://" + httpSolidityNode + "/walletpbft/getnowblock"; @@ -2280,10 +2225,7 @@ public static HttpResponse getNowBlockFromPbft(String httpSolidityNode) { return response; } - - /** - * constructor. - */ + /** constructor. */ public static void waitToProduceOneBlock(String httpNode) { response = HttpMethed.getNowBlock(httpNode); responseContent = HttpMethed.parseResponseContent(response); @@ -2295,8 +2237,8 @@ public static void waitToProduceOneBlock(String httpNode) { while (nextBlockNum <= currentBlockNum + 1 && times++ <= 10) { response = HttpMethed.getNowBlock(httpNode); responseContent = HttpMethed.parseResponseContent(response); - responseContent = HttpMethed - .parseStringContent(responseContent.get("block_header").toString()); + responseContent = + HttpMethed.parseStringContent(responseContent.get("block_header").toString()); responseContent = HttpMethed.parseStringContent(responseContent.get("raw_data").toString()); nextBlockNum = Integer.parseInt(responseContent.get("number").toString()); try { @@ -2307,9 +2249,7 @@ public static void waitToProduceOneBlock(String httpNode) { } } - /** - * constructor. - */ + /** constructor. */ public static void waitToProduceOneBlockFromSolidity(String httpNode, String httpSolidityNode) { response = HttpMethed.getNowBlock(httpNode); responseContent = HttpMethed.parseResponseContent(response); @@ -2318,11 +2258,12 @@ public static void waitToProduceOneBlockFromSolidity(String httpNode, String htt Integer currentBlockNum = Integer.parseInt(responseContent.get("number").toString()); Integer nextBlockNum = 0; Integer times = 0; - while (nextBlockNum <= currentBlockNum && times++ <= 3) { + while (nextBlockNum <= currentBlockNum + && times++ <= ((getWitnessNum() >= 27) ? 27 : getWitnessNum() + 1)) { response = HttpMethed.getNowBlockFromSolidity(httpSolidityNode); responseContent = HttpMethed.parseResponseContent(response); - responseContent = HttpMethed - .parseStringContent(responseContent.get("block_header").toString()); + responseContent = + HttpMethed.parseStringContent(responseContent.get("block_header").toString()); responseContent = HttpMethed.parseStringContent(responseContent.get("raw_data").toString()); nextBlockNum = Integer.parseInt(responseContent.get("number").toString()); try { @@ -2331,11 +2272,11 @@ public static void waitToProduceOneBlockFromSolidity(String httpNode, String htt e.printStackTrace(); } } + logger.info("currentBlockNum2:" + currentBlockNum); + logger.info("nextBlockNum2:" + nextBlockNum); } - /** - * constructor. - */ + /** constructor. */ public static void waitToProduceOneBlockFromPbft(String httpNode, String httpSolidityNode) { response = HttpMethed.getNowBlock(httpNode); responseContent = HttpMethed.parseResponseContent(response); @@ -2347,8 +2288,8 @@ public static void waitToProduceOneBlockFromPbft(String httpNode, String httpSol while (nextBlockNum <= currentBlockNum && times++ <= 3) { response = HttpMethed.getNowBlockFromPbft(httpSolidityNode); responseContent = HttpMethed.parseResponseContent(response); - responseContent = HttpMethed - .parseStringContent(responseContent.get("block_header").toString()); + responseContent = + HttpMethed.parseStringContent(responseContent.get("block_header").toString()); responseContent = HttpMethed.parseStringContent(responseContent.get("raw_data").toString()); nextBlockNum = Integer.parseInt(responseContent.get("number").toString()); try { @@ -2359,17 +2300,12 @@ public static void waitToProduceOneBlockFromPbft(String httpNode, String httpSol } } - - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getBlockByNum(String httpNode, Integer blockNUm) { return getBlockByNum(httpNode, blockNUm, false); } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getBlockByNum(String httpNode, Integer blockNUm, Boolean visible) { try { String requestUrl = "http://" + httpNode + "/wallet/getblockbynum"; @@ -2385,9 +2321,7 @@ public static HttpResponse getBlockByNum(String httpNode, Integer blockNUm, Bool return response; } - /** - * constructor. - */ + /** constructor. */ public static Long getBlockByNumForResponse(String httpNode, Integer blockNUm, Integer times) { try { String requestUrl = "http://" + httpNode + "/wallet/getblockbynum"; @@ -2402,10 +2336,7 @@ public static Long getBlockByNumForResponse(String httpNode, Integer blockNUm, I } } - - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getBlockByNumFromSolidity(String httpSolidityNode, Integer blockNum) { try { String requestUrl = "http://" + httpSolidityNode + "/walletsolidity/getblockbynum"; @@ -2420,9 +2351,7 @@ public static HttpResponse getBlockByNumFromSolidity(String httpSolidityNode, In return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getBlockByNumFromPbft(String httpSolidityNode, Integer blockNum) { try { String requestUrl = "http://" + httpSolidityNode + "/walletpbft/getblockbynum"; @@ -2437,12 +2366,9 @@ public static HttpResponse getBlockByNumFromPbft(String httpSolidityNode, Intege return response; } - - /** - * constructor. - */ - public static HttpResponse getBlockByLimitNext(String httpNode, Integer startNum, - Integer endNum) { + /** constructor. */ + public static HttpResponse getBlockByLimitNext( + String httpNode, Integer startNum, Integer endNum) { try { String requestUrl = "http://" + httpNode + "/wallet/getblockbylimitnext"; JsonObject userBaseObj2 = new JsonObject(); @@ -2457,11 +2383,9 @@ public static HttpResponse getBlockByLimitNext(String httpNode, Integer startNum return response; } - /** - * constructor. - */ - public static HttpResponse getBlockByLimitNextFromSolidity(String httpNode, Integer startNum, - Integer endNum) { + /** constructor. */ + public static HttpResponse getBlockByLimitNextFromSolidity( + String httpNode, Integer startNum, Integer endNum) { try { String requestUrl = "http://" + httpNode + "/walletsolidity/getblockbylimitnext"; JsonObject userBaseObj2 = new JsonObject(); @@ -2476,11 +2400,9 @@ public static HttpResponse getBlockByLimitNextFromSolidity(String httpNode, Inte return response; } - /** - * constructor. - */ - public static HttpResponse getBlockByLimitNextFromPbft(String httpNode, Integer startNum, - Integer endNum) { + /** constructor. */ + public static HttpResponse getBlockByLimitNextFromPbft( + String httpNode, Integer startNum, Integer endNum) { try { String requestUrl = "http://" + httpNode + "/walletpbft/getblockbylimitnext"; JsonObject userBaseObj2 = new JsonObject(); @@ -2495,10 +2417,7 @@ public static HttpResponse getBlockByLimitNextFromPbft(String httpNode, Integer return response; } - - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getBlockByLastNum(String httpNode, Integer num) { try { String requestUrl = "http://" + httpNode + "/wallet/getblockbylatestnum"; @@ -2513,9 +2432,7 @@ public static HttpResponse getBlockByLastNum(String httpNode, Integer num) { return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getBlockByLastNum2(String httpNode, Integer num) { try { String requestUrl = "http://" + httpNode + "/walletsolidity/getblockbylatestnum2"; @@ -2530,10 +2447,7 @@ public static HttpResponse getBlockByLastNum2(String httpNode, Integer num) { return response; } - - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getBlockByLastNumFromSolidity(String httpNode, Integer num) { try { String requestUrl = "http://" + httpNode + "/walletsolidity/getblockbylatestnum"; @@ -2548,9 +2462,7 @@ public static HttpResponse getBlockByLastNumFromSolidity(String httpNode, Intege return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getBlockByLastNumFromPbft(String httpNode, Integer num) { try { String requestUrl = "http://" + httpNode + "/walletpbft/getblockbylatestnum"; @@ -2563,10 +2475,7 @@ public static HttpResponse getBlockByLastNumFromPbft(String httpNode, Integer nu return response; } - - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getBlockById(String httpNode, String blockId) { try { String requestUrl = "http://" + httpNode + "/wallet/getblockbyid"; @@ -2581,9 +2490,7 @@ public static HttpResponse getBlockById(String httpNode, String blockId) { return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getBlockByIdFromSolidity(String httpNode, String blockId) { try { String requestUrl = "http://" + httpNode + "/walletsolidity/getblockbyid"; @@ -2598,9 +2505,7 @@ public static HttpResponse getBlockByIdFromSolidity(String httpNode, String bloc return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getBlockByIdFromPbft(String httpNode, String blockId) { try { String requestUrl = "http://" + httpNode + "/walletpbft/getblockbyid"; @@ -2615,12 +2520,9 @@ public static HttpResponse getBlockByIdFromPbft(String httpNode, String blockId) return response; } - - /** - * constructor. - */ - public static HttpResponse getDelegatedResource(String httpNode, byte[] fromAddress, - byte[] toAddress) { + /** constructor. */ + public static HttpResponse getDelegatedResource( + String httpNode, byte[] fromAddress, byte[] toAddress) { try { String requestUrl = "http://" + httpNode + "/wallet/getdelegatedresource"; JsonObject userBaseObj2 = new JsonObject(); @@ -2635,11 +2537,9 @@ public static HttpResponse getDelegatedResource(String httpNode, byte[] fromAddr return response; } - /** - * constructor. - */ - public static HttpResponse getDelegatedResourceFromSolidity(String httpSolidityNode, - byte[] fromAddress, byte[] toAddress) { + /** constructor. */ + public static HttpResponse getDelegatedResourceFromSolidity( + String httpSolidityNode, byte[] fromAddress, byte[] toAddress) { try { String requestUrl = "http://" + httpSolidityNode + "/walletsolidity/getdelegatedresource"; JsonObject userBaseObj2 = new JsonObject(); @@ -2654,11 +2554,9 @@ public static HttpResponse getDelegatedResourceFromSolidity(String httpSolidityN return response; } - /** - * constructor. - */ - public static HttpResponse getDelegatedResourceFromPbft(String httpSolidityNode, - byte[] fromAddress, byte[] toAddress) { + /** constructor. */ + public static HttpResponse getDelegatedResourceFromPbft( + String httpSolidityNode, byte[] fromAddress, byte[] toAddress) { try { String requestUrl = "http://" + httpSolidityNode + "/walletpbft/getdelegatedresource"; JsonObject userBaseObj2 = new JsonObject(); @@ -2673,12 +2571,9 @@ public static HttpResponse getDelegatedResourceFromPbft(String httpSolidityNode, return response; } - - /** - * constructor. - */ - public static HttpResponse getDelegatedResourceAccountIndex(String httpNode, - byte[] queryAddress) { + /** constructor. */ + public static HttpResponse getDelegatedResourceAccountIndex( + String httpNode, byte[] queryAddress) { try { String requestUrl = "http://" + httpNode + "/wallet/getdelegatedresourceaccountindex"; JsonObject userBaseObj2 = new JsonObject(); @@ -2692,11 +2587,9 @@ public static HttpResponse getDelegatedResourceAccountIndex(String httpNode, return response; } - /** - * constructor. - */ - public static HttpResponse getDelegatedResourceAccountIndexFromSolidity(String httpSolidityNode, - byte[] queryAddress) { + /** constructor. */ + public static HttpResponse getDelegatedResourceAccountIndexFromSolidity( + String httpSolidityNode, byte[] queryAddress) { try { String requestUrl = "http://" + httpSolidityNode + "/walletsolidity/getdelegatedresourceaccountindex"; @@ -2711,11 +2604,9 @@ public static HttpResponse getDelegatedResourceAccountIndexFromSolidity(String h return response; } - /** - * constructor. - */ - public static HttpResponse getDelegatedResourceAccountIndexFromPbft(String httpSolidityNode, - byte[] queryAddress) { + /** constructor. */ + public static HttpResponse getDelegatedResourceAccountIndexFromPbft( + String httpSolidityNode, byte[] queryAddress) { try { String requestUrl = "http://" + httpSolidityNode + "/walletpbft/getdelegatedresourceaccountindex"; @@ -2730,20 +2621,16 @@ public static HttpResponse getDelegatedResourceAccountIndexFromPbft(String httpS return response; } - - /** - * constructor. - */ + /** constructor. */ public static HttpResponse createConnect(String url) { return createConnect(url, null); } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse createConnect(String url, JsonObject requestBody) { try { - httpClient.getParams() + httpClient + .getParams() .setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, connectionTimeout); httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, soTimeout); httppost = new HttpPost(url); @@ -2766,14 +2653,12 @@ public static HttpResponse createConnect(String url, JsonObject requestBody) { return response; } - - /** - * constructor. - */ + /** constructor. */ public static HttpResponse createConnectForGet(String url) { try { - httpClient.getParams() - .setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, connectionTimeout); + httpClient + .getParams() + .setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, connectionTimeout); httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, soTimeout); HttpGet httppost; httppost = new HttpGet(url); @@ -2790,12 +2675,11 @@ public static HttpResponse createConnectForGet(String url) { return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse createConnectForShieldTrc20(String url, JSONObject requestBody) { try { - httpClient.getParams() + httpClient + .getParams() .setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, connectionTimeout); httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, soTimeout); httppost = new HttpPost(url); @@ -2816,10 +2700,7 @@ public static HttpResponse createConnectForShieldTrc20(String url, JSONObject re return response; } - - /** - * constructor. - */ + /** constructor. */ public static Long createConnectForResponse(String url, JsonObject requestBody, Integer times) { try { @@ -2827,7 +2708,8 @@ public static Long createConnectForResponse(String url, JsonObject requestBody, Long end = 0L; Long duration = 0L; while (times-- > 0) { - httpClient.getParams() + httpClient + .getParams() .setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, connectionTimeout); httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, soTimeout); httppost = new HttpPost(url); @@ -2856,16 +2738,15 @@ public static Long createConnectForResponse(String url, JsonObject requestBody, } } - - /** - * constructor. - */ + /** constructor. */ public static HttpResponse createConnect1(String url, JSONObject requestBody) { try { - httpClient.getParams() + httpClient + .getParams() .setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, connectionTimeout); httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, soTimeout); - httpClient.getParams() + httpClient + .getParams() .setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, connectionTimeout * 10000); httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, soTimeout * 10000); httppost = new HttpPost(url); @@ -2886,10 +2767,7 @@ public static HttpResponse createConnect1(String url, JSONObject requestBody) { return response; } - - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getAssetissueList(String httpNode) { try { String requestUrl = "http://" + httpNode + "/wallet/getassetissuelist"; @@ -2902,11 +2780,9 @@ public static HttpResponse getAssetissueList(String httpNode) { return response; } - /** - * constructor. - */ - public static Long getAssetIssueValue(String httpNode, byte[] accountAddress, - String assetIssueId) { + /** constructor. */ + public static Long getAssetIssueValue( + String httpNode, byte[] accountAddress, String assetIssueId) { response = HttpMethed.getAccount(httpNode, accountAddress); responseContent = HttpMethed.parseResponseContent(response); JSONArray assetV2 = responseContent.getJSONArray("assetV2"); @@ -2923,9 +2799,7 @@ public static Long getAssetIssueValue(String httpNode, byte[] accountAddress, return 0L; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getAssetIssueListFromSolidity(String httpSolidityNode) { try { String requestUrl = "http://" + httpSolidityNode + "/walletsolidity/getassetissuelist"; @@ -2938,9 +2812,7 @@ public static HttpResponse getAssetIssueListFromSolidity(String httpSolidityNode return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getAssetIssueListFromPbft(String httpSolidityNode) { try { String requestUrl = "http://" + httpSolidityNode + "/walletpbft/getassetissuelist"; @@ -2953,12 +2825,9 @@ public static HttpResponse getAssetIssueListFromPbft(String httpSolidityNode) { return response; } - - /** - * constructor. - */ - public static HttpResponse getPaginatedAssetissueList(String httpNode, Integer offset, - Integer limit) { + /** constructor. */ + public static HttpResponse getPaginatedAssetissueList( + String httpNode, Integer offset, Integer limit) { try { final String requestUrl = "http://" + httpNode + "/wallet/getpaginatedassetissuelist"; JsonObject userBaseObj2 = new JsonObject(); @@ -2974,11 +2843,9 @@ public static HttpResponse getPaginatedAssetissueList(String httpNode, Integer o return response; } - /** - * constructor. - */ - public static HttpResponse getPaginatedAssetissueListFromSolidity(String httpSolidityNode, - Integer offset, Integer limit) { + /** constructor. */ + public static HttpResponse getPaginatedAssetissueListFromSolidity( + String httpSolidityNode, Integer offset, Integer limit) { try { String requestUrl = "http://" + httpSolidityNode + "/walletsolidity/getpaginatedassetissuelist"; @@ -2994,11 +2861,9 @@ public static HttpResponse getPaginatedAssetissueListFromSolidity(String httpSol return response; } - /** - * constructor. - */ - public static HttpResponse getPaginatedAssetissueListFromPbft(String httpSolidityNode, - Integer offset, Integer limit) { + /** constructor. */ + public static HttpResponse getPaginatedAssetissueListFromPbft( + String httpSolidityNode, Integer offset, Integer limit) { try { String requestUrl = "http://" + httpSolidityNode + "/walletpbft/getpaginatedassetissuelist"; JsonObject userBaseObj2 = new JsonObject(); @@ -3013,12 +2878,9 @@ public static HttpResponse getPaginatedAssetissueListFromPbft(String httpSolidit return response; } - - /** - * constructor. - */ - public static HttpResponse getPaginatedProposalList(String httpNode, Integer offset, - Integer limit) { + /** constructor. */ + public static HttpResponse getPaginatedProposalList( + String httpNode, Integer offset, Integer limit) { try { String requestUrl = "http://" + httpNode + "/wallet/getpaginatedproposallist"; JsonObject userBaseObj2 = new JsonObject(); @@ -3033,12 +2895,9 @@ public static HttpResponse getPaginatedProposalList(String httpNode, Integer off return response; } - - /** - * constructor. - */ - public static HttpResponse getPaginatedExchangeList(String httpNode, Integer offset, - Integer limit) { + /** constructor. */ + public static HttpResponse getPaginatedExchangeList( + String httpNode, Integer offset, Integer limit) { try { String requestUrl = "http://" + httpNode + "/wallet/getpaginatedexchangelist"; JsonObject userBaseObj2 = new JsonObject(); @@ -3053,12 +2912,13 @@ public static HttpResponse getPaginatedExchangeList(String httpNode, Integer off return response; } - - /** - * constructor. - */ - public static HttpResponse updateSetting(String httpNode, byte[] ownerAddress, - String contractAddress, Integer consumeUserResourcePercent, String fromKey) { + /** constructor. */ + public static HttpResponse updateSetting( + String httpNode, + byte[] ownerAddress, + String contractAddress, + Integer consumeUserResourcePercent, + String fromKey) { try { final String requestUrl = "http://" + httpNode + "/wallet/updatesetting"; JsonObject userBaseObj2 = new JsonObject(); @@ -3080,12 +2940,13 @@ public static HttpResponse updateSetting(String httpNode, byte[] ownerAddress, return response; } - - /** - * constructor. - */ - public static HttpResponse updateEnergyLimit(String httpNode, byte[] ownerAddress, - String contractAddress, Integer originEnergyLimit, String fromKey) { + /** constructor. */ + public static HttpResponse updateEnergyLimit( + String httpNode, + byte[] ownerAddress, + String contractAddress, + Integer originEnergyLimit, + String fromKey) { try { final String requestUrl = "http://" + httpNode + "/wallet/updateenergylimit"; JsonObject userBaseObj2 = new JsonObject(); @@ -3107,9 +2968,7 @@ public static HttpResponse updateEnergyLimit(String httpNode, byte[] ownerAddres return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse createAddress(String httpNode, String value) { try { final String requestUrl = "http://" + httpNode + "/wallet/createaddress"; @@ -3125,9 +2984,7 @@ public static HttpResponse createAddress(String httpNode, String value) { return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse generateAddress(String httpNode) { try { final String requestUrl = "http://" + httpNode + "/wallet/generateaddress"; @@ -3141,13 +2998,10 @@ public static HttpResponse generateAddress(String httpNode) { return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getTransactionCountByBlocknum(String httpNode, long blocknum) { try { - String requestUrl = - "http://" + httpNode + "/wallet/gettransactioncountbyblocknum"; + String requestUrl = "http://" + httpNode + "/wallet/gettransactioncountbyblocknum"; JsonObject userBaseObj2 = new JsonObject(); userBaseObj2.addProperty("num", blocknum); response = createConnect(requestUrl, userBaseObj2); @@ -3159,10 +3013,7 @@ public static HttpResponse getTransactionCountByBlocknum(String httpNode, long b return response; } - - /** - * constructor. - */ + /** constructor. */ public static HttpResponse validateAddress(String httpNode, String address) { try { final String requestUrl = "http://" + httpNode + "/wallet/validateaddress"; @@ -3178,11 +3029,9 @@ public static HttpResponse validateAddress(String httpNode, String address) { return response; } - /** - * constructor. - */ - public static HttpResponse easyTransfer(String httpNode, String value, byte[] toAddress, - Long amount) { + /** constructor. */ + public static HttpResponse easyTransfer( + String httpNode, String value, byte[] toAddress, Long amount) { try { final String requestUrl = "http://" + httpNode + "/wallet/easytransfer"; JsonObject userBaseObj2 = new JsonObject(); @@ -3201,11 +3050,9 @@ public static HttpResponse easyTransfer(String httpNode, String value, byte[] to return response; } - /** - * constructor. - */ - public static HttpResponse easyTransferByPrivate(String httpNode, String privateKey, - byte[] toAddress, Long amount) { + /** constructor. */ + public static HttpResponse easyTransferByPrivate( + String httpNode, String privateKey, byte[] toAddress, Long amount) { try { final String requestUrl = "http://" + httpNode + "/wallet/easytransferbyprivate"; JsonObject userBaseObj2 = new JsonObject(); @@ -3224,11 +3071,9 @@ public static HttpResponse easyTransferByPrivate(String httpNode, String private return response; } - /** - * constructor. - */ - public static HttpResponse easyTransferAsset(String httpNode, String value, byte[] toAddress, - Long amount, String assetId) { + /** constructor. */ + public static HttpResponse easyTransferAsset( + String httpNode, String value, byte[] toAddress, Long amount, String assetId) { try { final String requestUrl = "http://" + httpNode + "/wallet/easytransferasset"; JsonObject userBaseObj2 = new JsonObject(); @@ -3248,11 +3093,9 @@ public static HttpResponse easyTransferAsset(String httpNode, String value, byte return response; } - /** - * constructor. - */ - public static HttpResponse easyTransferAssetByPrivate(String httpNode, String privateKey, - byte[] toAddress, Long amount, String assetId) { + /** constructor. */ + public static HttpResponse easyTransferAssetByPrivate( + String httpNode, String privateKey, byte[] toAddress, Long amount, String assetId) { try { final String requestUrl = "http://" + httpNode + "/wallet/easytransferassetbyprivate"; JsonObject userBaseObj2 = new JsonObject(); @@ -3272,10 +3115,7 @@ public static HttpResponse easyTransferAssetByPrivate(String httpNode, String pr return response; } - - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getContractInfo(String httpNode, String contractAddress) { try { String requestUrl = "http://" + httpNode + "/wallet/getcontractinfo"; @@ -3290,17 +3130,12 @@ public static HttpResponse getContractInfo(String httpNode, String contractAddre return response; } - - /** - * constructor. - */ + /** constructor. */ public static void disConnect() { httppost.releaseConnection(); } - /** - * constructor. - */ + /** constructor. */ public static JSONObject parseResponseContent(HttpResponse response) { try { String result = EntityUtils.toString(response.getEntity()); @@ -3314,9 +3149,7 @@ public static JSONObject parseResponseContent(HttpResponse response) { } } - /** - * constructor. - */ + /** constructor. */ public static List parseResponseContentArray(HttpResponse response) { try { String result = EntityUtils.toString(response.getEntity()); @@ -3334,9 +3167,7 @@ public static List parseResponseContentArray(HttpResponse response) } } - /** - * constructor. - */ + /** constructor. */ public static JSONObject parseStringContent(String content) { try { JSONObject obj = JSONObject.parseObject(content); @@ -3347,9 +3178,7 @@ public static JSONObject parseStringContent(String content) { } } - /** - * constructor. - */ + /** constructor. */ public static void printJsonContent(JSONObject responseContent) { logger.info("----------------------------Print JSON Start---------------------------"); for (String str : responseContent.keySet()) { @@ -3359,9 +3188,7 @@ public static void printJsonContent(JSONObject responseContent) { logger.info("----------------------------Print JSON End-----------------------------"); } - /** - * constructor. - */ + /** constructor. */ public static String str2hex(String str) { char[] chars = "0123456789ABCDEF".toCharArray(); StringBuilder sb = new StringBuilder(); @@ -3377,12 +3204,9 @@ public static String str2hex(String str) { return sb.toString().trim(); } - - /** - * constructor. - */ - public static HttpResponse clearABiGetTxid(String httpNode, byte[] ownerAddress, - String contractAddress, String fromKey) { + /** constructor. */ + public static HttpResponse clearABiGetTxid( + String httpNode, byte[] ownerAddress, String contractAddress, String fromKey) { try { final String requestUrl = "http://" + httpNode + "/wallet/clearabi"; JsonObject userBaseObj2 = new JsonObject(); @@ -3397,7 +3221,6 @@ public static HttpResponse clearABiGetTxid(String httpNode, byte[] ownerAddress, logger.info(transactionSignString); response = broadcastTransaction(httpNode, transactionSignString); - } catch (Exception e) { e.printStackTrace(); httppost.releaseConnection(); @@ -3406,9 +3229,7 @@ public static HttpResponse clearABiGetTxid(String httpNode, byte[] ownerAddress, return response; } - /** - * constructor. - */ + /** constructor. */ public static Optional generateShieldAddress(String httpnode) { ShieldAddressInfo addressInfo = new ShieldAddressInfo(); String sk; @@ -3468,11 +3289,12 @@ public static Optional generateShieldAddress(String httpnode) return Optional.empty(); } - /** - * constructor. - */ - public static List addShieldOutputList(String httpNode, - List shieldOutList, String shieldToAddress, String toAmountString, + /** constructor. */ + public static List addShieldOutputList( + String httpNode, + List shieldOutList, + String shieldToAddress, + String toAmountString, String menoString) { String shieldAddress = shieldToAddress; String amountString = toAmountString; @@ -3499,9 +3321,7 @@ public static List addShieldOutputList(String httpNode, return shieldOutList; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getSpendingKey(String httpNode) { try { String requestUrl = "http://" + httpNode + "/wallet/getspendingkey"; @@ -3514,9 +3334,7 @@ public static HttpResponse getSpendingKey(String httpNode) { return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getDiversifier(String httpNode) { try { String requestUrl = "http://" + httpNode + "/wallet/getdiversifier"; @@ -3529,9 +3347,7 @@ public static HttpResponse getDiversifier(String httpNode) { return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getRcm(String httpNode) { try { String requestUrl = "http://" + httpNode + "/wallet/getrcm"; @@ -3544,9 +3360,7 @@ public static HttpResponse getRcm(String httpNode) { return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getExpandedSpendingKey(String httpNode, String spendingKey) { try { String requestUrl = "http://" + httpNode + "/wallet/getexpandedspendingkey"; @@ -3561,9 +3375,7 @@ public static HttpResponse getExpandedSpendingKey(String httpNode, String spendi return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getAkFromAsk(String httpNode, String ask) { try { String requestUrl = "http://" + httpNode + "/wallet/getakfromask"; @@ -3578,9 +3390,7 @@ public static HttpResponse getAkFromAsk(String httpNode, String ask) { return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getNkFromNsk(String httpNode, String nsk) { try { String requestUrl = "http://" + httpNode + "/wallet/getnkfromnsk"; @@ -3595,9 +3405,7 @@ public static HttpResponse getNkFromNsk(String httpNode, String nsk) { return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getIncomingViewingKey(String httpNode, String ak, String nk) { try { String requestUrl = "http://" + httpNode + "/wallet/getincomingviewingkey"; @@ -3613,9 +3421,7 @@ public static HttpResponse getIncomingViewingKey(String httpNode, String ak, Str return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getNewShieldedAddress(String httpNode) { try { String requestUrl = "http://" + httpNode + "/wallet/getnewshieldedaddress"; @@ -3628,10 +3434,7 @@ public static HttpResponse getNewShieldedAddress(String httpNode) { return response; } - - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getZenPaymentAddress(String httpNode, String ivk, String d) { try { String requestUrl = "http://" + httpNode + "/wallet/getzenpaymentaddress"; @@ -3647,16 +3450,16 @@ public static HttpResponse getZenPaymentAddress(String httpNode, String ivk, Str return response; } - /** - * constructor. - */ - public static HttpResponse getMerkleTreeVoucherInfo(String httpNode, String hash, Integer index, - int blockNum) { + /** constructor. */ + public static HttpResponse getMerkleTreeVoucherInfo( + String httpNode, String hash, Integer index, int blockNum) { try { String requestUrl = "http://" + httpNode + "/wallet/getmerkletreevoucherinfo"; JSONObjectWarp jsonObjectWarp = new JSONObjectWarp(); - jsonObjectWarp.put("out_points", - Lists.newArrayList(new JSONObjectWarp().put("hash", hash).put("index", index))) + jsonObjectWarp + .put( + "out_points", + Lists.newArrayList(new JSONObjectWarp().put("hash", hash).put("index", index))) .put("block_num", blockNum); String jsonStr = jsonObjectWarp.toJSONString(); JsonObject jsonObj = new JsonParser().parse(jsonStr).getAsJsonObject(); @@ -3670,16 +3473,16 @@ public static HttpResponse getMerkleTreeVoucherInfo(String httpNode, String hash return response; } - /** - * constructor. - */ - public static HttpResponse getMerkleTreeVoucherInfoFromSolidity(String httpSolidityNode, - String hash, Integer index, int blockNum) { + /** constructor. */ + public static HttpResponse getMerkleTreeVoucherInfoFromSolidity( + String httpSolidityNode, String hash, Integer index, int blockNum) { try { String requestUrl = "http://" + httpSolidityNode + "/walletsolidity/getmerkletreevoucherinfo"; JSONObjectWarp jsonObjectWarp = new JSONObjectWarp(); - jsonObjectWarp.put("out_points", - Lists.newArrayList(new JSONObjectWarp().put("hash", hash).put("index", index))) + jsonObjectWarp + .put( + "out_points", + Lists.newArrayList(new JSONObjectWarp().put("hash", hash).put("index", index))) .put("block_num", blockNum); String jsonStr = jsonObjectWarp.toJSONString(); JsonObject jsonObj = new JsonParser().parse(jsonStr).getAsJsonObject(); @@ -3693,16 +3496,16 @@ public static HttpResponse getMerkleTreeVoucherInfoFromSolidity(String httpSolid return response; } - /** - * constructor. - */ - public static HttpResponse getMerkleTreeVoucherInfoFromPbft(String httpSolidityNode, String hash, - Integer index, int blockNum) { + /** constructor. */ + public static HttpResponse getMerkleTreeVoucherInfoFromPbft( + String httpSolidityNode, String hash, Integer index, int blockNum) { try { String requestUrl = "http://" + httpSolidityNode + "/walletpbft/getmerkletreevoucherinfo"; JSONObjectWarp jsonObjectWarp = new JSONObjectWarp(); - jsonObjectWarp.put("out_points", - Lists.newArrayList(new JSONObjectWarp().put("hash", hash).put("index", index))) + jsonObjectWarp + .put( + "out_points", + Lists.newArrayList(new JSONObjectWarp().put("hash", hash).put("index", index))) .put("block_num", blockNum); String jsonStr = jsonObjectWarp.toJSONString(); JsonObject jsonObj = new JsonParser().parse(jsonStr).getAsJsonObject(); @@ -3716,13 +3519,16 @@ public static HttpResponse getMerkleTreeVoucherInfoFromPbft(String httpSolidityN return response; } - - /** - * constructor. - */ - public static HttpResponse sendShieldCoin(String httpNode, byte[] publicZenTokenOwnerAddress, - long fromAmount, ShieldAddressInfo shieldAddressInfo, ShieldNoteInfo noteTx, - List shieldOutputList, byte[] publicZenTokenToAddress, long toAmount, + /** constructor. */ + public static HttpResponse sendShieldCoin( + String httpNode, + byte[] publicZenTokenOwnerAddress, + long fromAmount, + ShieldAddressInfo shieldAddressInfo, + ShieldNoteInfo noteTx, + List shieldOutputList, + byte[] publicZenTokenToAddress, + long toAmount, String zenTokenOwnerKey) { try { final String requestUrl = "http://" + httpNode + "/wallet/createshieldedtransaction"; @@ -3733,8 +3539,9 @@ public static HttpResponse sendShieldCoin(String httpNode, byte[] publicZenToken map.put("from_amount", fromAmount); } if (shieldAddressInfo != null) { - HttpResponse expandedSpendingKey = HttpMethed - .getExpandedSpendingKey(httpNode, ByteArray.toHexString(shieldAddressInfo.getSk())); + HttpResponse expandedSpendingKey = + HttpMethed.getExpandedSpendingKey( + httpNode, ByteArray.toHexString(shieldAddressInfo.getSk())); responseContent = HttpMethed.parseResponseContent(expandedSpendingKey); HttpMethed.printJsonContent(responseContent); String ovk = responseContent.getString("ovk"); @@ -3742,19 +3549,25 @@ public static HttpResponse sendShieldCoin(String httpNode, byte[] publicZenToken map.put("nsk", responseContent.getString("nsk")); map.put("ovk", ovk); - response = HttpMethed - .getMerkleTreeVoucherInfo(httpNode, noteTx.getTrxId(), noteTx.getIndex(), 1); + response = + HttpMethed.getMerkleTreeVoucherInfo(httpNode, noteTx.getTrxId(), noteTx.getIndex(), 1); responseContent = HttpMethed.parseResponseContent(response); JSONArray vouchers = responseContent.getJSONArray("vouchers"); JSONArray paths = responseContent.getJSONArray("paths"); - List shieldedSpends = Lists.newArrayList(new JSONObjectWarp().put("note", - new JSONObjectWarp().put("value", noteTx.getValue()) - .put("payment_address", noteTx.getPaymentAddress()) - .put("rcm", ByteArray.toHexString(noteTx.getR())) - .put("memo", ByteArray.toHexString(noteTx.getMemo()))) - .put("alpha", ByteArray.toHexString(org.tron.core.zen.note.Note.generateR())) - .put("voucher", Lists.newArrayList(vouchers)).put("path", Lists.newArrayList(paths))); + List shieldedSpends = + Lists.newArrayList( + new JSONObjectWarp() + .put( + "note", + new JSONObjectWarp() + .put("value", noteTx.getValue()) + .put("payment_address", noteTx.getPaymentAddress()) + .put("rcm", ByteArray.toHexString(noteTx.getR())) + .put("memo", ByteArray.toHexString(noteTx.getMemo()))) + .put("alpha", ByteArray.toHexString(org.tron.core.zen.note.Note.generateR())) + .put("voucher", Lists.newArrayList(vouchers)) + .put("path", Lists.newArrayList(paths))); map.put("shielded_spends", shieldedSpends); } else { @@ -3774,7 +3587,8 @@ public static HttpResponse sendShieldCoin(String httpNode, byte[] publicZenToken noteInfo.put("value", shieldOutputList.get(i).getValue()); noteInfo.put("payment_address", shieldOutputList.get(i).getPaymentAddress()); noteInfo.put("rcm", shieldOutputList.get(i).getRcm().toStringUtf8()); - noteInfo.put("memo", + noteInfo.put( + "memo", ByteArray.toHexString(shieldOutputList.get(i).getMemo().toStringUtf8().getBytes())); final Map note = new HashMap(); note.put("note", noteInfo); @@ -3804,16 +3618,14 @@ public static HttpResponse sendShieldCoin(String httpNode, byte[] publicZenToken return response; } - /** - * constructor. - */ - public static Boolean getSpendResult(String httpNode, ShieldAddressInfo shieldAddressInfo, - ShieldNoteInfo noteTx) { + /** constructor. */ + public static Boolean getSpendResult( + String httpNode, ShieldAddressInfo shieldAddressInfo, ShieldNoteInfo noteTx) { try { final String requestUrl = "http://" + httpNode + "/wallet/isspend"; - response = HttpMethed - .getExpandedSpendingKey(httpNode, ByteArray.toHexString(shieldAddressInfo.sk)); + response = + HttpMethed.getExpandedSpendingKey(httpNode, ByteArray.toHexString(shieldAddressInfo.sk)); responseContent = HttpMethed.parseResponseContent(response); String ask = responseContent.getString("ask"); response = HttpMethed.getAkFromAsk(httpNode, ask); @@ -3826,10 +3638,15 @@ public static Boolean getSpendResult(String httpNode, ShieldAddressInfo shieldAd responseContent = HttpMethed.parseResponseContent(response); jsonObjectWarp.put("nk", responseContent.getString("value")); - jsonObjectWarp.put("note", new JSONObjectWarp().put("value", noteTx.getValue()) - .put("payment_address", noteTx.getPaymentAddress()) - .put("rcm", ByteArray.toHexString(noteTx.getR())) - .put("memo", ByteArray.toHexString(noteTx.getMemo()))).put("txid", noteTx.getTrxId()); + jsonObjectWarp + .put( + "note", + new JSONObjectWarp() + .put("value", noteTx.getValue()) + .put("payment_address", noteTx.getPaymentAddress()) + .put("rcm", ByteArray.toHexString(noteTx.getR())) + .put("memo", ByteArray.toHexString(noteTx.getMemo()))) + .put("txid", noteTx.getTrxId()); String jsonStr = jsonObjectWarp.toJSONString(); JsonObject jsonObj = new JsonParser().parse(jsonStr).getAsJsonObject(); @@ -3839,8 +3656,9 @@ public static Boolean getSpendResult(String httpNode, ShieldAddressInfo shieldAd responseContent = HttpMethed.parseResponseContent(response); HttpMethed.printJsonContent(responseContent); String jsonString = responseContent.toJSONString(); - if (jsonString.contains("result") && (responseContent.getString("result").equals("true") - && responseContent.getString("message").equals("Input note has been spent"))) { + if (jsonString.contains("result") + && (responseContent.getString("result").equals("true") + && responseContent.getString("message").equals("Input note has been spent"))) { return Boolean.TRUE; } else { return Boolean.FALSE; @@ -3852,16 +3670,17 @@ public static Boolean getSpendResult(String httpNode, ShieldAddressInfo shieldAd } } - /** - * constructor. - */ - public static Boolean getSpendResultFromSolidity(String httpNode, String httpSolidityNode, - ShieldAddressInfo shieldAddressInfo, ShieldNoteInfo noteTx) { + /** constructor. */ + public static Boolean getSpendResultFromSolidity( + String httpNode, + String httpSolidityNode, + ShieldAddressInfo shieldAddressInfo, + ShieldNoteInfo noteTx) { try { final String requestUrl = "http://" + httpSolidityNode + "/walletsolidity/isspend"; - response = HttpMethed - .getExpandedSpendingKey(httpNode, ByteArray.toHexString(shieldAddressInfo.sk)); + response = + HttpMethed.getExpandedSpendingKey(httpNode, ByteArray.toHexString(shieldAddressInfo.sk)); responseContent = HttpMethed.parseResponseContent(response); String ask = responseContent.getString("ask"); response = HttpMethed.getAkFromAsk(httpNode, ask); @@ -3874,10 +3693,15 @@ public static Boolean getSpendResultFromSolidity(String httpNode, String httpSol responseContent = HttpMethed.parseResponseContent(response); jsonObjectWarp.put("nk", responseContent.getString("value")); - jsonObjectWarp.put("note", new JSONObjectWarp().put("value", noteTx.getValue()) - .put("payment_address", noteTx.getPaymentAddress()) - .put("rcm", ByteArray.toHexString(noteTx.getR())) - .put("memo", ByteArray.toHexString(noteTx.getMemo()))).put("txid", noteTx.getTrxId()); + jsonObjectWarp + .put( + "note", + new JSONObjectWarp() + .put("value", noteTx.getValue()) + .put("payment_address", noteTx.getPaymentAddress()) + .put("rcm", ByteArray.toHexString(noteTx.getR())) + .put("memo", ByteArray.toHexString(noteTx.getMemo()))) + .put("txid", noteTx.getTrxId()); String jsonStr = jsonObjectWarp.toJSONString(); JsonObject jsonObj = new JsonParser().parse(jsonStr).getAsJsonObject(); @@ -3887,8 +3711,9 @@ public static Boolean getSpendResultFromSolidity(String httpNode, String httpSol HttpMethed.printJsonContent(responseContent); String jsonString = responseContent.toJSONString(); - if (jsonString.contains("result") && (responseContent.getString("result").equals("true") - && responseContent.getString("message").equals("Input note has been spent"))) { + if (jsonString.contains("result") + && (responseContent.getString("result").equals("true") + && responseContent.getString("message").equals("Input note has been spent"))) { return Boolean.TRUE; } else { return Boolean.FALSE; @@ -3900,17 +3725,18 @@ public static Boolean getSpendResultFromSolidity(String httpNode, String httpSol } } - /** - * constructor. - */ - public static Boolean getSpendResultFromPbft(String httpNode, String httpSolidityNode, - ShieldAddressInfo shieldAddressInfo, ShieldNoteInfo noteTx) { + /** constructor. */ + public static Boolean getSpendResultFromPbft( + String httpNode, + String httpSolidityNode, + ShieldAddressInfo shieldAddressInfo, + ShieldNoteInfo noteTx) { try { final String requestUrl = "http://" + httpSolidityNode + "/walletpbft/isspend"; final JSONObjectWarp jsonObjectWarp = new JSONObjectWarp(); - response = HttpMethed - .getExpandedSpendingKey(httpNode, ByteArray.toHexString(shieldAddressInfo.sk)); + response = + HttpMethed.getExpandedSpendingKey(httpNode, ByteArray.toHexString(shieldAddressInfo.sk)); responseContent = HttpMethed.parseResponseContent(response); String ask = responseContent.getString("ask"); final String nsk = responseContent.getString("nsk"); @@ -3920,10 +3746,15 @@ public static Boolean getSpendResultFromPbft(String httpNode, String httpSolidit response = HttpMethed.getNkFromNsk(httpNode, nsk); responseContent = HttpMethed.parseResponseContent(response); jsonObjectWarp.put("nk", responseContent.getString("value")); - jsonObjectWarp.put("note", new JSONObjectWarp().put("value", noteTx.getValue()) - .put("payment_address", noteTx.getPaymentAddress()) - .put("rcm", ByteArray.toHexString(noteTx.getR())) - .put("memo", ByteArray.toHexString(noteTx.getMemo()))).put("txid", noteTx.getTrxId()); + jsonObjectWarp + .put( + "note", + new JSONObjectWarp() + .put("value", noteTx.getValue()) + .put("payment_address", noteTx.getPaymentAddress()) + .put("rcm", ByteArray.toHexString(noteTx.getR())) + .put("memo", ByteArray.toHexString(noteTx.getMemo()))) + .put("txid", noteTx.getTrxId()); String jsonStr = jsonObjectWarp.toJSONString(); JsonObject jsonObj = new JsonParser().parse(jsonStr).getAsJsonObject(); logger.info("jsonObj:" + jsonObj.toString()); @@ -3931,8 +3762,9 @@ public static Boolean getSpendResultFromPbft(String httpNode, String httpSolidit responseContent = HttpMethed.parseResponseContent(response); HttpMethed.printJsonContent(responseContent); String jsonString = responseContent.toJSONString(); - if (jsonString.contains("result") && (responseContent.getString("result").equals("true") - && responseContent.getString("message").equals("Input note has been spent"))) { + if (jsonString.contains("result") + && (responseContent.getString("result").equals("true") + && responseContent.getString("message").equals("Input note has been spent"))) { return Boolean.TRUE; } else { return Boolean.FALSE; @@ -3944,18 +3776,16 @@ public static Boolean getSpendResultFromPbft(String httpNode, String httpSolidit } } - /** - * constructor. - */ - public static List scanNoteByOvkFromPbft(String httpSolidityNode, - ShieldAddressInfo shieldAddressInfo) { + /** constructor. */ + public static List scanNoteByOvkFromPbft( + String httpSolidityNode, ShieldAddressInfo shieldAddressInfo) { try { response = HttpMethed.getNowBlockFromPbft(httpSolidityNode); responseContent = HttpMethed.parseResponseContent(response); HttpMethed.printJsonContent(responseContent); String blockHeaderString = responseContent.getString("block_header"); - String rawDataString = HttpMethed.parseStringContent(blockHeaderString).get("raw_data") - .toString(); + String rawDataString = + HttpMethed.parseStringContent(blockHeaderString).get("raw_data").toString(); Integer currentBlockNum = HttpMethed.parseStringContent(rawDataString).getInteger("number"); Integer startBlockNum = 0; if (currentBlockNum > 100) { @@ -3996,19 +3826,16 @@ public static List scanNoteByOvkFromPbft(String httpSolidityNode } } - - /** - * constructor. - */ - public static List scanNoteByIvk(String httpNode, - ShieldAddressInfo shieldAddressInfo) { + /** constructor. */ + public static List scanNoteByIvk( + String httpNode, ShieldAddressInfo shieldAddressInfo) { try { response = HttpMethed.getNowBlock(httpNode); responseContent = HttpMethed.parseResponseContent(response); HttpMethed.printJsonContent(responseContent); String blockHeaderString = responseContent.getString("block_header"); - String rawDataString = HttpMethed.parseStringContent(blockHeaderString).get("raw_data") - .toString(); + String rawDataString = + HttpMethed.parseStringContent(blockHeaderString).get("raw_data").toString(); Integer currentBlockNum = HttpMethed.parseStringContent(rawDataString).getInteger("number"); Integer startBlockNum = 0; if (currentBlockNum > 100) { @@ -4052,18 +3879,16 @@ public static List scanNoteByIvk(String httpNode, } } - /** - * constructor. - */ - public static List scanNoteByIvkFromSolidity(String httpSolidityNode, - ShieldAddressInfo shieldAddressInfo) { + /** constructor. */ + public static List scanNoteByIvkFromSolidity( + String httpSolidityNode, ShieldAddressInfo shieldAddressInfo) { try { response = HttpMethed.getNowBlockFromSolidity(httpSolidityNode); responseContent = HttpMethed.parseResponseContent(response); HttpMethed.printJsonContent(responseContent); String blockHeaderString = responseContent.getString("block_header"); - String rawDataString = HttpMethed.parseStringContent(blockHeaderString).get("raw_data") - .toString(); + String rawDataString = + HttpMethed.parseStringContent(blockHeaderString).get("raw_data").toString(); Integer currentBlockNum = HttpMethed.parseStringContent(rawDataString).getInteger("number"); Integer startBlockNum = 0; if (currentBlockNum > 100) { @@ -4105,18 +3930,16 @@ public static List scanNoteByIvkFromSolidity(String httpSolidity } } - /** - * constructor. - */ - public static List scanNoteByIvkFromPbft(String httpSolidityNode, - ShieldAddressInfo shieldAddressInfo) { + /** constructor. */ + public static List scanNoteByIvkFromPbft( + String httpSolidityNode, ShieldAddressInfo shieldAddressInfo) { try { response = HttpMethed.getNowBlockFromPbft(httpSolidityNode); responseContent = HttpMethed.parseResponseContent(response); HttpMethed.printJsonContent(responseContent); String blockHeaderString = responseContent.getString("block_header"); - String rawDataString = HttpMethed.parseStringContent(blockHeaderString).get("raw_data") - .toString(); + String rawDataString = + HttpMethed.parseStringContent(blockHeaderString).get("raw_data").toString(); Integer currentBlockNum = HttpMethed.parseStringContent(rawDataString).getInteger("number"); Integer startBlockNum = 0; if (currentBlockNum > 100) { @@ -4157,15 +3980,12 @@ public static List scanNoteByIvkFromPbft(String httpSolidityNode } } - - /** - * constructor. - */ - public static List scanAndMarkNoteByIvk(String httpNode, - ShieldAddressInfo shieldAddressInfo) { + /** constructor. */ + public static List scanAndMarkNoteByIvk( + String httpNode, ShieldAddressInfo shieldAddressInfo) { try { - response = HttpMethed - .getExpandedSpendingKey(httpNode, ByteArray.toHexString(shieldAddressInfo.sk)); + response = + HttpMethed.getExpandedSpendingKey(httpNode, ByteArray.toHexString(shieldAddressInfo.sk)); responseContent = HttpMethed.parseResponseContent(response); String ask = responseContent.getString("ask"); String nsk = responseContent.getString("nsk"); @@ -4181,8 +4001,8 @@ public static List scanAndMarkNoteByIvk(String httpNode, responseContent = HttpMethed.parseResponseContent(response); HttpMethed.printJsonContent(responseContent); String blockHeaderString = responseContent.getString("block_header"); - String rawDataString = HttpMethed.parseStringContent(blockHeaderString).get("raw_data") - .toString(); + String rawDataString = + HttpMethed.parseStringContent(blockHeaderString).get("raw_data").toString(); Integer currentBlockNum = HttpMethed.parseStringContent(rawDataString).getInteger("number"); Integer startBlockNum = 0; if (currentBlockNum > 100) { @@ -4228,14 +4048,12 @@ public static List scanAndMarkNoteByIvk(String httpNode, } } - /** - * constructor. - */ - public static List scanAndMarkNoteByIvkFromSolidity(String httpNode, - String httpSolidityNode, ShieldAddressInfo shieldAddressInfo) { + /** constructor. */ + public static List scanAndMarkNoteByIvkFromSolidity( + String httpNode, String httpSolidityNode, ShieldAddressInfo shieldAddressInfo) { try { - response = HttpMethed - .getExpandedSpendingKey(httpNode, ByteArray.toHexString(shieldAddressInfo.sk)); + response = + HttpMethed.getExpandedSpendingKey(httpNode, ByteArray.toHexString(shieldAddressInfo.sk)); responseContent = HttpMethed.parseResponseContent(response); String ask = responseContent.getString("ask"); String nsk = responseContent.getString("nsk"); @@ -4251,8 +4069,8 @@ public static List scanAndMarkNoteByIvkFromSolidity(String httpN responseContent = HttpMethed.parseResponseContent(response); HttpMethed.printJsonContent(responseContent); String blockHeaderString = responseContent.getString("block_header"); - String rawDataString = HttpMethed.parseStringContent(blockHeaderString).get("raw_data") - .toString(); + String rawDataString = + HttpMethed.parseStringContent(blockHeaderString).get("raw_data").toString(); Integer currentBlockNum = HttpMethed.parseStringContent(rawDataString).getInteger("number"); Integer startBlockNum = 0; if (currentBlockNum > 100) { @@ -4299,14 +4117,12 @@ public static List scanAndMarkNoteByIvkFromSolidity(String httpN } } - /** - * constructor. - */ - public static List scanAndMarkNoteByIvkFromPbft(String httpNode, - String httpSolidityNode, ShieldAddressInfo shieldAddressInfo) { + /** constructor. */ + public static List scanAndMarkNoteByIvkFromPbft( + String httpNode, String httpSolidityNode, ShieldAddressInfo shieldAddressInfo) { try { - response = HttpMethed - .getExpandedSpendingKey(httpNode, ByteArray.toHexString(shieldAddressInfo.sk)); + response = + HttpMethed.getExpandedSpendingKey(httpNode, ByteArray.toHexString(shieldAddressInfo.sk)); responseContent = HttpMethed.parseResponseContent(response); String ask = responseContent.getString("ask"); String nsk = responseContent.getString("nsk"); @@ -4322,8 +4138,8 @@ public static List scanAndMarkNoteByIvkFromPbft(String httpNode, responseContent = HttpMethed.parseResponseContent(response); HttpMethed.printJsonContent(responseContent); String blockHeaderString = responseContent.getString("block_header"); - String rawDataString = HttpMethed.parseStringContent(blockHeaderString).get("raw_data") - .toString(); + String rawDataString = + HttpMethed.parseStringContent(blockHeaderString).get("raw_data").toString(); Integer currentBlockNum = HttpMethed.parseStringContent(rawDataString).getInteger("number"); Integer startBlockNum = 0; if (currentBlockNum > 100) { @@ -4367,19 +4183,16 @@ public static List scanAndMarkNoteByIvkFromPbft(String httpNode, } } - - /** - * constructor. - */ - public static List scanNoteByOvk(String httpNode, - ShieldAddressInfo shieldAddressInfo) { + /** constructor. */ + public static List scanNoteByOvk( + String httpNode, ShieldAddressInfo shieldAddressInfo) { try { response = HttpMethed.getNowBlock(httpNode); responseContent = HttpMethed.parseResponseContent(response); HttpMethed.printJsonContent(responseContent); String blockHeaderString = responseContent.getString("block_header"); - String rawDataString = HttpMethed.parseStringContent(blockHeaderString).get("raw_data") - .toString(); + String rawDataString = + HttpMethed.parseStringContent(blockHeaderString).get("raw_data").toString(); Integer currentBlockNum = HttpMethed.parseStringContent(rawDataString).getInteger("number"); Integer startBlockNum = 0; if (currentBlockNum > 100) { @@ -4421,18 +4234,16 @@ public static List scanNoteByOvk(String httpNode, } } - /** - * constructor. - */ - public static List scanNoteByOvkFromSolidity(String httpSolidityNode, - ShieldAddressInfo shieldAddressInfo) { + /** constructor. */ + public static List scanNoteByOvkFromSolidity( + String httpSolidityNode, ShieldAddressInfo shieldAddressInfo) { try { response = HttpMethed.getNowBlockFromSolidity(httpSolidityNode); responseContent = HttpMethed.parseResponseContent(response); HttpMethed.printJsonContent(responseContent); String blockHeaderString = responseContent.getString("block_header"); - String rawDataString = HttpMethed.parseStringContent(blockHeaderString).get("raw_data") - .toString(); + String rawDataString = + HttpMethed.parseStringContent(blockHeaderString).get("raw_data").toString(); Integer currentBlockNum = HttpMethed.parseStringContent(rawDataString).getInteger("number"); Integer startBlockNum = 0; if (currentBlockNum > 100) { @@ -4474,13 +4285,18 @@ public static List scanNoteByOvkFromSolidity(String httpSolidity } } - /** - * constructor. - */ - public static HttpResponse sendShieldCoinWithoutAsk(String httpNode, String httpSolidityNode, - String httpPbftNode, byte[] publicZenTokenOwnerAddress, long fromAmount, - ShieldAddressInfo shieldAddressInfo, ShieldNoteInfo noteTx, - List shieldOutputList, byte[] publicZenTokenToAddress, long toAmount, + /** constructor. */ + public static HttpResponse sendShieldCoinWithoutAsk( + String httpNode, + String httpSolidityNode, + String httpPbftNode, + byte[] publicZenTokenOwnerAddress, + long fromAmount, + ShieldAddressInfo shieldAddressInfo, + ShieldNoteInfo noteTx, + List shieldOutputList, + byte[] publicZenTokenToAddress, + long toAmount, String zenTokenOwnerKey) { try { final String requestUrl = @@ -4494,8 +4310,9 @@ public static HttpResponse sendShieldCoinWithoutAsk(String httpNode, String http String ask = ""; byte[] alpha = null; if (shieldAddressInfo != null) { - HttpResponse expandedSpendingKey = HttpMethed - .getExpandedSpendingKey(httpNode, ByteArray.toHexString(shieldAddressInfo.getSk())); + HttpResponse expandedSpendingKey = + HttpMethed.getExpandedSpendingKey( + httpNode, ByteArray.toHexString(shieldAddressInfo.getSk())); responseContent = HttpMethed.parseResponseContent(expandedSpendingKey); HttpMethed.printJsonContent(responseContent); map.put("nsk", responseContent.getString("nsk")); @@ -4507,17 +4324,17 @@ public static HttpResponse sendShieldCoinWithoutAsk(String httpNode, String http map.put("ak", responseContent.getString("value")); logger.info("noteTx.getTrxId():" + noteTx.getTrxId()); - HttpMethed.response = HttpMethed - .getMerkleTreeVoucherInfoFromSolidity(httpSolidityNode, noteTx.getTrxId(), - noteTx.getIndex(), 1); + HttpMethed.response = + HttpMethed.getMerkleTreeVoucherInfoFromSolidity( + httpSolidityNode, noteTx.getTrxId(), noteTx.getIndex(), 1); HttpMethed.responseContent = HttpMethed.parseResponseContent(HttpMethed.response); HttpMethed.printJsonContent(responseContent); final JSONArray vouchers = HttpMethed.responseContent.getJSONArray("vouchers"); final JSONArray paths = HttpMethed.responseContent.getJSONArray("paths"); - HttpMethed.response = HttpMethed - .getMerkleTreeVoucherInfoFromPbft(httpPbftNode, noteTx.getTrxId(), noteTx.getIndex(), - 1); + HttpMethed.response = + HttpMethed.getMerkleTreeVoucherInfoFromPbft( + httpPbftNode, noteTx.getTrxId(), noteTx.getIndex(), 1); HttpMethed.responseContent = HttpMethed.parseResponseContent(HttpMethed.response); HttpMethed.printJsonContent(responseContent); JSONArray vouchersPbft = HttpMethed.responseContent.getJSONArray("vouchers"); @@ -4525,13 +4342,19 @@ public static HttpResponse sendShieldCoinWithoutAsk(String httpNode, String http Assert.assertTrue(pathsPbft.equals(paths)); alpha = org.tron.core.zen.note.Note.generateR(); - List shieldedSpends = Lists.newArrayList(new JSONObjectWarp().put("note", - new JSONObjectWarp().put("value", noteTx.getValue()) - .put("payment_address", noteTx.getPaymentAddress()) - .put("rcm", ByteArray.toHexString(noteTx.getR())) - .put("memo", ByteArray.toHexString(noteTx.getMemo()))) - .put("alpha", ByteArray.toHexString(alpha)).put("voucher", Lists.newArrayList(vouchers)) - .put("path", Lists.newArrayList(paths))); + List shieldedSpends = + Lists.newArrayList( + new JSONObjectWarp() + .put( + "note", + new JSONObjectWarp() + .put("value", noteTx.getValue()) + .put("payment_address", noteTx.getPaymentAddress()) + .put("rcm", ByteArray.toHexString(noteTx.getR())) + .put("memo", ByteArray.toHexString(noteTx.getMemo()))) + .put("alpha", ByteArray.toHexString(alpha)) + .put("voucher", Lists.newArrayList(vouchers)) + .put("path", Lists.newArrayList(paths))); map.put("shielded_spends", shieldedSpends); } else { @@ -4550,7 +4373,8 @@ public static HttpResponse sendShieldCoinWithoutAsk(String httpNode, String http noteInfo.put("value", shieldOutputList.get(i).getValue()); noteInfo.put("payment_address", shieldOutputList.get(i).getPaymentAddress()); noteInfo.put("rcm", shieldOutputList.get(i).getRcm().toStringUtf8()); - noteInfo.put("memo", + noteInfo.put( + "memo", ByteArray.toHexString(shieldOutputList.get(i).getMemo().toStringUtf8().getBytes())); final Map note = new HashMap(); note.put("note", noteInfo); @@ -4576,8 +4400,11 @@ public static HttpResponse sendShieldCoinWithoutAsk(String httpNode, String http String hash = responseContent.getString("value"); String spendauthsigUrl = "http://" + httpNode + "/wallet/createspendauthsig"; - JSONObjectWarp spendauthsigJson = new JSONObjectWarp().put("ask", ask) - .put("alpha", ByteArray.toHexString(alpha)).put("tx_hash", hash); + JSONObjectWarp spendauthsigJson = + new JSONObjectWarp() + .put("ask", ask) + .put("alpha", ByteArray.toHexString(alpha)) + .put("tx_hash", hash); String spendauthsigStr = spendauthsigJson.toJSONString(); JsonObject spendauthsigObj = new JsonParser().parse(spendauthsigStr).getAsJsonObject(); logger.info("spendauthsigObj:" + spendauthsigObj.toString()); @@ -4587,9 +4414,15 @@ public static HttpResponse sendShieldCoinWithoutAsk(String httpNode, String http String spendauthsig = responseContent.getString("value"); JSONObject jsonObject = HttpMethed.parseStringContent(transactionString); - jsonObject.getJSONObject("raw_data").getJSONArray("contract").getJSONObject(0) - .getJSONObject("parameter").getJSONObject("value").getJSONArray("spend_description") - .getJSONObject(0).put("spend_authority_signature", spendauthsig); + jsonObject + .getJSONObject("raw_data") + .getJSONArray("contract") + .getJSONObject(0) + .getJSONObject("parameter") + .getJSONObject("value") + .getJSONArray("spend_description") + .getJSONObject(0) + .put("spend_authority_signature", spendauthsig); transactionString = jsonObject.toString(); logger.info("transactionString2:" + transactionString); } @@ -4609,23 +4442,19 @@ public static HttpResponse sendShieldCoinWithoutAsk(String httpNode, String http return response; } - /** - * constructor. - */ - public static void freedResource(String httpNode, byte[] fromAddress, byte[] toAddress, - String fromKey) { + /** constructor. */ + public static void freedResource( + String httpNode, byte[] fromAddress, byte[] toAddress, String fromKey) { long balance = HttpMethed.getBalance(httpNode, fromAddress); - //System.out.println("剩余资源:" + balance); + // System.out.println("剩余资源:" + balance); sendCoin(httpNode, fromAddress, toAddress, balance - 50000, fromKey); balance = HttpMethed.getBalance(httpNode, fromAddress); - //System.out.println("之后资源:" + balance); + // System.out.println("之后资源:" + balance); } - /** - * constructor. - */ - public static HttpResponse updateBrokerage(String httpNode, byte[] ownerAddress, Long brokerage, - String fromKey) { + /** constructor. */ + public static HttpResponse updateBrokerage( + String httpNode, byte[] ownerAddress, Long brokerage, String fromKey) { try { final String requestUrl = "http://" + httpNode + "/wallet/updateBrokerage"; JsonObject userBaseObj2 = new JsonObject(); @@ -4644,11 +4473,9 @@ public static HttpResponse updateBrokerage(String httpNode, byte[] ownerAddress, return response; } - /** - * constructor. - */ - public static HttpResponse updateBrokerageOnVisible(String httpNode, byte[] ownerAddress, - Long brokerage, String fromKey, String visible) { + /** constructor. */ + public static HttpResponse updateBrokerageOnVisible( + String httpNode, byte[] ownerAddress, Long brokerage, String fromKey, String visible) { try { final String requestUrl = "http://" + httpNode + "/wallet/updateBrokerage"; JsonObject userBaseObj2 = new JsonObject(); @@ -4672,9 +4499,7 @@ public static HttpResponse updateBrokerageOnVisible(String httpNode, byte[] owne return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getReward(String httpNode, byte[] address) { try { String requestUrl = "http://" + httpNode + "/wallet/getReward"; @@ -4690,9 +4515,7 @@ public static HttpResponse getReward(String httpNode, byte[] address) { return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getRewardFromSolidity(String httpSolidityNode, byte[] address) { try { String requestUrl = "http://" + httpSolidityNode + "/walletsolidity/getReward"; @@ -4708,9 +4531,7 @@ public static HttpResponse getRewardFromSolidity(String httpSolidityNode, byte[] return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getRewardFromPbft(String httpSolidityNode, byte[] address) { try { String requestUrl = "http://" + httpSolidityNode + "/walletpbft/getReward"; @@ -4726,10 +4547,7 @@ public static HttpResponse getRewardFromPbft(String httpSolidityNode, byte[] add return response; } - - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getBrokerage(String httpNode, byte[] address) { try { String requestUrl = "http://" + httpNode + "/wallet/getBrokerage"; @@ -4745,9 +4563,7 @@ public static HttpResponse getBrokerage(String httpNode, byte[] address) { return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getBrokerageFromSolidity(String httpSolidityNode, byte[] address) { try { String requestUrl = "http://" + httpSolidityNode + "/walletsolidity/getBrokerage"; @@ -4763,9 +4579,7 @@ public static HttpResponse getBrokerageFromSolidity(String httpSolidityNode, byt return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getRewardOnVisible(String httpNode, byte[] address, String visible) { try { final String requestUrl = "http://" + httpNode + "/wallet/getReward"; @@ -4786,11 +4600,9 @@ public static HttpResponse getRewardOnVisible(String httpNode, byte[] address, S return response; } - /** - * constructor. - */ - public static HttpResponse getRewardFromSolidityOnVisible(String httpSolidityNode, byte[] address, - String visible) { + /** constructor. */ + public static HttpResponse getRewardFromSolidityOnVisible( + String httpSolidityNode, byte[] address, String visible) { try { final String requestUrl = "http://" + httpSolidityNode + "/walletsolidity/getReward"; JsonObject userBaseObj2 = new JsonObject(); @@ -4810,11 +4622,9 @@ public static HttpResponse getRewardFromSolidityOnVisible(String httpSolidityNod return response; } - /** - * constructor. - */ - public static HttpResponse getBrokerageOnVisible(String httpNode, byte[] address, - String visible) { + /** constructor. */ + public static HttpResponse getBrokerageOnVisible( + String httpNode, byte[] address, String visible) { try { final String requestUrl = "http://" + httpNode + "/wallet/getBrokerage"; JsonObject userBaseObj2 = new JsonObject(); @@ -4834,11 +4644,9 @@ public static HttpResponse getBrokerageOnVisible(String httpNode, byte[] address return response; } - /** - * constructor. - */ - public static HttpResponse getBrokerageFromSolidityOnVisible(String httpSolidityNode, - byte[] address, String visible) { + /** constructor. */ + public static HttpResponse getBrokerageFromSolidityOnVisible( + String httpSolidityNode, byte[] address, String visible) { try { final String requestUrl = "http://" + httpSolidityNode + "/walletsolidity/getBrokerage"; JsonObject userBaseObj2 = new JsonObject(); @@ -4858,9 +4666,7 @@ public static HttpResponse getBrokerageFromSolidityOnVisible(String httpSolidity return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getBrokerageFromPbft(String httpSolidityNode, byte[] address) { try { final String requestUrl = "http://" + httpSolidityNode + "/walletpbft/getBrokerage"; @@ -4875,12 +4681,15 @@ public static HttpResponse getBrokerageFromPbft(String httpSolidityNode, byte[] return response; } - /** - * constructor. - */ - public static String marketSellAssetGetTxId(String httpNode, byte[] ownerAddress, + /** constructor. */ + public static String marketSellAssetGetTxId( + String httpNode, + byte[] ownerAddress, String sellTokenId, - Long sellTokenQuantity, String buyTokenId, Long buyTokenQuantity, String fromKey, + Long sellTokenQuantity, + String buyTokenId, + Long buyTokenQuantity, + String fromKey, String visible) { try { final String requestUrl = "http://" + httpNode + "/wallet/marketsellasset"; @@ -4912,9 +4721,7 @@ public static String marketSellAssetGetTxId(String httpNode, byte[] ownerAddress return responseContent.getString("txID"); } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getMarketOrderById(String httpNode, String orderId, String visible) { try { String requestUrl = "http://" + httpNode + "/wallet/getmarketorderbyid"; @@ -4930,11 +4737,9 @@ public static HttpResponse getMarketOrderById(String httpNode, String orderId, S return response; } - /** - * constructor. - */ - public static HttpResponse getMarketOrderByIdFromSolidity(String httpSolidityNode, String orderId, - String visible) { + /** constructor. */ + public static HttpResponse getMarketOrderByIdFromSolidity( + String httpSolidityNode, String orderId, String visible) { try { String requestUrl = "http://" + httpSolidityNode + "/walletsolidity/getmarketorderbyid"; JsonObject userBaseObj2 = new JsonObject(); @@ -4949,11 +4754,9 @@ public static HttpResponse getMarketOrderByIdFromSolidity(String httpSolidityNod return response; } - /** - * constructor. - */ - public static HttpResponse getMarketOrderByIdFromPbft(String httpPbftNode, String orderId, - String visible) { + /** constructor. */ + public static HttpResponse getMarketOrderByIdFromPbft( + String httpPbftNode, String orderId, String visible) { try { String requestUrl = "http://" + httpPbftNode + "/walletpbft/getmarketorderbyid"; JsonObject userBaseObj2 = new JsonObject(); @@ -4968,11 +4771,9 @@ public static HttpResponse getMarketOrderByIdFromPbft(String httpPbftNode, Strin return response; } - /** - * constructor. - */ - public static String marketCancelOrder(String httpNode, byte[] ownerAddress, String orderId, - String fromKey, String visible) { + /** constructor. */ + public static String marketCancelOrder( + String httpNode, byte[] ownerAddress, String orderId, String fromKey, String visible) { try { final String requestUrl = "http://" + httpNode + "/wallet/marketcancelorder"; JsonObject userBaseObj2 = new JsonObject(); @@ -4998,11 +4799,9 @@ public static String marketCancelOrder(String httpNode, byte[] ownerAddress, Str return responseContent.getString("txID"); } - /** - * constructor. - */ - public static HttpResponse getMarketOrderByAccount(String httpNode, byte[] ownerAddress, - String visible) { + /** constructor. */ + public static HttpResponse getMarketOrderByAccount( + String httpNode, byte[] ownerAddress, String visible) { try { String requestUrl = "http://" + httpNode + "/wallet/getmarketorderbyaccount"; JsonObject userBaseObj2 = new JsonObject(); @@ -5021,11 +4820,9 @@ public static HttpResponse getMarketOrderByAccount(String httpNode, byte[] owner return response; } - /** - * constructor. - */ - public static HttpResponse getMarketOrderByAccountFromSolidity(String httpSolidityNode, - byte[] ownerAddress, String visible) { + /** constructor. */ + public static HttpResponse getMarketOrderByAccountFromSolidity( + String httpSolidityNode, byte[] ownerAddress, String visible) { try { String requestUrl = "http://" + httpSolidityNode + "/walletsolidity/getmarketorderbyaccount"; JsonObject userBaseObj2 = new JsonObject(); @@ -5044,11 +4841,9 @@ public static HttpResponse getMarketOrderByAccountFromSolidity(String httpSolidi return response; } - /** - * constructor. - */ - public static HttpResponse getMarketOrderByAccountFromPbft(String httpPbftNode, - byte[] ownerAddress, String visible) { + /** constructor. */ + public static HttpResponse getMarketOrderByAccountFromPbft( + String httpPbftNode, byte[] ownerAddress, String visible) { try { String requestUrl = "http://" + httpPbftNode + "/walletpbft/getmarketorderbyaccount"; JsonObject userBaseObj2 = new JsonObject(); @@ -5067,9 +4862,7 @@ public static HttpResponse getMarketOrderByAccountFromPbft(String httpPbftNode, return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getMarketPairList(String httpNode, String visible) { try { String requestUrl = "http://" + httpNode + "/wallet/getmarketpairlist"; @@ -5084,11 +4877,9 @@ public static HttpResponse getMarketPairList(String httpNode, String visible) { return response; } - /** - * constructor. - */ - public static HttpResponse getMarketPairListFromSolidity(String httpSolidityNode, - String visible) { + /** constructor. */ + public static HttpResponse getMarketPairListFromSolidity( + String httpSolidityNode, String visible) { try { String requestUrl = "http://" + httpSolidityNode + "/walletsolidity/getmarketpairlist"; JsonObject userBaseObj2 = new JsonObject(); @@ -5102,9 +4893,7 @@ public static HttpResponse getMarketPairListFromSolidity(String httpSolidityNode return response; } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getMarketPairListFromPbft(String httpPbftNode, String visible) { try { String requestUrl = "http://" + httpPbftNode + "/walletpbft/getmarketpairlist"; @@ -5119,11 +4908,9 @@ public static HttpResponse getMarketPairListFromPbft(String httpPbftNode, String return response; } - /** - * constructor. - */ - public static HttpResponse getMarketOrderListByPair(String httpNode, String sellTokenId, - String buyTokenId, String visible) { + /** constructor. */ + public static HttpResponse getMarketOrderListByPair( + String httpNode, String sellTokenId, String buyTokenId, String visible) { try { String requestUrl = "http://" + httpNode + "/wallet/getmarketorderlistbypair"; JsonObject userBaseObj2 = new JsonObject(); @@ -5144,12 +4931,9 @@ public static HttpResponse getMarketOrderListByPair(String httpNode, String sell return response; } - /** - * constructor. - */ - public static HttpResponse getMarketOrderListByPairFromSolidity(String httpSolidityNode, - String sellTokenId, - String buyTokenId, String visible) { + /** constructor. */ + public static HttpResponse getMarketOrderListByPairFromSolidity( + String httpSolidityNode, String sellTokenId, String buyTokenId, String visible) { try { String requestUrl = "http://" + httpSolidityNode + "/walletsolidity/getmarketorderlistbypair"; JsonObject userBaseObj2 = new JsonObject(); @@ -5170,11 +4954,9 @@ public static HttpResponse getMarketOrderListByPairFromSolidity(String httpSolid return response; } - /** - * constructor. - */ - public static HttpResponse getMarketOrderListByPairFromPbft(String httpPbftNode, - String sellTokenId, String buyTokenId, String visible) { + /** constructor. */ + public static HttpResponse getMarketOrderListByPairFromPbft( + String httpPbftNode, String sellTokenId, String buyTokenId, String visible) { try { String requestUrl = "http://" + httpPbftNode + "/walletpbft/getmarketorderlistbypair"; JsonObject userBaseObj2 = new JsonObject(); @@ -5195,11 +4977,9 @@ public static HttpResponse getMarketOrderListByPairFromPbft(String httpPbftNode, return response; } - /** - * constructor. - */ - public static HttpResponse getMarketPriceByPair(String httpNode, String sellTokenId, - String buyTokenId, String visible) { + /** constructor. */ + public static HttpResponse getMarketPriceByPair( + String httpNode, String sellTokenId, String buyTokenId, String visible) { try { String requestUrl = "http://" + httpNode + "/wallet/getmarketpricebypair"; JsonObject userBaseObj2 = new JsonObject(); @@ -5220,12 +5000,9 @@ public static HttpResponse getMarketPriceByPair(String httpNode, String sellToke return response; } - /** - * constructor. - */ - public static HttpResponse getMarketPriceByPairFromSolidity(String httpSolidityNode, - String sellTokenId, - String buyTokenId, String visible) { + /** constructor. */ + public static HttpResponse getMarketPriceByPairFromSolidity( + String httpSolidityNode, String sellTokenId, String buyTokenId, String visible) { try { String requestUrl = "http://" + httpSolidityNode + "/walletsolidity/getmarketpricebypair"; JsonObject userBaseObj2 = new JsonObject(); @@ -5246,11 +5023,9 @@ public static HttpResponse getMarketPriceByPairFromSolidity(String httpSolidityN return response; } - /** - * constructor. - */ - public static HttpResponse getMarketPriceByPairFromPbft(String httpPbftNode, - String sellTokenId, String buyTokenId, String visible) { + /** constructor. */ + public static HttpResponse getMarketPriceByPairFromPbft( + String httpPbftNode, String sellTokenId, String buyTokenId, String visible) { try { String requestUrl = "http://" + httpPbftNode + "/walletpbft/getmarketpricebypair"; JsonObject userBaseObj2 = new JsonObject(); @@ -5271,9 +5046,7 @@ public static HttpResponse getMarketPriceByPairFromPbft(String httpPbftNode, return response; } - /** - * constructor. - */ + /** constructor. */ public static int getTransactionPendingSize(String httpNode) { try { String requestUrl = "http://" + httpNode + "/wallet/getpendingsize"; @@ -5288,9 +5061,7 @@ public static int getTransactionPendingSize(String httpNode) { return responseContent.getInteger("pendingSize"); } - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getTransactionListFromPending(String httpNode) { try { String requestUrl = "http://" + httpNode + "/wallet/gettransactionlistfrompending"; @@ -5304,10 +5075,7 @@ public static HttpResponse getTransactionListFromPending(String httpNode) { return response; } - - /** - * constructor. - */ + /** constructor. */ public static HttpResponse getTransactionFromPending(String httpNode, String txid) { try { String requestUrl = "http://" + httpNode + "/wallet/gettransactionfrompending"; @@ -5321,9 +5089,4 @@ public static HttpResponse getTransactionFromPending(String httpNode, String txi } return response; } - - - - - } diff --git a/framework/src/test/java/stest/tron/wallet/common/client/utils/JsonRpcBase.java b/framework/src/test/java/stest/tron/wallet/common/client/utils/JsonRpcBase.java index 55ede39790c..9d5be26802f 100644 --- a/framework/src/test/java/stest/tron/wallet/common/client/utils/JsonRpcBase.java +++ b/framework/src/test/java/stest/tron/wallet/common/client/utils/JsonRpcBase.java @@ -9,6 +9,7 @@ import io.grpc.ManagedChannelBuilder; import io.grpc.Status; import io.netty.util.internal.StringUtil; + import java.math.BigInteger; import java.util.HashMap; import java.util.Optional; @@ -20,6 +21,7 @@ import org.bouncycastle.util.encoders.Hex; import org.testng.Assert; import org.testng.annotations.BeforeSuite; +import org.testng.annotations.Test; import org.tron.api.GrpcAPI; import org.tron.api.GrpcAPI.BytesMessage; import org.tron.api.GrpcAPI.EmptyMessage; @@ -52,11 +54,14 @@ public class JsonRpcBase { public static final byte[] jsonRpcOwnerAddress = PublicMethed.getFinalAddress(jsonRpcOwnerKey); public static final String jsonRpcOwnerAddressString = PublicMethed.getAddressString(jsonRpcOwnerKey); - public static String jsonRpcNode = Configuration.getByPath("testng.conf").getStringList("jsonRpcNode.ip.list").get(0); + public static String jsonRpcNodeForSolidity = + Configuration.getByPath("testng.conf").getStringList("jsonRpcNode.ip.list").get(1); public static String httpFullNode = Configuration.getByPath("testng.conf").getStringList("httpnode.ip.list").get(0); + public static String httpsolidityNode = + Configuration.getByPath("testng.conf").getStringList("httpnode.ip.list").get(2); public static String ethHttpsNode = Configuration.getByPath("testng.conf").getStringList("ethHttpsNode.host.list").get(0); @@ -64,7 +69,8 @@ public class JsonRpcBase { public WalletGrpc.WalletBlockingStub blockingStubFull = null; public ManagedChannel channelSolidity = null; public ManagedChannel channelPbft = null; - + public static String data = null; + public String paramString = null; public WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubSolidity = null; public WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubPbft = null; public String fullnode = @@ -75,6 +81,7 @@ public class JsonRpcBase { public static String trc20AddressByteString; public static String trc20AddressHex; public static String contractAddressFrom58; + public static String contractTrc20AddressFrom58; public static String contractAddressFromHex; public static ByteString shieldAddressByteString; public static byte[] shieldAddressByte; @@ -172,7 +179,9 @@ public void deployContract() throws Exception { HashMap retMap = PublicMethed.getBycodeAbi(filePath, contractName); String code = retMap.get("byteCode").toString(); + System.out.println("CODE:" + code); String abi = retMap.get("abI").toString(); + System.out.println("abi:" + abi); param.addProperty("abi", abi); param.addProperty("data", code); @@ -192,7 +201,6 @@ public void deployContract() throws Exception { responseContent = HttpMethed.parseStringContent(transactionString); final String txid = responseContent.getString("txID"); - response = HttpMethed.broadcastTransaction(httpFullNode, transactionSignString); org.junit.Assert.assertTrue(HttpMethed.verificationResult(response)); @@ -203,12 +211,12 @@ public void deployContract() throws Exception { org.junit.Assert.assertEquals(beforeTokenBalance - afterTokenBalance, 1L); - logger.info(txid); response = HttpMethed.getTransactionById(httpFullNode, txid); responseContent = HttpMethed.parseResponseContent(response); HttpMethed.printJsonContent(responseContent); org.junit.Assert.assertTrue(!responseContent.getString("contract_address").isEmpty()); contractAddressFrom58 = responseContent.getString("contract_address"); + logger.info("contractAddressFrom58:" + contractAddressFrom58); } /** constructor. */ @@ -230,10 +238,13 @@ public void triggerContract() throws Exception { + Integer.toHexString(Integer.valueOf(jsonRpcAssetId)); String tokenValueParam = "0000000000000000000000000000000000000000000000000000000000000001"; - String paramString = addressParam + tokenIdParam + tokenValueParam; + paramString = addressParam + tokenIdParam + tokenValueParam; + logger.info("paramString:" + paramString); String selector = "TransferTokenTo(address,trcToken,uint256)"; + // exit(1); param.addProperty("data", "0x" + Util.parseMethod(selector, paramString)); + data = "0x" + Util.parseMethod(selector, paramString); param.addProperty("gas", "0x245498"); param.addProperty("value", "0x1389"); param.addProperty("tokenId", Long.valueOf(jsonRpcAssetId)); @@ -247,9 +258,10 @@ public void triggerContract() throws Exception { logger.info("transactionString : " + transactionString); String transactionSignString = HttpMethed.gettransactionsign(httpFullNode, transactionString, jsonRpcOwnerKey); - + logger.info("transactionSignString:" + transactionSignString); responseContent = HttpMethed.parseStringContent(transactionString); txid = responseContent.getString("txID"); + logger.info("triggerTxid:" + txid); response = HttpMethed.broadcastTransaction(httpFullNode, transactionSignString); logger.info("response:" + response); @@ -301,7 +313,16 @@ public void deployTrc20Contract() throws InterruptedException { blockingStubFull); PublicMethed.waitProduceNextBlock(blockingStubFull); - logger.info(deployTrc20Txid); + logger.info("deployTrc20Txid:" + deployTrc20Txid); + response = HttpMethed.getTransactionById(httpFullNode, deployTrc20Txid); + responseContent = HttpMethed.parseResponseContent(response); + HttpMethed.printJsonContent(responseContent); + org.junit.Assert.assertTrue(!responseContent.getString("contract_address").isEmpty()); + contractTrc20AddressFrom58 = responseContent.getString("contract_address"); + logger.info("contractTrc20AddressFrom58:" + contractTrc20AddressFrom58); + + // NewFilterId = createNewFilterId(); + Optional infoById = PublicMethed.getTransactionInfoById(deployTrc20Txid, blockingStubFull); diff --git a/framework/src/test/java/stest/tron/wallet/common/client/utils/PublicMethed.java b/framework/src/test/java/stest/tron/wallet/common/client/utils/PublicMethed.java index fe7ceda6758..04ee5b487de 100644 --- a/framework/src/test/java/stest/tron/wallet/common/client/utils/PublicMethed.java +++ b/framework/src/test/java/stest/tron/wallet/common/client/utils/PublicMethed.java @@ -12,6 +12,7 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; import io.netty.util.internal.StringUtil; + import java.io.BufferedReader; import java.io.File; import java.io.FileReader; @@ -29,6 +30,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.regex.Matcher; import java.util.regex.Pattern; + import org.apache.commons.lang3.StringUtils; import org.bouncycastle.util.encoders.Hex; import org.slf4j.Logger; @@ -139,25 +141,45 @@ public class PublicMethed { - //Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); + // Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); private static final String FilePath = "Wallet"; private static final Logger logger = LoggerFactory.getLogger("TestLogger"); - //private WalletGrpc.WalletBlockingStub blockingStubFull = null; - //private WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubSolidity = null; + // private WalletGrpc.WalletBlockingStub blockingStubFull = null; + // private WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubSolidity = null; public static Map utxoMapNote = new ConcurrentHashMap(); public static List spendUtxoList = new ArrayList<>(); private static List walletFile = new ArrayList<>(); private static ShieldWrapper shieldWrapper = new ShieldWrapper(); Wallet wallet = new Wallet(); - - /** - * constructor. - */ - - public static String createAssetIssueGetTxid(byte[] address, String name, String abbreviation, - Long totalSupply, Integer trxNum, Integer icoNum, Long startTime, Long endTime, - Integer voteScore, String description, String url, Long freeAssetNetLimit, - Long publicFreeAssetNetLimit, Long fronzenAmount, Long frozenDay, String priKey, + public static volatile Integer witnessNum; + + /** constructor. */ + public static Integer getWitnessNum(WalletGrpc.WalletBlockingStub blockingStubFull) { + if (null == witnessNum) { + witnessNum = PublicMethed.listWitnesses(blockingStubFull).get().getWitnessesList().size(); + } + + return witnessNum; + } + + /** constructor. */ + public static String createAssetIssueGetTxid( + byte[] address, + String name, + String abbreviation, + Long totalSupply, + Integer trxNum, + Integer icoNum, + Long startTime, + Long endTime, + Integer voteScore, + String description, + String url, + Long freeAssetNetLimit, + Long publicFreeAssetNetLimit, + Long fronzenAmount, + Long frozenDay, + String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; @@ -183,8 +205,8 @@ public static String createAssetIssueGetTxid(byte[] address, String name, String builder.setUrl(ByteString.copyFrom(url.getBytes())); builder.setFreeAssetNetLimit(freeAssetNetLimit); builder.setPublicFreeAssetNetLimit(publicFreeAssetNetLimit); - AssetIssueContract.FrozenSupply.Builder frozenBuilder = AssetIssueContract.FrozenSupply - .newBuilder(); + AssetIssueContract.FrozenSupply.Builder frozenBuilder = + AssetIssueContract.FrozenSupply.newBuilder(); frozenBuilder.setFrozenAmount(fronzenAmount); frozenBuilder.setFrozenDays(frozenDay); builder.addFrozenSupply(0, frozenBuilder); @@ -198,8 +220,9 @@ public static String createAssetIssueGetTxid(byte[] address, String name, String GrpcAPI.Return response = broadcastTransaction(transaction, blockingStubFull); - return ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), + return ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), transaction.getRawData().toByteArray())); } catch (Exception ex) { ex.printStackTrace(); @@ -207,14 +230,23 @@ public static String createAssetIssueGetTxid(byte[] address, String name, String } } - - /** - * constructor. - */ - public static Boolean createAssetIssue(byte[] address, String name, Long totalSupply, - Integer trxNum, Integer icoNum, Long startTime, Long endTime, Integer voteScore, - String description, String url, Long freeAssetNetLimit, Long publicFreeAssetNetLimit, - Long fronzenAmount, Long frozenDay, String priKey, + /** constructor. */ + public static Boolean createAssetIssue( + byte[] address, + String name, + Long totalSupply, + Integer trxNum, + Integer icoNum, + Long startTime, + Long endTime, + Integer voteScore, + String description, + String url, + Long freeAssetNetLimit, + Long publicFreeAssetNetLimit, + Long fronzenAmount, + Long frozenDay, + String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; @@ -239,8 +271,8 @@ public static Boolean createAssetIssue(byte[] address, String name, Long totalSu builder.setUrl(ByteString.copyFrom(url.getBytes())); builder.setFreeAssetNetLimit(freeAssetNetLimit); builder.setPublicFreeAssetNetLimit(publicFreeAssetNetLimit); - AssetIssueContract.FrozenSupply.Builder frozenBuilder = AssetIssueContract.FrozenSupply - .newBuilder(); + AssetIssueContract.FrozenSupply.Builder frozenBuilder = + AssetIssueContract.FrozenSupply.newBuilder(); frozenBuilder.setFrozenAmount(fronzenAmount); frozenBuilder.setFrozenDays(frozenDay); builder.addFrozenSupply(0, frozenBuilder); @@ -261,14 +293,24 @@ public static Boolean createAssetIssue(byte[] address, String name, Long totalSu } } - /** - * constructor. - */ - - public static Boolean createAssetIssue(byte[] address, String name, String abbreviation, - Long totalSupply, Integer trxNum, Integer icoNum, Long startTime, Long endTime, - Integer voteScore, String description, String url, Long freeAssetNetLimit, - Long publicFreeAssetNetLimit, Long fronzenAmount, Long frozenDay, String priKey, + /** constructor. */ + public static Boolean createAssetIssue( + byte[] address, + String name, + String abbreviation, + Long totalSupply, + Integer trxNum, + Integer icoNum, + Long startTime, + Long endTime, + Integer voteScore, + String description, + String url, + Long freeAssetNetLimit, + Long publicFreeAssetNetLimit, + Long fronzenAmount, + Long frozenDay, + String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; @@ -294,8 +336,8 @@ public static Boolean createAssetIssue(byte[] address, String name, String abbre builder.setUrl(ByteString.copyFrom(url.getBytes())); builder.setFreeAssetNetLimit(freeAssetNetLimit); builder.setPublicFreeAssetNetLimit(publicFreeAssetNetLimit); - AssetIssueContract.FrozenSupply.Builder frozenBuilder = AssetIssueContract.FrozenSupply - .newBuilder(); + AssetIssueContract.FrozenSupply.Builder frozenBuilder = + AssetIssueContract.FrozenSupply.newBuilder(); frozenBuilder.setFrozenAmount(fronzenAmount); frozenBuilder.setFrozenDays(frozenDay); builder.addFrozenSupply(0, frozenBuilder); @@ -316,14 +358,24 @@ public static Boolean createAssetIssue(byte[] address, String name, String abbre } } - /** - * constructor. - */ - - public static Boolean createAssetIssue(byte[] address, String name, Long totalSupply, - Integer trxNum, Integer icoNum, int precision, Long startTime, Long endTime, - Integer voteScore, String description, String url, Long freeAssetNetLimit, - Long publicFreeAssetNetLimit, Long fronzenAmount, Long frozenDay, String priKey, + /** constructor. */ + public static Boolean createAssetIssue( + byte[] address, + String name, + Long totalSupply, + Integer trxNum, + Integer icoNum, + int precision, + Long startTime, + Long endTime, + Integer voteScore, + String description, + String url, + Long freeAssetNetLimit, + Long publicFreeAssetNetLimit, + Long fronzenAmount, + Long frozenDay, + String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; @@ -349,8 +401,8 @@ public static Boolean createAssetIssue(byte[] address, String name, Long totalSu builder.setUrl(ByteString.copyFrom(url.getBytes())); builder.setFreeAssetNetLimit(freeAssetNetLimit); builder.setPublicFreeAssetNetLimit(publicFreeAssetNetLimit); - AssetIssueContract.FrozenSupply.Builder frozenBuilder = AssetIssueContract.FrozenSupply - .newBuilder(); + AssetIssueContract.FrozenSupply.Builder frozenBuilder = + AssetIssueContract.FrozenSupply.newBuilder(); frozenBuilder.setFrozenAmount(fronzenAmount); frozenBuilder.setFrozenDays(frozenDay); builder.addFrozenSupply(0, frozenBuilder); @@ -371,14 +423,23 @@ public static Boolean createAssetIssue(byte[] address, String name, Long totalSu } } - /** - * constructor. - */ - - public static Return createAssetIssue2(byte[] address, String name, Long totalSupply, - Integer trxNum, Integer icoNum, Long startTime, Long endTime, Integer voteScore, - String description, String url, Long freeAssetNetLimit, Long publicFreeAssetNetLimit, - Long fronzenAmount, Long frozenDay, String priKey, + /** constructor. */ + public static Return createAssetIssue2( + byte[] address, + String name, + Long totalSupply, + Integer trxNum, + Integer icoNum, + Long startTime, + Long endTime, + Integer voteScore, + String description, + String url, + Long freeAssetNetLimit, + Long publicFreeAssetNetLimit, + Long fronzenAmount, + Long frozenDay, + String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; @@ -389,7 +450,7 @@ public static Return createAssetIssue2(byte[] address, String name, Long totalSu ex.printStackTrace(); } ECKey ecKey = temKey; - //Protocol.Account search = queryAccount(ecKey, blockingStubFull); + // Protocol.Account search = queryAccount(ecKey, blockingStubFull); try { AssetIssueContract.Builder builder = AssetIssueContract.newBuilder(); builder.setOwnerAddress(ByteString.copyFrom(address)); @@ -404,16 +465,16 @@ public static Return createAssetIssue2(byte[] address, String name, Long totalSu builder.setUrl(ByteString.copyFrom(url.getBytes())); builder.setFreeAssetNetLimit(freeAssetNetLimit); builder.setPublicFreeAssetNetLimit(publicFreeAssetNetLimit); - //builder.setPublicFreeAssetNetUsage(); - //builder.setPublicLatestFreeNetTime(); - AssetIssueContract.FrozenSupply.Builder frozenBuilder = AssetIssueContract.FrozenSupply - .newBuilder(); + // builder.setPublicFreeAssetNetUsage(); + // builder.setPublicLatestFreeNetTime(); + AssetIssueContract.FrozenSupply.Builder frozenBuilder = + AssetIssueContract.FrozenSupply.newBuilder(); frozenBuilder.setFrozenAmount(fronzenAmount); frozenBuilder.setFrozenDays(frozenDay); builder.addFrozenSupply(0, frozenBuilder); - TransactionExtention transactionExtention = blockingStubFull - .createAssetIssue2(builder.build()); + TransactionExtention transactionExtention = + blockingStubFull.createAssetIssue2(builder.build()); if (transactionExtention == null) { return transactionExtention.getResult(); @@ -449,42 +510,32 @@ public static Return createAssetIssue2(byte[] address, String name, Long totalSu return ret; } catch (Exception ex) { ex.printStackTrace(); - //return false; + // return false; return Return.getDefaultInstance(); } } - /** - * constructor. - */ - - public static Account queryAccountByAddress(byte[] address, - WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static Account queryAccountByAddress( + byte[] address, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ByteString addressBs = ByteString.copyFrom(address); Account request = Account.newBuilder().setAddress(addressBs).build(); return blockingStubFull.getAccount(request); } - /** - * constructor. - */ - - public static Account queryAccount(byte[] address, - WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static Account queryAccount( + byte[] address, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ByteString addressBs = ByteString.copyFrom(address); Account request = Account.newBuilder().setAddress(addressBs).build(); return blockingStubFull.getAccount(request); } - - /** - * constructor. - */ - - public static Protocol.Account queryAccount(String priKey, - WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static Protocol.Account queryAccount( + String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); byte[] address; ECKey temKey = null; @@ -496,7 +547,7 @@ public static Protocol.Account queryAccount(String priKey, } ECKey ecKey = temKey; if (ecKey == null) { - String pubKey = loadPubKey(); //04 PubKey[128] + String pubKey = loadPubKey(); // 04 PubKey[128] if (StringUtils.isEmpty(pubKey)) { logger.warn("Warning: QueryAccount failed, no wallet address !!"); return null; @@ -508,138 +559,116 @@ public static Protocol.Account queryAccount(String priKey, return grpcQueryAccount(ecKey.getAddress(), blockingStubFull); } - /** - * constructor. - */ - public static Account queryAccount(byte[] address, - WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubFull) { + /** constructor. */ + public static Account queryAccount( + byte[] address, WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ByteString addressBs = ByteString.copyFrom(address); Account request = Account.newBuilder().setAddress(addressBs).build(); return blockingStubFull.getAccount(request); } - /** - * constructor. - */ - - public static Account getAccountById(String accountId, - WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static Account getAccountById( + String accountId, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ByteString bsAccountId = ByteString.copyFromUtf8(accountId); Account request = Account.newBuilder().setAccountId(bsAccountId).build(); return blockingStubFull.getAccountById(request); } - /** - * constructor. - */ - - public static Account getAccountByIdFromSolidity(String accountId, - WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubFull) { + /** constructor. */ + public static Account getAccountByIdFromSolidity( + String accountId, WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ByteString bsAccountId = ByteString.copyFromUtf8(accountId); Account request = Account.newBuilder().setAccountId(bsAccountId).build(); return blockingStubFull.getAccountById(request); } - /** - * constructor. - */ + /** constructor. */ public static String loadPubKey() { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); char[] buf = new char[0x100]; return String.valueOf(buf, 32, 130); } - /** - * constructor. - */ - + /** constructor. */ public static byte[] getAddress(ECKey ecKey) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); return ecKey.getAddress(); } - /** - * constructor. - */ - - public static Protocol.Account grpcQueryAccount(byte[] address, - WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static Protocol.Account grpcQueryAccount( + byte[] address, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ByteString addressBs = ByteString.copyFrom(address); Protocol.Account request = Protocol.Account.newBuilder().setAddress(addressBs).build(); return blockingStubFull.getAccount(request); } - /** - * constructor. - */ - - public static Protocol.Block getBlock(long blockNum, - WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static Protocol.Block getBlock( + long blockNum, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); GrpcAPI.NumberMessage.Builder builder = GrpcAPI.NumberMessage.newBuilder(); builder.setNum(blockNum); return blockingStubFull.getBlockByNum(builder.build()); } - /** - * constructor. - */ - - public static BlockExtention getBlock2(long blockNum, - WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static BlockExtention getBlock2(long blockNum, WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); GrpcAPI.NumberMessage.Builder builder = GrpcAPI.NumberMessage.newBuilder(); builder.setNum(blockNum); return blockingStubFull.getBlockByNum2(builder.build()); } - /** - * constructor. - */ - - public static Protocol.Transaction signTransaction(ECKey ecKey, - Protocol.Transaction transaction) { + /** constructor. */ + public static Protocol.Transaction signTransaction( + ECKey ecKey, Protocol.Transaction transaction) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); if (ecKey == null || ecKey.getPrivKey() == null) { - //logger.warn("Warning: Can't sign,there is no private key !!"); + // logger.warn("Warning: Can't sign,there is no private key !!"); return null; } transaction = TransactionUtils.setTimestamp(transaction); - logger.info("Txid in sign is " + ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), - transaction.getRawData().toByteArray()))); + logger.info( + "Txid in sign is " + + ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), + transaction.getRawData().toByteArray()))); return TransactionUtils.sign(transaction, ecKey); } - /** - * constructor. - */ - - public static Protocol.Transaction signTransactionForShield(ECKey ecKey, - Protocol.Transaction transaction) { + /** constructor. */ + public static Protocol.Transaction signTransactionForShield( + ECKey ecKey, Protocol.Transaction transaction) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); if (ecKey == null || ecKey.getPrivKey() == null) { - //logger.warn("Warning: Can't sign,there is no private key !!"); + // logger.warn("Warning: Can't sign,there is no private key !!"); return null; } - logger.info("Txid in sign is " + ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), - transaction.getRawData().toByteArray()))); + logger.info( + "Txid in sign is " + + ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), + transaction.getRawData().toByteArray()))); return TransactionUtils.sign(transaction, ecKey); } - - /** - * constructor. - */ - - public static boolean participateAssetIssue(byte[] to, byte[] assertName, long amount, - byte[] from, String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static boolean participateAssetIssue( + byte[] to, + byte[] assertName, + long amount, + byte[] from, + String priKey, + WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; try { @@ -665,12 +694,14 @@ public static boolean participateAssetIssue(byte[] to, byte[] assertName, long a return response.getResult(); } - /** - * constructor. - */ - - public static Return participateAssetIssue2(byte[] to, byte[] assertName, long amount, - byte[] from, String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static Return participateAssetIssue2( + byte[] to, + byte[] assertName, + long amount, + byte[] from, + String priKey, + WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; try { @@ -709,7 +740,7 @@ public static Return participateAssetIssue2(byte[] to, byte[] assertName, long a System.out.println( "Receive txid = " + ByteArray.toHexString(transactionExtention.getTxid().toByteArray())); - //Protocol.Transaction transaction = blockingStubFull.participateAssetIssue(contract); + // Protocol.Transaction transaction = blockingStubFull.participateAssetIssue(contract); transaction = signTransaction(ecKey, transaction); GrpcAPI.Return response = broadcastTransaction(transaction, blockingStubFull); @@ -720,17 +751,18 @@ public static Return participateAssetIssue2(byte[] to, byte[] assertName, long a } } - /** - * constructor. - */ - - public static Boolean freezeBalance(byte[] addRess, long freezeBalance, long freezeDuration, - String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static Boolean freezeBalance( + byte[] addRess, + long freezeBalance, + long freezeDuration, + String priKey, + WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); byte[] address = addRess; long frozenBalance = freezeBalance; long frozenDuration = freezeDuration; - //String priKey = testKey002; + // String priKey = testKey002; ECKey temKey = null; try { BigInteger priK = new BigInteger(priKey, 16); @@ -739,23 +771,25 @@ public static Boolean freezeBalance(byte[] addRess, long freezeBalance, long fre ex.printStackTrace(); } final ECKey ecKey = temKey; - Protocol.Block currentBlock = blockingStubFull - .getNowBlock(GrpcAPI.EmptyMessage.newBuilder().build()); + Protocol.Block currentBlock = + blockingStubFull.getNowBlock(GrpcAPI.EmptyMessage.newBuilder().build()); final Long beforeBlockNum = currentBlock.getBlockHeader().getRawData().getNumber(); Protocol.Account beforeFronzen = queryAccount(priKey, blockingStubFull); Long beforeFrozenBalance = 0L; - //Long beforeBandwidth = beforeFronzen.getBandwidth(); + // Long beforeBandwidth = beforeFronzen.getBandwidth(); if (beforeFronzen.getFrozenCount() != 0) { beforeFrozenBalance = beforeFronzen.getFrozen(0).getFrozenBalance(); - //beforeBandwidth = beforeFronzen.getBandwidth(); - //logger.info(Long.toString(beforeFronzen.getBandwidth())); + // beforeBandwidth = beforeFronzen.getBandwidth(); + // logger.info(Long.toString(beforeFronzen.getBandwidth())); logger.info(Long.toString(beforeFronzen.getFrozen(0).getFrozenBalance())); } FreezeBalanceContract.Builder builder = FreezeBalanceContract.newBuilder(); ByteString byteAddreess = ByteString.copyFrom(address); - builder.setOwnerAddress(byteAddreess).setFrozenBalance(frozenBalance) + builder + .setOwnerAddress(byteAddreess) + .setFrozenBalance(frozenBalance) .setFrozenDuration(frozenDuration); FreezeBalanceContract contract = builder.build(); @@ -787,17 +821,18 @@ public static Boolean freezeBalance(byte[] addRess, long freezeBalance, long fre Assert.assertTrue(afterFrozenBalance - beforeFrozenBalance == freezeBalance);*/ } - /** - * constructor. - */ - - public static Return freezeBalance2(byte[] addRess, long freezeBalance, long freezeDuration, - String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static Return freezeBalance2( + byte[] addRess, + long freezeBalance, + long freezeDuration, + String priKey, + WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); byte[] address = addRess; long frozenBalance = freezeBalance; long frozenDuration = freezeDuration; - //String priKey = testKey002; + // String priKey = testKey002; ECKey temKey = null; try { BigInteger priK = new BigInteger(priKey, 16); @@ -806,23 +841,25 @@ public static Return freezeBalance2(byte[] addRess, long freezeBalance, long fre ex.printStackTrace(); } final ECKey ecKey = temKey; - Protocol.Block currentBlock = blockingStubFull - .getNowBlock(GrpcAPI.EmptyMessage.newBuilder().build()); + Protocol.Block currentBlock = + blockingStubFull.getNowBlock(GrpcAPI.EmptyMessage.newBuilder().build()); final Long beforeBlockNum = currentBlock.getBlockHeader().getRawData().getNumber(); Protocol.Account beforeFronzen = queryAccount(priKey, blockingStubFull); Long beforeFrozenBalance = 0L; - //Long beforeBandwidth = beforeFronzen.getBandwidth(); + // Long beforeBandwidth = beforeFronzen.getBandwidth(); if (beforeFronzen.getFrozenCount() != 0) { beforeFrozenBalance = beforeFronzen.getFrozen(0).getFrozenBalance(); - //beforeBandwidth = beforeFronzen.getBandwidth(); - //logger.info(Long.toString(beforeFronzen.getBandwidth())); + // beforeBandwidth = beforeFronzen.getBandwidth(); + // logger.info(Long.toString(beforeFronzen.getBandwidth())); logger.info(Long.toString(beforeFronzen.getFrozen(0).getFrozenBalance())); } FreezeBalanceContract.Builder builder = FreezeBalanceContract.newBuilder(); ByteString byteAddreess = ByteString.copyFrom(address); - builder.setOwnerAddress(byteAddreess).setFrozenBalance(frozenBalance) + builder + .setOwnerAddress(byteAddreess) + .setFrozenBalance(frozenBalance) .setFrozenDuration(frozenDuration); FreezeBalanceContract contract = builder.build(); @@ -859,8 +896,8 @@ public static Return freezeBalance2(byte[] addRess, long freezeBalance, long fre Long afterBlockNum = 0L; while (afterBlockNum < beforeBlockNum) { - Protocol.Block currentBlock1 = blockingStubFull - .getNowBlock(GrpcAPI.EmptyMessage.newBuilder().build()); + Protocol.Block currentBlock1 = + blockingStubFull.getNowBlock(GrpcAPI.EmptyMessage.newBuilder().build()); afterBlockNum = currentBlock1.getBlockHeader().getRawData().getNumber(); } @@ -868,18 +905,21 @@ public static Return freezeBalance2(byte[] addRess, long freezeBalance, long fre Long afterFrozenBalance = afterFronzen.getFrozen(0).getFrozenBalance(); logger.info(Long.toString(afterFronzen.getFrozen(0).getFrozenBalance())); logger.info( - "beforefronen" + beforeFrozenBalance.toString() + " afterfronzen" + afterFrozenBalance - .toString()); + "beforefronen" + + beforeFrozenBalance.toString() + + " afterfronzen" + + afterFrozenBalance.toString()); Assert.assertTrue(afterFrozenBalance - beforeFrozenBalance == freezeBalance); return ret; } - /** - * constructor. - */ - - public static Boolean unFreezeBalance(byte[] address, String priKey, int resourceCode, - byte[] receiverAddress, WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static Boolean unFreezeBalance( + byte[] address, + String priKey, + int resourceCode, + byte[] receiverAddress, + WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; try { @@ -905,14 +945,15 @@ public static Boolean unFreezeBalance(byte[] address, String priKey, int resourc return response.getResult(); } - /** - * constructor. - */ - - public static Boolean sendcoin(byte[] to, long amount, byte[] owner, String priKey, + /** constructor. */ + public static Boolean sendcoin( + byte[] to, + long amount, + byte[] owner, + String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); - //String priKey = testKey002; + // String priKey = testKey002; ECKey temKey = null; try { BigInteger priK = new BigInteger(priKey, 16); @@ -945,12 +986,13 @@ public static Boolean sendcoin(byte[] to, long amount, byte[] owner, String priK return false; } - /** - * constructor. - */ - - public static String sendcoinGetTransactionHex(byte[] to, long amount, byte[] owner, - String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static String sendcoinGetTransactionHex( + byte[] to, + long amount, + byte[] owner, + String priKey, + WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; try { @@ -974,21 +1016,18 @@ public static String sendcoinGetTransactionHex(byte[] to, long amount, byte[] ow if (transaction == null || transaction.getRawData().getContractCount() == 0) { logger.info("transaction ==null"); return null; - } transaction = signTransaction(ecKey, transaction); - logger.info("HEX transaction is : " + "transaction hex string is " + ByteArray - .toHexString(transaction.toByteArray())); + logger.info( + "HEX transaction is : " + + "transaction hex string is " + + ByteArray.toHexString(transaction.toByteArray())); return ByteArray.toHexString(transaction.toByteArray()); } - - /** - * constructor. - */ - - public static Boolean cancelDeferredTransactionById(String txid, byte[] owner, String priKey, - WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static Boolean cancelDeferredTransactionById( + String txid, byte[] owner, String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; try { @@ -1034,12 +1073,9 @@ public static Boolean cancelDeferredTransactionById(String txid, byte[] owner, S return null; } - /** - * constructor. - */ - - public static String cancelDeferredTransactionByIdGetTxid(String txid, byte[] owner, - String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static String cancelDeferredTransactionByIdGetTxid( + String txid, byte[] owner, String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; try { @@ -1052,13 +1088,14 @@ public static String cancelDeferredTransactionByIdGetTxid(String txid, byte[] ow return null; } - - /** - * constructor. - */ - - public static Boolean sendcoinDelayed(byte[] to, long amount, long delaySeconds, byte[] owner, - String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static Boolean sendcoinDelayed( + byte[] to, + long amount, + long delaySeconds, + byte[] owner, + String priKey, + WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; try { @@ -1079,26 +1116,31 @@ public static Boolean sendcoinDelayed(byte[] to, long amount, long delaySeconds, TransferContract contract = builder.build(); Protocol.Transaction transaction = blockingStubFull.createTransaction(contract); - //transaction = TransactionUtils.setDelaySeconds(transaction, delaySeconds); + // transaction = TransactionUtils.setDelaySeconds(transaction, delaySeconds); if (transaction == null || transaction.getRawData().getContractCount() == 0) { logger.info("transaction ==null"); return false; } transaction = signTransaction(ecKey, transaction); - logger.info("Txid is " + ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), - transaction.getRawData().toByteArray()))); + logger.info( + "Txid is " + + ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), + transaction.getRawData().toByteArray()))); GrpcAPI.Return response = broadcastTransaction(transaction, blockingStubFull); return response.getResult(); } - /** - * constructor. - */ - - public static boolean transferAssetDelay(byte[] to, byte[] assertName, long amount, - long delaySeconds, byte[] address, String priKey, + /** constructor. */ + public static boolean transferAssetDelay( + byte[] to, + byte[] assertName, + long amount, + long delaySeconds, + byte[] address, + String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; @@ -1121,7 +1163,7 @@ public static boolean transferAssetDelay(byte[] to, byte[] assertName, long amou TransferAssetContract contract = builder.build(); Protocol.Transaction transaction = blockingStubFull.transferAsset(contract); - //transaction = TransactionUtils.setDelaySeconds(transaction, delaySeconds); + // transaction = TransactionUtils.setDelaySeconds(transaction, delaySeconds); if (transaction == null || transaction.getRawData().getContractCount() == 0) { if (transaction == null) { @@ -1132,19 +1174,23 @@ public static boolean transferAssetDelay(byte[] to, byte[] assertName, long amou return false; } transaction = signTransaction(ecKey, transaction); - logger.info("Txid is " + ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), - transaction.getRawData().toByteArray()))); + logger.info( + "Txid is " + + ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), + transaction.getRawData().toByteArray()))); GrpcAPI.Return response = broadcastTransaction(transaction, blockingStubFull); return response.getResult(); } - /** - * constructor. - */ - - public static String createAccountDelayGetTxid(byte[] ownerAddress, byte[] newAddress, - Long delaySeconds, String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static String createAccountDelayGetTxid( + byte[] ownerAddress, + byte[] newAddress, + Long delaySeconds, + String priKey, + WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; try { @@ -1161,26 +1207,31 @@ public static String createAccountDelayGetTxid(byte[] ownerAddress, byte[] newAd builder.setAccountAddress(ByteString.copyFrom(newAddress)); AccountCreateContract contract = builder.build(); Transaction transaction = blockingStubFull.createAccount(contract); - //transaction = TransactionUtils.setDelaySeconds(transaction, delaySeconds); + // transaction = TransactionUtils.setDelaySeconds(transaction, delaySeconds); if (transaction == null || transaction.getRawData().getContractCount() == 0) { logger.info("transaction == null"); } transaction = signTransaction(ecKey, transaction); - logger.info("Txid is " + ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), - transaction.getRawData().toByteArray()))); + logger.info( + "Txid is " + + ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), + transaction.getRawData().toByteArray()))); GrpcAPI.Return response = broadcastTransaction(transaction, blockingStubFull); - return ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), + return ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), transaction.getRawData().toByteArray())); } - /** - * constructor. - */ - - public static String updateAccountDelayGetTxid(byte[] addressBytes, byte[] accountNameBytes, - Long delaySeconds, String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static String updateAccountDelayGetTxid( + byte[] addressBytes, + byte[] accountNameBytes, + Long delaySeconds, + String priKey, + WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; try { @@ -1200,26 +1251,30 @@ public static String updateAccountDelayGetTxid(byte[] addressBytes, byte[] accou AccountUpdateContract contract = builder.build(); Protocol.Transaction transaction = blockingStubFull.updateAccount(contract); - //transaction = TransactionUtils.setDelaySeconds(transaction, delaySeconds); + // transaction = TransactionUtils.setDelaySeconds(transaction, delaySeconds); if (transaction == null || transaction.getRawData().getContractCount() == 0) { logger.info("Please check!!! transaction == null"); return null; } transaction = signTransaction(ecKey, transaction); - logger.info("Txid is " + ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), - transaction.getRawData().toByteArray()))); + logger.info( + "Txid is " + + ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), + transaction.getRawData().toByteArray()))); GrpcAPI.Return response = broadcastTransaction(transaction, blockingStubFull); - return ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), + return ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), transaction.getRawData().toByteArray())); } - /** - * constructor. - */ - - public static String unfreezeAssetDelayGetTxid(byte[] address, Long delaySeconds, String priKey, + /** constructor. */ + public static String unfreezeAssetDelayGetTxid( + byte[] address, + Long delaySeconds, + String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; @@ -1237,28 +1292,33 @@ public static String unfreezeAssetDelayGetTxid(byte[] address, Long delaySeconds UnfreezeAssetContract contract = builder.build(); Protocol.Transaction transaction = blockingStubFull.unfreezeAsset(contract); - //transaction = TransactionUtils.setDelaySeconds(transaction, delaySeconds); + // transaction = TransactionUtils.setDelaySeconds(transaction, delaySeconds); if (transaction == null || transaction.getRawData().getContractCount() == 0) { logger.info("Please check!!! transaction == null"); return null; } transaction = signTransaction(ecKey, transaction); - logger.info("Txid is " + ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), - transaction.getRawData().toByteArray()))); + logger.info( + "Txid is " + + ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), + transaction.getRawData().toByteArray()))); GrpcAPI.Return response = broadcastTransaction(transaction, blockingStubFull); - return ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), + return ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), transaction.getRawData().toByteArray())); } - - /** - * constructor. - */ - - public static String transferAssetDelayGetTxid(byte[] to, byte[] assertName, long amount, - long delaySeconds, byte[] address, String priKey, + /** constructor. */ + public static String transferAssetDelayGetTxid( + byte[] to, + byte[] assertName, + long amount, + long delaySeconds, + byte[] address, + String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; @@ -1281,7 +1341,7 @@ public static String transferAssetDelayGetTxid(byte[] to, byte[] assertName, lon TransferAssetContract contract = builder.build(); Protocol.Transaction transaction = blockingStubFull.transferAsset(contract); - //transaction = TransactionUtils.setDelaySeconds(transaction, delaySeconds); + // transaction = TransactionUtils.setDelaySeconds(transaction, delaySeconds); if (transaction == null || transaction.getRawData().getContractCount() == 0) { if (transaction == null) { @@ -1292,22 +1352,27 @@ public static String transferAssetDelayGetTxid(byte[] to, byte[] assertName, lon return null; } transaction = signTransaction(ecKey, transaction); - logger.info("Txid is " + ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), - transaction.getRawData().toByteArray()))); + logger.info( + "Txid is " + + ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), + transaction.getRawData().toByteArray()))); GrpcAPI.Return response = broadcastTransaction(transaction, blockingStubFull); - return ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), + return ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), transaction.getRawData().toByteArray())); } - - /** - * constructor. - */ - - public static String sendcoinDelayedGetTxid(byte[] to, long amount, long delaySeconds, - byte[] owner, String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static String sendcoinDelayedGetTxid( + byte[] to, + long amount, + long delaySeconds, + byte[] owner, + String priKey, + WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; try { @@ -1328,28 +1393,33 @@ public static String sendcoinDelayedGetTxid(byte[] to, long amount, long delaySe TransferContract contract = builder.build(); Protocol.Transaction transaction = blockingStubFull.createTransaction(contract); - //transaction = TransactionUtils.setDelaySeconds(transaction, delaySeconds); + // transaction = TransactionUtils.setDelaySeconds(transaction, delaySeconds); if (transaction == null || transaction.getRawData().getContractCount() == 0) { logger.info("transaction ==null"); return null; } transaction = signTransaction(ecKey, transaction); - logger.info("Txid is " + ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), - transaction.getRawData().toByteArray()))); + logger.info( + "Txid is " + + ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), + transaction.getRawData().toByteArray()))); GrpcAPI.Return response = broadcastTransaction(transaction, blockingStubFull); - return ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), + return ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), transaction.getRawData().toByteArray())); } - /** - * constructor. - */ - - public static String setAccountIdDelayGetTxid(byte[] accountIdBytes, long delaySeconds, - byte[] ownerAddress, String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static String setAccountIdDelayGetTxid( + byte[] accountIdBytes, + long delaySeconds, + byte[] ownerAddress, + String priKey, + WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; try { @@ -1368,29 +1438,35 @@ public static String setAccountIdDelayGetTxid(byte[] accountIdBytes, long delayS builder.setOwnerAddress(bsAddress); SetAccountIdContract contract = builder.build(); Transaction transaction = blockingStubFull.setAccountId(contract); - //transaction = TransactionUtils.setDelaySeconds(transaction, delaySeconds); + // transaction = TransactionUtils.setDelaySeconds(transaction, delaySeconds); if (transaction == null || transaction.getRawData().getContractCount() == 0) { logger.info("transaction == null"); } transaction = signTransaction(ecKey, transaction); - logger.info("Txid is " + ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), - transaction.getRawData().toByteArray()))); + logger.info( + "Txid is " + + ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), + transaction.getRawData().toByteArray()))); GrpcAPI.Return response = broadcastTransaction(transaction, blockingStubFull); - return ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), + return ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), transaction.getRawData().toByteArray())); } - - /** - * constructor. - */ - - public static String updateAssetDelay(byte[] address, byte[] description, byte[] url, - long newLimit, long newPublicLimit, long delaySeconds, String priKey, + /** constructor. */ + public static String updateAssetDelay( + byte[] address, + byte[] description, + byte[] url, + long newLimit, + long newPublicLimit, + long delaySeconds, + String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; @@ -1411,27 +1487,31 @@ public static String updateAssetDelay(byte[] address, byte[] description, byte[] UpdateAssetContract contract = builder.build(); Protocol.Transaction transaction = blockingStubFull.updateAsset(contract); - //transaction = TransactionUtils.setDelaySeconds(transaction, delaySeconds); + // transaction = TransactionUtils.setDelaySeconds(transaction, delaySeconds); if (transaction == null || transaction.getRawData().getContractCount() == 0) { return null; } transaction = signTransaction(ecKey, transaction); - logger.info("Txid is " + ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), - transaction.getRawData().toByteArray()))); + logger.info( + "Txid is " + + ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), + transaction.getRawData().toByteArray()))); GrpcAPI.Return response = broadcastTransaction(transaction, blockingStubFull); - return ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), + return ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), transaction.getRawData().toByteArray())); } - - /** - * constructor. - */ - - public static Return sendcoin2(byte[] to, long amount, byte[] owner, String priKey, + /** constructor. */ + public static Return sendcoin2( + byte[] to, + long amount, + byte[] owner, + String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; @@ -1442,7 +1522,7 @@ public static Return sendcoin2(byte[] to, long amount, byte[] owner, String priK ex.printStackTrace(); } final ECKey ecKey = temKey; - //Protocol.Account search = queryAccount(priKey, blockingStubFull); + // Protocol.Account search = queryAccount(priKey, blockingStubFull); TransferContract.Builder builder = TransferContract.newBuilder(); ByteString bsTo = ByteString.copyFrom(to); @@ -1484,14 +1564,15 @@ public static Return sendcoin2(byte[] to, long amount, byte[] owner, String priK return ret; } - /** - * constructor. - */ - - public static String sendcoinGetTransactionId(byte[] to, long amount, byte[] owner, String priKey, + /** constructor. */ + public static String sendcoinGetTransactionId( + byte[] to, + long amount, + byte[] owner, + String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); - //String priKey = testKey002; + // String priKey = testKey002; ECKey temKey = null; try { BigInteger priK = new BigInteger(priKey, 16); @@ -1500,7 +1581,7 @@ public static String sendcoinGetTransactionId(byte[] to, long amount, byte[] own ex.printStackTrace(); } final ECKey ecKey = temKey; - //Protocol.Account search = queryAccount(priKey, blockingStubFull); + // Protocol.Account search = queryAccount(priKey, blockingStubFull); TransferContract.Builder builder = TransferContract.newBuilder(); ByteString bsTo = ByteString.copyFrom(to); @@ -1515,7 +1596,7 @@ public static String sendcoinGetTransactionId(byte[] to, long amount, byte[] own logger.info("transaction ==null"); return null; } - //Test raw data + // Test raw data /* Protocol.Transaction.raw.Builder builder1 = transaction.getRawData().toBuilder(); builder1.setData(ByteString.copyFromUtf8("12345678")); Transaction.Builder builder2 = transaction.toBuilder(); @@ -1525,21 +1606,19 @@ public static String sendcoinGetTransactionId(byte[] to, long amount, byte[] own transaction = signTransaction(ecKey, transaction); GrpcAPI.Return response = broadcastTransaction(transaction, blockingStubFull); if (response.getResult() == false) { - //logger.info(ByteArray.toStr(response.getMessage().toByteArray())); + // logger.info(ByteArray.toStr(response.getMessage().toByteArray())); return null; } else { - return ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), + return ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), transaction.getRawData().toByteArray())); } } - /** - * constructor. - */ - - public static Optional getTransactionById(String txId, - WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubFull) { + /** constructor. */ + public static Optional getTransactionById( + String txId, WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubFull) { ByteString bsTxid = ByteString.copyFrom(ByteArray.fromHexString(txId)); BytesMessage request = BytesMessage.newBuilder().setValue(bsTxid).build(); Transaction transaction = blockingStubFull.getTransactionById(request); @@ -1547,23 +1626,18 @@ public static Optional getTransactionById(String txId, return Optional.ofNullable(transaction); } - /** - * constructor. - */ - - public static Optional getTransactionById(String txId, - WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static Optional getTransactionById( + String txId, WalletGrpc.WalletBlockingStub blockingStubFull) { ByteString bsTxid = ByteString.copyFrom(ByteArray.fromHexString(txId)); BytesMessage request = BytesMessage.newBuilder().setValue(bsTxid).build(); Transaction transaction = blockingStubFull.getTransactionById(request); return Optional.ofNullable(transaction); } - /** - * constructor. - */ - public static Long getAssetBalanceByAssetId(ByteString assetId, String priKey, - WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static Long getAssetBalanceByAssetId( + ByteString assetId, String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { Account assetOwnerAccount = queryAccount(priKey, blockingStubFull); Long assetOwnerAssetBalance = 0L; for (String id : assetOwnerAccount.getAssetV2Map().keySet()) { @@ -1575,7 +1649,6 @@ public static Long getAssetBalanceByAssetId(ByteString assetId, String priKey, return assetOwnerAssetBalance; } - /* public static Optional getDeferredTransactionById(String txId, WalletGrpc.WalletBlockingStub blockingStubFull) { @@ -1589,35 +1662,32 @@ public static Optional getDeferredTransactionById(String tx } */ - - /** - * constructor. - */ - - public static Optional getTransactionByIdSolidity(String txId, - WalletGrpc.WalletBlockingStub blockingStubSolidity) { + /** constructor. */ + public static Optional getTransactionByIdSolidity( + String txId, WalletGrpc.WalletBlockingStub blockingStubSolidity) { ByteString bsTxid = ByteString.copyFrom(ByteArray.fromHexString(txId)); BytesMessage request = BytesMessage.newBuilder().setValue(bsTxid).build(); Transaction transaction = blockingStubSolidity.getTransactionById(request); return Optional.ofNullable(transaction); } - /** - * constructor. - */ - + /** constructor. */ public static String printTransaction(Transaction transaction) { String result = ""; result += "hash: "; result += "\n"; - result += ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), transaction.toByteArray())); + result += + ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), transaction.toByteArray())); result += "\n"; result += "txid: "; result += "\n"; - result += ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), - transaction.getRawData().toByteArray())); + result += + ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), + transaction.getRawData().toByteArray())); result += "\n"; if (transaction.getRawData() != null) { @@ -1633,22 +1703,22 @@ public static String printTransaction(Transaction transaction) { return result; } - /** - * constructor. - */ - + /** constructor. */ public static long printTransactionRow(Transaction.raw raw) { long timestamp = raw.getTimestamp(); return timestamp; } - /** - * constructor. - */ - - public static boolean updateAsset(byte[] address, byte[] description, byte[] url, long newLimit, - long newPublicLimit, String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static boolean updateAsset( + byte[] address, + byte[] description, + byte[] url, + long newLimit, + long newPublicLimit, + String priKey, + WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; try { @@ -1678,12 +1748,15 @@ public static boolean updateAsset(byte[] address, byte[] description, byte[] url return response.getResult(); } - /** - * constructor. - */ - - public static Return updateAsset2(byte[] address, byte[] description, byte[] url, long newLimit, - long newPublicLimit, String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static Return updateAsset2( + byte[] address, + byte[] description, + byte[] url, + long newLimit, + long newPublicLimit, + String priKey, + WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; try { @@ -1727,18 +1800,20 @@ public static Return updateAsset2(byte[] address, byte[] description, byte[] url transaction = signTransaction(ecKey, transaction); GrpcAPI.Return response = broadcastTransaction(transaction, blockingStubFull); if (response.getResult() == false) { - //logger.info(ByteArray.toStr(response.getMessage().toByteArray())); + // logger.info(ByteArray.toStr(response.getMessage().toByteArray())); return response; } return ret; } - /** - * constructor. - */ - - public static boolean transferAsset(byte[] to, byte[] assertName, long amount, byte[] address, - String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static boolean transferAsset( + byte[] to, + byte[] assertName, + long amount, + byte[] address, + String priKey, + WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; try { @@ -1775,12 +1850,11 @@ public static boolean transferAsset(byte[] to, byte[] assertName, long amount, b return response.getResult(); } - - /** - * constructor. - */ - - public static boolean updateAccount(byte[] addressBytes, byte[] accountNameBytes, String priKey, + /** constructor. */ + public static boolean updateAccount( + byte[] addressBytes, + byte[] accountNameBytes, + String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; @@ -1811,30 +1885,32 @@ public static boolean updateAccount(byte[] addressBytes, byte[] accountNameBytes return response.getResult(); } - /** - * constructor. - */ - + /** constructor. */ public static boolean waitSolidityNodeSynFullNodeData( WalletGrpc.WalletBlockingStub blockingStubFull, WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubSolidity) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); Block currentBlock = blockingStubFull.getNowBlock(GrpcAPI.EmptyMessage.newBuilder().build()); - Block solidityCurrentBlock = blockingStubSolidity - .getNowBlock(GrpcAPI.EmptyMessage.newBuilder().build()); + Block solidityCurrentBlock = + blockingStubSolidity.getNowBlock(GrpcAPI.EmptyMessage.newBuilder().build()); Integer wait = 0; logger.info("Fullnode block num is " + currentBlock.getBlockHeader().getRawData().getNumber()); + while (solidityCurrentBlock.getBlockHeader().getRawData().getNumber() - < currentBlock.getBlockHeader().getRawData().getNumber() + 1 && wait <= 24) { + < currentBlock.getBlockHeader().getRawData().getNumber() + 1 + && wait + < ((getWitnessNum(blockingStubFull) >= 27) + ? 27 + : getWitnessNum(blockingStubFull) + 1)) { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } - logger.info("Soliditynode num is " + solidityCurrentBlock.getBlockHeader().getRawData() - .getNumber()); - solidityCurrentBlock = blockingStubSolidity - .getNowBlock(GrpcAPI.EmptyMessage.newBuilder().build()); + logger.info( + "Soliditynode num is " + solidityCurrentBlock.getBlockHeader().getRawData().getNumber()); + solidityCurrentBlock = + blockingStubSolidity.getNowBlock(GrpcAPI.EmptyMessage.newBuilder().build()); if (wait == 24) { logger.info("Didn't syn,skip to next case."); return false; @@ -1844,10 +1920,7 @@ public static boolean waitSolidityNodeSynFullNodeData( return true; } - /** - * constructor. - */ - + /** constructor. */ public static boolean waitProduceNextBlock(WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); Block currentBlock = blockingStubFull.getNowBlock(GrpcAPI.EmptyMessage.newBuilder().build()); @@ -1857,15 +1930,14 @@ public static boolean waitProduceNextBlock(WalletGrpc.WalletBlockingStub blockin Long nextNum = nextBlock.getBlockHeader().getRawData().getNumber(); Integer wait = 0; - logger.info( - "Block num is " + currentBlock.getBlockHeader().getRawData().getNumber()); + logger.info("Block num is " + currentBlock.getBlockHeader().getRawData().getNumber()); while (nextNum <= currentNum + 1 && wait <= 45) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } - //logger.info("Wait to produce next block"); + // logger.info("Wait to produce next block"); nextBlock = blockingStubFull.getNowBlock(GrpcAPI.EmptyMessage.newBuilder().build()); nextNum = nextBlock.getBlockHeader().getRawData().getNumber(); if (wait == 45) { @@ -1878,12 +1950,9 @@ public static boolean waitProduceNextBlock(WalletGrpc.WalletBlockingStub blockin return true; } - /** - * constructor. - */ - - public static AccountNetMessage getAccountNet(byte[] address, - WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static AccountNetMessage getAccountNet( + byte[] address, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ByteString addressBs = ByteString.copyFrom(address); Account request = Account.newBuilder().setAddress(addressBs).build(); @@ -1910,23 +1979,20 @@ public static AccountNetMessage getAccountNet(byte[] address, }*/ - /** - * constructor. - */ - + /** constructor. */ public static byte[] getFinalAddress(String priKey) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); WalletClient walletClient; walletClient = new WalletClient(priKey); - //walletClient.init(0); + // walletClient.init(0); return walletClient.getAddress(); } - /** - * constructor. - */ - - public static String createAccountGetTxid(byte[] ownerAddress, byte[] newAddress, String priKey, + /** constructor. */ + public static String createAccountGetTxid( + byte[] ownerAddress, + byte[] newAddress, + String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; @@ -1952,18 +2018,19 @@ public static String createAccountGetTxid(byte[] ownerAddress, byte[] newAddress if (response.getResult() == false) { return null; } else { - //logger.info("brodacast succesfully"); - return ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), + // logger.info("brodacast succesfully"); + return ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), transaction.getRawData().toByteArray())); } } - /** - * constructor. - */ - - public static boolean createAccount(byte[] ownerAddress, byte[] newAddress, String priKey, + /** constructor. */ + public static boolean createAccount( + byte[] ownerAddress, + byte[] newAddress, + String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; @@ -1989,11 +2056,11 @@ public static boolean createAccount(byte[] ownerAddress, byte[] newAddress, Stri return response.getResult(); } - /** - * constructor. - */ - - public static Return createAccount2(byte[] ownerAddress, byte[] newAddress, String priKey, + /** constructor. */ + public static Return createAccount2( + byte[] ownerAddress, + byte[] newAddress, + String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; @@ -2036,18 +2103,18 @@ public static Return createAccount2(byte[] ownerAddress, byte[] newAddress, Stri transaction = signTransaction(ecKey, transaction); GrpcAPI.Return response = broadcastTransaction(transaction, blockingStubFull); if (response.getResult() == false) { - //logger.info(ByteArray.toStr(response.getMessage().toByteArray())); + // logger.info(ByteArray.toStr(response.getMessage().toByteArray())); return response; } return ret; } - /** - * constructor. - */ - - public static boolean voteWitness(byte[] ownerAddress, String priKey, - HashMap witnessMap, WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static boolean voteWitness( + byte[] ownerAddress, + String priKey, + HashMap witnessMap, + WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; try { @@ -2058,7 +2125,6 @@ public static boolean voteWitness(byte[] ownerAddress, String priKey, } final ECKey ecKey = temKey; - byte[] owner = ownerAddress; VoteWitnessContract.Builder builder = VoteWitnessContract.newBuilder(); builder.setOwnerAddress(ByteString.copyFrom(owner)); @@ -2093,13 +2159,12 @@ public static boolean voteWitness(byte[] ownerAddress, String priKey, return response.getResult(); } - - /** - * constructor. - */ - - public static boolean createProposal(byte[] ownerAddress, String priKey, - HashMap parametersMap, WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static boolean createProposal( + byte[] ownerAddress, + String priKey, + HashMap parametersMap, + WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; try { @@ -2139,12 +2204,13 @@ public static boolean createProposal(byte[] ownerAddress, String priKey, return response.getResult(); } - /** - * constructor. - */ - - public static boolean approveProposal(byte[] ownerAddress, String priKey, long id, - boolean isAddApproval, WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static boolean approveProposal( + byte[] ownerAddress, + String priKey, + long id, + boolean isAddApproval, + WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; try { @@ -2183,12 +2249,9 @@ public static boolean approveProposal(byte[] ownerAddress, String priKey, long i return response.getResult(); } - /** - * constructor. - */ - - public static boolean deleteProposal(byte[] ownerAddress, String priKey, long id, - WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static boolean deleteProposal( + byte[] ownerAddress, String priKey, long id, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; try { @@ -2227,10 +2290,7 @@ public static boolean deleteProposal(byte[] ownerAddress, String priKey, long id return response.getResult(); } - /** - * constructor. - */ - + /** constructor. */ public static boolean printAddress(String key) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); logger.info(key); @@ -2239,20 +2299,13 @@ public static boolean printAddress(String key) { return true; } - /** - * constructor. - */ - + /** constructor. */ public static String getAddressString(String key) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); return Base58.encode58Check(getFinalAddress(key)); } - /** - * constructor. - */ - - + /** constructor. */ public static ArrayList getAddressInfo(String key) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ArrayList accountList = new ArrayList(); @@ -2262,11 +2315,11 @@ public static ArrayList getAddressInfo(String key) { return accountList; } - /** - * constructor. - */ - - public static boolean setAccountId(byte[] accountIdBytes, byte[] ownerAddress, String priKey, + /** constructor. */ + public static boolean setAccountId( + byte[] accountIdBytes, + byte[] ownerAddress, + String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; @@ -2294,23 +2347,32 @@ public static boolean setAccountId(byte[] accountIdBytes, byte[] ownerAddress, S return response.getResult(); } - /** - * constructor. - */ - - public static Boolean freezeBalanceGetTronPower(byte[] addRess, long freezeBalance, - long freezeDuration, int resourceCode, ByteString receiverAddress,String priKey, + /** constructor. */ + public static Boolean freezeBalanceGetTronPower( + byte[] addRess, + long freezeBalance, + long freezeDuration, + int resourceCode, + ByteString receiverAddress, + String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { - return freezeBalanceForReceiver(addRess,freezeBalance, - freezeDuration,resourceCode,receiverAddress,priKey,blockingStubFull); + return freezeBalanceForReceiver( + addRess, + freezeBalance, + freezeDuration, + resourceCode, + receiverAddress, + priKey, + blockingStubFull); } - /** - * constructor. - */ - - public static Boolean freezeBalanceGetEnergy(byte[] addRess, long freezeBalance, - long freezeDuration, int resourceCode, String priKey, + /** constructor. */ + public static Boolean freezeBalanceGetEnergy( + byte[] addRess, + long freezeBalance, + long freezeDuration, + int resourceCode, + String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); byte[] address = addRess; @@ -2328,8 +2390,11 @@ public static Boolean freezeBalanceGetEnergy(byte[] addRess, long freezeBalance, FreezeBalanceContract.Builder builder = FreezeBalanceContract.newBuilder(); ByteString byteAddreess = ByteString.copyFrom(address); - builder.setOwnerAddress(byteAddreess).setFrozenBalance(frozenBalance) - .setFrozenDuration(frozenDuration).setResourceValue(resourceCode); + builder + .setOwnerAddress(byteAddreess) + .setFrozenBalance(frozenBalance) + .setFrozenDuration(frozenDuration) + .setResourceValue(resourceCode); FreezeBalanceContract contract = builder.build(); Protocol.Transaction transaction = blockingStubFull.freezeBalance(contract); @@ -2344,22 +2409,20 @@ public static Boolean freezeBalanceGetEnergy(byte[] addRess, long freezeBalance, return response.getResult(); } - /** - * constructor. - */ - public static AccountResourceMessage getAccountResource(byte[] address, - WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static AccountResourceMessage getAccountResource( + byte[] address, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ByteString addressBs = ByteString.copyFrom(address); Account request = Account.newBuilder().setAddress(addressBs).build(); return blockingStubFull.getAccountResource(request); } - /** - * constructor. - */ - - public static boolean buyStorage(long quantity, byte[] address, String priKey, + /** constructor. */ + public static boolean buyStorage( + long quantity, + byte[] address, + String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; @@ -2397,10 +2460,11 @@ public static boolean buyStorage(long quantity, byte[] address, String priKey, return response.getResult(); } - /** - * constructor. - */ - public static boolean sellStorage(long quantity, byte[] address, String priKey, + /** constructor. */ + public static boolean sellStorage( + long quantity, + byte[] address, + String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; @@ -2438,14 +2502,22 @@ public static boolean sellStorage(long quantity, byte[] address, String priKey, return response.getResult(); } - /** - * constructor. - */ - public static byte[] deployContractFallbackReceive(String contractName, String abiString, + /** constructor. */ + public static byte[] deployContractFallbackReceive( + String contractName, + String abiString, String code, - String data, Long feeLimit, long value, long consumeUserResourcePercent, - long originEnergyLimit, String tokenId, long tokenValue, String libraryAddress, String priKey, - byte[] ownerAddress, WalletGrpc.WalletBlockingStub blockingStubFull) { + String data, + Long feeLimit, + long value, + long consumeUserResourcePercent, + long originEnergyLimit, + String tokenId, + long tokenValue, + String libraryAddress, + String priKey, + byte[] ownerAddress, + WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; try { @@ -2462,7 +2534,7 @@ public static byte[] deployContractFallbackReceive(String contractName, String a logger.error("abi is null"); return null; } - //byte[] codeBytes = Hex.decode(code); + // byte[] codeBytes = Hex.decode(code); SmartContract.Builder builder = SmartContract.newBuilder(); builder.setName(contractName); builder.setOriginAddress(ByteString.copyFrom(owner)); @@ -2487,25 +2559,25 @@ public static byte[] deployContractFallbackReceive(String contractName, String a contractBuilder.setOwnerAddress(ByteString.copyFrom(owner)); contractBuilder.setCallTokenValue(tokenValue); contractBuilder.setTokenId(Long.parseLong(tokenId)); - CreateSmartContract contractDeployContract = contractBuilder.setNewContract(builder.build()) - .build(); + CreateSmartContract contractDeployContract = + contractBuilder.setNewContract(builder.build()).build(); - TransactionExtention transactionExtention = blockingStubFull - .deployContract(contractDeployContract); + TransactionExtention transactionExtention = + blockingStubFull.deployContract(contractDeployContract); if (transactionExtention == null || !transactionExtention.getResult().getResult()) { System.out.println("RPC create trx failed!"); if (transactionExtention != null) { System.out.println("Code = " + transactionExtention.getResult().getCode()); - System.out - .println("Message = " + transactionExtention.getResult().getMessage().toStringUtf8()); + System.out.println( + "Message = " + transactionExtention.getResult().getMessage().toStringUtf8()); } return null; } final TransactionExtention.Builder texBuilder = TransactionExtention.newBuilder(); Transaction.Builder transBuilder = Transaction.newBuilder(); - Transaction.raw.Builder rawBuilder = transactionExtention.getTransaction().getRawData() - .toBuilder(); + Transaction.raw.Builder rawBuilder = + transactionExtention.getTransaction().getRawData().toBuilder(); rawBuilder.setFeeLimit(feeLimit); transBuilder.setRawData(rawBuilder); for (int i = 0; i < transactionExtention.getTransaction().getSignatureCount(); i++) { @@ -2539,9 +2611,12 @@ public static byte[] deployContractFallbackReceive(String contractName, String a return null; } transaction = signTransaction(ecKey, transaction); - System.out.println("txid = " + ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), - transaction.getRawData().toByteArray()))); + System.out.println( + "txid = " + + ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), + transaction.getRawData().toByteArray()))); contractAddress = generateContractAddress(transaction, owner); System.out.println( "Your smart contract address will be: " + WalletClient.encode58Check(contractAddress)); @@ -2550,18 +2625,27 @@ public static byte[] deployContractFallbackReceive(String contractName, String a if (response.getResult() == false) { return null; } else { - //logger.info("brodacast succesfully"); + // logger.info("brodacast succesfully"); return contractAddress; } } - /** - * constructor. - */ - public static byte[] deployContract(String contractName, String abiString, String code, - String data, Long feeLimit, long value, long consumeUserResourcePercent, - long originEnergyLimit, String tokenId, long tokenValue, String libraryAddress, String priKey, - byte[] ownerAddress, WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static byte[] deployContract( + String contractName, + String abiString, + String code, + String data, + Long feeLimit, + long value, + long consumeUserResourcePercent, + long originEnergyLimit, + String tokenId, + long tokenValue, + String libraryAddress, + String priKey, + byte[] ownerAddress, + WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; try { @@ -2578,7 +2662,7 @@ public static byte[] deployContract(String contractName, String abiString, Strin logger.error("abi is null"); return null; } - //byte[] codeBytes = Hex.decode(code); + // byte[] codeBytes = Hex.decode(code); SmartContract.Builder builder = SmartContract.newBuilder(); builder.setName(contractName); builder.setOriginAddress(ByteString.copyFrom(owner)); @@ -2603,25 +2687,25 @@ public static byte[] deployContract(String contractName, String abiString, Strin contractBuilder.setOwnerAddress(ByteString.copyFrom(owner)); contractBuilder.setCallTokenValue(tokenValue); contractBuilder.setTokenId(Long.parseLong(tokenId)); - CreateSmartContract contractDeployContract = contractBuilder.setNewContract(builder.build()) - .build(); + CreateSmartContract contractDeployContract = + contractBuilder.setNewContract(builder.build()).build(); - TransactionExtention transactionExtention = blockingStubFull - .deployContract(contractDeployContract); + TransactionExtention transactionExtention = + blockingStubFull.deployContract(contractDeployContract); if (transactionExtention == null || !transactionExtention.getResult().getResult()) { System.out.println("RPC create trx failed!"); if (transactionExtention != null) { System.out.println("Code = " + transactionExtention.getResult().getCode()); - System.out - .println("Message = " + transactionExtention.getResult().getMessage().toStringUtf8()); + System.out.println( + "Message = " + transactionExtention.getResult().getMessage().toStringUtf8()); } return null; } final TransactionExtention.Builder texBuilder = TransactionExtention.newBuilder(); Transaction.Builder transBuilder = Transaction.newBuilder(); - Transaction.raw.Builder rawBuilder = transactionExtention.getTransaction().getRawData() - .toBuilder(); + Transaction.raw.Builder rawBuilder = + transactionExtention.getTransaction().getRawData().toBuilder(); rawBuilder.setFeeLimit(feeLimit); transBuilder.setRawData(rawBuilder); for (int i = 0; i < transactionExtention.getTransaction().getSignatureCount(); i++) { @@ -2655,9 +2739,12 @@ public static byte[] deployContract(String contractName, String abiString, Strin return null; } transaction = signTransaction(ecKey, transaction); - System.out.println("txid = " + ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), - transaction.getRawData().toByteArray()))); + System.out.println( + "txid = " + + ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), + transaction.getRawData().toByteArray()))); contractAddress = generateContractAddress(transaction, owner); System.out.println( "Your smart contract address will be: " + WalletClient.encode58Check(contractAddress)); @@ -2666,42 +2753,84 @@ public static byte[] deployContract(String contractName, String abiString, Strin if (response.getResult() == false) { return null; } else { - //logger.info("brodacast succesfully"); + // logger.info("brodacast succesfully"); return contractAddress; } } - /** - * constructor. - */ - public static byte[] deployContract(String contractName, String abiString, String code, - String data, Long feeLimit, long value, long consumeUserResourcePercent, - String libraryAddress, String priKey, byte[] ownerAddress, + /** constructor. */ + public static byte[] deployContract( + String contractName, + String abiString, + String code, + String data, + Long feeLimit, + long value, + long consumeUserResourcePercent, + String libraryAddress, + String priKey, + byte[] ownerAddress, WalletGrpc.WalletBlockingStub blockingStubFull) { - return deployContract(contractName, abiString, code, data, feeLimit, value, - consumeUserResourcePercent, 1000L, "0", 0L, libraryAddress, priKey, ownerAddress, + return deployContract( + contractName, + abiString, + code, + data, + feeLimit, + value, + consumeUserResourcePercent, + 1000L, + "0", + 0L, + libraryAddress, + priKey, + ownerAddress, blockingStubFull); } - /** - * constructor. - */ - public static byte[] deployContractFallback(String contractName, String abiString, String code, - String data, Long feeLimit, long value, long consumeUserResourcePercent, - String libraryAddress, String priKey, byte[] ownerAddress, + /** constructor. */ + public static byte[] deployContractFallback( + String contractName, + String abiString, + String code, + String data, + Long feeLimit, + long value, + long consumeUserResourcePercent, + String libraryAddress, + String priKey, + byte[] ownerAddress, WalletGrpc.WalletBlockingStub blockingStubFull) { - return deployContractFallbackReceive(contractName, abiString, code, data, feeLimit, value, - consumeUserResourcePercent, 1000L, "0", 0L, libraryAddress, priKey, ownerAddress, + return deployContractFallbackReceive( + contractName, + abiString, + code, + data, + feeLimit, + value, + consumeUserResourcePercent, + 1000L, + "0", + 0L, + libraryAddress, + priKey, + ownerAddress, blockingStubFull); } - /** - * constructor. - */ - - public static byte[] deployContractForLibrary(String contractName, String abiString, String code, - String data, Long feeLimit, long value, long consumeUserResourcePercent, - String libraryAddress, String priKey, byte[] ownerAddress, String compilerVersion, + /** constructor. */ + public static byte[] deployContractForLibrary( + String contractName, + String abiString, + String code, + String data, + Long feeLimit, + long value, + long consumeUserResourcePercent, + String libraryAddress, + String priKey, + byte[] ownerAddress, + String compilerVersion, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; @@ -2719,7 +2848,7 @@ public static byte[] deployContractForLibrary(String contractName, String abiStr logger.error("abi is null"); return null; } - //byte[] codeBytes = Hex.decode(code); + // byte[] codeBytes = Hex.decode(code); SmartContract.Builder builder = SmartContract.newBuilder(); builder.setName(contractName); builder.setOriginAddress(ByteString.copyFrom(owner)); @@ -2737,7 +2866,7 @@ public static byte[] deployContractForLibrary(String contractName, String abiStr if (compilerVersion.equals("v5") || compilerVersion.equals("V5")) { byteCode = replaceLibraryAddresscompilerVersion(code, libraryAddress, "v5"); } else { - //old version + // old version byteCode = replaceLibraryAddresscompilerVersion(code, libraryAddress, null); } @@ -2750,25 +2879,25 @@ public static byte[] deployContractForLibrary(String contractName, String abiStr contractBuilder.setOwnerAddress(ByteString.copyFrom(owner)); contractBuilder.setCallTokenValue(0); contractBuilder.setTokenId(Long.parseLong("0")); - CreateSmartContract contractDeployContract = contractBuilder.setNewContract(builder.build()) - .build(); + CreateSmartContract contractDeployContract = + contractBuilder.setNewContract(builder.build()).build(); - TransactionExtention transactionExtention = blockingStubFull - .deployContract(contractDeployContract); + TransactionExtention transactionExtention = + blockingStubFull.deployContract(contractDeployContract); if (transactionExtention == null || !transactionExtention.getResult().getResult()) { System.out.println("RPC create trx failed!"); if (transactionExtention != null) { System.out.println("Code = " + transactionExtention.getResult().getCode()); - System.out - .println("Message = " + transactionExtention.getResult().getMessage().toStringUtf8()); + System.out.println( + "Message = " + transactionExtention.getResult().getMessage().toStringUtf8()); } return null; } final TransactionExtention.Builder texBuilder = TransactionExtention.newBuilder(); Transaction.Builder transBuilder = Transaction.newBuilder(); - Transaction.raw.Builder rawBuilder = transactionExtention.getTransaction().getRawData() - .toBuilder(); + Transaction.raw.Builder rawBuilder = + transactionExtention.getTransaction().getRawData().toBuilder(); rawBuilder.setFeeLimit(feeLimit); transBuilder.setRawData(rawBuilder); for (int i = 0; i < transactionExtention.getTransaction().getSignatureCount(); i++) { @@ -2802,9 +2931,12 @@ public static byte[] deployContractForLibrary(String contractName, String abiStr return null; } transaction = signTransaction(ecKey, transaction); - System.out.println("txid = " + ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), - transaction.getRawData().toByteArray()))); + System.out.println( + "txid = " + + ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), + transaction.getRawData().toByteArray()))); contractAddress = generateContractAddress(transaction, owner); System.out.println( "Your smart contract address will be: " + WalletClient.encode58Check(contractAddress)); @@ -2813,33 +2945,56 @@ public static byte[] deployContractForLibrary(String contractName, String abiStr if (response.getResult() == false) { return null; } else { - //logger.info("brodacast succesfully"); + // logger.info("brodacast succesfully"); return contractAddress; } - } - /** - * constructor. - */ - - public static String deployContractAndGetTransactionInfoById(String contractName, - String abiString, String code, String data, Long feeLimit, long value, - long consumeUserResourcePercent, String libraryAddress, String priKey, byte[] ownerAddress, + /** constructor. */ + public static String deployContractAndGetTransactionInfoById( + String contractName, + String abiString, + String code, + String data, + Long feeLimit, + long value, + long consumeUserResourcePercent, + String libraryAddress, + String priKey, + byte[] ownerAddress, WalletGrpc.WalletBlockingStub blockingStubFull) { - return deployContractAndGetTransactionInfoById(contractName, abiString, code, data, feeLimit, - value, consumeUserResourcePercent, 1000L, "0", 0L, libraryAddress, priKey, ownerAddress, + return deployContractAndGetTransactionInfoById( + contractName, + abiString, + code, + data, + feeLimit, + value, + consumeUserResourcePercent, + 1000L, + "0", + 0L, + libraryAddress, + priKey, + ownerAddress, blockingStubFull); } - /** - * constructor. - */ - - public static String deployContractAndGetTransactionInfoById(String contractName, - String abiString, String code, String data, Long feeLimit, long value, - long consumeUserResourcePercent, long originEnergyLimit, String tokenId, long tokenValue, - String libraryAddress, String priKey, byte[] ownerAddress, + /** constructor. */ + public static String deployContractAndGetTransactionInfoById( + String contractName, + String abiString, + String code, + String data, + Long feeLimit, + long value, + long consumeUserResourcePercent, + long originEnergyLimit, + String tokenId, + long tokenValue, + String libraryAddress, + String priKey, + byte[] ownerAddress, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; @@ -2857,7 +3012,7 @@ public static String deployContractAndGetTransactionInfoById(String contractName logger.error("abi is null"); return null; } - //byte[] codeBytes = Hex.decode(code); + // byte[] codeBytes = Hex.decode(code); SmartContract.Builder builder = SmartContract.newBuilder(); builder.setName(contractName); builder.setOriginAddress(ByteString.copyFrom(owner)); @@ -2882,25 +3037,25 @@ public static String deployContractAndGetTransactionInfoById(String contractName contractBuilder.setOwnerAddress(ByteString.copyFrom(owner)); contractBuilder.setCallTokenValue(tokenValue); contractBuilder.setTokenId(Long.parseLong(tokenId)); - CreateSmartContract contractDeployContract = contractBuilder.setNewContract(builder.build()) - .build(); + CreateSmartContract contractDeployContract = + contractBuilder.setNewContract(builder.build()).build(); - TransactionExtention transactionExtention = blockingStubFull - .deployContract(contractDeployContract); + TransactionExtention transactionExtention = + blockingStubFull.deployContract(contractDeployContract); if (transactionExtention == null || !transactionExtention.getResult().getResult()) { System.out.println("RPC create trx failed!"); if (transactionExtention != null) { System.out.println("Code = " + transactionExtention.getResult().getCode()); - System.out - .println("Message = " + transactionExtention.getResult().getMessage().toStringUtf8()); + System.out.println( + "Message = " + transactionExtention.getResult().getMessage().toStringUtf8()); } return null; } final TransactionExtention.Builder texBuilder = TransactionExtention.newBuilder(); Transaction.Builder transBuilder = Transaction.newBuilder(); - Transaction.raw.Builder rawBuilder = transactionExtention.getTransaction().getRawData() - .toBuilder(); + Transaction.raw.Builder rawBuilder = + transactionExtention.getTransaction().getRawData().toBuilder(); rawBuilder.setFeeLimit(feeLimit); transBuilder.setRawData(rawBuilder); for (int i = 0; i < transactionExtention.getTransaction().getSignatureCount(); i++) { @@ -2931,9 +3086,12 @@ public static String deployContractAndGetTransactionInfoById(String contractName return null; } transaction = signTransaction(ecKey, transaction); - System.out.println("txid = " + ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), - transaction.getRawData().toByteArray()))); + System.out.println( + "txid = " + + ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), + transaction.getRawData().toByteArray()))); byte[] contractAddress = generateContractAddress(transaction, owner); System.out.println( "Your smart contract address will be: " + WalletClient.encode58Check(contractAddress)); @@ -2941,17 +3099,15 @@ public static String deployContractAndGetTransactionInfoById(String contractName if (response.getResult() == false) { return null; } else { - //logger.info("brodacast succesfully"); - return ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), + // logger.info("brodacast succesfully"); + return ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), transaction.getRawData().toByteArray())); } } - /** - * constructor. - */ - + /** constructor. */ public static SmartContract.ABI jsonStr2Abi(String jsonStr) { if (jsonStr == null) { return null; @@ -2964,29 +3120,34 @@ public static SmartContract.ABI jsonStr2Abi(String jsonStr) { for (int index = 0; index < jsonRoot.size(); index++) { JsonElement abiItem = jsonRoot.get(index); boolean anonymous = - abiItem.getAsJsonObject().get("anonymous") != null && abiItem.getAsJsonObject() - .get("anonymous").getAsBoolean(); + abiItem.getAsJsonObject().get("anonymous") != null + && abiItem.getAsJsonObject().get("anonymous").getAsBoolean(); final boolean constant = - abiItem.getAsJsonObject().get("constant") != null && abiItem.getAsJsonObject() - .get("constant").getAsBoolean(); + abiItem.getAsJsonObject().get("constant") != null + && abiItem.getAsJsonObject().get("constant").getAsBoolean(); final String name = - abiItem.getAsJsonObject().get("name") != null ? abiItem.getAsJsonObject().get("name") - .getAsString() : null; + abiItem.getAsJsonObject().get("name") != null + ? abiItem.getAsJsonObject().get("name").getAsString() + : null; JsonArray inputs = - abiItem.getAsJsonObject().get("inputs") != null ? abiItem.getAsJsonObject().get("inputs") - .getAsJsonArray() : null; + abiItem.getAsJsonObject().get("inputs") != null + ? abiItem.getAsJsonObject().get("inputs").getAsJsonArray() + : null; final JsonArray outputs = - abiItem.getAsJsonObject().get("outputs") != null ? abiItem.getAsJsonObject() - .get("outputs").getAsJsonArray() : null; + abiItem.getAsJsonObject().get("outputs") != null + ? abiItem.getAsJsonObject().get("outputs").getAsJsonArray() + : null; String type = - abiItem.getAsJsonObject().get("type") != null ? abiItem.getAsJsonObject().get("type") - .getAsString() : null; + abiItem.getAsJsonObject().get("type") != null + ? abiItem.getAsJsonObject().get("type").getAsString() + : null; final boolean payable = - abiItem.getAsJsonObject().get("payable") != null && abiItem.getAsJsonObject() - .get("payable").getAsBoolean(); + abiItem.getAsJsonObject().get("payable") != null + && abiItem.getAsJsonObject().get("payable").getAsBoolean(); final String stateMutability = - abiItem.getAsJsonObject().get("stateMutability") != null ? abiItem.getAsJsonObject() - .get("stateMutability").getAsString() : null; + abiItem.getAsJsonObject().get("stateMutability") != null + ? abiItem.getAsJsonObject().get("stateMutability").getAsString() + : null; if (type == null) { logger.error("No type!"); return null; @@ -3035,8 +3196,8 @@ public static SmartContract.ABI jsonStr2Abi(String jsonStr) { } String outputName = outputItem.getAsJsonObject().get("name").getAsString(); String outputType = outputItem.getAsJsonObject().get("type").getAsString(); - SmartContract.ABI.Entry.Param.Builder paramBuilder = SmartContract.ABI.Entry.Param - .newBuilder(); + SmartContract.ABI.Entry.Param.Builder paramBuilder = + SmartContract.ABI.Entry.Param.newBuilder(); JsonElement indexed = outputItem.getAsJsonObject().get("indexed"); paramBuilder.setIndexed((indexed != null) && indexed.getAsBoolean()); @@ -3058,10 +3219,7 @@ public static SmartContract.ABI jsonStr2Abi(String jsonStr) { return abiBuilder.build(); } - /** - * constructor. - */ - + /** constructor. */ public static SmartContract.ABI jsonStr2Abi2(String jsonStr) { if (jsonStr == null) { return null; @@ -3074,34 +3232,40 @@ public static SmartContract.ABI jsonStr2Abi2(String jsonStr) { for (int index = 0; index < jsonRoot.size(); index++) { JsonElement abiItem = jsonRoot.get(index); boolean anonymous = - abiItem.getAsJsonObject().get("anonymous") != null && abiItem.getAsJsonObject() - .get("anonymous").getAsBoolean(); + abiItem.getAsJsonObject().get("anonymous") != null + && abiItem.getAsJsonObject().get("anonymous").getAsBoolean(); final boolean constant = - abiItem.getAsJsonObject().get("constant") != null && abiItem.getAsJsonObject() - .get("constant").getAsBoolean(); + abiItem.getAsJsonObject().get("constant") != null + && abiItem.getAsJsonObject().get("constant").getAsBoolean(); final String name = - abiItem.getAsJsonObject().get("name") != null ? abiItem.getAsJsonObject().get("name") - .getAsString() : null; + abiItem.getAsJsonObject().get("name") != null + ? abiItem.getAsJsonObject().get("name").getAsString() + : null; JsonArray inputs = - abiItem.getAsJsonObject().get("inputs") != null ? abiItem.getAsJsonObject().get("inputs") - .getAsJsonArray() : null; + abiItem.getAsJsonObject().get("inputs") != null + ? abiItem.getAsJsonObject().get("inputs").getAsJsonArray() + : null; final JsonArray outputs = - abiItem.getAsJsonObject().get("outputs") != null ? abiItem.getAsJsonObject() - .get("outputs").getAsJsonArray() : null; + abiItem.getAsJsonObject().get("outputs") != null + ? abiItem.getAsJsonObject().get("outputs").getAsJsonArray() + : null; String type = - abiItem.getAsJsonObject().get("type") != null ? abiItem.getAsJsonObject().get("type") - .getAsString() : null; + abiItem.getAsJsonObject().get("type") != null + ? abiItem.getAsJsonObject().get("type").getAsString() + : null; final boolean payable = - abiItem.getAsJsonObject().get("payable") != null && abiItem.getAsJsonObject() - .get("payable").getAsBoolean(); + abiItem.getAsJsonObject().get("payable") != null + && abiItem.getAsJsonObject().get("payable").getAsBoolean(); final String stateMutability = - abiItem.getAsJsonObject().get("stateMutability") != null ? abiItem.getAsJsonObject() - .get("stateMutability").getAsString() : null; + abiItem.getAsJsonObject().get("stateMutability") != null + ? abiItem.getAsJsonObject().get("stateMutability").getAsString() + : null; if (type == null) { logger.error("No type!"); return null; } - if (!type.equalsIgnoreCase("fallback") && !type.equalsIgnoreCase("receive") + if (!type.equalsIgnoreCase("fallback") + && !type.equalsIgnoreCase("receive") && null == inputs) { logger.error("No inputs!"); return null; @@ -3146,8 +3310,8 @@ public static SmartContract.ABI jsonStr2Abi2(String jsonStr) { } String outputName = outputItem.getAsJsonObject().get("name").getAsString(); String outputType = outputItem.getAsJsonObject().get("type").getAsString(); - SmartContract.ABI.Entry.Param.Builder paramBuilder = SmartContract.ABI.Entry.Param - .newBuilder(); + SmartContract.ABI.Entry.Param.Builder paramBuilder = + SmartContract.ABI.Entry.Param.newBuilder(); JsonElement indexed = outputItem.getAsJsonObject().get("indexed"); paramBuilder.setIndexed((indexed != null) && indexed.getAsBoolean()); @@ -3168,11 +3332,7 @@ public static SmartContract.ABI jsonStr2Abi2(String jsonStr) { return abiBuilder.build(); } - - /** - * constructor. - */ - + /** constructor. */ public static SmartContract.ABI.Entry.EntryType getEntryType(String type) { switch (type) { case "constructor": @@ -3190,9 +3350,7 @@ public static SmartContract.ABI.Entry.EntryType getEntryType(String type) { } } - /** - * constructor. - */ + /** constructor. */ public static SmartContract.ABI.Entry.EntryType getEntryType2(String type) { switch (type) { case "constructor": @@ -3210,10 +3368,7 @@ public static SmartContract.ABI.Entry.EntryType getEntryType2(String type) { } } - /** - * constructor. - */ - + /** constructor. */ public static SmartContract.ABI.Entry.StateMutabilityType getStateMutability( String stateMutability) { switch (stateMutability) { @@ -3230,10 +3385,7 @@ public static SmartContract.ABI.Entry.StateMutabilityType getStateMutability( } } - /** - * constructor. - */ - + /** constructor. */ public static byte[] generateContractAddress(Transaction trx, byte[] owneraddress) { // get owner address @@ -3241,9 +3393,10 @@ public static byte[] generateContractAddress(Transaction trx, byte[] owneraddres byte[] ownerAddress = owneraddress; // get tx hash - byte[] txRawDataHash = Sha256Hash - .of(CommonParameter.getInstance().isECKeyCryptoEngine(), trx.getRawData().toByteArray()) - .getBytes(); + byte[] txRawDataHash = + Sha256Hash.of( + CommonParameter.getInstance().isECKeyCryptoEngine(), trx.getRawData().toByteArray()) + .getBytes(); // combine byte[] combined = new byte[txRawDataHash.length + ownerAddress.length]; @@ -3251,15 +3404,11 @@ public static byte[] generateContractAddress(Transaction trx, byte[] owneraddres System.arraycopy(ownerAddress, 0, combined, txRawDataHash.length, ownerAddress.length); return sha3omit12(combined); - } - /** - * constructor. - */ - - public static SmartContract getContract(byte[] address, - WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static SmartContract getContract( + byte[] address, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ByteString byteString = ByteString.copyFrom(address); BytesMessage bytesMessage = BytesMessage.newBuilder().setValue(byteString).build(); @@ -3268,18 +3417,15 @@ public static SmartContract getContract(byte[] address, return blockingStubFull.getContract(bytesMessage); } - /** - * constructor. - */ - - public static SmartContractDataWrapper getContractInfo(byte[] address, - WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static SmartContractDataWrapper getContractInfo( + byte[] address, WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ByteString byteString = ByteString.copyFrom(address); BytesMessage bytesMessage = BytesMessage.newBuilder().setValue(byteString).build(); logger.info( - "contract name is " + blockingStubFull.getContractInfo(bytesMessage).getSmartContract() - .getName()); + "contract name is " + + blockingStubFull.getContractInfo(bytesMessage).getSmartContract().getName()); logger.info("contract address is " + WalletClient.encode58Check(address)); return blockingStubFull.getContractInfo(bytesMessage); } @@ -3297,8 +3443,8 @@ private static byte[] replaceLibraryAddress(String code, String libraryAddressPa } String libraryName = cur.substring(0, lastPosition); String addr = cur.substring(lastPosition + 1); - String libraryAddressHex = ByteArray.toHexString(Commons.decodeFromBase58Check(addr)) - .substring(2); + String libraryAddressHex = + ByteArray.toHexString(Commons.decodeFromBase58Check(addr)).substring(2); String repeated = new String(new char[40 - libraryName.length() - 2]).replace("\0", "_"); String beReplaced = "__" + libraryName + repeated; @@ -3318,8 +3464,8 @@ private static byte[] replaceLibraryAddress_1(String code, byte[] libraryAddress return Hex.decode(code); } - private static byte[] replaceLibraryAddresscompilerVersion(String code, String libraryAddressPair, - String compilerVersion) { + private static byte[] replaceLibraryAddresscompilerVersion( + String code, String libraryAddressPair, String compilerVersion) { String[] libraryAddressList = libraryAddressPair.split("[,]"); @@ -3333,18 +3479,19 @@ private static byte[] replaceLibraryAddresscompilerVersion(String code, String l String libraryName = cur.substring(0, lastPosition); String addr = cur.substring(lastPosition + 1); String libraryAddressHex; - libraryAddressHex = (new String(Hex.encode(Commons.decodeFromBase58Check(addr)), - StandardCharsets.US_ASCII)).substring(2); + libraryAddressHex = + (new String(Hex.encode(Commons.decodeFromBase58Check(addr)), StandardCharsets.US_ASCII)) + .substring(2); String beReplaced; if (compilerVersion == null) { - //old version + // old version String repeated = new String(new char[40 - libraryName.length() - 2]).replace("\0", "_"); beReplaced = "__" + libraryName + repeated; } else if (compilerVersion.equalsIgnoreCase("v5")) { - //0.5.4 version - String libraryNameKeccak256 = ByteArray.toHexString(sha3(ByteArray.fromString(libraryName))) - .substring(0, 34); + // 0.5.4 version + String libraryNameKeccak256 = + ByteArray.toHexString(sha3(ByteArray.fromString(libraryName))).substring(0, 34); beReplaced = "__\\$" + libraryNameKeccak256 + "\\$__"; } else { throw new RuntimeException("unknown compiler version."); @@ -3357,12 +3504,13 @@ private static byte[] replaceLibraryAddresscompilerVersion(String code, String l return Hex.decode(code); } - /** - * constructor. - */ - - public static boolean updateSetting(byte[] contractAddress, long consumeUserResourcePercent, - String priKey, byte[] ownerAddress, WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static boolean updateSetting( + byte[] contractAddress, + long consumeUserResourcePercent, + String priKey, + byte[] ownerAddress, + WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; try { @@ -3380,14 +3528,14 @@ public static boolean updateSetting(byte[] contractAddress, long consumeUserReso builder.setConsumeUserResourcePercent(consumeUserResourcePercent); UpdateSettingContract updateSettingContract = builder.build(); - TransactionExtention transactionExtention = blockingStubFull - .updateSetting(updateSettingContract); + TransactionExtention transactionExtention = + blockingStubFull.updateSetting(updateSettingContract); if (transactionExtention == null || !transactionExtention.getResult().getResult()) { System.out.println("RPC create trx failed!"); if (transactionExtention != null) { System.out.println("Code = " + transactionExtention.getResult().getCode()); - System.out - .println("Message = " + transactionExtention.getResult().getMessage().toStringUtf8()); + System.out.println( + "Message = " + transactionExtention.getResult().getMessage().toStringUtf8()); } return false; } @@ -3412,12 +3560,13 @@ public static boolean updateSetting(byte[] contractAddress, long consumeUserReso return response.getResult(); } - /** - * constructor. - */ - - public static boolean updateSettingDelay(byte[] contractAddress, long consumeUserResourcePercent, - long delaySeconds, String priKey, byte[] ownerAddress, + /** constructor. */ + public static boolean updateSettingDelay( + byte[] contractAddress, + long consumeUserResourcePercent, + long delaySeconds, + String priKey, + byte[] ownerAddress, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; @@ -3436,14 +3585,14 @@ public static boolean updateSettingDelay(byte[] contractAddress, long consumeUse builder.setConsumeUserResourcePercent(consumeUserResourcePercent); UpdateSettingContract updateSettingContract = builder.build(); - TransactionExtention transactionExtention = blockingStubFull - .updateSetting(updateSettingContract); + TransactionExtention transactionExtention = + blockingStubFull.updateSetting(updateSettingContract); if (transactionExtention == null || !transactionExtention.getResult().getResult()) { System.out.println("RPC create trx failed!"); if (transactionExtention != null) { System.out.println("Code = " + transactionExtention.getResult().getCode()); - System.out - .println("Message = " + transactionExtention.getResult().getMessage().toStringUtf8()); + System.out.println( + "Message = " + transactionExtention.getResult().getMessage().toStringUtf8()); } return false; } @@ -3471,12 +3620,13 @@ public static boolean updateSettingDelay(byte[] contractAddress, long consumeUse return false; } - /** - * constructor. - */ - - public static String updateSettingDelayGetTxid(byte[] contractAddress, - long consumeUserResourcePercent, long delaySeconds, String priKey, byte[] ownerAddress, + /** constructor. */ + public static String updateSettingDelayGetTxid( + byte[] contractAddress, + long consumeUserResourcePercent, + long delaySeconds, + String priKey, + byte[] ownerAddress, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; @@ -3495,25 +3645,27 @@ public static String updateSettingDelayGetTxid(byte[] contractAddress, builder.setConsumeUserResourcePercent(consumeUserResourcePercent); UpdateSettingContract updateSettingContract = builder.build(); - TransactionExtention transactionExtention = blockingStubFull - .updateSetting(updateSettingContract); + TransactionExtention transactionExtention = + blockingStubFull.updateSetting(updateSettingContract); if (transactionExtention == null || !transactionExtention.getResult().getResult()) { System.out.println("RPC create trx failed!"); if (transactionExtention != null) { System.out.println("Code = " + transactionExtention.getResult().getCode()); - System.out - .println("Message = " + transactionExtention.getResult().getMessage().toStringUtf8()); + System.out.println( + "Message = " + transactionExtention.getResult().getMessage().toStringUtf8()); } return null; } return null; } - /** - * constructor. - */ - public static String updateEnergyLimitDelayGetTxid(byte[] contractAddress, long originEnergyLimit, - long delaySeconds, String priKey, byte[] ownerAddress, + /** constructor. */ + public static String updateEnergyLimitDelayGetTxid( + byte[] contractAddress, + long originEnergyLimit, + long delaySeconds, + String priKey, + byte[] ownerAddress, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; @@ -3532,18 +3684,18 @@ public static String updateEnergyLimitDelayGetTxid(byte[] contractAddress, long builder.setOriginEnergyLimit(originEnergyLimit); UpdateEnergyLimitContract updateEnergyLimitContract = builder.build(); - TransactionExtention transactionExtention = blockingStubFull - .updateEnergyLimit(updateEnergyLimitContract); + TransactionExtention transactionExtention = + blockingStubFull.updateEnergyLimit(updateEnergyLimitContract); if (transactionExtention == null || !transactionExtention.getResult().getResult()) { System.out.println("RPC create trx failed!"); if (transactionExtention != null) { System.out.println("Code = " + transactionExtention.getResult().getCode()); - System.out - .println("Message = " + transactionExtention.getResult().getMessage().toStringUtf8()); + System.out.println( + "Message = " + transactionExtention.getResult().getMessage().toStringUtf8()); } return null; } - //transactionExtention = TransactionUtils.setDelaySecondsToExtension( + // transactionExtention = TransactionUtils.setDelaySecondsToExtension( // transactionExtention, delaySeconds); if (transactionExtention == null) { return null; @@ -3563,18 +3715,15 @@ public static String updateEnergyLimitDelayGetTxid(byte[] contractAddress, long "Receive txid = " + ByteArray.toHexString(transactionExtention.getTxid().toByteArray())); transaction = signTransaction(ecKey, transaction); GrpcAPI.Return response = broadcastTransaction(transaction, blockingStubFull); - return ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), + return ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), transaction.getRawData().toByteArray())); } - - /** - * 61 constructor. - */ - - public static Optional getTransactionInfoById(String txId, - WalletGrpc.WalletBlockingStub blockingStubFull) { + /** 61 constructor. */ + public static Optional getTransactionInfoById( + String txId, WalletGrpc.WalletBlockingStub blockingStubFull) { ByteString bsTxid = ByteString.copyFrom(ByteArray.fromHexString(txId)); BytesMessage request = BytesMessage.newBuilder().setValue(bsTxid).build(); TransactionInfo transactionInfo; @@ -3582,11 +3731,9 @@ public static Optional getTransactionInfoById(String txId, return Optional.ofNullable(transactionInfo); } - /** - * 61 constructor. - */ - public static Optional getTransactionInfoByIdFromSolidity(String txId, - WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubFull) { + /** 61 constructor. */ + public static Optional getTransactionInfoByIdFromSolidity( + String txId, WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubFull) { ByteString bsTxid = ByteString.copyFrom(ByteArray.fromHexString(txId)); BytesMessage request = BytesMessage.newBuilder().setValue(bsTxid).build(); TransactionInfo transactionInfo; @@ -3594,12 +3741,9 @@ public static Optional getTransactionInfoByIdFromSolidity(Strin return Optional.ofNullable(transactionInfo); } - - /** - * constructor. - */ - public static Optional getTransactionInfoByBlockNum(long blockNum, - WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static Optional getTransactionInfoByBlockNum( + long blockNum, WalletGrpc.WalletBlockingStub blockingStubFull) { NumberMessage.Builder builder = NumberMessage.newBuilder(); builder.setNum(blockNum); TransactionInfoList transactionInfoList; @@ -3607,9 +3751,7 @@ public static Optional getTransactionInfoByBlockNum(long bl return Optional.ofNullable(transactionInfoList); } - /** - * constructor. - */ + /** constructor. */ public static Optional getTransactionInfoByBlockNumFromSolidity( long blockNum, WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubSolidity) { NumberMessage.Builder builder = NumberMessage.newBuilder(); @@ -3619,23 +3761,44 @@ public static Optional getTransactionInfoByBlockNumFromSoli return Optional.ofNullable(transactionInfoList); } - /** - * constructor. - */ - public static String triggerContract(byte[] contractAddress, String method, String argsStr, - Boolean isHex, long callValue, long feeLimit, byte[] ownerAddress, String priKey, + /** constructor. */ + public static String triggerContract( + byte[] contractAddress, + String method, + String argsStr, + Boolean isHex, + long callValue, + long feeLimit, + byte[] ownerAddress, + String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { - return triggerContract(contractAddress, method, argsStr, isHex, callValue, feeLimit, "0", 0, - ownerAddress, priKey, blockingStubFull); + return triggerContract( + contractAddress, + method, + argsStr, + isHex, + callValue, + feeLimit, + "0", + 0, + ownerAddress, + priKey, + blockingStubFull); } - /** - * constructor. - */ - - public static String triggerContract(byte[] contractAddress, String method, String argsStr, - Boolean isHex, long callValue, long feeLimit, String tokenId, long tokenValue, - byte[] ownerAddress, String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static String triggerContract( + byte[] contractAddress, + String method, + String argsStr, + Boolean isHex, + long callValue, + long feeLimit, + String tokenId, + long tokenValue, + byte[] ownerAddress, + String priKey, + WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; try { @@ -3669,12 +3832,13 @@ public static String triggerContract(byte[] contractAddress, String method, Stri if (transactionExtention == null || !transactionExtention.getResult().getResult()) { System.out.println("RPC create call trx failed!"); System.out.println("Code = " + transactionExtention.getResult().getCode()); - System.out - .println("Message = " + transactionExtention.getResult().getMessage().toStringUtf8()); + System.out.println( + "Message = " + transactionExtention.getResult().getMessage().toStringUtf8()); return null; } Transaction transaction = transactionExtention.getTransaction(); - if (transaction.getRetCount() != 0 && transactionExtention.getConstantResult(0) != null + if (transaction.getRetCount() != 0 + && transactionExtention.getConstantResult(0) != null && transactionExtention.getResult() != null) { byte[] result = transactionExtention.getConstantResult(0).toByteArray(); System.out.println("message:" + transaction.getRet(0).getRet()); @@ -3686,8 +3850,8 @@ public static String triggerContract(byte[] contractAddress, String method, Stri final TransactionExtention.Builder texBuilder = TransactionExtention.newBuilder(); Transaction.Builder transBuilder = Transaction.newBuilder(); - Transaction.raw.Builder rawBuilder = transactionExtention.getTransaction().getRawData() - .toBuilder(); + Transaction.raw.Builder rawBuilder = + transactionExtention.getTransaction().getRawData().toBuilder(); rawBuilder.setFeeLimit(feeLimit); transBuilder.setRawData(rawBuilder); @@ -3719,38 +3883,63 @@ public static String triggerContract(byte[] contractAddress, String method, Stri return null; } transaction = signTransaction(ecKey, transaction); - System.out.println("trigger txid = " + ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), - transaction.getRawData().toByteArray()))); + System.out.println( + "trigger txid = " + + ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), + transaction.getRawData().toByteArray()))); GrpcAPI.Return response = broadcastTransaction(transaction, blockingStubFull); if (response.getResult() == false) { return null; } else { - return ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), + return ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), transaction.getRawData().toByteArray())); } } - - /** - * constructor. - */ - public static String triggerContractBoth(byte[] contractAddress, String method, String argsStr, - Boolean isHex, long callValue, long feeLimit, byte[] ownerAddress, String priKey, + /** constructor. */ + public static String triggerContractBoth( + byte[] contractAddress, + String method, + String argsStr, + Boolean isHex, + long callValue, + long feeLimit, + byte[] ownerAddress, + String priKey, WalletGrpc.WalletBlockingStub blockingStubFull, WalletGrpc.WalletBlockingStub blockingStubFull1) { - return triggerContractBoth(contractAddress, method, argsStr, isHex, callValue, feeLimit, "0", 0, - ownerAddress, priKey, blockingStubFull, blockingStubFull1); + return triggerContractBoth( + contractAddress, + method, + argsStr, + isHex, + callValue, + feeLimit, + "0", + 0, + ownerAddress, + priKey, + blockingStubFull, + blockingStubFull1); } - /** - * constructor. - */ - - public static String triggerContractBoth(byte[] contractAddress, String method, String argsStr, - Boolean isHex, long callValue, long feeLimit, String tokenId, long tokenValue, - byte[] ownerAddress, String priKey, WalletGrpc.WalletBlockingStub blockingStubFull, + /** constructor. */ + public static String triggerContractBoth( + byte[] contractAddress, + String method, + String argsStr, + Boolean isHex, + long callValue, + long feeLimit, + String tokenId, + long tokenValue, + byte[] ownerAddress, + String priKey, + WalletGrpc.WalletBlockingStub blockingStubFull, WalletGrpc.WalletBlockingStub blockingStubFull1) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; @@ -3782,12 +3971,13 @@ public static String triggerContractBoth(byte[] contractAddress, String method, if (transactionExtention == null || !transactionExtention.getResult().getResult()) { System.out.println("RPC create call trx failed!"); System.out.println("Code = " + transactionExtention.getResult().getCode()); - System.out - .println("Message = " + transactionExtention.getResult().getMessage().toStringUtf8()); + System.out.println( + "Message = " + transactionExtention.getResult().getMessage().toStringUtf8()); return null; } Transaction transaction = transactionExtention.getTransaction(); - if (transaction.getRetCount() != 0 && transactionExtention.getConstantResult(0) != null + if (transaction.getRetCount() != 0 + && transactionExtention.getConstantResult(0) != null && transactionExtention.getResult() != null) { byte[] result = transactionExtention.getConstantResult(0).toByteArray(); System.out.println("message:" + transaction.getRet(0).getRet()); @@ -3799,8 +3989,8 @@ public static String triggerContractBoth(byte[] contractAddress, String method, final TransactionExtention.Builder texBuilder = TransactionExtention.newBuilder(); Transaction.Builder transBuilder = Transaction.newBuilder(); - Transaction.raw.Builder rawBuilder = transactionExtention.getTransaction().getRawData() - .toBuilder(); + Transaction.raw.Builder rawBuilder = + transactionExtention.getTransaction().getRawData().toBuilder(); rawBuilder.setFeeLimit(feeLimit); transBuilder.setRawData(rawBuilder); for (int i = 0; i < transactionExtention.getTransaction().getSignatureCount(); i++) { @@ -3830,28 +4020,36 @@ public static String triggerContractBoth(byte[] contractAddress, String method, return null; } transaction = signTransaction(ecKey, transaction); - System.out.println("trigger txid = " + ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), - transaction.getRawData().toByteArray()))); - GrpcAPI.Return response = broadcastTransactionBoth(transaction, blockingStubFull, - blockingStubFull1); + System.out.println( + "trigger txid = " + + ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), + transaction.getRawData().toByteArray()))); + GrpcAPI.Return response = + broadcastTransactionBoth(transaction, blockingStubFull, blockingStubFull1); if (response.getResult() == false) { return null; } else { - return ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), + return ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), transaction.getRawData().toByteArray())); } } - - /** - * constructor. - */ - - public static String triggerParamListContract(byte[] contractAddress, String method, - List params, Boolean isHex, long callValue, long feeLimit, String tokenId, - long tokenValue, byte[] ownerAddress, String priKey, + /** constructor. */ + public static String triggerParamListContract( + byte[] contractAddress, + String method, + List params, + Boolean isHex, + long callValue, + long feeLimit, + String tokenId, + long tokenValue, + byte[] ownerAddress, + String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); @@ -3880,12 +4078,13 @@ public static String triggerParamListContract(byte[] contractAddress, String met if (transactionExtention == null || !transactionExtention.getResult().getResult()) { System.out.println("RPC create call trx failed!"); System.out.println("Code = " + transactionExtention.getResult().getCode()); - System.out - .println("Message = " + transactionExtention.getResult().getMessage().toStringUtf8()); + System.out.println( + "Message = " + transactionExtention.getResult().getMessage().toStringUtf8()); return null; } Transaction transaction = transactionExtention.getTransaction(); - if (transaction.getRetCount() != 0 && transactionExtention.getConstantResult(0) != null + if (transaction.getRetCount() != 0 + && transactionExtention.getConstantResult(0) != null && transactionExtention.getResult() != null) { byte[] result = transactionExtention.getConstantResult(0).toByteArray(); System.out.println("message:" + transaction.getRet(0).getRet()); @@ -3897,8 +4096,8 @@ public static String triggerParamListContract(byte[] contractAddress, String met final TransactionExtention.Builder texBuilder = TransactionExtention.newBuilder(); Transaction.Builder transBuilder = Transaction.newBuilder(); - Transaction.raw.Builder rawBuilder = transactionExtention.getTransaction().getRawData() - .toBuilder(); + Transaction.raw.Builder rawBuilder = + transactionExtention.getTransaction().getRawData().toBuilder(); rawBuilder.setFeeLimit(feeLimit); transBuilder.setRawData(rawBuilder); for (int i = 0; i < transactionExtention.getTransaction().getSignatureCount(); i++) { @@ -3928,27 +4127,31 @@ public static String triggerParamListContract(byte[] contractAddress, String met return null; } transaction = signTransaction(ecKey, transaction); - System.out.println("trigger txid = " + ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), - transaction.getRawData().toByteArray()))); + System.out.println( + "trigger txid = " + + ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), + transaction.getRawData().toByteArray()))); GrpcAPI.Return response = broadcastTransaction(transaction, blockingStubFull); if (response.getResult() == false) { return null; } else { - return ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), + return ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), transaction.getRawData().toByteArray())); } - - } - /** - * constructor. - */ - - public static Boolean exchangeCreate(byte[] firstTokenId, long firstTokenBalance, - byte[] secondTokenId, long secondTokenBalance, byte[] ownerAddress, String priKey, + /** constructor. */ + public static Boolean exchangeCreate( + byte[] firstTokenId, + long firstTokenBalance, + byte[] secondTokenId, + long secondTokenBalance, + byte[] ownerAddress, + String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; @@ -3963,8 +4166,10 @@ public static Boolean exchangeCreate(byte[] firstTokenId, long firstTokenBalance byte[] owner = ownerAddress; ExchangeCreateContract.Builder builder = ExchangeCreateContract.newBuilder(); - builder.setOwnerAddress(ByteString.copyFrom(owner)) - .setFirstTokenId(ByteString.copyFrom(firstTokenId)).setFirstTokenBalance(firstTokenBalance) + builder + .setOwnerAddress(ByteString.copyFrom(owner)) + .setFirstTokenId(ByteString.copyFrom(firstTokenId)) + .setFirstTokenBalance(firstTokenBalance) .setSecondTokenId(ByteString.copyFrom(secondTokenId)) .setSecondTokenBalance(secondTokenBalance); ExchangeCreateContract contract = builder.build(); @@ -3986,21 +4191,26 @@ public static Boolean exchangeCreate(byte[] firstTokenId, long firstTokenBalance System.out.println( "Receive txid = " + ByteArray.toHexString(transactionExtention.getTxid().toByteArray())); transaction = signTransaction(ecKey, transaction); - System.out.println("txid = " + ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), - transaction.getRawData().toByteArray()))); + System.out.println( + "txid = " + + ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), + transaction.getRawData().toByteArray()))); GrpcAPI.Return response = broadcastTransaction(transaction, blockingStubFull); return response.getResult(); } - /** - * constructor. - */ - - public static Boolean injectExchange(long exchangeId, byte[] tokenId, long quant, - byte[] ownerAddress, String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static Boolean injectExchange( + long exchangeId, + byte[] tokenId, + long quant, + byte[] ownerAddress, + String priKey, + WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; try { @@ -4014,8 +4224,11 @@ public static Boolean injectExchange(long exchangeId, byte[] tokenId, long quant byte[] owner = ownerAddress; ExchangeInjectContract.Builder builder = ExchangeInjectContract.newBuilder(); - builder.setOwnerAddress(ByteString.copyFrom(owner)).setExchangeId(exchangeId) - .setTokenId(ByteString.copyFrom(tokenId)).setQuant(quant); + builder + .setOwnerAddress(ByteString.copyFrom(owner)) + .setExchangeId(exchangeId) + .setTokenId(ByteString.copyFrom(tokenId)) + .setQuant(quant); ExchangeInjectContract contract = builder.build(); TransactionExtention transactionExtention = blockingStubFull.exchangeInject(contract); if (transactionExtention == null) { @@ -4035,9 +4248,12 @@ public static Boolean injectExchange(long exchangeId, byte[] tokenId, long quant System.out.println( "Receive txid = " + ByteArray.toHexString(transactionExtention.getTxid().toByteArray())); transaction = signTransaction(ecKey, transaction); - System.out.println("txid = " + ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), - transaction.getRawData().toByteArray()))); + System.out.println( + "txid = " + + ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), + transaction.getRawData().toByteArray()))); GrpcAPI.Return response = broadcastTransaction(transaction, blockingStubFull); return response.getResult(); @@ -4049,48 +4265,44 @@ public static Optional getExchangeList( return Optional.ofNullable(exchangeList); } - /** - * constructor. - */ - + /** constructor. */ public static Optional getExchangeList( WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubSolidity) { - ExchangeList exchangeList = blockingStubSolidity - .listExchanges(EmptyMessage.newBuilder().build()); + ExchangeList exchangeList = + blockingStubSolidity.listExchanges(EmptyMessage.newBuilder().build()); return Optional.ofNullable(exchangeList); } - - /** - * constructor. - */ - - public static Optional getExchange(String id, - WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubSolidity) { - BytesMessage request = BytesMessage.newBuilder() - .setValue(ByteString.copyFrom(ByteArray.fromLong(Long.parseLong(id)))).build(); + /** constructor. */ + public static Optional getExchange( + String id, WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubSolidity) { + BytesMessage request = + BytesMessage.newBuilder() + .setValue(ByteString.copyFrom(ByteArray.fromLong(Long.parseLong(id)))) + .build(); Exchange exchange = blockingStubSolidity.getExchangeById(request); return Optional.ofNullable(exchange); } - /** - * constructor. - */ - - public static Optional getExchange(String id, - WalletGrpc.WalletBlockingStub blockingStubFull) { - BytesMessage request = BytesMessage.newBuilder() - .setValue(ByteString.copyFrom(ByteArray.fromLong(Long.parseLong(id)))).build(); + /** constructor. */ + public static Optional getExchange( + String id, WalletGrpc.WalletBlockingStub blockingStubFull) { + BytesMessage request = + BytesMessage.newBuilder() + .setValue(ByteString.copyFrom(ByteArray.fromLong(Long.parseLong(id)))) + .build(); Exchange exchange = blockingStubFull.getExchangeById(request); return Optional.ofNullable(exchange); } - /** - * constructor. - */ - - public static boolean exchangeWithdraw(long exchangeId, byte[] tokenId, long quant, - byte[] ownerAddress, String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static boolean exchangeWithdraw( + long exchangeId, + byte[] tokenId, + long quant, + byte[] ownerAddress, + String priKey, + WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; try { @@ -4103,8 +4315,11 @@ public static boolean exchangeWithdraw(long exchangeId, byte[] tokenId, long qua byte[] owner = ownerAddress; ExchangeWithdrawContract.Builder builder = ExchangeWithdrawContract.newBuilder(); - builder.setOwnerAddress(ByteString.copyFrom(owner)).setExchangeId(exchangeId) - .setTokenId(ByteString.copyFrom(tokenId)).setQuant(quant); + builder + .setOwnerAddress(ByteString.copyFrom(owner)) + .setExchangeId(exchangeId) + .setTokenId(ByteString.copyFrom(tokenId)) + .setQuant(quant); ExchangeWithdrawContract contract = builder.build(); TransactionExtention transactionExtention = blockingStubFull.exchangeWithdraw(contract); if (transactionExtention == null) { @@ -4124,20 +4339,25 @@ public static boolean exchangeWithdraw(long exchangeId, byte[] tokenId, long qua System.out.println( "Receive txid = " + ByteArray.toHexString(transactionExtention.getTxid().toByteArray())); transaction = signTransaction(ecKey, transaction); - System.out.println("txid = " + ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), - transaction.getRawData().toByteArray()))); + System.out.println( + "txid = " + + ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), + transaction.getRawData().toByteArray()))); GrpcAPI.Return response = broadcastTransaction(transaction, blockingStubFull); return response.getResult(); } - /** - * constructor. - */ - - public static boolean exchangeTransaction(long exchangeId, byte[] tokenId, long quant, - long expected, byte[] ownerAddress, String priKey, + /** constructor. */ + public static boolean exchangeTransaction( + long exchangeId, + byte[] tokenId, + long quant, + long expected, + byte[] ownerAddress, + String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; @@ -4151,8 +4371,12 @@ public static boolean exchangeTransaction(long exchangeId, byte[] tokenId, long byte[] owner = ownerAddress; ExchangeTransactionContract.Builder builder = ExchangeTransactionContract.newBuilder(); - builder.setOwnerAddress(ByteString.copyFrom(owner)).setExchangeId(exchangeId) - .setTokenId(ByteString.copyFrom(tokenId)).setQuant(quant).setExpected(expected); + builder + .setOwnerAddress(ByteString.copyFrom(owner)) + .setExchangeId(exchangeId) + .setTokenId(ByteString.copyFrom(tokenId)) + .setQuant(quant) + .setExpected(expected); ExchangeTransactionContract contract = builder.build(); TransactionExtention transactionExtention = blockingStubFull.exchangeTransaction(contract); if (transactionExtention == null) { @@ -4172,35 +4396,68 @@ public static boolean exchangeTransaction(long exchangeId, byte[] tokenId, long System.out.println( "Receive txid = " + ByteArray.toHexString(transactionExtention.getTxid().toByteArray())); transaction = signTransaction(ecKey, transaction); - System.out.println("txid = " + ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), - transaction.getRawData().toByteArray()))); + System.out.println( + "txid = " + + ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), + transaction.getRawData().toByteArray()))); GrpcAPI.Return response = broadcastTransaction(transaction, blockingStubFull); return response.getResult(); } - /** - * constructor. - */ - - public static String deployContractWithConstantParame(String contractName, String abiString, - String code, String constructorStr, String argsStr, String data, Long feeLimit, long value, - long consumeUserResourcePercent, String libraryAddress, String priKey, byte[] ownerAddress, + /** constructor. */ + public static String deployContractWithConstantParame( + String contractName, + String abiString, + String code, + String constructorStr, + String argsStr, + String data, + Long feeLimit, + long value, + long consumeUserResourcePercent, + String libraryAddress, + String priKey, + byte[] ownerAddress, WalletGrpc.WalletBlockingStub blockingStubFull) { - return deployContractWithConstantParame(contractName, abiString, code, constructorStr, argsStr, - data, feeLimit, value, consumeUserResourcePercent, 1000L, "0", 0L, libraryAddress, priKey, - ownerAddress, blockingStubFull); + return deployContractWithConstantParame( + contractName, + abiString, + code, + constructorStr, + argsStr, + data, + feeLimit, + value, + consumeUserResourcePercent, + 1000L, + "0", + 0L, + libraryAddress, + priKey, + ownerAddress, + blockingStubFull); } - /** - * constructor. - */ - - public static String deployContractWithConstantParame(String contractName, String abiString, - String code, String constructorStr, String argsStr, String data, Long feeLimit, long value, - long consumeUserResourcePercent, long originEnergyLimit, String tokenId, long tokenValue, - String libraryAddress, String priKey, byte[] ownerAddress, + /** constructor. */ + public static String deployContractWithConstantParame( + String contractName, + String abiString, + String code, + String constructorStr, + String argsStr, + String data, + Long feeLimit, + long value, + long consumeUserResourcePercent, + long originEnergyLimit, + String tokenId, + long tokenValue, + String libraryAddress, + String priKey, + byte[] ownerAddress, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; @@ -4244,25 +4501,25 @@ public static String deployContractWithConstantParame(String contractName, Strin contractBuilder.setOwnerAddress(ByteString.copyFrom(owner)); contractBuilder.setCallTokenValue(tokenValue); contractBuilder.setTokenId(Long.parseLong(tokenId)); - CreateSmartContract contractDeployContract = contractBuilder.setNewContract(builder.build()) - .build(); + CreateSmartContract contractDeployContract = + contractBuilder.setNewContract(builder.build()).build(); - TransactionExtention transactionExtention = blockingStubFull - .deployContract(contractDeployContract); + TransactionExtention transactionExtention = + blockingStubFull.deployContract(contractDeployContract); if (transactionExtention == null || !transactionExtention.getResult().getResult()) { System.out.println("RPC create trx failed!"); if (transactionExtention != null) { System.out.println("Code = " + transactionExtention.getResult().getCode()); - System.out - .println("Message = " + transactionExtention.getResult().getMessage().toStringUtf8()); + System.out.println( + "Message = " + transactionExtention.getResult().getMessage().toStringUtf8()); } return null; } final TransactionExtention.Builder texBuilder = TransactionExtention.newBuilder(); Transaction.Builder transBuilder = Transaction.newBuilder(); - Transaction.raw.Builder rawBuilder = transactionExtention.getTransaction().getRawData() - .toBuilder(); + Transaction.raw.Builder rawBuilder = + transactionExtention.getTransaction().getRawData().toBuilder(); rawBuilder.setFeeLimit(feeLimit); transBuilder.setRawData(rawBuilder); for (int i = 0; i < transactionExtention.getTransaction().getSignatureCount(); i++) { @@ -4293,9 +4550,12 @@ public static String deployContractWithConstantParame(String contractName, Strin return null; } transaction = signTransaction(ecKey, transaction); - System.out.println("txid = " + ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), - transaction.getRawData().toByteArray()))); + System.out.println( + "txid = " + + ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), + transaction.getRawData().toByteArray()))); byte[] contractAddress = generateContractAddress(transaction, owner); System.out.println( "Your smart contract address will be: " + WalletClient.encode58Check(contractAddress)); @@ -4303,19 +4563,22 @@ public static String deployContractWithConstantParame(String contractName, Strin if (response.getResult() == false) { return null; } else { - //logger.info("brodacast succesfully"); - return ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), + // logger.info("brodacast succesfully"); + return ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), transaction.getRawData().toByteArray())); } } - /** - * constructor. - */ - - public static Boolean freezeBalanceForReceiver(byte[] addRess, long freezeBalance, - long freezeDuration, int resourceCode, ByteString receiverAddressBytes, String priKey, + /** constructor. */ + public static Boolean freezeBalanceForReceiver( + byte[] addRess, + long freezeBalance, + long freezeDuration, + int resourceCode, + ByteString receiverAddressBytes, + String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); byte[] address = addRess; @@ -4333,8 +4596,11 @@ public static Boolean freezeBalanceForReceiver(byte[] addRess, long freezeBalanc FreezeBalanceContract.Builder builder = FreezeBalanceContract.newBuilder(); ByteString byteAddreess = ByteString.copyFrom(address); - builder.setOwnerAddress(byteAddreess).setFrozenBalance(frozenBalance) - .setFrozenDuration(frozenDuration).setResourceValue(resourceCode); + builder + .setOwnerAddress(byteAddreess) + .setFrozenBalance(frozenBalance) + .setFrozenDuration(frozenDuration) + .setResourceValue(resourceCode); if (receiverAddressBytes != null) { builder.setReceiverAddress(receiverAddressBytes); } @@ -4351,43 +4617,41 @@ public static Boolean freezeBalanceForReceiver(byte[] addRess, long freezeBalanc return response.getResult(); } - - /** - * constructor. - */ - - public static Optional getDelegatedResource(byte[] fromAddress, - byte[] toAddress, WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static Optional getDelegatedResource( + byte[] fromAddress, byte[] toAddress, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ByteString fromAddressBs = ByteString.copyFrom(fromAddress); ByteString toAddressBs = ByteString.copyFrom(toAddress); - DelegatedResourceMessage request = DelegatedResourceMessage.newBuilder() - .setFromAddress(fromAddressBs).setToAddress(toAddressBs).build(); + DelegatedResourceMessage request = + DelegatedResourceMessage.newBuilder() + .setFromAddress(fromAddressBs) + .setToAddress(toAddressBs) + .build(); DelegatedResourceList delegatedResource = blockingStubFull.getDelegatedResource(request); return Optional.ofNullable(delegatedResource); } - /** - * constructor. - */ - public static Optional getDelegatedResourceFromSolidity(byte[] fromAddress, - byte[] toAddress, WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubFull) { + /** constructor. */ + public static Optional getDelegatedResourceFromSolidity( + byte[] fromAddress, + byte[] toAddress, + WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ByteString fromAddressBs = ByteString.copyFrom(fromAddress); ByteString toAddressBs = ByteString.copyFrom(toAddress); - DelegatedResourceMessage request = DelegatedResourceMessage.newBuilder() - .setFromAddress(fromAddressBs).setToAddress(toAddressBs).build(); + DelegatedResourceMessage request = + DelegatedResourceMessage.newBuilder() + .setFromAddress(fromAddressBs) + .setToAddress(toAddressBs) + .build(); DelegatedResourceList delegatedResource = blockingStubFull.getDelegatedResource(request); return Optional.ofNullable(delegatedResource); } - - /** - * constructor. - */ - + /** constructor. */ public static Optional getDelegatedResourceAccountIndex( byte[] address, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); @@ -4396,60 +4660,47 @@ public static Optional getDelegatedResourceAccoun BytesMessage bytesMessage = BytesMessage.newBuilder().setValue(addressBs).build(); - DelegatedResourceAccountIndex accountIndex = blockingStubFull - .getDelegatedResourceAccountIndex(bytesMessage); + DelegatedResourceAccountIndex accountIndex = + blockingStubFull.getDelegatedResourceAccountIndex(bytesMessage); return Optional.ofNullable(accountIndex); } - - /** - * constructor. - */ + /** constructor. */ public static Optional - getDelegatedResourceAccountIndexFromSolidity(byte[] address, - WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubFull) { + getDelegatedResourceAccountIndexFromSolidity( + byte[] address, WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ByteString addressBs = ByteString.copyFrom(address); BytesMessage bytesMessage = BytesMessage.newBuilder().setValue(addressBs).build(); - DelegatedResourceAccountIndex accountIndex = blockingStubFull - .getDelegatedResourceAccountIndex(bytesMessage); + DelegatedResourceAccountIndex accountIndex = + blockingStubFull.getDelegatedResourceAccountIndex(bytesMessage); return Optional.ofNullable(accountIndex); } - - /** - * constructor. - */ - - public static AssetIssueContract getAssetIssueByName(String assetName, - WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static AssetIssueContract getAssetIssueByName( + String assetName, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ByteString assetNameBs = ByteString.copyFrom(assetName.getBytes()); BytesMessage request = BytesMessage.newBuilder().setValue(assetNameBs).build(); return blockingStubFull.getAssetIssueByName(request); } - /** - * constructor. - */ - public static AssetIssueContract getAssetIssueByNameFromSolidity(String assetName, - WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubFull) { + /** constructor. */ + public static AssetIssueContract getAssetIssueByNameFromSolidity( + String assetName, WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ByteString assetNameBs = ByteString.copyFrom(assetName.getBytes()); BytesMessage request = BytesMessage.newBuilder().setValue(assetNameBs).build(); return blockingStubFull.getAssetIssueByName(request); } - - /** - * constructor. - */ - - public static Optional getAssetIssueListByName(String assetName, - WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static Optional getAssetIssueListByName( + String assetName, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ByteString assetNameBs = ByteString.copyFrom(assetName.getBytes()); BytesMessage request = BytesMessage.newBuilder().setValue(assetNameBs).build(); @@ -4457,11 +4708,9 @@ public static Optional getAssetIssueListByName(String assetName, return Optional.ofNullable(assetIssueList); } - /** - * constructor. - */ - public static Optional getAssetIssueListByNameFromSolidity(String assetName, - WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubFull) { + /** constructor. */ + public static Optional getAssetIssueListByNameFromSolidity( + String assetName, WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ByteString assetNameBs = ByteString.copyFrom(assetName.getBytes()); BytesMessage request = BytesMessage.newBuilder().setValue(assetNameBs).build(); @@ -4469,79 +4718,62 @@ public static Optional getAssetIssueListByNameFromSolidity(Strin return Optional.ofNullable(assetIssueList); } - /** - * constructor. - */ + /** constructor. */ public static Optional listAssetIssueFromSolidity( WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubFull) { - GrpcAPI.AssetIssueList assetIssueList = blockingStubFull - .getAssetIssueList(EmptyMessage.newBuilder().build()); + GrpcAPI.AssetIssueList assetIssueList = + blockingStubFull.getAssetIssueList(EmptyMessage.newBuilder().build()); return Optional.ofNullable(assetIssueList); } - /** - * constructor. - */ + /** constructor. */ public static Optional listAssetIssuepaginatedFromSolidity( WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubFull, Long offset, Long limit) { GrpcAPI.PaginatedMessage.Builder pageMessageBuilder = GrpcAPI.PaginatedMessage.newBuilder(); pageMessageBuilder.setOffset(offset); pageMessageBuilder.setLimit(limit); - AssetIssueList assetIssueList = blockingStubFull - .getPaginatedAssetIssueList(pageMessageBuilder.build()); + AssetIssueList assetIssueList = + blockingStubFull.getPaginatedAssetIssueList(pageMessageBuilder.build()); return Optional.ofNullable(assetIssueList); } - - /** - * constructor. - */ + /** constructor. */ public static Optional listWitnesses( WalletGrpc.WalletBlockingStub blockingStubFull) { - GrpcAPI.WitnessList witnessList = blockingStubFull - .listWitnesses(EmptyMessage.newBuilder().build()); + GrpcAPI.WitnessList witnessList = + blockingStubFull.listWitnesses(EmptyMessage.newBuilder().build()); return Optional.ofNullable(witnessList); } - /** - * constructor. - */ + /** constructor. */ public static Optional listWitnessesFromSolidity( WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubFull) { - GrpcAPI.WitnessList witnessList = blockingStubFull - .listWitnesses(EmptyMessage.newBuilder().build()); + GrpcAPI.WitnessList witnessList = + blockingStubFull.listWitnesses(EmptyMessage.newBuilder().build()); return Optional.ofNullable(witnessList); } - - /** - * constructor. - */ - - public static AssetIssueContract getAssetIssueById(String assetId, - WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static AssetIssueContract getAssetIssueById( + String assetId, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ByteString assetIdBs = ByteString.copyFrom(assetId.getBytes()); BytesMessage request = BytesMessage.newBuilder().setValue(assetIdBs).build(); return blockingStubFull.getAssetIssueById(request); } - /** - * constructor. - */ - public static AssetIssueContract getAssetIssueByIdFromSolidity(String assetId, - WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubFull) { + /** constructor. */ + public static AssetIssueContract getAssetIssueByIdFromSolidity( + String assetId, WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ByteString assetIdBs = ByteString.copyFrom(assetId.getBytes()); BytesMessage request = BytesMessage.newBuilder().setValue(assetIdBs).build(); return blockingStubFull.getAssetIssueById(request); } - /** - * constructor. - */ - public static Optional getAssetIssueByAccount(byte[] address, - WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static Optional getAssetIssueByAccount( + byte[] address, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ByteString addressBs = ByteString.copyFrom(address); Account request = Account.newBuilder().setAddress(addressBs).build(); @@ -4560,7 +4792,7 @@ private static Permission json2Permission(JSONObject json) { permissionBuilder.setPermissionName(permissionName); } if (json.containsKey("threshold")) { - //long threshold = json.getLong("threshold"); + // long threshold = json.getLong("threshold"); long threshold = Long.parseLong(json.getString("threshold")); permissionBuilder.setThreshold(threshold); } @@ -4580,8 +4812,8 @@ private static Permission json2Permission(JSONObject json) { JSONObject key = keys.getJSONObject(i); String address = key.getString("address"); long weight = Long.parseLong(key.getString("weight")); - //long weight = key.getLong("weight"); - //keyBuilder.setAddress(ByteString.copyFrom(address.getBytes())); + // long weight = key.getLong("weight"); + // keyBuilder.setAddress(ByteString.copyFrom(address.getBytes())); keyBuilder.setAddress(ByteString.copyFrom(WalletClient.decodeFromBase58Check(address))); keyBuilder.setWeight(weight); keyList.add(keyBuilder.build()); @@ -4591,11 +4823,13 @@ private static Permission json2Permission(JSONObject json) { return permissionBuilder.build(); } - /** - * constructor. - */ - public static boolean accountPermissionUpdate(String permissionJson, byte[] owner, String priKey, - WalletGrpc.WalletBlockingStub blockingStubFull, String[] priKeys) { + /** constructor. */ + public static boolean accountPermissionUpdate( + String permissionJson, + byte[] owner, + String priKey, + WalletGrpc.WalletBlockingStub blockingStubFull, + String[] priKeys) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; try { @@ -4655,13 +4889,13 @@ public static boolean accountPermissionUpdate(String permissionJson, byte[] owne return response.getResult(); } - - /** - * constructor. - */ - public static long getFreezeBalanceCount(byte[] accountAddress, String ecKey, Long targetEnergy, + /** constructor. */ + public static long getFreezeBalanceCount( + byte[] accountAddress, + String ecKey, + Long targetEnergy, WalletGrpc.WalletBlockingStub blockingStubFull) { - //Precision change as the entire network freezes + // Precision change as the entire network freezes AccountResourceMessage resourceInfo = getAccountResource(accountAddress, blockingStubFull); Account info = queryAccount(accountAddress, blockingStubFull); @@ -4685,9 +4919,12 @@ public static long getFreezeBalanceCount(byte[] accountAddress, String ecKey, Lo // totalEnergyLimit / (totalEnergyWeight + needBalance) = needEnergy / needBalance final BigInteger totalEnergyWeightBi = BigInteger.valueOf(totalEnergyWeight); - long needBalance = totalEnergyWeightBi.multiply(BigInteger.valueOf(1_000_000)) - .multiply(BigInteger.valueOf(targetEnergy)) - .divide(BigInteger.valueOf(totalEnergyLimit - targetEnergy)).longValue(); + long needBalance = + totalEnergyWeightBi + .multiply(BigInteger.valueOf(1_000_000)) + .multiply(BigInteger.valueOf(targetEnergy)) + .divide(BigInteger.valueOf(totalEnergyLimit - targetEnergy)) + .longValue(); logger.info("getFreezeBalanceCount, needBalance: " + needBalance); @@ -4698,10 +4935,10 @@ public static long getFreezeBalanceCount(byte[] accountAddress, String ecKey, Lo return needBalance; } - /** - * constructor. - */ - public static Long getAssetIssueValue(byte[] accountAddress, ByteString assetIssueId, + /** constructor. */ + public static Long getAssetIssueValue( + byte[] accountAddress, + ByteString assetIssueId, WalletGrpc.WalletBlockingStub blockingStubFull) { Long assetIssueCount = 0L; Account contractAccount = queryAccount(accountAddress, blockingStubFull); @@ -4714,9 +4951,7 @@ public static Long getAssetIssueValue(byte[] accountAddress, ByteString assetIss return assetIssueCount; } - /** - * constructor. - */ + /** constructor. */ public static List getStrings(byte[] data) { int index = 0; List ret = new ArrayList<>(); @@ -4727,9 +4962,7 @@ public static List getStrings(byte[] data) { return ret; } - /** - * constructor. - */ + /** constructor. */ public static String byte2HexStr(byte[] b, int offset, int length) { StringBuilder ssBuilder = new StringBuilder(); for (int n = offset; n < offset + length && n < b.length; n++) { @@ -4739,12 +4972,9 @@ public static String byte2HexStr(byte[] b, int offset, int length) { return ssBuilder.toString().toUpperCase().trim(); } - - /** - * constructor. - */ - public static Transaction addTransactionSign(Transaction transaction, String priKey, - WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static Transaction addTransactionSign( + Transaction transaction, String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; try { @@ -4756,8 +4986,10 @@ public static Transaction addTransactionSign(Transaction transaction, String pri ECKey ecKey = temKey; Transaction.Builder transactionBuilderSigned = transaction.toBuilder(); - byte[] hash = Sha256Hash.hash(CommonParameter.getInstance().isECKeyCryptoEngine(), - transaction.getRawData().toByteArray()); + byte[] hash = + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), + transaction.getRawData().toByteArray()); ECDSASignature signature = ecKey.sign(hash); ByteString bsSign = ByteString.copyFrom(signature.toByteArray()); @@ -4766,13 +4998,22 @@ public static Transaction addTransactionSign(Transaction transaction, String pri return transaction; } - /** - * constructor. - */ - public static GrpcAPI.Return deployContractAndGetResponse(String contractName, String abiString, - String code, String data, Long feeLimit, long value, long consumeUserResourcePercent, - long originEnergyLimit, String tokenId, long tokenValue, String libraryAddress, String priKey, - byte[] ownerAddress, WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static GrpcAPI.Return deployContractAndGetResponse( + String contractName, + String abiString, + String code, + String data, + Long feeLimit, + long value, + long consumeUserResourcePercent, + long originEnergyLimit, + String tokenId, + long tokenValue, + String libraryAddress, + String priKey, + byte[] ownerAddress, + WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; try { @@ -4789,7 +5030,7 @@ public static GrpcAPI.Return deployContractAndGetResponse(String contractName, S logger.error("abi is null"); return null; } - //byte[] codeBytes = Hex.decode(code); + // byte[] codeBytes = Hex.decode(code); SmartContract.Builder builder = SmartContract.newBuilder(); builder.setName(contractName); builder.setOriginAddress(ByteString.copyFrom(owner)); @@ -4814,25 +5055,25 @@ public static GrpcAPI.Return deployContractAndGetResponse(String contractName, S contractBuilder.setOwnerAddress(ByteString.copyFrom(owner)); contractBuilder.setCallTokenValue(tokenValue); contractBuilder.setTokenId(Long.parseLong(tokenId)); - CreateSmartContract contractDeployContract = contractBuilder.setNewContract(builder.build()) - .build(); + CreateSmartContract contractDeployContract = + contractBuilder.setNewContract(builder.build()).build(); - TransactionExtention transactionExtention = blockingStubFull - .deployContract(contractDeployContract); + TransactionExtention transactionExtention = + blockingStubFull.deployContract(contractDeployContract); if (transactionExtention == null || !transactionExtention.getResult().getResult()) { System.out.println("RPC create trx failed!"); if (transactionExtention != null) { System.out.println("Code = " + transactionExtention.getResult().getCode()); - System.out - .println("Message = " + transactionExtention.getResult().getMessage().toStringUtf8()); + System.out.println( + "Message = " + transactionExtention.getResult().getMessage().toStringUtf8()); } return null; } final TransactionExtention.Builder texBuilder = TransactionExtention.newBuilder(); Transaction.Builder transBuilder = Transaction.newBuilder(); - Transaction.raw.Builder rawBuilder = transactionExtention.getTransaction().getRawData() - .toBuilder(); + Transaction.raw.Builder rawBuilder = + transactionExtention.getTransaction().getRawData().toBuilder(); rawBuilder.setFeeLimit(feeLimit); transBuilder.setRawData(rawBuilder); for (int i = 0; i < transactionExtention.getTransaction().getSignatureCount(); i++) { @@ -4863,9 +5104,12 @@ public static GrpcAPI.Return deployContractAndGetResponse(String contractName, S return null; } transaction = signTransaction(ecKey, transaction); - System.out.println("txid = " + ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), - transaction.getRawData().toByteArray()))); + System.out.println( + "txid = " + + ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), + transaction.getRawData().toByteArray()))); byte[] contractAddress = generateContractAddress(transaction, owner); System.out.println( "Your smart contract address will be: " + WalletClient.encode58Check(contractAddress)); @@ -4874,12 +5118,19 @@ public static GrpcAPI.Return deployContractAndGetResponse(String contractName, S return response; } - /** - * constructor. - */ - public static GrpcAPI.Return triggerContractAndGetResponse(byte[] contractAddress, String method, - String argsStr, Boolean isHex, long callValue, long feeLimit, String tokenId, long tokenValue, - byte[] ownerAddress, String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static GrpcAPI.Return triggerContractAndGetResponse( + byte[] contractAddress, + String method, + String argsStr, + Boolean isHex, + long callValue, + long feeLimit, + String tokenId, + long tokenValue, + byte[] ownerAddress, + String priKey, + WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; try { @@ -4910,12 +5161,13 @@ public static GrpcAPI.Return triggerContractAndGetResponse(byte[] contractAddres if (transactionExtention == null || !transactionExtention.getResult().getResult()) { System.out.println("RPC create call trx failed!"); System.out.println("Code = " + transactionExtention.getResult().getCode()); - System.out - .println("Message = " + transactionExtention.getResult().getMessage().toStringUtf8()); + System.out.println( + "Message = " + transactionExtention.getResult().getMessage().toStringUtf8()); return null; } Transaction transaction = transactionExtention.getTransaction(); - if (transaction.getRetCount() != 0 && transactionExtention.getConstantResult(0) != null + if (transaction.getRetCount() != 0 + && transactionExtention.getConstantResult(0) != null && transactionExtention.getResult() != null) { byte[] result = transactionExtention.getConstantResult(0).toByteArray(); System.out.println("message:" + transaction.getRet(0).getRet()); @@ -4927,8 +5179,8 @@ public static GrpcAPI.Return triggerContractAndGetResponse(byte[] contractAddres final TransactionExtention.Builder texBuilder = TransactionExtention.newBuilder(); Transaction.Builder transBuilder = Transaction.newBuilder(); - Transaction.raw.Builder rawBuilder = transactionExtention.getTransaction().getRawData() - .toBuilder(); + Transaction.raw.Builder rawBuilder = + transactionExtention.getTransaction().getRawData().toBuilder(); rawBuilder.setFeeLimit(feeLimit); transBuilder.setRawData(rawBuilder); for (int i = 0; i < transactionExtention.getTransaction().getSignatureCount(); i++) { @@ -4958,18 +5210,23 @@ public static GrpcAPI.Return triggerContractAndGetResponse(byte[] contractAddres return null; } transaction = signTransaction(ecKey, transaction); - System.out.println("trigger txid = " + ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), - transaction.getRawData().toByteArray()))); + System.out.println( + "trigger txid = " + + ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), + transaction.getRawData().toByteArray()))); GrpcAPI.Return response = broadcastTransaction(transaction, blockingStubFull); return response; } - /** - * constructor. - */ - public static boolean updateEnergyLimit(byte[] contractAddress, long originEnergyLimit, - String priKey, byte[] ownerAddress, WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static boolean updateEnergyLimit( + byte[] contractAddress, + long originEnergyLimit, + String priKey, + byte[] ownerAddress, + WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; try { @@ -4987,14 +5244,14 @@ public static boolean updateEnergyLimit(byte[] contractAddress, long originEnerg builder.setOriginEnergyLimit(originEnergyLimit); UpdateEnergyLimitContract updateEnergyLimitContract = builder.build(); - TransactionExtention transactionExtention = blockingStubFull - .updateEnergyLimit(updateEnergyLimitContract); + TransactionExtention transactionExtention = + blockingStubFull.updateEnergyLimit(updateEnergyLimitContract); if (transactionExtention == null || !transactionExtention.getResult().getResult()) { System.out.println("RPC create trx failed!"); if (transactionExtention != null) { System.out.println("Code = " + transactionExtention.getResult().getCode()); - System.out - .println("Message = " + transactionExtention.getResult().getMessage().toStringUtf8()); + System.out.println( + "Message = " + transactionExtention.getResult().getMessage().toStringUtf8()); } return false; } @@ -5019,11 +5276,12 @@ public static boolean updateEnergyLimit(byte[] contractAddress, long originEnerg return response.getResult(); } - /** - * constructor. - */ - public static GrpcAPI.Return accountPermissionUpdateForResponse(String permissionJson, - byte[] owner, String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static GrpcAPI.Return accountPermissionUpdateForResponse( + String permissionJson, + byte[] owner, + String priKey, + WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; try { @@ -5084,17 +5342,18 @@ public static GrpcAPI.Return accountPermissionUpdateForResponse(String permissio return response; } - public static TransactionApprovedList getTransactionApprovedList(Transaction transaction, - WalletGrpc.WalletBlockingStub blockingStubFull) { + public static TransactionApprovedList getTransactionApprovedList( + Transaction transaction, WalletGrpc.WalletBlockingStub blockingStubFull) { return blockingStubFull.getTransactionApprovedList(transaction); } - /** - * constructor. - */ - public static long getFreezeBalanceNetCount(byte[] accountAddress, String ecKey, Long targetNet, + /** constructor. */ + public static long getFreezeBalanceNetCount( + byte[] accountAddress, + String ecKey, + Long targetNet, WalletGrpc.WalletBlockingStub blockingStubFull) { - //Precision change as the entire network freezes + // Precision change as the entire network freezes AccountResourceMessage resourceInfo = getAccountResource(accountAddress, blockingStubFull); Account info = queryAccount(accountAddress, blockingStubFull); @@ -5117,29 +5376,29 @@ public static long getFreezeBalanceNetCount(byte[] accountAddress, String ecKey, // totalNetLimit / (totalNetWeight + needBalance) = needNet / needBalance final BigInteger totalNetWeightBi = BigInteger.valueOf(totalNetWeight); - long needBalance = totalNetWeightBi.multiply(BigInteger.valueOf(1_000_000)) - .multiply(BigInteger.valueOf(targetNet)) - .divide(BigInteger.valueOf(totalNetLimit - targetNet)).longValue(); + long needBalance = + totalNetWeightBi + .multiply(BigInteger.valueOf(1_000_000)) + .multiply(BigInteger.valueOf(targetNet)) + .divide(BigInteger.valueOf(totalNetLimit - targetNet)) + .longValue(); logger.info("getFreezeBalanceNetCount, needBalance: " + needBalance); if (needBalance < 1000000L) { needBalance = 1000000L; - logger - .info("getFreezeBalanceNetCount, needBalance less than 1 TRX, modify to: " + needBalance); + logger.info( + "getFreezeBalanceNetCount, needBalance less than 1 TRX, modify to: " + needBalance); } return needBalance; } - /** - * constructor. - */ - public static GrpcAPI.Return broadcastTransaction(Transaction transaction, - WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static GrpcAPI.Return broadcastTransaction( + Transaction transaction, WalletGrpc.WalletBlockingStub blockingStubFull) { int i = 10; GrpcAPI.Return response = blockingStubFull.broadcastTransaction(transaction); - while (!response.getResult() && response.getCode() == response_code.SERVER_BUSY - && i > 0) { + while (!response.getResult() && response.getCode() == response_code.SERVER_BUSY && i > 0) { try { Thread.sleep(300); } catch (InterruptedException e) { @@ -5157,17 +5416,17 @@ public static GrpcAPI.Return broadcastTransaction(Transaction transaction, return response; } - /** - * constructor. - */ - public static GrpcAPI.Return broadcastTransactionBoth(Transaction transaction, + /** constructor. */ + public static GrpcAPI.Return broadcastTransactionBoth( + Transaction transaction, WalletGrpc.WalletBlockingStub blockingStubFull, WalletGrpc.WalletBlockingStub blockingStubFull1) { int i = 10; waitProduceNextBlock(blockingStubFull1); GrpcAPI.Return response = blockingStubFull1.broadcastTransaction(transaction); GrpcAPI.Return response1 = blockingStubFull.broadcastTransaction(transaction); - while (response.getResult() == false && response.getCode() == response_code.SERVER_BUSY + while (response.getResult() == false + && response.getCode() == response_code.SERVER_BUSY && i > 0) { try { Thread.sleep(300); @@ -5186,9 +5445,7 @@ public static GrpcAPI.Return broadcastTransactionBoth(Transaction transaction, return response; } - /** - * constructor. - */ + /** constructor. */ public static String exec(String command) throws InterruptedException { String returnString = ""; Process pro = null; @@ -5213,12 +5470,68 @@ public static String exec(String command) throws InterruptedException { return returnString; } - /** - * constructor. - */ + /** constructor. */ + public static HashMap getBycodeAbiNoOptimize( + String solFile, String contractName) { + final String compile = + Configuration.getByPath("testng.conf").getString("defaultParameter.solidityCompile"); + + String dirPath = solFile.substring(solFile.lastIndexOf("/"), solFile.lastIndexOf(".")); + String outputPath = "src/test/resources/soliditycode//output" + dirPath; + + File binFile = new File(outputPath + "/" + contractName + ".bin"); + File abiFile = new File(outputPath + "/" + contractName + ".abi"); + if (binFile.exists()) { + binFile.delete(); + } + if (abiFile.exists()) { + abiFile.delete(); + } + + HashMap retMap = new HashMap<>(); + String absolutePath = System.getProperty("user.dir"); + logger.debug("absolutePath: " + absolutePath); + logger.debug("solFile: " + solFile); + logger.debug("outputPath: " + outputPath); + String cmd = + compile + + " --bin --abi --overwrite " + + absolutePath + + "/" + + solFile + + " -o " + + absolutePath + + "/" + + outputPath; + logger.info("cmd: " + cmd); + + String byteCode = null; + String abI = null; + + // compile solidity file + try { + exec(cmd); + } catch (InterruptedException e) { + e.printStackTrace(); + } + // get byteCode and ABI + try { + byteCode = fileRead(outputPath + "/" + contractName + ".bin", false); + retMap.put("byteCode", byteCode); + logger.debug("byteCode: " + byteCode); + abI = fileRead(outputPath + "/" + contractName + ".abi", false); + retMap.put("abI", abI); + logger.debug("abI: " + abI); + } catch (Exception e) { + e.printStackTrace(); + } + return retMap; + } + + /** constructor. */ public static HashMap getBycodeAbi(String solFile, String contractName) { - final String compile = Configuration.getByPath("testng.conf") - .getString("defaultParameter.solidityCompile"); + final String compile = + Configuration.getByPath("testng.conf").getString("defaultParameter.solidityCompile"); String dirPath = solFile.substring(solFile.lastIndexOf("/"), solFile.lastIndexOf(".")); String outputPath = "src/test/resources/soliditycode//output" + dirPath; @@ -5238,9 +5551,15 @@ public static HashMap getBycodeAbi(String solFile, String contra logger.debug("solFile: " + solFile); logger.debug("outputPath: " + outputPath); String cmd = - compile + " --optimize --bin --abi --overwrite " + absolutePath + "/" - + solFile + " -o " - + absolutePath + "/" + outputPath; + compile + + " --optimize --bin --abi --overwrite " + + absolutePath + + "/" + + solFile + + " -o " + + absolutePath + + "/" + + outputPath; logger.info("cmd: " + cmd); String byteCode = null; @@ -5266,9 +5585,7 @@ public static HashMap getBycodeAbi(String solFile, String contra return retMap; } - /** - * constructor. - */ + /** constructor. */ public static String fileRead(String filePath, boolean isLibrary) throws Exception { File file = new File(filePath); FileReader reader = new FileReader(file); @@ -5295,11 +5612,9 @@ public static String fileRead(String filePath, boolean isLibrary) throws Excepti return sb.toString(); } - /** - * constructor. - */ - public static HashMap getBycodeAbiForLibrary(String solFile, - String contractName) { + /** constructor. */ + public static HashMap getBycodeAbiForLibrary( + String solFile, String contractName) { HashMap retMap = null; String dirPath = solFile.substring(solFile.lastIndexOf("/"), solFile.lastIndexOf(".")); String outputPath = "src/test/resources/soliditycode/output" + dirPath; @@ -5315,12 +5630,19 @@ public static HashMap getBycodeAbiForLibrary(String solFile, return retMap; } - /** - * constructor. - */ - public static String triggerConstantContract(byte[] contractAddress, String method, - String argsStr, Boolean isHex, long callValue, long feeLimit, String tokenId, long tokenValue, - byte[] ownerAddress, String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static String triggerConstantContract( + byte[] contractAddress, + String method, + String argsStr, + Boolean isHex, + long callValue, + long feeLimit, + String tokenId, + long tokenValue, + byte[] ownerAddress, + String priKey, + WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; try { @@ -5347,17 +5669,18 @@ public static String triggerConstantContract(byte[] contractAddress, String meth builder.setCallTokenValue(tokenValue); TriggerSmartContract triggerContract = builder.build(); - TransactionExtention transactionExtention = blockingStubFull - .triggerConstantContract(triggerContract); + TransactionExtention transactionExtention = + blockingStubFull.triggerConstantContract(triggerContract); if (transactionExtention == null || !transactionExtention.getResult().getResult()) { System.out.println("RPC create call trx failed!"); System.out.println("Code = " + transactionExtention.getResult().getCode()); - System.out - .println("Message = " + transactionExtention.getResult().getMessage().toStringUtf8()); + System.out.println( + "Message = " + transactionExtention.getResult().getMessage().toStringUtf8()); return null; } Transaction transaction = transactionExtention.getTransaction(); - if (transaction.getRetCount() != 0 && transactionExtention.getConstantResult(0) != null + if (transaction.getRetCount() != 0 + && transactionExtention.getConstantResult(0) != null && transactionExtention.getResult() != null) { byte[] result = transactionExtention.getConstantResult(0).toByteArray(); System.out.println("message:" + transaction.getRet(0).getRet()); @@ -5369,8 +5692,8 @@ public static String triggerConstantContract(byte[] contractAddress, String meth final TransactionExtention.Builder texBuilder = TransactionExtention.newBuilder(); Transaction.Builder transBuilder = Transaction.newBuilder(); - Transaction.raw.Builder rawBuilder = transactionExtention.getTransaction().getRawData() - .toBuilder(); + Transaction.raw.Builder rawBuilder = + transactionExtention.getTransaction().getRawData().toBuilder(); rawBuilder.setFeeLimit(feeLimit); transBuilder.setRawData(rawBuilder); for (int i = 0; i < transactionExtention.getTransaction().getSignatureCount(); i++) { @@ -5400,25 +5723,35 @@ public static String triggerConstantContract(byte[] contractAddress, String meth return null; } transaction = signTransaction(ecKey, transaction); - System.out.println("trigger txid = " + ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), - transaction.getRawData().toByteArray()))); + System.out.println( + "trigger txid = " + + ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), + transaction.getRawData().toByteArray()))); GrpcAPI.Return response = broadcastTransaction(transaction, blockingStubFull); if (response.getResult() == false) { return null; } else { - return ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), + return ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), transaction.getRawData().toByteArray())); } } - /** - * constructor. - */ + /** constructor. */ public static TransactionExtention triggerConstantContractForExtentionOnSolidity( - byte[] contractAddress, String method, String argsStr, Boolean isHex, long callValue, - long feeLimit, String tokenId, long tokenValue, byte[] ownerAddress, String priKey, + byte[] contractAddress, + String method, + String argsStr, + Boolean isHex, + long callValue, + long feeLimit, + String tokenId, + long tokenValue, + byte[] ownerAddress, + String priKey, WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubSolidity) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; @@ -5446,16 +5779,16 @@ public static TransactionExtention triggerConstantContractForExtentionOnSolidity builder.setCallTokenValue(tokenValue); TriggerSmartContract triggerContract = builder.build(); - TransactionExtention transactionExtention = blockingStubSolidity - .triggerConstantContract(triggerContract); + TransactionExtention transactionExtention = + blockingStubSolidity.triggerConstantContract(triggerContract); return transactionExtention; - } - /** - * constructor. - */ - public static String clearContractAbi(byte[] contractAddress, byte[] ownerAddress, String priKey, + /** constructor. */ + public static String clearContractAbi( + byte[] contractAddress, + byte[] ownerAddress, + String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; @@ -5479,12 +5812,13 @@ public static String clearContractAbi(byte[] contractAddress, byte[] ownerAddres if (transactionExtention == null || !transactionExtention.getResult().getResult()) { System.out.println("RPC create call trx failed!"); System.out.println("Code = " + transactionExtention.getResult().getCode()); - System.out - .println("Message = " + transactionExtention.getResult().getMessage().toStringUtf8()); + System.out.println( + "Message = " + transactionExtention.getResult().getMessage().toStringUtf8()); return null; } Transaction transaction = transactionExtention.getTransaction(); - if (transaction.getRetCount() != 0 && transactionExtention.getConstantResult(0) != null + if (transaction.getRetCount() != 0 + && transactionExtention.getConstantResult(0) != null && transactionExtention.getResult() != null) { byte[] result = transactionExtention.getConstantResult(0).toByteArray(); System.out.println("message:" + transaction.getRet(0).getRet()); @@ -5496,8 +5830,8 @@ public static String clearContractAbi(byte[] contractAddress, byte[] ownerAddres final TransactionExtention.Builder texBuilder = TransactionExtention.newBuilder(); Transaction.Builder transBuilder = Transaction.newBuilder(); - Transaction.raw.Builder rawBuilder = transactionExtention.getTransaction().getRawData() - .toBuilder(); + Transaction.raw.Builder rawBuilder = + transactionExtention.getTransaction().getRawData().toBuilder(); transBuilder.setRawData(rawBuilder); for (int i = 0; i < transactionExtention.getTransaction().getSignatureCount(); i++) { ByteString s = transactionExtention.getTransaction().getSignature(i); @@ -5526,24 +5860,29 @@ public static String clearContractAbi(byte[] contractAddress, byte[] ownerAddres return null; } transaction = signTransaction(ecKey, transaction); - System.out.println("trigger txid = " + ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), - transaction.getRawData().toByteArray()))); + System.out.println( + "trigger txid = " + + ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), + transaction.getRawData().toByteArray()))); GrpcAPI.Return response = broadcastTransaction(transaction, blockingStubFull); if (response.getResult() == false) { return null; } else { - return ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), + return ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), transaction.getRawData().toByteArray())); } } - /** - * constructor. - */ - public static TransactionExtention clearContractAbiForExtention(byte[] contractAddress, - byte[] ownerAddress, String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static TransactionExtention clearContractAbiForExtention( + byte[] contractAddress, + byte[] ownerAddress, + String priKey, + WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; try { @@ -5564,15 +5903,20 @@ public static TransactionExtention clearContractAbiForExtention(byte[] contractA TransactionExtention transactionExtention = blockingStubFull.clearContractABI(clearAbiContract); return transactionExtention; - } - /** - * constructor. - */ - public static TransactionExtention triggerConstantContractForExtention(byte[] contractAddress, - String method, String argsStr, Boolean isHex, long callValue, long feeLimit, String tokenId, - long tokenValue, byte[] ownerAddress, String priKey, + /** constructor. */ + public static TransactionExtention triggerConstantContractForExtention( + byte[] contractAddress, + String method, + String argsStr, + Boolean isHex, + long callValue, + long feeLimit, + String tokenId, + long tokenValue, + byte[] ownerAddress, + String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; @@ -5590,7 +5934,6 @@ public static TransactionExtention triggerConstantContractForExtention(byte[] co if (tokenId.equalsIgnoreCase("") || tokenId.equalsIgnoreCase("#")) { logger.info("tokenid is 0"); tokenId = "0"; - } byte[] owner = ownerAddress; @@ -5603,21 +5946,24 @@ public static TransactionExtention triggerConstantContractForExtention(byte[] co builder.setTokenId(Long.parseLong(tokenId)); builder.setCallTokenValue(tokenValue); TriggerSmartContract triggerContract = builder.build(); - TransactionExtention transactionExtention = blockingStubFull - .triggerConstantContract(triggerContract); + TransactionExtention transactionExtention = + blockingStubFull.triggerConstantContract(triggerContract); return transactionExtention; - - } - /** - * constructor. - */ - public static TransactionExtention triggerSolidityContractForExtention(byte[] contractAddress, - String method, String argsStr, - Boolean isHex, long callValue, long feeLimit, String tokenId, long tokenValue, + /** constructor. */ + public static TransactionExtention triggerSolidityContractForExtention( + byte[] contractAddress, + String method, + String argsStr, + Boolean isHex, + long callValue, + long feeLimit, + String tokenId, + long tokenValue, byte[] ownerAddress, - String priKey, WalletSolidityGrpc.WalletSolidityBlockingStub solidityBlockingStubFull) { + String priKey, + WalletSolidityGrpc.WalletSolidityBlockingStub solidityBlockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; try { @@ -5644,19 +5990,23 @@ public static TransactionExtention triggerSolidityContractForExtention(byte[] co builder.setCallTokenValue(tokenValue); TriggerSmartContract triggerContract = builder.build(); - TransactionExtention transactionExtention = solidityBlockingStubFull - .triggerConstantContract(triggerContract); + TransactionExtention transactionExtention = + solidityBlockingStubFull.triggerConstantContract(triggerContract); return transactionExtention; - } - /** - * constructor. - */ - - public static TransactionExtention triggerContractForExtention(byte[] contractAddress, - String method, String argsStr, Boolean isHex, long callValue, long feeLimit, String tokenId, - long tokenValue, byte[] ownerAddress, String priKey, + /** constructor. */ + public static TransactionExtention triggerContractForExtention( + byte[] contractAddress, + String method, + String argsStr, + Boolean isHex, + long callValue, + long feeLimit, + String tokenId, + long tokenValue, + byte[] ownerAddress, + String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; @@ -5686,12 +6036,9 @@ public static TransactionExtention triggerContractForExtention(byte[] contractAd TransactionExtention transactionExtention = blockingStubFull.triggerContract(triggerContract); return transactionExtention; - } - /** - * constructor. - */ + /** constructor. */ public static String create2(String[] parameters) { if (parameters == null || parameters.length != 3) { logger.error("create2 needs 3 parameter:\ncreate2 address code salt"); @@ -5721,13 +6068,16 @@ public static String create2(String[] parameters) { return create2Address; } - - /** - * constructor. - */ - public static boolean sendShieldCoin(byte[] publicZenTokenOwnerAddress, long fromAmount, - ShieldAddressInfo shieldAddressInfo, NoteTx noteTx, List shieldOutputList, - byte[] publicZenTokenToAddress, long toAmount, String priKey, + /** constructor. */ + public static boolean sendShieldCoin( + byte[] publicZenTokenOwnerAddress, + long fromAmount, + ShieldAddressInfo shieldAddressInfo, + NoteTx noteTx, + List shieldOutputList, + byte[] publicZenTokenToAddress, + long toAmount, + String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; @@ -5752,16 +6102,16 @@ public static boolean sendShieldCoin(byte[] publicZenTokenOwnerAddress, long fro if (shieldAddressInfo != null) { OutputPointInfo.Builder request = OutputPointInfo.newBuilder(); - //ShieldNoteInfo noteInfo = shieldWrapper.getUtxoMapNote().get(shieldInputList.get(i)); + // ShieldNoteInfo noteInfo = shieldWrapper.getUtxoMapNote().get(shieldInputList.get(i)); OutputPoint.Builder outPointBuild = OutputPoint.newBuilder(); outPointBuild.setHash(ByteString.copyFrom(noteTx.getTxid().toByteArray())); outPointBuild.setIndex(noteTx.getIndex()); request.addOutPoints(outPointBuild.build()); - //ShieldNoteInfo noteInfo = shieldWrapper.getUtxoMapNote().get(shieldInputList.get(i)); + // ShieldNoteInfo noteInfo = shieldWrapper.getUtxoMapNote().get(shieldInputList.get(i)); - //String shieldAddress = noteInfo.getPaymentAddress(); - //ShieldAddressInfo addressInfo = + // String shieldAddress = noteInfo.getPaymentAddress(); + // ShieldAddressInfo addressInfo = // shieldWrapper.getShieldAddressInfoMap().get(shieldAddress); SpendingKey spendingKey = new SpendingKey(shieldAddressInfo.getSk()); try { @@ -5779,12 +6129,12 @@ public static boolean sendShieldCoin(byte[] publicZenTokenOwnerAddress, long fro noteBuild.setRcm(ByteString.copyFrom(noteTx.getNote().getRcm().toByteArray())); noteBuild.setMemo(ByteString.copyFrom(noteTx.getNote().getMemo().toByteArray())); - //System.out.println("address " + noteInfo.getPaymentAddress()); - //System.out.println("value " + noteInfo.getValue()); - //System.out.println("rcm " + ByteArray.toHexString(noteInfo.getR())); - //System.out.println("trxId " + noteInfo.getTrxId()); - //System.out.println("index " + noteInfo.getIndex()); - //System.out.println("meno " + new String(noteInfo.getMemo())); + // System.out.println("address " + noteInfo.getPaymentAddress()); + // System.out.println("value " + noteInfo.getValue()); + // System.out.println("rcm " + ByteArray.toHexString(noteInfo.getR())); + // System.out.println("trxId " + noteInfo.getTrxId()); + // System.out.println("index " + noteInfo.getIndex()); + // System.out.println("meno " + new String(noteInfo.getMemo())); SpendNote.Builder spendNoteBuilder = SpendNote.newBuilder(); spendNoteBuilder.setNote(noteBuild.build()); @@ -5794,28 +6144,29 @@ public static boolean sendShieldCoin(byte[] publicZenTokenOwnerAddress, long fro System.out.println(e); } - IncrementalMerkleVoucherInfo merkleVoucherInfo = blockingStubFull - .getMerkleTreeVoucherInfo(request.build()); + IncrementalMerkleVoucherInfo merkleVoucherInfo = + blockingStubFull.getMerkleTreeVoucherInfo(request.build()); spendNoteBuilder.setVoucher(merkleVoucherInfo.getVouchers(0)); spendNoteBuilder.setPath(merkleVoucherInfo.getPaths(0)); builder.addShieldedSpends(spendNoteBuilder.build()); } else { - byte[] ovk = ByteArray - .fromHexString("030c8c2bc59fb3eb8afb047a8ea4b028743d23e7d38c6fa30908358431e2314d"); + byte[] ovk = + ByteArray.fromHexString( + "030c8c2bc59fb3eb8afb047a8ea4b028743d23e7d38c6fa30908358431e2314d"); builder.setOvk(ByteString.copyFrom(ovk)); } if (shieldOutputList.size() > 0) { for (int i = 0; i < shieldOutputList.size(); ++i) { - builder - .addShieldedReceives(ReceiveNote.newBuilder().setNote(shieldOutputList.get(i)).build()); + builder.addShieldedReceives( + ReceiveNote.newBuilder().setNote(shieldOutputList.get(i)).build()); } } - TransactionExtention transactionExtention = blockingStubFull - .createShieldedTransaction(builder.build()); + TransactionExtention transactionExtention = + blockingStubFull.createShieldedTransaction(builder.build()); if (transactionExtention == null) { return false; } @@ -5835,17 +6186,23 @@ public static boolean sendShieldCoin(byte[] publicZenTokenOwnerAddress, long fro Any any = transaction.getRawData().getContract(0).getParameter(); try { - ShieldedTransferContract shieldedTransferContract = any - .unpack(ShieldedTransferContract.class); + ShieldedTransferContract shieldedTransferContract = + any.unpack(ShieldedTransferContract.class); if (shieldedTransferContract.getFromAmount() > 0 || fromAmount == 321321) { transaction = signTransactionForShield(ecKey, transaction); - System.out.println("trigger txid = " + ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), - transaction.getRawData().toByteArray()))); + System.out.println( + "trigger txid = " + + ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), + transaction.getRawData().toByteArray()))); } else { - System.out.println("trigger txid = " + ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), - transaction.getRawData().toByteArray()))); + System.out.println( + "trigger txid = " + + ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), + transaction.getRawData().toByteArray()))); } } catch (Exception e) { System.out.println(e); @@ -5853,12 +6210,16 @@ public static boolean sendShieldCoin(byte[] publicZenTokenOwnerAddress, long fro return broadcastTransaction(transaction, blockingStubFull).getResult(); } - /** - * constructor. - */ - public static boolean sendShieldCoinWithoutAsk(byte[] publicZenTokenOwnerAddress, long fromAmount, - ShieldAddressInfo shieldAddressInfo, NoteTx noteTx, List shieldOutputList, - byte[] publicZenTokenToAddress, long toAmount, String priKey, + /** constructor. */ + public static boolean sendShieldCoinWithoutAsk( + byte[] publicZenTokenOwnerAddress, + long fromAmount, + ShieldAddressInfo shieldAddressInfo, + NoteTx noteTx, + List shieldOutputList, + byte[] publicZenTokenToAddress, + long toAmount, + String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; @@ -5884,22 +6245,22 @@ public static boolean sendShieldCoinWithoutAsk(byte[] publicZenTokenOwnerAddress if (shieldAddressInfo != null) { OutputPointInfo.Builder request = OutputPointInfo.newBuilder(); - //ShieldNoteInfo noteInfo = shieldWrapper.getUtxoMapNote().get(shieldInputList.get(i)); + // ShieldNoteInfo noteInfo = shieldWrapper.getUtxoMapNote().get(shieldInputList.get(i)); OutputPoint.Builder outPointBuild = OutputPoint.newBuilder(); outPointBuild.setHash(ByteString.copyFrom(noteTx.getTxid().toByteArray())); outPointBuild.setIndex(noteTx.getIndex()); request.addOutPoints(outPointBuild.build()); - IncrementalMerkleVoucherInfo merkleVoucherInfo = blockingStubFull - .getMerkleTreeVoucherInfo(request.build()); + IncrementalMerkleVoucherInfo merkleVoucherInfo = + blockingStubFull.getMerkleTreeVoucherInfo(request.build()); if (merkleVoucherInfo.getVouchersCount() != 1) { System.out.println("Can't get all merkel tree, please check the notes."); return false; } - //ShieldNoteInfo noteInfo = shieldWrapper.getUtxoMapNote().get(shieldInputList.get(i)); + // ShieldNoteInfo noteInfo = shieldWrapper.getUtxoMapNote().get(shieldInputList.get(i)); - //String shieldAddress = noteInfo.getPaymentAddress(); - //ShieldAddressInfo addressInfo = + // String shieldAddress = noteInfo.getPaymentAddress(); + // ShieldAddressInfo addressInfo = // shieldWrapper.getShieldAddressInfoMap().get(shieldAddress); String shieldAddress = noteTx.getNote().getPaymentAddress(); SpendingKey spendingKey = new SpendingKey(shieldAddressInfo.getSk()); @@ -5920,12 +6281,12 @@ public static boolean sendShieldCoinWithoutAsk(byte[] publicZenTokenOwnerAddress noteBuild.setRcm(ByteString.copyFrom(noteTx.getNote().getRcm().toByteArray())); noteBuild.setMemo(ByteString.copyFrom(noteTx.getNote().getMemo().toByteArray())); - //System.out.println("address " + noteInfo.getPaymentAddress()); - //System.out.println("value " + noteInfo.getValue()); - //System.out.println("rcm " + ByteArray.toHexString(noteInfo.getR())); - //System.out.println("trxId " + noteInfo.getTrxId()); - //System.out.println("index " + noteInfo.getIndex()); - //System.out.println("meno " + new String(noteInfo.getMemo())); + // System.out.println("address " + noteInfo.getPaymentAddress()); + // System.out.println("value " + noteInfo.getValue()); + // System.out.println("rcm " + ByteArray.toHexString(noteInfo.getR())); + // System.out.println("trxId " + noteInfo.getTrxId()); + // System.out.println("index " + noteInfo.getIndex()); + // System.out.println("meno " + new String(noteInfo.getMemo())); SpendNote.Builder spendNoteBuilder = SpendNote.newBuilder(); spendNoteBuilder.setNote(noteBuild.build()); @@ -5941,26 +6302,27 @@ public static boolean sendShieldCoinWithoutAsk(byte[] publicZenTokenOwnerAddress builder.addShieldedSpends(spendNoteBuilder.build()); } else { - byte[] ovk = ByteArray - .fromHexString("030c8c2bc59fb3eb8afb047a8ea4b028743d23e7d38c6fa30908358431e2314d"); + byte[] ovk = + ByteArray.fromHexString( + "030c8c2bc59fb3eb8afb047a8ea4b028743d23e7d38c6fa30908358431e2314d"); builder.setOvk(ByteString.copyFrom(ovk)); } if (shieldOutputList.size() > 0) { for (int i = 0; i < shieldOutputList.size(); ++i) { - builder - .addShieldedReceives(ReceiveNote.newBuilder().setNote(shieldOutputList.get(i)).build()); + builder.addShieldedReceives( + ReceiveNote.newBuilder().setNote(shieldOutputList.get(i)).build()); } } - TransactionExtention transactionExtention = blockingStubFull - .createShieldedTransactionWithoutSpendAuthSig(builder.build()); + TransactionExtention transactionExtention = + blockingStubFull.createShieldedTransactionWithoutSpendAuthSig(builder.build()); if (transactionExtention == null) { System.out.println("sendShieldCoinWithoutAsk failure."); return false; } - BytesMessage trxHash = blockingStubFull - .getShieldTransactionHash(transactionExtention.getTransaction()); + BytesMessage trxHash = + blockingStubFull.getShieldTransactionHash(transactionExtention.getTransaction()); if (trxHash == null || trxHash.getValue().toByteArray().length != 32) { System.out.println("sendShieldCoinWithoutAsk get transaction hash failure."); return false; @@ -5976,8 +6338,8 @@ public static boolean sendShieldCoinWithoutAsk(byte[] publicZenTokenOwnerAddress try { ShieldedTransferContract shieldContract = any.unpack(ShieldedTransferContract.class); List spendDescList = shieldContract.getSpendDescriptionList(); - ShieldedTransferContract.Builder contractBuild = shieldContract.toBuilder() - .clearSpendDescription(); + ShieldedTransferContract.Builder contractBuild = + shieldContract.toBuilder().clearSpendDescription(); for (int i = 0; i < spendDescList.size(); i++) { SpendAuthSigParameters.Builder builder1 = SpendAuthSigParameters.newBuilder(); @@ -5986,16 +6348,21 @@ public static boolean sendShieldCoinWithoutAsk(byte[] publicZenTokenOwnerAddress builder1.setAlpha(builder.getShieldedSpends(i).getAlpha()); SpendDescription.Builder spendDescription = spendDescList.get(i).toBuilder(); BytesMessage authSig = blockingStubFull.createSpendAuthSig(builder1.build()); - spendDescription - .setSpendAuthoritySignature(ByteString.copyFrom(authSig.getValue().toByteArray())); + spendDescription.setSpendAuthoritySignature( + ByteString.copyFrom(authSig.getValue().toByteArray())); contractBuild.addSpendDescription(spendDescription.build()); } - Transaction.raw.Builder rawBuilder = transaction.toBuilder().getRawDataBuilder() - .clearContract().addContract( - Transaction.Contract.newBuilder().setType(ContractType.ShieldedTransferContract) - .setParameter(Any.pack(contractBuild.build())).build()); + Transaction.raw.Builder rawBuilder = + transaction.toBuilder() + .getRawDataBuilder() + .clearContract() + .addContract( + Transaction.Contract.newBuilder() + .setType(ContractType.ShieldedTransferContract) + .setParameter(Any.pack(contractBuild.build())) + .build()); transaction = transaction.toBuilder().clearRawData().setRawData(rawBuilder).build(); @@ -6023,30 +6390,33 @@ public static boolean sendShieldCoinWithoutAsk(byte[] publicZenTokenOwnerAddress transaction1 = signTransaction(ecKey, transaction1); } else { Any any1 = transaction1.getRawData().getContract(0).getParameter(); - ShieldedTransferContract shieldedTransferContract = any1 - .unpack(ShieldedTransferContract.class); + ShieldedTransferContract shieldedTransferContract = + any1.unpack(ShieldedTransferContract.class); if (shieldedTransferContract.getFromAmount() > 0) { transaction1 = signTransactionForShield(ecKey, transaction1); - System.out.println("trigger txid = " + ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), - transaction1.getRawData().toByteArray()))); + System.out.println( + "trigger txid = " + + ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), + transaction1.getRawData().toByteArray()))); } } } catch (Exception e) { System.out.println(e); } - System.out.println("trigger txid = " + ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), - transaction1.getRawData().toByteArray()))); + System.out.println( + "trigger txid = " + + ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), + transaction1.getRawData().toByteArray()))); return broadcastTransaction(transaction1, blockingStubFull).getResult(); } - - /** - * constructor. - */ - public static List addShieldOutputList(List shieldOutList, String shieldToAddress, - String toAmountString, String menoString) { + /** constructor. */ + public static List addShieldOutputList( + List shieldOutList, String shieldToAddress, String toAmountString, String menoString) { String shieldAddress = shieldToAddress; String amountString = toAmountString; if (menoString.equals("null")) { @@ -6068,13 +6438,11 @@ public static List addShieldOutputList(List shieldOutList, String sh } noteBuild.setMemo(ByteString.copyFrom(menoString.getBytes())); shieldOutList.add(noteBuild.build()); - //logger.info(shieldOutList.toString()); + // logger.info(shieldOutList.toString()); return shieldOutList; } - /** - * constructor. - */ + /** constructor. */ public static Optional generateShieldAddress() { ShieldAddressInfo addressInfo = new ShieldAddressInfo(); try { @@ -6100,11 +6468,9 @@ public static Optional generateShieldAddress() { return Optional.empty(); } - - /** - * constructor. - */ - public static DecryptNotes listShieldNote(Optional shieldAddressInfo, + /** constructor. */ + public static DecryptNotes listShieldNote( + Optional shieldAddressInfo, WalletGrpc.WalletBlockingStub blockingStubFull) { Block currentBlock = blockingStubFull.getNowBlock(GrpcAPI.EmptyMessage.newBuilder().build()); Long currentBlockNum = currentBlock.getBlockHeader().getRawData().getNumber(); @@ -6122,10 +6488,9 @@ public static DecryptNotes listShieldNote(Optional shieldAddr return notes; } - /** - * constructor. - */ - public static DecryptNotes getShieldNotesByIvk(Optional shieldAddressInfo, + /** constructor. */ + public static DecryptNotes getShieldNotesByIvk( + Optional shieldAddressInfo, WalletGrpc.WalletBlockingStub blockingStubFull) { Block currentBlock = blockingStubFull.getNowBlock(GrpcAPI.EmptyMessage.newBuilder().build()); Long currentBlockNum = currentBlock.getBlockHeader().getRawData().getNumber(); @@ -6133,7 +6498,7 @@ public static DecryptNotes getShieldNotesByIvk(Optional shiel if (currentBlockNum > 100) { startBlockNum = currentBlockNum - 100; } - //startBlockNum = 0L; + // startBlockNum = 0L; logger.info("ivk:" + ByteArray.toHexString(shieldAddressInfo.get().ivk)); IvkDecryptParameters.Builder builder = IvkDecryptParameters.newBuilder(); builder.setStartBlockIndex(startBlockNum + 1); @@ -6144,9 +6509,7 @@ public static DecryptNotes getShieldNotesByIvk(Optional shiel return notes; } - /** - * constructor. - */ + /** constructor. */ public static DecryptNotesMarked getShieldNotesAndMarkByIvk( Optional shieldAddressInfo, WalletGrpc.WalletBlockingStub blockingStubFull) { @@ -6156,7 +6519,7 @@ public static DecryptNotesMarked getShieldNotesAndMarkByIvk( if (currentBlockNum > 100) { startBlockNum = currentBlockNum - 100; } - //startBlockNum = 0L; + // startBlockNum = 0L; logger.info("ivk:" + ByteArray.toHexString(shieldAddressInfo.get().ivk)); try { IvkDecryptAndMarkParameters.Builder builder = IvkDecryptAndMarkParameters.newBuilder(); @@ -6174,20 +6537,18 @@ public static DecryptNotesMarked getShieldNotesAndMarkByIvk( } } - /** - * constructor. - */ + /** constructor. */ public static DecryptNotesMarked getShieldNotesAndMarkByIvkOnSolidity( Optional shieldAddressInfo, WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubSolidity) { - Block currentBlock = blockingStubSolidity - .getNowBlock(GrpcAPI.EmptyMessage.newBuilder().build()); + Block currentBlock = + blockingStubSolidity.getNowBlock(GrpcAPI.EmptyMessage.newBuilder().build()); Long currentBlockNum = currentBlock.getBlockHeader().getRawData().getNumber(); Long startBlockNum = 0L; if (currentBlockNum > 100) { startBlockNum = currentBlockNum - 100; } - //startBlockNum = 0L; + // startBlockNum = 0L; logger.info("ivk:" + ByteArray.toHexString(shieldAddressInfo.get().ivk)); try { IvkDecryptAndMarkParameters.Builder builder = IvkDecryptAndMarkParameters.newBuilder(); @@ -6205,10 +6566,9 @@ public static DecryptNotesMarked getShieldNotesAndMarkByIvkOnSolidity( } } - /** - * constructor. - */ - public static Integer getShieldNotesCount(Optional shieldAddressInfo, + /** constructor. */ + public static Integer getShieldNotesCount( + Optional shieldAddressInfo, WalletGrpc.WalletBlockingStub blockingStubFull) { Block currentBlock = blockingStubFull.getNowBlock(GrpcAPI.EmptyMessage.newBuilder().build()); Long currentBlockNum = currentBlock.getBlockHeader().getRawData().getNumber(); @@ -6240,17 +6600,14 @@ public static Integer getShieldNotesCount(Optional shieldAddr DecryptNotes notes = blockingStubFull.scanNoteByIvk(builder.build()); count = count + notes.getNoteTxsCount(); return count; - } - /** - * constructor. - */ + /** constructor. */ public static DecryptNotes getShieldNotesByIvkOnSolidity( Optional shieldAddressInfo, WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubSolidity) { - Block currentBlock = blockingStubSolidity - .getNowBlock(GrpcAPI.EmptyMessage.newBuilder().build()); + Block currentBlock = + blockingStubSolidity.getNowBlock(GrpcAPI.EmptyMessage.newBuilder().build()); Long currentBlockNum = currentBlock.getBlockHeader().getRawData().getNumber(); Long startBlockNum = 0L; if (currentBlockNum > 100) { @@ -6265,11 +6622,9 @@ public static DecryptNotes getShieldNotesByIvkOnSolidity( return notes; } - - /** - * constructor. - */ - public static DecryptNotes getShieldNotesByOvk(Optional shieldAddressInfo, + /** constructor. */ + public static DecryptNotes getShieldNotesByOvk( + Optional shieldAddressInfo, WalletGrpc.WalletBlockingStub blockingStubFull) { Block currentBlock = blockingStubFull.getNowBlock(GrpcAPI.EmptyMessage.newBuilder().build()); Long currentBlockNum = currentBlock.getBlockHeader().getRawData().getNumber(); @@ -6287,14 +6642,12 @@ public static DecryptNotes getShieldNotesByOvk(Optional shiel return notes; } - /** - * constructor. - */ + /** constructor. */ public static DecryptNotes getShieldNotesByOvkOnSolidity( Optional shieldAddressInfo, WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubSolidity) { - Block currentBlock = blockingStubSolidity - .getNowBlock(GrpcAPI.EmptyMessage.newBuilder().build()); + Block currentBlock = + blockingStubSolidity.getNowBlock(GrpcAPI.EmptyMessage.newBuilder().build()); Long currentBlockNum = currentBlock.getBlockHeader().getRawData().getNumber(); Long startBlockNum = 0L; if (currentBlockNum > 100) { @@ -6309,18 +6662,15 @@ public static DecryptNotes getShieldNotesByOvkOnSolidity( return notes; } - - /** - * constructor. - */ + /** constructor. */ public static String getMemo(Note note) { return ZenUtils.getMemo(note.getMemo().toByteArray()); } - /** - * constructor. - */ - public static SpendResult getSpendResult(ShieldAddressInfo shieldAddressInfo, NoteTx noteTx, + /** constructor. */ + public static SpendResult getSpendResult( + ShieldAddressInfo shieldAddressInfo, + NoteTx noteTx, WalletGrpc.WalletBlockingStub blockingStubFull) { OutputPointInfo.Builder request = OutputPointInfo.newBuilder(); @@ -6328,8 +6678,8 @@ public static SpendResult getSpendResult(ShieldAddressInfo shieldAddressInfo, No outPointBuild.setHash(ByteString.copyFrom(noteTx.getTxid().toByteArray())); outPointBuild.setIndex(noteTx.getIndex()); request.addOutPoints(outPointBuild.build()); - Optional merkleVoucherInfo = Optional - .of(blockingStubFull.getMerkleTreeVoucherInfo(request.build())); + Optional merkleVoucherInfo = + Optional.of(blockingStubFull.getMerkleTreeVoucherInfo(request.build())); if (merkleVoucherInfo.isPresent() && merkleVoucherInfo.get().getVouchersCount() > 0) { NoteParameters.Builder builder = NoteParameters.newBuilder(); @@ -6350,28 +6700,26 @@ public static SpendResult getSpendResult(ShieldAddressInfo shieldAddressInfo, No builder.setNote(noteBuild.build()); builder.setTxid(ByteString.copyFrom(noteTx.getTxid().toByteArray())); builder.setIndex(noteTx.getIndex()); - //builder.setVoucher(merkleVoucherInfo.getVouchers(0)); + // builder.setVoucher(merkleVoucherInfo.getVouchers(0)); SpendResult result = blockingStubFull.isSpend(builder.build()); return result; - } return null; - } - /** - * constructor. - */ - public static SpendResult getSpendResultOnSolidity(ShieldAddressInfo shieldAddressInfo, - NoteTx noteTx, WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubSolidity) { + /** constructor. */ + public static SpendResult getSpendResultOnSolidity( + ShieldAddressInfo shieldAddressInfo, + NoteTx noteTx, + WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubSolidity) { OutputPointInfo.Builder request = OutputPointInfo.newBuilder(); OutputPoint.Builder outPointBuild = OutputPoint.newBuilder(); outPointBuild.setHash(ByteString.copyFrom(noteTx.getTxid().toByteArray())); outPointBuild.setIndex(noteTx.getIndex()); request.addOutPoints(outPointBuild.build()); - Optional merkleVoucherInfo = Optional - .of(blockingStubSolidity.getMerkleTreeVoucherInfo(request.build())); + Optional merkleVoucherInfo = + Optional.of(blockingStubSolidity.getMerkleTreeVoucherInfo(request.build())); if (merkleVoucherInfo.isPresent() && merkleVoucherInfo.get().getVouchersCount() > 0) { NoteParameters.Builder builder = NoteParameters.newBuilder(); @@ -6389,7 +6737,7 @@ public static SpendResult getSpendResultOnSolidity(ShieldAddressInfo shieldAddre builder.setNote(noteBuild.build()); builder.setTxid(ByteString.copyFrom(noteTx.getTxid().toByteArray())); builder.setIndex(noteTx.getIndex()); - //builder.setVoucher(merkleVoucherInfo.getVouchers(0)); + // builder.setVoucher(merkleVoucherInfo.getVouchers(0)); SpendResult result = blockingStubSolidity.isSpend(builder.build()); return result; @@ -6397,18 +6745,18 @@ public static SpendResult getSpendResultOnSolidity(ShieldAddressInfo shieldAddre return null; } - /** - * constructor. - */ - public static String getShieldNullifier(ShieldAddressInfo shieldAddressInfo, NoteTx noteTx, + /** constructor. */ + public static String getShieldNullifier( + ShieldAddressInfo shieldAddressInfo, + NoteTx noteTx, WalletGrpc.WalletBlockingStub blockingStubFull) { OutputPointInfo.Builder request = OutputPointInfo.newBuilder(); OutputPoint.Builder outPointBuild = OutputPoint.newBuilder(); outPointBuild.setHash(ByteString.copyFrom(noteTx.getTxid().toByteArray())); outPointBuild.setIndex(noteTx.getIndex()); request.addOutPoints(outPointBuild.build()); - IncrementalMerkleVoucherInfo merkleVoucherInfo = blockingStubFull - .getMerkleTreeVoucherInfo(request.build()); + IncrementalMerkleVoucherInfo merkleVoucherInfo = + blockingStubFull.getMerkleTreeVoucherInfo(request.build()); if (merkleVoucherInfo.getVouchersCount() < 1) { System.out.println("get merkleVoucherInfo failure."); return null; @@ -6422,7 +6770,7 @@ public static String getShieldNullifier(ShieldAddressInfo shieldAddressInfo, Not String shieldAddress = noteTx.getNote().getPaymentAddress(); SpendingKey spendingKey = new SpendingKey(shieldAddressInfo.getSk()); try { - //TODO + // TODO FullViewingKey fullViewingKey = spendingKey.fullViewingKey(); NfParameters.Builder builder = NfParameters.newBuilder(); builder.setNote(noteBuild.build()); @@ -6437,16 +6785,18 @@ public static String getShieldNullifier(ShieldAddressInfo shieldAddressInfo, Not e.printStackTrace(); } return null; - } - - /** - * constructor. - */ - public static String sendShieldCoinGetTxid(byte[] publicZenTokenOwnerAddress, long fromAmount, - ShieldAddressInfo shieldAddressInfo, NoteTx noteTx, List shieldOutputList, - byte[] publicZenTokenToAddress, long toAmount, String priKey, + /** constructor. */ + public static String sendShieldCoinGetTxid( + byte[] publicZenTokenOwnerAddress, + long fromAmount, + ShieldAddressInfo shieldAddressInfo, + NoteTx noteTx, + List shieldOutputList, + byte[] publicZenTokenToAddress, + long toAmount, + String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; @@ -6471,16 +6821,16 @@ public static String sendShieldCoinGetTxid(byte[] publicZenTokenOwnerAddress, lo if (shieldAddressInfo != null) { OutputPointInfo.Builder request = OutputPointInfo.newBuilder(); - //ShieldNoteInfo noteInfo = shieldWrapper.getUtxoMapNote().get(shieldInputList.get(i)); + // ShieldNoteInfo noteInfo = shieldWrapper.getUtxoMapNote().get(shieldInputList.get(i)); OutputPoint.Builder outPointBuild = OutputPoint.newBuilder(); outPointBuild.setHash(ByteString.copyFrom(noteTx.getTxid().toByteArray())); outPointBuild.setIndex(noteTx.getIndex()); request.addOutPoints(outPointBuild.build()); - //ShieldNoteInfo noteInfo = shieldWrapper.getUtxoMapNote().get(shieldInputList.get(i)); + // ShieldNoteInfo noteInfo = shieldWrapper.getUtxoMapNote().get(shieldInputList.get(i)); - //String shieldAddress = noteInfo.getPaymentAddress(); - //ShieldAddressInfo addressInfo = + // String shieldAddress = noteInfo.getPaymentAddress(); + // ShieldAddressInfo addressInfo = // shieldWrapper.getShieldAddressInfoMap().get(shieldAddress); SpendingKey spendingKey = new SpendingKey(shieldAddressInfo.getSk()); try { @@ -6498,12 +6848,12 @@ public static String sendShieldCoinGetTxid(byte[] publicZenTokenOwnerAddress, lo noteBuild.setRcm(ByteString.copyFrom(noteTx.getNote().getRcm().toByteArray())); noteBuild.setMemo(ByteString.copyFrom(noteTx.getNote().getMemo().toByteArray())); - //System.out.println("address " + noteInfo.getPaymentAddress()); - //System.out.println("value " + noteInfo.getValue()); - //System.out.println("rcm " + ByteArray.toHexString(noteInfo.getR())); - //System.out.println("trxId " + noteInfo.getTrxId()); - //System.out.println("index " + noteInfo.getIndex()); - //System.out.println("meno " + new String(noteInfo.getMemo())); + // System.out.println("address " + noteInfo.getPaymentAddress()); + // System.out.println("value " + noteInfo.getValue()); + // System.out.println("rcm " + ByteArray.toHexString(noteInfo.getR())); + // System.out.println("trxId " + noteInfo.getTrxId()); + // System.out.println("index " + noteInfo.getIndex()); + // System.out.println("meno " + new String(noteInfo.getMemo())); SpendNote.Builder spendNoteBuilder = SpendNote.newBuilder(); spendNoteBuilder.setNote(noteBuild.build()); @@ -6513,28 +6863,29 @@ public static String sendShieldCoinGetTxid(byte[] publicZenTokenOwnerAddress, lo System.out.println(e); } - IncrementalMerkleVoucherInfo merkleVoucherInfo = blockingStubFull - .getMerkleTreeVoucherInfo(request.build()); + IncrementalMerkleVoucherInfo merkleVoucherInfo = + blockingStubFull.getMerkleTreeVoucherInfo(request.build()); spendNoteBuilder.setVoucher(merkleVoucherInfo.getVouchers(0)); spendNoteBuilder.setPath(merkleVoucherInfo.getPaths(0)); builder.addShieldedSpends(spendNoteBuilder.build()); } else { - byte[] ovk = ByteArray - .fromHexString("030c8c2bc59fb3eb8afb047a8ea4b028743d23e7d38c6fa30908358431e2314d"); + byte[] ovk = + ByteArray.fromHexString( + "030c8c2bc59fb3eb8afb047a8ea4b028743d23e7d38c6fa30908358431e2314d"); builder.setOvk(ByteString.copyFrom(ovk)); } if (shieldOutputList.size() > 0) { for (int i = 0; i < shieldOutputList.size(); ++i) { - builder - .addShieldedReceives(ReceiveNote.newBuilder().setNote(shieldOutputList.get(i)).build()); + builder.addShieldedReceives( + ReceiveNote.newBuilder().setNote(shieldOutputList.get(i)).build()); } } - TransactionExtention transactionExtention = blockingStubFull - .createShieldedTransaction(builder.build()); + TransactionExtention transactionExtention = + blockingStubFull.createShieldedTransaction(builder.build()); if (transactionExtention == null) { return null; } @@ -6554,30 +6905,35 @@ public static String sendShieldCoinGetTxid(byte[] publicZenTokenOwnerAddress, lo Any any = transaction.getRawData().getContract(0).getParameter(); try { - ShieldedTransferContract shieldedTransferContract = any - .unpack(ShieldedTransferContract.class); + ShieldedTransferContract shieldedTransferContract = + any.unpack(ShieldedTransferContract.class); if (shieldedTransferContract.getFromAmount() > 0) { transaction = signTransactionForShield(ecKey, transaction); - System.out.println("trigger txid = " + ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), - transaction.getRawData().toByteArray()))); + System.out.println( + "trigger txid = " + + ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), + transaction.getRawData().toByteArray()))); } else { - System.out.println("trigger txid = " + ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), - transaction.getRawData().toByteArray()))); + System.out.println( + "trigger txid = " + + ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), + transaction.getRawData().toByteArray()))); } } catch (Exception e) { System.out.println(e); } broadcastTransaction(transaction, blockingStubFull); - return ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), + return ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), transaction.getRawData().toByteArray())); } - /** - * constructor. - */ + /** constructor. */ public static byte[] decode58Check(String input) { byte[] decodeCheck = org.tron.common.utils.Base58.decode(input); if (decodeCheck.length <= 4) { @@ -6587,26 +6943,26 @@ public static byte[] decode58Check(String input) { System.arraycopy(decodeCheck, 0, decodeData, 0, decodeData.length); byte[] hash0 = Sha256Hash.hash(CommonParameter.getInstance().isECKeyCryptoEngine(), decodeData); byte[] hash1 = Sha256Hash.hash(CommonParameter.getInstance().isECKeyCryptoEngine(), hash0); - if (hash1[0] == decodeCheck[decodeData.length] && hash1[1] == decodeCheck[decodeData.length + 1] - && hash1[2] == decodeCheck[decodeData.length + 2] && hash1[3] == decodeCheck[ - decodeData.length + 3]) { + if (hash1[0] == decodeCheck[decodeData.length] + && hash1[1] == decodeCheck[decodeData.length + 1] + && hash1[2] == decodeCheck[decodeData.length + 2] + && hash1[3] == decodeCheck[decodeData.length + 3]) { return decodeData; } return null; } - /** - * constructor. - */ - public static void freedResource(byte[] fromAddress, String priKey, byte[] toAddress, + /** constructor. */ + public static void freedResource( + byte[] fromAddress, + String priKey, + byte[] toAddress, WalletGrpc.WalletBlockingStub blockingStubFull) { long balance = PublicMethed.queryAccount(fromAddress, blockingStubFull).getBalance(); sendcoin(toAddress, balance - 500000, fromAddress, priKey, blockingStubFull); } - /** - * constructor. - */ + /** constructor. */ public static String parametersString(List parameters) { String[] inputArr = new String[parameters.size()]; int i = 0; @@ -6629,9 +6985,7 @@ public static String parametersString(List parameters) { return input; } - /** - * constructor. - */ + /** constructor. */ public static String bytes32ToString(byte[] bytes) { if (bytes == null) { return "null"; @@ -6650,12 +7004,14 @@ public static String bytes32ToString(byte[] bytes) { } } - /** - * constructor. - */ - - public static Return transferAssetForReturn(byte[] to, byte[] assertName, long amount, - byte[] address, String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static Return transferAssetForReturn( + byte[] to, + byte[] assertName, + long amount, + byte[] address, + String priKey, + WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); ECKey temKey = null; try { @@ -6683,18 +7039,17 @@ public static Return transferAssetForReturn(byte[] to, byte[] assertName, long a } Return ret = transaction.getResult(); return ret; - } - - /** - * constructor. - */ - - public static Return sendcoinForReturn(byte[] to, long amount, byte[] owner, String priKey, + /** constructor. */ + public static Return sendcoinForReturn( + byte[] to, + long amount, + byte[] owner, + String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); - //String priKey = testKey002; + // String priKey = testKey002; ECKey temKey = null; try { BigInteger priK = new BigInteger(priKey, 16); @@ -6720,14 +7075,15 @@ public static Return sendcoinForReturn(byte[] to, long amount, byte[] owner, Str return ret; } - /** - * constructor. - */ - - public static Transaction sendcoinForTransaction(byte[] to, long amount, byte[] owner, - String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static Transaction sendcoinForTransaction( + byte[] to, + long amount, + byte[] owner, + String priKey, + WalletGrpc.WalletBlockingStub blockingStubFull) { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); - //String priKey = testKey002; + // String priKey = testKey002; ECKey temKey = null; try { BigInteger priK = new BigInteger(priKey, 16); @@ -6750,11 +7106,14 @@ public static Transaction sendcoinForTransaction(byte[] to, long amount, byte[] return transaction; } - /** - * constructor. - */ - public static String marketSellAsset(byte[] owner, String priKey, byte[] sellTokenId, - long sellTokenQuantity, byte[] buyTokenId, long buyTokenQuantity, + /** constructor. */ + public static String marketSellAsset( + byte[] owner, + String priKey, + byte[] sellTokenId, + long sellTokenQuantity, + byte[] buyTokenId, + long buyTokenQuantity, WalletGrpc.WalletBlockingStub blockingStubFull) { ECKey temKey = null; @@ -6766,8 +7125,8 @@ public static String marketSellAsset(byte[] owner, String priKey, byte[] sellTok } final ECKey ecKey = temKey; - MarketContract.MarketSellAssetContract.Builder builder = MarketContract.MarketSellAssetContract - .newBuilder(); + MarketContract.MarketSellAssetContract.Builder builder = + MarketContract.MarketSellAssetContract.newBuilder(); builder .setOwnerAddress(ByteString.copyFrom(owner)) .setSellTokenId(ByteString.copyFrom(sellTokenId)) @@ -6799,20 +7158,24 @@ public static String marketSellAsset(byte[] owner, String priKey, byte[] sellTok transaction = signTransaction(ecKey, transaction); broadcastTransaction(transaction, blockingStubFull); - String txid = ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), - transaction.getRawData().toByteArray())); + String txid = + ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), + transaction.getRawData().toByteArray())); System.out.println("trigger txid = " + txid); return txid; - } - /** - * constructor. - */ - public static Return marketSellAssetGetResposne(byte[] owner, String priKey, byte[] sellTokenId, - long sellTokenQuantity, byte[] buyTokenId, long buyTokenQuantity, + /** constructor. */ + public static Return marketSellAssetGetResposne( + byte[] owner, + String priKey, + byte[] sellTokenId, + long sellTokenQuantity, + byte[] buyTokenId, + long buyTokenQuantity, WalletGrpc.WalletBlockingStub blockingStubFull) { ECKey temKey = null; @@ -6824,8 +7187,8 @@ public static Return marketSellAssetGetResposne(byte[] owner, String priKey, byt } ECKey ecKey = temKey; - MarketContract.MarketSellAssetContract.Builder builder = MarketContract.MarketSellAssetContract - .newBuilder(); + MarketContract.MarketSellAssetContract.Builder builder = + MarketContract.MarketSellAssetContract.newBuilder(); builder .setOwnerAddress(ByteString.copyFrom(owner)) .setSellTokenId(ByteString.copyFrom(sellTokenId)) @@ -6836,14 +7199,11 @@ public static Return marketSellAssetGetResposne(byte[] owner, String priKey, byt TransactionExtention transactionExtention = blockingStubFull.marketSellAsset(builder.build()); return transactionExtention.getResult(); - } - /** - * constructor. - */ - public static String marketCancelOrder(byte[] owner, String priKey, byte[] orderId, - WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static String marketCancelOrder( + byte[] owner, String priKey, byte[] orderId, WalletGrpc.WalletBlockingStub blockingStubFull) { ECKey temKey = null; try { @@ -6854,8 +7214,8 @@ public static String marketCancelOrder(byte[] owner, String priKey, byte[] order } final ECKey ecKey = temKey; - MarketContract.MarketCancelOrderContract.Builder builder = MarketContract - .MarketCancelOrderContract.newBuilder(); + MarketContract.MarketCancelOrderContract.Builder builder = + MarketContract.MarketCancelOrderContract.newBuilder(); builder.setOwnerAddress(ByteString.copyFrom(owner)).setOrderId(ByteString.copyFrom(orderId)); TransactionExtention transactionExtention = blockingStubFull.marketCancelOrder(builder.build()); @@ -6883,21 +7243,20 @@ public static String marketCancelOrder(byte[] owner, String priKey, byte[] order transaction = signTransaction(ecKey, transaction); broadcastTransaction(transaction, blockingStubFull); - String txid = ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), - transaction.getRawData().toByteArray())); + String txid = + ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), + transaction.getRawData().toByteArray())); System.out.println("trigger txid = " + txid); return txid; } - /** - * constructor. - */ - - public static Return marketCancelOrderGetResposne(byte[] owner, String priKey, byte[] orderId, - WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static Return marketCancelOrderGetResposne( + byte[] owner, String priKey, byte[] orderId, WalletGrpc.WalletBlockingStub blockingStubFull) { ECKey temKey = null; try { @@ -6908,8 +7267,8 @@ public static Return marketCancelOrderGetResposne(byte[] owner, String priKey, b } ECKey ecKey = temKey; - MarketContract.MarketCancelOrderContract.Builder builder = MarketContract - .MarketCancelOrderContract.newBuilder(); + MarketContract.MarketCancelOrderContract.Builder builder = + MarketContract.MarketCancelOrderContract.newBuilder(); builder.setOwnerAddress(ByteString.copyFrom(owner)).setOrderId(ByteString.copyFrom(orderId)); TransactionExtention transactionExtention = blockingStubFull.marketCancelOrder(builder.build()); @@ -6920,11 +7279,9 @@ public static Return marketCancelOrderGetResposne(byte[] owner, String priKey, b return transactionExtention.getResult(); } - /** - * constructor. - */ - public static Optional getMarketOrderByAccount(byte[] address, - WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static Optional getMarketOrderByAccount( + byte[] address, WalletGrpc.WalletBlockingStub blockingStubFull) { ByteString addressBs = ByteString.copyFrom(address); BytesMessage request = BytesMessage.newBuilder().setValue(addressBs).build(); @@ -6933,11 +7290,9 @@ public static Optional getMarketOrderByAccount(byte[] return Optional.ofNullable(marketOrderList); } - /** - * constructor. - */ - public static Optional getMarketOrderByAccountSolidity(byte[] address, - WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubSolidity) { + /** constructor. */ + public static Optional getMarketOrderByAccountSolidity( + byte[] address, WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubSolidity) { ByteString addressBs = ByteString.copyFrom(address); BytesMessage request = BytesMessage.newBuilder().setValue(addressBs).build(); @@ -6946,33 +7301,27 @@ public static Optional getMarketOrderByAccountSolidity return Optional.ofNullable(marketOrderList); } - /** - * constructor. - */ - public static Optional getMarketOrderById(byte[] order, - WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static Optional getMarketOrderById( + byte[] order, WalletGrpc.WalletBlockingStub blockingStubFull) { ByteString orderBytes = ByteString.copyFrom(order); BytesMessage request = BytesMessage.newBuilder().setValue(orderBytes).build(); Protocol.MarketOrder orderPair = blockingStubFull.getMarketOrderById(request); return Optional.ofNullable(orderPair); } - /** - * constructor. - */ - public static Optional getMarketOrderByIdSolidity(byte[] order, - WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubSolidity) { + /** constructor. */ + public static Optional getMarketOrderByIdSolidity( + byte[] order, WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubSolidity) { ByteString orderBytes = ByteString.copyFrom(order); BytesMessage request = BytesMessage.newBuilder().setValue(orderBytes).build(); Protocol.MarketOrder orderPair = blockingStubSolidity.getMarketOrderById(request); return Optional.ofNullable(orderPair); } - /** - * constructor. - */ - public static Optional getMarketPriceByPair(byte[] sellTokenId, - byte[] buyTokenId, WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static Optional getMarketPriceByPair( + byte[] sellTokenId, byte[] buyTokenId, WalletGrpc.WalletBlockingStub blockingStubFull) { Protocol.MarketOrderPair request = Protocol.MarketOrderPair.newBuilder() .setSellTokenId(ByteString.copyFrom(sellTokenId)) @@ -6983,11 +7332,9 @@ public static Optional getMarketPriceByPair(byte[] sel return Optional.ofNullable(marketPriceList); } - /** - * constructor. - */ - public static Optional getMarketOrderListByPair(byte[] sellTokenId, - byte[] buyTokenId, WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static Optional getMarketOrderListByPair( + byte[] sellTokenId, byte[] buyTokenId, WalletGrpc.WalletBlockingStub blockingStubFull) { Protocol.MarketOrderPair request = Protocol.MarketOrderPair.newBuilder() .setSellTokenId(ByteString.copyFrom(sellTokenId)) @@ -6998,46 +7345,39 @@ public static Optional getMarketOrderListByPair(byte[] return Optional.ofNullable(marketOrderList); } - /** - * constructor. - */ + /** constructor. */ public static Optional getMarketOrderListByPairSolidity( byte[] sellTokenId, - byte[] buyTokenId, WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubSolidity) { + byte[] buyTokenId, + WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubSolidity) { Protocol.MarketOrderPair request = Protocol.MarketOrderPair.newBuilder() .setSellTokenId(ByteString.copyFrom(sellTokenId)) .setBuyTokenId(ByteString.copyFrom(buyTokenId)) .build(); - Protocol.MarketOrderList marketOrderList = blockingStubSolidity - .getMarketOrderListByPair(request); + Protocol.MarketOrderList marketOrderList = + blockingStubSolidity.getMarketOrderListByPair(request); return Optional.ofNullable(marketOrderList); } - /** - * constructor. - */ + /** constructor. */ public static Optional getMarketPairList( WalletGrpc.WalletBlockingStub blockingStubFull) { - Protocol.MarketOrderPairList marketOrderList = blockingStubFull - .getMarketPairList(EmptyMessage.newBuilder().build()); + Protocol.MarketOrderPairList marketOrderList = + blockingStubFull.getMarketPairList(EmptyMessage.newBuilder().build()); return Optional.ofNullable(marketOrderList); } - /** - * constructor. - */ + /** constructor. */ public static Optional getMarketPairListSolidity( WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubSolidity) { - Protocol.MarketOrderPairList marketOrderList = blockingStubSolidity - .getMarketPairList(EmptyMessage.newBuilder().build()); + Protocol.MarketOrderPairList marketOrderList = + blockingStubSolidity.getMarketPairList(EmptyMessage.newBuilder().build()); return Optional.ofNullable(marketOrderList); } - /** - * constructor. - */ + /** constructor. */ public static String stringToHexString(String s) { String str = ""; for (int i = 0; i < s.length(); i++) { @@ -7048,9 +7388,7 @@ public static String stringToHexString(String s) { return str; } - /** - * constructor. - */ + /** constructor. */ public static String hexStringToString(String s) { if (s == null || s.equals("")) { return null; @@ -7059,8 +7397,7 @@ public static String hexStringToString(String s) { byte[] baKeyword = new byte[s.length() / 2]; for (int i = 0; i < baKeyword.length; i++) { try { - baKeyword[i] = (byte) (0xff & Integer.parseInt( - s.substring(i * 2, i * 2 + 2), 16)); + baKeyword[i] = (byte) (0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16)); } catch (Exception e) { e.printStackTrace(); } @@ -7074,16 +7411,12 @@ public static String hexStringToString(String s) { return s; } - /** - * constructor. - */ + /** constructor. */ public static String removeAll0sAtTheEndOfHexStr(String s) { return s.replaceAll("(00)+$", ""); } - /** - * constructor. - */ + /** constructor. */ public static String replaceCode(String code, String address) { if (code.indexOf("__$") == -1) { return code; @@ -7097,52 +7430,58 @@ public static String replaceCode(String code, String address) { } } - /** - * constructor. - */ - public static Map getAllowance2(Long startNum, Long endNum, - WalletGrpc.WalletBlockingStub blockingStubFull) { - final String blackHole = Configuration.getByPath("testng.conf") - .getString("defaultParameter.blackHoleAddress"); + /** constructor. */ + public static Map getAllowance2( + Long startNum, Long endNum, WalletGrpc.WalletBlockingStub blockingStubFull) { + final String blackHole = + Configuration.getByPath("testng.conf").getString("defaultParameter.blackHoleAddress"); Long totalCount = 0L; Map witnessBlockCount = new HashMap<>(); Map witnessBrokerage = new HashMap<>(); Map witnessVoteCount = new HashMap<>(); Map witnessAllowance = new HashMap<>(); - List witnessList = PublicMethed.listWitnesses(blockingStubFull) - .get().getWitnessesList(); + List witnessList = + PublicMethed.listWitnesses(blockingStubFull).get().getWitnessesList(); for (Protocol.Witness witness : witnessList) { - witnessVoteCount.put(ByteArray.toHexString(witness.getAddress().toByteArray()), - witness.getVoteCount()); - GrpcAPI.BytesMessage bytesMessage = GrpcAPI.BytesMessage.newBuilder() - .setValue(witness.getAddress()).build(); + witnessVoteCount.put( + ByteArray.toHexString(witness.getAddress().toByteArray()), witness.getVoteCount()); + GrpcAPI.BytesMessage bytesMessage = + GrpcAPI.BytesMessage.newBuilder().setValue(witness.getAddress()).build(); Long brokerager = blockingStubFull.getBrokerageInfo(bytesMessage).getNum(); witnessBrokerage.put(ByteArray.toHexString(witness.getAddress().toByteArray()), brokerager); totalCount += witness.getVoteCount(); } Optional infoById = null; for (Long k = startNum; k < endNum; k++) { - String witnessAdd = ByteArray.toHexString(PublicMethed.getBlock(k, blockingStubFull) - .getBlockHeader().getRawData().getWitnessAddress().toByteArray()); + String witnessAdd = + ByteArray.toHexString( + PublicMethed.getBlock(k, blockingStubFull) + .getBlockHeader() + .getRawData() + .getWitnessAddress() + .toByteArray()); witnessBlockCount.put(witnessAdd, witnessBlockCount.getOrDefault(witnessAdd, 0) + 1); - List transList = PublicMethed.getBlock(k, - blockingStubFull).getTransactionsList(); + List transList = + PublicMethed.getBlock(k, blockingStubFull).getTransactionsList(); for (Transaction tem : transList) { - String txid = ByteArray.toHexString(Sha256Hash - .hash(CommonParameter.getInstance().isECKeyCryptoEngine(), - tem.getRawData().toByteArray())); + String txid = + ByteArray.toHexString( + Sha256Hash.hash( + CommonParameter.getInstance().isECKeyCryptoEngine(), + tem.getRawData().toByteArray())); logger.info("----ss txid:" + txid); infoById = PublicMethed.getTransactionInfoById(txid, blockingStubFull); Long packingFee = infoById.get().getPackingFee(); - witnessAllowance.put(witnessAdd, witnessAllowance.getOrDefault(witnessAdd, 0L) - + packingFee); + witnessAllowance.put( + witnessAdd, witnessAllowance.getOrDefault(witnessAdd, 0L) + packingFee); } } logger.info("========totalCount:" + totalCount); List chainParaList = - blockingStubFull.getChainParameters(EmptyMessage.newBuilder().build()) + blockingStubFull + .getChainParameters(EmptyMessage.newBuilder().build()) .getChainParameterList(); Long witness127PayPerBlock = 0L; Long witnessPayPerBlock = 0L; @@ -7154,8 +7493,11 @@ public static Map getAllowance2(Long startNum, Long endNum, witnessPayPerBlock = para.getValue(); } } - logger.info("witness127PayPerBlock:" + witness127PayPerBlock - + "\n witnessPayPerBlock:" + witnessPayPerBlock); + logger.info( + "witness127PayPerBlock:" + + witness127PayPerBlock + + "\n witnessPayPerBlock:" + + witnessPayPerBlock); for (Map.Entry entry : witnessBrokerage.entrySet()) { logger.info("-----witnessBrokerage " + entry.getKey() + " : " + entry.getValue()); @@ -7169,13 +7511,19 @@ public static Map getAllowance2(Long startNum, Long endNum, for (Map.Entry entry : witnessVoteCount.entrySet()) { String witnessAdd = entry.getKey(); - logger.info("----witnessAdd:" + witnessAdd + " block count:" - + witnessBlockCount.get(witnessAdd) - + " all: " + witnessAllowance.getOrDefault(witnessAdd, 0L)); - Long pay = (witnessBlockCount.get(witnessAdd) * witnessPayPerBlock - + (endNum - startNum) * witness127PayPerBlock * entry.getValue() / totalCount - + witnessAllowance.getOrDefault(witnessAdd, 0L)) - * witnessBrokerage.get(witnessAdd) / 100; + logger.info( + "----witnessAdd:" + + witnessAdd + + " block count:" + + witnessBlockCount.get(witnessAdd) + + " all: " + + witnessAllowance.getOrDefault(witnessAdd, 0L)); + Long pay = + (witnessBlockCount.get(witnessAdd) * witnessPayPerBlock + + (endNum - startNum) * witness127PayPerBlock * entry.getValue() / totalCount + + witnessAllowance.getOrDefault(witnessAdd, 0L)) + * witnessBrokerage.get(witnessAdd) + / 100; witnessAllowance.put(witnessAdd, pay); logger.info("****** " + witnessAdd + " : " + pay); @@ -7188,11 +7536,9 @@ public static String getContractStringMsg(byte[] contractMsgArray) { return ByteArray.toStr(ByteArray.subArray(contractMsgArray, 64, 64 + resultLenth)); } - /** - * constructor. - */ - public boolean updateBrokerage(byte[] owner, int brokerage, String priKey, - WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public boolean updateBrokerage( + byte[] owner, int brokerage, String priKey, WalletGrpc.WalletBlockingStub blockingStubFull) { ECKey temKey = null; try { @@ -7205,14 +7551,14 @@ public boolean updateBrokerage(byte[] owner, int brokerage, String priKey, UpdateBrokerageContract.Builder updateBrokerageContract = UpdateBrokerageContract.newBuilder(); updateBrokerageContract.setOwnerAddress(ByteString.copyFrom(owner)).setBrokerage(brokerage); - TransactionExtention transactionExtention = blockingStubFull - .updateBrokerage(updateBrokerageContract.build()); + TransactionExtention transactionExtention = + blockingStubFull.updateBrokerage(updateBrokerageContract.build()); Protocol.Transaction transaction = transactionExtention.getTransaction(); if (transactionExtention == null || !transactionExtention.getResult().getResult()) { if (transactionExtention != null) { System.out.println("Code = " + transactionExtention.getResult().getCode()); - System.out - .println("Message = " + transactionExtention.getResult().getMessage().toStringUtf8()); + System.out.println( + "Message = " + transactionExtention.getResult().getMessage().toStringUtf8()); } return false; } @@ -7222,61 +7568,61 @@ public boolean updateBrokerage(byte[] owner, int brokerage, String priKey, return response.getResult(); } - /** - * constructor. - */ - public static Long getAccountBalance(Protocol.Block block,byte[] address, - WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static Long getAccountBalance( + Protocol.Block block, byte[] address, WalletGrpc.WalletBlockingStub blockingStubFull) { final Long blockNum = block.getBlockHeader().getRawData().getNumber(); - BlockId blockId = new BlockId( - org.tron.common.utils.Sha256Hash.of(CommonParameter.getInstance().isECKeyCryptoEngine(), - block.getBlockHeader().getRawData().toByteArray()), - block.getBlockHeader().getRawData().getNumber()); - - - - BalanceContract.AccountIdentifier accountIdentifier = BalanceContract - .AccountIdentifier.newBuilder().setAddress(ByteString.copyFrom(address)).build(); - BalanceContract.BlockBalanceTrace.BlockIdentifier blockIdentifier - = BalanceContract.BlockBalanceTrace.BlockIdentifier.newBuilder() - .setHash(blockId.getByteString()).setNumber(blockNum).build(); + BlockId blockId = + new BlockId( + org.tron.common.utils.Sha256Hash.of( + CommonParameter.getInstance().isECKeyCryptoEngine(), + block.getBlockHeader().getRawData().toByteArray()), + block.getBlockHeader().getRawData().getNumber()); + + BalanceContract.AccountIdentifier accountIdentifier = + BalanceContract.AccountIdentifier.newBuilder() + .setAddress(ByteString.copyFrom(address)) + .build(); + BalanceContract.BlockBalanceTrace.BlockIdentifier blockIdentifier = + BalanceContract.BlockBalanceTrace.BlockIdentifier.newBuilder() + .setHash(blockId.getByteString()) + .setNumber(blockNum) + .build(); - BalanceContract.AccountBalanceRequest accountBalanceRequest - = BalanceContract.AccountBalanceRequest.newBuilder() - .setAccountIdentifier(accountIdentifier).setBlockIdentifier(blockIdentifier).build(); + BalanceContract.AccountBalanceRequest accountBalanceRequest = + BalanceContract.AccountBalanceRequest.newBuilder() + .setAccountIdentifier(accountIdentifier) + .setBlockIdentifier(blockIdentifier) + .build(); return blockingStubFull.getAccountBalance(accountBalanceRequest).getBalance(); } - /** - * constructor. - */ - public static BalanceContract.BlockBalanceTrace getBlockBalance(Protocol.Block block, - WalletGrpc.WalletBlockingStub blockingStubFull) { + /** constructor. */ + public static BalanceContract.BlockBalanceTrace getBlockBalance( + Protocol.Block block, WalletGrpc.WalletBlockingStub blockingStubFull) { final Long blockNum = block.getBlockHeader().getRawData().getNumber(); - BlockId blockId = new BlockId( - org.tron.common.utils.Sha256Hash.of(CommonParameter.getInstance().isECKeyCryptoEngine(), - block.getBlockHeader().getRawData().toByteArray()), - block.getBlockHeader().getRawData().getNumber()); - BalanceContract.BlockBalanceTrace.BlockIdentifier blockIdentifier - = BalanceContract.BlockBalanceTrace.BlockIdentifier.newBuilder() - .setHash(blockId.getByteString()).setNumber(blockNum).build(); + BlockId blockId = + new BlockId( + org.tron.common.utils.Sha256Hash.of( + CommonParameter.getInstance().isECKeyCryptoEngine(), + block.getBlockHeader().getRawData().toByteArray()), + block.getBlockHeader().getRawData().getNumber()); + BalanceContract.BlockBalanceTrace.BlockIdentifier blockIdentifier = + BalanceContract.BlockBalanceTrace.BlockIdentifier.newBuilder() + .setHash(blockId.getByteString()) + .setNumber(blockNum) + .build(); return blockingStubFull.getBlockBalanceTrace(blockIdentifier); - - } - /** - * 61 constructor. - */ - - public static Optional getTransactionFromPending(String txId, - WalletGrpc.WalletBlockingStub blockingStubFull) { + /** 61 constructor. */ + public static Optional getTransactionFromPending( + String txId, WalletGrpc.WalletBlockingStub blockingStubFull) { ByteString bsTxid = ByteString.copyFrom(ByteArray.fromHexString(txId)); BytesMessage request = BytesMessage.newBuilder().setValue(bsTxid).build(); Transaction transaction; transaction = blockingStubFull.getTransactionFromPending(request); return Optional.ofNullable(transaction); } - } diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/eventquery/EventLog2.java b/framework/src/test/java/stest/tron/wallet/dailybuild/eventquery/EventLog2.java new file mode 100644 index 00000000000..124a8d4405f --- /dev/null +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/eventquery/EventLog2.java @@ -0,0 +1,117 @@ +package stest.tron.wallet.dailybuild.eventquery; + +import io.grpc.ManagedChannel; +import io.grpc.ManagedChannelBuilder; +import java.util.HashMap; +import java.util.concurrent.TimeUnit; +import lombok.extern.slf4j.Slf4j; +import org.junit.Assert; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeSuite; +import org.testng.annotations.Test; +import org.tron.api.GrpcAPI; +import org.tron.api.WalletGrpc; +import org.tron.common.crypto.ECKey; +import org.tron.common.utils.ByteArray; +import org.tron.common.utils.Utils; +import org.tron.core.Wallet; +import org.tron.protos.Protocol; +import org.tron.protos.contract.SmartContractOuterClass; +import stest.tron.wallet.common.client.Configuration; +import stest.tron.wallet.common.client.Parameter; +import stest.tron.wallet.common.client.utils.PublicMethed; + + + + +@Slf4j +public class EventLog2 { + + private final String testNetAccountKey = Configuration.getByPath("testng.conf") + .getString("foundationAccount.key2"); + private final byte[] testNetAccountAddress = PublicMethed.getFinalAddress(testNetAccountKey); + byte[] mapKeyContract = null; + ECKey ecKey1 = new ECKey(Utils.getRandom()); + byte[] contractExcAddress = ecKey1.getAddress(); + String contractExcKey = ByteArray.toHexString(ecKey1.getPrivKeyBytes()); + private Long maxFeeLimit = Configuration.getByPath("testng.conf") + .getLong("defaultParameter.maxFeeLimit"); + private ManagedChannel channelFull = null; + private WalletGrpc.WalletBlockingStub blockingStubFull = null; + + private String fullnode = Configuration.getByPath("testng.conf") + .getStringList("fullnode.ip.list").get(0); + + @BeforeSuite + public void beforeSuite() { + Wallet wallet = new Wallet(); + Wallet.setAddressPreFixByte(Parameter.CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); + } + + /** + * constructor. + */ + + @BeforeClass(enabled = true) + public void beforeClass() { + PublicMethed.printAddress(contractExcKey); + channelFull = ManagedChannelBuilder.forTarget(fullnode) + .usePlaintext(true) + .build(); + blockingStubFull = WalletGrpc.newBlockingStub(channelFull); + + Assert.assertTrue(PublicMethed + .sendcoin(contractExcAddress, 300100_000_000L, + testNetAccountAddress, testNetAccountKey, blockingStubFull)); + PublicMethed.waitProduceNextBlock(blockingStubFull); + + String filePath = "src/test/resources/soliditycode/eventLog2.sol"; + String contractName = "Event"; + HashMap retMap = PublicMethed.getBycodeAbi(filePath, contractName); + String code = retMap.get("byteCode").toString(); + String abi = retMap.get("abI").toString(); + mapKeyContract = PublicMethed.deployContract(contractName, abi, code, "", maxFeeLimit, + 0L, 100, null, contractExcKey, + contractExcAddress, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + SmartContractOuterClass.SmartContract smartContract = PublicMethed.getContract(mapKeyContract, + blockingStubFull); + Assert.assertNotNull(smartContract.getAbi()); + } + + + @Test(enabled = true, description = "test opcode log2") + public void test01EmitLog2() { + GrpcAPI.TransactionExtention transactionExtention = PublicMethed + .triggerConstantContractForExtention(mapKeyContract, + "messageI()", "#", true, + 0, maxFeeLimit, "0", 0, contractExcAddress, contractExcKey, blockingStubFull); + Protocol.Transaction transaction = transactionExtention.getTransaction(); + String logStr1 = ByteArray.toHexString(transactionExtention.getLogs(0).getData().toByteArray()); + Assert.assertTrue(logStr1.contains("000000000000000000000000000000000000000" + + "000000000000000000000000100000000000000000" + + "000000000000000000000000000000000000000000000010000000000000000" + + "000000000000000000000000000000000000000000000001")); + int trueRes = ByteArray.toInt(transactionExtention.getConstantResult(0).toByteArray()); + logger.info("truerRes: " + trueRes + " message:" + transaction.getRet(0).getRet()); + Assert.assertEquals(1, trueRes); + } + + + + /** + * constructor. + */ + @AfterClass + public void shutdown() throws InterruptedException { + PublicMethed.freedResource(contractExcAddress, contractExcKey, + testNetAccountAddress, blockingStubFull); + if (channelFull != null) { + channelFull.shutdown().awaitTermination(5, TimeUnit.SECONDS); + } + } + + +} + diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/http/HttpTestExchange001.java b/framework/src/test/java/stest/tron/wallet/dailybuild/http/HttpTestExchange001.java index ce06d8f9f39..7d38b0540c6 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/http/HttpTestExchange001.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/http/HttpTestExchange001.java @@ -151,7 +151,7 @@ public void test05GetExchangeById() { response = HttpMethed.getExchangeById(httpnode, exchangeId); responseContent = HttpMethed.parseResponseContent(response); HttpMethed.printJsonContent(responseContent); - Assert.assertTrue(responseContent.getInteger("exchange_id") == exchangeId); + Assert.assertTrue(responseContent.getInteger("exchange_id").equals(exchangeId)); Assert.assertEquals(responseContent.getString("creator_address"), ByteArray.toHexString(exchangeOwnerAddress)); beforeInjectBalance = responseContent.getLong("first_token_balance"); @@ -167,7 +167,7 @@ public void test06GetExchangeByIdFromSolidity() { response = HttpMethed.getExchangeByIdFromSolidity(httpSoliditynode, exchangeId); responseContent = HttpMethed.parseResponseContent(response); HttpMethed.printJsonContent(responseContent); - Assert.assertTrue(responseContent.getInteger("exchange_id") == exchangeId); + Assert.assertTrue(responseContent.getInteger("exchange_id").equals(exchangeId)); Assert.assertEquals(responseContent.getString("creator_address"), ByteArray.toHexString(exchangeOwnerAddress)); beforeInjectBalance = responseContent.getLong("first_token_balance"); @@ -183,7 +183,7 @@ public void test07GetExchangeByIdFromPbft() { response = HttpMethed.getExchangeByIdFromPbft(httpPbftNode, exchangeId); responseContent = HttpMethed.parseResponseContent(response); HttpMethed.printJsonContent(responseContent); - Assert.assertTrue(responseContent.getInteger("exchange_id") == exchangeId); + Assert.assertTrue(responseContent.getInteger("exchange_id").equals(exchangeId)); Assert.assertEquals(responseContent.getString("creator_address"), ByteArray.toHexString(exchangeOwnerAddress)); beforeInjectBalance = responseContent.getLong("first_token_balance"); diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java b/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java index 5f1ddf3e4ae..b1899052632 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts001.java @@ -41,6 +41,7 @@ public class Accounts001 extends JsonRpcBase { String witnessAddress = null; String feeLimit = null; String accountStateRoot = null; + String energyUsed = "0x135c6"; List transactionIdList = null; long size = 0; @@ -74,17 +75,14 @@ public void test02JsonRpcApiTestForEthBlockNumber() throws Exception { responseContent = HttpMethed.parseResponseContent(response); responseContent.get("result"); String blockNum = responseContent.getString("result").substring(2); - int blocknumFromJsonRpcNode = Integer.parseInt(blockNum, 16); + long blockNumFromJsonRpcNode = Long.parseLong(blockNum, 16); response = HttpMethed.getNowBlock(httpFullNode); responseContent = HttpMethed.parseResponseContent(response); - int blocknumFromHttp = - responseContent - .getJSONObject("block_header") - .getJSONObject("raw_data") - .getInteger("number"); - logger.info("blocknumFromJsonRpcNode:" + blocknumFromJsonRpcNode); - logger.info("blocknumFromHttp:" + blocknumFromHttp); - Assert.assertTrue(Math.abs(blocknumFromJsonRpcNode - blocknumFromHttp) <= 3); + long blockNumFromHttp = + responseContent.getJSONObject("block_header").getJSONObject("raw_data").getLong("number"); + logger.info("blocknumFromJsonRpcNode:" + blockNumFromJsonRpcNode); + logger.info("blocknumFromHttp:" + blockNumFromHttp); + Assert.assertTrue(Math.abs(blockNumFromJsonRpcNode - blockNumFromHttp) <= 3); } @Test(enabled = true, description = "Json rpc api of eth_call") @@ -93,15 +91,16 @@ public void test03JsonRpcApiTestForEthCall() throws Exception { HttpMethed.waitToProduceOneBlock(httpFullNode); param.addProperty("from", ByteArray.toHexString(jsonRpcOwnerAddress)); param.addProperty("to", trc20AddressHex); - param.addProperty("gas", "0"); - param.addProperty("gasPrice", "0"); - param.addProperty("value", "0"); + param.addProperty("gas", "0x0"); + param.addProperty("gasPrice", "0x0"); + param.addProperty("value", "0x0"); param.addProperty("data", "0x06fdde03"); JsonArray params = new JsonArray(); params.add(param); params.add("latest"); JsonObject requestBody = getJsonRpcBody("eth_call", params); - logger.info("params:" + params); + logger.info("03params:" + params); + logger.info("requestBody:" + requestBody); response = getJsonRpc(jsonRpcNode, requestBody); responseContent = HttpMethed.parseResponseContent(response); String dataResult = responseContent.getString("result"); @@ -153,13 +152,87 @@ public void test06JsonRpcApiTestForEthEstimateGas() throws Exception { params.add(param); JsonObject requestBody = getJsonRpcBody("eth_estimateGas", params); response = getJsonRpc(jsonRpcNode, requestBody); + logger.info("test06requestBody:" + requestBody); responseContent = HttpMethed.parseResponseContent(response); String dataResult = responseContent.getString("result"); Assert.assertEquals("0x147", dataResult); } + @Test(enabled = true, description = "Json rpc api of eth_estimateGasHasPayable") + public void test07JsonRpcApiTestForEthEstimateGasHasPayable() throws Exception { + response = HttpMethed.getTransactionInfoById(httpFullNode, txid); + responseContent = HttpMethed.parseResponseContent(response); + Long realEnergyUsed = responseContent.getJSONObject("receipt").getLong("energy_usage_total"); + logger.info("realEnergyUsed:" + realEnergyUsed); + JsonObject param = new JsonObject(); + param.addProperty("from", "0x" + ByteArray.toHexString(jsonRpcOwnerAddress).substring(2)); + param.addProperty("to", "0x" + contractAddressFrom58); + param.addProperty("gas", "0x0"); + param.addProperty("gasPrice", "0x0"); + param.addProperty("value", "0x1389"); + param.addProperty("data", data); + JsonArray params = new JsonArray(); + params.add(param); + JsonObject requestBody = getJsonRpcBody("eth_estimateGas", params); + response = getJsonRpc(jsonRpcNode, requestBody); + logger.info("test07requestBody:" + requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String dataResult = responseContent.getString("result"); + Assert.assertEquals((long) realEnergyUsed, Long.parseLong(dataResult.substring(2), 16)); + } + + @Test(enabled = true, description = "Json rpc api of eth_estimateGasWithoutTo") + public void test08JsonRpcApiTestForEthEstimateGasWithoutTo() throws Exception { + JsonObject param = new JsonObject(); + param.addProperty("from", "0x6C0214C9995C6F3A61AB23F0EB84B0CDE7FD9C7C"); + param.addProperty("gas", "0x0"); + param.addProperty("gasPrice", "0x0"); + param.addProperty("value", "0x0"); + param.addProperty( + "data", + "0x6080604052d3600055d2600155346002556101418061001f6000396000f30060806040" + + "52600436106100565763ffffffff7c010000000000000000000000000000000000000000" + + "000000000000000060003504166305c24200811461005b5780633be9ece7146100815780" + + "6371dc08ce146100aa575b600080fd5b6100636100b2565b6040805193845260208401929" + + "0925282820152519081900360600190f35b6100a873ffffffffffffffffffffffffffffff" + + "ffffffffff600435166024356044356100c0565b005b61006361010d565b60005460015460" + + "0254909192565b60405173ffffffffffffffffffffffffffffffffffffffff841690821561" + + "08fc029083908590600081818185878a8ad0945050505050158015610107573d6000803e3d" + + "6000fd5b50505050565bd3d2349091925600a165627a7a72305820a2fb39541e90eda9a2f5" + + "f9e7905ef98e66e60dd4b38e00b05de418da3154e757002900000000000000000000000000" + + "00000000000000000000000000000090fa17bb"); + JsonArray params = new JsonArray(); + params.add(param); + JsonObject requestBody = getJsonRpcBody("eth_estimateGas", params); + response = getJsonRpc(jsonRpcNode, requestBody); + logger.info("test08requestBody:" + requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String dataResult = responseContent.getString("result"); + logger.info("dataResult:" + dataResult); + Assert.assertEquals(energyUsed, dataResult); + } + + @Test(enabled = true, description = "Json rpc api of eth_estimateGasSendTrx") + public void test09JsonRpcApiTestForEthEstimateGasSendTrx() throws Exception { + JsonObject param = new JsonObject(); + param.addProperty("from", ByteArray.toHexString(jsonRpcOwnerAddress)); + param.addProperty("to", "0xC1A74CD01732542093F5A87910A398AD70F04BD7"); + param.addProperty("gas", "0x0"); + param.addProperty("gasPrice", "0x0"); + param.addProperty("value", "0x1"); + param.addProperty("data", "0x0"); + JsonArray params = new JsonArray(); + params.add(param); + JsonObject requestBody = getJsonRpcBody("eth_estimateGas", params); + response = getJsonRpc(jsonRpcNode, requestBody); + logger.info("test09requestBody:" + requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String dataResult = responseContent.getString("result"); + Assert.assertEquals("0x0", dataResult); + } + @Test(enabled = true, description = "Json rpc api of eth_gasPrice") - public void test07JsonRpcApiTestForEthGasPrice() throws Exception { + public void test10JsonRpcApiTestForEthGasPrice() throws Exception { JsonArray params = new JsonArray(); JsonObject requestBody = getJsonRpcBody("eth_gasPrice", params); response = getJsonRpc(jsonRpcNode, requestBody); @@ -182,9 +255,9 @@ public void test07JsonRpcApiTestForEthGasPrice() throws Exception { } @Test(enabled = true, description = "Json rpc api of eth_getBalance") - public void test08JsonRpcApiTestForEthGetBalance() throws Exception { + public void test11JsonRpcApiTestForEthGetBalance() throws Exception { JsonArray params = new JsonArray(); - params.add("0x415624C12E308B03A1A6B21D9B86E3942FAC1AB92B"); + params.add("0x" + ByteArray.toHexString(foundationAccountAddress).substring(2)); params.add("latest"); JsonObject requestBody = getJsonRpcBody("eth_getBalance", params); response = getJsonRpc(jsonRpcNode, requestBody); @@ -198,7 +271,7 @@ public void test08JsonRpcApiTestForEthGetBalance() throws Exception { } @Test(enabled = true, description = "Json rpc api of eth_getBlockTransactionCountByNumber") - public void test09JsonRpcApiTestForEthGetBlockTransactionCountByNum() throws Exception { + public void test12JsonRpcApiTestForEthGetBlockTransactionCountByNum() throws Exception { response = HttpMethed.getNowBlock(httpFullNode); responseContent = HttpMethed.parseResponseContent(response); JsonArray params = new JsonArray(); @@ -217,7 +290,7 @@ public void test09JsonRpcApiTestForEthGetBlockTransactionCountByNum() throws Exc } @Test(enabled = true, description = "Json rpc api of eth_getCode") - public void test10JsonRpcApiTestForEthGetCode() throws Exception { + public void test13JsonRpcApiTestForEthGetCode() throws Exception { JsonArray params = new JsonArray(); params.add(contractAddressFrom58); @@ -236,7 +309,7 @@ public void test10JsonRpcApiTestForEthGetCode() throws Exception { } @Test(enabled = true, description = "Json rpc api of eth_getStorageAt") - public void test11JsonRpcApiTestForEthGetStorageAt01() throws Exception { + public void test14JsonRpcApiTestForEthGetStorageAt01() throws Exception { JsonArray params = new JsonArray(); params.add(contractAddressFrom58); @@ -246,7 +319,7 @@ public void test11JsonRpcApiTestForEthGetStorageAt01() throws Exception { logger.info("requestBody:" + requestBody); response = getJsonRpc(jsonRpcNode, requestBody); responseContent = HttpMethed.parseResponseContent(response); - logger.info("11responseContent:" + responseContent); + logger.info("14responseContent:" + responseContent); String result = responseContent.getString("result").substring(2); long resultExpect = Long.parseLong(result, 16); logger.info("result:" + resultExpect); @@ -254,7 +327,7 @@ public void test11JsonRpcApiTestForEthGetStorageAt01() throws Exception { } @Test(enabled = true, description = "Json rpc api of eth_getStorageAt") - public void test12JsonRpcApiTestForEthGetStorageAt02() throws Exception { + public void test15JsonRpcApiTestForEthGetStorageAt02() throws Exception { String address = "000000000000000000000000" + ByteArray.toHexString(jsonRpcOwnerAddress).substring(2); @@ -277,16 +350,16 @@ public void test12JsonRpcApiTestForEthGetStorageAt02() throws Exception { logger.info("requestBody:" + requestBody); response = getJsonRpc(jsonRpcNode, requestBody); responseContent = HttpMethed.parseResponseContent(response); - logger.info("12responseContent:" + responseContent); + logger.info("15responseContent:" + responseContent); String result = responseContent.getString("result").substring(2); - logger.info("12result:" + result); + logger.info("15result:" + result); logger.info("mapResult:" + Integer.parseInt(result, 16)); Assert.assertEquals("5678", String.valueOf(Integer.parseInt(result, 16))); } @Test(enabled = true, description = "Json rpc api of eth_getTransactionByBlockNumberAndIndex") - public void test13JsonRpcApiTestForEthGetTransactionByBlockNumberAndIndex() throws Exception { - logger.info("15blockNum:" + blockNum); + public void test16JsonRpcApiTestForEthGetTransactionByBlockNumberAndIndex() throws Exception { + logger.info("16blockNum:" + blockNum); blockNumHex = "0x" + Integer.toHexString(blockNum); logger.info("blockNumHex:" + blockNumHex); JsonArray params = new JsonArray(); @@ -334,7 +407,7 @@ public void test13JsonRpcApiTestForEthGetTransactionByBlockNumberAndIndex() thro "0x" + responseContent.getJSONArray("transactions").getJSONObject(i).getString("txID")); } } - logger.info("15transactionIdList:" + transactionIdList); + logger.info("16transactionIdList:" + transactionIdList); logger.info(String.valueOf(indexNum)); indexHex = "0x" + Integer.toHexString(indexNum); logger.info("indexHex:" + indexHex); @@ -344,7 +417,7 @@ public void test13JsonRpcApiTestForEthGetTransactionByBlockNumberAndIndex() thro response = getJsonRpc(jsonRpcNode, requestBody); responseContent = HttpMethed.parseResponseContent(response); result = responseContent.getJSONObject("result"); - logger.info("13 result" + result); + logger.info("16 result" + result); Map jsonrpcResult = new HashMap(); for (Map.Entry entry : result.entrySet()) { jsonrpcResult.put(entry.getKey(), entry.getValue()); @@ -358,7 +431,7 @@ public void test13JsonRpcApiTestForEthGetTransactionByBlockNumberAndIndex() thro List responseContent1 = HttpMethed.parseResponseContentArray(response); logger.info("responseContent1:" + responseContent1); blockTimeStamp = responseContent1.get(0).getLong("blockTimeStamp"); - // long gas = 0; + for (int i = 0; i < responseContent1.size(); i++) { if (responseContent1.get(i).getString("id").equals(transactionIdList.get(0).substring(2))) { gas = responseContent1.get(i).getJSONObject("receipt").getLong("energy_usage_total"); @@ -396,7 +469,7 @@ public void test13JsonRpcApiTestForEthGetTransactionByBlockNumberAndIndex() thro .getJSONObject("value") .getString("contract_address") .substring(2)); - // Assert.assertEquals(jsonrpcResult.get("gasPrice").toString(),realGasPrice); + Assert.assertEquals(jsonrpcResult.get("value").toString(), "0x1389"); String data; if (getBlockByNumResult.getJSONObject("raw_data").getString("data") == null) { @@ -421,7 +494,7 @@ public void test13JsonRpcApiTestForEthGetTransactionByBlockNumberAndIndex() thro } @Test(enabled = true, description = "Json rpc api of eth_getBlockTransactionCountByHash") - public void test14JsonRpcApiTestForEthGetBlockTransactionCountByHash() throws Exception { + public void test17JsonRpcApiTestForEthGetBlockTransactionCountByHash() throws Exception { logger.info("blockNum:" + blockNum); JsonArray params = new JsonArray(); params.add(blockHash); @@ -443,7 +516,7 @@ public void test14JsonRpcApiTestForEthGetBlockTransactionCountByHash() throws Ex } @Test(enabled = true, description = "Json rpc api of eth_getBlockTransactionCountByNumber") - public void test15JsonRpcApiTestForEthGetBlockTransactionCountByNum() throws Exception { + public void test18JsonRpcApiTestForEthGetBlockTransactionCountByNum() throws Exception { JsonArray params = new JsonArray(); params.add(blockNum); logger.info(String.valueOf(blockNum)); @@ -465,7 +538,7 @@ public void test15JsonRpcApiTestForEthGetBlockTransactionCountByNum() throws Exc } @Test(enabled = true, description = "Json rpc api of eth_getTransactionByBlockHashAndIndex") - public void test16JsonRpcApiTestForEthGetTransactionByBlockHashAndIndex() throws Exception { + public void test19JsonRpcApiTestForEthGetTransactionByBlockHashAndIndex() throws Exception { JsonArray params = new JsonArray(); params.add("0x" + bid); params.add(indexHex); @@ -478,7 +551,7 @@ public void test16JsonRpcApiTestForEthGetTransactionByBlockHashAndIndex() throws } @Test(enabled = true, description = "Json rpc api of eth_getTransactionByHash") - public void test17JsonRpcApiTestForEthGetTransactionByHash() throws Exception { + public void test20JsonRpcApiTestForEthGetTransactionByHash() throws Exception { JsonArray params = new JsonArray(); params.add(transacionHash); JsonObject requestBody = getJsonRpcBody("eth_getTransactionByHash", params); @@ -489,7 +562,7 @@ public void test17JsonRpcApiTestForEthGetTransactionByHash() throws Exception { } @Test(enabled = true, description = "Json rpc api of eth_getTransactionReceipt") - public void test18JsonRpcApiTestForEthGetTransactionReceipt() throws Exception { + public void test21JsonRpcApiTestForEthGetTransactionReceipt() throws Exception { JsonArray params = new JsonArray(); Thread.sleep(6000); params.add(trc20Txid); @@ -605,7 +678,7 @@ public void test18JsonRpcApiTestForEthGetTransactionReceipt() throws Exception { } @Test(enabled = true, description = "Json rpc api of eth_getUncleByBlockHashAndIndex") - public void test19JsonRpcApiTestForEthGetUncleByBlockHashAndIndex() throws Exception { + public void test22JsonRpcApiTestForEthGetUncleByBlockHashAndIndex() throws Exception { JsonArray params = new JsonArray(); params.add("0x0000000000f9cc56243898cbe88685678855e07f51c5af91322c225ce3693868"); params.add("0x"); @@ -618,7 +691,7 @@ public void test19JsonRpcApiTestForEthGetUncleByBlockHashAndIndex() throws Excep } @Test(enabled = true, description = "Json rpc api of eth_getUncleByBlockNumberAndIndex") - public void test20JsonRpcApiTestForEthGetUncleByBlockNumberAndIndex() throws Exception { + public void test23JsonRpcApiTestForEthGetUncleByBlockNumberAndIndex() throws Exception { JsonArray params = new JsonArray(); params.add("0xeb82f0"); params.add("0x"); @@ -631,7 +704,7 @@ public void test20JsonRpcApiTestForEthGetUncleByBlockNumberAndIndex() throws Exc } @Test(enabled = true, description = "Json rpc api of eth_getUncleCountByBlockHash") - public void test21JsonRpcApiTestForEthGetUncleCountByBlockHash() throws Exception { + public void test24JsonRpcApiTestForEthGetUncleCountByBlockHash() throws Exception { JsonArray params = new JsonArray(); params.add("0x0000000000f9cc56243898cbe88685678855e07f51c5af91322c225ce3693868"); JsonObject requestBody = getJsonRpcBody("eth_getUncleCountByBlockHash", params); @@ -643,7 +716,7 @@ public void test21JsonRpcApiTestForEthGetUncleCountByBlockHash() throws Exceptio } @Test(enabled = true, description = "Json rpc api of eth_getUncleCountByBlockNumber") - public void test22JsonRpcApiTestForEthGetUncleCountByBlockNumber() throws Exception { + public void test25JsonRpcApiTestForEthGetUncleCountByBlockNumber() throws Exception { JsonArray params = new JsonArray(); params.add("eth_getUncleCountByBlockNumber"); JsonObject requestBody = getJsonRpcBody("eth_getUncleCountByBlockNumber", params); @@ -655,7 +728,7 @@ public void test22JsonRpcApiTestForEthGetUncleCountByBlockNumber() throws Except } @Test(enabled = true, description = "Json rpc api of eth_getWork") - public void test23JsonRpcApiTestForEthGetWork() throws Exception { + public void test26JsonRpcApiTestForEthGetWork() throws Exception { JsonArray params = new JsonArray(); JsonObject requestBody = getJsonRpcBody("eth_getWork", params); response = getJsonRpc(jsonRpcNode, requestBody); @@ -672,7 +745,7 @@ public void test23JsonRpcApiTestForEthGetWork() throws Exception { } @Test(enabled = true, description = "Json rpc api of eth_hashrate") - public void test24JsonRpcApiTestForEthHashRate() throws Exception { + public void test27JsonRpcApiTestForEthHashRate() throws Exception { JsonArray params = new JsonArray(); JsonObject requestBody = getJsonRpcBody("eth_hashrate", params); response = getJsonRpc(jsonRpcNode, requestBody); @@ -683,7 +756,7 @@ public void test24JsonRpcApiTestForEthHashRate() throws Exception { } @Test(enabled = true, description = "Json rpc api of eth_mining") - public void test25JsonRpcApiTestForEthMining() throws Exception { + public void test28JsonRpcApiTestForEthMining() throws Exception { JsonArray params = new JsonArray(); JsonObject requestBody = getJsonRpcBody("eth_mining", params); response = getJsonRpc(jsonRpcNode, requestBody); @@ -694,7 +767,7 @@ public void test25JsonRpcApiTestForEthMining() throws Exception { } @Test(enabled = true, description = "Json rpc api of eth_protocolVersion") - public void test26JsonRpcApiTestForEthProtocolVersion() throws Exception { + public void test29JsonRpcApiTestForEthProtocolVersion() throws Exception { JsonArray params = new JsonArray(); JsonObject requestBody = getJsonRpcBody("eth_protocolVersion", params); response = getJsonRpc(jsonRpcNode, requestBody); @@ -711,20 +784,29 @@ public void test26JsonRpcApiTestForEthProtocolVersion() throws Exception { } @Test(enabled = true, description = "Json rpc api of eth_syncing") - public void test27JsonRpcApiTestForEthSyncing() throws Exception { + public void test30JsonRpcApiTestForEthSyncing() throws Exception { JsonArray params = new JsonArray(); JsonObject requestBody = getJsonRpcBody("eth_syncing", params); response = getJsonRpc(jsonRpcNode, requestBody); responseContent = HttpMethed.parseResponseContent(response); JSONObject temp = responseContent.getJSONObject("result"); + String currentNumFromRpc = temp.getString("currentBlock"); + logger.info(currentNumFromRpc); logger.info(temp.toString()); + response = HttpMethed.getNowBlock(httpFullNode); + responseContent = HttpMethed.parseResponseContent(response); + long currentNum = + responseContent.getJSONObject("block_header").getJSONObject("raw_data").getLong("number"); + logger.info("currentNum:" + currentNum); + logger.info("currentNumFromRpc:" + Long.parseLong(currentNumFromRpc.substring(2), 16)); + Assert.assertEquals(currentNum, Long.parseLong(currentNumFromRpc.substring(2), 16)); Assert.assertTrue(temp.containsKey("startingBlock")); Assert.assertTrue(temp.containsKey("currentBlock")); Assert.assertTrue(temp.containsKey("highestBlock")); } @Test(enabled = true, description = "Json rpc api of net_listening") - public void test28JsonRpcApiTestForNetListening() throws Exception { + public void test31JsonRpcApiTestForNetListening() throws Exception { JsonArray params = new JsonArray(); JsonObject requestBody = getJsonRpcBody("net_listening", params); response = getJsonRpc(jsonRpcNode, requestBody); @@ -742,7 +824,7 @@ public void test28JsonRpcApiTestForNetListening() throws Exception { } @Test(enabled = true, description = "Json rpc api of net_peerCount") - public void test29JsonRpcApiTestForNetPeerCount() throws Exception { + public void test32JsonRpcApiTestForNetPeerCount() throws Exception { JsonArray params = new JsonArray(); JsonObject requestBody = getJsonRpcBody("net_peerCount", params); response = getJsonRpc(jsonRpcNode, requestBody); @@ -753,7 +835,7 @@ public void test29JsonRpcApiTestForNetPeerCount() throws Exception { } @Test(enabled = true, description = "Json rpc api of net_version") - public void test30JsonRpcApiTestForEthVersion() throws Exception { + public void test33JsonRpcApiTestForEthVersion() throws Exception { JsonArray params = new JsonArray(); JsonObject requestBody = getJsonRpcBody("net_version", params); response = getJsonRpc(jsonRpcNode, requestBody); @@ -768,7 +850,7 @@ public void test30JsonRpcApiTestForEthVersion() throws Exception { } @Test(enabled = true, description = "Json rpc api of web3_clientVersion") - public void test31JsonRpcApiTestForWeb3ClientVersion() throws Exception { + public void test34JsonRpcApiTestForWeb3ClientVersion() throws Exception { JsonArray params = new JsonArray(); JsonObject requestBody = getJsonRpcBody("web3_clientVersion", params); response = getJsonRpc(jsonRpcNode, requestBody); @@ -787,7 +869,7 @@ public void test31JsonRpcApiTestForWeb3ClientVersion() throws Exception { } @Test(enabled = true, description = "Json rpc api of web3_sha3") - public void test32JsonRpcApiTestForWeb3Sha3() throws Exception { + public void test35JsonRpcApiTestForWeb3Sha3() throws Exception { JsonArray params = new JsonArray(); params.add("0x08"); JsonObject requestBody1 = getJsonRpcBody("web3_sha3", params); @@ -802,7 +884,7 @@ public void test32JsonRpcApiTestForWeb3Sha3() throws Exception { } @Test(enabled = true, description = "Json rpc api of eth_compileLLL") - public void test33JsonRpcApiTestForEthCompileLll() throws Exception { + public void test36JsonRpcApiTestForEthCompileLll() throws Exception { JsonArray params = new JsonArray(); params.add("(returnlll (suicide (caller)))"); JsonObject requestBody1 = getJsonRpcBody("eth_compileLLL", params); @@ -813,7 +895,7 @@ public void test33JsonRpcApiTestForEthCompileLll() throws Exception { } @Test(enabled = true, description = "Json rpc api of eth_compileSerpent") - public void test34JsonRpcApiTestForEthCompileSerpent() throws Exception { + public void test37JsonRpcApiTestForEthCompileSerpent() throws Exception { JsonArray params = new JsonArray(); params.add("/* some serpent */"); JsonObject requestBody = getJsonRpcBody("eth_compileSerpent", params); @@ -825,7 +907,7 @@ public void test34JsonRpcApiTestForEthCompileSerpent() throws Exception { } @Test(enabled = true, description = "Json rpc api of eth_compileSolidity") - public void test35JsonRpcApiTestForEthCompileSolidity() throws Exception { + public void test38JsonRpcApiTestForEthCompileSolidity() throws Exception { JsonArray params = new JsonArray(); params.add("contract test { function multiply(uint a) returns(uint d) { return a * 7; } }"); JsonObject requestBody = getJsonRpcBody("eth_compileSolidity", params); @@ -837,7 +919,7 @@ public void test35JsonRpcApiTestForEthCompileSolidity() throws Exception { } @Test(enabled = true, description = "Json rpc api of eth_getCompilers") - public void test36JsonRpcApiTestForEthCompileSolidity() throws Exception { + public void test39JsonRpcApiTestForEthCompileSolidity() throws Exception { JsonArray params = new JsonArray(); JsonObject requestBody = getJsonRpcBody("eth_getCompilers", params); response = getJsonRpc(jsonRpcNode, requestBody); @@ -848,7 +930,7 @@ public void test36JsonRpcApiTestForEthCompileSolidity() throws Exception { } @Test(enabled = true, description = "Json rpc api of eth_getTransactionCount") - public void test37JsonRpcApiTestForEthGetTransactionCount() throws Exception { + public void test40JsonRpcApiTestForEthGetTransactionCount() throws Exception { JsonArray params = new JsonArray(); params.add("0x407d73d8a49eeb85d32cf465507dd71d507100c1"); params.add("latest"); @@ -861,7 +943,7 @@ public void test37JsonRpcApiTestForEthGetTransactionCount() throws Exception { } @Test(enabled = true, description = "Json rpc api of eth_sendRawTransaction") - public void test38JsonRpcApiTestForEthSendRawTransaction() throws Exception { + public void test41JsonRpcApiTestForEthSendRawTransaction() throws Exception { JsonArray params = new JsonArray(); params.add("0x234"); JsonObject requestBody = getJsonRpcBody("eth_sendRawTransaction", params); @@ -873,7 +955,7 @@ public void test38JsonRpcApiTestForEthSendRawTransaction() throws Exception { } @Test(enabled = true, description = "Json rpc api of eth_sendTransaction") - public void test39JsonRpcApiTestForEthSendTransaction() throws Exception { + public void test42JsonRpcApiTestForEthSendTransaction() throws Exception { JsonArray params = new JsonArray(); JsonObject temp = new JsonObject(); params.add(temp); @@ -895,7 +977,7 @@ public void test39JsonRpcApiTestForEthSendTransaction() throws Exception { } @Test(enabled = true, description = "Json rpc api of eth_sign") - public void test40JsonRpcApiTestForEthSign() throws Exception { + public void test43JsonRpcApiTestForEthSign() throws Exception { JsonArray params = new JsonArray(); params.add("0x9b2055d370f73ec7d8a03e965129118dc8f5bf83"); params.add("0xdeadbeaf"); @@ -907,7 +989,7 @@ public void test40JsonRpcApiTestForEthSign() throws Exception { } @Test(enabled = true, description = "Json rpc api of eth_signTransaction") - public void test41JsonRpcApiTestForEthSignTransaction() throws Exception { + public void test44JsonRpcApiTestForEthSignTransaction() throws Exception { JsonArray params = new JsonArray(); JsonObject temp = new JsonObject(); params.add(temp); @@ -929,7 +1011,7 @@ public void test41JsonRpcApiTestForEthSignTransaction() throws Exception { } @Test(enabled = true, description = "Json rpc api of eth_submitWork") - public void test42JsonRpcApiTestForEthSubmitWork() throws Exception { + public void test45JsonRpcApiTestForEthSubmitWork() throws Exception { JsonArray params = new JsonArray(); params.add("0x0000000000000001"); params.add("0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"); @@ -942,7 +1024,7 @@ public void test42JsonRpcApiTestForEthSubmitWork() throws Exception { } @Test(enabled = true, description = "Json rpc api of parity_nextNonce") - public void test43JsonRpcApiTestForParityNextNonce() throws Exception { + public void test46JsonRpcApiTestForParityNextNonce() throws Exception { JsonArray params = new JsonArray(); params.add("0x9b2055d370f73ec7d8a03e965129118dc8f5bf83"); JsonObject requestBody = getJsonRpcBody("parity_nextNonce", params); @@ -954,7 +1036,7 @@ public void test43JsonRpcApiTestForParityNextNonce() throws Exception { } @Test(enabled = true, description = "Json rpc api of eth_submitHashrate") - public void test44JsonRpcApiTestForEthSubmitHashrate() throws Exception { + public void test47JsonRpcApiTestForEthSubmitHashrate() throws Exception { JsonArray params = new JsonArray(); params.add("0x0000000000000000000000000000000000000000000000000000000000500000"); params.add("0x59daa26581d0acd1fce254fb7e85952f4c09d0915afd33d3886cd914bc7d283c"); @@ -967,7 +1049,7 @@ public void test44JsonRpcApiTestForEthSubmitHashrate() throws Exception { } @Test(enabled = true, description = "Json rpc api of eth_getBlockByHash params is false") - public void test45JsonRpcApiTestForEthGetBlockByHash() throws Exception { + public void test48JsonRpcApiTestForEthGetBlockByHash() throws Exception { response = HttpMethed.getBlockByNum(httpFullNode, blockNum); responseContent = HttpMethed.parseResponseContent(response); logger.info("45getBlockByNumFromHttp:" + responseContent); @@ -976,6 +1058,9 @@ public void test45JsonRpcApiTestForEthGetBlockByHash() throws Exception { .getJSONObject("block_header") .getJSONObject("raw_data") .getString("accountStateRoot"); + if (accountStateRoot == null) { + accountStateRoot = ""; + } JsonArray params = new JsonArray(); params.add(blockHash); params.add(false); @@ -1009,7 +1094,8 @@ public void test45JsonRpcApiTestForEthGetBlockByHash() throws Exception { Assert.assertEquals(getBlockByHashResult.getString("hash"), "0x" + bid); Assert.assertEquals(getBlockByHashResult.getString("parentHash"), "0x" + parentHash); Assert.assertEquals(getBlockByHashResult.getString("transactionsRoot"), "0x" + txTrieRoot); - Assert.assertEquals(getBlockByHashResult.getString("miner"), "0x" + witnessAddress); + Assert.assertEquals( + getBlockByHashResult.getString("miner"), "0x" + witnessAddress.substring(2)); Assert.assertEquals(getBlockByHashResult.getString("gasUsed"), "0x" + Long.toHexString(gas)); Assert.assertEquals( String.valueOf(Long.parseLong(getBlockByHashResult.getString("gasLimit").substring(2), 16)), @@ -1042,7 +1128,7 @@ public void test45JsonRpcApiTestForEthGetBlockByHash() throws Exception { } @Test(enabled = true, description = "Json rpc api of eth_getBlockByNumber params is true") - public void test46JsonRpcApiTestForEthGetBlockByNumber() throws Exception { + public void test49JsonRpcApiTestForEthGetBlockByNumber() throws Exception { JsonArray params = new JsonArray(); params.add(blockNumHex); @@ -1078,7 +1164,8 @@ public void test46JsonRpcApiTestForEthGetBlockByNumber() throws Exception { Assert.assertEquals(getBlockByNumberResult.getString("hash"), "0x" + bid); Assert.assertEquals(getBlockByNumberResult.getString("parentHash"), "0x" + parentHash); Assert.assertEquals(getBlockByNumberResult.getString("transactionsRoot"), "0x" + txTrieRoot); - Assert.assertEquals(getBlockByNumberResult.getString("miner"), "0x" + witnessAddress); + Assert.assertEquals( + getBlockByNumberResult.getString("miner"), "0x" + witnessAddress.substring(2)); Assert.assertEquals(getBlockByNumberResult.getString("gasUsed"), "0x" + Long.toHexString(gas)); Assert.assertEquals( String.valueOf( diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts002.java b/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts002.java new file mode 100644 index 00000000000..733fe939e7d --- /dev/null +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts002.java @@ -0,0 +1,1245 @@ +package stest.tron.wallet.dailybuild.jsonrpc; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import io.grpc.ManagedChannelBuilder; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import lombok.extern.slf4j.Slf4j; +import org.apache.http.HttpResponse; +import org.junit.Assert; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; +import org.tron.api.GrpcAPI; +import org.tron.api.WalletGrpc; +import org.tron.common.utils.ByteArray; +import org.tron.protos.Protocol.Block; +import stest.tron.wallet.common.client.utils.HttpMethed; +import stest.tron.wallet.common.client.utils.JsonRpcBase; +import stest.tron.wallet.common.client.utils.PublicMethed; + +@Slf4j +public class Accounts002 extends JsonRpcBase { + private JSONObject responseContent; + private HttpResponse response; + String realGasPrice; + String bid = null; + int indexNum = 0; + String indexHex = null; + JSONObject result = null; + String transacionHash = null; + String blockHash = null; + String blockNumHex = null; + String parentHash = null; + String txTrieRoot = null; + String witnessAddress = null; + String feeLimit = null; + String accountStateRoot = null; + String energyUsed = "0x135c6"; + + List transactionIdList = null; + long size = 0; + long gas = 0; + long blockTimeStamp = 0; + long gasPriceFromHttp = 0; + + /** constructor. */ + @BeforeClass(enabled = true) + public void beforeClass() { + channelFull = ManagedChannelBuilder.forTarget(fullnode).usePlaintext(true).build(); + blockingStubFull = WalletGrpc.newBlockingStub(channelFull); + } + + @Test(enabled = true, description = "Json rpc api of eth_accounts") + public void test01JsonRpcApiTestForEthAccounts() throws Exception { + JsonArray params = new JsonArray(); + JsonObject requestBody = getJsonRpcBody("eth_accounts", params); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + List result = new ArrayList(); + logger.info(String.valueOf(result)); + Assert.assertEquals(responseContent.get("result"), result); + } + + @Test(enabled = true, description = "Json rpc api of eth_blockNumber") + public void test02JsonRpcApiTestForEthBlockNumber() throws Exception { + JsonArray params = new JsonArray(); + JsonObject requestBody = getJsonRpcBody("eth_blockNumber", params); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + responseContent.get("result"); + String blockNum = responseContent.getString("result").substring(2); + long blockNumFromjsonRpcNodeForSolidity = Long.parseLong(blockNum, 16); + response = HttpMethed.getNowBlockFromSolidity(httpsolidityNode); + responseContent = HttpMethed.parseResponseContent(response); + long blockNumFromHttp = + responseContent.getJSONObject("block_header").getJSONObject("raw_data").getLong("number"); + logger.info("blocknumFromjsonRpcNodeForSolidity:" + blockNumFromjsonRpcNodeForSolidity); + logger.info("blocknumFromHttp:" + blockNumFromHttp); + Assert.assertTrue(Math.abs(blockNumFromjsonRpcNodeForSolidity - blockNumFromHttp) <= 3); + } + + @Test(enabled = true, description = "Json rpc api of eth_call") + public void test03JsonRpcApiTestForEthCall() throws Exception { + JsonObject param = new JsonObject(); + HttpMethed.waitToProduceOneBlock(httpFullNode); + param.addProperty("from", ByteArray.toHexString(jsonRpcOwnerAddress)); + param.addProperty("to", trc20AddressHex); + param.addProperty("gas", "0x0"); + param.addProperty("gasPrice", "0x0"); + param.addProperty("value", "0x0"); + param.addProperty("data", "0x06fdde03"); + JsonArray params = new JsonArray(); + params.add(param); + params.add("latest"); + JsonObject requestBody = getJsonRpcBody("eth_call", params); + logger.info("03params:" + params); + logger.info("requestBody:" + requestBody); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String dataResult = responseContent.getString("result"); + Assert.assertEquals( + "0x000000000000000000000000000000000000000000000000000" + + "00000000000200000000000000000000000000000000000000000" + + "00000000000000000000000a546f6b656e5452433230000000000" + + "00000000000000000000000000000000000", + dataResult); + } + + @Test(enabled = true, description = "Json rpc api of eth_chainId") + public void test04JsonRpcApiTestForEthChainId() throws Exception { + JsonArray params = new JsonArray(); + JsonObject requestBody = getJsonRpcBody("eth_chainId", params); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + responseContent.get("result"); + String blockIdFromjsonRpcNodeForSolidity = + responseContent.get("result").toString().substring(2); + response = HttpMethed.getBlockByNumFromSolidity(httpsolidityNode, 0); + responseContent = HttpMethed.parseResponseContent(response); + String blockIdFromHttp = responseContent.getString("blockID").substring(56); + logger.info("blockIdFromjsonRpcNodeForSolidity:" + blockIdFromjsonRpcNodeForSolidity); + logger.info("blockIdFromHttp:" + blockIdFromHttp); + Assert.assertEquals(blockIdFromjsonRpcNodeForSolidity, blockIdFromHttp); + } + + @Test(enabled = true, description = "Json rpc api of eth_coinbase") + public void test05JsonRpcApiTestForEthCoinbase() throws Exception { + JsonArray params = new JsonArray(); + JsonObject requestBody = getJsonRpcBody("eth_coinbase", params); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + + Assert.assertEquals( + "0x410be88a918d74d0dfd71dc84bd4abf036d0562991", responseContent.getString("result")); + } + + @Test(enabled = true, description = "Json rpc api of eth_estimateGas") + public void test06JsonRpcApiTestForEthEstimateGas() throws Exception { + JsonObject param = new JsonObject(); + param.addProperty("from", ByteArray.toHexString(jsonRpcOwnerAddress)); + param.addProperty("to", trc20AddressHex); + param.addProperty("gas", "0x0"); + param.addProperty("gasPrice", "0x0"); + param.addProperty("value", "0x0"); + param.addProperty("data", "0x1249c58b"); + JsonArray params = new JsonArray(); + params.add(param); + JsonObject requestBody = getJsonRpcBody("eth_estimateGas", params); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + logger.info("test06requestBody:" + requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String dataResult = responseContent.getString("result"); + Assert.assertEquals("0x147", dataResult); + } + + @Test(enabled = true, description = "Json rpc api of eth_estimateGasHasPayable") + public void test07JsonRpcApiTestForEthEstimateGasHasPayable() throws Exception { + response = HttpMethed.getTransactionInfoByIdFromSolidity(httpsolidityNode, txid); + responseContent = HttpMethed.parseResponseContent(response); + Long realEnergyUsed = responseContent.getJSONObject("receipt").getLong("energy_usage_total"); + logger.info("realEnergyUsed:" + realEnergyUsed); + JsonObject param = new JsonObject(); + param.addProperty("from", "0x" + ByteArray.toHexString(jsonRpcOwnerAddress).substring(2)); + param.addProperty("to", "0x" + contractAddressFrom58); + param.addProperty("gas", "0x0"); + param.addProperty("gasPrice", "0x0"); + param.addProperty("value", "0x1389"); + param.addProperty("data", data); + JsonArray params = new JsonArray(); + params.add(param); + JsonObject requestBody = getJsonRpcBody("eth_estimateGas", params); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + logger.info("test07requestBody:" + requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String dataResult = responseContent.getString("result"); + Assert.assertEquals((long) realEnergyUsed, Long.parseLong(dataResult.substring(2), 16)); + } + + @Test(enabled = true, description = "Json rpc api of eth_estimateGasWithoutTo") + public void test08JsonRpcApiTestForEthEstimateGasWithoutTo() throws Exception { + JsonObject param = new JsonObject(); + param.addProperty("from", "0x6C0214C9995C6F3A61AB23F0EB84B0CDE7FD9C7C"); + param.addProperty("gas", "0x0"); + param.addProperty("gasPrice", "0x0"); + param.addProperty("value", "0x0"); + param.addProperty( + "data", + "0x6080604052d3600055d2600155346002556101418061001f6000396000f30060806040" + + "52600436106100565763ffffffff7c010000000000000000000000000000000000000000" + + "000000000000000060003504166305c24200811461005b5780633be9ece7146100815780" + + "6371dc08ce146100aa575b600080fd5b6100636100b2565b6040805193845260208401929" + + "0925282820152519081900360600190f35b6100a873ffffffffffffffffffffffffffffff" + + "ffffffffff600435166024356044356100c0565b005b61006361010d565b60005460015460" + + "0254909192565b60405173ffffffffffffffffffffffffffffffffffffffff841690821561" + + "08fc029083908590600081818185878a8ad0945050505050158015610107573d6000803e3d" + + "6000fd5b50505050565bd3d2349091925600a165627a7a72305820a2fb39541e90eda9a2f5" + + "f9e7905ef98e66e60dd4b38e00b05de418da3154e757002900000000000000000000000000" + + "00000000000000000000000000000090fa17bb"); + JsonArray params = new JsonArray(); + params.add(param); + JsonObject requestBody = getJsonRpcBody("eth_estimateGas", params); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + logger.info("test08requestBody:" + requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String dataResult = responseContent.getString("result"); + logger.info("dataResult:" + dataResult); + Assert.assertEquals(energyUsed, dataResult); + } + + @Test(enabled = true, description = "Json rpc api of eth_estimateGasSendTrx") + public void test09JsonRpcApiTestForEthEstimateGasSendTrx() throws Exception { + JsonObject param = new JsonObject(); + param.addProperty("from", ByteArray.toHexString(jsonRpcOwnerAddress)); + param.addProperty("to", "0xC1A74CD01732542093F5A87910A398AD70F04BD7"); + param.addProperty("gas", "0x0"); + param.addProperty("gasPrice", "0x0"); + param.addProperty("value", "0x1"); + param.addProperty("data", "0x0"); + JsonArray params = new JsonArray(); + params.add(param); + JsonObject requestBody = getJsonRpcBody("eth_estimateGas", params); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + logger.info("test09requestBody:" + requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String dataResult = responseContent.getString("result"); + Assert.assertEquals("0x0", dataResult); + } + + @Test(enabled = true, description = "Json rpc api of eth_gasPrice") + public void test10JsonRpcApiTestForEthGasPrice() throws Exception { + JsonArray params = new JsonArray(); + JsonObject requestBody = getJsonRpcBody("eth_gasPrice", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + responseContent.get("result"); + String gasPrice = responseContent.get("result").toString().substring(2); + long gasPriceFromJsonrpc = Long.parseLong(gasPrice, 16); + logger.info(String.valueOf(gasPriceFromJsonrpc)); + response = HttpMethed.getChainParameters(httpFullNode); + responseContent = HttpMethed.parseResponseContent(response); + JSONArray temp; + temp = responseContent.getJSONArray("chainParameter"); + for (int i = 0; i < temp.size(); i++) { + if (temp.getJSONObject(i).get("key").equals("getEnergyFee")) { + gasPriceFromHttp = temp.getJSONObject(i).getLong("value"); + } + } + logger.info("gasPriceFromHttp:" + gasPriceFromHttp); + Assert.assertEquals(gasPriceFromJsonrpc, gasPriceFromHttp); + } + + @Test(enabled = true, description = "Json rpc api of eth_getBalance") + public void test11JsonRpcApiTestForEthGetBalance() throws Exception { + JsonArray params = new JsonArray(); + params.add("0x" + ByteArray.toHexString(foundationAccountAddress).substring(2)); + params.add("latest"); + JsonObject requestBody = getJsonRpcBody("eth_getBalance", params); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String balance = responseContent.getString("result").substring(2); + Long balance1 = Long.parseLong(balance, 16); + logger.info("balance1:" + balance1); + response = HttpMethed.getAccountFromSolidity(httpsolidityNode, foundationAccountAddress); + responseContent = HttpMethed.parseResponseContent(response); + Long balance2 = responseContent.getLong("balance"); + logger.info(balance1.toString()); + logger.info(balance2.toString()); + Assert.assertEquals(balance1, balance2); + } + + @Test(enabled = true, description = "Json rpc api of eth_getBlockTransactionCountByNumber") + public void test12JsonRpcApiTestForEthGetBlockTransactionCountByNum() throws Exception { + response = HttpMethed.getNowBlockFromSolidity(httpsolidityNode); + responseContent = HttpMethed.parseResponseContent(response); + JsonArray params = new JsonArray(); + params.add("earliest"); + JsonObject requestBody = getJsonRpcBody("eth_getBlockTransactionCountByNumber", params); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String transactionNum = responseContent.getString("result").substring(2); + int transactionNum1 = Integer.parseInt(transactionNum, 16); + logger.info(String.valueOf(transactionNum1)); + response = HttpMethed.getTransactionCountByBlocknumFromSolidity(httpsolidityNode, 0); + responseContent = HttpMethed.parseResponseContent(response); + int transactionNum2 = responseContent.getInteger("count"); + logger.info(String.valueOf(transactionNum2)); + Assert.assertEquals(transactionNum1, transactionNum2); + } + + @Test(enabled = true, description = "Json rpc api of eth_getCode") + public void test13JsonRpcApiTestForEthGetCode() throws Exception { + + JsonArray params = new JsonArray(); + params.add(contractAddressFrom58); + params.add("latest"); + JsonObject requestBody = getJsonRpcBody("eth_getCode", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String codeFromJsonRpc = responseContent.getString("result").substring(2); + logger.info(codeFromJsonRpc); + response = HttpMethed.getContractInfo(httpFullNode, contractAddressFrom58); + logger.info("13contractAddressFrom58:" + contractAddressFrom58); + responseContent = HttpMethed.parseResponseContent(response); + String codeFromHttp = responseContent.getString("runtimecode"); + logger.info(codeFromHttp); + Assert.assertEquals(codeFromJsonRpc, codeFromHttp); + } + + @Test(enabled = true, description = "Json rpc api of eth_getStorageAt") + public void test14JsonRpcApiTestForEthGetStorageAt01() throws Exception { + + JsonArray params = new JsonArray(); + params.add(contractAddressFrom58); + params.add("0x0"); + params.add("latest"); + JsonObject requestBody = getJsonRpcBody("eth_getStorageAt", params); + logger.info("requestBody:" + requestBody); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("14responseContent:" + responseContent); + String result = responseContent.getString("result").substring(2); + long resultExpect = Long.parseLong(result, 16); + logger.info("result:" + resultExpect); + Assert.assertEquals("1234", String.valueOf(resultExpect)); + } + + @Test(enabled = true, description = "Json rpc api of eth_getStorageAt") + public void test15JsonRpcApiTestForEthGetStorageAt02() throws Exception { + + String address = + "000000000000000000000000" + ByteArray.toHexString(jsonRpcOwnerAddress).substring(2); + String str = address + "0000000000000000000000000000000000000000000000000000000000000001"; + logger.info("str:" + str); + JsonArray paramsForSha3 = new JsonArray(); + paramsForSha3.add(str); + JsonObject requestBodyForSha3 = getJsonRpcBody("web3_sha3", paramsForSha3); + logger.info("requestBodyForSha3:" + requestBodyForSha3); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBodyForSha3); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("responseContent:" + responseContent); + String resultForSha3 = responseContent.getString("result"); + logger.info("resultForSha3:" + resultForSha3); + JsonArray params = new JsonArray(); + params.add(contractAddressFrom58); + params.add(resultForSha3); + params.add("latest"); + JsonObject requestBody = getJsonRpcBody("eth_getStorageAt", params); + logger.info("requestBody:" + requestBody); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("15responseContent:" + responseContent); + String result = responseContent.getString("result").substring(2); + logger.info("15result:" + result); + logger.info("mapResult:" + Integer.parseInt(result, 16)); + Assert.assertEquals("5678", String.valueOf(Integer.parseInt(result, 16))); + } + + @Test(enabled = true, description = "Json rpc api of eth_getTransactionByBlockNumberAndIndex") + public void test16JsonRpcApiTestForEthGetTransactionByBlockNumberAndIndex() throws Exception { + logger.info("16blockNum:" + blockNum); + blockNumHex = "0x" + Integer.toHexString(blockNum); + logger.info("blockNumHex:" + blockNumHex); + JsonArray params = new JsonArray(); + params.add(blockNumHex); + indexNum = 0; + response = HttpMethed.getBlockByNumFromSolidity(httpsolidityNode, blockNum); + responseContent = HttpMethed.parseResponseContent(response); + parentHash = + responseContent + .getJSONObject("block_header") + .getJSONObject("raw_data") + .getString("parentHash"); + txTrieRoot = + responseContent + .getJSONObject("block_header") + .getJSONObject("raw_data") + .getString("txTrieRoot"); + witnessAddress = + responseContent + .getJSONObject("block_header") + .getJSONObject("raw_data") + .getString("witness_address"); + feeLimit = + responseContent + .getJSONArray("transactions") + .getJSONObject(0) + .getJSONObject("raw_data") + .getString("fee_limit"); + logger.info(feeLimit); + + JSONObject getBlockByNumFromSolidityResult = null; + for (int i = 0; i < responseContent.getJSONArray("transactions").size(); i++) { + if (txid.equals( + responseContent.getJSONArray("transactions").getJSONObject(i).getString("txID"))) { + indexNum = i; + getBlockByNumFromSolidityResult = + responseContent.getJSONArray("transactions").getJSONObject(i); + bid = responseContent.getString("blockID"); + break; + } + } + transactionIdList = new ArrayList<>(); + if (responseContent.getJSONArray("transactions").size() > 0) { + for (int i = 0; i < responseContent.getJSONArray("transactions").size(); i++) { + transactionIdList.add( + "0x" + responseContent.getJSONArray("transactions").getJSONObject(i).getString("txID")); + } + } + logger.info("16transactionIdList:" + transactionIdList); + logger.info(String.valueOf(indexNum)); + indexHex = "0x" + Integer.toHexString(indexNum); + logger.info("indexHex:" + indexHex); + params.add(indexHex); + JsonObject requestBody = getJsonRpcBody("eth_getTransactionByBlockNumberAndIndex", params); + logger.info("13requestBody:" + requestBody); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + result = responseContent.getJSONObject("result"); + logger.info("16 result" + result); + Map jsonrpcResult = new HashMap(); + for (Map.Entry entry : result.entrySet()) { + jsonrpcResult.put(entry.getKey(), entry.getValue()); + } + transacionHash = jsonrpcResult.get("hash").toString(); + logger.info("transactionHash:" + transacionHash); + blockHash = jsonrpcResult.get("blockHash").toString(); + logger.info("jsonrpcResult:" + jsonrpcResult); + response = HttpMethed.getTransactionInfoByBlocknumFromSolidity(httpsolidityNode, blockNum); + logger.info("response:" + response); + List responseContent1 = HttpMethed.parseResponseContentArray(response); + logger.info("responseContent1:" + responseContent1); + blockTimeStamp = responseContent1.get(0).getLong("blockTimeStamp"); + + for (int i = 0; i < responseContent1.size(); i++) { + if (responseContent1.get(i).getString("id").equals(transactionIdList.get(0).substring(2))) { + gas = responseContent1.get(i).getJSONObject("receipt").getLong("energy_usage_total"); + logger.info("gas:" + gas); + break; + } + } + + Assert.assertEquals(jsonrpcResult.get("gas").toString(), "0x" + Long.toHexString(gas)); + Assert.assertNull(jsonrpcResult.get("nonce")); + Assert.assertEquals( + jsonrpcResult.get("hash").toString(), + "0x" + getBlockByNumFromSolidityResult.getString("txID")); + Assert.assertEquals(jsonrpcResult.get("blockHash").toString(), "0x" + bid); + Assert.assertEquals(jsonrpcResult.get("blockNumber").toString(), blockNumHex); + Assert.assertEquals(jsonrpcResult.get("transactionIndex").toString(), indexHex); + Assert.assertEquals( + jsonrpcResult.get("from").toString(), + "0x" + + getBlockByNumFromSolidityResult + .getJSONObject("raw_data") + .getJSONArray("contract") + .getJSONObject(0) + .getJSONObject("parameter") + .getJSONObject("value") + .getString("owner_address") + .substring(2)); + Assert.assertEquals( + jsonrpcResult.get("to").toString(), + "0x" + + getBlockByNumFromSolidityResult + .getJSONObject("raw_data") + .getJSONArray("contract") + .getJSONObject(0) + .getJSONObject("parameter") + .getJSONObject("value") + .getString("contract_address") + .substring(2)); + + Assert.assertEquals(jsonrpcResult.get("value").toString(), "0x1389"); + String data; + if (getBlockByNumFromSolidityResult.getJSONObject("raw_data").getString("data") == null) { + data = "0x"; + } else { + data = + getBlockByNumFromSolidityResult.getJSONObject("raw_data").getString("data").substring(2); + } + Assert.assertEquals(jsonrpcResult.get("input").toString(), data); + + long temp = + Long.parseLong( + getBlockByNumFromSolidityResult.getString("signature").substring(130, 131), 16); + long v = + Long.parseLong( + getBlockByNumFromSolidityResult.getString("signature").substring(130, 132), 16); + if (temp < 27) { + v += 27; + } + Assert.assertEquals(Long.parseLong(jsonrpcResult.get("v").toString().substring(2), 16), v); + Assert.assertEquals( + jsonrpcResult.get("r").toString().substring(2), + getBlockByNumFromSolidityResult.getString("signature").substring(2, 66)); + Assert.assertEquals( + jsonrpcResult.get("s").toString().substring(2), + getBlockByNumFromSolidityResult.getString("signature").substring(66, 130)); + } + + @Test(enabled = true, description = "Json rpc api of eth_getBlockTransactionCountByHash") + public void test17JsonRpcApiTestForEthGetBlockTransactionCountByHash() throws Exception { + logger.info("blockNum:" + blockNum); + JsonArray params = new JsonArray(); + params.add(blockHash); + logger.info("blockHash:" + blockHash); + JsonObject requestBody = getJsonRpcBody("eth_getBlockTransactionCountByHash", params); + logger.info("requestBody:" + requestBody); + HttpMethed.waitToProduceOneBlock(httpFullNode); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("responseContent:" + responseContent); + String transactionNum = responseContent.getString("result").substring(2); + int transactionNumFromjsonRpcNodeForSolidity = Integer.parseInt(transactionNum, 16); + logger.info( + "transactionNumFromjsonRpcNodeForSolidity:" + transactionNumFromjsonRpcNodeForSolidity); + response = HttpMethed.getTransactionCountByBlocknumFromSolidity(httpsolidityNode, blockNum); + responseContent = HttpMethed.parseResponseContent(response); + int transactionNumFromHttp = responseContent.getInteger("count"); + logger.info("transactionNumFromHttp:" + transactionNumFromHttp); + Assert.assertEquals(transactionNumFromHttp, transactionNumFromjsonRpcNodeForSolidity); + } + + @Test(enabled = true, description = "Json rpc api of eth_getBlockTransactionCountByNumber") + public void test18JsonRpcApiTestForEthGetBlockTransactionCountByNum() throws Exception { + JsonArray params = new JsonArray(); + params.add(blockNum); + logger.info(String.valueOf(blockNum)); + JsonObject requestBody = getJsonRpcBody("eth_getBlockTransactionCountByNumber", params); + logger.info("requestBody:" + requestBody); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + logger.info("response:" + response); + HttpMethed.waitToProduceOneBlock(httpFullNode); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("responseContent:" + responseContent); + String transactionNum = responseContent.getString("result").substring(2); + int transactionNum1 = Integer.parseInt(transactionNum, 16); + logger.info(String.valueOf(transactionNum1)); + response = HttpMethed.getTransactionCountByBlocknumFromSolidity(httpsolidityNode, blockNum); + responseContent = HttpMethed.parseResponseContent(response); + int transactionNum2 = responseContent.getInteger("count"); + logger.info(String.valueOf(transactionNum2)); + Assert.assertEquals(transactionNum1, transactionNum2); + } + + @Test(enabled = true, description = "Json rpc api of eth_getTransactionByBlockHashAndIndex") + public void test19JsonRpcApiTestForEthGetTransactionByBlockHashAndIndex() throws Exception { + JsonArray params = new JsonArray(); + params.add("0x" + bid); + params.add(indexHex); + logger.info("indexHex:" + indexHex); + JsonObject requestBody = getJsonRpcBody("eth_getTransactionByBlockHashAndIndex", params); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + JSONObject resultForGetTransactionByBlockHashAndIndex = responseContent.getJSONObject("result"); + Assert.assertEquals(result, resultForGetTransactionByBlockHashAndIndex); + } + + @Test(enabled = true, description = "Json rpc api of eth_getTransactionByHash") + public void test20JsonRpcApiTestForEthGetTransactionByHash() throws Exception { + JsonArray params = new JsonArray(); + params.add(transacionHash); + JsonObject requestBody = getJsonRpcBody("eth_getTransactionByHash", params); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + JSONObject result1 = responseContent.getJSONObject("result"); + Assert.assertEquals(result, result1); + } + + @Test(enabled = true, description = "Json rpc api of eth_getTransactionReceipt") + public void test21JsonRpcApiTestForEthGetTransactionReceipt() throws Exception { + JsonArray params = new JsonArray(); + Thread.sleep(6000); + params.add(trc20Txid); + JsonObject requestBody = getJsonRpcBody("eth_getTransactionReceipt", params); + logger.info("requestBody:" + requestBody); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + logger.info("response:" + response); + responseContent = HttpMethed.parseResponseContent(response); + JSONObject resultFromTransactionReceipt = responseContent.getJSONObject("result"); + logger.info("resultFromTransactionReceipt:" + resultFromTransactionReceipt); + JSONArray logs = resultFromTransactionReceipt.getJSONArray("logs"); + logger.info("logs:" + logs); + logger.info("result:" + resultFromTransactionReceipt.toString()); + response = HttpMethed.getBlockByNumFromSolidity(httpsolidityNode, blockNumForTrc20); + responseContent = HttpMethed.parseResponseContent(response); + int index = 0; + for (int i = 0; i < responseContent.getJSONArray("transactions").size(); i++) { + if (trc20Txid.equals( + responseContent.getJSONArray("transactions").getJSONObject(i).getString("txID"))) { + index = i; + break; + } + } + + JsonArray paramsForTransactionByBlockNumberAndIndex = new JsonArray(); + paramsForTransactionByBlockNumberAndIndex.add("0x" + Integer.toHexString(blockNumForTrc20)); + paramsForTransactionByBlockNumberAndIndex.add("0x" + Integer.toHexString(index)); + JsonObject requestBody1 = + getJsonRpcBody( + "eth_getTransactionByBlockNumberAndIndex", paramsForTransactionByBlockNumberAndIndex); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody1); + logger.info("requestBody1:" + requestBody1); + responseContent = HttpMethed.parseResponseContent(response); + JSONObject resultFromTransactionByBlockNumberAndIndex = responseContent.getJSONObject("result"); + logger.info( + "resultFromTransactionByBlockNumberAndIndex:" + resultFromTransactionByBlockNumberAndIndex); + Assert.assertEquals( + resultFromTransactionReceipt.getString("blockHash"), + resultFromTransactionByBlockNumberAndIndex.getString("blockHash")); + Assert.assertEquals( + resultFromTransactionReceipt.getString("blockNumber"), + resultFromTransactionByBlockNumberAndIndex.getString("blockNumber")); + Assert.assertEquals( + resultFromTransactionReceipt.getString("transactionIndex"), + resultFromTransactionByBlockNumberAndIndex.getString("transactionIndex")); + Assert.assertEquals( + resultFromTransactionReceipt.getString("transactionHash"), "0x" + trc20Txid); + Assert.assertEquals( + resultFromTransactionReceipt.getString("from"), + resultFromTransactionByBlockNumberAndIndex.getString("from")); + Assert.assertEquals( + resultFromTransactionReceipt.getString("to"), + resultFromTransactionByBlockNumberAndIndex.getString("to")); + logger.info("effectiveGasPrice:" + resultFromTransactionReceipt.getString("effectiveGasPrice")); + logger.info("gasPriceFromHttp:" + Long.toHexString(gasPriceFromHttp)); + Assert.assertEquals( + resultFromTransactionReceipt.getString("effectiveGasPrice"), + "0x" + Long.toHexString(gasPriceFromHttp)); + /* Assert.assertEquals( + resultFromTransactionReceipt.getString("contractAddress").substring(2), + trc20AddressHex.substring(2));*/ + Assert.assertNull(resultFromTransactionReceipt.getString("contractAddress")); + Assert.assertEquals( + resultFromTransactionReceipt.getString("logsBloom"), + "0x000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000"); + Assert.assertEquals("0x1", resultFromTransactionReceipt.getString("status")); + Assert.assertEquals("0x0", resultFromTransactionReceipt.getString("type")); + logger.info("gas:" + resultFromTransactionByBlockNumberAndIndex.getString("gas")); + Assert.assertEquals( + resultFromTransactionReceipt.getString("gasUsed"), + resultFromTransactionByBlockNumberAndIndex.getString("gas")); + Assert.assertEquals( + resultFromTransactionReceipt.getString("cumulativeGasUsed"), + resultFromTransactionByBlockNumberAndIndex.getString("gas")); + Assert.assertEquals( + logs.getJSONObject(0).getString("logIndex"), "0x" + Integer.toHexString(index)); + Assert.assertEquals(logs.getJSONObject(0).getString("removed"), "false"); + Assert.assertEquals( + logs.getJSONObject(0).getString("blockHash"), + resultFromTransactionReceipt.getString("blockHash")); + Assert.assertEquals( + logs.getJSONObject(0).getString("blockNumber"), + resultFromTransactionReceipt.getString("blockNumber")); + Assert.assertEquals( + logs.getJSONObject(0).getString("transactionIndex"), + resultFromTransactionReceipt.getString("transactionIndex")); + Assert.assertEquals( + logs.getJSONObject(0).getString("transactionHash"), + resultFromTransactionReceipt.getString("transactionHash")); + Assert.assertEquals( + logs.getJSONObject(0).getString("address"), resultFromTransactionReceipt.getString("to")); + response = + HttpMethed.getTransactionInfoByBlocknumFromSolidity(httpsolidityNode, blockNumForTrc20); + List responseContent1 = HttpMethed.parseResponseContentArray(response); + logger.info("responseContent1:" + responseContent1); + + response = HttpMethed.getBlockByNumFromSolidity(httpsolidityNode, blockNumForTrc20); + responseContent = HttpMethed.parseResponseContent(response); + Assert.assertEquals( + logs.getJSONObject(0).getString("data").substring(2), + responseContent1.get(index).getJSONArray("log").getJSONObject(0).getString("data")); + + Assert.assertEquals( + logs.getJSONObject(0).getString("topics").replace("0x", ""), + responseContent1.get(index).getJSONArray("log").getJSONObject(0).getString("topics")); + } + + @Test(enabled = true, description = "Json rpc api of eth_getUncleByBlockHashAndIndex") + public void test22JsonRpcApiTestForEthGetUncleByBlockHashAndIndex() throws Exception { + JsonArray params = new JsonArray(); + params.add("0x0000000000f9cc56243898cbe88685678855e07f51c5af91322c225ce3693868"); + params.add("0x"); + JsonObject requestBody = getJsonRpcBody("eth_getUncleByBlockHashAndIndex", params); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String result = responseContent.getString("result"); + logger.info(result); + Assert.assertNull(result); + } + + @Test(enabled = true, description = "Json rpc api of eth_getUncleByBlockNumberAndIndex") + public void test23JsonRpcApiTestForEthGetUncleByBlockNumberAndIndex() throws Exception { + JsonArray params = new JsonArray(); + params.add("0xeb82f0"); + params.add("0x"); + JsonObject requestBody = getJsonRpcBody("eth_getUncleByBlockNumberAndIndex", params); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String result = responseContent.getString("result"); + logger.info(result); + Assert.assertNull(result); + } + + @Test(enabled = true, description = "Json rpc api of eth_getUncleCountByBlockHash") + public void test24JsonRpcApiTestForEthGetUncleCountByBlockHash() throws Exception { + JsonArray params = new JsonArray(); + params.add("0x0000000000f9cc56243898cbe88685678855e07f51c5af91322c225ce3693868"); + JsonObject requestBody = getJsonRpcBody("eth_getUncleCountByBlockHash", params); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String result = responseContent.getString("result"); + logger.info(result); + Assert.assertEquals(result, "0x0"); + } + + @Test(enabled = true, description = "Json rpc api of eth_getUncleCountByBlockNumber") + public void test25JsonRpcApiTestForEthGetUncleCountByBlockNumber() throws Exception { + JsonArray params = new JsonArray(); + params.add("eth_getUncleCountByBlockNumber"); + JsonObject requestBody = getJsonRpcBody("eth_getUncleCountByBlockNumber", params); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String result = responseContent.getString("result"); + logger.info(result); + Assert.assertEquals(result, "0x0"); + } + + @Test(enabled = false, description = "Json rpc api of eth_getWork") + public void test26JsonRpcApiTestForEthGetWork() throws Exception { + JsonArray params = new JsonArray(); + JsonObject requestBody = getJsonRpcBody("eth_getWork", params); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String result = responseContent.getString("result"); + int resultLen = result.length(); + String resultFromjsonRpcNodeForSolidity = result.substring(4, resultLen - 12); + response = HttpMethed.getNowBlockFromSolidity(httpsolidityNode); + responseContent = HttpMethed.parseResponseContent(response); + String resultFromHttp = responseContent.getString("blockID"); + logger.info("resultFromjsonRpcNodeForSolidity:" + resultFromjsonRpcNodeForSolidity); + logger.info("resultFromHttp:" + resultFromHttp); + Assert.assertEquals(resultFromjsonRpcNodeForSolidity, resultFromHttp); + } + + @Test(enabled = true, description = "Json rpc api of eth_hashrate") + public void test27JsonRpcApiTestForEthHashRate() throws Exception { + JsonArray params = new JsonArray(); + JsonObject requestBody = getJsonRpcBody("eth_hashrate", params); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String result = responseContent.getString("result"); + logger.info(result); + Assert.assertEquals("0x0", result); + } + + @Test(enabled = true, description = "Json rpc api of eth_mining") + public void test28JsonRpcApiTestForEthMining() throws Exception { + JsonArray params = new JsonArray(); + JsonObject requestBody = getJsonRpcBody("eth_mining", params); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String result = responseContent.getString("result"); + logger.info(result); + Assert.assertEquals(result, "true"); + } + + @Test(enabled = true, description = "Json rpc api of eth_protocolVersion") + public void test29JsonRpcApiTestForEthProtocolVersion() throws Exception { + JsonArray params = new JsonArray(); + JsonObject requestBody = getJsonRpcBody("eth_protocolVersion", params); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String protocolVersion = responseContent.getString("result").substring(2); + Long protocolVersion1 = Long.parseLong(protocolVersion, 16); + response = HttpMethed.getNowBlockFromSolidity(httpsolidityNode); + responseContent = HttpMethed.parseResponseContent(response); + Long protocolVersion2 = + responseContent.getJSONObject("block_header").getJSONObject("raw_data").getLong("version"); + logger.info(protocolVersion1.toString()); + logger.info(protocolVersion2.toString()); + Assert.assertEquals(protocolVersion1, protocolVersion2); + } + + @Test(enabled = false, description = "Json rpc api of eth_syncing") + public void test30JsonRpcApiTestForEthSyncing() throws Exception { + JsonArray params = new JsonArray(); + JsonObject requestBody = getJsonRpcBody("eth_syncing", params); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + JSONObject temp = responseContent.getJSONObject("result"); + String currentNumFromRpc = temp.getString("currentBlock"); + logger.info(currentNumFromRpc); + logger.info(temp.toString()); + response = HttpMethed.getNowBlockFromSolidity(httpsolidityNode); + responseContent = HttpMethed.parseResponseContent(response); + long currentNum = + responseContent.getJSONObject("block_header").getJSONObject("raw_data").getLong("number"); + logger.info("currentNum:" + currentNum); + logger.info("currentNumFromRpc:" + Long.parseLong(currentNumFromRpc.substring(2), 16)); + Assert.assertEquals(currentNum, Long.parseLong(currentNumFromRpc.substring(2), 16)); + Assert.assertTrue(temp.containsKey("startingBlock")); + Assert.assertTrue(temp.containsKey("currentBlock")); + Assert.assertTrue(temp.containsKey("highestBlock")); + } + + @Test(enabled = false, description = "Json rpc api of net_listening") + public void test31JsonRpcApiTestForNetListening() throws Exception { + JsonArray params = new JsonArray(); + JsonObject requestBody = getJsonRpcBody("net_listening", params); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + Boolean temp = responseContent.getBoolean("result"); + logger.info(temp.toString()); + response = HttpMethed.getNodeInfo(httpsolidityNode); + responseContent = HttpMethed.parseResponseContent(response); + boolean expect = false; + int num = responseContent.getInteger("activeConnectCount"); + if (num >= 1) { + expect = true; + } + Assert.assertEquals(temp, expect); + } + + @Test(enabled = true, description = "Json rpc api of net_peerCount") + public void test32JsonRpcApiTestForNetPeerCount() throws Exception { + JsonArray params = new JsonArray(); + JsonObject requestBody = getJsonRpcBody("net_peerCount", params); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String result = responseContent.getString("result"); + logger.info(result); + Assert.assertNotNull(result); + } + + @Test(enabled = true, description = "Json rpc api of net_version") + public void test33JsonRpcApiTestForEthVersion() throws Exception { + JsonArray params = new JsonArray(); + JsonObject requestBody = getJsonRpcBody("net_version", params); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String firstBlockHashFromJsonRpc = responseContent.getString("result").substring(2); + response = HttpMethed.getBlockByNumFromSolidity(httpsolidityNode, 0); + responseContent = HttpMethed.parseResponseContent(response); + String firstBlockHashFromHttp = responseContent.getString("blockID").substring(56); + logger.info("firstBlockHashFromJsonRpc" + firstBlockHashFromJsonRpc); + logger.info("firstBlockHashFromHttp" + firstBlockHashFromHttp); + Assert.assertEquals(firstBlockHashFromJsonRpc, firstBlockHashFromHttp); + } + + @Test(enabled = true, description = "Json rpc api of web3_clientVersion") + public void test34JsonRpcApiTestForWeb3ClientVersion() throws Exception { + JsonArray params = new JsonArray(); + JsonObject requestBody = getJsonRpcBody("web3_clientVersion", params); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String result = responseContent.getString("result"); + List resultList = new ArrayList<>(); + for (String str : result.split("/")) { + resultList.add(str); + } + Assert.assertEquals(resultList.size(), 5); + Assert.assertEquals(resultList.get(0), "TRON"); + Assert.assertEquals(resultList.get(1).substring(0, 1), "v"); + Assert.assertEquals(resultList.get(2), "Linux"); + Assert.assertEquals(resultList.get(3), "Java1.8"); + Assert.assertEquals(resultList.get(4).substring(0, 11), "GreatVoyage"); + } + + @Test(enabled = true, description = "Json rpc api of web3_sha3") + public void test35JsonRpcApiTestForWeb3Sha3() throws Exception { + JsonArray params = new JsonArray(); + params.add("0x08"); + JsonObject requestBody1 = getJsonRpcBody("web3_sha3", params); + response = getEthHttps(ethHttpsNode, requestBody1); + responseContent = HttpMethed.parseResponseContent(response); + String result1 = responseContent.getString("result"); + JsonObject requestBody2 = getJsonRpcBody("web3_sha3", params); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody2); + responseContent = HttpMethed.parseResponseContent(response); + String result2 = responseContent.getString("result"); + Assert.assertEquals(result1, result2); + } + + @Test(enabled = true, description = "Json rpc api of eth_compileLLL") + public void test36JsonRpcApiTestForEthCompileLll() throws Exception { + JsonArray params = new JsonArray(); + params.add("(returnlll (suicide (caller)))"); + JsonObject requestBody1 = getJsonRpcBody("eth_compileLLL", params); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody1); + responseContent = HttpMethed.parseResponseContent(response); + String errorMessage = responseContent.getJSONObject("error").getString("message"); + Assert.assertEquals(errorMessage, "the method eth_compileLLL does not exist/is not available"); + } + + @Test(enabled = true, description = "Json rpc api of eth_compileSerpent") + public void test37JsonRpcApiTestForEthCompileSerpent() throws Exception { + JsonArray params = new JsonArray(); + params.add("/* some serpent */"); + JsonObject requestBody = getJsonRpcBody("eth_compileSerpent", params); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String errorMessage = responseContent.getJSONObject("error").getString("message"); + Assert.assertEquals( + errorMessage, "the method eth_compileSerpent does not exist/is not available"); + } + + @Test(enabled = true, description = "Json rpc api of eth_compileSolidity") + public void test38JsonRpcApiTestForEthCompileSolidity() throws Exception { + JsonArray params = new JsonArray(); + params.add("contract test { function multiply(uint a) returns(uint d) { return a * 7; } }"); + JsonObject requestBody = getJsonRpcBody("eth_compileSolidity", params); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String errorMessage = responseContent.getJSONObject("error").getString("message"); + Assert.assertEquals( + errorMessage, "the method eth_compileSolidity does not exist/is not available"); + } + + @Test(enabled = true, description = "Json rpc api of eth_getCompilers") + public void test39JsonRpcApiTestForEthCompileSolidity() throws Exception { + JsonArray params = new JsonArray(); + JsonObject requestBody = getJsonRpcBody("eth_getCompilers", params); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String errorMessage = responseContent.getJSONObject("error").getString("message"); + Assert.assertEquals( + errorMessage, "the method eth_getCompilers does not exist/is not available"); + } + + @Test(enabled = true, description = "Json rpc api of eth_getTransactionCount") + public void test40JsonRpcApiTestForEthGetTransactionCount() throws Exception { + JsonArray params = new JsonArray(); + params.add("0x407d73d8a49eeb85d32cf465507dd71d507100c1"); + params.add("latest"); + JsonObject requestBody = getJsonRpcBody("eth_getTransactionCount", params); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String errorMessage = responseContent.getJSONObject("error").getString("message"); + Assert.assertEquals( + errorMessage, "the method eth_getTransactionCount does not exist/is not available"); + } + + @Test(enabled = true, description = "Json rpc api of eth_sendRawTransaction") + public void test41JsonRpcApiTestForEthSendRawTransaction() throws Exception { + JsonArray params = new JsonArray(); + params.add("0x234"); + JsonObject requestBody = getJsonRpcBody("eth_sendRawTransaction", params); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String errorMessage = responseContent.getJSONObject("error").getString("message"); + Assert.assertEquals( + errorMessage, "the method eth_sendRawTransaction does not exist/is not available"); + } + + @Test(enabled = true, description = "Json rpc api of eth_sendTransaction") + public void test42JsonRpcApiTestForEthSendTransaction() throws Exception { + JsonArray params = new JsonArray(); + JsonObject temp = new JsonObject(); + params.add(temp); + temp.addProperty("from", "0xb60e8dd61c5d32be8058bb8eb970870f07233155"); + temp.addProperty("to", "0xd46e8dd67c5d32be8058bb8eb970870f07244567"); + temp.addProperty("gas", "0x76c0"); + temp.addProperty("gasPrice", "0x9184e72a000"); + temp.addProperty( + "data", + "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"); + temp.addProperty("value", "0x9184e72a"); + + JsonObject requestBody = getJsonRpcBody("eth_sendTransaction", params); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String errorMessage = responseContent.getJSONObject("error").getString("message"); + Assert.assertEquals( + errorMessage, "the method eth_sendTransaction does not exist/is not available"); + } + + @Test(enabled = true, description = "Json rpc api of eth_sign") + public void test43JsonRpcApiTestForEthSign() throws Exception { + JsonArray params = new JsonArray(); + params.add("0x9b2055d370f73ec7d8a03e965129118dc8f5bf83"); + params.add("0xdeadbeaf"); + JsonObject requestBody = getJsonRpcBody("eth_sign", params); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String errorMessage = responseContent.getJSONObject("error").getString("message"); + Assert.assertEquals(errorMessage, "the method eth_sign does not exist/is not available"); + } + + @Test(enabled = true, description = "Json rpc api of eth_signTransaction") + public void test44JsonRpcApiTestForEthSignTransaction() throws Exception { + JsonArray params = new JsonArray(); + JsonObject temp = new JsonObject(); + params.add(temp); + temp.addProperty( + "data", + "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"); + temp.addProperty("from", "0xb60e8dd61c5d32be8058bb8eb970870f07233155"); + temp.addProperty("gas", "0x76c0"); + temp.addProperty("gasPrice", "0x9184e72a000"); + temp.addProperty("to", "0xd46e8dd67c5d32be8058bb8eb970870f07244567"); + temp.addProperty("value", "0x9184e72a"); + + JsonObject requestBody = getJsonRpcBody("eth_signTransaction", params); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String errorMessage = responseContent.getJSONObject("error").getString("message"); + Assert.assertEquals( + errorMessage, "the method eth_signTransaction does not exist/is not available"); + } + + @Test(enabled = true, description = "Json rpc api of eth_submitWork") + public void test45JsonRpcApiTestForEthSubmitWork() throws Exception { + JsonArray params = new JsonArray(); + params.add("0x0000000000000001"); + params.add("0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"); + params.add("0xD1GE5700000000000000000000000000D1GE5700000000000000000000000000"); + JsonObject requestBody = getJsonRpcBody("eth_submitWork", params); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String errorMessage = responseContent.getJSONObject("error").getString("message"); + Assert.assertEquals(errorMessage, "the method eth_submitWork does not exist/is not available"); + } + + @Test(enabled = true, description = "Json rpc api of parity_nextNonce") + public void test46JsonRpcApiTestForParityNextNonce() throws Exception { + JsonArray params = new JsonArray(); + params.add("0x9b2055d370f73ec7d8a03e965129118dc8f5bf83"); + JsonObject requestBody = getJsonRpcBody("parity_nextNonce", params); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String errorMessage = responseContent.getJSONObject("error").getString("message"); + Assert.assertEquals( + errorMessage, "the method parity_nextNonce does not exist/is not available"); + } + + @Test(enabled = true, description = "Json rpc api of eth_submitHashrate") + public void test47JsonRpcApiTestForEthSubmitHashrate() throws Exception { + JsonArray params = new JsonArray(); + params.add("0x0000000000000000000000000000000000000000000000000000000000500000"); + params.add("0x59daa26581d0acd1fce254fb7e85952f4c09d0915afd33d3886cd914bc7d283c"); + JsonObject requestBody = getJsonRpcBody("eth_submitHashrate", params); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + String errorMessage = responseContent.getJSONObject("error").getString("message"); + Assert.assertEquals( + errorMessage, "the method eth_submitHashrate does not exist/is not available"); + } + + @Test(enabled = true, description = "Json rpc api of eth_getBlockByHash params is false") + public void test48JsonRpcApiTestForEthGetBlockByHash() throws Exception { + response = HttpMethed.getBlockByNumFromSolidity(httpsolidityNode, blockNum); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("45getBlockByNumFromSolidityFromHttp:" + responseContent); + accountStateRoot = + responseContent + .getJSONObject("block_header") + .getJSONObject("raw_data") + .getString("accountStateRoot"); + JsonArray params = new JsonArray(); + params.add(blockHash); + params.add(false); + JsonObject requestBody = getJsonRpcBody("eth_getBlockByHash", params); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + JSONObject getBlockByHashResult = responseContent.getJSONObject("result"); + + Assert.assertNull(getBlockByHashResult.getString("nonce")); + Assert.assertNull(getBlockByHashResult.getString("sha3Uncles")); + Assert.assertNull(getBlockByHashResult.getString("receiptsRoot")); + Assert.assertNull(getBlockByHashResult.getString("difficulty")); + Assert.assertNull(getBlockByHashResult.getString("totalDifficulty")); + Assert.assertNull(getBlockByHashResult.getString("extraData")); + Assert.assertNull(getBlockByHashResult.getString("baseFeePerGas")); + Assert.assertNull(getBlockByHashResult.getString("mixHash")); + Assert.assertEquals(getBlockByHashResult.getString("uncles"), new ArrayList<>().toString()); + Assert.assertEquals(getBlockByHashResult.getString("stateRoot"), "0x" + accountStateRoot); + + Assert.assertEquals( + getBlockByHashResult.getString("logsBloom"), + "0x00000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000000" + + "00000000000000000000000000000000000000000000000000000000000000000000000" + + "00000000000000000000000000000000000000000000000000000000000000000000000000000000" + + "000000000000000000000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000000000000000" + + "00000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000"); + Assert.assertEquals(getBlockByHashResult.getString("number"), blockNumHex); + Assert.assertEquals(getBlockByHashResult.getString("hash"), "0x" + bid); + Assert.assertEquals(getBlockByHashResult.getString("parentHash"), "0x" + parentHash); + Assert.assertEquals(getBlockByHashResult.getString("transactionsRoot"), "0x" + txTrieRoot); + Assert.assertEquals( + getBlockByHashResult.getString("miner"), "0x" + witnessAddress.substring(2)); + Assert.assertEquals(getBlockByHashResult.getString("gasUsed"), "0x" + Long.toHexString(gas)); + Assert.assertEquals( + String.valueOf(Long.parseLong(getBlockByHashResult.getString("gasLimit").substring(2), 16)), + feeLimit); + Assert.assertEquals( + Long.parseLong(getBlockByHashResult.getString("timestamp").substring(2), 16), + blockTimeStamp); + final GrpcAPI.NumberMessage message = + GrpcAPI.NumberMessage.newBuilder().setNum(blockNum).build(); + HttpMethed.waitToProduceOneBlock(httpFullNode); + Block block = blockingStubFull.getBlockByNum(message); + logger.info("sizeFromJrpc:" + block.getSerializedSize()); + logger.info( + "sizeFromJsonRPc:" + + Long.parseLong(getBlockByHashResult.getString("size").substring(2), 16)); + size = block.getSerializedSize(); + Assert.assertEquals( + Long.parseLong(getBlockByHashResult.getString("size").substring(2), 16), + block.getSerializedSize()); + + Long.parseLong(getBlockByHashResult.getString("timestamp").substring(2), 16); + JSONArray transactionId = getBlockByHashResult.getJSONArray("transactions"); + List transactionIdListFromGetBlockByHash = new ArrayList<>(); + if (transactionId.size() > 0) { + for (int i = 0; i < transactionId.size(); i++) { + transactionIdListFromGetBlockByHash.add(transactionId.get(i).toString()); + } + } + Assert.assertEquals(transactionIdListFromGetBlockByHash, transactionIdList); + } + + @Test( + enabled = true, + description = "Json rpc api of eth_getBlockByNumFromSolidityber params is true") + public void test49JsonRpcApiTestForEthgetBlockByNumFromSolidityber() throws Exception { + + JsonArray params = new JsonArray(); + params.add(blockNumHex); + logger.info("46blockNumHex:" + blockNumHex); + params.add(true); + JsonObject requestBody = getJsonRpcBody("eth_getBlockByNumber", params); + logger.info("requestBody:" + requestBody); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("responseContent:" + responseContent); + JSONObject getBlockByNumFromSolidityberResult = responseContent.getJSONObject("result"); + logger.info("getBlockByHashResult:" + getBlockByNumFromSolidityberResult); + + Assert.assertNull(getBlockByNumFromSolidityberResult.getString("nonce")); + Assert.assertNull(getBlockByNumFromSolidityberResult.getString("sha3Uncles")); + Assert.assertNull(getBlockByNumFromSolidityberResult.getString("receiptsRoot")); + Assert.assertNull(getBlockByNumFromSolidityberResult.getString("difficulty")); + Assert.assertNull(getBlockByNumFromSolidityberResult.getString("totalDifficulty")); + Assert.assertNull(getBlockByNumFromSolidityberResult.getString("extraData")); + Assert.assertNull(getBlockByNumFromSolidityberResult.getString("baseFeePerGas")); + Assert.assertNull(getBlockByNumFromSolidityberResult.getString("mixHash")); + Assert.assertEquals( + getBlockByNumFromSolidityberResult.getString("uncles"), new ArrayList<>().toString()); + Assert.assertEquals( + getBlockByNumFromSolidityberResult.getString("stateRoot"), "0x" + accountStateRoot); + Assert.assertEquals( + getBlockByNumFromSolidityberResult.getString("logsBloom"), + "0x00000000000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000000000000" + + "00000000000000000000000000000000000000000000000000000000000000000000000" + + "000000000000000000000000000000000000000000000000000000000000000000000000" + + "000000000000000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000000000000000" + + "0000000000000"); + Assert.assertEquals(getBlockByNumFromSolidityberResult.getString("number"), blockNumHex); + Assert.assertEquals(getBlockByNumFromSolidityberResult.getString("hash"), "0x" + bid); + Assert.assertEquals( + getBlockByNumFromSolidityberResult.getString("parentHash"), "0x" + parentHash); + Assert.assertEquals( + getBlockByNumFromSolidityberResult.getString("transactionsRoot"), "0x" + txTrieRoot); + Assert.assertEquals( + getBlockByNumFromSolidityberResult.getString("miner"), "0x" + witnessAddress.substring(2)); + Assert.assertEquals( + getBlockByNumFromSolidityberResult.getString("gasUsed"), "0x" + Long.toHexString(gas)); + Assert.assertEquals( + String.valueOf( + Long.parseLong( + getBlockByNumFromSolidityberResult.getString("gasLimit").substring(2), 16)), + feeLimit); + Assert.assertEquals( + Long.parseLong(getBlockByNumFromSolidityberResult.getString("timestamp").substring(2), 16), + blockTimeStamp); + logger.info("size:" + size); + Assert.assertEquals( + Long.parseLong(getBlockByNumFromSolidityberResult.getString("size").substring(2), 16), + size); + + JSONArray transactionsList = getBlockByNumFromSolidityberResult.getJSONArray("transactions"); + logger.info("transactionsList:" + transactionsList); + List transactionInfoListFromGetBlockByHash = new ArrayList<>(); + if (transactionsList.size() > 0) { + for (int i = 0; i < transactionsList.size(); i++) { + transactionInfoListFromGetBlockByHash.add(transactionsList.get(i).toString()); + } + } + List transactionInfoListFromTransactionByBlockNumberAndIndex = new ArrayList<>(); + for (int i = 0; i < transactionsList.size(); i++) { + JsonArray paramsForEthGetTransactionByBlockNumberAndIndex = new JsonArray(); + paramsForEthGetTransactionByBlockNumberAndIndex.add(blockNumHex); + String index = "0x" + Integer.toHexString(i); + logger.info("index:" + index); + paramsForEthGetTransactionByBlockNumberAndIndex.add(index); + logger.info( + "paramsForEthGetTransactionByBlockNumberAndIndex:" + + paramsForEthGetTransactionByBlockNumberAndIndex); + JsonObject requestBodyForTransactionByBlockNumberAndIndex = + getJsonRpcBody( + "eth_getTransactionByBlockNumberAndIndex", + paramsForEthGetTransactionByBlockNumberAndIndex); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBodyForTransactionByBlockNumberAndIndex); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("responseContent:" + responseContent); + result = responseContent.getJSONObject("result"); + logger.info("result:" + result); + transactionInfoListFromTransactionByBlockNumberAndIndex.add(result.toString()); + } + Assert.assertEquals( + transactionInfoListFromGetBlockByHash, + transactionInfoListFromTransactionByBlockNumberAndIndex); + } + + /** constructor. */ + @AfterClass + public void shutdown() throws InterruptedException { + if (channelFull != null) { + channelFull.shutdown().awaitTermination(5, TimeUnit.SECONDS); + } + } +} diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts003.java b/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts003.java new file mode 100644 index 00000000000..c566fc5532c --- /dev/null +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts003.java @@ -0,0 +1,373 @@ +package stest.tron.wallet.dailybuild.jsonrpc; + +import com.alibaba.fastjson.JSONObject; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import lombok.extern.slf4j.Slf4j; +import org.apache.http.HttpResponse; +import org.junit.Assert; +import org.testng.annotations.Test; +import stest.tron.wallet.common.client.utils.HttpMethed; +import stest.tron.wallet.common.client.utils.JsonRpcBase; + +@Slf4j +public class Accounts003 extends JsonRpcBase { + JSONObject responseContent; + HttpResponse response; + String topic0 = null; + String topic1 = null; + String fromBlock = null; + String toBlock = null; + String newFilterResultIdfrom01 = null; + String newFilterResultIdfrom02 = null; + String blockHash = null; + + @Test(enabled = true, description = "Eth api of eth_newFilter contains nothing.") + public void test01GetNewFilterContainNothing() { + JsonObject paramBody = new JsonObject(); + JsonArray params = new JsonArray(); + params.add(paramBody); + JsonObject requestBody = getJsonRpcBody("eth_newFilter", params); + logger.info("test01GetNewFilterContainNothing_requestBody " + requestBody); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("test01GetNewFilterContainNothing_responseContent" + responseContent); + logger.info("result:" + responseContent.getString("result")); + Assert.assertNotNull(responseContent.getString("result")); + } + + @Test( + enabled = true, + description = "Eth api of eth_newFilter contains address,fromBlock and toBlock.") + public void test02GetNewFilterContainAddress() { + if (blockNumForTrc20 - 10 < 0) { + fromBlock = "0"; + } else { + fromBlock = "0x" + Integer.toHexString(blockNumForTrc20 - 10); + } + toBlock = "0x" + Integer.toHexString(blockNumForTrc20 + 10); + JsonArray addressArray = new JsonArray(); + addressArray.add(contractAddressFrom58.substring(2)); + JsonObject paramBody = new JsonObject(); + paramBody.add("address", addressArray); + paramBody.addProperty("fromBlock", fromBlock); + paramBody.addProperty("toBlock", toBlock); + JsonArray params = new JsonArray(); + params.add(paramBody); + JsonObject requestBody = getJsonRpcBody("eth_newFilter", params); + logger.info("test02GetNewFilterContainAddress_requestBody " + requestBody); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("test02GetNewFilterContainAddress_responseContent" + responseContent); + newFilterResultIdfrom01 = responseContent.getString("result"); + logger.info("test02GetNewFilterContainAddress_id:" + responseContent.getString("result")); + } + + @Test( + enabled = true, + description = "Eth api of eth_newFilter contains topic fromBlock and toBlock.") + public void test03GetNewFilterContainTopic() { + response = HttpMethed.getBlockByNum(httpFullNode, blockNumForTrc20); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("responseContent:" + responseContent); + logger.info("blockHash:" + responseContent.getString("blockID")); + + blockHash = responseContent.getString("blockID"); + JsonArray topicArray = new JsonArray(); + topicArray.add("0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"); + JsonObject paramBody = new JsonObject(); + paramBody.add("topics", topicArray); + paramBody.addProperty("fromBlock", fromBlock); + paramBody.addProperty("toBlock", toBlock); + JsonArray params = new JsonArray(); + params.add(paramBody); + JsonObject requestBody = getJsonRpcBody("eth_newFilter", params); + logger.info("test03GetNewFilterContainTopic_requestBody " + requestBody); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("test03GetNewFilterContainTopic_responseContent" + responseContent); + Assert.assertNotNull(responseContent.getString("result")); + newFilterResultIdfrom02 = responseContent.getString("result"); + logger.info("test03GetNewFilterContainTopic_id:" + newFilterResultIdfrom02); + } + + @Test(enabled = true, description = "Eth api of eth_newFilter contains topic and address.") + public void test04GetNewFilterContainsTopicAndAddress() { + + JsonArray addressArray = new JsonArray(); + addressArray.add(contractAddressFrom58.substring(2)); + JsonArray topicArray = new JsonArray(); + topicArray.add("0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"); + JsonObject paramBody = new JsonObject(); + paramBody.add("address", addressArray); + paramBody.add("topics", topicArray); + paramBody.addProperty("fromBlock", fromBlock); + paramBody.addProperty("toBlock", toBlock); + JsonArray params = new JsonArray(); + params.add(paramBody); + JsonObject requestBody = getJsonRpcBody("eth_newFilter", params); + logger.info("test04GetNewFilterContainsTopicAndAddress_requestBody " + requestBody); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("test04GetNewFilterContainsTopicAndAddress_responseContent" + responseContent); + Assert.assertNotNull(responseContent.getString("result")); + } + + @Test(enabled = true, description = "Eth api of eth_newFilter only contain topic and blockHash.") + public void test05GetNewFilterOnlyContainTopic() { + JsonObject paramBody = new JsonObject(); + paramBody.addProperty("blockHash", blockHash); + JsonArray topicArray = new JsonArray(); + topicArray.add("0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"); + paramBody.add("topics", topicArray); + JsonArray params = new JsonArray(); + params.add(paramBody); + JsonObject requestBody = getJsonRpcBody("eth_newFilter", params); + logger.info("test05GetNewFilterOnlyContainTopic_requestBody " + requestBody); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("test05GetNewFilterOnlyContainTopic_responseContent" + responseContent); + Assert.assertNotNull(responseContent.getString("result")); + } + + @Test(enabled = true, description = "Eth api of eth_newFilter which only contains blockHash.") + public void test06GetNewFilterHasOnlyBlockHash() { + + response = HttpMethed.getNowBlock(httpFullNode); + responseContent = HttpMethed.parseResponseContent(response); + String blockHash = responseContent.getString("blockID"); + JsonObject paramBody = new JsonObject(); + paramBody.addProperty("blockHash", blockHash); + JsonArray params = new JsonArray(); + params.add(paramBody); + JsonObject requestBody = getJsonRpcBody("eth_newFilter", params); + logger.info("test06GetNewFilterHasOnlyBlockHash_requestBody " + requestBody); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("test06GetNewFilterHasOnlyBlockHash_responseContent" + responseContent); + Assert.assertNotNull(responseContent.getString("result")); + } + + @Test(enabled = true, description = "Eth api of eth_newFilter check new and after block.") + public void test07GetNewFilterCheckNewBlock() { + JsonObject paramBody = new JsonObject(); + JsonArray topicArray = new JsonArray(); + topicArray.add("0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"); + paramBody.add("topics", topicArray); + JsonArray params = new JsonArray(); + params.add(paramBody); + JsonObject requestBody = getJsonRpcBody("eth_newFilter", params); + logger.info("test07GetNewFilterCheckNewBlock_requestBody " + requestBody); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("test07GetNewFilterCheckNewBlock_responseContent" + responseContent); + Assert.assertNotNull(responseContent.getString("result")); + } + + @Test(enabled = true, description = "Eth api of eth_newBlockFilter") + public void test08GetEthNewBlockFilter() { + + JsonArray params = new JsonArray(); + JsonObject requestBody = getJsonRpcBody("eth_newBlockFilter", params); + logger.info("test08GetEthNewBlockFilter_requestBody " + requestBody); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("test08GetEthNewBlockFilter_responseContent:" + responseContent); + Assert.assertNotNull(responseContent.getString("result")); + } + + @Test(enabled = true, description = "Eth api of eth_getFilterChanges has less 20 elements.") + public void test09GetFilterChanges() { + + JsonArray params = new JsonArray(); + JsonObject requestBody = getJsonRpcBody("eth_newBlockFilter", params); + logger.info("test15EthUninstallFilter_newBlockFilter " + requestBody); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("test15EthUninstallFilter_newBlockFilter_responseContentr" + responseContent); + String ethNewBlockFilterResult = responseContent.get("result").toString(); + logger.info("ethNewBlockFilterResult:" + ethNewBlockFilterResult); + String newFilterId = responseContent.getString("result"); + logger.info("newFilterId:" + newFilterId); + params = new JsonArray(); + params.add(newFilterId); + requestBody = getJsonRpcBody("eth_getFilterChanges", params); + logger.info("test09GetFilterChanges_requestBody: " + requestBody); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("test09GetFilterChanges_responseContent:" + responseContent); + Assert.assertEquals("[]", responseContent.getString("result")); + } + + @Test( + enabled = true, + description = "Eth api of eth_getLogs contains address ,fromBlock and toBlock.") + public void test10GetLogsOnlyContainAddress() { + JsonArray addressArray = new JsonArray(); + logger.info("contractTrc20AddressFrom58:" + contractTrc20AddressFrom58); + addressArray.add(contractTrc20AddressFrom58.substring(2)); + JsonObject paramBody = new JsonObject(); + paramBody.add("address", addressArray); + logger.info("blockNumForTrc20:" + blockNumForTrc20); + paramBody.addProperty("fromBlock", "0x" + (Integer.toHexString(blockNumForTrc20 - 20))); + paramBody.addProperty("toBlock", "0x" + (Integer.toHexString(blockNumForTrc20 + 20))); + JsonArray params = new JsonArray(); + params.add(paramBody); + JsonObject requestBody = getJsonRpcBody("eth_getLogs", params); + logger.info("test10GetLogsOnlyContainAddress_requestBody:" + requestBody); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("test10GetLogsOnlyContainAddress_responseContent:" + responseContent); + Assert.assertNotNull(responseContent.getString("result")); + String address = + responseContent.getJSONArray("result").getJSONObject(0).getString("address").substring(2); + Assert.assertEquals(address, contractTrc20AddressFrom58.substring(2)); + topic0 = responseContent.getJSONArray("result").getJSONObject(0).getString("topic"); + } + + @Test(enabled = true, description = "Eth api of eth_getLogs both contains topic and address.") + public void test11GetLogsContainsTopicAndAddress() { + JsonArray topicArray = new JsonArray(); + topicArray.add(topic0); + JsonObject paramBody = new JsonObject(); + paramBody.add("topics", topicArray); + paramBody.addProperty("fromBlock", "0x" + (Integer.toHexString(blockNumForTrc20 - 10))); + paramBody.addProperty("toBlock", "0x" + (Integer.toHexString(blockNumForTrc20 + 10))); + JsonArray params = new JsonArray(); + params.add(paramBody); + JsonObject requestBody = getJsonRpcBody("eth_getLogs", params); + logger.info("test11GetLogsContainsTopicAndAddress_requestBody " + requestBody); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("test11GetLogsContainsTopicAndAddress_responseContent" + responseContent); + Assert.assertNotNull(responseContent.getString("result")); + String topicFromResult = + responseContent.getJSONArray("result").getJSONObject(0).getString("topic"); + Assert.assertEquals(topicFromResult, topic0); + } + + @Test(enabled = true, description = "Eth api of eth_getFilterLogs .") + public void test12GetFilterLogsContainsAddress() { + + JsonArray params = new JsonArray(); + params.add(newFilterResultIdfrom01); + JsonObject requestBody = getJsonRpcBody("eth_getFilterLogs", params); + logger.info("test12GetFilterLogsContainsAddress_requestBody " + requestBody); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("test12GetFilterLogsContainsAddress_responseContent" + responseContent); + Assert.assertNotNull(responseContent.getString("result")); + } + + @Test(enabled = true, description = "Eth api of eth_getFilterLogs .") + public void test13GetFilterLogsContainsTopic() { + + JsonArray params = new JsonArray(); + params.add(newFilterResultIdfrom02); + JsonObject requestBody = getJsonRpcBody("eth_getFilterLogs", params); + logger.info("test13GetFilterLogsContainsTopic_requestBody " + requestBody); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("test13GetFilterLogsContainsTopic_responseContent" + responseContent); + Assert.assertNotNull(responseContent.getString("result")); + } + + @Test( + enabled = true, + description = + "Eth api of eth_uninstallFilter which method is eth_newFilter" + + " and params has one element ") + public void test14EthUninstallFilter() { + // create ID + JsonArray addressArray = new JsonArray(); + addressArray.add(contractAddressFrom58.substring(2)); + JsonObject paramBody = new JsonObject(); + paramBody.add("address", addressArray); + paramBody.addProperty("fromBlock", "0x1f8b6a7"); + paramBody.addProperty("toBlock", "0x1f8b6a7"); + JsonArray params = new JsonArray(); + params.add(paramBody); + JsonObject requestBody = getJsonRpcBody("eth_newFilter", params); + logger.info("test14_newfilter " + requestBody); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("test14_newfilter_responseContentr" + responseContent); + String ethNewFilterResult = responseContent.get("result").toString(); + logger.info("EthNewFilterResult:" + ethNewFilterResult); + Assert.assertNotNull(responseContent.getString("result")); + + // verify ID invalid + + // first time + params = new JsonArray(); + params.add(responseContent.get("result").toString()); + requestBody = getJsonRpcBody("eth_uninstallFilter", params); + logger.info("test14_eth_uninstallFilter " + requestBody); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("test14_eth_uninstallFilter_responseContentr_first" + responseContent); + Assert.assertEquals(responseContent.get("result"), true); + // second time + logger.info("test14_eth_uninstallFilter_second " + requestBody); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("test14_eth_uninstallFilter_responseContentr_second " + responseContent); + Assert.assertEquals( + responseContent.getJSONObject("error").getString("message"), "filter not found"); + + // query getFilterChanges to verify ID has invalid + params = new JsonArray(); + params.add(ethNewFilterResult); + requestBody = getJsonRpcBody("getFilterChanges", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("test14EthUninstallFilter_responseContent" + responseContent); + String expectResult = "{\"code\":-32000,\"data\":\"{}\",\"message\":\"filter not found\"}"; + Assert.assertEquals(responseContent.get("error").toString(), expectResult); + } + + @Test( + enabled = true, + description = + "Eth api of eth_uninstallFilter which method is eth_newBlockFilter" + + " and params has one element ") + public void test15EthUninstallFilter() { + // create ID + + JsonArray params = new JsonArray(); + JsonObject requestBody = getJsonRpcBody("eth_newBlockFilter", params); + logger.info("test15EthUninstallFilter_newBlockFilter " + requestBody); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("test15EthUninstallFilter_newBlockFilter_responseContentr" + responseContent); + String ethNewBlockFilterResult = responseContent.get("result").toString(); + logger.info("ethNewBlockFilterResult:" + ethNewBlockFilterResult); + Assert.assertNotNull(responseContent.getString("result")); + + // verify ID invalid + // first time + params = new JsonArray(); + params.add(responseContent.get("result").toString()); + requestBody = getJsonRpcBody("eth_uninstallFilter", params); + logger.info("test15_eth_uninstallFilter " + requestBody); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("test15_eth_uninstallFilter_responseContentr_first" + responseContent); + Assert.assertEquals(responseContent.get("result"), true); + // second time + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("test15_eth_uninstallFilter_responseContentr_second" + responseContent); + Assert.assertEquals( + responseContent.getJSONObject("error").getString("message"), "filter not found"); + // query getFilterChanges to verify ID has invalid + params = new JsonArray(); + params.add(ethNewBlockFilterResult); + requestBody = getJsonRpcBody("getFilterChanges", params); + response = getJsonRpc(jsonRpcNode, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("test15EthUninstallFilter_responseContent" + responseContent); + String expectResult = "{\"code\":-32000,\"data\":\"{}\",\"message\":\"filter not found\"}"; + Assert.assertEquals(responseContent.get("error").toString(), expectResult); + } +} diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts004.java b/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts004.java new file mode 100644 index 00000000000..be42416ccbb --- /dev/null +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/Accounts004.java @@ -0,0 +1,374 @@ +package stest.tron.wallet.dailybuild.jsonrpc; + +import com.alibaba.fastjson.JSONObject; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import lombok.extern.slf4j.Slf4j; +import org.apache.http.HttpResponse; +import org.junit.Assert; +import org.testng.annotations.Test; +import stest.tron.wallet.common.client.utils.HttpMethed; +import stest.tron.wallet.common.client.utils.JsonRpcBase; + +@Slf4j +public class Accounts004 extends JsonRpcBase { + JSONObject responseContent; + HttpResponse response; + String topic0 = null; + String topic1 = null; + String fromBlock = null; + String toBlock = null; + String newFilterResultIdfrom01 = null; + String newFilterResultIdfrom02 = null; + String blockHash = null; + + @Test(enabled = true, description = "Eth api of eth_newFilter contains nothing.") + public void test01GetNewFilterContainNothing() { + JsonObject paramBody = new JsonObject(); + JsonArray params = new JsonArray(); + params.add(paramBody); + JsonObject requestBody = getJsonRpcBody("eth_newFilter", params); + logger.info("test01GetNewFilterContainNothing_requestBody " + requestBody); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("test01GetNewFilterContainNothing_responseContent" + responseContent); + logger.info("result:" + responseContent.getString("result")); + Assert.assertNotNull(responseContent.getString("result")); + } + + @Test( + enabled = true, + description = "Eth api of eth_newFilter contains address,fromBlock and toBlock.") + public void test02GetNewFilterContainAddress() { + if (blockNumForTrc20 - 10 < 0) { + fromBlock = "0"; + } else { + fromBlock = "0x" + Integer.toHexString(blockNumForTrc20 - 10); + } + toBlock = "0x" + Integer.toHexString(blockNumForTrc20 + 10); + JsonArray addressArray = new JsonArray(); + addressArray.add(contractAddressFrom58.substring(2)); + JsonObject paramBody = new JsonObject(); + paramBody.add("address", addressArray); + paramBody.addProperty("fromBlock", fromBlock); + paramBody.addProperty("toBlock", toBlock); + JsonArray params = new JsonArray(); + params.add(paramBody); + JsonObject requestBody = getJsonRpcBody("eth_newFilter", params); + logger.info("test02GetNewFilterContainAddress_requestBody " + requestBody); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("test02GetNewFilterContainAddress_responseContent" + responseContent); + newFilterResultIdfrom01 = responseContent.getString("result"); + logger.info("test02GetNewFilterContainAddress_id:" + responseContent.getString("result")); + } + + @Test( + enabled = true, + description = "Eth api of eth_newFilter contains topic fromBlock and toBlock.") + public void test03GetNewFilterContainTopic() { + response = HttpMethed.getBlockByNumFromSolidity(httpsolidityNode, blockNumForTrc20); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("responseContent:" + responseContent); + logger.info("blockHash:" + responseContent.getString("blockID")); + blockHash = responseContent.getString("blockID"); + JsonArray topicArray = new JsonArray(); + topicArray.add("0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"); + JsonObject paramBody = new JsonObject(); + paramBody.add("topics", topicArray); + paramBody.addProperty("fromBlock", fromBlock); + paramBody.addProperty("toBlock", toBlock); + JsonArray params = new JsonArray(); + params.add(paramBody); + JsonObject requestBody = getJsonRpcBody("eth_newFilter", params); + logger.info("test03GetNewFilterContainTopic_requestBody " + requestBody); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("test03GetNewFilterContainTopic_responseContent" + responseContent); + Assert.assertNotNull(responseContent.getString("result")); + newFilterResultIdfrom02 = responseContent.getString("result"); + logger.info("test03GetNewFilterContainTopic_id:" + newFilterResultIdfrom02); + } + + @Test(enabled = true, description = "Eth api of eth_newFilter contains topic and address.") + public void test04GetNewFilterContainsTopicAndAddress() { + + JsonArray addressArray = new JsonArray(); + addressArray.add(contractAddressFrom58.substring(2)); + JsonArray topicArray = new JsonArray(); + topicArray.add("0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"); + JsonObject paramBody = new JsonObject(); + paramBody.add("address", addressArray); + paramBody.add("topics", topicArray); + paramBody.addProperty("fromBlock", fromBlock); + paramBody.addProperty("toBlock", toBlock); + JsonArray params = new JsonArray(); + params.add(paramBody); + JsonObject requestBody = getJsonRpcBody("eth_newFilter", params); + logger.info("test04GetNewFilterContainsTopicAndAddress_requestBody " + requestBody); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("test04GetNewFilterContainsTopicAndAddress_responseContent" + responseContent); + Assert.assertNotNull(responseContent.getString("result")); + } + + @Test(enabled = true, description = "Eth api of eth_newFilter only contain topic and blockHash.") + public void test05GetNewFilterOnlyContainTopic() throws InterruptedException { + JsonObject paramBody = new JsonObject(); + paramBody.addProperty("blockHash", blockHash); + JsonArray topicArray = new JsonArray(); + topicArray.add("0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"); + paramBody.add("topics", topicArray); + JsonArray params = new JsonArray(); + params.add(paramBody); + JsonObject requestBody = getJsonRpcBody("eth_newFilter", params); + logger.info("test05GetNewFilterOnlyContainTopic_requestBody " + requestBody); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("test05GetNewFilterOnlyContainTopic_responseContent" + responseContent); + Assert.assertNotNull(responseContent.getString("result")); + } + + @Test(enabled = true, description = "Eth api of eth_newFilter which only contains blockHash.") + public void test06GetNewFilterHasOnlyBlockHash() throws InterruptedException { + response = HttpMethed.getNowBlockFromSolidity(httpsolidityNode); + responseContent = HttpMethed.parseResponseContent(response); + String blockHash = responseContent.getString("blockID"); + Thread.sleep(30000); + JsonObject paramBody = new JsonObject(); + paramBody.addProperty("blockHash", blockHash); + JsonArray params = new JsonArray(); + params.add(paramBody); + JsonObject requestBody = getJsonRpcBody("eth_newFilter", params); + logger.info("test06GetNewFilterHasOnlyBlockHash_requestBody " + requestBody); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("test06GetNewFilterHasOnlyBlockHash_responseContent" + responseContent); + Assert.assertNotNull(responseContent.getString("result")); + } + + @Test(enabled = true, description = "Eth api of eth_newFilter check new and after block.") + public void test07GetNewFilterCheckNewBlock() { + JsonObject paramBody = new JsonObject(); + JsonArray topicArray = new JsonArray(); + topicArray.add("0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"); + paramBody.add("topics", topicArray); + JsonArray params = new JsonArray(); + params.add(paramBody); + JsonObject requestBody = getJsonRpcBody("eth_newFilter", params); + logger.info("test07GetNewFilterCheckNewBlock_requestBody " + requestBody); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("test07GetNewFilterCheckNewBlock_responseContent" + responseContent); + Assert.assertNotNull(responseContent.getString("result")); + } + + @Test(enabled = true, description = "Eth api of eth_newBlockFilter") + public void test08GetEthNewBlockFilter() { + + JsonArray params = new JsonArray(); + JsonObject requestBody = getJsonRpcBody("eth_newBlockFilter", params); + logger.info("test08GetEthNewBlockFilter_requestBody " + requestBody); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("test08GetEthNewBlockFilter_responseContent:" + responseContent); + Assert.assertNotNull(responseContent.getString("result")); + } + + @Test(enabled = true, description = "Eth api of eth_getFilterChanges has less 20 elements.") + public void test09GetFilterChanges() { + + JsonArray params = new JsonArray(); + JsonObject requestBody = getJsonRpcBody("eth_newBlockFilter", params); + logger.info("test15EthUninstallFilter_newBlockFilter " + requestBody); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("test15EthUninstallFilter_newBlockFilter_responseContentr" + responseContent); + String ethNewBlockFilterResult = responseContent.get("result").toString(); + logger.info("ethNewBlockFilterResult:" + ethNewBlockFilterResult); + String newFilterId = responseContent.getString("result"); + logger.info("newFilterId:" + newFilterId); + params = new JsonArray(); + params.add(newFilterId); + requestBody = getJsonRpcBody("eth_getFilterChanges", params); + logger.info("test09GetFilterChanges_requestBody: " + requestBody); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("test09GetFilterChanges_responseContent:" + responseContent); + Assert.assertEquals("[]", responseContent.getString("result")); + } + + @Test( + enabled = true, + description = "Eth api of eth_getLogs contains address ,fromBlock and toBlock.") + public void test10GetLogsOnlyContainAddress() { + JsonArray addressArray = new JsonArray(); + logger.info("contractTrc20AddressFrom58:" + contractTrc20AddressFrom58); + addressArray.add(contractTrc20AddressFrom58.substring(2)); + JsonObject paramBody = new JsonObject(); + paramBody.add("address", addressArray); + logger.info("blockNumForTrc20:" + blockNumForTrc20); + paramBody.addProperty("fromBlock", "0x" + (Integer.toHexString(blockNumForTrc20 - 20))); + paramBody.addProperty("toBlock", "0x" + (Integer.toHexString(blockNumForTrc20 + 20))); + JsonArray params = new JsonArray(); + params.add(paramBody); + HttpMethed.waitToProduceOneBlockFromSolidity(httpFullNode, httpsolidityNode); + JsonObject requestBody = getJsonRpcBody("eth_getLogs", params); + logger.info("test10GetLogsOnlyContainAddress_requestBody:" + requestBody); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("test10GetLogsOnlyContainAddress_responseContent:" + responseContent); + Assert.assertNotNull(responseContent.getString("result")); + String address = + responseContent.getJSONArray("result").getJSONObject(0).getString("address").substring(2); + Assert.assertEquals(address, contractTrc20AddressFrom58.substring(2)); + topic0 = responseContent.getJSONArray("result").getJSONObject(0).getString("topic"); + } + + @Test(enabled = true, description = "Eth api of eth_getLogs both contains topic and address.") + public void test11GetLogsContainsTopicAndAddress() { + JsonArray topicArray = new JsonArray(); + topicArray.add(topic0); + JsonObject paramBody = new JsonObject(); + paramBody.add("topics", topicArray); + paramBody.addProperty("fromBlock", "0x" + (Integer.toHexString(blockNumForTrc20 - 10))); + paramBody.addProperty("toBlock", "0x" + (Integer.toHexString(blockNumForTrc20 + 10))); + JsonArray params = new JsonArray(); + params.add(paramBody); + HttpMethed.waitToProduceOneBlockFromSolidity(httpFullNode, httpsolidityNode); + JsonObject requestBody = getJsonRpcBody("eth_getLogs", params); + logger.info("test11GetLogsContainsTopicAndAddress_requestBody " + requestBody); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("test11GetLogsContainsTopicAndAddress_responseContent" + responseContent); + Assert.assertNotNull(responseContent.getString("result")); + String topicFromResult = + responseContent.getJSONArray("result").getJSONObject(0).getString("topic"); + Assert.assertEquals(topicFromResult, topic0); + } + + @Test(enabled = true, description = "Eth api of eth_getFilterLogs .") + public void test12GetFilterLogsContainsAddress() { + + JsonArray params = new JsonArray(); + params.add(newFilterResultIdfrom01); + JsonObject requestBody = getJsonRpcBody("eth_getFilterLogs", params); + logger.info("test12GetFilterLogsContainsAddress_requestBody " + requestBody); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("test12GetFilterLogsContainsAddress_responseContent" + responseContent); + Assert.assertNotNull(responseContent.getString("result")); + } + + @Test(enabled = true, description = "Eth api of eth_getFilterLogs .") + public void test13GetFilterLogsContainsTopic() { + + JsonArray params = new JsonArray(); + params.add(newFilterResultIdfrom02); + JsonObject requestBody = getJsonRpcBody("eth_getFilterLogs", params); + logger.info("test13GetFilterLogsContainsTopic_requestBody " + requestBody); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("test13GetFilterLogsContainsTopic_responseContent" + responseContent); + Assert.assertNotNull(responseContent.getString("result")); + } + + @Test( + enabled = true, + description = + "Eth api of eth_uninstallFilter which method is eth_newFilter" + + " and params has one element ") + public void test14EthUninstallFilter() { + // create ID + JsonArray addressArray = new JsonArray(); + addressArray.add(contractAddressFrom58.substring(2)); + JsonObject paramBody = new JsonObject(); + paramBody.add("address", addressArray); + paramBody.addProperty("fromBlock", "0x1f8b6a7"); + paramBody.addProperty("toBlock", "0x1f8b6a7"); + JsonArray params = new JsonArray(); + params.add(paramBody); + JsonObject requestBody = getJsonRpcBody("eth_newFilter", params); + logger.info("test14_newfilter " + requestBody); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("test14_newfilter_responseContentr" + responseContent); + String ethNewFilterResult = responseContent.get("result").toString(); + logger.info("EthNewFilterResult:" + ethNewFilterResult); + Assert.assertNotNull(responseContent.getString("result")); + + // verify ID invalid + + // first time + params = new JsonArray(); + params.add(responseContent.get("result").toString()); + requestBody = getJsonRpcBody("eth_uninstallFilter", params); + logger.info("test14_eth_uninstallFilter " + requestBody); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("test14_eth_uninstallFilter_responseContentr_first" + responseContent); + Assert.assertEquals(responseContent.get("result"), true); + // second time + logger.info("test14_eth_uninstallFilter_second " + requestBody); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("test14_eth_uninstallFilter_responseContentr_second " + responseContent); + Assert.assertEquals( + responseContent.getJSONObject("error").getString("message"), "filter not found"); + + // query getFilterChanges to verify ID has invalid + params = new JsonArray(); + params.add(ethNewFilterResult); + requestBody = getJsonRpcBody("getFilterChanges", params); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("test14EthUninstallFilter_responseContent" + responseContent); + String expectResult = "{\"code\":-32000,\"data\":\"{}\",\"message\":\"filter not found\"}"; + Assert.assertEquals(responseContent.get("error").toString(), expectResult); + } + + @Test( + enabled = true, + description = + "Eth api of eth_uninstallFilter which method is eth_newBlockFilter" + + " and params has one element ") + public void test15EthUninstallFilter() { + // create ID + + JsonArray params = new JsonArray(); + JsonObject requestBody = getJsonRpcBody("eth_newBlockFilter", params); + logger.info("test15EthUninstallFilter_newBlockFilter " + requestBody); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("test15EthUninstallFilter_newBlockFilter_responseContentr" + responseContent); + String ethNewBlockFilterResult = responseContent.get("result").toString(); + logger.info("ethNewBlockFilterResult:" + ethNewBlockFilterResult); + Assert.assertNotNull(responseContent.getString("result")); + + // verify ID invalid + // first time + params = new JsonArray(); + params.add(responseContent.get("result").toString()); + requestBody = getJsonRpcBody("eth_uninstallFilter", params); + logger.info("test15_eth_uninstallFilter " + requestBody); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("test15_eth_uninstallFilter_responseContentr_first" + responseContent); + Assert.assertEquals(responseContent.get("result"), true); + // second time + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("test15_eth_uninstallFilter_responseContentr_second" + responseContent); + Assert.assertEquals( + responseContent.getJSONObject("error").getString("message"), "filter not found"); + // query getFilterChanges to verify ID has invalid + params = new JsonArray(); + params.add(ethNewBlockFilterResult); + requestBody = getJsonRpcBody("getFilterChanges", params); + response = getJsonRpc(jsonRpcNodeForSolidity, requestBody); + responseContent = HttpMethed.parseResponseContent(response); + logger.info("test15EthUninstallFilter_responseContent" + responseContent); + String expectResult = "{\"code\":-32000,\"data\":\"{}\",\"message\":\"filter not found\"}"; + Assert.assertEquals(responseContent.get("error").toString(), expectResult); + } +} diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/EthSmartContract001.java b/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/EthSmartContract001.java index aee3436aed9..0fe564ad177 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/EthSmartContract001.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/jsonrpc/EthSmartContract001.java @@ -29,9 +29,9 @@ public void test01JsonRpcApiTestForEthCall() throws Exception { JsonObject param = new JsonObject(); param.addProperty("from", ByteArray.toHexString(jsonRpcOwnerAddress)); param.addProperty("to", trc20AddressHex); - param.addProperty("gas", "0"); - param.addProperty("gasPrice", "0"); - param.addProperty("value", "0"); + param.addProperty("gas", "0x0"); + param.addProperty("gasPrice", "0x0"); + param.addProperty("value", "0x0"); param.addProperty("data", "0x06fdde03"); JsonArray params = new JsonArray(); params.add(param); diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/manual/ContractTrc1155.java b/framework/src/test/java/stest/tron/wallet/dailybuild/manual/ContractTrc1155.java new file mode 100644 index 00000000000..d6786d6695a --- /dev/null +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/manual/ContractTrc1155.java @@ -0,0 +1,696 @@ +package stest.tron.wallet.dailybuild.manual; + +import io.grpc.ManagedChannel; +import io.grpc.ManagedChannelBuilder; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import lombok.extern.slf4j.Slf4j; +import org.bouncycastle.util.encoders.Hex; +import org.junit.Assert; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeSuite; +import org.testng.annotations.Test; +import org.tron.api.GrpcAPI; +import org.tron.api.WalletGrpc; +import org.tron.common.crypto.ECKey; +import org.tron.common.utils.ByteArray; +import org.tron.common.utils.Utils; +import org.tron.core.Wallet; +import org.tron.protos.Protocol; +import org.tron.protos.contract.SmartContractOuterClass; +import stest.tron.wallet.common.client.Configuration; +import stest.tron.wallet.common.client.Parameter; +import stest.tron.wallet.common.client.WalletClient; +import stest.tron.wallet.common.client.utils.PublicMethed; +import stest.tron.wallet.dailybuild.exceptionfee.AssertException; + +@Slf4j +public class ContractTrc1155 { + + private final String testKey002 = + Configuration.getByPath("testng.conf").getString("foundationAccount.key1"); + private final byte[] fromAddress = PublicMethed.getFinalAddress(testKey002); + private ManagedChannel channelFull = null; + private WalletGrpc.WalletBlockingStub blockingStubFull = null; + private final String fullnode = + Configuration.getByPath("testng.conf").getStringList("fullnode.ip.list").get(1); + private Long maxFeeLimit = + Configuration.getByPath("testng.conf").getLong("defaultParameter.maxFeeLimit"); + Optional infoById = null; + ECKey ecKey2 = new ECKey(Utils.getRandom()); + byte[] ownerAddressByte = ecKey2.getAddress(); + String ownerKey = ByteArray.toHexString(ecKey2.getPrivKeyBytes()); + String ownerAddressString = null; + String holderAddressString = null; + String noHolderAddress = null; + String txid = null; + byte[] trc1155AddressByte = null; + /** constructor. */ + + @BeforeSuite + public void beforeSuite() { + channelFull = ManagedChannelBuilder.forTarget(fullnode).usePlaintext(true).build(); + blockingStubFull = WalletGrpc.newBlockingStub(channelFull); + } + + /** constructor. */ + @BeforeClass(enabled = true) + public void beforeClass() throws Exception { + Wallet.setAddressPreFixByte(Parameter.CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); + deployTrc1155(); + + deployHolder(); + deployNoHolder(); + } + + @Test(enabled = true, description = "Trigger Trc1155 balanceOf method") + public void test01triggerTrc1155BalanceOfMethod() { + int coinType = 3; + List parameters = Arrays.asList(ownerAddressString, coinType); + String data = PublicMethed.parametersString(parameters); + + logger.info("data:" + data); + GrpcAPI.TransactionExtention transactionExtention = + PublicMethed.triggerConstantContractForExtention( + trc1155AddressByte, + "balanceOf(address,uint256)", + data, + false, + 0, + 0, + "0", + 0, + ownerAddressByte, + ownerKey, + blockingStubFull); + String hexBalance = Hex.toHexString(transactionExtention.getConstantResult(0).toByteArray()); + long result = Long.parseLong(hexBalance, 16); + Assert.assertEquals((long) Math.pow(10, 4), result); + } + + @Test(enabled = true, description = "Trigger Trc1155 balanceOfBatch method") + public void test02triggerTrc1155BalanceOfBatchMethod() { + List address = + Stream.of( + ownerAddressString, + ownerAddressString, + ownerAddressString, + ownerAddressString, + ownerAddressString, + ownerAddressString) + .collect(Collectors.toList()); + List coinType = Stream.of(0, 1, 2, 3, 4, 5).collect(Collectors.toList()); + List parameters = Arrays.asList(address, coinType); + String data = PublicMethed.parametersString(parameters); + logger.info("data:" + data); + GrpcAPI.TransactionExtention transactionExtention1 = + PublicMethed.triggerConstantContractForExtention( + trc1155AddressByte, + "balanceOfBatch(address[],uint256[])", + data, + false, + 0, + 0, + "0", + 0, + ownerAddressByte, + ownerKey, + blockingStubFull); + String hexBalance = Hex.toHexString(transactionExtention1.getConstantResult(0).toByteArray()); + logger.info("hexBalance:" + hexBalance); + final long trxAmount = (long) Math.pow(10, 3); + final long bttAmount = (long) Math.pow(10, 2); + final long winAmount = (long) Math.pow(10, 5); + final long sunAmount = (long) Math.pow(10, 4); + final long apenftAmount = 1L; + final long apenft1Amount = 1L; + Assert.assertEquals(trxAmount, Long.parseLong(hexBalance.substring(128, 192), 16)); + Assert.assertEquals(bttAmount, Long.parseLong(hexBalance.substring(192, 256), 16)); + Assert.assertEquals(winAmount, Long.parseLong(hexBalance.substring(256, 320), 16)); + Assert.assertEquals(sunAmount, Long.parseLong(hexBalance.substring(320, 384), 16)); + Assert.assertEquals(apenftAmount, Long.parseLong(hexBalance.substring(384, 448), 16)); + Assert.assertEquals(apenft1Amount, Long.parseLong(hexBalance.substring(448, 512), 16)); + } + + @Test(enabled = true, description = "Trigger Trc1155 safeTransferFrom function") + public void test03triggerTrc1155SafeTransferFromFunction() { + ECKey ecKey3 = new ECKey(Utils.getRandom()); + byte[] contract003Address = ecKey3.getAddress(); + String sendAddress = WalletClient.encode58Check(contract003Address); + logger.info(sendAddress); + int coinType = 3; + final int coinAmount = 2; + List parameters1 = Arrays.asList(ownerAddressString, coinType); + String data = PublicMethed.parametersString(parameters1); + logger.info("data1:" + data); + GrpcAPI.TransactionExtention transactionExtention = + PublicMethed.triggerConstantContractForExtention( + trc1155AddressByte, + "balanceOf(address,uint256)", + data, + false, + 0, + 0, + "0", + 0, + ownerAddressByte, + ownerKey, + blockingStubFull); + String hexBalance = Hex.toHexString(transactionExtention.getConstantResult(0).toByteArray()); + long result = Long.parseLong(hexBalance, 16); + Assert.assertEquals((long) Math.pow(10, 4), result); + String bytes = "0000000000000000000000000000000000e6b58be8af95e5ad97e7aca6e4b8b2"; + List parameters = + Arrays.asList(ownerAddressString, sendAddress, coinType, coinAmount, bytes); + data = PublicMethed.parametersString(parameters); + logger.info("data2:" + data); + String txid = + PublicMethed.triggerContract( + trc1155AddressByte, + "safeTransferFrom(address,address,uint256,uint256,bytes)", + data, + false, + 0, + maxFeeLimit, + ownerAddressByte, + ownerKey, + blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + logger.info(txid); + infoById = PublicMethed.getTransactionInfoById(txid, blockingStubFull); + logger.info("infobyid : --- " + infoById); + Optional byId = PublicMethed.getTransactionById(txid, blockingStubFull); + String s = ByteArray.toHexString(byId.get().getRawData().getContract(0).toByteArray()); + Assert.assertTrue(s.contains(bytes)); + + List parameters3 = Arrays.asList(ownerAddressString, coinType); + data = PublicMethed.parametersString(parameters3); + logger.info("data3:" + data); + GrpcAPI.TransactionExtention transactionExtention3 = + PublicMethed.triggerConstantContractForExtention( + trc1155AddressByte, + "balanceOf(address,uint256)", + data, + false, + 0, + 0, + "0", + 0, + ownerAddressByte, + ownerKey, + blockingStubFull); + hexBalance = Hex.toHexString(transactionExtention3.getConstantResult(0).toByteArray()); + result = Long.parseLong(hexBalance, 16); + Assert.assertEquals((long) Math.pow(10, 4) - coinAmount, result); + + parameters = Arrays.asList(sendAddress, coinType); + data = PublicMethed.parametersString(parameters); + + logger.info("data2:" + data); + transactionExtention = + PublicMethed.triggerConstantContractForExtention( + trc1155AddressByte, + "balanceOf(address,uint256)", + data, + false, + 0, + 0, + "0", + 0, + ownerAddressByte, + ownerKey, + blockingStubFull); + hexBalance = Hex.toHexString(transactionExtention.getConstantResult(0).toByteArray()); + result = Long.parseLong(hexBalance, 16); + Assert.assertEquals(coinAmount, result); + } + + @Test(enabled = true, description = "trigger Trc1155 SafeBatchTransferFrom function") + public void test04triggerTrc1155SafeBatchTransferFromFunction() { + + ECKey ecKey4 = new ECKey(Utils.getRandom()); + byte[] receiverAddress = ecKey4.getAddress(); + String sendAddress = WalletClient.encode58Check(receiverAddress); + List coinType = Stream.of(0, 1, 5).collect(Collectors.toList()); + List coinAccount = Stream.of(50, 10, 1).collect(Collectors.toList()); + String bytes = "0000000000000000000000000000000000e6b58be8af95e5ad97e7aca6e4b8b2"; + List parameters = + Arrays.asList(ownerAddressString, sendAddress, coinType, coinAccount, bytes); + String input = PublicMethed.parametersString(parameters); + logger.info("input:" + input); + String txid = + PublicMethed.triggerContract( + trc1155AddressByte, + "safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)", + input, + false, + 0, + maxFeeLimit, + ownerAddressByte, + ownerKey, + blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + logger.info(txid); + infoById = PublicMethed.getTransactionInfoById(txid, blockingStubFull); + logger.info("infobyid : --- " + infoById); + Optional byId = PublicMethed.getTransactionById(txid, blockingStubFull); + String s = ByteArray.toHexString(byId.get().getRawData().getContract(0).toByteArray()); + Assert.assertTrue(s.contains(bytes)); + List address = + Stream.of( + ownerAddressString, + ownerAddressString, + ownerAddressString, + ownerAddressString, + ownerAddressString, + ownerAddressString) + .collect(Collectors.toList()); + List coinType1 = Stream.of(0, 1, 2, 3, 4, 5).collect(Collectors.toList()); + List parameters1 = Arrays.asList(address, coinType1); + String data = PublicMethed.parametersString(parameters1); + + logger.info("data2:" + data); + GrpcAPI.TransactionExtention transactionExtention = + PublicMethed.triggerConstantContractForExtention( + trc1155AddressByte, + "balanceOfBatch(address[],uint256[])", + data, + false, + 0, + 0, + "0", + 0, + ownerAddressByte, + ownerKey, + blockingStubFull); + String hexBalance = Hex.toHexString(transactionExtention.getConstantResult(0).toByteArray()); + logger.info("hexBalance:" + hexBalance); + Assert.assertEquals( + (long) Math.pow(10, 3) - 50, Long.parseLong(hexBalance.substring(128, 192), 16)); + Assert.assertEquals( + (long) Math.pow(10, 2) - 10, Long.parseLong(hexBalance.substring(192, 256), 16)); + Assert.assertEquals((long) Math.pow(10, 5), Long.parseLong(hexBalance.substring(256, 320), 16)); + Assert.assertEquals( + (long) Math.pow(10, 4) - 2, Long.parseLong(hexBalance.substring(320, 384), 16)); + Assert.assertEquals(1, Long.parseLong(hexBalance.substring(384, 448), 16)); + Assert.assertEquals(0, Long.parseLong(hexBalance.substring(448, 512), 16)); + + address = + Stream.of( + sendAddress, + sendAddress, + ownerAddressString, + ownerAddressString, + ownerAddressString, + sendAddress) + .collect(Collectors.toList()); + coinType = Stream.of(0, 1, 2, 3, 4, 5).collect(Collectors.toList()); + parameters = Arrays.asList(address, coinType); + data = PublicMethed.parametersString(parameters); + + logger.info("data2:" + data); + transactionExtention = + PublicMethed.triggerConstantContractForExtention( + trc1155AddressByte, + "balanceOfBatch(address[],uint256[])", + data, + false, + 0, + 0, + "0", + 0, + ownerAddressByte, + ownerKey, + blockingStubFull); + hexBalance = Hex.toHexString(transactionExtention.getConstantResult(0).toByteArray()); + Assert.assertEquals(50, Long.parseLong(hexBalance.substring(128, 192), 16)); + Assert.assertEquals(10, Long.parseLong(hexBalance.substring(192, 256), 16)); + Assert.assertEquals((long) Math.pow(10, 5), Long.parseLong(hexBalance.substring(256, 320), 16)); + Assert.assertEquals( + (long) Math.pow(10, 4) - 2, Long.parseLong(hexBalance.substring(320, 384), 16)); + Assert.assertEquals(1, Long.parseLong(hexBalance.substring(384, 448), 16)); + Assert.assertEquals(1, Long.parseLong(hexBalance.substring(448, 512), 16)); + } + + @Test(enabled = true, description = "Trc1155Holder can receive trc1155") + public void test05Trc1155HolderCanReceiveTrc1155() { + List parameters = Arrays.asList(holderAddressString, true); + String data = PublicMethed.parametersString(parameters); + logger.info("data:" + data); + txid = + PublicMethed.triggerContract( + trc1155AddressByte, + "setApprovalForAll(address,bool)", + data, + false, + 0, + maxFeeLimit, + ownerAddressByte, + ownerKey, + blockingStubFull); + + PublicMethed.waitProduceNextBlock(blockingStubFull); + logger.info("setApprovalForAll_txid:" + txid); + infoById = PublicMethed.getTransactionInfoById(txid, blockingStubFull); + logger.info("infobyid : --- " + infoById); + int coinType = 0; + int coinAmount = 10; + String bytes = "0000000000000000000000000000000000e6b58be8af95e5ad97e7aca6e4b8b2"; + parameters = + Arrays.asList(ownerAddressString, holderAddressString, coinType, coinAmount, bytes); + data = PublicMethed.parametersString(parameters); + logger.info("data:" + data); + txid = + PublicMethed.triggerContract( + trc1155AddressByte, + "safeTransferFrom(address,address,uint256,uint256,bytes)", + data, + false, + 0, + maxFeeLimit, + ownerAddressByte, + ownerKey, + blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + logger.info("safeTransferFrom_txid:" + txid); + infoById = PublicMethed.getTransactionInfoById(txid, blockingStubFull); + Optional byId = PublicMethed.getTransactionById(txid, blockingStubFull); + String s = ByteArray.toHexString(byId.get().getRawData().getContract(0).toByteArray()); + Assert.assertTrue(s.contains(bytes)); + logger.info("infobyid1 : --- " + byId); + + logger.info("infobyid1 : --- " + infoById); + + parameters = Arrays.asList(holderAddressString, coinType); + data = PublicMethed.parametersString(parameters); + logger.info("data2:" + data); + GrpcAPI.TransactionExtention transactionExtention = + PublicMethed.triggerConstantContractForExtention( + trc1155AddressByte, + "balanceOf(address,uint256)", + data, + false, + 0, + 0, + "0", + 0, + ownerAddressByte, + ownerKey, + blockingStubFull); + + String hexBalance = Hex.toHexString(transactionExtention.getConstantResult(0).toByteArray()); + long result = Long.parseLong(hexBalance, 16); + Assert.assertEquals(coinAmount, result); + } + + @Test(enabled = true, description = "Trc1155Holder can receive trc1155[]") + public void test06Trc1155HolderCanReceiveTrc1155_01() { + + List parameters = Arrays.asList(holderAddressString, true); + String data = PublicMethed.parametersString(parameters); + logger.info("data:" + data); + txid = + PublicMethed.triggerContract( + trc1155AddressByte, + "setApprovalForAll(address,bool)", + data, + false, + 0, + maxFeeLimit, + ownerAddressByte, + ownerKey, + blockingStubFull); + + PublicMethed.waitProduceNextBlock(blockingStubFull); + logger.info("setApprovalForAll_txid:" + txid); + infoById = PublicMethed.getTransactionInfoById(txid, blockingStubFull); + logger.info("infobyid : --- " + infoById); + int trxAmount = 50; + int bttAmount = 30; + int winAmount = 25; + int sunAmount = 10; + int apenftAmount = 1; + List coinType = Stream.of(0, 1, 2, 3, 4).collect(Collectors.toList()); + List coinAmount = + Stream.of(trxAmount, bttAmount, winAmount, sunAmount, apenftAmount) + .collect(Collectors.toList()); + String bytes = "0000000000000000000000000000000000e6b58be8af95e5ad97e7aca6e4b8b2"; + parameters = + Arrays.asList(ownerAddressString, holderAddressString, coinType, coinAmount, bytes); + data = PublicMethed.parametersString(parameters); + logger.info("data1:" + data); + txid = + PublicMethed.triggerContract( + trc1155AddressByte, + "safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)", + data, + false, + 0, + maxFeeLimit, + ownerAddressByte, + ownerKey, + blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + logger.info("safeBatchTransferFrom_txid:" + txid); + infoById = PublicMethed.getTransactionInfoById(txid, blockingStubFull); + logger.info("infobyid1 : --- " + infoById); + Optional byId = PublicMethed.getTransactionById(txid, blockingStubFull); + String s = ByteArray.toHexString(byId.get().getRawData().getContract(0).toByteArray()); + Assert.assertTrue(s.contains(bytes)); + List address = + Stream.of( + holderAddressString, + holderAddressString, + holderAddressString, + holderAddressString, + holderAddressString, + holderAddressString) + .collect(Collectors.toList()); + coinType = Stream.of(0, 1, 2, 3, 4, 5).collect(Collectors.toList()); + parameters = Arrays.asList(address, coinType); + data = PublicMethed.parametersString(parameters); + logger.info("data2:" + data); + GrpcAPI.TransactionExtention transactionExtention = + PublicMethed.triggerConstantContractForExtention( + trc1155AddressByte, + "balanceOfBatch(address[],uint256[])", + data, + false, + 0, + 0, + "0", + 0, + ownerAddressByte, + ownerKey, + blockingStubFull); + String hexBalance = Hex.toHexString(transactionExtention.getConstantResult(0).toByteArray()); + Assert.assertEquals(trxAmount + 10, Long.parseLong(hexBalance.substring(128, 192), 16)); + Assert.assertEquals(bttAmount, Long.parseLong(hexBalance.substring(192, 256), 16)); + Assert.assertEquals(winAmount, Long.parseLong(hexBalance.substring(256, 320), 16)); + Assert.assertEquals(sunAmount, Long.parseLong(hexBalance.substring(320, 384), 16)); + Assert.assertEquals(apenftAmount, Long.parseLong(hexBalance.substring(384, 448), 16)); + Assert.assertEquals(0, Long.parseLong(hexBalance.substring(448, 512), 16)); + } + + @Test(enabled = true, description = "Non-trc1155Holder can not receive trc1155") + public void test07NonTrc1155HolderCanNotReceiveTrc1155() { + List parameters = Arrays.asList(noHolderAddress, true); + String data = PublicMethed.parametersString(parameters); + logger.info("data:" + data); + txid = + PublicMethed.triggerContract( + trc1155AddressByte, + "setApprovalForAll(address,bool)", + data, + false, + 0, + maxFeeLimit, + ownerAddressByte, + ownerKey, + blockingStubFull); + + PublicMethed.waitProduceNextBlock(blockingStubFull); + logger.info("setApprovalForAll_txid:" + txid); + infoById = PublicMethed.getTransactionInfoById(txid, blockingStubFull); + logger.info("infobyid : --- " + infoById); + String bytes = "0000000000000000000000000000000000e6b58be8af95e5ad97e7aca6e4b8b2"; + List parameters1 = Arrays.asList(ownerAddressString, noHolderAddress, 1, 1, bytes); + String data1 = PublicMethed.parametersString(parameters1); + logger.info("data:" + data1); + txid = + PublicMethed.triggerContract( + trc1155AddressByte, + "safeTransferFrom(address,address,uint256,uint256,bytes)", + data1, + false, + 0, + maxFeeLimit, + ownerAddressByte, + ownerKey, + blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + logger.info("safeTransferFrom_txid:" + txid); + infoById = PublicMethed.getTransactionInfoById(txid, blockingStubFull); + logger.info("infobyid1 : --- " + infoById); + parameters = Arrays.asList(noHolderAddress, 1); + data = PublicMethed.parametersString(parameters); + logger.info("data2:" + data); + GrpcAPI.TransactionExtention transactionExtention1 = + PublicMethed.triggerConstantContractForExtention( + trc1155AddressByte, + "balanceOf(address,uint256)", + data, + false, + 0, + 0, + "0", + 0, + ownerAddressByte, + ownerKey, + blockingStubFull); + + String hexBalance = Hex.toHexString(transactionExtention1.getConstantResult(0).toByteArray()); + long result = Long.parseLong(hexBalance, 16); + Assert.assertEquals(0, result); + } + + /** constructor. */ + public void deployTrc1155() throws Exception { + Assert.assertTrue( + PublicMethed.sendcoin( + ownerAddressByte, 500000000000L, fromAddress, testKey002, blockingStubFull)); + PublicMethed.waitProduceNextBlock(blockingStubFull); + String contractName = "TronCoins"; + String filePath = "./src/test/resources/soliditycode/contractTrc1155.sol"; + HashMap retMap = PublicMethed.getBycodeAbi(filePath, contractName); + + String code = retMap.get("byteCode").toString(); + String abi = retMap.get("abI").toString(); + + int deploySuccessFlag = 1; + Integer retryTimes = 5; + + while (retryTimes-- > 0 && deploySuccessFlag != 0) { + String txid = + PublicMethed.deployContractAndGetTransactionInfoById( + contractName, + abi, + code, + "", + maxFeeLimit, + 0L, + 100, + null, + ownerKey, + ownerAddressByte, + blockingStubFull); + + PublicMethed.waitProduceNextBlock(blockingStubFull); + + logger.info("Deploy IssueCoins txid:" + txid); + Optional infoById = + PublicMethed.getTransactionInfoById(txid, blockingStubFull); + com.google.protobuf.ByteString contractAddress = infoById.get().getContractAddress(); + SmartContractOuterClass.SmartContract smartContract = + PublicMethed.getContract(contractAddress.toByteArray(), blockingStubFull); + logger.info("smartContract:" + smartContract); + trc1155AddressByte = contractAddress.toByteArray(); + ownerAddressString = WalletClient.encode58Check(ownerAddressByte); + logger.info("trc1155AddressByte:" + trc1155AddressByte); + logger.info("ownerAddressString:" + ownerAddressString); + deploySuccessFlag = infoById.get().getResult().getNumber(); + } + + Assert.assertEquals(deploySuccessFlag, 0); + } + + /** constructor. */ + public void deployHolder() throws Exception { + String contractName = "MyContractCanReceiver"; + String filePath = "./src/test/resources/soliditycode/contractTrc1155.sol"; + HashMap retMap = PublicMethed.getBycodeAbi(filePath, contractName); + + String code = retMap.get("byteCode").toString(); + String abi = retMap.get("abI").toString(); + + String txid = + PublicMethed.deployContractAndGetTransactionInfoById( + contractName, + abi, + code, + "", + maxFeeLimit, + 0L, + 100, + null, + ownerKey, + ownerAddressByte, + blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + + logger.info("Deploy IssueCoins txid:" + txid); + Optional infoById = + PublicMethed.getTransactionInfoById(txid, blockingStubFull); + com.google.protobuf.ByteString contractAddress = infoById.get().getContractAddress(); + SmartContractOuterClass.SmartContract smartContract = + PublicMethed.getContract(contractAddress.toByteArray(), blockingStubFull); + + holderAddressString = WalletClient.encode58Check(contractAddress.toByteArray()); + + logger.info("HolderAddress:" + holderAddressString); + Assert.assertTrue(smartContract.getAbi() != null); + Assert.assertEquals(infoById.get().getResult().getNumber(), 0); + } + + /** constructor. */ + public void deployNoHolder() throws Exception { + String contractName = "MyContractCanNotReceiver"; + String filePath = "./src/test/resources/soliditycode/contractTrc1155.sol"; + HashMap retMap = PublicMethed.getBycodeAbi(filePath, contractName); + + String code = retMap.get("byteCode").toString(); + String abi = retMap.get("abI").toString(); + + String txid = + PublicMethed.deployContractAndGetTransactionInfoById( + contractName, + abi, + code, + "", + maxFeeLimit, + 0L, + 100, + null, + ownerKey, + ownerAddressByte, + blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + + logger.info("Deploy IssueCoins txid:" + txid); + Optional infoById = + PublicMethed.getTransactionInfoById(txid, blockingStubFull); + com.google.protobuf.ByteString contractAddress = infoById.get().getContractAddress(); + SmartContractOuterClass.SmartContract smartContract = + PublicMethed.getContract(contractAddress.toByteArray(), blockingStubFull); + + noHolderAddress = WalletClient.encode58Check(contractAddress.toByteArray()); + logger.info("NoHolderAddress:" + noHolderAddress); + Assert.assertTrue(smartContract.getAbi() != null); + Assert.assertEquals(infoById.get().getResult().getNumber(), 0); + } + + /** constructor. */ + @AfterClass + public void shutdown() throws InterruptedException { + PublicMethed.freedResource(fromAddress, ownerKey, ownerAddressByte, blockingStubFull); + if (channelFull != null) { + channelFull.shutdown().awaitTermination(5, TimeUnit.SECONDS); + } + } +} diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/Opcode.java b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/Opcode.java new file mode 100644 index 00000000000..65515d6db51 --- /dev/null +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/newGrammar/Opcode.java @@ -0,0 +1,509 @@ +package stest.tron.wallet.dailybuild.tvmnewcommand.newGrammar; + +import io.grpc.ManagedChannel; +import io.grpc.ManagedChannelBuilder; +import java.util.HashMap; +import java.util.Optional; +import java.util.concurrent.TimeUnit; +import lombok.extern.slf4j.Slf4j; +import org.junit.Assert; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeSuite; +import org.testng.annotations.Test; +import org.tron.api.GrpcAPI; +import org.tron.api.WalletGrpc; +import org.tron.common.crypto.ECKey; +import org.tron.common.utils.ByteArray; +import org.tron.common.utils.Utils; +import org.tron.core.Wallet; +import org.tron.protos.Protocol; +import org.tron.protos.contract.SmartContractOuterClass; +import stest.tron.wallet.common.client.Configuration; +import stest.tron.wallet.common.client.Parameter; +import stest.tron.wallet.common.client.utils.Base58; +import stest.tron.wallet.common.client.utils.PublicMethed; + + + +@Slf4j +public class Opcode { + + private final String testNetAccountKey = Configuration.getByPath("testng.conf") + .getString("foundationAccount.key2"); + private final byte[] testNetAccountAddress = PublicMethed.getFinalAddress(testNetAccountKey); + byte[] mapKeyContract = null; + ECKey ecKey1 = new ECKey(Utils.getRandom()); + byte[] contractExcAddress = ecKey1.getAddress(); + String contractExcKey = ByteArray.toHexString(ecKey1.getPrivKeyBytes()); + private Long maxFeeLimit = Configuration.getByPath("testng.conf") + .getLong("defaultParameter.maxFeeLimit"); + private ManagedChannel channelFull = null; + private WalletGrpc.WalletBlockingStub blockingStubFull = null; + + private String fullnode = Configuration.getByPath("testng.conf") + .getStringList("fullnode.ip.list").get(0); + + @BeforeSuite + public void beforeSuite() { + Wallet wallet = new Wallet(); + Wallet.setAddressPreFixByte(Parameter.CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); + } + + /** + * constructor. + */ + + @BeforeClass(enabled = true) + public void beforeClass() { + PublicMethed.printAddress(contractExcKey); + channelFull = ManagedChannelBuilder.forTarget(fullnode) + .usePlaintext(true) + .build(); + blockingStubFull = WalletGrpc.newBlockingStub(channelFull); + + Assert.assertTrue(PublicMethed + .sendcoin(contractExcAddress, 300100_000_000L, + testNetAccountAddress, testNetAccountKey, blockingStubFull)); + PublicMethed.waitProduceNextBlock(blockingStubFull); + + String filePath = "src/test/resources/soliditycode/opCode.sol"; + String contractName = "A"; + HashMap retMap = PublicMethed.getBycodeAbiNoOptimize(filePath, contractName); + String code = retMap.get("byteCode").toString(); + String abi = retMap.get("abI").toString(); + mapKeyContract = PublicMethed.deployContract(contractName, abi, code, "", maxFeeLimit, + 0L, 100, null, contractExcKey, + contractExcAddress, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + SmartContractOuterClass.SmartContract smartContract = PublicMethed.getContract(mapKeyContract, + blockingStubFull); + Assert.assertNotNull(smartContract.getAbi()); + + } + + + @Test(enabled = true, description = "test opcode smod, used for int") + public void test01Smod() { + GrpcAPI.TransactionExtention transactionExtention = PublicMethed + .triggerConstantContractForExtention(mapKeyContract, + "sssmod()", "#", true, + 0, maxFeeLimit, "0", 0, contractExcAddress, contractExcKey, blockingStubFull); + Protocol.Transaction transaction = transactionExtention.getTransaction(); + int trueRes = ByteArray.toInt(transactionExtention.getConstantResult(0).toByteArray()); + logger.info("truerRes: " + trueRes + " message:" + transaction.getRet(0).getRet()); + Assert.assertEquals(1, trueRes); + } + + @Test(enabled = true, description = "test opcode extcodecopy return contract bytecode") + public void test02Extcodecopy() { + String base58 = Base58.encode58Check(mapKeyContract); + String txid = PublicMethed.triggerContract(mapKeyContract, + "eextcodecopy(address)", "\"" + base58 + "\"", false, + 0, maxFeeLimit, "0", 0, contractExcAddress, contractExcKey, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + Optional infoById = PublicMethed + .getTransactionInfoById(txid, blockingStubFull); + logger.info("txid: " + txid + "\n" + infoById.toString()); + Assert.assertEquals(0, infoById.get().getResultValue()); + Assert.assertTrue(ByteArray.toHexString( + infoById.get().getContractResult(0).toByteArray()).length() > 0); + + } + + @Test(enabled = true, description = "test opcode coinbase," + + "block.coinbase is sr address which produced the block") + public void test03Coinbase() { + GrpcAPI.TransactionExtention transactionExtention = PublicMethed + .triggerConstantContractForExtention(mapKeyContract, + "cccoinbase()", "#", true, + 0, maxFeeLimit, "0", 0, contractExcAddress, contractExcKey, blockingStubFull); + Protocol.Transaction transaction = transactionExtention.getTransaction(); + String trueRes = ByteArray.toHexString(transactionExtention.getConstantResult(0).toByteArray()); + logger.info("truerRes: " + trueRes + " message:" + transaction.getRet(0).getRet()); + Assert.assertEquals("SUCESS", transaction.getRet(0).getRet().toString()); + Assert.assertTrue(trueRes.startsWith("00000000000000000000000" + + "0bafb56091591790e00aa05eaddcc7dc1474b5d4b") + || trueRes.startsWith("0000000000000000000000000be88a918d74d0dfd71dc84bd4abf036d0562991")); + + } + + @Test(enabled = true, description = "test opcode difficulty,block.difficulty is always 0") + public void test04Difficulty() { + GrpcAPI.TransactionExtention transactionExtention = PublicMethed + .triggerConstantContractForExtention(mapKeyContract, + "ddifficulty()", "#", true, + 0, maxFeeLimit, "0", 0, contractExcAddress, contractExcKey, blockingStubFull); + Protocol.Transaction transaction = transactionExtention.getTransaction(); + int trueRes = ByteArray.toInt(transactionExtention.getConstantResult(0).toByteArray()); + logger.info("truerRes: " + trueRes + " message:" + transaction.getRet(0).getRet()); + Assert.assertEquals("SUCESS", transaction.getRet(0).getRet().toString()); + Assert.assertEquals(0, trueRes); + + } + + @Test(enabled = true, description = "test opcode gaslimit,block.gaslimit is always 0") + public void test05Gaslimit() { + GrpcAPI.TransactionExtention transactionExtention = PublicMethed + .triggerConstantContractForExtention(mapKeyContract, + "gggaslimit()", "#", true, + 0, maxFeeLimit, "0", 0, contractExcAddress, contractExcKey, blockingStubFull); + Protocol.Transaction transaction = transactionExtention.getTransaction(); + int trueRes = ByteArray.toInt(transactionExtention.getConstantResult(0).toByteArray()); + logger.info("truerRes: " + trueRes + " message:" + transaction.getRet(0).getRet()); + Assert.assertEquals("SUCESS", transaction.getRet(0).getRet().toString()); + Assert.assertEquals(0, trueRes); + + } + + @Test(enabled = true, description = "test opcode pc,return current position, " + + "ppppc() can refer to opCode.sol") + public void test06Pc() { + String code = "608060405260838060116000396000f3fe608060405234" + + "8015600f57600080fd5b506004361060285760003560e01c806" + + "36d3a027714602d575b600080fd5b60336045565b6040805191825251" + + "9081900360200190f35b60005890509056fea264697" + + "0667358221220fe03cbd3d2aae7454565f203b9abd76ce74cf0ac" + + "a079b151cf6b8e2bfda2d5c464736f6c634300060c0033"; + String abi = "[\n" + + "\t{\n" + + "\t\t\"inputs\": [],\n" + + "\t\t\"stateMutability\": \"payable\",\n" + + "\t\t\"type\": \"constructor\"\n" + + "\t},\n" + + "\t{\n" + + "\t\t\"inputs\": [],\n" + + "\t\t\"name\": \"ppppc\",\n" + + "\t\t\"outputs\": [\n" + + "\t\t\t{\n" + + "\t\t\t\t\"internalType\": \"uint256\",\n" + + "\t\t\t\t\"name\": \"a\",\n" + + "\t\t\t\t\"type\": \"uint256\"\n" + + "\t\t\t}\n" + + "\t\t],\n" + + "\t\t\"stateMutability\": \"nonpayable\",\n" + + "\t\t\"type\": \"function\"\n" + + "\t}\n" + + "]"; + byte[] temContract = PublicMethed.deployContract("A", abi, code, "", maxFeeLimit, + 0L, 100, null, contractExcKey, + contractExcAddress, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + SmartContractOuterClass.SmartContract smartContract = PublicMethed.getContract(temContract, + blockingStubFull); + Assert.assertNotNull(smartContract.getAbi()); + + GrpcAPI.TransactionExtention transactionExtention = PublicMethed + .triggerConstantContractForExtention(temContract, + "ppppc()", "#", true, + 0, maxFeeLimit, "0", 0, contractExcAddress, contractExcKey, blockingStubFull); + Protocol.Transaction transaction = transactionExtention.getTransaction(); + int trueRes = ByteArray.toInt(transactionExtention.getConstantResult(0).toByteArray()); + logger.info("truerRes: " + trueRes + " message:" + transaction.getRet(0).getRet()); + Assert.assertEquals("SUCESS", transaction.getRet(0).getRet().toString()); + Assert.assertEquals(72, trueRes); + + } + + @Test(enabled = true, description = "test opcode msize,return size of memory, " + + "msize cannot be used if optimize is open, mmmsize() can refer to opCode.sol") + public void test07Msize() { + String code = "608060405260b5806100126000396000f3fe6080604052348015600f5760" + + "0080fd5b506004361060285760003560e01c8063bf1a725d14602d575b600080fd5b60" + + "336047565b604051603e9190605c565b60405180910390f35b600059905090565b6056" + + "816075565b82525050565b6000602082019050606f6000830184604f565b9291505056" + + "5b600081905091905056fea26469706673582212202252652aad4bca9a4aa9db179e03" + + "f7b3bf439f47152e31f45d8587b710bce79664736f6c63430008060033"; + String abi = "[\n" + + "\t{\n" + + "\t\t\"inputs\": [],\n" + + "\t\t\"stateMutability\": \"payable\",\n" + + "\t\t\"type\": \"constructor\"\n" + + "\t},\n" + + "\t{\n" + + "\t\t\"inputs\": [],\n" + + "\t\t\"name\": \"mmmsize\",\n" + + "\t\t\"outputs\": [\n" + + "\t\t\t{\n" + + "\t\t\t\t\"internalType\": \"uint256\",\n" + + "\t\t\t\t\"name\": \"a\",\n" + + "\t\t\t\t\"type\": \"uint256\"\n" + + "\t\t\t}\n" + + "\t\t],\n" + + "\t\t\"stateMutability\": \"nonpayable\",\n" + + "\t\t\"type\": \"function\"\n" + + "\t}\n" + + "]"; + byte[] temContract = PublicMethed.deployContract("A", abi, code, "", maxFeeLimit, + 0L, 100, null, contractExcKey, + contractExcAddress, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + SmartContractOuterClass.SmartContract smartContract = PublicMethed.getContract(temContract, + blockingStubFull); + Assert.assertNotNull(smartContract.getAbi()); + + GrpcAPI.TransactionExtention transactionExtention = PublicMethed + .triggerConstantContractForExtention(temContract, + "mmmsize()", "#", true, + 0, maxFeeLimit, "0", 0, contractExcAddress, contractExcKey, blockingStubFull); + Protocol.Transaction transaction = transactionExtention.getTransaction(); + int trueRes = ByteArray.toInt(transactionExtention.getConstantResult(0).toByteArray()); + logger.info("truerRes: " + trueRes + " message:" + transaction.getRet(0).getRet()); + Assert.assertEquals("SUCESS", transaction.getRet(0).getRet().toString()); + Assert.assertEquals(96, trueRes); + + } + + + @Test(enabled = true, description = "test opcode swap14-16,solidity cannot use optimize") + public void test08Swap() { + GrpcAPI.TransactionExtention transactionExtention = PublicMethed + .triggerConstantContractForExtention(mapKeyContract, + "ssswap()", "#", true, + 0, maxFeeLimit, "0", 0, contractExcAddress, contractExcKey, blockingStubFull); + Protocol.Transaction transaction = transactionExtention.getTransaction(); + int trueRes = ByteArray.toInt(transactionExtention.getConstantResult(0).toByteArray()); + logger.info("truerRes: " + trueRes + " message:" + transaction.getRet(0).getRet()); + Assert.assertEquals("SUCESS", transaction.getRet(0).getRet().toString()); + Assert.assertEquals(1, trueRes); + + } + + @Test(enabled = true, description = "test opcode push13-30 but exclude push20 and push29," + + "solidity cannot use optimize") + public void test08Pushx() { + GrpcAPI.TransactionExtention transactionExtention = PublicMethed + .triggerConstantContractForExtention(mapKeyContract, + "pppushx()", "#", true, + 0, maxFeeLimit, "0", 0, contractExcAddress, contractExcKey, blockingStubFull); + Protocol.Transaction transaction = transactionExtention.getTransaction(); + String trueRes = ByteArray.toHexString(transactionExtention.getConstantResult(0).toByteArray()); + logger.info("truerRes: " + trueRes + " message:" + transaction.getRet(0).getRet()); + Assert.assertEquals("SUCESS", transaction.getRet(0).getRet().toString()); + Assert.assertTrue(trueRes.contains("000000000000000000000000000000000000001" + + "1223344556677889900112233")); + } + + @Test(enabled = true, description = "test opcode callcode,difference with delegatecall " + + "is caller and callvalue,the bytecode is compiled with solidity 0.4.22, " + + "can refer to opCode.sol for code") + public void test09Callcode() { + String code = "60806040526103b4806100136000396000f3006080604052600436106100565763" + + "ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416634" + + "cb335db811461005b578063ae02d91d14610081578063ea856db2146100a5575b600080fd5b61007f" + + "73ffffffffffffffffffffffffffffffffffffffff600435166024356100c9565b005b61007f73ffff" + + "ffffffffffffffffffffffffffffffffffff600435166024356101b6565b61007f73ffffffffffffff" + + "ffffffffffffffffffffffffff600435166024356102a3565b604080516024808201849052825180830" + + "39091018152604490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffff" + + "ffffffffffff167f66c99139000000000000000000000000000000000000000000000000000000001781529" + + "151815173ffffffffffffffffffffffffffffffffffffffff861693600a93929182919080838360005b8" + + "3811015610170578181015183820152602001610158565b50505050905090810190601f16801561019d5" + + "780820380516001836020036101000a031916815260200191505b5091505060006040518083038185875" + + "af1505050505050565b60408051602480820184905282518083039091018152604490910182526020810" + + "180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f66c99139000000000" + + "000000000000000000000000000000000000000000000001781529151815173fffffffffffffffffffff" + + "fffffffffffffffffff861693600a93929182919080838360005b8381101561025d57818101518382015" + + "2602001610245565b50505050905090810190601f16801561028a5780820380516001836020036101000" + + "a031916815260200191505b5091505060006040518083038185875af2505050505050565b60408051602" + + "480820184905282518083039091018152604490910182526020810180517bfffffffffffffffffffffff" + + "fffffffffffffffffffffffffffffffff167f66c991390000000000000000000000000000000000000000" + + "00000000000000001781529151815173ffffffffffffffffffffffffffffffffffffffff8616938291808" + + "38360005b8381101561034457818101518382015260200161032c565b50505050905090810190601f1680" + + "156103715780820380516001836020036101000a031916815260200191505b50915050600060405180830" + + "381855af450505050505600a165627a7a72305820210d132d0c4006264ef113f342556c616d9e69acc20" + + "bfa80cf440a4eac170de80029"; + String abi = "[\n" + + "\t{\n" + + "\t\t\"constant\": false,\n" + + "\t\t\"inputs\": [\n" + + "\t\t\t{\n" + + "\t\t\t\t\"name\": \"callCAddress\",\n" + + "\t\t\t\t\"type\": \"address\"\n" + + "\t\t\t},\n" + + "\t\t\t{\n" + + "\t\t\t\t\"name\": \"amount\",\n" + + "\t\t\t\t\"type\": \"uint256\"\n" + + "\t\t\t}\n" + + "\t\t],\n" + + "\t\t\"name\": \"testInCall\",\n" + + "\t\t\"outputs\": [],\n" + + "\t\t\"payable\": true,\n" + + "\t\t\"stateMutability\": \"payable\",\n" + + "\t\t\"type\": \"function\"\n" + + "\t},\n" + + "\t{\n" + + "\t\t\"constant\": false,\n" + + "\t\t\"inputs\": [\n" + + "\t\t\t{\n" + + "\t\t\t\t\"name\": \"callCAddress\",\n" + + "\t\t\t\t\"type\": \"address\"\n" + + "\t\t\t},\n" + + "\t\t\t{\n" + + "\t\t\t\t\"name\": \"amount\",\n" + + "\t\t\t\t\"type\": \"uint256\"\n" + + "\t\t\t}\n" + + "\t\t],\n" + + "\t\t\"name\": \"testInCallcode\",\n" + + "\t\t\"outputs\": [],\n" + + "\t\t\"payable\": true,\n" + + "\t\t\"stateMutability\": \"payable\",\n" + + "\t\t\"type\": \"function\"\n" + + "\t},\n" + + "\t{\n" + + "\t\t\"constant\": false,\n" + + "\t\t\"inputs\": [\n" + + "\t\t\t{\n" + + "\t\t\t\t\"name\": \"callCAddress\",\n" + + "\t\t\t\t\"type\": \"address\"\n" + + "\t\t\t},\n" + + "\t\t\t{\n" + + "\t\t\t\t\"name\": \"amount\",\n" + + "\t\t\t\t\"type\": \"uint256\"\n" + + "\t\t\t}\n" + + "\t\t],\n" + + "\t\t\"name\": \"testIndelegateCall\",\n" + + "\t\t\"outputs\": [],\n" + + "\t\t\"payable\": true,\n" + + "\t\t\"stateMutability\": \"payable\",\n" + + "\t\t\"type\": \"function\"\n" + + "\t},\n" + + "\t{\n" + + "\t\t\"inputs\": [],\n" + + "\t\t\"payable\": true,\n" + + "\t\t\"stateMutability\": \"payable\",\n" + + "\t\t\"type\": \"constructor\"\n" + + "\t}\n" + + "]"; + byte[] contractA = PublicMethed.deployContract("A", abi, code, "", maxFeeLimit, + 1000000L, 100, null, contractExcKey, + contractExcAddress, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + SmartContractOuterClass.SmartContract smartContract = PublicMethed.getContract(contractA, + blockingStubFull); + Assert.assertNotNull(smartContract.getAbi()); + + code = "608060405260d2806100126000396000f300608060405260043610603e5763ffffffff7c0" + + "10000000000000000000000000000000000000000000000000000000060003504166366c99" + + "13981146043575b600080fd5b604c600435604e565b005b6040805173fffffffffffffffff" + + "fffffffffffffffffffffff3316815234602082015280820183905290517fac74fdf75f0e5" + + "a43f870f7135801b44f404be82b1dcad73423c542b840d1d64b9181900360600190a150560" + + "0a165627a7a72305820c460a35f70e363777be22b3a4ace5f95533de626073ab4e06d9bf3bbb2cffceb0029"; + abi = "[\n" + + "\t{\n" + + "\t\t\"constant\": false,\n" + + "\t\t\"inputs\": [\n" + + "\t\t\t{\n" + + "\t\t\t\t\"name\": \"amount\",\n" + + "\t\t\t\t\"type\": \"uint256\"\n" + + "\t\t\t}\n" + + "\t\t],\n" + + "\t\t\"name\": \"trans\",\n" + + "\t\t\"outputs\": [],\n" + + "\t\t\"payable\": true,\n" + + "\t\t\"stateMutability\": \"payable\",\n" + + "\t\t\"type\": \"function\"\n" + + "\t},\n" + + "\t{\n" + + "\t\t\"inputs\": [],\n" + + "\t\t\"payable\": true,\n" + + "\t\t\"stateMutability\": \"payable\",\n" + + "\t\t\"type\": \"constructor\"\n" + + "\t},\n" + + "\t{\n" + + "\t\t\"anonymous\": false,\n" + + "\t\t\"inputs\": [\n" + + "\t\t\t{\n" + + "\t\t\t\t\"indexed\": false,\n" + + "\t\t\t\t\"name\": \"\",\n" + + "\t\t\t\t\"type\": \"address\"\n" + + "\t\t\t},\n" + + "\t\t\t{\n" + + "\t\t\t\t\"indexed\": false,\n" + + "\t\t\t\t\"name\": \"\",\n" + + "\t\t\t\t\"type\": \"uint256\"\n" + + "\t\t\t},\n" + + "\t\t\t{\n" + + "\t\t\t\t\"indexed\": false,\n" + + "\t\t\t\t\"name\": \"\",\n" + + "\t\t\t\t\"type\": \"uint256\"\n" + + "\t\t\t}\n" + + "\t\t],\n" + + "\t\t\"name\": \"clog\",\n" + + "\t\t\"type\": \"event\"\n" + + "\t}\n" + + "]"; + byte[] contractC = PublicMethed.deployContract("C", abi, code, "", maxFeeLimit, + 0L, 100, null, contractExcKey, + contractExcAddress, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + smartContract = PublicMethed.getContract(contractC, + blockingStubFull); + Assert.assertNotNull(smartContract.getAbi()); + + String base58C = Base58.encode58Check(contractC); + + String txid = PublicMethed.triggerContract(contractA, + "testInCall(address,uint256)", "\"" + base58C + "\",1", false, + 1, maxFeeLimit, "0", 0, contractExcAddress, contractExcKey, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + Optional infoById = PublicMethed + .getTransactionInfoById(txid, blockingStubFull); + Assert.assertEquals(0, infoById.get().getResultValue()); + String logRes = ByteArray.toHexString(infoById.get().getLog(0).getData().toByteArray()); + System.out.println("000000: " + logRes); + String b = "41" + logRes.substring(24, 64); + String c = logRes.substring(64, 128); + String x = ByteArray.toHexString(contractA); + Assert.assertEquals(b, x); + Assert.assertEquals("000000000000000000000000000000000000000000000000000000000000000a", c); + + txid = PublicMethed.triggerContract(contractA, + "testIndelegateCall(address,uint256)", "\"" + base58C + "\",1", false, + 2, maxFeeLimit, "0", 0, contractExcAddress, contractExcKey, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + infoById = PublicMethed + .getTransactionInfoById(txid, blockingStubFull); + logger.info("txid: " + txid + "\n" + infoById.toString()); + Assert.assertEquals(0, infoById.get().getResultValue()); + logRes = ByteArray.toHexString(infoById.get().getLog(0).getData().toByteArray()); + System.out.println("000000: " + logRes); + b = "41" + logRes.substring(24, 64); + c = logRes.substring(64, 128); + x = ByteArray.toHexString(contractExcAddress); + Assert.assertEquals(b, x); + Assert.assertEquals("0000000000000000000000000000000000000000000000000000000000000002", c); + + + txid = PublicMethed.triggerContract(contractA, + "testInCallcode(address,uint256)", "\"" + base58C + "\",1", false, + 3, maxFeeLimit, "0", 0, contractExcAddress, contractExcKey, blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + infoById = PublicMethed + .getTransactionInfoById(txid, blockingStubFull); + logger.info("txid: " + txid + "\n" + infoById.toString()); + Assert.assertEquals(0, infoById.get().getResultValue()); + logRes = ByteArray.toHexString(infoById.get().getLog(0).getData().toByteArray()); + System.out.println("000000: " + logRes); + b = "41" + logRes.substring(24, 64); + c = logRes.substring(64, 128); + x = ByteArray.toHexString(contractA); + Assert.assertEquals(b, x); + Assert.assertEquals("000000000000000000000000000000000000000000000000000000000000000a", c); + } + + + /** + * constructor. + */ + @AfterClass + public void shutdown() throws InterruptedException { + PublicMethed.freedResource(contractExcAddress, contractExcKey, + testNetAccountAddress, blockingStubFull); + if (channelFull != null) { + channelFull.shutdown().awaitTermination(5, TimeUnit.SECONDS); + } + } + + +} + diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/transferfailed/TransferFailed001.java b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/transferfailed/TransferFailed001.java index 3587ea7396d..4d7505ed91e 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/transferfailed/TransferFailed001.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/transferfailed/TransferFailed001.java @@ -325,7 +325,7 @@ public void test003TransferTrxNonexistentTarget() { Assert.assertEquals(2, nonexistentAddressAccount.getBalance()); Assert.assertEquals(0, infoById.get().getResultValue()); - Assert.assertEquals(energyUsageTotal2 + EnergyCost.getInstance().getNewAcctCall(), + Assert.assertEquals(energyUsageTotal2 + EnergyCost.getNewAcctCall(), energyUsageTotal); } @@ -899,7 +899,7 @@ public void test010TransferRevert() { Assert.assertTrue(beforeEnergyUsed + energyUsed >= afterEnergyUsed); Assert.assertTrue(beforeFreeNetUsed + netUsed >= afterFreeNetUsed); Assert.assertTrue(beforeNetUsed + netUsed >= afterNetUsed); - Assert.assertTrue(energyUsageTotal > EnergyCost.getInstance().getNewAcctCall()); + Assert.assertTrue(energyUsageTotal > EnergyCost.getNewAcctCall()); } /** diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/transferfailed/TransferFailed002.java b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/transferfailed/TransferFailed002.java index e175251934d..1dcb5b04a9f 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/transferfailed/TransferFailed002.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/transferfailed/TransferFailed002.java @@ -303,7 +303,7 @@ public void test3SendTrxNonexistentTarget() { Assert.assertEquals(0, infoById.get().getResultValue()); Assert.assertNotEquals(energyUsageTotal2, - energyUsageTotal + EnergyCost.getInstance().getNewAcctCall()); + energyUsageTotal + EnergyCost.getNewAcctCall()); nonexistentAddressAccount = PublicMethed.queryAccount(nonexistentAddress, blockingStubFull1); Assert.assertEquals(2, nonexistentAddressAccount.getBalance()); @@ -559,7 +559,7 @@ public void test7SendTrxNonexistentTargetRevert() { Assert.assertTrue(beforeEnergyUsed + energyUsed >= afterEnergyUsed); Assert.assertTrue(beforeFreeNetUsed + netUsed >= afterFreeNetUsed); Assert.assertTrue(beforeNetUsed + netUsed >= afterNetUsed); - Assert.assertTrue(energyUsageTotal > EnergyCost.getInstance().getNewAcctCall()); + Assert.assertTrue(energyUsageTotal > EnergyCost.getNewAcctCall()); } diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/transferfailed/TransferFailed003.java b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/transferfailed/TransferFailed003.java index 4b934acede0..7f1105dafed 100644 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/transferfailed/TransferFailed003.java +++ b/framework/src/test/java/stest/tron/wallet/dailybuild/tvmnewcommand/transferfailed/TransferFailed003.java @@ -390,7 +390,7 @@ public void test3TransferTokenNonexistentTarget() { Assert.assertEquals(contractAccountCountBefore - 2, contractAccountCountAfter.longValue()); Assert.assertEquals(energyUsageTotal, - energyUsageTotal2 + EnergyCost.getInstance().getNewAcctCall()); + energyUsageTotal2 + EnergyCost.getNewAcctCall()); nonexistentAddressAccount = PublicMethed .getAssetIssueValue(nonexistentAddress, assetAccountId, blockingStubFull1); @@ -792,7 +792,7 @@ public void test9TransferTokenNonexistentTargetRevert() { Assert.assertTrue(beforeEnergyUsed + energyUsed >= afterEnergyUsed); Assert.assertTrue(beforeFreeNetUsed + netUsed >= afterFreeNetUsed); Assert.assertTrue(beforeNetUsed + netUsed >= afterNetUsed); - Assert.assertTrue(energyUsageTotal > EnergyCost.getInstance().getNewAcctCall()); + Assert.assertTrue(energyUsageTotal > EnergyCost.getNewAcctCall()); Long nonexistentAddressAccount = PublicMethed .getAssetIssueValue(nonexistentAddress, assetAccountId, blockingStubFull1); diff --git a/framework/src/test/java/stest/tron/wallet/onlinestress/ContractEvent001.java b/framework/src/test/java/stest/tron/wallet/onlinestress/ContractEvent001.java index 2616c3835e8..1b1ca3ab2e9 100644 --- a/framework/src/test/java/stest/tron/wallet/onlinestress/ContractEvent001.java +++ b/framework/src/test/java/stest/tron/wallet/onlinestress/ContractEvent001.java @@ -1,7 +1,11 @@ package stest.tron.wallet.onlinestress; +import com.alibaba.fastjson.JSONObject; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; import com.google.protobuf.ByteString; import io.grpc.ManagedChannel; +import io.grpc.ManagedChannel; import io.grpc.ManagedChannelBuilder; import java.io.BufferedReader; import java.io.File; @@ -10,8 +14,20 @@ import java.io.FileReader; import java.io.IOException; import java.io.InputStreamReader; +import java.nio.charset.Charset; +import java.util.HashMap; import java.util.concurrent.TimeUnit; import lombok.extern.slf4j.Slf4j; +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.impl.conn.PoolingClientConnectionManager; +import org.apache.http.params.CoreConnectionPNames; +import org.apache.http.util.EntityUtils; +import org.bouncycastle.util.encoders.Hex; import org.junit.Assert; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; @@ -29,17 +45,20 @@ import org.zeromq.ZMQ; import stest.tron.wallet.common.client.Configuration; import stest.tron.wallet.common.client.Parameter.CommonConstant; +import stest.tron.wallet.common.client.WalletClient; +import stest.tron.wallet.common.client.utils.HttpMethed; +import stest.tron.wallet.common.client.utils.JsonRpcBase; import stest.tron.wallet.common.client.utils.PublicMethed; import zmq.ZMQ.Event; @Slf4j -public class ContractEvent001 { +public class ContractEvent001 extends JsonRpcBase { - private final String testKey002 = Configuration.getByPath("testng.conf") - .getString("foundationAccount.key1"); + private final String testKey002 = + Configuration.getByPath("testng.conf").getString("foundationAccount.key1"); private final byte[] fromAddress = PublicMethed.getFinalAddress(testKey002); - private final String testKey003 = Configuration.getByPath("testng.conf") - .getString("foundationAccount.key2"); + private final String testKey003 = + Configuration.getByPath("testng.conf").getString("foundationAccount.key2"); private final byte[] toAddress = PublicMethed.getFinalAddress(testKey003); String txid; ECKey ecKey1 = new ECKey(Utils.getRandom()); @@ -52,12 +71,16 @@ public class ContractEvent001 { private ManagedChannel channelFull1 = null; private WalletGrpc.WalletBlockingStub blockingStubFull = null; private WalletGrpc.WalletBlockingStub blockingStubFull1 = null; - private String fullnode = Configuration.getByPath("testng.conf") - .getStringList("fullnode.ip.list").get(0); - private String fullnode1 = Configuration.getByPath("testng.conf") - .getStringList("fullnode.ip.list").get(1); - private Long maxFeeLimit = Configuration.getByPath("testng.conf") - .getLong("defaultParameter.maxFeeLimit"); + // byte[] contractAddress = null; + String param = "10"; + static HttpResponse response; + static JSONObject responseContent; + private String fullnode = + Configuration.getByPath("testng.conf").getStringList("fullnode.ip.list").get(0); + private String fullnode1 = + Configuration.getByPath("testng.conf").getStringList("fullnode.ip.list").get(1); + private Long maxFeeLimit = + Configuration.getByPath("testng.conf").getLong("defaultParameter.maxFeeLimit"); @BeforeSuite public void beforeSuite() { @@ -65,19 +88,12 @@ public void beforeSuite() { Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); } - /** - * constructor. - */ - + /** constructor. */ @BeforeClass(enabled = true) public void beforeClass() { - channelFull = ManagedChannelBuilder.forTarget(fullnode) - .usePlaintext(true) - .build(); + channelFull = ManagedChannelBuilder.forTarget(fullnode).usePlaintext(true).build(); blockingStubFull = WalletGrpc.newBlockingStub(channelFull); - channelFull1 = ManagedChannelBuilder.forTarget(fullnode1) - .usePlaintext(true) - .build(); + channelFull1 = ManagedChannelBuilder.forTarget(fullnode1).usePlaintext(true).build(); blockingStubFull1 = WalletGrpc.newBlockingStub(channelFull1); } @@ -94,14 +110,16 @@ public void test1ContractEventAndLog() { PublicMethed.printAddress(event001Key); PublicMethed.printAddress(testKey002); - Assert.assertTrue(PublicMethed.sendcoin(event001Address, maxFeeLimit * 30, fromAddress, - testKey002, blockingStubFull)); - Assert.assertTrue(PublicMethed.sendcoin(event002Address, maxFeeLimit * 30, fromAddress, - testKey002, blockingStubFull)); + Assert.assertTrue( + PublicMethed.sendcoin( + event001Address, maxFeeLimit * 30, fromAddress, testKey002, blockingStubFull)); + Assert.assertTrue( + PublicMethed.sendcoin( + event002Address, maxFeeLimit * 30, fromAddress, testKey002, blockingStubFull)); PublicMethed.waitProduceNextBlock(blockingStubFull1); - AccountResourceMessage accountResource = PublicMethed.getAccountResource(event001Address, - blockingStubFull); + AccountResourceMessage accountResource = + PublicMethed.getAccountResource(event001Address, blockingStubFull); Long energyLimit = accountResource.getEnergyLimit(); Long energyUsage = accountResource.getEnergyUsed(); Long balanceBefore = PublicMethed.queryAccount(event001Key, blockingStubFull).getBalance(); @@ -111,118 +129,279 @@ public void test1ContractEventAndLog() { logger.info("before balance is " + Long.toString(balanceBefore)); String contractName = "addressDemo"; - String code = Configuration.getByPath("testng.conf") - .getString("code.code_ContractEventAndLog1"); - String abi = Configuration.getByPath("testng.conf") - .getString("abi.abi_ContractEventAndLog1"); - byte[] contractAddress = PublicMethed.deployContract(contractName, abi, code, "", maxFeeLimit, - 0L, 50, null, event001Key, event001Address, blockingStubFull); + String code = + Configuration.getByPath("testng.conf").getString("code.code_ContractEventAndLog1"); + String abi = Configuration.getByPath("testng.conf").getString("abi.abi_ContractEventAndLog1"); + byte[] contractAddress = + PublicMethed.deployContract( + contractName, + abi, + code, + "", + maxFeeLimit, + 0L, + 50, + null, + event001Key, + event001Address, + blockingStubFull); PublicMethed.waitProduceNextBlock(blockingStubFull); SmartContract smartContract = PublicMethed.getContract(contractAddress, blockingStubFull); Assert.assertTrue(smartContract.getAbi() != null); Integer i = 0; for (i = 0; i < 1; i++) { - txid = PublicMethed.triggerContract(contractAddress, - "depositForEventCycle(uint256)", "100", false, - 1L, 100000000L, event002Address, event002Key, blockingStubFull); + txid = + PublicMethed.triggerContract( + contractAddress, + "depositForEventCycle(uint256)", + "100", + false, + 1L, + 100000000L, + event002Address, + event002Key, + blockingStubFull); logger.info(txid); - txid = PublicMethed.triggerContract(contractAddress, - "depositForLogCycle(uint256)", "100", false, - 2L, 100000000L, event002Address, event002Key, blockingStubFull); + txid = + PublicMethed.triggerContract( + contractAddress, + "depositForLogCycle(uint256)", + "100", + false, + 2L, + 100000000L, + event002Address, + event002Key, + blockingStubFull); logger.info(txid); - txid = PublicMethed.triggerContract(contractAddress, - "triggerUintEvent()", "#", false, - 0, maxFeeLimit, event001Address, event001Key, blockingStubFull); + txid = + PublicMethed.triggerContract( + contractAddress, + "triggerUintEvent()", + "#", + false, + 0, + maxFeeLimit, + event001Address, + event001Key, + blockingStubFull); logger.info(txid); - txid = PublicMethed.triggerContract(contractAddress, - "triggerintEvent()", "#", false, - 0, maxFeeLimit, event001Address, event001Key, blockingStubFull); + txid = + PublicMethed.triggerContract( + contractAddress, + "triggerintEvent()", + "#", + false, + 0, + maxFeeLimit, + event001Address, + event001Key, + blockingStubFull); logger.info(txid); - txid = PublicMethed.triggerContract(contractAddress, - "depositForEventAndLog()", "#", false, - 1, maxFeeLimit, event001Address, event001Key, blockingStubFull); + txid = + PublicMethed.triggerContract( + contractAddress, + "depositForEventAndLog()", + "#", + false, + 1, + maxFeeLimit, + event001Address, + event001Key, + blockingStubFull); logger.info(txid); - txid = PublicMethed.triggerContract(contractAddress, - "depositForEventNoIndex()", "#", false, - 0L, 100000000L, event001Address, event001Key, blockingStubFull); + txid = + PublicMethed.triggerContract( + contractAddress, + "depositForEventNoIndex()", + "#", + false, + 0L, + 100000000L, + event001Address, + event001Key, + blockingStubFull); logger.info(txid); - txid = PublicMethed.triggerContract(contractAddress, - "depositForLog()", "#", false, - 1L, 100000000L, event001Address, event001Key, blockingStubFull); + txid = + PublicMethed.triggerContract( + contractAddress, + "depositForLog()", + "#", + false, + 1L, + 100000000L, + event001Address, + event001Key, + blockingStubFull); logger.info(txid); - txid = PublicMethed.triggerContract(contractAddress, - "depositForEventNoIndex()", "#", false, - 1L, 100000000L, event001Address, event001Key, blockingStubFull); + txid = + PublicMethed.triggerContract( + contractAddress, + "depositForEventNoIndex()", + "#", + false, + 1L, + 100000000L, + event001Address, + event001Key, + blockingStubFull); logger.info(txid); - txid = PublicMethed.triggerContract(contractAddress, - "depositForEventOneIndex()", "#", false, - 1L, 100000000L, event001Address, event001Key, blockingStubFull); + txid = + PublicMethed.triggerContract( + contractAddress, + "depositForEventOneIndex()", + "#", + false, + 1L, + 100000000L, + event001Address, + event001Key, + blockingStubFull); logger.info(txid); - txid = PublicMethed.triggerContract(contractAddress, - "depositForEventTwoIndex()", "#", false, - 2L, 100000000L, event001Address, event001Key, blockingStubFull); + txid = + PublicMethed.triggerContract( + contractAddress, + "depositForEventTwoIndex()", + "#", + false, + 2L, + 100000000L, + event001Address, + event001Key, + blockingStubFull); logger.info(txid); - txid = PublicMethed.triggerContract(contractAddress, - "depositForEvent()", "#", false, - 3L, 100000000L, event001Address, event001Key, blockingStubFull); + txid = + PublicMethed.triggerContract( + contractAddress, + "depositForEvent()", + "#", + false, + 3L, + 100000000L, + event001Address, + event001Key, + blockingStubFull); logger.info(txid); - txid = PublicMethed.triggerContract(contractAddress, - "depositForEventCycle(uint256)", "100", false, - 1L, 100000000L, event002Address, event002Key, blockingStubFull); + txid = + PublicMethed.triggerContract( + contractAddress, + "depositForEventCycle(uint256)", + "100", + false, + 1L, + 100000000L, + event002Address, + event002Key, + blockingStubFull); logger.info(txid); - txid = PublicMethed.triggerContract(contractAddress, - "depositForLogCycle(uint256)", "100", false, - 2L, 100000000L, event002Address, event002Key, blockingStubFull); + txid = + PublicMethed.triggerContract( + contractAddress, + "depositForLogCycle(uint256)", + "100", + false, + 2L, + 100000000L, + event002Address, + event002Key, + blockingStubFull); logger.info(txid); - txid = PublicMethed.triggerContract(contractAddress, - "depositForAnonymousHasLog()", "#", false, - 4L, 100000000L, event001Address, event001Key, blockingStubFull); + txid = + PublicMethed.triggerContract( + contractAddress, + "depositForAnonymousHasLog()", + "#", + false, + 4L, + 100000000L, + event001Address, + event001Key, + blockingStubFull); logger.info(txid); - txid = PublicMethed.triggerContract(contractAddress, - "depositForAnonymousNoLog()", "#", false, - 5L, 100000000L, event001Address, event001Key, blockingStubFull); + txid = + PublicMethed.triggerContract( + contractAddress, + "depositForAnonymousNoLog()", + "#", + false, + 5L, + 100000000L, + event001Address, + event001Key, + blockingStubFull); logger.info(txid); String param = "\"" + code + "\"" + "," + "\"" + code + "\""; - txid = PublicMethed.triggerContract(contractAddress, - "triggerStringEvent(string,string)", param, false, - 0L, 100000000L, event001Address, event001Key, blockingStubFull); + txid = + PublicMethed.triggerContract( + contractAddress, + "triggerStringEvent(string,string)", + param, + false, + 0L, + 100000000L, + event001Address, + event001Key, + blockingStubFull); logger.info(txid); param = "\"" + "true1" + "\"" + "," + "\"" + "false1" + "\""; - txid = PublicMethed.triggerContract(contractAddress, - "triggerBoolEvent(bool,bool)", param, false, - 0L, 100000000L, event001Address, event001Key, blockingStubFull); + txid = + PublicMethed.triggerContract( + contractAddress, + "triggerBoolEvent(bool,bool)", + param, + false, + 0L, + 100000000L, + event001Address, + event001Key, + blockingStubFull); logger.info(txid); String filename = "/Users/wangzihe/Documents/modify_fullnode/java-tron/tooLongString.txt"; try { - FileReader fr = new FileReader( - filename); + FileReader fr = new FileReader(filename); InputStreamReader read = new InputStreamReader(new FileInputStream(new File(filename))); BufferedReader reader = new BufferedReader(read); String tooLongString = reader.readLine(); param = "\"" + tooLongString + "\"" + "," + "\"" + tooLongString + "\""; - txid = PublicMethed.triggerContract(contractAddress, - "triggerStringEventAnonymous(string,string)", param, false, - 0L, 100000000L, event001Address, event001Key, blockingStubFull); + txid = + PublicMethed.triggerContract( + contractAddress, + "triggerStringEventAnonymous(string,string)", + param, + false, + 0L, + 100000000L, + event001Address, + event001Key, + blockingStubFull); logger.info(txid); - txid = PublicMethed.triggerContract(contractAddress, - "triggerStringEvent(string,string)", param, false, - 0L, 100000000L, event001Address, event001Key, blockingStubFull); + txid = + PublicMethed.triggerContract( + contractAddress, + "triggerStringEvent(string,string)", + param, + false, + 0L, + 100000000L, + event001Address, + event001Key, + blockingStubFull); logger.info(txid); } catch (FileNotFoundException e) { @@ -230,27 +409,290 @@ public void test1ContractEventAndLog() { } catch (IOException ioe) { ioe.printStackTrace(); } - - } contractName = "addressDemo"; - code = Configuration.getByPath("testng.conf") - .getString("code.code_ContractEventAndLog2"); - abi = Configuration.getByPath("testng.conf") - .getString("abi.abi_ContractEventAndLog2"); - contractAddress = PublicMethed.deployContract(contractName, abi, code, "", maxFeeLimit, - 0L, 50, null, event001Key, event001Address, blockingStubFull); + code = Configuration.getByPath("testng.conf").getString("code.code_ContractEventAndLog2"); + abi = Configuration.getByPath("testng.conf").getString("abi.abi_ContractEventAndLog2"); + contractAddress = + PublicMethed.deployContract( + contractName, + abi, + code, + "", + maxFeeLimit, + 0L, + 50, + null, + event001Key, + event001Address, + blockingStubFull); PublicMethed.waitProduceNextBlock(blockingStubFull); smartContract = PublicMethed.getContract(contractAddress, blockingStubFull); Assert.assertTrue(smartContract.getAbi() != null); - txid = PublicMethed.triggerContract(contractAddress, - "triggerEventBytes()", "#", false, - 0, maxFeeLimit, event001Address, event001Key, blockingStubFull); + txid = + PublicMethed.triggerContract( + contractAddress, + "triggerEventBytes()", + "#", + false, + 0, + maxFeeLimit, + event001Address, + event001Key, + blockingStubFull); logger.info(txid); } + @Test( + enabled = true, + threadPoolSize = 5, + invocationCount = 5, + description = "test eth_getFilterChanges") + public void testEthGetFilterChanges() throws InterruptedException { + ECKey ecKey1 = new ECKey(Utils.getRandom()); + byte[] event001Address = ecKey1.getAddress(); + logger.info("event001Address:" + event001Address); + String event001Key = ByteArray.toHexString(ecKey1.getPrivKeyBytes()); + ECKey ecKey2 = new ECKey(Utils.getRandom()); + byte[] event002Address = ecKey2.getAddress(); + logger.info("event002Address:" + event002Address); + String event002Key = ByteArray.toHexString(ecKey2.getPrivKeyBytes()); + PublicMethed.printAddress(event001Key); + PublicMethed.printAddress(testKey002); + + Assert.assertTrue( + PublicMethed.sendcoin( + event001Address, maxFeeLimit * 30, fromAddress, testKey002, blockingStubFull)); + Assert.assertTrue( + PublicMethed.sendcoin( + event002Address, maxFeeLimit * 30, fromAddress, testKey002, blockingStubFull)); + PublicMethed.waitProduceNextBlock(blockingStubFull1); + + String contractName = "SolidityTest"; + String filePath = "./src/test/resources/soliditycode/testGetFilterChange.sol"; + HashMap retMap = PublicMethed.getBycodeAbi(filePath, contractName); + + String code = retMap.get("byteCode").toString(); + String abi = retMap.get("abI").toString(); + byte[] contractAddress = + PublicMethed.deployContract( + contractName, + abi, + code, + "", + maxFeeLimit, + 0L, + 50, + null, + event001Key, + event001Address, + blockingStubFull); + PublicMethed.waitProduceNextBlock(blockingStubFull); + SmartContract smartContract = PublicMethed.getContract(contractAddress, blockingStubFull); + Assert.assertTrue(smartContract.getAbi() != null); + logger.info("11111111111111111111111111111111111"); + Thread.sleep(180000); + + long txidNum = 0; + HttpResponse response = getNowBlock(httpFullNode); + JSONObject responseContent = parseResponseContent(response); + long blockBefore = + responseContent.getJSONObject("block_header").getJSONObject("raw_data").getLong("number"); + logger.info("blockBefore:" + blockBefore); + Thread.sleep(180000); + for (int i = 0; i < 5000; i++) { + String txid = + PublicMethed.triggerContract( + contractAddress, + "getResult(uint256)", + param, + false, + 2L, + 100000000L, + event002Address, + event002Key, + blockingStubFull); + logger.info("txid:" + txid); + txidNum++; + } + Thread.sleep(180000); + response = getNowBlock(httpFullNode); + responseContent = parseResponseContent(response); + long blockAfter = + responseContent.getJSONObject("block_header").getJSONObject("raw_data").getLong("number"); + + logger.info("txidNum:" + txidNum); + + // 扫块 + long sumLogs = 0; + long totalTransactionsSize = 0; + logger.info("blockBefore:" + blockBefore); + logger.info("blockAfter:" + blockAfter); + for (long i = blockBefore; i <= blockAfter; i++) { + + response = getTransactionCountByBlocknum(httpFullNode, (int) i); + responseContent = parseResponseContent(response); + long transactionsSize = responseContent.getLong("count"); + + totalTransactionsSize += transactionsSize; + } + logger.info( + (int) (Thread.currentThread().getId()) + + "sumLogs:" + + totalTransactionsSize * Long.parseLong(param)); + } + + public static String[] arr = + new String[] { + "00", + "0x6b5c9c34aae469576dfcde3655c9036d", + "0x450de4565abf4434d66948fb2a568608", + "0x02a65b2cc37d2d34808a63b50b86e0cd", + "0x7474d244cecf3a943bf8ac6dbd7d60fa", + "0x4ab110c02b04d7781f774eeffa6432a3" + }; + + @Test( + enabled = true, + threadPoolSize = 5, + invocationCount = 5, + description = "Eth api of eth_getFilterChanges .") + public void test09GetFilterChanges() { + long sumSize = 0; + while (true) { + JsonArray params = new JsonArray(); + String id = arr[(int) (Thread.currentThread().getId()) - 16]; + params.add(id); + JsonObject requestBody = getJsonRpcBody("eth_getFilterChanges", params); + HttpResponse response = getJsonRpc(jsonRpcNode, requestBody); + JSONObject responseContent = parseResponseContent(response); + long size = responseContent.getJSONArray("result").size(); + sumSize += size; + logger.info(Thread.currentThread().getId() + ":sumSize:" + sumSize); + } + } + + /** constructor. */ + public static JSONObject parseResponseContent(HttpResponse response) { + try { + String result = EntityUtils.toString(response.getEntity()); + StringEntity entity = new StringEntity(result, Charset.forName("UTF-8")); + response.setEntity(entity); + JSONObject obj = JSONObject.parseObject(result); + return obj; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /* public static HttpResponse getNowBlock(String httpNode, Boolean visible) { + try { + String requestUrl = "http://" + httpNode + "/wallet/getnowblock"; + JsonObject userBaseObj2 = new JsonObject(); + userBaseObj2.addProperty("visible", visible); + response = createConnect(requestUrl, userBaseObj2); + } catch (Exception e) { + e.printStackTrace(); + httppost.releaseConnection(); + return null; + } + return response; + }*/ + + /** constructor. */ + public static HttpResponse getTransactionCountByBlocknum(String httpNode, long blocknum) { + HttpResponse response; + try { + + String requestUrl = "http://" + httpNode + "/wallet/gettransactioncountbyblocknum"; + JsonObject userBaseObj2 = new JsonObject(); + userBaseObj2.addProperty("num", blocknum); + response = createConnect(requestUrl, userBaseObj2); + } catch (Exception e) { + e.printStackTrace(); + + return null; + } + return response; + } + + public static HttpResponse getNowBlock(String httpNode) { + return getNowBlock(httpNode, false); + } + + /** constructor. */ + public static HttpResponse getNowBlock(String httpNode, Boolean visible) { + + HttpResponse response; + try { + String requestUrl = "http://" + httpNode + "/wallet/getnowblock"; + JsonObject userBaseObj2 = new JsonObject(); + userBaseObj2.addProperty("visible", visible); + response = createConnect(requestUrl, userBaseObj2); + } catch (Exception e) { + e.printStackTrace(); + + return null; + } + return response; + } + + /** constructor. */ + public static HttpResponse createConnect(String url, JsonObject requestBody) { + HttpResponse response; + HttpPost httppost; + HttpClient httpClient; + Integer connectionTimeout = + Configuration.getByPath("testng.conf").getInt("defaultParameter.httpConnectionTimeout"); + Integer soTimeout = + Configuration.getByPath("testng.conf").getInt("defaultParameter.httpSoTimeout"); + PoolingClientConnectionManager pccm = new PoolingClientConnectionManager(); + pccm.setDefaultMaxPerRoute(80); + pccm.setMaxTotal(100); + + httpClient = new DefaultHttpClient(pccm); + try { + + httpClient + .getParams() + .setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, connectionTimeout); + httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, soTimeout); + httppost = new HttpPost(url); + httppost.setHeader("Content-type", "application/json; charset=utf-8"); + httppost.setHeader("Connection", "Close"); + if (requestBody != null) { + StringEntity entity = new StringEntity(requestBody.toString(), Charset.forName("UTF-8")); + entity.setContentEncoding("UTF-8"); + entity.setContentType("application/json"); + httppost.setEntity(entity); + } + + logger.info(httppost.toString()); + response = httpClient.execute(httppost); + } catch (Exception e) { + e.printStackTrace(); + + return null; + } + return response; + } + + /** constructor. */ + public static HttpResponse getJsonRpc(String jsonRpcNode, JsonObject jsonRpcObject) { + HttpResponse response; + try { + String requestUrl = "http://" + jsonRpcNode + "/jsonrpc"; + response = createConnect(requestUrl, jsonRpcObject); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + return response; + } + @Test(enabled = true, description = "Subscribe event client") public void testEnergyCostDetail() { ZMQ.Context context = ZMQ.context(1); @@ -281,36 +723,35 @@ public void run() { System.out.println("receive : " + new String(message)); } } - - } @Test(enabled = true) public void testSingForHex() { try { - SignInterface cryptoEngine = SignUtils.fromPrivate(ByteArray - .fromHexString("6815B367FDDE637E53E9ADC8E69424E07724333C9A2B973CFA469975E20753FC"), - true); - /* ByteString sig = ByteString.copyFrom(cryptoEngine.Base64toBytes(cryptoEngine - .signHash(Sha256Hash.of(DBConfig.isECKeyCryptoEngine(), + SignInterface cryptoEngine = + SignUtils.fromPrivate( ByteArray.fromHexString( - "ba989430c392dedef66a259a1f1112b178dbe7f2793975d8cf80f9b31ecd33ff")) - .getBytes())));*/ + "6815B367FDDE637E53E9ADC8E69424E07724333C9A2B973CFA469975E20753FC"), + true); + /* ByteString sig = ByteString.copyFrom(cryptoEngine.Base64toBytes(cryptoEngine + .signHash(Sha256Hash.of(DBConfig.isECKeyCryptoEngine(), + ByteArray.fromHexString( + "ba989430c392dedef66a259a1f1112b178dbe7f2793975d8cf80f9b31ecd33ff")) + .getBytes())));*/ // - ByteString sig = ByteString.copyFrom(cryptoEngine.Base64toBytes(cryptoEngine - .signHash(ByteArray - .fromHexString("4f2a4c136f56a41714b42e14d497e38dcbe0f9c4ca2e5957cf3a340c62d133f8")))); + ByteString sig = + ByteString.copyFrom( + cryptoEngine.Base64toBytes( + cryptoEngine.signHash( + ByteArray.fromHexString( + "4f2a4c136f56a41714b42e14d497e38dcbe0f9c4ca2e5957cf3a340c62d133f8")))); logger.info(ByteArray.toHexString(sig.toByteArray())); } catch (Exception e) { e.printStackTrace(); } } - - /** - * constructor. - */ - + /** constructor. */ @AfterClass public void shutdown() throws InterruptedException { if (channelFull != null) { @@ -318,5 +759,3 @@ public void shutdown() throws InterruptedException { } } } - - diff --git a/framework/src/test/java/stest/tron/wallet/onlinestress/ScanBlockTools.java b/framework/src/test/java/stest/tron/wallet/onlinestress/ScanBlockTools.java new file mode 100644 index 00000000000..488e7ce209f --- /dev/null +++ b/framework/src/test/java/stest/tron/wallet/onlinestress/ScanBlockTools.java @@ -0,0 +1,1104 @@ +package stest.tron.wallet.onlinestress; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.google.protobuf.Any; +import com.google.protobuf.ByteString; +import io.grpc.ManagedChannel; +import io.grpc.ManagedChannelBuilder; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Optional; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicLong; +import lombok.extern.slf4j.Slf4j; +import org.apache.http.HttpResponse; +import org.testng.Assert; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeSuite; +import org.testng.annotations.Test; +import org.tron.api.GrpcAPI.EmptyMessage; +import org.tron.api.GrpcAPI.NumberMessage; +import org.tron.api.GrpcAPI.TransactionInfoList; +import org.tron.api.WalletGrpc; +import org.tron.common.utils.Base58; +import org.tron.common.utils.ByteArray; +import org.tron.core.Wallet; +import org.tron.protos.Protocol.Account; +import org.tron.protos.Protocol.Account.AccountResource; +import org.tron.protos.Protocol.Block; +import org.tron.protos.Protocol.Transaction; +import org.tron.protos.Protocol.Transaction.Contract.ContractType; +import org.tron.protos.Protocol.TransactionInfo; +import org.tron.protos.contract.AccountContract.AccountCreateContract; +import org.tron.protos.contract.AccountContract.AccountPermissionUpdateContract; +import org.tron.protos.contract.AssetIssueContractOuterClass.TransferAssetContract; +import org.tron.protos.contract.BalanceContract.FreezeBalanceContract; +import org.tron.protos.contract.BalanceContract.TransferContract; +import org.tron.protos.contract.BalanceContract.UnfreezeBalanceContract; +import org.tron.protos.contract.BalanceContract.WithdrawBalanceContract; +import org.tron.protos.contract.SmartContractOuterClass.CreateSmartContract; +import org.tron.protos.contract.SmartContractOuterClass.TriggerSmartContract; +import org.tron.protos.contract.WitnessContract.VoteWitnessContract; +import stest.tron.wallet.common.client.Configuration; +import stest.tron.wallet.common.client.Parameter.CommonConstant; +import stest.tron.wallet.common.client.utils.HttpMethed; +import stest.tron.wallet.common.client.utils.PublicMethed; +import stest.tron.wallet.common.client.utils.Sha256Hash; +import stest.tron.wallet.common.client.utils.Sha256Sm3Hash; + +@Slf4j +public class ScanBlockTools { + + private final String testKey002 = Configuration.getByPath("testng.conf") + .getString("witness.key5"); + private final byte[] fromAddress = PublicMethed.getFinalAddress(testKey002); + + private final String testKey003 = Configuration.getByPath("testng.conf") + .getString("witness.key4"); + private final byte[] testAddress003 = PublicMethed.getFinalAddress(testKey003); + + private final String testKey004 = Configuration.getByPath("testng.conf") + .getString("witness.key3"); + private final byte[] testAddress004 = PublicMethed.getFinalAddress(testKey004); + ArrayList txidList = new ArrayList(); + Optional infoById = null; + Long beforeTime; + Long afterTime; + Long beforeBlockNum; + Long afterBlockNum; + Block currentBlock; + Long currentBlockNum; + private ManagedChannel channelFull = null; + private WalletGrpc.WalletBlockingStub blockingStubFull = null; + private ManagedChannel channelFull1 = null; + private WalletGrpc.WalletBlockingStub blockingStubFull1 = null; + private String fullnode = "39.106.110.245:50051"; + private String fullnode1 = "39.106.110.245:50051"; + + @BeforeSuite + public void beforeSuite() { + Wallet wallet = new Wallet(); + Wallet.setAddressPreFixByte(CommonConstant.ADD_PRE_FIX_BYTE_MAINNET); + } + + /** + * constructor. + */ + + @BeforeClass(enabled = true) + public void beforeClass() { + PublicMethed.printAddress(testKey002); + PublicMethed.printAddress(testKey003); + channelFull = ManagedChannelBuilder.forTarget(fullnode) + .usePlaintext(true) + .build(); + channelFull1 = ManagedChannelBuilder.forTarget(fullnode1) + .usePlaintext(true) + .build(); + blockingStubFull = WalletGrpc.newBlockingStub(channelFull); + blockingStubFull1 = WalletGrpc.newBlockingStub(channelFull1); + currentBlock = blockingStubFull1.getNowBlock(EmptyMessage.newBuilder().build()); + beforeBlockNum = currentBlock.getBlockHeader().getRawData().getNumber(); + beforeTime = System.currentTimeMillis(); + } + + public static List listForTxid = new ArrayList<>(); + public static HashMap map = new HashMap<>(); + public static HashMap witnessMap = new HashMap<>(); + + @Test(enabled = true,threadPoolSize = 1, invocationCount = 1) + public void test01ScanTransaction() { + getTxidList(); + witnessMap.clear(); + map.clear(); + witnessMap.put(5,"41F08012B4881C320EB40B80F1228731898824E09D"); + witnessMap.put(10,"41DF309FEF25B311E7895562BD9E11AAB2A58816D2"); + witnessMap.put(15,"41BB7322198D273E39B940A5A4C955CB7199A0CDEE"); + witnessMap.put(20,"412080D8A0364E82150DD5235CE7A61A7B40F3F9EF"); + witnessMap.put(25,"4173FC381D3E2AFEFCCED94A57D49520291C38AFBB"); + witnessMap.put(30,"41AF6146B0AD9EE8BBEE811D5858F3252666DFC90C"); + witnessMap.put(35,"41AF6A9D9C0636BD9DF74F687B90C6F44C471A6AB3"); + witnessMap.put(40,"41AF730429E4AB7BF7B53FB15ACB1D45EF5B22F463"); + witnessMap.put(45,"41AF4AEA1C4CBCFA681D98C354C142938381C99389"); + witnessMap.put(50,"41AF53DC31D9DE64DFF59A847125EFCA89D97BC86D"); + witnessMap.put(55,"41AF49468FA1BA966244D76F7D0139FC2CA751FAA5"); + witnessMap.put(60,"41AF5360256F958D2A922D160C429F13D432EFC22F"); + witnessMap.put(65,"41AF5EF33FD79FECB0419A5688035D7BCD3AEFE236"); + witnessMap.put(70,"41AF68F90ED62BA9F6F7A7EABA384E417551CF83E5"); + witnessMap.put(75,"41AF619F8CE75A9E95A19E851BEBE63E89FCB1826E"); + witnessMap.put(80,"41AF71E98F91515D7E5D5379837B9EEFD1AB4650D2"); + witnessMap.put(85,"41AF498B43EE098B26926798CFEAE1AB1154EF4430"); + witnessMap.put(90,"41AF536672333170CB0FBFA78819CD90A05537D872"); + witnessMap.put(95,"41AF5FAC2D62DD1F5C9892BA9D6593337ABBEAAACB"); + witnessMap.put(100,"41AF6981D4562E7B0A6C9E8F8C22D4CCCD03D2F39A"); + witnessMap.put(105,"41AF72A34243836238A533B7E77F3B2B29FD056B14"); + witnessMap.put(110,"41AF49C25D14AED36186B7C89AF405EF37A01EF23D"); + witnessMap.put(115,"41AF53BA37D394575CAD99A2A2C5BE56DEA0227C87"); + witnessMap.put(120,"41AF6A761C941AE2CDC75890D9900AC4B89B7EFCDD"); + witnessMap.put(125,"41AF72B56845F0C4D37388B6E6DC3601A0538ABA71"); + witnessMap.put(130,"41AF4ACF25C1E192285C9BA98522CB3CF20FFBE392"); + witnessMap.put(100000,"416C0214C9995C6F3A61AB23F0EB84B0CDE7FD9C7C"); + + + + for (String txid : listForTxid) { + + long blockNum = PublicMethed.getTransactionInfoById(txid,blockingStubFull) + .get().getBlockNumber(); + String witnessAddress = ByteArray.toHexString(PublicMethed + .getBlock(blockNum,blockingStubFull).getBlockHeader().getRawData() + .getWitnessAddress().toByteArray()); + + map.put(witnessAddress.toLowerCase(), map.getOrDefault(witnessAddress,0) + 1); + logger.info("end"); + } + + } + + + + + @Test(enabled = true,threadPoolSize = 1, invocationCount = 1) + public void test02ScanBlockGetTransactionAndWriteToCsv() { + witnessMap.clear(); + map.clear(); + witnessMap.put(5,"41F08012B4881C320EB40B80F1228731898824E09D"); + witnessMap.put(10,"41DF309FEF25B311E7895562BD9E11AAB2A58816D2"); + witnessMap.put(15,"41BB7322198D273E39B940A5A4C955CB7199A0CDEE"); + witnessMap.put(20,"412080D8A0364E82150DD5235CE7A61A7B40F3F9EF"); + witnessMap.put(25,"4173FC381D3E2AFEFCCED94A57D49520291C38AFBB"); + witnessMap.put(30,"41AF6146B0AD9EE8BBEE811D5858F3252666DFC90C"); + witnessMap.put(35,"41AF6A9D9C0636BD9DF74F687B90C6F44C471A6AB3"); + witnessMap.put(40,"41AF730429E4AB7BF7B53FB15ACB1D45EF5B22F463"); + witnessMap.put(45,"41AF4AEA1C4CBCFA681D98C354C142938381C99389"); + witnessMap.put(50,"41AF53DC31D9DE64DFF59A847125EFCA89D97BC86D"); + witnessMap.put(55,"41AF49468FA1BA966244D76F7D0139FC2CA751FAA5"); + witnessMap.put(60,"41AF5360256F958D2A922D160C429F13D432EFC22F"); + witnessMap.put(65,"41AF5EF33FD79FECB0419A5688035D7BCD3AEFE236"); + witnessMap.put(70,"41AF68F90ED62BA9F6F7A7EABA384E417551CF83E5"); + witnessMap.put(75,"41AF619F8CE75A9E95A19E851BEBE63E89FCB1826E"); + witnessMap.put(80,"41AF71E98F91515D7E5D5379837B9EEFD1AB4650D2"); + witnessMap.put(85,"41AF498B43EE098B26926798CFEAE1AB1154EF4430"); + witnessMap.put(90,"41AF536672333170CB0FBFA78819CD90A05537D872"); + witnessMap.put(95,"41AF5FAC2D62DD1F5C9892BA9D6593337ABBEAAACB"); + witnessMap.put(100,"41AF6981D4562E7B0A6C9E8F8C22D4CCCD03D2F39A"); + witnessMap.put(105,"41AF72A34243836238A533B7E77F3B2B29FD056B14"); + witnessMap.put(110,"41AF49C25D14AED36186B7C89AF405EF37A01EF23D"); + witnessMap.put(115,"41AF53BA37D394575CAD99A2A2C5BE56DEA0227C87"); + witnessMap.put(120,"41AF6A761C941AE2CDC75890D9900AC4B89B7EFCDD"); + witnessMap.put(125,"41AF72B56845F0C4D37388B6E6DC3601A0538ABA71"); + witnessMap.put(130,"41AF4ACF25C1E192285C9BA98522CB3CF20FFBE392"); + witnessMap.put(100000,"416C0214C9995C6F3A61AB23F0EB84B0CDE7FD9C7C"); + + + Long startNum = 30855000L; + Long endNum = 30858000L; + + Integer totalNum = 0; + Integer successNum = 0; + Integer failedNum = 0; + NumberMessage.Builder builder = NumberMessage.newBuilder(); + while (endNum >= startNum) { + logger.info("scan block num:" + endNum); + builder.setNum(endNum); + Block block = blockingStubFull1.getBlockByNum(builder.build()); + List transactionList = block.getTransactionsList(); + map.put(ByteArray.toHexString(block.getBlockHeader().getRawData().getWitnessAddress() + .toByteArray()).toLowerCase(), + map.getOrDefault(ByteArray.toHexString(block.getBlockHeader().getRawData() + .getWitnessAddress().toByteArray()).toLowerCase(),0) + 1); + Integer transactionNumInThisBlock = transactionList.size(); + totalNum = totalNum + transactionNumInThisBlock; + for (Transaction transaction : transactionList) { + String txid = ByteArray.toHexString(Sha256Hash.hash(true, + transaction.getRawData().toByteArray())); + //String writeData = ByteArray.toHexString(Sha256Hash.hash(true, + // transaction.getRawData().toByteArray())); + writeDataToCsvFile("txid-stressss.csv",txid); + //System.out.println("Fee:" + PublicMethed.getTransactionInfoById(txid, + // blockingStubFull).get().getFee()); + } + for (Transaction transaction : transactionList) { + if (transaction.getRet(0).getContractRet().name().equals("SUCCESS")) { + successNum++; + } else { + failedNum++; + + String writeData = ByteArray.toHexString(Sha256Hash.hash(true, + transaction.getRawData().toByteArray())); + logger.info(writeData); + writeDataToCsvFile("28164160L-28167324L.csv",writeData); + } + } + endNum--; + } + + logger.info("successNum:" + successNum); + logger.info("failedNum:" + failedNum); + logger.info("totalNum:" + totalNum); + logger.info("Success rate:" + (double)failedNum / (double)totalNum); + + + } + + public static Account account; + public HashSet addressSet = new HashSet<>(); + public HashSet assetIssueSet = new HashSet<>(); + + @Test(enabled = true, description = "Get account from transaction and compare " + + "account info from two different node") + public void test03CompareTwoNodeAccountStatus() throws Exception { + account = PublicMethed.queryAccount( + "7400E3D0727F8A61041A8E8BF86599FE5597CE19DE451E59AED07D60967A5E25",blockingStubFull); + //扫描到28307530块了 + Long startNum = 29266108L; + Long endNum = 29266208L; + NumberMessage.Builder builder = NumberMessage.newBuilder(); + builder.setNum(startNum); + int retryTimes = 0; + HashSet set = new HashSet<>(); + while (startNum++ <= endNum) { + //Block block = blockingStubFull412.getNowBlock(EmptyMessage.newBuilder().build()); + builder.setNum(startNum); + Block block = blockingStubFull.getBlockByNum(builder.build()); + logger.info("Start to scan block :" + block.getBlockHeader().getRawData().getNumber()); + + List transactionList = block.getTransactionsList(); + for (Transaction transaction : transactionList) { + + Any any = transaction.getRawData().getContract(0).getParameter(); + Integer contractType = transaction.getRawData().getContract(0).getType().getNumber(); + + + try { + switch (contractType) { + case 1: + TransferContract transferContract = any.unpack(TransferContract.class); + set.add(transferContract.getOwnerAddress()); + break; + case 2: + TransferAssetContract transferAssetContract = any.unpack(TransferAssetContract.class); + doCheck(transferAssetContract.getOwnerAddress()); + if (!addressSet.contains(transferAssetContract.getAssetName())) { + Assert.assertEquals(PublicMethed.getAssetIssueById(ByteArray + .toStr(transferAssetContract.getAssetName().toByteArray()), + blockingStubFull), + PublicMethed.getAssetIssueById(ByteArray.toStr(transferAssetContract + .getAssetName().toByteArray()), blockingStubFull)); + addressSet.add(transferAssetContract.getAssetName()); + logger.info("check token " + ByteArray.toStr(transferAssetContract + .getAssetName().toByteArray()) + " successfully"); + } + break; + case 31: + TriggerSmartContract triggerSmartContract = any.unpack(TriggerSmartContract.class); + doCheck(triggerSmartContract.getOwnerAddress()); + break; + case 13: + WithdrawBalanceContract withdrawBalanceContract + = any.unpack(WithdrawBalanceContract.class); + doCheck(withdrawBalanceContract.getOwnerAddress()); + break; + case 11: + FreezeBalanceContract freezeBalanceContract = any.unpack(FreezeBalanceContract.class); + doCheck(freezeBalanceContract.getOwnerAddress()); + break; + case 0: + AccountCreateContract accountCreateContract = any.unpack(AccountCreateContract.class); + doCheck(accountCreateContract.getOwnerAddress()); + break; + /* case 4: + VoteWitnessContract voteWitnessContract = any.unpack(VoteWitnessContract.class); + doCheck(voteWitnessContract.getOwnerAddress());*/ + case 12: + UnfreezeBalanceContract unfreezeBalanceContract + = any.unpack(UnfreezeBalanceContract.class); + doCheck(unfreezeBalanceContract.getOwnerAddress()); + break; + case 30: + CreateSmartContract createSmartContract = any.unpack(CreateSmartContract.class); + doCheck(createSmartContract.getOwnerAddress()); + break; + case 46: + AccountPermissionUpdateContract accountPermissionUpdateContract + = any.unpack(AccountPermissionUpdateContract.class); + doCheck(accountPermissionUpdateContract.getOwnerAddress()); + break; + default: + logger.info("Unknown type:" + contractType); + continue; + + } + } catch (Exception e) { + e.printStackTrace(); + + } + + + + + + } + } + + + } + + + @Test(enabled = true, description = "Get all info from smart contract transaction list") + public void test04GetEventTransactionAllInfoList() throws Exception { + + + + HashSet contractAndTopicList = new HashSet<>(); + + + Long startNum = 33662515L - 9500; + Long endNum = startNum - 1000; + + NumberMessage.Builder builder = NumberMessage.newBuilder(); + builder.setNum(startNum); + int retryTimes = 0; + HashSet set = new HashSet<>(); + while (startNum-- >= endNum) { + logger.info("current block num:" + startNum); + builder.setNum(startNum); + TransactionInfoList transactionInfoList = blockingStubFull + .getTransactionInfoByBlockNum(builder.build()); + + for (TransactionInfo transactionInfo : transactionInfoList.getTransactionInfoList()) { + if (!transactionInfo.getContractAddress().isEmpty() && transactionInfo.getLogCount() > 0) { + try { + String txid = ByteArray.toHexString(transactionInfo.getId().toByteArray()); + Any any = PublicMethed.getTransactionById(txid, blockingStubFull).get().getRawData() + .getContract(0).getParameter(); + TriggerSmartContract triggerSmartContract = any.unpack(TriggerSmartContract.class); + StringBuffer stringBuffer = new StringBuffer(); + stringBuffer.append(ByteArray.toHexString(triggerSmartContract + .getOwnerAddress().toByteArray())); + stringBuffer.append(","); + stringBuffer.append(ByteArray.toHexString(transactionInfo + .getContractAddress().toByteArray())); + stringBuffer.append(","); + stringBuffer.append(ByteArray.toHexString(triggerSmartContract + .getData().toByteArray())); + stringBuffer.append(","); + //stringBuffer.append(blockHash); + //stringBuffer.append(","); + //stringBuffer.append(startNum); + //stringBuffer.append(","); + stringBuffer.append(txid); + + + + + contractAndTopicList.add(stringBuffer.toString()); + + ; + } catch (Exception e) { + e.printStackTrace(); + + } + } + + + + + } + } + + for (String contractAddressAndTopic : contractAndTopicList) { + writeDataToCsvFile("eth_blockHash.csv", contractAddressAndTopic); + } + + + + } + + + @Test(enabled = true, description = "Get eth block query information") + public void test05CreateEthBlockHash() throws Exception { + HashSet contractAndTopicList = new HashSet<>(); + + + Long startNum = 33662515L; + Long endNum = startNum - 20000; + + NumberMessage.Builder builder = NumberMessage.newBuilder(); + builder.setNum(startNum); + int retryTimes = 0; + HashSet set = new HashSet<>(); + while (startNum-- >= endNum) { + logger.info("current block num:" + startNum); + builder.setNum(startNum); + String blockHash = ByteArray.toHexString(PublicMethed.getBlock(startNum + 1, + blockingStubFull).getBlockHeader().getRawData().getParentHash().toByteArray()); + StringBuffer stringBuffer = new StringBuffer(); + stringBuffer.append(blockHash); + stringBuffer.append(","); + stringBuffer.append(startNum); + contractAndTopicList.add(stringBuffer.toString()); + } + + for (String contractAddressAndTopic : contractAndTopicList) { + writeDataToCsvFile("eth_blockHash.csv", contractAddressAndTopic); + } + + + + } + + + ConcurrentHashMap certificationCosts = new ConcurrentHashMap<>(); + Set concurrentHashSet = certificationCosts.newKeySet(); + private static HashSet existAddress = new HashSet<>(); + List list1 = new ArrayList<>(); + + private static AtomicLong blockNum = new AtomicLong(30000523L - 20000L); + private static AtomicLong times = new AtomicLong(5); + + @Test(enabled = true, threadPoolSize = 10, invocationCount = 10) + public void test06ScanMainNetMostActiveAccounts() throws Exception { + getNowAddressList(); + ManagedChannel channelFull = null; + WalletGrpc.WalletBlockingStub blockingStubFull = null; + channelFull = ManagedChannelBuilder.forTarget(fullnode) + .usePlaintext(true) + .build(); + blockingStubFull = WalletGrpc.newBlockingStub(channelFull); + NumberMessage.Builder builder = NumberMessage.newBuilder(); + long blockNumCurrent = blockNum.getAndAdd(-200); + int times = 200; + while (times-- >= 0) { + if (concurrentHashSet.size() > 1000000) { + break; + } + //list1.add(blockNumCurrent); + builder.setNum(blockNumCurrent--); + Block block = blockingStubFull.getBlockByNum(builder.build()); + logger.info("Start to scan block :" + block.getBlockHeader().getRawData().getNumber()); + + List transactionList = block.getTransactionsList(); + for (Transaction transaction : transactionList) { + + Any any = transaction.getRawData().getContract(0).getParameter(); + Integer contractType = transaction.getRawData().getContract(0).getType().getNumber(); + + + try { + switch (contractType) { + case 1: + TransferContract transferContract = any.unpack(TransferContract.class); + isExist(transferContract.getOwnerAddress()); + isExist(transferContract.getToAddress()); + break; + case 2: + TransferAssetContract transferAssetContract = any.unpack(TransferAssetContract.class); + isExist(transferAssetContract.getOwnerAddress()); + isExist(transferAssetContract.getToAddress()); + break; + case 31: + TriggerSmartContract triggerSmartContract = any.unpack(TriggerSmartContract.class); + isExist(triggerSmartContract.getContractAddress()); + isExist(triggerSmartContract.getOwnerAddress()); + break; + case 13: + WithdrawBalanceContract withdrawBalanceContract + = any.unpack(WithdrawBalanceContract.class); + + isExist(withdrawBalanceContract.getOwnerAddress()); + break; + case 11: + FreezeBalanceContract freezeBalanceContract = any.unpack(FreezeBalanceContract.class); + isExist(freezeBalanceContract.getOwnerAddress()); + break; + case 0: + AccountCreateContract accountCreateContract = any.unpack(AccountCreateContract.class); + isExist(accountCreateContract.getOwnerAddress()); + isExist(accountCreateContract.getAccountAddress()); + break; + case 12: + UnfreezeBalanceContract unfreezeBalanceContract + = any.unpack(UnfreezeBalanceContract.class); + isExist(unfreezeBalanceContract.getOwnerAddress()); + break; + case 30: + CreateSmartContract createSmartContract = any.unpack(CreateSmartContract.class); + isExist(createSmartContract.getOwnerAddress()); + break; + case 46: + AccountPermissionUpdateContract accountPermissionUpdateContract + = any.unpack(AccountPermissionUpdateContract.class); + isExist(accountPermissionUpdateContract.getOwnerAddress()); + break; + case 4: + VoteWitnessContract voteWitnessContract = any.unpack(VoteWitnessContract.class); + isExist(voteWitnessContract.getOwnerAddress()); + break; + default: + logger.info("Unknown type:" + contractType); + continue; + + } + } catch (Exception e) { + e.printStackTrace(); + + } + + + + + + + } + } + + + + + } + + + + @Test(enabled = true, threadPoolSize = 1, invocationCount = 1) + public void test07ScanAndCalculateTotalValueOrCallValue() throws Exception { + getNowAddressList(); + ManagedChannel channelFull = null; + WalletGrpc.WalletBlockingStub blockingStubFull = null; + channelFull = ManagedChannelBuilder.forTarget("47.252.19.181:50051") + .usePlaintext(true) + .build(); + blockingStubFull = WalletGrpc.newBlockingStub(channelFull); + + int total1 = 0; + int total2 = 0; + int totalTrx = 0; + for (long blockNum = 20450668L; blockNum <= 20450790L;blockNum++) { + System.out.println("blockNum " + blockNum); + TransactionInfoList transactionList = PublicMethed.getTransactionInfoByBlockNum(blockNum, + blockingStubFull).get(); + for (int i = 0; i < transactionList.getTransactionInfoCount();i++) { + if (ByteArray.toHexString(transactionList.getTransactionInfo(i).getContractAddress() + .toByteArray()).equalsIgnoreCase("41DF42D1936F0DC3689BB65A19F279747084E13FBD")) { + + + if (ByteArray.toHexString(transactionList.getTransactionInfo(i).getLog(0) + .getTopics(0).toByteArray()).equalsIgnoreCase( + "9b217a401a5ddf7c4d474074aff9958a18d48690d77cc2151c4706aa7348b401")) { + total1 += Integer.parseInt(ByteArray.toHexString(transactionList.getTransactionInfo(i) + .getLog(0).getData().toByteArray()),16); + } else if (ByteArray.toHexString(transactionList.getTransactionInfo(i).getLog(0) + .getTopics(0).toByteArray()).equalsIgnoreCase( + "31472eae9e158460fea5622d1fcb0c5bdc65b6ffb51827f7bc9ef5788410c34c")) { + total2 += Integer.parseInt(ByteArray.toHexString(transactionList.getTransactionInfo(i) + .getLog(0).getData().toByteArray()),16); + } else if (ByteArray.toHexString(transactionList.getTransactionInfo(i).getLog(0) + .getTopics(0).toByteArray()).equalsIgnoreCase( + "3e799b2d61372379e767ef8f04d65089179b7a6f63f9be3065806456c7309f1b")) { + totalTrx += transactionList.getTransactionInfo(i).getInternalTransactions(4) + .getCallValueInfo(0).getCallValue(); + } + + } + } + } + + System.out.println("total1 :" + total1); + System.out.println("total2 :" + total2); + System.out.println("total_callValue :" + totalTrx); + + } + + + + @Test + public void test08ScanAndCalculateWitnessProductBlockStatus() { + Long startNum = 33694340L; + Long endNum = 33694388L; + + Integer testgroup014 = 0; + Integer testgroup015 = 0; + Integer testgroup016 = 0; + Integer testgroup017 = 0; + Integer testgroup018 = 0; + + int transfer = 0; + int trigger = 0; + + while (startNum++ <= endNum) { + NumberMessage.Builder builder = NumberMessage.newBuilder(); + builder.setNum(startNum); + Block block = blockingStubFull.getBlockByNum(builder.build()); + logger.info("current block:" + startNum); + + String currentAddress = ByteArray.toHexString(block.getBlockHeader().getRawData() + .getWitnessAddress().toByteArray()); + List transactionList = block.getTransactionsList(); + for (Transaction transaction : transactionList) { + if (transaction.getRawData().getContract(0).getType().equals(ContractType + .TriggerSmartContract)) { + trigger++; + } else { + transfer++; + } + } + if (currentAddress.equals(getHexAddress( + "0528dc17428585fc4dece68b79fa7912270a1fe8e85f244372f59eb7e8925e04")) + || currentAddress + .equals(getHexAddress( + "dbc78781ad27f3751358333412d5edc85b13e5eee129a1a77f7232baadafae0e")) + || currentAddress + .equals(getHexAddress( + "a79a37a3d868e66456d76b233cb894d664b75fd91861340f3843db05ab3a8c66")) + || currentAddress + .equals(getHexAddress( + "a8107ea1c97c90cd4d84e79cd79d327def6362cc6fd498fc3d3766a6a71924f6")) + || currentAddress + .equals(getHexAddress( + "b5076206430b2ca069ae2f4dc6f20dd0d74551559878990d1df12a723c228039")) + || currentAddress + .equals(getHexAddress( + "87cc8832b1b4860c3c69994bbfcdae9b520e6ce40cbe2a90566e707a7e04fc70")) + ) { + testgroup014++; + continue; + } + + if (currentAddress.equals(getHexAddress( + "553c7b0dee17d3f5b334925f5a90fe99fb0b93d47073d69ec33eead8459d171e")) + || currentAddress + .equals(getHexAddress( + "541a2d585fcea7e9b1803df4eb49af0eb09f1fa2ce06aa5b8ed60ac95655d66d")) + || currentAddress + .equals(getHexAddress( + "7d5a7396d6430edb7f66aa5736ef388f2bea862c9259de8ad8c2cfe080f6f5a0")) + || currentAddress + .equals(getHexAddress( + "7c4977817417495f4ca0c35ab3d5a25e247355d68f89f593f3fea2ab62c8644f")) + || currentAddress + .equals(getHexAddress( + "4521c13f65cc9f5c1daa56923b8598d4015801ad28379675c64106f5f6afec30")) + || currentAddress + .equals(getHexAddress( + "442513e2e801bc42d14d33b8148851dae756d08eeb48881a44e1b2002b3fb700")) + ) { + testgroup015++; + continue; + } + + if (currentAddress.equals(getHexAddress( + "324a2052e491e99026442d81df4d2777292840c1b3949e20696c49096c6bacb8")) + || currentAddress + .equals(getHexAddress( + "f33101ea976d90491dcb9669be568db8bbc1ad23d90be4dede094976b67d550e")) + || currentAddress + .equals(getHexAddress( + "1bb32958909299db452d3c9bbfd15fd745160d63e4985357874ee57708435a00")) + || currentAddress + .equals(getHexAddress( + "29c91bd8b27c807d8dc2d2991aa0fbeafe7f54f4de9fac1e1684aa57242e3922")) + || currentAddress + .equals(getHexAddress( + "97317d4d68a0c5ce14e74ad04dfc7521f142f5c0f247b632c8f94c755bdbe669")) + ) { + testgroup016++; + continue; + } + + if (currentAddress.equals(getHexAddress( + "ff5d867c4434ac17d264afc6696e15365832d5e8000f75733ebb336d66df148d")) + || currentAddress + .equals(getHexAddress( + "1fe1d91bbe3ac4ac5dc9866c157ef7615ec248e3fd4f7d2b49b0428da5e046b2")) + || currentAddress + .equals(getHexAddress( + "7c37ef485e186e07952bcc8e30cd911a6cd9f2a847736c89132762fb67a42329")) + || currentAddress + .equals(getHexAddress( + "bcc142d57d872cd2cc1235bca454f2efd5a87f612856c979cc5b45a7399272a8")) + || currentAddress + .equals(getHexAddress( + "6054824dc03546f903a06da1f405e72409379b83395d0bbb3d4563f56e828d52")) + ) { + testgroup017++; + continue; + } + + testgroup018++; + } + + + logger.info(testgroup014 + " " + testgroup015 + " " + + testgroup016 + " " + testgroup017 + " " + testgroup018); + + logger.info(transfer + " " + trigger); + + + } + + + @Test + public void test09GetEthFilterData() { + + HashSet set = new HashSet<>(); + Integer startBlockNumber = 35129811 - 2000; + Integer endBlockNumber = startBlockNumber - 3000; + + for (int blockNumber = startBlockNumber; blockNumber >= endBlockNumber;blockNumber-- + ) { + set.clear(); + HttpResponse response = HttpMethed + .getTransactionInfoByBlocknum("1.1.1.1:90", blockNumber); + + List content = HttpMethed.parseResponseContentArray(response); + + String blockNumberHex = "0x" + Integer.toHexString(blockNumber); + + System.out.println(content.size()); + for (JSONObject info : content) { + if (!info.containsKey("log")) { + continue; + } + JSONArray logArray = info.getJSONArray("log"); + for (int i = 0; i < logArray.size();i++) { + JSONObject log = logArray.getJSONObject(i); + String address = "0x" + log.getString("address"); + String topic = "0x" + log.getJSONArray("topics").getString(0); + set.add(address + "," + topic + "," + blockNumberHex); + + } + + + + + } + + for (String data : set) { + writeDataToCsvFile("ys_filter_api.csv", data); + } + } + + + } + + public String getHexAddress(String key) { + return ByteArray.toHexString(PublicMethed.getFinalAddress(key)); + } + + private static HashSet getFileList(String fileName,HashSet set) { + String line = null; + try { + BufferedReader bufferedReader = + new BufferedReader(new InputStreamReader(new FileInputStream(fileName),"utf-8")); + + while ((line = bufferedReader.readLine()) != null) { + set.add(line); + } + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + + return set; + } + + + + + private static void getNowAddressList() { + String line = null; + try { + //BufferedReader bufferedReader=new BufferedReader(new FileReader(filePath)); + BufferedReader bufferedReader = + new BufferedReader(new InputStreamReader(new FileInputStream("newAddress.csv"),"utf-8")); + + //int i=0; + while ((line = bufferedReader.readLine()) != null) { + existAddress.add(line); + } + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + + /** + * constructor. + */ + public static void writeDataToCsvFile(String fileName,String writeData) { + + { + try { + File file = new File(fileName); + + if (!file.exists()) { + file.createNewFile(); + } + FileWriter fileWritter = new FileWriter(file.getName(), true); + fileWritter.write(writeData + "\n"); + fileWritter.close(); + //System.out.println("finish"); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + + /** + * constructor. + */ + public void doCheck(ByteString address) throws Exception { + if (addressSet.contains(address)) { + //logger.info("skip :" + ByteArray.toHexString(address.toByteArray())); + return; + } else { + addressSet.add(address); + } + logger.info("checking :" + ByteArray.toHexString(address.toByteArray())); + compareTwoAddress(address); + compareNet(address); + compareAccountResource(address); + return; + + } + + /** + * constructor. + */ + public void compareTwoAddress(ByteString address) { + + Assert.assertEquals( + PublicMethed.queryAccount(address.toByteArray(),blockingStubFull).toBuilder() + .clearFreeAssetNetUsageV2() + //.putAllFreeAssetNetUsageV2(account.getFreeAssetNetUsageV2Map()) + .setBalance(1L).setLatestOprationTime(1L) + .setAccountResource(AccountResource.newBuilder()) + .setFreeNetUsage(1L) + .setNetUsage(1L) + .clearAssetV2() + .setLatestConsumeFreeTime(1L) + .setLatestConsumeTime(1L) + .setAllowance(1L) + .clearAccountResource() + //.clearOldVotePower() + .build(), + PublicMethed.queryAccount(address.toByteArray(),blockingStubFull).toBuilder() + .clearFreeAssetNetUsageV2() + //.putAllFreeAssetNetUsageV2(account.getFreeAssetNetUsageV2Map()) + .setBalance(1L).setLatestOprationTime(1L) + .setAccountResource(AccountResource.newBuilder()) + .setFreeNetUsage(1L) + .setNetUsage(1L) + .setLatestConsumeFreeTime(1L) + .setLatestConsumeTime(1L) + .clearAssetV2() + .setAllowance(1L) + .clearAccountResource() + .build() + ); + + } + + + /** + * constructor. + */ + public void compareNet(ByteString address) { + Assert.assertEquals( + PublicMethed.getAccountNet(address.toByteArray(),blockingStubFull) + .toBuilder().setTotalNetWeight(1L) + .setNetUsed(1L) + .setFreeNetUsed(1) + .setNetLimit(1) + .build(), + PublicMethed.getAccountNet(address.toByteArray(),blockingStubFull) + .toBuilder().setTotalNetWeight(1L) + .setNetUsed(1L) + .setFreeNetUsed(1) + .setNetLimit(1) + .build() + ); + } + + /** + * constructor. + */ + public void compareAccountResource(ByteString address) throws Exception { + Assert.assertEquals( + PublicMethed.getAccountResource(address.toByteArray(),blockingStubFull) + .toBuilder() + .setFreeNetUsed(1L) + .setEnergyUsed(1L) + .setTotalEnergyWeight(1L) + .setTotalNetWeight(1L) + .setNetUsed(1L) + .setNetLimit(1L) + .setEnergyLimit(1L) + .build(), + PublicMethed.getAccountResource(address.toByteArray(),blockingStubFull) + .toBuilder() + .setFreeNetUsed(1L) + .setEnergyUsed(1L) + .setNetUsed(1L) + .setNetLimit(1L) + .setTotalEnergyWeight(1L) + .setTotalNetWeight(1L) + .setEnergyLimit(1L) + .build() + ); + + } + + /** + * constructor. + */ + public boolean isEqual(ByteString address) { + return PublicMethed.getAccountResource(address.toByteArray(),blockingStubFull) + .toBuilder() + .setFreeNetUsed(1L) + .setEnergyUsed(1L) + .setTotalEnergyWeight(1L) + .setTotalNetWeight(1L) + .setNetUsed(1L) + .setNetLimit(1L) + .setEnergyLimit(1L) + .build().equals(PublicMethed.getAccountResource(address.toByteArray(),blockingStubFull) + .toBuilder() + .setFreeNetUsed(1L) + .setEnergyUsed(1L) + .setTotalEnergyWeight(1L) + .setTotalNetWeight(1L) + .setNetUsed(1L) + .setNetLimit(1L) + .setEnergyLimit(1L) + .build()); + + } + + /** + * constructor. + */ + public void isExist(ByteString address1) { + byte[] address = address1.toByteArray(); + byte[] hash0 = Sha256Sm3Hash.hash(address); + byte[] hash1 = Sha256Sm3Hash.hash(hash0); + byte[] checkSum = Arrays.copyOfRange(hash1, 0, 4); + byte[] addchecksum = new byte[address.length + 4]; + System.arraycopy(address, 0, addchecksum, 0, address.length); + System.arraycopy(checkSum, 0, addchecksum, address.length, 4); + if (!existAddress.contains(Base58.encode(addchecksum))) { + concurrentHashSet.add(address1); + } + } + + /** + * constructor. + */ + private static void getTxidList() { + String line = null; + try { + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new + FileInputStream("demo.csv"),"utf-8")); + + while ((line = bufferedReader.readLine()) != null) { + listForTxid.add(line.toLowerCase()); + + } + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * constructor. + */ + @AfterClass + public void shutdown() throws InterruptedException { + List list = new ArrayList<>(concurrentHashSet); + for (ByteString target : list) { + byte[] address = target.toByteArray(); + byte[] hash0 = Sha256Sm3Hash.hash(address); + byte[] hash1 = Sha256Sm3Hash.hash(hash0); + byte[] checkSum = Arrays.copyOfRange(hash1, 0, 4); + byte[] addchecksum = new byte[address.length + 4]; + System.arraycopy(address, 0, addchecksum, 0, address.length); + System.arraycopy(checkSum, 0, addchecksum, address.length, 4); + writeDataToCsvFile("newAddress.csv", Base58.encode(addchecksum)); + } + Collections.sort(list1); + + + int i = 1; + /* + afterTime = System.currentTimeMillis(); + try { + Thread.sleep(10000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + currentBlock = blockingStubFull1.getNowBlock(GrpcAPI.EmptyMessage.newBuilder().build()); + afterBlockNum = currentBlock.getBlockHeader().getRawData().getNumber() + 2; + Long blockNum = beforeBlockNum; + Integer txsNum = 0; + Integer topNum = 0; + Integer totalNum = 0; + Long energyTotal = 0L; + String findOneTxid = ""; + + NumberMessage.Builder builder = NumberMessage.newBuilder(); + while (blockNum <= afterBlockNum) { + builder.setNum(blockNum); + txsNum = blockingStubFull1.getBlockByNum(builder.build()).getTransactionsCount(); + totalNum = totalNum + txsNum; + if (topNum < txsNum) { + topNum = txsNum; + findOneTxid = ByteArray.toHexString(Sha256Hash.hash(blockingStubFull1 + .getBlockByNum(builder.build()).getTransactionsList().get(2) + .getRawData().toByteArray())); + //logger.info("find one txid is " + findOneTxid); + } + + blockNum++; + } + Long costTime = (afterTime - beforeTime - 31000) / 1000; + logger.info("Duration block num is " + (afterBlockNum - beforeBlockNum - 11)); + logger.info("Cost time are " + costTime); + logger.info("Top block txs num is " + topNum); + logger.info("Total transaction is " + (totalNum - 30)); + logger.info("Average Tps is " + (totalNum / costTime)); + + infoById = PublicMethed.getTransactionInfoById(findOneTxid, blockingStubFull1); + Long oneEnergyTotal = infoById.get().getReceipt().getEnergyUsageTotal(); + logger.info("EnergyTotal is " + oneEnergyTotal); + logger.info("Average energy is " + oneEnergyTotal * (totalNum / costTime)); + */ + + if (channelFull != null) { + channelFull.shutdown().awaitTermination(5, TimeUnit.SECONDS); + } + if (channelFull1 != null) { + channelFull1.shutdown().awaitTermination(5, TimeUnit.SECONDS); + } + } +} \ No newline at end of file diff --git a/framework/src/test/resources/config-test-storagetest.conf b/framework/src/test/resources/config-test-storagetest.conf index c1fa5f9e6ee..1a551b23be3 100644 --- a/framework/src/test/resources/config-test-storagetest.conf +++ b/framework/src/test/resources/config-test-storagetest.conf @@ -22,6 +22,15 @@ storage { # the path of "output-directory" or which is set by "-d" ("--output-directory"). # Attention: name is a required field that must be set !!! + default = { + maxOpenFiles = 50 + } + defaultM = { + maxOpenFiles = 500 + } + defaultL = { + maxOpenFiles = 1000 + } properties = [ { name = "account", diff --git a/framework/src/test/resources/soliditycode/contractTrc1155.sol b/framework/src/test/resources/soliditycode/contractTrc1155.sol new file mode 100644 index 00000000000..c33d07b3dfc --- /dev/null +++ b/framework/src/test/resources/soliditycode/contractTrc1155.sol @@ -0,0 +1,612 @@ +pragma solidity ^0.8.0; + +interface IERC165 { + + function supportsInterface(bytes4 interfaceId) external view returns (bool); +} + + + +abstract contract ERC165 is IERC165 { + + function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + return interfaceId == type(IERC165).interfaceId; + } +} + +interface IERC1155 is IERC165 { + + event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); + + + event TransferBatch( + address indexed operator, + address indexed from, + address indexed to, + uint256[] ids, + uint256[] values + ); + + + event ApprovalForAll(address indexed account, address indexed operator, bool approved); + + + event URI(string value, uint256 indexed id); + + + function balanceOf(address account, uint256 id) external view returns (uint256); + + + function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) + external + view + returns (uint256[] memory); + + + function setApprovalForAll(address operator, bool approved) external; + + + function isApprovedForAll(address account, address operator) external view returns (bool); + + + function safeTransferFrom( + address from, + address to, + uint256 id, + uint256 amount, + bytes calldata data + ) external; + + function safeBatchTransferFrom( + address from, + address to, + uint256[] calldata ids, + uint256[] calldata amounts, + bytes calldata data + ) external; +} + + +abstract contract Context { + function _msgSender() internal view virtual returns (address) { + return msg.sender; + } + + function _msgData() internal view virtual returns (bytes calldata) { + return msg.data; + } +} + + +library Address { + + + function isAContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + assembly { + size := extcodesize(account) + } + return size > 0; + } + + + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, "Address: insufficient balance"); + + (bool success, ) = recipient.call{value: amount}(""); + require(success, "Address: unable to send value, recipient may have reverted"); + } + + + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, "Address: low-level call failed"); + } + + + function functionCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); + } + + function functionCallWithValue( + address target, + bytes memory data, + uint256 value, + string memory errorMessage + ) internal returns (bytes memory) { + require(address(this).balance >= value, "Address: insufficient balance for call"); + require(isAContract(target), "Address: call to non-contract"); + + (bool success, bytes memory returndata) = target.call{value: value}(data); + return verifyCallResult(success, returndata, errorMessage); + } + + + function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { + return functionStaticCall(target, data, "Address: low-level static call failed"); + } + + + function functionStaticCall( + address target, + bytes memory data, + string memory errorMessage + ) internal view returns (bytes memory) { + require(isAContract(target), "Address: static call to non-contract"); + + (bool success, bytes memory returndata) = target.staticcall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, "Address: low-level delegate call failed"); + } + + + function functionDelegateCall( + address target, + bytes memory data, + string memory errorMessage + ) internal returns (bytes memory) { + require(isAContract(target), "Address: delegate call to non-contract"); + + (bool success, bytes memory returndata) = target.delegatecall(data); + return verifyCallResult(success, returndata, errorMessage); + } + + function verifyCallResult( + bool success, + bytes memory returndata, + string memory errorMessage + ) internal pure returns (bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} + + +interface IERC1155MetadataURI is IERC1155 { + + function uri(uint256 id) external view returns (string memory); +} + + + + +interface IERC1155Receiver is IERC165 { + + function onERC1155Received( + address operator, + address from, + uint256 id, + uint256 value, + bytes calldata data + ) external returns (bytes4); + + + function onERC1155BatchReceived( + address operator, + address from, + uint256[] calldata ids, + uint256[] calldata values, + bytes calldata data + ) external returns (bytes4); +} + + +contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { + using Address for address; + + // Mapping from token ID to account balances + mapping(uint256 => mapping(address => uint256)) private _balances; + + // Mapping from account to operator approvals + mapping(address => mapping(address => bool)) private _operatorApprovals; + + // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json + string private _uri; + + /** + * @dev See {_setURI}. + */ + constructor(string memory uri_) { + _setURI(uri_); + } + + /** + * @dev See {IERC165-supportsInterface}. + */ + function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { + return + interfaceId == type(IERC1155).interfaceId || + interfaceId == type(IERC1155MetadataURI).interfaceId || + super.supportsInterface(interfaceId); + } + + + function uri(uint256 id) public view virtual override returns (string memory) { + return _uri; + } + + function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { + require(account != address(0), "ERC1155: balance query for the zero address"); + return _balances[id][account]; + } + + + function balanceOfBatch(address[] memory accounts, uint256[] memory ids) + public + view + virtual + override + returns (uint256[] memory) + { + require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); + + uint256[] memory batchBalances = new uint256[](accounts.length); + + for (uint256 i = 0; i < accounts.length; ++i) { + batchBalances[i] = balanceOf(accounts[i], ids[i]); + } + + return batchBalances; + } + + + function setApprovalForAll(address operator, bool approved) public virtual override { + _setApprovalForAll(_msgSender(), operator, approved); + } + + + function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { + return _operatorApprovals[account][operator]; + } + + + function safeTransferFrom( + address from, + address to, + uint256 id, + uint256 amount, + bytes memory data + ) public virtual override { + require( + from == _msgSender() || isApprovedForAll(from, _msgSender()), + "ERC1155: caller is not owner nor approved" + ); + _safeTransferFrom(from, to, id, amount, data); + } + + + function safeBatchTransferFrom( + address from, + address to, + uint256[] memory ids, + uint256[] memory amounts, + bytes memory data + ) public virtual override { + require( + from == _msgSender() || isApprovedForAll(from, _msgSender()), + "ERC1155: transfer caller is not owner nor approved" + ); + _safeBatchTransferFrom(from, to, ids, amounts, data); + } + + + function _safeTransferFrom( + address from, + address to, + uint256 id, + uint256 amount, + bytes memory data + ) internal virtual { + require(to != address(0), "ERC1155: transfer to the zero address"); + + address operator = _msgSender(); + + _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data); + + uint256 fromBalance = _balances[id][from]; + require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); + unchecked { + _balances[id][from] = fromBalance - amount; + } + _balances[id][to] += amount; + + emit TransferSingle(operator, from, to, id, amount); + + _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); + } + + + function _safeBatchTransferFrom( + address from, + address to, + uint256[] memory ids, + uint256[] memory amounts, + bytes memory data + ) internal virtual { + require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); + require(to != address(0), "ERC1155: transfer to the zero address"); + + address operator = _msgSender(); + + _beforeTokenTransfer(operator, from, to, ids, amounts, data); + + for (uint256 i = 0; i < ids.length; ++i) { + uint256 id = ids[i]; + uint256 amount = amounts[i]; + + uint256 fromBalance = _balances[id][from]; + require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); + unchecked { + _balances[id][from] = fromBalance - amount; + } + _balances[id][to] += amount; + } + + emit TransferBatch(operator, from, to, ids, amounts); + + _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); + } + + + function _setURI(string memory newuri) internal virtual { + _uri = newuri; + } + + + function _mint( + address to, + uint256 id, + uint256 amount, + bytes memory data + ) internal virtual { + require(to != address(0), "ERC1155: mint to the zero address"); + + address operator = _msgSender(); + + _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data); + + _balances[id][to] += amount; + emit TransferSingle(operator, address(0), to, id, amount); + + _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); + } + + + function _mintBatch( + address to, + uint256[] memory ids, + uint256[] memory amounts, + bytes memory data + ) internal virtual { + require(to != address(0), "ERC1155: mint to the zero address"); + require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); + + address operator = _msgSender(); + + _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); + + for (uint256 i = 0; i < ids.length; i++) { + _balances[ids[i]][to] += amounts[i]; + } + + emit TransferBatch(operator, address(0), to, ids, amounts); + + _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); + } + + + function _burn( + address from, + uint256 id, + uint256 amount + ) internal virtual { + require(from != address(0), "ERC1155: burn from the zero address"); + + address operator = _msgSender(); + + _beforeTokenTransfer(operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), ""); + + uint256 fromBalance = _balances[id][from]; + require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); + unchecked { + _balances[id][from] = fromBalance - amount; + } + + emit TransferSingle(operator, from, address(0), id, amount); + } + + + function _burnBatch( + address from, + uint256[] memory ids, + uint256[] memory amounts + ) internal virtual { + require(from != address(0), "ERC1155: burn from the zero address"); + require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); + + address operator = _msgSender(); + + _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); + + for (uint256 i = 0; i < ids.length; i++) { + uint256 id = ids[i]; + uint256 amount = amounts[i]; + + uint256 fromBalance = _balances[id][from]; + require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); + unchecked { + _balances[id][from] = fromBalance - amount; + } + } + + emit TransferBatch(operator, from, address(0), ids, amounts); + } + + + function _setApprovalForAll( + address owner, + address operator, + bool approved + ) internal virtual { + require(owner != operator, "ERC1155: setting approval status for self"); + _operatorApprovals[owner][operator] = approved; + emit ApprovalForAll(owner, operator, approved); + } + + + function _beforeTokenTransfer( + address operator, + address from, + address to, + uint256[] memory ids, + uint256[] memory amounts, + bytes memory data + ) internal virtual {} + + function _doSafeTransferAcceptanceCheck( + address operator, + address from, + address to, + uint256 id, + uint256 amount, + bytes memory data + ) private { + if (to.isAContract()) { + try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { + if (response != IERC1155Receiver.onERC1155Received.selector) { + revert("ERC1155: ERC1155Receiver rejected tokens"); + } + } catch Error(string memory reason) { + revert(reason); + } catch { + revert("ERC1155: transfer to non ERC1155Receiver implementer"); + } + } + } + + function _doSafeBatchTransferAcceptanceCheck( + address operator, + address from, + address to, + uint256[] memory ids, + uint256[] memory amounts, + bytes memory data + ) private { + if (to.isAContract()) { + try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( + bytes4 response + ) { + if (response != IERC1155Receiver.onERC1155BatchReceived.selector) { + revert("ERC1155: ERC1155Receiver rejected tokens"); + } + } catch Error(string memory reason) { + revert(reason); + } catch { + revert("ERC1155: transfer to non ERC1155Receiver implementer"); + } + } + } + + function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { + uint256[] memory array = new uint256[](1); + array[0] = element; + + return array; + } + + +} + + +contract TronCoins is ERC1155 { + uint256 public constant TRX = 0; + uint256 public constant BTT = 1; + uint256 public constant WIN = 2; + uint256 public constant SUN = 3; + uint256 public constant APENFT = 4; + uint256 public constant APENFT1 = 5; + + constructor() public ERC1155("https://game.example/api/item/{id}.json") { + _mint(msg.sender, TRX, 10**3, ""); + _mint(msg.sender, BTT, 10**2, ""); + _mint(msg.sender, WIN, 10**5, ""); + _mint(msg.sender, SUN, 10**4, ""); + _mint(msg.sender, APENFT, 1, ""); + _mint(msg.sender, APENFT1, 1, ""); + } +} + + +abstract contract ERC1155Receiver is ERC165, IERC1155Receiver { + /** + * @dev See {IERC165-supportsInterface} + */ + function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { + return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId); + } +} + + +contract ERC1155Holder is ERC1155Receiver { + function onERC1155Received( + address, + address, + uint256, + uint256, + bytes memory + ) public virtual override returns (bytes4) { + return this.onERC1155Received.selector; + } + + function onERC1155BatchReceived( + address, + address, + uint256[] memory, + uint256[] memory, + bytes memory + ) public virtual override returns (bytes4) { + return this.onERC1155BatchReceived.selector; + } +} + + +contract MyContractCanReceiver is ERC1155Holder { +} + + + +contract MyContractCanNotReceiver { +} \ No newline at end of file diff --git a/framework/src/test/resources/soliditycode/eventLog2.sol b/framework/src/test/resources/soliditycode/eventLog2.sol new file mode 100644 index 00000000000..0ad82f6dd1f --- /dev/null +++ b/framework/src/test/resources/soliditycode/eventLog2.sol @@ -0,0 +1,8 @@ +contract Event { + event log2(uint256,uint256,uint256); + constructor() public payable{} + function messageI() payable public returns (uint ret) { + emit log2(1,1,1); + return 1; + } +} \ No newline at end of file diff --git a/framework/src/test/resources/soliditycode/opCode.sol b/framework/src/test/resources/soliditycode/opCode.sol new file mode 100644 index 00000000000..ccfe8d56c8a --- /dev/null +++ b/framework/src/test/resources/soliditycode/opCode.sol @@ -0,0 +1,112 @@ +contract A { + constructor() public payable{} + function sssmod() payable public returns (int256) { + int s1 = 3; + int s2 = 2; + int s3 = s1 % s2; + return s3; + } + + function eextcodecopy(address _addr) public returns (bytes memory o_code) { + assembly { + // retrieve the size of the code, this needs assembly + let size := extcodesize(_addr) + // allocate output byte array - this could also be done without assembly + // by using o_code = new bytes(size) + o_code := mload(0x40) + // new "memory end" including padding + mstore(0x40, add(o_code, and(add(add(size, 0x20), 0x1f), not(0x1f)))) + // store length in memory + mstore(o_code, size) + // actually retrieve the code, this needs assembly + extcodecopy(_addr, add(o_code, 0x20), 0, size) + } + } + + function cccoinbase() public returns (address) { + return block.coinbase; + } + + function ddifficulty() public returns (uint256) { + return block.difficulty; + } + + function gggaslimit() public returns (uint256) { + return block.gaslimit; + } + + //pc() is disabled from solidity 0.7.0 +// function ppppc() public returns (uint a) { +// assembly { +// a := pc() +// } +// } + +// function mmmsize() public returns (uint a) { +// assembly { +// // a := pc() +// a := msize() +// } +// } + + function ssswap() public returns (int a) { + int a=1; + int b=2; + int c=3; + int d=3; + int e=3; + int f=3; + int g=3; + int h=3; + int a1=1; + int b1=2; + int c1=3; + int d1=3; + int e1=3; //swap 14 + int f1=3; //swap 15 + int g1=3; //swap 16 + return (a); + } + + function pppushx() public returns (uint256) { + return 0x11223344556677889900112233; //push13 +// return 0x1122334455667788990011223344; //push14 +// return 0x112233445566778899001122334455; //push15 +// return 0x11223344556677889900112233445566; //push16 +// return 0x1122334455667788990011223344556611; //push17 +// return 0x112233445566778899001122334455661111; //push18 +// return 0x11223344556677889900112233445566111111; //push19 +// return 0x112233445566778899001122334455661111111111; //push21 +// return 0x11223344556677889900112233445566111111111111; //push22 +// return 0x1122334455667788990011223344556611111111111111; //push23 +// return 0x112233445566778899001122334455661111111111111111; //push24 +// return 0x11223344556677889900112233445566111111111111111111; //push25 +// return 0x1122334455667788990011223344556611111111111111111111; //push26 +// return 0x112233445566778899001122334455661111111111111111111111; //push27 +// return 0x11223344556677889900112233445566111111111111111111111111; //push28 +// return 0x112233445566778899001122334455661111111111111111111111111111; //push30 + } + + // for test09Callcode +// function testInCall(address callCAddress,uint256 amount) payable public{ +// callCAddress.call.value(10)(abi.encodeWithSignature("trans(uint256)",amount)); +// } +// function testIndelegateCall(address callCAddress,uint256 amount) payable public{ +// callCAddress.delegatecall(abi.encodeWithSignature("trans(uint256)",amount)); +// } +// +// function testInCallcode(address callCAddress,uint256 amount) payable public{ +// callCAddress.callcode.value(10)(abi.encodeWithSignature("trans(uint256)",amount)); +// } +} + +//for test09Callcode +//contract C{ +// event clog(address,uint256,uint256); +// constructor() payable public{} +// fallback() payable external{} +// function trans(uint256 amount) payable public{ +// emit clog(msg.sender,msg.value,amount); +// } +// +//} \ No newline at end of file diff --git a/framework/src/test/resources/soliditycode/testGetFilterChange.sol b/framework/src/test/resources/soliditycode/testGetFilterChange.sol new file mode 100644 index 00000000000..8a922031c2f --- /dev/null +++ b/framework/src/test/resources/soliditycode/testGetFilterChange.sol @@ -0,0 +1,11 @@ +pragma solidity ^0.8.0; +contract SolidityTest { + event Deployed(address sender, uint256 a, uint256 num); + function getResult(uint256 num) public payable returns(uint256) { + uint256 a=0; + for(a=0;a