如何建立Etherscan服务

动机

简介文章我们将分享如果要建立一个类似Etherscan的服务,该如何提供相关API。首先定义一下我们的API需求:

  1. 透过hash取得区块/交易
  2. 透过区块编号取得Ether / ERC20余额

目前我们的实作是基于目前复仇最流行的客户端之一GETH修改。关于下文的内容或实作,可以参考AMIS的ETH-索引项目https://github.com/getamis/eth-indexer

若您有相关问题或建议,欢迎与我们分享讨论!

组态

Geth 1.8提供了初始状态修剪。

实际上,几乎没有人关心历史数据(只要可以重新计算),而只关心网络的最新状态。

先前如果资料能够被重新计算且还原,多数人比起历史资料则更在意近期资料。

由于在eth-indexer的设计中,我们想要更多所有链上完整的历史资料,故需要修改geth的两个设置:同步的同步模式和解码处理资料的方式。

对所有--syncmode变体(包括--syncmode=full)都启用了Trie修剪。如果您要在一个存档节点上保留所有历史数据,则应通过以下方式禁用修剪--gcmode=archive

任何一种同步模式都会触发Trie修剪(包含--syncmode=full)。如果您想跑一个有所有历史资料的archive,您必须透过--gcmode=archive关掉资料复制的功能。

所以我们启动geth时,必须加上两个选项来获取所有历史资料:

  1. --syncmode=full
  2. --gcmode=archive

设计挑战

在设计这样的API可能会有几种不同解法。

解决方案1:用既有的geth RPC API!

考量:但由于现在geth没有支持高可用性(HA),geth也可能因为不同的同步速度而处在不同的状态,所以方案一不是很适合。而最重要的是,他并不支持关联式查询!

为了要改善这些问题,1)有一个一致性的资料来源; 2)支持关联式查询,我们需要一个独立的资料库来存放所有区块链的资料跟状态。

解决方案2:直接读取geth资料库

针对直接访问资料库,有以下几种方案:

  1. 直接读取geth本地端数据库库?
    不行,由于现在geth使用level db,但是Level db不支持同时有多个进程读取,因此无法直接在geth起作用的情况下直接读取geth里面的level db。
  2. 把区块链资料写到一个外部的资料库?
    我们实作了数据库接口直接把资料写到外部的MySQL,这是我们在GETH的上修改。一开始在区块的同步与写入到资料库的运行都相当完美,但当资料量一多的时候,写入的性能就急速下降。本地资料库效能果然还是比外部资料库效能好太多了!
解决方案1和2中的系统架构

最终解决方案:建立自己的索引器

我们可以创建一个新角色索引器去帮我们建立区块链链资料到资料库里面。索引器可以订阅新区块事件去更新区块和交易到资料库。

但要如何检测该帐号的Ether或ERC20令牌在特定的块中有改变呢?针对的令牌是Ether或ERC20会有不一样的情况。

  • Ether:现在没有Eth​​er改变的事件可以监听
  • ERC20:根据ERC20 EIP,他有定义transferEvent:

必须在令牌传输(包括零值传输)时触发。
函数传递(地址_to,uint256 _value)返回(布尔成功)

当令牌转移的时候必须要触发事件。

但是,我们可以相信他吗?如果这个合约程式有缺陷,或者他没有遵守这个EIP,indexer有可能就会建立到错误的资料!

因此我们决定直接把block状态汇入到资料库,运行时即时算出ERC20令牌余额。geth有提供dumpdBlock API来获得所有帐号的状态,而这个API并不能满足我们的需求,因为现在Ethereum的帐号数量已经超过35,000,000,不可能一次拿所有的帐户资料。geth有提供另外一个API可以拿到在这个区块敷使用。我们需要一个方式可以拿到在这块里面的内容被修改过的合约资料跟有被修改过的帐户清单。

我们修改了go-ethereum,设计了一个新的API去重新执行这个block且标记在这个block上有被修改过的帐号及其资料。修改后的实作可以在这边找到。我们可以在一个合理的时间内拿到这些修改过的资料。然而,我们可以再加速他吗?答案是可以的,如果我们可以在每次阻断写入时也把这些修改过的资料存下来。的英文这我们的修改。

拟议解决方案中的系统架构

Indexing了多久后可以提供服务吗?

根据我们的经验,indexer一天至少可以处理100,000个区块,现在以太坊主网上的区块数量超过5,000,000。这意味着可能要等50天以上才能提供服务。我们并不想等这么久,所以有以下的改善设计:

  • Indexer支持平行同步,可以一次起多台indexer去sync资料。
并行同步
  • 一开始先用geth RPC API服务请求。等到资料库都同步完成之后,我们就可以从资料库拿到资料。
系统架构

在这样的设计下,就可以大力的加速索引所有区块链的资料,可以重启的开始使用我们的服务:)

信息管理系统

Amis是一种金融技术,可在人们付款时建立联系,从而建立以社区为中心的安全系统。通过突破性的区块链技术,Amis创建了一个标准化平台,使企业可以创建信息交换系统,并使交易数据开放和共享,从而改善每个人的生活质量。

本文链接地址:https://www.wwsww.cn/ytf/5984.html
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。