ethereum.forks.prague.requestsethereum.forks.osaka.requests
Requests were introduced in EIP-7685 as a general purpose framework forRequests were introduced in EIP-7685 as a a general purpose framework for
storing contract-triggered requests. It extends the execution header and
body with a single field each to store the request information.
This inherently exposes the requests to the consensus layer, which can
then process each one.
DEPOSIT_CONTRACT_ADDRESS
25 | DEPOSIT_CONTRACT_ADDRESS = hex_to_address( |
---|---|
26 | "0x00000000219ab540356cbb839cbe05303d7705fa" |
27 | ) |
DEPOSIT_EVENT_SIGNATURE_HASH
28 | DEPOSIT_EVENT_SIGNATURE_HASH = hex_to_bytes32( |
---|---|
29 | "0x649bbc62d0e31342afea4e5cd82d4049e7e1ee912fc0889aa790803be39038c5" |
30 | ) |
DEPOSIT_REQUEST_TYPE
31 | DEPOSIT_REQUEST_TYPE = b"\x00" |
---|
WITHDRAWAL_REQUEST_TYPE
32 | WITHDRAWAL_REQUEST_TYPE = b"\x01" |
---|
CONSOLIDATION_REQUEST_TYPE
33 | CONSOLIDATION_REQUEST_TYPE = b"\x02" |
---|
DEPOSIT_EVENT_LENGTH
36 | DEPOSIT_EVENT_LENGTH = Uint(576) |
---|
PUBKEY_OFFSET
38 | PUBKEY_OFFSET = Uint(160) |
---|
WITHDRAWAL_CREDENTIALS_OFFSET
39 | WITHDRAWAL_CREDENTIALS_OFFSET = Uint(256) |
---|
AMOUNT_OFFSET
40 | AMOUNT_OFFSET = Uint(320) |
---|
SIGNATURE_OFFSET
41 | SIGNATURE_OFFSET = Uint(384) |
---|
INDEX_OFFSET
42 | INDEX_OFFSET = Uint(512) |
---|
PUBKEY_SIZE
44 | PUBKEY_SIZE = Uint(48) |
---|
WITHDRAWAL_CREDENTIALS_SIZE
45 | WITHDRAWAL_CREDENTIALS_SIZE = Uint(32) |
---|
AMOUNT_SIZE
46 | AMOUNT_SIZE = Uint(8) |
---|
SIGNATURE_SIZE
47 | SIGNATURE_SIZE = Uint(96) |
---|
INDEX_SIZE
48 | INDEX_SIZE = Uint(8) |
---|
extract_deposit_data
Extracts Deposit Request from the DepositContract.DepositEvent data.
Raises
InvalidBlock : If the deposit contract did not produce a valid log.
def extract_deposit_data(data: Bytes) -> Bytes:
52 | """ |
---|---|
53 | Extracts Deposit Request from the DepositContract.DepositEvent data. |
54 |
|
55 | Raises |
56 | ------ |
57 | InvalidBlock : |
58 | If the deposit contract did not produce a valid log. |
59 |
|
60 | """ |
61 | if ulen(data) != DEPOSIT_EVENT_LENGTH: |
62 | raise InvalidBlock("Invalid deposit event data length") |
63 | |
64 | # Check that all the offsets are in order |
65 | pubkey_offset = Uint.from_be_bytes(data[0:32]) |
66 | if pubkey_offset != PUBKEY_OFFSET: |
67 | raise InvalidBlock("Invalid pubkey offset in deposit log") |
68 | |
69 | withdrawal_credentials_offset = Uint.from_be_bytes(data[32:64]) |
70 | if withdrawal_credentials_offset != WITHDRAWAL_CREDENTIALS_OFFSET: |
71 | raise InvalidBlock( |
72 | "Invalid withdrawal credentials offset in deposit log" |
73 | ) |
74 | |
75 | amount_offset = Uint.from_be_bytes(data[64:96]) |
76 | if amount_offset != AMOUNT_OFFSET: |
77 | raise InvalidBlock("Invalid amount offset in deposit log") |
78 | |
79 | signature_offset = Uint.from_be_bytes(data[96:128]) |
80 | if signature_offset != SIGNATURE_OFFSET: |
81 | raise InvalidBlock("Invalid signature offset in deposit log") |
82 | |
83 | index_offset = Uint.from_be_bytes(data[128:160]) |
84 | if index_offset != INDEX_OFFSET: |
85 | raise InvalidBlock("Invalid index offset in deposit log") |
86 | |
87 | # Check that all the sizes are in order |
88 | pubkey_size = Uint.from_be_bytes( |
89 | data[pubkey_offset : pubkey_offset + Uint(32)] |
90 | ) |
91 | if pubkey_size != PUBKEY_SIZE: |
92 | raise InvalidBlock("Invalid pubkey size in deposit log") |
93 | |
94 | pubkey = data[ |
95 | pubkey_offset + Uint(32) : pubkey_offset + Uint(32) + PUBKEY_SIZE |
96 | ] |
97 | |
98 | withdrawal_credentials_size = Uint.from_be_bytes( |
99 | data[ |
100 | withdrawal_credentials_offset : withdrawal_credentials_offset |
101 | + Uint(32) |
102 | ], |
103 | ) |
104 | if withdrawal_credentials_size != WITHDRAWAL_CREDENTIALS_SIZE: |
105 | raise InvalidBlock( |
106 | "Invalid withdrawal credentials size in deposit log" |
107 | ) |
108 | |
109 | withdrawal_credentials = data[ |
110 | withdrawal_credentials_offset |
111 | + Uint(32) : withdrawal_credentials_offset |
112 | + Uint(32) |
113 | + WITHDRAWAL_CREDENTIALS_SIZE |
114 | ] |
115 | |
116 | amount_size = Uint.from_be_bytes( |
117 | data[amount_offset : amount_offset + Uint(32)] |
118 | ) |
119 | if amount_size != AMOUNT_SIZE: |
120 | raise InvalidBlock("Invalid amount size in deposit log") |
121 | |
122 | amount = data[ |
123 | amount_offset + Uint(32) : amount_offset + Uint(32) + AMOUNT_SIZE |
124 | ] |
125 | |
126 | signature_size = Uint.from_be_bytes( |
127 | data[signature_offset : signature_offset + Uint(32)] |
128 | ) |
129 | if signature_size != SIGNATURE_SIZE: |
130 | raise InvalidBlock("Invalid signature size in deposit log") |
131 | |
132 | signature = data[ |
133 | signature_offset + Uint(32) : signature_offset |
134 | + Uint(32) |
135 | + SIGNATURE_SIZE |
136 | ] |
137 | |
138 | index_size = Uint.from_be_bytes( |
139 | data[index_offset : index_offset + Uint(32)] |
140 | ) |
141 | if index_size != INDEX_SIZE: |
142 | raise InvalidBlock("Invalid index size in deposit log") |
143 | |
144 | index = data[ |
145 | index_offset + Uint(32) : index_offset + Uint(32) + INDEX_SIZE |
146 | ] |
147 | |
148 | return pubkey + withdrawal_credentials + amount + signature + index |
parse_deposit_requests
Parse deposit requests from the block output.
def parse_deposit_requests(block_output: BlockOutput) -> Bytes:
152 | """ |
---|---|
153 | Parse deposit requests from the block output. |
154 | """ |
155 | deposit_requests: Bytes = b"" |
156 | for key in block_output.receipt_keys: |
157 | receipt = trie_get(block_output.receipts_trie, key) |
158 | assert receipt is not None |
159 | decoded_receipt = decode_receipt(receipt) |
160 | for log in decoded_receipt.logs: |
161 | if log.address == DEPOSIT_CONTRACT_ADDRESS: |
162 | if ( |
163 | len(log.topics) > 0 |
164 | and log.topics[0] == DEPOSIT_EVENT_SIGNATURE_HASH |
165 | ): |
166 | request = extract_deposit_data(log.data) |
167 | deposit_requests += request |
168 | |
169 | return deposit_requests |
compute_requests_hash
Get the hash of the requests using the SHA2-256 algorithm.
Parameters
requests : Bytes The requests to hash.
Returns
requests_hash : Bytes The hash of the requests.
def compute_requests_hash(requests: List[Bytes]) -> Bytes:
173 | """ |
---|---|
174 | Get the hash of the requests using the SHA2-256 algorithm. |
175 |
|
176 | Parameters |
177 | ---------- |
178 | requests : Bytes |
179 | The requests to hash. |
180 |
|
181 | Returns |
182 | ------- |
183 | requests_hash : Bytes |
184 | The hash of the requests. |
185 |
|
186 | """ |
187 | m = sha256() |
188 | for request in requests: |
189 | m.update(sha256(request).digest()) |
190 | |
191 | return m.digest() |