bundler-spec-tests 分析

基础分析

  • 项目名称:bundler-spec-tests , 源码链接
  • 引用的核心库
    • pytest - 使用的pytest框架做bundler兼容性测试(这个框架之前没有接触过 刚刚简单查了下资料)
    • @account-abstraction - 用户测试数据生成
    • bundler-spec - RPC接口规格
  • 项目概述:
    • bundler-spec-tests 这个库的设立初衷为分散的bundler实施者提供统一的接口测试工具,以便内部细节实施不同的bundler在对外提供的接口保持一致(bundler组建大mempool的前提)
  • 代码分析:
    • 代码分为规格(spec/schema)与 测试用例
    • 规格
      • 用来定义每个接口正常返回数据以及异常返回的数据规格,如果测试用例调用到接口时返回的规格不一致则测试不同过
      • 代码细节举例:
      • 例如:此链接位置 中:
        1. - name: debug_bundler_sendBundleNow
            summary: Forces the bundler to execute the entire current mempool.
            params: []
            result:
              name: Transaction Hash
              schema:
                $ref: '#/components/schemas/hash32'
          
        2. 备注:以上多个yaml应该是最终生成一个openrpc.json文件以方便使用
        3. 定义了测试接口debug_bundler_sendBundleNow时需要返回一个hash32类型的Transaction Hash,具体hash32的定义在此链接

          hash32:
            title: 32 byte hex value
            type: string
            pattern: ^0x([0-9a-f][0-9a-f]){0,32}$
          
    • 测试用例
      • 用来执行每个接口并把返回值与 规格(spec/schema)做匹配 来确定接口返回是否符合预定义
      • 比如上面接口的测试定义在此链接 , 可以独立调用的函数定义在此链接
      • @pytest.fixture
        def sendBundleNow():
            return RPCRequest(method="debug_bundler_sendBundleNow").send()
        

        在任何测试流程中需要测试debug_bundler_sendBundleNow接口时都可以使用下面类似的测试代码(例如测试 eth_sendUserOperation 接口同时在测试内部检测debug_bundler_sendBundleNow状态) ,源码在此链接

        @pytest.mark.parametrize("method", ["eth_sendUserOperation"], ids=[""])
        def test_eth_sendUserOperation(wallet_contract, userOp, schema):
            state_before = wallet_contract.functions.state().call()
            assert state_before == 0
            response = userOp.send()
            sendBundleNow() #调用RPC:debug_bundler_sendBundleNow 测试
            state_after = wallet_contract.functions.state().call()
            assert response.result == userOpHash(wallet_contract, userOp)
            assert state_after == 1111111
            Validator.check_schema(schema)
            validate(instance=response.result, schema=schema)
        
  • 另外源码中有以下文件未实现:https://github.com/eth-infinitism/bundler-spec-tests/blob/v0.4.0/tests/test_p2p.py
    • 推测此测试用例是希望测试EIP4337内存池的P2P功能 , 但因未确定规格标准 暂时未实现