1. 引言
前序博客:
- Polygon zkEVM网络节点
相关代码:
- https://github.com/0xPolygonHermez/zkevm-node(Go语言)
Polygon zkEVM节点提供的主要服务模块有:
- 1)JSON-RPC服务
- 2)Sequencer服务
- 3)Aggregator服务
- 4)Synchronizer服务
- 5)Broadcast服务
以太坊JSON-RPC接口 与 Polygon zkEVM中的JSON-RPC接口 对比情况为:
序号 RPC接口名 以太坊 Hermez 2.0 备注 1 GetBlockByHash ✔️ ✔️ 2 GetBlockByNumber ✔️ ✔️ 3 GetBlockTransactionCountByHash ✔️ ✔️ 4 GetBlockTransactionCountByNumber ✔️ ✔️ 5 getUncleCountByBlockHash ✔️ ✔️ 6 getUncleCountByBlockNumber ✔️ ✔️ 7 ChainId ✔️ ✔️ 8 Syncing ✔️ ✔️ 9 Coinbase ✔️ ❌ 10 Accounts ✔️ ❌ 11 BlockNumber ✔️ ✔️ 12 Call ✔️ ✔️ 13 EstimateGas ✔️ ✔️ 14 CreateAccessList ✔️ ❌ EIP-2930:新交易类型,需以更贵的方式访问清单(地址或storage keys)外的内容。 15 GasPrice ✔️ ✔️ 16 MaxPriorityFeePerGas ✔️ ❌ 17 FeeHistory ✔️ ❌ 18 NewFilter ✔️ ✔️ 19 NewBlockFilter ✔️ ✔️ 20 NewPendingTransactionFilter ✔️ ✔️ 21 UninstallFilter ✔️ ✔️ 22 GetFilterChanges ✔️ ✔️ 23 GetFilterLogs ✔️ ✔️ 24 GetLogs ✔️ ✔️ 25 Mining ✔️ ❌ 26 Hashrate ✔️ ❌ 27 GetWork ✔️ ❌ 28 SubmitWork ✔️ ❌ 29 SubmitHashrate ✔️ ❌ 30 Sign ✔️ ❌ 31 SignTransaction ✔️ ❌ 32 GetBalance ✔️ ✔️ 33 GetStorageAt ✔️ ✔️ 34 GetTransactionCount ✔️ ✔️ 35 GetCode ✔️ ✔️ 36 GetProof ✔️ ❌ 37 SendTransaction ✔️ ❌ 38 SendRawTransaction ✔️ ✔️ 39 GetTransactionByHash ✔️ ✔️ 40 GetTransactionByBlockHashAndIndex ✔️ ✔️ 41 GetTransactionByBlockNumberAndIndex ✔️ ✔️ 42 GetTransactionReceipt ✔️ ✔️ 43 GetCompilers ✔️ ✔️ 44 GetUncleByBlockHashAndIndex ✔️ ✔️ 45 GetUncleByBlockNumberAndIndex ✔️ ✔️ 46 ProtocolVersion ✔️ ✔️Hermez 2.0(zkEVM)除实现了以上与以太坊兼容的RPC接口之外,还额外实现了一些与state交互、与pool交互的接口:
// jsonRPCTxPool contains the methods required to interact with the tx pool. type jsonRPCTxPool interface { AddTx(ctx context.Context, tx types.Transaction) error GetPendingTxs(ctx context.Context, isClaims bool, limit uint64) ([]pool.Transaction, error) GetGasPrice(ctx context.Context) (uint64, error) GetPendingTxHashesSince(ctx context.Context, since time.Time) ([]common.Hash, error) } // gasPriceEstimator contains the methods required to interact with gas price estimator type gasPriceEstimator interface { GetAvgGasPrice(ctx context.Context) (*big.Int, error) } // stateInterface gathers the methods required to interact with the state. type stateInterface interface { BeginStateTransaction(ctx context.Context) (pgx.Tx, error) GetLastConsolidatedL2BlockNumber(ctx context.Context, dbTx pgx.Tx) (uint64, error) GetTransactionByHash(ctx context.Context, transactionHash common.Hash, dbTx pgx.Tx) (*types.Transaction, error) GetTransactionReceipt(ctx context.Context, transactionHash common.Hash, dbTx pgx.Tx) (*types.Receipt, error) GetLastL2BlockNumber(ctx context.Context, dbTx pgx.Tx) (uint64, error) GetLastL2Block(ctx context.Context, dbTx pgx.Tx) (*types.Block, error) GetLastL2BlockHeader(ctx context.Context, dbTx pgx.Tx) (*types.Header, error) EstimateGas(transaction *types.Transaction, senderAddress common.Address) (uint64, error) GetBalance(ctx context.Context, address common.Address, blockNumber uint64, dbTx pgx.Tx) (*big.Int, error) GetL2BlockByHash(ctx context.Context, hash common.Hash, dbTx pgx.Tx) (*types.Block, error) GetL2BlockByNumber(ctx context.Context, blockNumber uint64, dbTx pgx.Tx) (*types.Block, error) GetCode(ctx context.Context, address common.Address, blockNumber uint64, dbTx pgx.Tx) ([]byte, error) GetStorageAt(ctx context.Context, address common.Address, position *big.Int, blockNumber uint64, dbTx pgx.Tx) (*big.Int, error) GetSyncingInfo(ctx context.Context, dbTx pgx.Tx) (state.SyncingInfo, error) GetTransactionByL2BlockHashAndIndex(ctx context.Context, blockHash common.Hash, index uint64, dbTx pgx.Tx) (*types.Transaction, error) GetTransactionByL2BlockNumberAndIndex(ctx context.Context, blockNumber uint64, index uint64, dbTx pgx.Tx) (*types.Transaction, error) GetNonce(ctx context.Context, address common.Address, blockNumber uint64, dbTx pgx.Tx) (uint64, error) GetL2BlockHeaderByNumber(ctx context.Context, blockNumber uint64, dbTx pgx.Tx) (*types.Header, error) GetL2BlockTransactionCountByHash(ctx context.Context, hash common.Hash, dbTx pgx.Tx) (uint64, error) GetL2BlockTransactionCountByNumber(ctx context.Context, blockNumber uint64, dbTx pgx.Tx) (uint64, error) GetLogs(ctx context.Context, fromBlock uint64, toBlock uint64, addresses []common.Address, topics [][]common.Hash, blockHash *common.Hash, since *time.Time, dbTx pgx.Tx) ([]*types.Log, error) GetL2BlockHashesSince(ctx context.Context, since time.Time, dbTx pgx.Tx) ([]common.Hash, error) DebugTransaction(ctx context.Context, transactionHash common.Hash, tracer string) (*runtime.ExecutionResult, error) ProcessUnsignedTransaction(ctx context.Context, tx *types.Transaction, senderAddress common.Address, blockNumber uint64, dbTx pgx.Tx) *runtime.ExecutionResult IsL2BlockConsolidated(ctx context.Context, blockNumber int, dbTx pgx.Tx) (bool, error) IsL2BlockVirtualized(ctx context.Context, blockNumber int, dbTx pgx.Tx) (bool, error) } type storageInterface interface { NewLogFilter(filter LogFilter) (uint64, error) NewBlockFilter() (uint64, error) NewPendingTransactionFilter() (uint64, error) GetFilter(filterID uint64) (*Filter, error) UpdateFilterLastPoll(filterID uint64) error UninstallFilter(filterID uint64) (bool, error) }3. Sequencer服务
当前代码库中,暂未实现permissionless sequencer功能,ProofOfEfficiency.sol合约中也暂未实现registerSequencer等接口。
[1] Ethereum JSON-RPC Specification [2] PoE [3] zkProver debugging [4] Hermez 1.5 - Merkle Tree spec [5] PoE - 1.5
附录:Polygon Hermez 2.0 zkEVM系列博客- ZK-Rollups工作原理
- Polygon zkEVM——Hermez 2.0简介
- Polygon zkEVM网络节点
- Polygon zkEVM 基本概念
- Polygon zkEVM Prover
- Polygon zkEVM工具——PIL和CIRCOM