From 5840f71bd6352de3954ff85121d7453c26f0f367 Mon Sep 17 00:00:00 2001 From: syntrust Date: Fri, 24 Jan 2025 20:28:28 +0800 Subject: [PATCH 1/3] fix address encoding --- pom.xml | 8 ++- .../web3j/crypto/TransactionEncoder.java | 18 +++--- .../web3j/crypto/TransactionEncoderTest.java | 56 +++++++++++++++++++ 3 files changed, 74 insertions(+), 8 deletions(-) create mode 100644 src/test/java/org/quarkchain/web3j/crypto/TransactionEncoderTest.java diff --git a/pom.xml b/pom.xml index 2c14b60..6355d21 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ 4.0.0 org.quarkchain web3j - 0.0.1 + 0.0.2 2019 @@ -44,5 +44,11 @@ core 4.5.5 + + org.junit.jupiter + junit-jupiter + 5.7.0 + test + diff --git a/src/main/java/org/quarkchain/web3j/crypto/TransactionEncoder.java b/src/main/java/org/quarkchain/web3j/crypto/TransactionEncoder.java index 842d3b2..74b42d4 100644 --- a/src/main/java/org/quarkchain/web3j/crypto/TransactionEncoder.java +++ b/src/main/java/org/quarkchain/web3j/crypto/TransactionEncoder.java @@ -2,11 +2,10 @@ import java.util.ArrayList; import java.util.List; - import org.quarkchain.web3j.crypto.Sign.SignatureData; import org.quarkchain.web3j.protocol.core.request.EvmTransaction; -import org.quarkchain.web3j.protocol.core.request.TxData; import org.quarkchain.web3j.protocol.core.request.EvmTransaction.TxDataUnsigned; +import org.quarkchain.web3j.protocol.core.request.TxData; import org.quarkchain.web3j.rlp.RlpEncoder; import org.quarkchain.web3j.rlp.RlpList; import org.quarkchain.web3j.rlp.RlpString; @@ -14,6 +13,7 @@ import org.quarkchain.web3j.rlp.RlpUint32; import org.quarkchain.web3j.utils.Numeric; + public class TransactionEncoder { public static SignatureData signMessage(TxDataUnsigned rawTransaction, ECKeyPair keyPair) { @@ -73,11 +73,11 @@ private static List asRlpValues(EvmTransaction evmTransaction) { // an empty to address (contract creation) should not be encoded as a numeric 0 // value String to = txData.getTo(); - if (to.length() > 0) { - result.add(RlpString.create(Numeric.toBigInt(to))); - } else { - result.add(RlpString.create("")); - } + if (to != null && to.length() > 0) { + result.add(RlpString.create(Numeric.hexStringToByteArray(to))); + } else { + result.add(RlpString.create("")); + } result.add(RlpString.create(txData.getValue())); result.add(RlpString.create(Numeric.hexStringToByteArray(txData.getInput()))); result.add(RlpString.create(Numeric.hexStringToByteArray(txData.getNetworkId()))); @@ -91,4 +91,8 @@ private static List asRlpValues(EvmTransaction evmTransaction) { result.add(RlpString.create(txData.getS())); return result; } + + public static List asRlpValuesPub(EvmTransaction evmTransaction) { + return asRlpValues(evmTransaction); + } } diff --git a/src/test/java/org/quarkchain/web3j/crypto/TransactionEncoderTest.java b/src/test/java/org/quarkchain/web3j/crypto/TransactionEncoderTest.java new file mode 100644 index 0000000..7b786d2 --- /dev/null +++ b/src/test/java/org/quarkchain/web3j/crypto/TransactionEncoderTest.java @@ -0,0 +1,56 @@ +package org.quarkchain.web3j.crypto; + +import java.math.BigInteger; +import java.util.List; +import org.junit.jupiter.api.Test; +import org.quarkchain.web3j.protocol.core.request.EvmTransaction; +import org.quarkchain.web3j.protocol.core.request.TxData; +import org.quarkchain.web3j.rlp.RlpString; +import org.quarkchain.web3j.rlp.RlpType; +import org.quarkchain.web3j.utils.Numeric; + +import static org.junit.jupiter.api.Assertions.*; + +public class TransactionEncoderTest { + + @Test + public void testAsRlpValues() { + String toAddress = "0x00aab646f0aad5afac5ed6724434c4439904829400000000"; + + TxData txData = new TxData( + BigInteger.ONE, + BigInteger.valueOf(10_000_000_000L), + BigInteger.valueOf(21000), + toAddress, // to + BigInteger.valueOf(1_000_000_000L), + "0x", + "1", + "0x9148d72cc71f3d8a8ae93a1e28f22449bd9fc70f00000000", + "0x00aab646f0aad5afac5ed6724434c4439904829400000000", + "0x", + "0x", + BigInteger.valueOf(27), + new BigInteger("48eafed96f1f9dc716b377260070eb188f12a3a899b69772972c9f7094d453ef", 16), + new BigInteger("5c534aa35c576ede5d914e381cf4e5ef8f8f19ebdacdf165aa7b6420ac735bde", 16) + ); + + txData.setVersion(BigInteger.ZERO); + + EvmTransaction evmTransaction = new EvmTransaction(); + evmTransaction.setData(txData); + + List result = TransactionEncoder.asRlpValuesPub(evmTransaction); + assertEquals(15, result.size(), "RLP size is 15"); + assertEquals(RlpString.create(BigInteger.ONE), result.get(0), + "Expected RlpType does not match the actual result."); + assertEquals(RlpString.create(BigInteger.valueOf(10_000_000_000L)), result.get(1), + "Expected gasPrice as BigInteger"); + assertEquals(RlpString.create(BigInteger.valueOf(21000)), result.get(2), "Expected gas as BigInteger"); + + // to + RlpString rlpString = (RlpString) result.get(3); + String actualHex = Numeric.toHexString(rlpString.getBytes()); + System.out.println("Actual content (HEX) = " + actualHex); + assertEquals(toAddress, actualHex, "To address mismatch"); + } +} \ No newline at end of file From f56de55341d4bbf3c11593eaf9c1a10d163e858c Mon Sep 17 00:00:00 2001 From: syntrust Date: Fri, 24 Jan 2025 20:55:37 +0800 Subject: [PATCH 2/3] fix fmt --- pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 6355d21..587fdc0 100644 --- a/pom.xml +++ b/pom.xml @@ -39,7 +39,7 @@ compile - + org.web3j core 4.5.5 @@ -49,6 +49,6 @@ junit-jupiter 5.7.0 test - + - + \ No newline at end of file From d82f215413de43a55f9551f1f296964f776bdcde Mon Sep 17 00:00:00 2001 From: syntrust Date: Fri, 24 Jan 2025 20:58:46 +0800 Subject: [PATCH 3/3] fix fmt --- .../quarkchain/web3j/crypto/TransactionEncoder.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/quarkchain/web3j/crypto/TransactionEncoder.java b/src/main/java/org/quarkchain/web3j/crypto/TransactionEncoder.java index 74b42d4..95d4f00 100644 --- a/src/main/java/org/quarkchain/web3j/crypto/TransactionEncoder.java +++ b/src/main/java/org/quarkchain/web3j/crypto/TransactionEncoder.java @@ -13,7 +13,6 @@ import org.quarkchain.web3j.rlp.RlpUint32; import org.quarkchain.web3j.utils.Numeric; - public class TransactionEncoder { public static SignatureData signMessage(TxDataUnsigned rawTransaction, ECKeyPair keyPair) { @@ -73,11 +72,11 @@ private static List asRlpValues(EvmTransaction evmTransaction) { // an empty to address (contract creation) should not be encoded as a numeric 0 // value String to = txData.getTo(); - if (to != null && to.length() > 0) { - result.add(RlpString.create(Numeric.hexStringToByteArray(to))); - } else { - result.add(RlpString.create("")); - } + if (to != null && to.length() > 0) { + result.add(RlpString.create(Numeric.hexStringToByteArray(to))); + } else { + result.add(RlpString.create("")); + } result.add(RlpString.create(txData.getValue())); result.add(RlpString.create(Numeric.hexStringToByteArray(txData.getInput()))); result.add(RlpString.create(Numeric.hexStringToByteArray(txData.getNetworkId())));