【译文】在 Akashnet 上运行 PulseChain Ethereum fork 全节点

阿卡什

在 Akashnet 上运行 PulseChain Ethereum fork 全节点

这篇文章将指导您在 Akashnet 上部署 PulseChain Ethereum fork 全节点。

原作者:安德烈·阿拉波夫

译者:fackjins

这篇文章将指导您部署 PulseChain Ethereum-在Akashnet分叉完整节点。

重要提示

这不会将您连接到真正的 PulseChain 节点,因为它缺少引导节点、网络配置(config.toml、genesis.json)。

在此处等待 PulseChain 开发人员提供的完整说明https://gitlab.com/pulsechaincom/go-pulse/-/blob/16178c59/README.md#a-full-node-on-the-pulsechain-testnet
但在此之前,您仍然可以学习部署它并连接到以太坊网络。

确保在带有 SSD 的提供程序上部署 geth。不能在 HDD 上运行 geth,因为 geth 对于硬盘的读写要求非常高,HDD无法满足节点要求,这在他们的常见问题解答https://geth.ethereum.org/docs/faq 中有概述

译者注: HDD硬盘即机械硬盘,为什么不能将geth运行在HDD中?因为geth应用对于磁盘的要求非常高,机械硬盘无法在读写速度上满足geth客户端的要求,这会导致节点同步非常缓慢,无法跟上节点的出块速度,所以建议使用SSD硬盘进行节点同步。

我使用了Ubuntu 20.04.2 LTS Linux发行版和以下软件:
- akash :(v0.12.1与 Akashnet 一起工作);
- geth :(将其部署在 Akashnet 上);v0.2.0-6abf18d00

运行环境准备
环境依赖:
	Ubuntu 20.04.2 LTS
	Akash  v0.12.1
	geth   v0.2.0-6abf18d00

认识你的新朋友:
**- Akashnet是未来的去中心化云;
**-PulseChain是节能、更便宜、更快、收费的以太坊分叉

这个想法很简单——利用 Akashnet decloud 来部署 PulseChain 容器。

因为使用Akash运行一个实例相比aws亚马逊要节省86%的成本。原作者写的成本对比图:Akashlytics

好吧,我不擅长说话太多,所以为了节省您和我的时间,让我们直接跳到 CLI。

1.安装akash客户端

AKASH_NET="https://raw.githubusercontent.com/ovrclk/net/master/mainnet"
AKASH_VERSION="$(curl -s "$AKASH_NET/version.txt")"
curl https://raw.githubusercontent.com/ovrclk/akash/master/godownloader.sh | sh -s -- "v$AKASH_VERSION"

还请安装jq工具,因为它将在本文中使用。

译者注:安装jq工具命令:
sudo apt-get install jq

2. 创建你的 akash 钱包

akash keys add default

此命令将输出助记词,请确保将其保存在安全的地方。
它还将输出您的地址,在我的情况下,地址是akash1h24fljt7p0nh82cq0za0uhsct3sfwsfu9w3c9h.

export AKASH_ACCOUNT_ADDRESS=akash1h24fljt7p0nh82cq0za0uhsct3sfwsfu9w3c9h

有关 Akash 钱包的更多信息https://docs.akash.network/guides/wallet

3. 为您的 akash 钱包提供资金

您将需要大约10 AKT(Akash Token) 才能开始使用。
您可以在此处提到的交易所之一购买它们https://akash.network/token/

您可以查询您的钱包余额

export AKASH_NET="https://raw.githubusercontent.com/ovrclk/net/master/mainnet"
export AKASH_NODE="$(curl -s "$AKASH_NET/rpc-nodes.txt" | shuf -n 1)"

akash \
  --node "$AKASH_NODE" \
  query bank balances "$AKASH_ACCOUNT_ADDRESS"

面额:1 akt = 1000000 uakt (akt*10^6),或者您可以-o json | jq -r '(.balances[0].amount | tonumber / pow(10; 6))'在命令行中添加;-)

我正在使用生产 akashnet-2 Akash 网络。有关不同 Akash 网络的更多信息,请参阅https://docs.akash.network/guides/version

4. 创建证书文件

要创建部署,必须首先创建证书。为此,请运行:

