您正在查看: Ethereum 分类下的文章

forkchoiceUpdatedV3 must only be called for cancun payloads

启动eth2.0 一段时间后,报如下错误

WARN [05-24|11:39:02.090] Served engine_forkchoiceUpdatedV3        conn=127.0.0.1:53124 reqid=355251 duration="74.273µs" err="Unsupported fork" errdata="{Error:forkchoiceUpdatedV3 must only be called for cancun payloads}"

查看代码
https://github.com/ethereum/go-ethereum/blob/b6474e9f90c88003de7d7eb993ddb5f60133172e/eth/catalyst/api.go#L213-L224

// ForkchoiceUpdatedV3 is equivalent to V2 with the addition of parent beacon block root
// in the payload attributes. It supports only PayloadAttributesV3.
func (api *ConsensusAPI) ForkchoiceUpdatedV3(update engine.ForkchoiceStateV1, params *engine.PayloadAttributes) (engine.ForkChoiceResponse, error) {
    if params != nil {
        if params.Withdrawals == nil {
            return engine.STATUS_INVALID, engine.InvalidPayloadAttributes.With(errors.New("missing withdrawals"))
        }
        if params.BeaconRoot == nil {
            return engine.STATUS_INVALID, engine.InvalidPayloadAttributes.With(errors.New("missing beacon root"))
        }
        if api.eth.BlockChain().Config().LatestFork(params.Timestamp) != forks.Cancun { // 关键代码
            return engine.STATUS_INVALID, engine.UnsupportedFork.With(errors.New("forkchoiceUpdatedV3 must only be called for cancun payloads"))
        }
    }

跟踪下代码,
https://github.com/ethereum/go-ethereum/blob/b6474e9f90c88003de7d7eb993ddb5f60133172e/params/config.go#L763-L778

// LatestFork returns the latest time-based fork that would be active for the given time.
func (c *ChainConfig) LatestFork(time uint64) forks.Fork {
    // Assume last non-time-based fork has passed.
    london := c.LondonBlock

    switch {
    case c.IsPrague(london, time):
        return forks.Prague
    case c.IsCancun(london, time):
        return forks.Cancun
    case c.IsShanghai(london, time):
        return forks.Shanghai
    default:
        return forks.Paris
    }
}

当前genesis配置如下

{
  "config": {
    "chainId": ....,
    "homesteadBlock": 0,
    "eip150Block": 0,
    "eip155Block": 0,
    "eip158Block": 0,
    "byzantiumBlock": 0,
    "constantinopleBlock": 0,
    "petersburgBlock": 0,
    "istanbulBlock": 0,
    "berlinBlock": 0,
    "londonBlock": 0,
    "mergeNetsplitBlock": 0,
    "terminalTotalDifficulty": 0,
    "terminalTotalDifficultyPassed": true,
    "shanghaiTime": 0,
    "cancunTime": 0,
    "pragueTime": 1716532255
  },
  ....
  "coinbase": "0x0000000000000000000000000000000000000000",
  "difficulty": "0x01",
  "extraData": "",
  "gasLimit": "0x17d7840",
  "nonce": "0x1234",
  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "timestamp": "1715760655"

由于设置了pragueTime,所以LatestFork会返回Prague fork,不会是Cancun,所以ForkchoiceUpdatedV3会报错,至于Prague为什么不支持ForkchoiceUpdatedV3,留个TODO

目前要做的是把最新的fork改为Cancun

  1. 将genesis.json中的pragueTime删掉
  2. 停止geth服务
  3. 重新初始化
    ./geth --config ./config/config.toml init ./config/genesis.json
  4. 重启geth服务

由 Cloudflare 支持的 eth_getBlockByNumber API 的缓存代理

开源地址:https://github.com/Scratch-net/ethproxy

概述

Ethproxy 是一项为Cloudflare gateway支持的 API 方法 eth_getBlockByNumber 提供 LRU 缓存的服务。

  • 它使用CCache作为缓存引擎。
  • Singleflight可防止同时请求单个块
  • 使用envconfig进行配置
  • 最新 20 个块的默认 TTL 为 5 秒。从 20 到 1000 的区块的 TTL=“距最新的距离”* 5s
  • 所有距离最新区块超过 1000 的区块都被认为是不可变的
  • 请求过期的缓存项不会阻止服务。它在后台刷新请求的块
  • 实现优雅关闭
  • 短绒支持
  • Docker 镜像构建。由于多阶段静态构建,生成的图像大小小于 6 mb

Blob Archiver 存档并允许查询信标链中所有历史 Blob

Blob Archiver 是一种存档并允许查询信标链中所有历史 Blob 的服务。它由两个部分组成:

Archiver - 跟踪信标链并将 blob 写入存储后端
API - 实现 blob sidecars API,允许客户端从存储后端检索 blob

贮存

目前支持两种存储选项:

磁盘存储 - Blob 写入磁盘的目录中
S3 存储 - Blob 写入 S3 存储桶(或兼容服务)
BLOB_API_DATA_STORE您可以通过将和设置BLOB_ARCHIVER_DATA_STORE为file或来控制使用哪个存储后端s3。

后端s3还可以使用(例如)Google Cloud Storage 存储桶(此处的说明)。

数据有效性

目前,归档器和 API 不验证信标节点的数据。因此,信任 Beacon 节点或验证客户端中的数据非常重要。 向归档器和 API 添加数据验证存在一个未解决的问题。

开源地址:https://github.com/base-org/blob-archiver

RPCHub 聚合器

RPCHub 是一个 RPC 聚合器,通过集成您拥有的节点、私有和公共端点,为您提供最快、最强大的 RPC 服务。

RPCHub 是一款开源软件,允许您自定义自己的策略配置。

通过定制化配置,RPCHub能够实现RPC服务的可扩展、独享、稳定、低成本、高性能。

配置在本地存储和使用,以最好地保护您的隐私。

https://github.com/BlockPILabs/aggregator

invalid opcode: opcode 0x5f not defined

问题

在低版本geth(quorum)上使用高版本solidity合约和编译(0.8.20及以上),部署时报以下错误

Gas estimation errored with the following message (see below). The transaction execution will likely fail. Do you want to force sending?
Returned error: invalid opcode: opcode 0x5f not defined
OR the EVM version used by the selected environment is not compatible with the compiler EVM version.

分析

原因是因为当前版本Evm未支持eip-3855

查看代码,代码未支持 PUSH0 0x5f
https://github.com/Consensys/quorum/blob/643b5dcb8e2f0c68a8c78dc01c778a11f0ed14ba/core/vm/opcodes.go#L109-L121

const (
    POP      OpCode = 0x50
    MLOAD    OpCode = 0x51
    MSTORE   OpCode = 0x52
    MSTORE8  OpCode = 0x53
    SLOAD    OpCode = 0x54
    SSTORE   OpCode = 0x55
    JUMP     OpCode = 0x56
    JUMPI    OpCode = 0x57
    PC       OpCode = 0x58
    MSIZE    OpCode = 0x59
    GAS      OpCode = 0x5a
    JUMPDEST OpCode = 0x5b
)

对标以太坊,https://github.com/ethereum/go-ethereum/pull/24039/files
添加了对eip-3855的支持

后续

将EIP合并,并测试