Modify how poa error redundancy middleware is created for clarity and better cohesion with providing the name of the original poa middleware used.

v7.4.1-hotfix^2
derekpierre 2024-08-28 09:00:22 -04:00
parent 45dcc317fe
commit a0c0431969
No known key found for this signature in database
2 changed files with 30 additions and 34 deletions

View File

@ -16,7 +16,7 @@ from nucypher.blockchain.eth.constants import (
POA_CHAINS,
PUBLIC_CHAINS,
)
from nucypher.blockchain.middleware.poa import POAErrorRedundancyMiddleware
from nucypher.blockchain.middleware.poa import create_poa_error_redundancy_middleware
from nucypher.blockchain.middleware.retry import (
AlchemyRetryRequestMiddleware,
InfuraRetryRequestMiddleware,
@ -113,7 +113,7 @@ class EthereumClient:
# POA error redundancy middleware, just in case
self.log.debug("Adding POA redundancy middleware")
self.add_middleware(POAErrorRedundancyMiddleware)
self.add_middleware(create_poa_error_redundancy_middleware(existing_poa_middleware_name=poa_middleware_name))
# simple cache middleware
self.log.debug("Adding simple_cache_middleware")

View File

@ -3,47 +3,43 @@ from typing import Any, Callable
from web3 import Web3
from web3.exceptions import ExtraDataLengthError
from web3.middleware import geth_poa_middleware
from web3.types import RPCEndpoint, RPCResponse
from web3.types import Middleware, RPCEndpoint, RPCResponse
from nucypher.utilities.logging import Logger
class POAErrorRedundancyMiddleware:
def create_poa_error_redundancy_middleware(existing_poa_middleware_name: str = "poa") -> Middleware:
"""
Redundant middleware for replacing already added named poa middleware if ExtraDataLengthError
still encountered. Extra layer of defense in case random POA error is observed
still encountered. Extra layer of defense in case random POA error is observed.
"""
POA_MIDDLEWARE_NAME = "poa"
def poa_error_redundancy_middleware(
make_request: Callable[[RPCEndpoint, Any], RPCResponse], _w3: "Web3"
) -> Callable[[RPCEndpoint, Any], RPCResponse]:
logger = Logger("POAErrorRedundancyMiddleware")
def __init__(
self,
make_request: Callable[[RPCEndpoint, Any], RPCResponse],
w3: Web3,
existing_poa_middleware_name: str = POA_MIDDLEWARE_NAME,
):
self.w3 = w3
self.make_request = make_request
self.existing_poa_middleware_name = existing_poa_middleware_name
self.logger = Logger(self.__class__.__name__)
def middleware(method: RPCEndpoint, params: Any) -> RPCResponse:
try:
response = make_request(method, params)
except ExtraDataLengthError:
logger.warn(
"RPC request failed due to extraData error; re-injecting poa middleware and retrying"
)
# add / replace existing poa middleware; replacement seems unlikely but just in case
if _w3.middleware_onion.get(existing_poa_middleware_name):
# we can't have > 1 geth_poa_middleware added (event with different names) so the
# removal-then-add is just for safety.
_w3.middleware_onion.remove(existing_poa_middleware_name)
_w3.middleware_onion.inject(
geth_poa_middleware, layer=0, name=existing_poa_middleware_name
)
def __call__(self, method, params) -> RPCResponse:
try:
response = self.make_request(method, params)
except ExtraDataLengthError:
self.logger.warn(
"RPC request failed due to extraData error; re-injecting poa middleware and retrying"
)
# add / replace existing poa middleware; replacement seems unlikely but just in case
if self.w3.middleware_onion.get(self.existing_poa_middleware_name):
# we can't have > 1 geth_poa_middleware added (event with different names) so the
# removal-then-add is just for safety.
self.w3.middleware_onion.remove(self.existing_poa_middleware_name)
self.w3.middleware_onion.inject(
geth_poa_middleware, layer=0, name=self.existing_poa_middleware_name
)
# try again
response = make_request(method, params)
# try again
response = self.make_request(method, params)
return response
return response
return middleware
return poa_error_redundancy_middleware