export AKASH_CHAIN_ID="$(curl -s "$AKASH_NET/chain-id.txt")"
akash tx cert create client \
  --from default \
  --chain-id $AKASH_CHAIN_ID \
  --node $AKASH_NODE \
  --gas-prices="0.025uakt" --gas="auto" --gas-adjustment=1.15

每个帐户只需要创建一次证书,并且可以在所有部署中使用。有关证书的更多信息https://docs.akash.network/design/mtls

5. 准备部署清单文件

创建一个以go-pulse-geth.yml以下内容命名的文件:

---
version: "2.0"

services:
  geth:
    image: andrey01/go-pulse-geth:0.2.0-6abf18d00
    expose:
      ## 8545/tcp RPC port
      ## SECURITY RISK: someone can transfer all your funds out of your wallet,
      ##                in case if you unlock your wallet there!
      ##- port: 8545
      ##  as: 8545
      ##  proto: tcp
      ##  to:
      ##    - global: true
      ### 8546/tcp WS port
      ##- port: 8546
      ##  as: 8546
      ##  proto: tcp
      ##  to:
      ##    - global: true
      # 30303 TCP and UDP, used by the P2P protocol running the network
      - port: 30303
        as: 30303
        proto: tcp
        to:
          - global: true
      - port: 30303
        as: 30303
        proto: udp
        to:
          - global: true
    args:
      - "--syncmode=fast"
      - "--cache=2048" # make sure you have requested more RAM for the container.
      #- "--mine"
      #- "--miner.etherbase=0xabcdef...."
      ##- "--rpc"
      ##- "--rpcapi=admin,eth,net,web3"
      ##- "--rpcaddr=0.0.0.0"
      ##- "--rpcport=8545"
      ##- "--rpcvhosts=*"
      ##- "--ws"
      ##- "--wsaddr=0.0.0.0"
      ##- "--wsport=8546"
      ##- "--wsorigins=*"

profiles:
  compute:
    geth:
      resources:
        cpu:
          units: 2
        memory:
          size: 4Gi
        storage:
          size: 1024Gi
  placement:
    akash:
      #signedBy:
      #  anyOf:
      #    # - "akash1365yvmc4s7awdyj3n2sav7xfx76adc6dnmlx63" ## AKASH verified hosts only
      pricing:
        geth: 
          denom: uakt
          amount: 500

deployment:
  geth:
    akash:
      profile: geth
      count: 1

定价 - 请注意,有来自多个不同提供商的出价。在这种情况下,两个提供商碰巧都愿意接受 1 uAKT 的价格。这意味着可以使用每个块 1 uAKT 或 0.000001 AKT 来创建租约来执行容器。
定价设置了限制,因此提供商知道如何对您的部署进​​行投标。即您愿意支付的每个区块的 uakt 数量(每个区块每 6 秒发生一次)。
所以,如果有1uakt,你会得到回报:=每月有1akt价值为。是一个“验证”的东西,在供应商被 akash 批准后,他们会得到 akash 的签名以确保安全性和可靠性。如果您不关心哪个提供商将运行您的容器,那么只需对其进行注释即可。
((1*((60/6)**60**24*30.436875))/10^6)*2.68``**$1.17** $2.68``25th July 2021

signedBy

有关用于编写 Akash 清单的 SDL(堆栈定义语言)的更多信息https://docs.akash.network/documentation/sdl

您可以使用我的容器andrey01/go-pulse-geth:0.2.0-6abf18d00,也可以构建自己的容器:

$ git clone git@gitlab.com:pulsechaincom/go-pulse.git
$ cd go-pulse
$ git log --oneline -1 
6abf18d00 (HEAD -> master, upstream/master) Merge branch 'readme' into 'master'
$ docker build -t go-pulse-geth:0.2.0-6abf18d00 .
$ docker tag go-pulse-geth:0.2.0-6abf18d00 andrey01/go-pulse-geth:0.2.0-6abf18d00
$ docker push andrey01/go-pulse-geth:0.2.0-6abf18d00

6. 创建并部署pulse

akash tx deployment create go-pulse-geth.yml \
  --from default \
  --node $AKASH_NODE \
  --chain-id $AKASH_CHAIN_ID \
  --gas-prices="0.025uakt" --gas="auto" --gas-adjustment=1.15

