core/types: don't modify signature V when reading large chainID (#30157)

pull/30162/head
Danyal Prout 4 months ago committed by GitHub
parent 169aa91449
commit a0d2613ef0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 4
      core/types/transaction_signing.go
  2. 35
      core/types/transaction_test.go

@ -572,6 +572,6 @@ func deriveChainId(v *big.Int) *big.Int {
} }
return new(big.Int).SetUint64((v - 35) / 2) return new(big.Int).SetUint64((v - 35) / 2)
} }
v.Sub(v, big.NewInt(35)) vCopy := new(big.Int).Sub(v, big.NewInt(35))
return v.Rsh(v, 1) return vCopy.Rsh(vCopy, 1)
} }

@ -345,6 +345,41 @@ func TestTransactionCoding(t *testing.T) {
} }
} }
func TestLegacyTransaction_ConsistentV_LargeChainIds(t *testing.T) {
chainId := new(big.Int).SetUint64(13317435930671861669)
txdata := &LegacyTx{
Nonce: 1,
Gas: 1,
GasPrice: big.NewInt(2),
Data: []byte("abcdef"),
}
key, err := crypto.GenerateKey()
if err != nil {
t.Fatalf("could not generate key: %v", err)
}
tx, err := SignNewTx(key, NewEIP2930Signer(chainId), txdata)
if err != nil {
t.Fatalf("could not sign transaction: %v", err)
}
// Make a copy of the initial V value
preV, _, _ := tx.RawSignatureValues()
preV = new(big.Int).Set(preV)
if tx.ChainId().Cmp(chainId) != 0 {
t.Fatalf("wrong chain id: %v", tx.ChainId())
}
v, _, _ := tx.RawSignatureValues()
if v.Cmp(preV) != 0 {
t.Fatalf("wrong v value: %v", v)
}
}
func encodeDecodeJSON(tx *Transaction) (*Transaction, error) { func encodeDecodeJSON(tx *Transaction) (*Transaction, error) {
data, err := json.Marshal(tx) data, err := json.Marshal(tx)
if err != nil { if err != nil {

Loading…
Cancel
Save