Polygon zkEVM节点代码解析

Posted mutourend

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Polygon zkEVM节点代码解析相关的知识,希望对你有一定的参考价值。

1. 引言

前序博客:

相关代码:


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✔️
10Accounts✔️
11BlockNumber✔️✔️
12Call✔️✔️
13EstimateGas✔️✔️
14CreateAccessList✔️EIP-2930:新交易类型,需以更贵的方式访问清单(地址或storage keys)外的内容。
15GasPrice✔️✔️
16MaxPriorityFeePerGas✔️
17FeeHistory✔️
18NewFilter✔️✔️
19NewBlockFilter✔️✔️
20NewPendingTransactionFilter✔️✔️
21UninstallFilter✔️✔️
22GetFilterChanges✔️✔️
23GetFilterLogs✔️✔️
24GetLogs✔️✔️
25Mining✔️
26Hashrate✔️
27GetWork✔️
28SubmitWork✔️
29SubmitHashrate✔️
30Sign✔️
31SignTransaction✔️
32GetBalance✔️✔️
33GetStorageAt✔️✔️
34GetTransactionCount✔️✔️
35GetCode✔️✔️
36GetProof✔️
37SendTransaction✔️
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系列博客

以上是关于Polygon zkEVM节点代码解析的主要内容,如果未能解决你的问题,请参考以下文章

Polygon zkEVM交易解析

Polygon zkEVM zkROM代码解析

Polygon zkEVM zkROM代码解析

Polygon zkEVM zkROM代码解析

Polygon zkEVM zkROM代码解析

Polygon zkEVM zkROM代码解析