core/types: don't modify signature V when reading large chainID (#30157)
This commit is contained in:
parent
169aa91449
commit
a0d2613ef0
@ -572,6 +572,6 @@ func deriveChainId(v *big.Int) *big.Int {
|
||||
}
|
||||
return new(big.Int).SetUint64((v - 35) / 2)
|
||||
}
|
||||
v.Sub(v, big.NewInt(35))
|
||||
return v.Rsh(v, 1)
|
||||
vCopy := new(big.Int).Sub(v, big.NewInt(35))
|
||||
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) {
|
||||
data, err := json.Marshal(tx)
|
||||
if err != nil {
|
||||
|
Loading…
Reference in New Issue
Block a user