mirror of https://github.com/nucypher/nucypher.git
Modify how poa error redundancy middleware is created for clarity and better cohesion with providing the name of the original poa middleware used.
parent
45dcc317fe
commit
a0c0431969
|
@ -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")
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue