Skip to content

Commit

Permalink
Refactor TransactionSerializer
Browse files Browse the repository at this point in the history
  • Loading branch information
siladu committed Jul 11, 2023
1 parent 2b7cbd1 commit 63344a3
Showing 1 changed file with 31 additions and 32 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
*/
package tech.pegasys.web3signer.core.service.jsonrpc.handlers.signing;

import static org.web3j.utils.Numeric.toHexString;
import static tech.pegasys.web3signer.core.service.jsonrpc.handlers.sendtransaction.transaction.Transaction.longToBytes;
import static tech.pegasys.web3signer.core.service.jsonrpc.response.JsonRpcError.SIGNING_FROM_IS_NOT_AN_UNLOCKED_ACCOUNT;
import static tech.pegasys.web3signer.core.util.Eth1AddressUtil.signerPublicKeyFromAddress;
Expand All @@ -31,7 +32,6 @@
import org.web3j.crypto.Sign.SignatureData;
import org.web3j.crypto.TransactionEncoder;
import org.web3j.crypto.transaction.type.TransactionType;
import org.web3j.utils.Numeric;

public class TransactionSerializer {
private static final Logger LOG = LogManager.getLogger();
Expand All @@ -45,40 +45,42 @@ public TransactionSerializer(final ArtifactSignerProvider signer, final long cha
}

public String serialize(final Transaction transaction) {

SignatureData signatureData = null;

if (!transaction.isEip1559()) {
signatureData = new SignatureData(longToBytes(chainId), new byte[] {}, new byte[] {});
if (transaction.isEip1559()) {
return toHexString(serializeEip1559(transaction));
} else {
return toHexString(serializeFrontier(transaction));
}
}

byte[] bytesToSign = transaction.rlpEncode(signatureData);
private byte[] serializeFrontier(final Transaction transaction) {
SignatureData preSigningSignatureData =
new SignatureData(longToBytes(chainId), new byte[] {}, new byte[] {});
byte[] bytesToSign = transaction.rlpEncode(preSigningSignatureData);

if (transaction.isEip1559()) {
bytesToSign = prependEip1559TransactionType(bytesToSign);
}
SignatureData signatureData = sign(transaction.sender(), bytesToSign);

final Signature signature = sign(transaction.sender(), bytesToSign);
signatureData = TransactionEncoder.createEip155SignatureData(signatureData, chainId);
return transaction.rlpEncode(signatureData);
}

SignatureData web3jSignature =
new SignatureData(
signature.getV().toByteArray(),
signature.getR().toByteArray(),
signature.getS().toByteArray());
private byte[] serializeEip1559(final Transaction transaction) {
byte[] bytesToSign = transaction.rlpEncode(null);
bytesToSign = prependEip1559TransactionType(bytesToSign);

if (!transaction.isEip1559()) {
web3jSignature = TransactionEncoder.createEip155SignatureData(web3jSignature, chainId);
}
final SignatureData signatureData = sign(transaction.sender(), bytesToSign);

byte[] serializedBytes = transaction.rlpEncode(web3jSignature);
if (transaction.isEip1559()) {
serializedBytes = prependEip1559TransactionType(serializedBytes);
}
byte[] serializedBytes = transaction.rlpEncode(signatureData);
return prependEip1559TransactionType(serializedBytes);
}

return Numeric.toHexString(serializedBytes);
private static byte[] prependEip1559TransactionType(byte[] bytesToSign) {
return ByteBuffer.allocate(bytesToSign.length + 1)
.put(TransactionType.EIP1559.getRlpType())
.put(bytesToSign)
.array();
}

private Signature sign(final String sender, final byte[] bytesToSign) {
private SignatureData sign(final String sender, final byte[] bytesToSign) {
Optional<String> publicKey = signerPublicKeyFromAddress(signer, sender);

if (publicKey.isEmpty()) {
Expand All @@ -95,13 +97,10 @@ private Signature sign(final String sender, final byte[] bytesToSign) {
.get();

final Signature signature = artifactSignature.getSignatureData();
return signature;
}

private static byte[] prependEip1559TransactionType(byte[] bytesToSign) {
return ByteBuffer.allocate(bytesToSign.length + 1)
.put(TransactionType.EIP1559.getRlpType())
.put(bytesToSign)
.array();
return new SignatureData(
signature.getV().toByteArray(),
signature.getR().toByteArray(),
signature.getS().toByteArray());
}
}

0 comments on commit 63344a3

Please sign in to comment.