mirror of https://github.com/status-im/op-geth.git
Merge pull request #1409 from fjl/fix-tx-hash
core/types, xeth: separate tx hash and tx signature hash
This commit is contained in:
commit
b533aaa765
|
@ -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
|
||||||
|
|
|
@ -34,11 +34,11 @@ var (
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestTransactionHash(t *testing.T) {
|
func TestTransactionSigHash(t *testing.T) {
|
||||||
if emptyTx.Hash() != common.HexToHash("c775b99e7ad12f50d819fcd602390467e28141316969f4b57f0626f74fe3b386") {
|
if emptyTx.SigHash() != common.HexToHash("c775b99e7ad12f50d819fcd602390467e28141316969f4b57f0626f74fe3b386") {
|
||||||
t.Errorf("empty transaction hash mismatch, got %x", emptyTx.Hash())
|
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())
|
t.Errorf("RightVRS transaction hash mismatch, got %x", rightvrsTx.Hash())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -977,7 +977,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) {
|
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)
|
sig, err := self.doSign(from, hash, didUnlock)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return tx, err
|
return tx, err
|
||||||
|
|
Loading…
Reference in New Issue