在家运行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也有类似效果,哈哈。
有一日整理家务,找到一枚物理的比特币,仔细一看上面还带着hash,我突然有些小激动。记起来,这还是早期okcoin用户发的,说不定就真的是呢!如下图

偷偷滴抄下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,开始跑起来。
20220916
突然就可以了,我一脸懵逼。eth1 没有完成sync,也能validate
需要显示sync complete时候就可以validate,找一个如racknerd的v2raya service,会稳定很多。
20220915
先撒花,恭喜eth合并成功。我在gate.io上卖出了糖果,希望能够尽快提现。
悲催的是,我仍然没有完成一次成功的execution client syncing。于是所有都是miss.如果我的理解没有错,第一选择nethermind将在晚上完成syncing,之后就可以validating了。但是,我不确认。于是在另一台机子上,偷偷运行了akula作为备用,希望这两个有一个能成就好。
闺女上了学校的宣传页面,手长脚长的。
这一波搞下来,又对我在端口映射,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。具体操作可以参考这篇。
思考了一下,我觉得我需要一个能走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地址)
然后豁然开朗,udp链接直接搭起来了。之后用supervisor 固化到启动文件就搞定了。
说起来好容易,写起来我也是偷懒了些,这头尾我研究了好几天,挺好玩的。