Polygon zkEVM节点代码解析

2023-04-01 16:10:13

1. 引言

源代码:https://github.com/0xPolygonHermez/zkevm-node (Go语言)

Polygon zkEVM节点提供的主要服务模块有:

  • 1)JSON-RPC服务
  • 2)Sequencer服务
  • 3)Aggregator服务
  • 4)Synchronizer服务
  • 5)Broadcast服务

2. JSON-RPC服务

以太坊JSON-RPC接口 与 Polygon zkEVM中的JSON-RPC接口 对比情况为:

序号RPC接口名以太坊Hermez 2.0备注
1GetBlockByHash√√
2GetBlockByNumber√√
3GetBlockTransactionCountByHash√√
4GetBlockTransactionCountByNumber√√
5getUncleCountByBlockHash√√
6getUncleCountByBlockNumber√√
7ChainId√√
8Syncing√√
9Coinbase√X
10Accounts√X
11BlockNumber√√
12Call√√
13EstimateGas√√
14CreateAccessList√XEIP-2930:新交易类型,需以更贵的方式访问清单(地址或storage keys)外的内容。
15GasPrice√√
16MaxPriorityFeePerGas√X
17FeeHistory√X
18NewFilter√√
19NewBlockFilter√√
20NewPendingTransactionFilter√√
21UninstallFilter√√
22GetFilterChanges√√
23GetFilterLogs√√
24GetLogs√√
25Mining√X
26Hashrate√X
27GetWork√X
28SubmitWork√X
29SubmitHashrate√X
30Sign√X
31SignTransaction√X
32GetBalance√√
33GetStorageAt√√
34GetTransactionCount√√
35GetCode√√
36GetProof√X
37SendTransaction√X
38SendRawTransaction√√
39GetTransactionByHash√√
40GetTransactionByBlockHashAndIndex√√
41GetTransactionByBlockNumberAndIndex√√
42GetTransactionReceipt√√
43GetCompilers√√
44GetUncleByBlockHashAndIndex√√
45GetUncleByBlockNumberAndIndex√√
46ProtocolVersion√√

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系列博客

转载:https://blog.csdn.net/mutourend/article/details/126409344

当前页面是本站的「Baidu MIP」版。发表评论请点击:完整版 »