如果此命令以Error: RPC error -32603 - Internal error: timed out waiting for tx to be included in a blockthen结尾,则不用担心,您可以查询 akash 区块链以找到您的部署 ID:

$ akash query txs \
  --events "message.sender=$AKASH_ACCOUNT_ADDRESS&message.action=create-deployment" \
  --page 1 --limit 999999 \
  | jq -r '.txs[] | [ .tx.body.messages[].id[] ] | @csv' | \
  tail -5
"akash1h24fljt7p0nh82cq0za0uhsct3sfwsfu9w3c9h","1933977"

查询部署:

我明确没有“导出”以下 3 个“SEQ”变量以避免“无法执行消息”;消息索引:0:稍后在“akash tx 部署创建”上出现“部署关闭”错误。如果您收到此错误,则只需unset AKASH_DSEQ.

$ AKASH_DSEQ=1933977
$ AKASH_GSEQ=1
$ AKASH_OSEQ=1

$ akash query deployment get \
  --owner $AKASH_ACCOUNT_ADDRESS \
  --node $AKASH_NODE \
  --dseq $AKASH_DSEQ

deployment:
  created_at: "1933981"
  deployment_id:
    dseq: "1933977"
    owner: akash1h24fljt7p0nh82cq0za0uhsct3sfwsfu9w3c9h
  state: active
  version: Zqi3K8lyZ/XLGwe2gM9cho6VzAoKnO72FgnXlIVF/NA=
escrow_account:
  balance:
    amount: "5000000"
    denom: uakt
  id:
    scope: deployment
    xid: akash1h24fljt7p0nh82cq0za0uhsct3sfwsfu9w3c9h/1933977
  owner: akash1h24fljt7p0nh82cq0za0uhsct3sfwsfu9w3c9h
  settled_at: "1934322"
  state: open
  transferred:
    amount: "0"
    denom: uakt
groups:
- created_at: "1933981"
  group_id:
    dseq: "1933977"
    gseq: 1
    owner: akash1h24fljt7p0nh82cq0za0uhsct3sfwsfu9w3c9h
  group_spec:
    name: akash
    requirements:
      attributes: []
      signed_by:
        all_of: []
        any_of: []
    resources:
    - count: 1
      price:
        amount: "50"
        denom: uakt
      resources:
        cpu:
          attributes: []
          units:
            val: "2000"
        endpoints:
        - kind: RANDOM_PORT
        - kind: RANDOM_PORT
        memory:
          attributes: []
          quantity:
            val: "4294967296"
        storage:
          attributes: []
          quantity:
            val: "1099511627776"
  state: open

您可能已经注意到 5 AKT 现在低于escrow_account并且您的 akash 钱包余额减少了该值。创建租约后,此部署将立即使用这些令牌。一旦您关闭租约/部署,它们就会被退回(减去用于租约本身的少数)。

更多关于部署https://docs.akash.network/guides/deploy

7、查询市场报价

现在我们想要实际运行部署,我们将需要查看市场提供的资源,找到我们满意的价格方案,创建租约并发送我们的部署清单以使其启动和运行。

$ akash query market bid list \
  --owner=$AKASH_ACCOUNT_ADDRESS \
  --node $AKASH_NODE \
  --dseq $AKASH_DSEQ \
  --state open

bids:
- bid:
    bid_id:
      dseq: "1933977"
      gseq: 1
      oseq: 1
      owner: akash1h24fljt7p0nh82cq0za0uhsct3sfwsfu9w3c9h
      provider: akash1nxq8gmsw2vlz3m68qvyvcf3kh6q269ajvqw6y0
    created_at: "1933982"
    price:
      amount: "17"
      denom: uakt
    state: open
  escrow_account:
    balance:
      amount: "50000000"
      denom: uakt
    id:
      scope: bid
      xid: akash1h24fljt7p0nh82cq0za0uhsct3sfwsfu9w3c9h/1933977/1/1/akash1nxq8gmsw2vlz3m68qvyvcf3kh6q269ajvqw6y0
    owner: akash1nxq8gmsw2vlz3m68qvyvcf3kh6q269ajvqw6y0
    settled_at: "1933982"
    state: open
    transferred:
      amount: "0"
      denom: uakt
pagination:
  next_key: null
  total: "0"

AKASH_PROVIDER环境变量设置为您从可用市场出价中选择的那个:

AKASH_PROVIDER=akash1nxq8gmsw2vlz3m68qvyvcf3kh6q269ajvqw6y0

如果akash query market bid list没有显示任何出价,请确保您设置了AKASH_PROVIDER环境变量!

8. 创建租约/接受投标

通过运行下面的命令同选择的提供商签署租约:

akash tx market lease create \
  --chain-id $AKASH_CHAIN_ID \
  --node $AKASH_NODE \
  --owner $AKASH_ACCOUNT_ADDRESS \
  --dseq $AKASH_DSEQ \
  --gseq $AKASH_GSEQ \
  --oseq $AKASH_OSEQ \
  --provider $AKASH_PROVIDER \
  --from default \
  --gas-prices="0.025uakt" --gas="auto" --gas-adjustment=1.15

请注意,一旦创建租约,提供商将开始从您部署的托管账户中扣除费用,即使您尚未通过在以下步骤中上传清单来完成部署过程。

译者注:在Akash中存在两种角色,服务提供商,服务消费者。而服务消费者需要运行应用程序就需要选择相应的服务提供商提供的服务,并于之签署租约,租约消耗的是AKT Token ,服务消费者可以选择停止租约或者续约。

9. 发送清单以部署 PulseChain 节点

现在,要启动 PulseChain 部署,您需要将清单发送给提供者:

akash provider send-manifest go-pulse-geth.yml \
  --node $AKASH_NODE \
  --dseq $AKASH_DSEQ \
  --provider $AKASH_PROVIDER \
  --from default

片刻之后,您将能够看到您的部署:

$ akash provider lease-status \
  --node $AKASH_NODE \
  --dseq $AKASH_DSEQ \
  --provider $AKASH_PROVIDER \
  --from default
{
  "services": {
    "geth": {
      "name": "geth",
      "available": 1,
      "total": 1,
      "uris": null,
      "observed_generation": 1,
      "replicas": 1,
      "updated_replicas": 1,
      "ready_replicas": 1,
      "available_replicas": 1
    }
  },
  "forwarded_ports": {
    "geth": [
      {
        "host": "provider.akash.nixaid.com",
        "port": 30303,
        "externalPort": 30396,
        "proto": "TCP",
        "available": 1,
        "name": "geth"
      },
      {
        "host": "provider.akash.nixaid.com",
        "port": 30303,
        "externalPort": 31438,
        "proto": "UDP",
        "available": 1,
        "name": "geth"
      }
    ]
  }
}

唯一需要注意的是,无法直接导出非 http/https (80/443) TCP 端口,即所谓的 nodePort 端口,这就是为什么您看到实际端口是externalPort.
Akashnet 提供商在幕后使用 Kubernetes 来实际运行您的容器。Kubernetes 控制平面从--service-node-port-range标志(default: 30000-32767)(nodePort)指定的范围内分配端口。
这意味着您应该始终检查提供商的 Kubernetes 为您的 Akash 部署分配了哪些端口。
如果你真的需要暴露确切的端口,你可以与 Akash 提供商协商或使用一些负载均衡器/反向代理(即 nginx/haprxy/traefik)转发到这些端口。

10. 在 Akashnet 上查看 PulseChain 容器的日志

您可以在那里看到您的 PulseChain 节点的助记词。

$ akash \
  --node "$AKASH_NODE" \
  provider lease-logs \
  --dseq "$AKASH_DSEQ" \
  --gseq "$AKASH_GSEQ" \
  --oseq "$AKASH_OSEQ" \
  --provider "$AKASH_PROVIDER" \
  --from default \
  --follow
