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 955ba55060f..6183463ed9d 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 @@ -537,4 +537,22 @@ public static String generateFilterId() { random.nextBytes(uid); return ByteArray.toHexString(uid); } + + /** + * Check if transaction data parameter is null or empty + * Supports both 'data' and 'input' parameters + */ + public static boolean paramTransactionDataIsNull(String data, String input) { + return paramStringIsNull(data) && paramStringIsNull(input); + } + + /** + * Get transaction data with priority: input > data + */ + public static String getTransactionData(String data, String input) { + if (!paramStringIsNull(input)) { + return input; + } + return data; + } } 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 eb432432a1c..b1c4c02c20f 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 @@ -604,7 +604,7 @@ public String estimateGas(CallArguments args) throws JsonRpcInvalidRequestExcept estimateEnergy(ownerAddress, contractAddress, args.parseValue(), - ByteArray.fromHexString(args.getData()), + ByteArray.fromHexString(args.getTransactionData()), trxExtBuilder, retBuilder, estimateBuilder); @@ -612,7 +612,7 @@ public String estimateGas(CallArguments args) throws JsonRpcInvalidRequestExcept callTriggerConstantContract(ownerAddress, contractAddress, args.parseValue(), - ByteArray.fromHexString(args.getData()), + ByteArray.fromHexString(args.getTransactionData()), trxExtBuilder, retBuilder); } @@ -838,7 +838,7 @@ public String getCall(CallArguments transactionCall, Object blockParamObj) byte[] contractAddressData = addressCompatibleToByteArray(transactionCall.getTo()); return call(addressData, contractAddressData, transactionCall.parseValue(), - ByteArray.fromHexString(transactionCall.getData())); + ByteArray.fromHexString(transactionCall.getTransactionData())); } else { try { ByteArray.hexToBigInteger(blockNumOrTag); @@ -954,7 +954,7 @@ private TransactionJson buildCreateSmartContractTransaction(byte[] ownerAddress, smartBuilder.setOriginAddress(ByteString.copyFrom(ownerAddress)); // bytecode + parameter - smartBuilder.setBytecode(ByteString.copyFrom(ByteArray.fromHexString(args.getData()))); + smartBuilder.setBytecode(ByteString.copyFrom(ByteArray.fromHexString(args.getTransactionData()))); if (StringUtils.isNotEmpty(args.getName())) { smartBuilder.setName(args.getName()); @@ -999,8 +999,8 @@ private TransactionJson buildTriggerSmartContractTransaction(byte[] ownerAddress build.setOwnerAddress(ByteString.copyFrom(ownerAddress)) .setContractAddress(ByteString.copyFrom(contractAddress)); - if (StringUtils.isNotEmpty(args.getData())) { - build.setData(ByteString.copyFrom(ByteArray.fromHexString(args.getData()))); + if (StringUtils.isNotEmpty(args.getTransactionData())) { + build.setData(ByteString.copyFrom(ByteArray.fromHexString(args.getTransactionData()))); } else { build.setData(ByteString.copyFrom(new byte[0])); } diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/types/BuildArguments.java b/framework/src/main/java/org/tron/core/services/jsonrpc/types/BuildArguments.java index 223e807e622..7530fd649f4 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/types/BuildArguments.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/types/BuildArguments.java @@ -76,13 +76,30 @@ public class BuildArguments { @Setter private boolean visible = false; + @Getter + @Setter + private String input; + public BuildArguments(CallArguments args) { from = args.getFrom(); to = args.getTo(); gas = args.getGas(); gasPrice = args.getGasPrice(); value = args.getValue(); - data = args.getData(); + + // Use the new unified method to get transaction data for compatibility + data = args.getTransactionData(); + input = args.getTransactionData(); + } + + /** + * Get the transaction data, supporting both 'data' and 'input' params + */ + public String getTransactionData() { + if (StringUtils.isNotEmpty(input)) { + return input; + } + return data; } public ContractType getContractType(Wallet wallet) throws JsonRpcInvalidRequestException, @@ -92,7 +109,7 @@ public ContractType getContractType(Wallet wallet) throws JsonRpcInvalidRequestE // to is null if (paramStringIsNull(to)) { // data is null - if (paramStringIsNull(data)) { + if (paramStringIsNull(getTransactionData())) { throw new JsonRpcInvalidRequestException("invalid json request"); } diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/types/CallArguments.java b/framework/src/main/java/org/tron/core/services/jsonrpc/types/CallArguments.java index 1485448c4b6..f2807da490c 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/types/CallArguments.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/types/CallArguments.java @@ -44,6 +44,9 @@ public class CallArguments { @Getter @Setter private String nonce; // not used + @Getter + @Setter + private String input; //Add input parameter to align with Ethereum https://github.com/ethereum/go-ethereum/pull/28078 /** * just support TransferContract, CreateSmartContract and TriggerSmartContract @@ -57,8 +60,11 @@ public ContractType getContractType(Wallet wallet) throws JsonRpcInvalidRequestE throw new JsonRpcInvalidRequestException("invalid json request"); } else if (paramStringIsNull(to)) { // data is null - if (paramStringIsNull(data)) { - throw new JsonRpcInvalidRequestException("invalid json request"); + if (paramStringIsNull(input)) { + if(paramStringIsNull(data)) + { + throw new JsonRpcInvalidRequestException("invalid json request"); //If both input and data are bnull throw an error, take input as priority + } } contractType = ContractType.CreateSmartContract; @@ -86,4 +92,26 @@ public ContractType getContractType(Wallet wallet) throws JsonRpcInvalidRequestE public long parseValue() throws JsonRpcInvalidParamsException { return parseQuantityValue(value); } + + /** + * Get the transaction data, supporting both 'data' and 'input' parameters + * for Ethereum compatibility. 'input' takes precedence if both are provided. + * + * @return the transaction data/input + */ + public String getTransactionData() { + // Prioritize 'input' for Ethereum compatibility + if (StringUtils.isNotEmpty(input)) { + return input; + } + return data; + } + + /** + * Set transaction data, updating the appropriate field based on which was used + */ + public void setTransactionData(String transactionData) { + // For backward compatibility, default to setting 'data' + this.data = transactionData; + } } \ No newline at end of file diff --git a/framework/src/test/java/org/tron/core/services/jsonrpc/BuildArgumentsTest.java b/framework/src/test/java/org/tron/core/services/jsonrpc/BuildArgumentsTest.java index f9e264c515f..95dd58cf6ce 100644 --- a/framework/src/test/java/org/tron/core/services/jsonrpc/BuildArgumentsTest.java +++ b/framework/src/test/java/org/tron/core/services/jsonrpc/BuildArgumentsTest.java @@ -31,7 +31,7 @@ public void initBuildArgs() { "0x0000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000001","0x10","0.01","0x100", "","0",9L,10000L,"",10L, - 2000L,"args",1,"",true); + 2000L,"args",1,"",true,""); } @@ -40,7 +40,7 @@ public void testBuildArgument() { CallArguments callArguments = new CallArguments( "0x0000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000001","0x10","0.01","0x100", - "","0"); + "","0",""); BuildArguments buildArguments = new BuildArguments(callArguments); Assert.assertEquals(buildArguments.getFrom(), "0x0000000000000000000000000000000000000000"); diff --git a/framework/src/test/java/org/tron/core/services/jsonrpc/CallArgumentsTest.java b/framework/src/test/java/org/tron/core/services/jsonrpc/CallArgumentsTest.java index 19dd76e5e07..db7c52eb8d3 100644 --- a/framework/src/test/java/org/tron/core/services/jsonrpc/CallArgumentsTest.java +++ b/framework/src/test/java/org/tron/core/services/jsonrpc/CallArgumentsTest.java @@ -28,7 +28,7 @@ public class CallArgumentsTest extends BaseTest { public void init() { callArguments = new CallArguments("0x0000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000001","0x10","0.01","0x100", - "","0"); + "","0",""); } @Test