区块链中文技术社区

Polygon zkEVM节点代码解析

1. 引言

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

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

2. JSON-RPC服务

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

序号RPC接口名以太坊Hermez 2.0备注
1GetBlockByHash
2GetBlockByNumber
3GetBlockTransactionCountByHash
4GetBlockTransactionCountByNumber
5getUncleCountByBlockHash
6getUncleCountByBlockNumber
7ChainId
8Syncing
9CoinbaseX
10AccountsX
11BlockNumber
12Call
13EstimateGas
14CreateAccessListXEIP-2930:新交易类型,需以更贵的方式访问清单(地址或storage keys)外的内容。
15GasPrice
16MaxPriorityFeePerGasX
17FeeHistoryX
18NewFilter
19NewBlockFilter
20NewPendingTransactionFilter
21UninstallFilter
22GetFilterChanges
23GetFilterLogs
24GetLogs
25MiningX
26HashrateX
27GetWorkX
28SubmitWorkX
29SubmitHashrateX
30SignX
31SignTransactionX
32GetBalance
33GetStorageAt
34GetTransactionCount
35GetCode
36GetProofX
37SendTransactionX
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

当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »