当前位置:   article > 正文

Go 通过etherscan api访问接囗报错_go访问以太坊

go访问以太坊

0、前提条件

(1)操作系统

        操作系统Windows10中进行开发测试

(2)参考代码

GitHub - nanmu42/etherscan-api: Golang client for Ethereum Etherscan API (and its families like BscScan) / Golang 以太坊 Etherscan API库(也支持同一家族的BscScan)

注:已使用科学上网

1、测试代码

  1. import (
  2. "github.com/nanmu42/etherscan-api"
  3. "fmt"
  4. )
  5. func main() {
  6. // create a API client for specified ethereum net
  7. // there are many pre-defined network in package
  8. client := etherscan.New(etherscan.Mainnet, "xxxxxxxx")
  9. // check account balance
  10. balance, err := client.AccountBalance("xxxxxxxx")
  11. if err != nil {
  12. panic(err)
  13. }
  14. // balance in wei, in *big.Int type
  15. fmt.Println(balance.Int())
  16. }

第一个"xxxxxxxx"表示为API key:在 https://etherscan.io/ 中生成,如下图所示

第二个"xxxxxxxx"表示为以太坊账户地址

以上2个"xxxxxxxx"替换成自己的API key与账户地址即可

 2、错误信息

运行代码后报错,错误信息如下:

panic: Get "https://api-ropsten.etherscan.io/api?action=balance&address=xxxxxxxx&apikey=xxxxxxxx&module=account&tag=latest": dial tcp 199.59.148.8:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.

打开浏览器,直接访问链接地址发现是正常的

3、原因分析

浏览器是通过科学上网访问的,但是go访问没有使用科学上网的配置,需要使用代理才能访问

4、解决方案

(1)查看本地代理

打开IE浏览器,工具 -> Internet选项 -> 连接 -> 局域网设置 -> 代理服务器,查看代理地址与端囗

 (2)调整代码,增加http代理设置

  1. import (
  2. "github.com/nanmu42/etherscan-api"
  3. "fmt"
  4. )
  5. func main() {
  6. // create a API client for specified ethereum net
  7. // there are many pre-defined network in package
  8. // client := etherscan.New(etherscan.Mainnet, "xxxxxxxx")
  9. url, _ := url.Parse("htttp://127.0.0.1:7890")
  10. transport := &http.Transport{
  11. Proxy: http.ProxyURL(url),
  12. }
  13. c := &http.Client{
  14. Transport: transport,
  15. }
  16. client := etherscan.NewCustomized(etherscan.Customization{
  17. Timeout: 15 * time.Second,
  18. Key: "xxxxxxxx",
  19. BaseURL: "https://api-ropsten.etherscan.io/api?",
  20. Verbose: false,
  21. Client: c,
  22. })
  23. // check account balance
  24. balance, err := client.AccountBalance("xxxxxxxx")
  25. if err != nil {
  26. panic(err)
  27. }
  28. // balance in wei, in *big.Int type
  29. fmt.Println(balance.Int())
  30. }

5、问题

以上解决方案部署在Windows平台是可以正常运行的,但是部署到Centos7中就报错了

(1)测试代码

只把上面获取账户余额改为获取交易结果(当然交易hash确保是存在的)

  1. import (
  2. "github.com/nanmu42/etherscan-api"
  3. "fmt"
  4. )
  5. func main() {
  6. // create a API client for specified ethereum net
  7. // there are many pre-defined network in package
  8. // client := etherscan.New(etherscan.Mainnet, "xxxxxxxx")
  9. url, _ := url.Parse("htttp://127.0.0.1:7890")
  10. transport := &http.Transport{
  11. Proxy: http.ProxyURL(url),
  12. }
  13. c := &http.Client{
  14. Transport: transport,
  15. }
  16. client := etherscan.NewCustomized(etherscan.Customization{
  17. Timeout: 15 * time.Second,
  18. Key: "xxxxxxxx",
  19. BaseURL: "https://api-ropsten.etherscan.io/api?",
  20. Verbose: false,
  21. Client: c,
  22. })
  23. // 获取交易结果
  24. status, err := client.ReceiptStatus("0xea3c06eb70a5a77e25bbce478ae0fef34d93b3d7dd3a82d1d64d36d53aa8ed51")
  25. if err != nil {
  26. panic(err)
  27. }
  28. fmt.Println(status)
  29. }

(2)错误信息 

sending request: Get "https://api-ropsten.etherscan.io/api?action=gettxreceiptstatus&apikey=xxxxxxx&module=transaction&txhash=xxxxx": context deadline exceeded (Client.Timeout exceeded while awaiting headers)"

(3)解决方案(都没成功)

网上找了一些解决方案,以下解决方案只做记录,都没有成功,请勿参考。可直接见(4)终极解决方案,如果小伙伴们遇到相样的问题,有好的解决方案可以分享哈!!!

1)方案一:添加本地代理(未成功)

像windows一样添加代理127.0.0.1:7890

编辑配置文件/etc/profile

[root@Tracy ~]# vi /etc/profile

在文件末尾添加如下代理设置:

export all_proxy=http://127.0.0.1:7890/
export ALL_PROXY=http://127.0.0.1:7890/
export HTTP_PROXY=http://127.0.0.1:7890/
export http_proxy=http://127.0.0.1:7890/
export HTTPS_PROXY=https://127.0.0.1:7890/
export https_proxy=https://127.0.0.1:7890/

按Esc退出编辑,输入:wq保存退出。

使配置文件生效 

[root@Tracy ~]# source /etc/profile

再次运行程序,还是同样的错误,放弃此方案,删除配置文件添加的代理设置,如果通过以下方式查询到还有代理设置

  1. [root@Tracy ~]# export | grep -i proxy
  2. declare -x ALL_PROXY="http://127.0.0.1:7890/"
  3. declare -x HTTPS_PROXY="https://127.0.0.1:7890/"
  4. declare -x HTTP_PROXY="http://127.0.0.1:7890/"
  5. declare -x all_proxy="http://127.0.0.1:7890/"
  6. declare -x http_proxy="http://127.0.0.1:7890/"
  7. declare -x https_proxy="https://127.0.0.1:7890/"

 使用以下方式清除

  1. [root@Tracy ~]# unset ALL_PROXY
  2. [root@Tracy ~]# unset HTTPS_PROXY
  3. [root@Tracy ~]# unset HTTP_PROXY
  4. [root@Tracy ~]# unset all_proxy
  5. [root@Tracy ~]# unset http_proxy
  6. [root@Tracy ~]# unset https_proxy

2)方案二:配置ip映射(未成功)

在使用ping时,发现ping api-ropsten.etherscan.io不通,网上查了对应的IP为104.22.14.57 或是 104.22.15.57,ping时发现104.22.14.57好用些,因此配置这个IP。

查询IP可参见:域名解析查询(A/Txt/Cname/Mx/Srv/Aaaa...)

编辑hosts文件  

[root@Tracy ~]# vi /etc/hosts

在文件末尾添加如下配置: 

104.22.14.57  api-ropsten.etherscan.io        ropsten 

# 配置依次表示 IP地址  主机域名 主机别名 

按Esc退出编辑,输入:wq保存退出。

再次运行程序,发现报了新错:

sending request: Get "https://api-ropsten.etherscan.io/api?action=getstatus&apikey=xxxxxxxxxxxx&module=transaction&txhash=xxxxxxxxxxxx": read tcp 172.17.102.231:35248->104.22.14.57:443: read: connection reset by peer

依然没成功啊,放弃此方法,删除hosts文件中刚刚的配置。

(4)终极解决方案

放弃使用etherscan-api查询交易结果,改为使用go-ethereum,代码如下:

  1. import (
  2. "context"
  3. "fmt"
  4. "github.com/ethereum/go-ethereum"
  5. "github.com/ethereum/go-ethereum/common"
  6. "github.com/ethereum/go-ethereum/ethclient"
  7. )
  8. func main() {
  9. client, err := ethclient.Dial("https://ropsten.infura.io/v3/xxxxxxxxx")
  10. if err != nil {
  11. fmt.Println("ethclient.Dial Error:", err)
  12. return
  13. }
  14. receipt, err := client.TransactionReceipt(context.Background(), common.HexToHash("0xea3c06eb70a5a77e25bbce478ae0fef34d93b3d7dd3a82d1d64d36d53aa8ed51"))
  15. if err != nil {
  16. fmt.Println("client.TransactionReceipt Error:", err)
  17. return
  18. }
  19. fmt.Println(receipt)
  20. }

访问地址使用infura, 官网地址:https://infura.io/

官网有详细说明,直接参考网址即可

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/419635
推荐阅读
  

闽ICP备14008679号