在家运行eth2 staking服务

2022091701

when eth_getLogs no longer returns not available, everything turns ok. But I still suspect that once restart nethermind, it will sync for a long time again for it haven't finished downloading old receipts yet.

1235158 2022-09-17 13:13:16.4899|Executing JSON RPC call eth_getLogs with params [{
1235159   "topics": [
1235160     "0x649bbc62d0e31342afea4e5cd82d4049e7e1ee912fc0889aa790803be39038c5"
1235161   ],
1235162   "fromBlock": "0xaaa395",
1235163   "toBlock": "0xaacaa5",
1235164   "address": [
1235165     "0x00000000219ab540356cBB839Cbe05303d7705Fa"
1235166   ]
1235167 }]                                                                                                                             
1235168 2022-09-17 13:13:16.6823|Old Receipts  4421167 / 15476000 | queue  1405 | current  1029.01bps | total    37.25bps 
1235169 2022-09-17 13:13:17.2059|Executing JSON RPC call eth_getBlockByHash with params [0x1ecb9dd23676c9201af1e8026e7d83a1f979b8abd381        064fba0b593fcff7b235, False] 
1235170 2022-09-17 13:13:17.2067|Executing JSON RPC call eth_getBlockByHash with params [0xa51cbe797cac4ef0297862576e64444a90d3bec33294        9c352f253405aa129f1e, False] 

在我还以为要花很长时间同步的时候,突然就同步完成了,所有的consensus client call都得到满足,每一个attestation都做完了。

幸福来得很突炎。501g的空间。。。nethermind好样的,我期待之后的erigon也有类似效果,哈哈。
Screenshot-2022-09-17-at-10.23.11-PM

Screenshot-2022-09-17-at-10.26.04-PM

Screenshot-2022-09-17-at-10.35.06-PM

有一日整理家务,找到一枚物理的比特币,仔细一看上面还带着hash,我突然有些小激动。记起来,这还是早期okcoin用户发的,说不定就真的是呢!如下图
Screenshot-2022-09-17-at-11.02.46-PM

偷偷滴抄下hash,然后上网搜通过private key取回比特币的方法;即使搜索,也不敢全文搜。真得非常代入那位8000个比特币放在硬盘丢弃的小哥的心理。

结果发现,这是Genesis Block的hash。

如梦初醒。

20220917

补充说明一下,在家里搞这个,确实不推荐;但是能搞下来,不说staking上极小的回报,但是技术层面倒逼去学不少东西,这个倒是很值。

比如我的eth layer1 一直不停更换客户端,我就发现nethermind可以在没有完成sync的时候,部分提供validation服务,部分有效进行validating;有的小众的软件akula,可以提供prune的选项,为硬盘不宽裕的我提供多一个选择;之后在尝试erigon之后,才知道,原来部分的block数据,它直接就用bittorrent的方式以15mb/s方式暴力下载200多gb,然后才进行计算和index,不止这个,prune的选项上,我没接触不了解的是,区块数据包含4部分,htcr,对应history,transaction,callback traces 和 receipts,可以分开prune,可以按区块数字prune,针对consensus layer,保留merge后的receipt即可。

为消除每次重启teku需要花费大量时间从infura下载initial beacon state,后面的docker-compose都是直接将数据库persistent化,不再害怕启动耗时和数据下载失败。

话说到这,我也以为我synced成功,其实没有,目前nethermind、akula和erigon都在sync,看哪个能先完成吧。更多的感受和网上的回馈来看,是看机子的硬盘读写性能,网络瓶颈倒没有那么重要。于是把珍藏多年的软路由和x230拿出来,升级空闲的硬盘,安上debian,开始跑起来。

Screenshot-2022-09-17-at-2.36.58-PM

20220916

突然就可以了,我一脸懵逼。eth1 没有完成sync,也能validate
Screenshot-2022-09-16-at-1.56.31-AM

Screenshot-2022-09-16-at-1.56.37-AM

需要显示sync complete时候就可以validate,找一个如racknerd的v2raya service,会稳定很多。
Screenshot-2022-09-16-at-10.09.54-AM

20220915

先撒花,恭喜eth合并成功。我在gate.io上卖出了糖果,希望能够尽快提现。
Screenshot-2022-09-15-at-3.09.05-PM-1

悲催的是,我仍然没有完成一次成功的execution client syncing。于是所有都是miss.如果我的理解没有错,第一选择nethermind将在晚上完成syncing,之后就可以validating了。但是,我不确认。于是在另一台机子上,偷偷运行了akula作为备用,希望这两个有一个能成就好。
Screenshot-2022-09-15-at-3.10.38-PM

闺女上了学校的宣传页面,手长脚长的。
File-Sep-15--15-38-10

这一波搞下来,又对我在端口映射,udp上理解进行了加深,只是这些知识是我理解所得,一来不一定对;二来不学术。

20220911

简单地把gateway改到router,打开udp和tcp的端口映射,besu该用full node模式,简单即可获得稳定的连接。原来之前的担心都是因为使用的fast sync模式不容易获得peers。

我自己想多了。

20220905

20年12月时候用64个eth做了eth2的stake。那时候只是运行beacon chain,只需要一个服务器就能跑起来,于是就放到了家里的服务器,按照网上的指引,很容易就跑起来了。

后来不停有些冲动,想要把eth2 staking的服务移到外面的服务器上,没做成就一点,vps至少8gb ram,500 gb的硬盘空间,这样的vps实在太贵了,多尝试了几次就放弃了。

随着the Merge的到来,pos单独beacon chain的staking是不够的,还需要一个execution client,和beacon chain上的consensus client互动,仅仅通过注册infura上的eth1 api是不够的,因为数据是只读不可写。

于是一个迫在眉睫的情况就需要解决,不搞定eth1 的execution client,我的staking reward不仅没有,还会有惩罚。如图所示,搞不定就是赚不到钱还要赔钱。作为搬砖的人,这个是绝对无法忍受的。之前也解释过,也不愿每月花上几十美元订购一个vps,只能在家里的服务器上搞。

家里服务器硬件是够的,划分了一个esxi上虚拟机,16gb ram,8tib硬盘空间的debian 11. consensus client teku很容易就跑起来了,execution client就出了问题。

第一次尝试是使用是besu,docker运行。vm连接电信的宽带,没有任何翻墙措施,使用深圳ip。软件运行开两个端口,30303的tcp和udp。tcp没问题,直接routeros端口映射就好;udp我也尝试这个操作,但是令我疑惑的是,udp上没有任何traffic流量。果然验证了我的担心,国内电信服务商对udp端口的流量进行了qos控制,所有的udp连接都受到影响,eth历史区块数据库下载成功率极低,更多的时候,程序都在显示等待peers。

下一次的尝试就不再考虑国内ip了,改通过翻墙使用国外ip来下载数据。于是就要考虑如何连接。首先考虑的就是通过kubernates的方式来进行,比如把硬盘设定到家里的服务器,国外服务器仅仅用来做网络连接,参考了这篇。稍微研究了发现,作者自己也说苦于国内电信对udp的控制,效果不好。

我家里的翻墙是通过一个安装了clash旁路由的debian routing来进行的,很自然就把运行的gateway改过去。很快发现一个问题,tcp连接可以转发, udp还是被屏蔽,即使通过xray的方式也是不行的。

很自然地,就考虑udp转发。udp转发首选的是frp。这是国人开发的内网穿透的软件,令人发指的稳定。我自己作成了docker,很容易部署服务端和客户端。但是很奇怪地发现,虽然软件里面有udp转发的功能,也照样设置了,就是不成功,eth软件运行还是一直udp报错。

frp内网穿透不行,那就考虑zerotier了。之前没用过zerotier,但是研究了之后,发现还真是好用。自己搭好moon服务器,家里的eth服务器设为leaf,再设定好netmask和gateway后,把两个服务器变成了事实上的局域网。问题还是一样,tcp没问题,udp有问题。如下图所示,家里eth的服务器ip为10.11.15.2,外网的则是10.11.15.1。具体操作可以参考这篇
Screenshot-2022-09-03-at-6.15.11-PM

Screenshot-2022-09-03-at-6.15.28-PM
思考了一下,我觉得我需要一个能走tcp通道的udp转发软件,搜索github后,跳出两个结果,一个是udp2raw,一个是gost。都是国人开发的,嗯,天下苦秦久矣。我选择了gost。

# eth2 - home server 建立一个relay tls隧道,tls每次启动都会产生证书
gost -L relay+tls://:12345

# 于 海外 vps
gost -L udp://10.0.0.6:30303/10.0.0.211:30303 -F relay+tls://10.11.12.5:12345
# 把eth2 home server 10.0.0.211:30303端口通过之前建立的gost隧道 10.11.15.2:12345(zerotier建立 此为eth2 ip) 的tcp隧道,映射到海外的10.0.0.6:30303端口(10.0.0.6为ip a显示的eth0地址)

Screenshot-2022-09-03-at-6.24.23-PM
然后豁然开朗,udp链接直接搭起来了。之后用supervisor 固化到启动文件就搞定了。
Screenshot-2022-09-03-at-6.23.51-PM
说起来好容易,写起来我也是偷懒了些,这头尾我研究了好几天,挺好玩的。