Add sign function to Transaction

This commit is contained in:
nicksavers 2014-05-05 12:55:25 +02:00
parent f57bb68e06
commit b7d827a87a
2 changed files with 33 additions and 7 deletions

View File

@ -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() + " ]";

View File

@ -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();