瀏覽代碼

core/types, xeth: separate tx hash and tx signature hash

Felix Lange 10 年之前
父節點
當前提交
ec9620fb2f
共有 3 個文件被更改,包括 17 次插入9 次删除
  1. 13 5
      core/types/transaction.go
  2. 3 3
      core/types/transaction_test.go
  3. 1 1
      xeth/xeth.go

+ 13 - 5
core/types/transaction.go

@@ -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 {
 	if hash := tx.hash.Load(); hash != nil {
 		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.Price,
 		tx.data.GasLimit,
@@ -128,8 +138,6 @@ func (tx *Transaction) Hash() common.Hash {
 		tx.data.Amount,
 		tx.data.Payload,
 	})
-	tx.hash.Store(v)
-	return v
 }
 
 func (tx *Transaction) Size() common.StorageSize {
@@ -180,7 +188,7 @@ func (tx *Transaction) publicKey() ([]byte, error) {
 	sig[64] = tx.data.V - 27
 
 	// recover the public key from the signature
-	hash := tx.Hash()
+	hash := tx.SigHash()
 	pub, err := crypto.Ecrecover(hash[:], sig)
 	if err != nil {
 		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) {
-	h := tx.Hash()
+	h := tx.SigHash()
 	sig, err := crypto.Sign(h[:], prv)
 	if err != nil {
 		return nil, err

+ 3 - 3
core/types/transaction_test.go

@@ -34,11 +34,11 @@ var (
 	)
 )
 
-func TestTransactionHash(t *testing.T) {
-	if emptyTx.Hash() != common.HexToHash("c775b99e7ad12f50d819fcd602390467e28141316969f4b57f0626f74fe3b386") {
+func TestTransactionSigHash(t *testing.T) {
+	if emptyTx.SigHash() != common.HexToHash("c775b99e7ad12f50d819fcd602390467e28141316969f4b57f0626f74fe3b386") {
 		t.Errorf("empty transaction hash mismatch, got %x", emptyTx.Hash())
 	}
-	if rightvrsTx.Hash() != common.HexToHash("fe7a79529ed5f7c3375d06b26b186a8644e0e16c373d7a12be41c62d6042b77a") {
+	if rightvrsTx.SigHash() != common.HexToHash("fe7a79529ed5f7c3375d06b26b186a8644e0e16c373d7a12be41c62d6042b77a") {
 		t.Errorf("RightVRS transaction hash mismatch, got %x", rightvrsTx.Hash())
 	}
 }

+ 1 - 1
xeth/xeth.go

@@ -978,7 +978,7 @@ func (self *XEth) Transact(fromStr, toStr, nonceStr, valueStr, gasStr, gasPriceS
 }
 
 func (self *XEth) sign(tx *types.Transaction, from common.Address, didUnlock bool) (*types.Transaction, error) {
-	hash := tx.Hash()
+	hash := tx.SigHash()
 	sig, err := self.doSign(from, hash, didUnlock)
 	if err != nil {
 		return tx, err