internal/ethapi: quantity-encode storage keys in eth_getProof response (#27309)
This changes the eth_getProof method implementation to re-encode the requested storage keys, canonicalizing them in the response. For backwards-compatibility reasons, go-ethereum accepts non-canonical hex keys. Accepting them is fine, but we should not mirror invalid inputs into the output. Closes #27306 --------- Co-authored-by: Martin Holst Swende <martin@swende.se> Co-authored-by: Felix Lange <fjl@twurst.com>
This commit is contained in:
co-authored by
Martin Holst Swende
Felix Lange
parent
713fc8bbe6
commit
fd5d2ef0a6
@@ -105,6 +105,9 @@ func TestGethClient(t *testing.T) {
|
||||
{
|
||||
"TestGetProof",
|
||||
func(t *testing.T) { testGetProof(t, client) },
|
||||
}, {
|
||||
"TestGetProofCanonicalizeKeys",
|
||||
func(t *testing.T) { testGetProofCanonicalizeKeys(t, client) },
|
||||
}, {
|
||||
"TestGCStats",
|
||||
func(t *testing.T) { testGCStats(t, client) },
|
||||
@@ -218,6 +221,7 @@ func testGetProof(t *testing.T, client *rpc.Client) {
|
||||
if result.Balance.Cmp(balance) != 0 {
|
||||
t.Fatalf("invalid balance, want: %v got: %v", balance, result.Balance)
|
||||
}
|
||||
|
||||
// test storage
|
||||
if len(result.StorageProof) != 1 {
|
||||
t.Fatalf("invalid storage proof, want 1 proof, got %v proof(s)", len(result.StorageProof))
|
||||
@@ -228,7 +232,37 @@ func testGetProof(t *testing.T, client *rpc.Client) {
|
||||
t.Fatalf("invalid storage proof value, want: %v, got: %v", slotValue, proof.Value.Bytes())
|
||||
}
|
||||
if proof.Key != testSlot.String() {
|
||||
t.Fatalf("invalid storage proof key, want: %v, got: %v", testSlot.String(), proof.Key)
|
||||
t.Fatalf("invalid storage proof key, want: %q, got: %q", testSlot.String(), proof.Key)
|
||||
}
|
||||
}
|
||||
|
||||
func testGetProofCanonicalizeKeys(t *testing.T, client *rpc.Client) {
|
||||
ec := New(client)
|
||||
|
||||
// Tests with non-canon input for storage keys.
|
||||
// Here we check that the storage key is canonicalized.
|
||||
result, err := ec.GetProof(context.Background(), testAddr, []string{"0x0dEadbeef"}, nil)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if result.StorageProof[0].Key != "0xdeadbeef" {
|
||||
t.Fatalf("wrong storage key encoding in proof: %q", result.StorageProof[0].Key)
|
||||
}
|
||||
if result, err = ec.GetProof(context.Background(), testAddr, []string{"0x000deadbeef"}, nil); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if result.StorageProof[0].Key != "0xdeadbeef" {
|
||||
t.Fatalf("wrong storage key encoding in proof: %q", result.StorageProof[0].Key)
|
||||
}
|
||||
|
||||
// If the requested storage key is 32 bytes long, it will be returned as is.
|
||||
hashSizedKey := "0x00000000000000000000000000000000000000000000000000000000deadbeef"
|
||||
result, err = ec.GetProof(context.Background(), testAddr, []string{hashSizedKey}, nil)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if result.StorageProof[0].Key != hashSizedKey {
|
||||
t.Fatalf("wrong storage key encoding in proof: %q", result.StorageProof[0].Key)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user