[geth-67b86dfcbb-t8ppz] INFO [07-25|16:16:19.890] Starting Geth on Ethereum mainnet... 
[geth-67b86dfcbb-t8ppz] WARN [07-25|16:16:19.891] Sanitizing cache to Go's GC limits       provided=2048 updated=682
[geth-67b86dfcbb-t8ppz] INFO [07-25|16:16:19.892] Maximum peer count                       ETH=50 LES=0 total=50
[geth-67b86dfcbb-t8ppz] INFO [07-25|16:16:19.892] Smartcard socket not found, disabling    err="stat /run/pcscd/pcscd.comm: no such file or directory"
[geth-67b86dfcbb-t8ppz] INFO [07-25|16:16:19.895] Starting peer-to-peer node               instance=Geth/v1.0.6-6abf18d0-20210720/linux-amd64/go1.15.5
[geth-67b86dfcbb-t8ppz] INFO [07-25|16:16:19.895] Allocated trie memory caches             clean=102.00MiB dirty=170.00MiB
[geth-67b86dfcbb-t8ppz] INFO [07-25|16:16:19.895] Allocated cache and file handles         database=/root/.ethereum/geth/chaindata cache=341.00MiB handles=524288
[geth-67b86dfcbb-t8ppz] INFO [07-25|16:16:20.594] Opened ancient database                  database=/root/.ethereum/geth/chaindata/ancient
[geth-67b86dfcbb-t8ppz] INFO [07-25|16:16:20.595] Writing default main-net genesis block 
[geth-67b86dfcbb-t8ppz] INFO [07-25|16:16:20.822] Persisted trie from memory database      nodes=12356 size=1.78MiB time=40.929224ms gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
[geth-67b86dfcbb-t8ppz] INFO [07-25|16:16:20.822] Initialised chain configuration          config="{ChainID: 1 Homestead: 1150000 DAO: 1920000 DAOSupport: true EIP150: 2463000 EIP155: 2675000 EIP158: 2675000 Byzantium: 4370000 Constantinople: 7280000 Petersburg: 7280000 Istanbul: 9069000, Muir Glacier: 9200000, Ramanujan: <nil>, Niels: <nil>, MirrorSync: <nil>, PrimordialPulse: <nil>, Engine: ethash}"
[geth-67b86dfcbb-t8ppz] INFO [07-25|16:16:20.823] Disk storage enabled for ethash caches   dir=/root/.ethereum/geth/ethash count=3
[geth-67b86dfcbb-t8ppz] INFO [07-25|16:16:20.823] Disk storage enabled for ethash DAGs     dir=/root/.ethash               count=2
[geth-67b86dfcbb-t8ppz] INFO [07-25|16:16:20.823] Initialising Ethereum protocol           versions="[65 64 63]" network=1 dbversion=<nil>
[geth-67b86dfcbb-t8ppz] WARN [07-25|16:16:20.823] Upgrade blockchain database version      from=<nil> to=7
[geth-67b86dfcbb-t8ppz] INFO [07-25|16:16:20.823] Loaded most recent local header          number=0 hash=d4e567…cb8fa3 td=17179869184 age=52y3mo3w
[geth-67b86dfcbb-t8ppz] INFO [07-25|16:16:20.823] Loaded most recent local full block      number=0 hash=d4e567…cb8fa3 td=17179869184 age=52y3mo3w
[geth-67b86dfcbb-t8ppz] INFO [07-25|16:16:20.823] Loaded most recent local fast block      number=0 hash=d4e567…cb8fa3 td=17179869184 age=52y3mo3w
[geth-67b86dfcbb-t8ppz] INFO [07-25|16:16:20.846] Regenerated local transaction journal    transactions=0 accounts=0
[geth-67b86dfcbb-t8ppz] INFO [07-25|16:16:20.851] Allocated fast sync bloom                size=272.00MiB
[geth-67b86dfcbb-t8ppz] INFO [07-25|16:16:20.921] Initialized fast sync bloom              items=12356 errorrate=0.000 elapsed=69.368ms
[geth-67b86dfcbb-t8ppz] INFO [07-25|16:16:21.001] New local node record                    seq=1 id=151c6e3553cee58f ip=127.0.0.1 udp=30303 tcp=30303
[geth-67b86dfcbb-t8ppz] INFO [07-25|16:16:21.003] Started P2P networking                   self=enode://8648620db3f7924aa5ebb6ee9282e487b5fe72f8c60a29de3a48dac715a54096d71dfe761b1c495d15f0f699b8774c8174b0a08b616ba57d9ab6579528c4c5ab@127.0.0.1:30303
[geth-67b86dfcbb-t8ppz] INFO [07-25|16:16:21.010] IPC endpoint opened                      url=/root/.ethereum/geth.ipc
[geth-67b86dfcbb-t8ppz] INFO [07-25|16:16:31.004] Looking for peers                        peercount=0 tried=3 static=0
[geth-67b86dfcbb-t8ppz] INFO [07-25|16:16:41.008] Looking for peers                        peercount=0 tried=3 static=0
[geth-67b86dfcbb-t8ppz] INFO [07-25|16:16:51.100] Looking for peers                        peercount=0 tried=4 static=0
[geth-67b86dfcbb-t8ppz] INFO [07-25|16:17:01.103] Looking for peers                        peercount=0 tried=5 static=0
[geth-67b86dfcbb-t8ppz] INFO [07-25|16:17:01.132] Block synchronisation started 
[geth-67b86dfcbb-t8ppz] INFO [07-25|16:17:01.444] Imported new state entries               count=273 elapsed=2.247µs  processed=273 pending=4369 retry=0 duplicate=0 unexpected=0
[geth-67b86dfcbb-t8ppz] INFO [07-25|16:17:01.487] Imported new state entries               count=384 elapsed=2.152µs  processed=657 pending=10513 retry=0 duplicate=0 unexpected=0
[geth-67b86dfcbb-t8ppz] INFO [07-25|16:17:01.528] Imported new state entries               count=384 elapsed=1.701µs  processed=1041 pending=16657 retry=0 duplicate=0 unexpected=0
[geth-67b86dfcbb-t8ppz] INFO [07-25|16:17:01.591] Imported new state entries               count=384 elapsed=2.128µs  processed=1425 pending=22795 retry=0 duplicate=0 unexpected=0
[geth-67b86dfcbb-t8ppz] INFO [07-25|16:17:01.756] Imported new state entries               count=768 elapsed=868.707µs processed=2193 pending=25017 retry=0 duplicate=0 unexpected=0
[geth-67b86dfcbb-t8ppz] INFO [07-25|16:17:01.933] Imported new state entries               count=768 elapsed=2.808ms   processed=2961 pending=24601 retry=0 duplicate=0 unexpected=0
[geth-67b86dfcbb-t8ppz] INFO [07-25|16:17:02.335] Imported new state entries               count=768 elapsed=7.270ms   processed=3729 pending=24391 retry=0 duplicate=0 unexpected=0
[geth-67b86dfcbb-t8ppz] INFO [07-25|16:17:02.358] Imported new block headers               count=192 elapsed=865.475ms number=192 hash=723899…123390 age=6y3w6d
[geth-67b86dfcbb-t8ppz] INFO [07-25|16:17:02.361] Migrated ancient blocks                  count=1   elapsed=325.756µs
[geth-67b86dfcbb-t8ppz] INFO [07-25|16:17:02.441] Imported new block headers               count=192 elapsed=79.563ms  number=384 hash=d3d5d5…c79cf3 age=6y3w6d
[geth-67b86dfcbb-t8ppz] INFO [07-25|16:17:02.929] Imported new state entries               count=1536 elapsed=15.404ms  processed=5265 pending=24216 retry=0 duplicate=0 unexpected=0
...

如果您geth没有找到对等点,请参阅https://geth.ethereum.org/docs/interface/peer-to-peer
他们解释了如何找到对等点以及如何解决连接的常见问题。

11. 终止部署

完成测试后,您可以终止部署。

akash tx deployment close \
  --node $AKASH_NODE \
  --chain-id $AKASH_CHAIN_ID \
  --dseq $AKASH_DSEQ \
  --owner $AKASH_ACCOUNT_ADDRESS \
  --from default \
  --gas-prices="0.025uakt" --gas="auto" --gas-adjustment=1.15

12. 为部署存入更多 AKT

如果您对您的部署感到满意并且不希望它有一天停止,您可以为托管账户存入更多的 AKT 代币:

akash tx deployment deposit \
  --from default \
  --chain-id $AKASH_CHAIN_ID \
  --node $AKASH_NODE 1000000uakt \
  --dseq $AKASH_DSEQ \
  --gas-prices="0.025uakt" --gas="auto" --gas-adjustment=1.15
1 Like