|
@@ -116,11 +116,21 @@ func (tx *Transaction) To() *common.Address {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+// Hash hashes the RLP encoding of tx.
|
|
|
|
|
+// It uniquely identifies the transaction.
|
|
|
func (tx *Transaction) Hash() common.Hash {
|
|
func (tx *Transaction) Hash() common.Hash {
|
|
|
if hash := tx.hash.Load(); hash != nil {
|
|
if hash := tx.hash.Load(); hash != nil {
|
|
|
return hash.(common.Hash)
|
|
return hash.(common.Hash)
|
|
|
}
|
|
}
|
|
|
- v := rlpHash([]interface{}{
|
|
|
|
|
|
|
+ v := rlpHash(tx)
|
|
|
|
|
+ tx.hash.Store(v)
|
|
|
|
|
+ return v
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// SigHash returns the hash to be signed by the sender.
|
|
|
|
|
+// It does not uniquely identify the transaction.
|
|
|
|
|
+func (tx *Transaction) SigHash() common.Hash {
|
|
|
|
|
+ return rlpHash([]interface{}{
|
|
|
tx.data.AccountNonce,
|
|
tx.data.AccountNonce,
|
|
|
tx.data.Price,
|
|
tx.data.Price,
|
|
|
tx.data.GasLimit,
|
|
tx.data.GasLimit,
|
|
@@ -128,8 +138,6 @@ func (tx *Transaction) Hash() common.Hash {
|
|
|
tx.data.Amount,
|
|
tx.data.Amount,
|
|
|
tx.data.Payload,
|
|
tx.data.Payload,
|
|
|
})
|
|
})
|
|
|
- tx.hash.Store(v)
|
|
|
|
|
- return v
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func (tx *Transaction) Size() common.StorageSize {
|
|
func (tx *Transaction) Size() common.StorageSize {
|
|
@@ -180,7 +188,7 @@ func (tx *Transaction) publicKey() ([]byte, error) {
|
|
|
sig[64] = tx.data.V - 27
|
|
sig[64] = tx.data.V - 27
|
|
|
|
|
|
|
|
// recover the public key from the signature
|
|
// recover the public key from the signature
|
|
|
- hash := tx.Hash()
|
|
|
|
|
|
|
+ hash := tx.SigHash()
|
|
|
pub, err := crypto.Ecrecover(hash[:], sig)
|
|
pub, err := crypto.Ecrecover(hash[:], sig)
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
glog.V(logger.Error).Infof("Could not get pubkey from signature: ", err)
|
|
glog.V(logger.Error).Infof("Could not get pubkey from signature: ", err)
|
|
@@ -204,7 +212,7 @@ func (tx *Transaction) WithSignature(sig []byte) (*Transaction, error) {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func (tx *Transaction) SignECDSA(prv *ecdsa.PrivateKey) (*Transaction, error) {
|
|
func (tx *Transaction) SignECDSA(prv *ecdsa.PrivateKey) (*Transaction, error) {
|
|
|
- h := tx.Hash()
|
|
|
|
|
|
|
+ h := tx.SigHash()
|
|
|
sig, err := crypto.Sign(h[:], prv)
|
|
sig, err := crypto.Sign(h[:], prv)
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
return nil, err
|
|
return nil, err
|