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 |
备注 |
1 |
GetBlockByHash |
√ |
√ |
|
2 |
GetBlockByNumber |
√ |
√ |
|
3 |
GetBlockTransactionCountByHash |
√ |
√ |
|
4 |
GetBlockTransactionCountByNumber |
√ |
√ |
|
5 |
getUncleCountByBlockHash |
√ |
√ |
|
6 |
getUncleCountByBlockNumber |
√ |
√ |
|
7 |
ChainId |
√ |
√ |
|
8 |
Syncing |
√ |
√ |
|
9 |
Coinbase |
√ |
X |
|
10 |
Accounts |
√ |
X |
|
11 |
BlockNumber |
√ |
√ |
|
12 |
Call |
√ |
√ |
|
13 |
EstimateGas |
√ |
√ |
14 |
CreateAccessList |
√ |
X |
EIP-2930:新交易类型,需以更贵的方式访问清单(地址或storage keys)外的内容。 |
15 |
GasPrice |
√ |
√ |
|
16 |
MaxPriorityFeePerGas |
√ |
X |
|
17 |
FeeHistory |
√ |
X |
|
18 |
NewFilter |
√ |
√ |
|
19 |
NewBlockFilter |
√ |
√ |
|
20 |
NewPendingTransactionFilter |
√ |
√ |
|
21 |
UninstallFilter |
√ |
√ |
|
22 |
GetFilterChanges |
√ |
√ |
|
23 |
GetFilterLogs |
√ |
√ |
|
24 |
GetLogs |
√ |
√ |
|
25 |
Mining |
√ |
X |
|
26 |
Hashrate |
√ |
X |
|
27 |
GetWork |
√ |
X |
|
28 |
SubmitWork |
√ |
X |
|
29 |
SubmitHashrate |
√ |
X |
|
30 |
Sign |
√ |
X |
|
31 |
SignTransaction |
√ |
X |
|
32 |
GetBalance |
√ |
√ |
|
33 |
GetStorageAt |
√ |
√ |
|
34 |
GetTransactionCount |
√ |
√ |
|
35 |
GetCode |
√ |
√ |
|
36 |
GetProof |
√ |
X |
|
37 |
SendTransaction |
√ |
X |
|
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系列博客
转载:https://blog.csdn.net/mutourend/article/details/126409344