Как исправить ошибку 'write tcp 127.0.0.1:54917->127.0.0.1:8545: I / O Timeout' в коде golang, который прослушивает события смарт-контракта - PullRequest
1 голос
/ 17 апреля 2019

Я использую golang для прослушивания событий умного контракта. Я развернул свои контракты в портах ganache ui и ganache-cli. Но я получаю ошибку ниже:

➜  sc_events go run main.go

2019/04/17 14:25:04 write tcp 127.0.0.1:54917->127.0.0.1:8545: i/o timeout
exit status 1

Я пытался использовать как интерфейс ganache (прослушивает порт 7545), так и ganache-cli (8545). Кажется, что оба они дают одинаковую ошибку. Но если я слушаю URL Infura, я не думаю, что получаю эту ошибку,

package main

import (
    "context"
    "fmt"
    "log"

    "github.com/ethereum/go-ethereum"
    "github.com/ethereum/go-ethereum/common"
    "github.com/ethereum/go-ethereum/core/types"
    "github.com/ethereum/go-ethereum/ethclient"
)

func main() {
    client, err := ethclient.Dial("ws://127.0.0.1:8545")
    // client, err := ethclient.Dial("wss://rinkeby.infura.io/ws/v3/010590bb415e4664835a05a53b18a293")
    if err != nil {
        log.Fatal(err)
    }

    contractAddress := common.HexToAddress("0x82726c7c1202565f1fef63fa8d4caca6366d4749")
    query := ethereum.FilterQuery{
        Addresses: []common.Address{contractAddress},
    }

    logs := make(chan types.Log)

    sub, err := client.SubscribeFilterLogs(context.Background(), query, logs)
    if err != nil {
        log.Fatal(err)
    }

    for {
        select {
        case err := <-sub.Err():
            log.Fatal(err)
        case vLog := <-logs:
            fmt.Println(vLog) // pointer to event log
        }
    }
}

Я ожидаю, что код продолжит слушать события умного контракта. Также, если кто-то может также опубликовать код для декодирования объекта события в структуру данных Map, чтобы прочитать его, было бы полезно.

...