From b7d827a87a30652c75a419280bd86c212cdfdecd Mon Sep 17 00:00:00 2001 From: nicksavers Date: Mon, 5 May 2014 12:55:25 +0200 Subject: [PATCH] Add sign function to Transaction --- .../net/message/TransactionsMessage.java | 6 ++-- .../java/org/ethereum/net/vo/Transaction.java | 34 ++++++++++++++++--- 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/ethereumj-core/src/main/java/org/ethereum/net/message/TransactionsMessage.java b/ethereumj-core/src/main/java/org/ethereum/net/message/TransactionsMessage.java index cb991896..1a839310 100644 --- a/ethereumj-core/src/main/java/org/ethereum/net/message/TransactionsMessage.java +++ b/ethereumj-core/src/main/java/org/ethereum/net/message/TransactionsMessage.java @@ -29,7 +29,7 @@ public class TransactionsMessage extends Message { public void parseRLP() { RLPList paramsList = (RLPList) rawData.getElement(0); - if ( Command.fromInt(((RLPItem)(paramsList).getElement(0)).getData()[0] & 0xFF) != TRANSACTIONS){ + if (Command.fromInt(((RLPItem)(paramsList).getElement(0)).getData()[0] & 0xFF) != TRANSACTIONS) { throw new Error("TransactionMessage: parsing for mal data"); } @@ -53,10 +53,10 @@ public class TransactionsMessage extends Message { return null; } - public String toString(){ + public String toString() { if(!parsed) parseRLP(); StringBuffer sb = new StringBuffer(); - for (Transaction transactionData : transactions){ + for (Transaction transactionData : transactions) { sb.append(" ").append(transactionData).append("\n"); } return "Transactions Message [\n" + sb.toString() + " ]"; diff --git a/ethereumj-core/src/main/java/org/ethereum/net/vo/Transaction.java b/ethereumj-core/src/main/java/org/ethereum/net/vo/Transaction.java index 62475570..ac3031c3 100644 --- a/ethereumj-core/src/main/java/org/ethereum/net/vo/Transaction.java +++ b/ethereumj-core/src/main/java/org/ethereum/net/vo/Transaction.java @@ -1,6 +1,7 @@ package org.ethereum.net.vo; import org.ethereum.crypto.ECKey.ECDSASignature; +import org.ethereum.crypto.ECKey; import org.ethereum.crypto.HashUtil; import org.ethereum.net.rlp.RLPItem; import org.ethereum.net.rlp.RLPList; @@ -19,10 +20,10 @@ public class Transaction { private RLPList rawData; private boolean parsed = false; - /* creation contract tx or simple send tx - * [ nonce, value, receiveAddress, gasPrice, gasDeposit, data, signatureV, signatureR, signatureS ] - * or - * [ nonce, endowment, 0, gasPrice, gasDeposit (for init), body, init, signatureV, signatureR, signatureS ] + /* creation contract tx + * [ nonce, endowment, 0, gasPrice, gasDeposit (for init), body, init, signature(v, r, s) ] + * or simple send tx + * [ nonce, value, receiveAddress, gasPrice, gasDeposit, data, signature(v, r, s) ] */ /* SHA3 hash of the rlpEncoded transaction */ @@ -146,7 +147,32 @@ public class Transaction { if (!parsed) rlpParse(); return signature; } + + /********* + * Crypto + */ + + public ECKey getKey() { + byte[] hash = this.getHash(); + return ECKey.recoverFromSignature(signature.v, signature, hash, true); + } + + public byte[] sender() { + ECKey eckey = this.getKey(); + // Validate the returned key. + // Return null if public key isn't in a correct format + if (!eckey.isPubKeyCanonical()) { + return null; + } + return eckey.getAddress(); + } + public void sign(byte[] privKeyBytes) throws Exception { + byte[] hash = this.getHash(); + ECKey key = ECKey.fromPrivate(privKeyBytes); + this.signature = key.sign(hash); + } + @Override public String toString() { if (!parsed) rlpParse();