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

以太坊智能合约事件索引器

eth-事件索引器

以太坊智能合约事件索引器

  • 使用 Postgres 数据库 GoEthereum 客户端/SDK 和 Infura 作为节点进行基本智能合约事件索引。

先决条件

  • Infura 帐户(API 密钥、网络端点 WSS/HTTPS)
  • Docker
  • 创建 .env 文件并使用 .env_tmpl 填充配置数据

安装/使用 Docker 运行

在项目文件夹中运行命令:
docker-compose up --build

安装 不使用 Docker 但使用已安装的 Postgress

  • 安装 Go(golang)
  • 从 scripts/db 文件夹运行 psql 脚本
  • 运行命令根项目文件夹
    go run main/main.go

数据库清理

  • 从根项目文件夹中删除“db-data”文件夹

使用方法 - 来自 Postman

  • GET: /api/events/:address
  • GET: /api/indexed/:id
  • POST: /api/events/add/:address

RESTful API 设计服务来管理以太坊网络中的交易

以太坊交易管理器

任务描述

开发一个 RESTful API 服务,用于管理以太坊区块链(goerli 测试网络)上的交易,考虑高负载。

要求

该API应该支持以下操作:

  • 发送新交易(POST /交易)

  • 检索以太坊地址的余额 (GET /balances/{address})

  • 通过哈希检索交易信息 (GET /transactions/{hash})

    • hash(交易哈希)
    • 来自(发件人地址)
    • 至(收件人地址)
    • 值(发送的 Eth 数量)
    • 时间戳
  • 使用 Ethers.js(用于 Node.js)或 go-ethereum(用于 Go)与以太坊(Goerli)区块链进行交互。

  • 实现地址余额缓存以减少 RPC 负载(可以使用任何缓存解决方案,例如 Redis 或内置缓存)。

  • 通过最小化请求数量来优化 RPC 交互。

  • 提供负载测试结果,证明该服务每秒至少处理 100 个请求的能力。

  • 在 GitHub 上发布源代码。

  • 可选但加分项:Dockerfile + 在 Docker 和/或 Docker 镜像中运行的说明。

https://github.com/alewkinr/eth-trx-manager/tree/main

以太坊事件监听器 API

一个强大且可扩展的 RESTful API,旨在监听以太坊智能合约发出的特定事件。

以太坊事件监听器 API

以太坊事件监听器 API 是一个功能强大的工具,可让您监控和捕获以太坊智能合约发出的事件。借助此 API,您可以轻松地为特定合约和事件名称注册事件监听器,并检索捕获的事件数据以进行进一步分析或与其他系统集成。

特征

  • 为以太坊智能合约注册事件监听器
  • 捕获发出的事件并将其存储在 MySQL 数据库中
  • 通过 RESTful API 端点检索事件数据
  • 使用 API 密钥对 API 请求进行身份验证
  • Docker 化应用程序,易于部署和扩展

使用的技术

  • Golang
  • Gin Web 框架
  • 以太坊 Go 客户端 (go-ethereum)
  • GORM (MySQL 的 Go ORM)
  • MySQL 数据库
  • Docker
  • Docker 组成

https://github.com/devlongs/ethereum-event-listener

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