【译文】在Akash网络上部署Solana 节点

阿卡什

在Akash网络上部署Solana 节点

译者注:
	原文链接:https://nixaid.com/solana-on-akashnet/
	翻译说明:在尊重原作者的基础上,对文章进行了中文翻译以及技术点拓展,如有不对之处,欢迎指出,将会积极修正。

这篇文章将指导您在 Akashnet 上部署 Solana 节点

安德烈·阿拉波夫

这篇文章将指导您在Akashnet上部署Solana节点。

我将尽量缩短它的时间,同时保留所有必要的步骤可用于从头开始部署。

我必须指出,这不是生产 Solana 节点部署,而是开发部署,原因可以在本文末尾看到。

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

运行环境准备
环境依赖:
	Ubuntu 20.04.2 LTS
	Akash  v0.12.1
	solana v1.6.10

认识你的新朋友:
- Akashnet是未来的去中心化云;
- Solana是一个高性能区块链,支持世界各地的构建者创建当今可扩展的加密应用程序。

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

相比于亚马逊的AWS服务器,Akashnet要便宜将近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. 准备部署清单文件

创建一个以solana.yml以下内容命名的文件:

---
version: "2.0"

services:
  solana:
    image: solanalabs/solana:v1.6.10
    expose:
      - port: 8899
        as: 8899
        proto: tcp
        to:
          - global: true

profiles:
  compute:
    solana:
      resources:
        cpu:
          units: 0.1
        memory:
          size: 512Mi
        storage:
          size: 512Mi
  placement:
    akash:
      attributes:
        host: akash
      signedBy:
        anyOf:
          - "akash1365yvmc4s7awdyj3n2sav7xfx76adc6dnmlx63"
      pricing:
        solana: 
          denom: uakt
          amount: 10

deployment:
  solana:
    akash:
      profile: solana
      count: 1

定价 - 请注意,有来自多个不同提供商的出价。在这种情况下,两个提供商碰巧都愿意接受 1 uAKT 的价格。这意味着可以使用每个块 1 uAKT 或 0.000001 AKT 来创建租约来执行容器。
定价设置了限制,因此提供商知道如何对您的部署进​​行投标。即您愿意支付的每个区块的 uakt 数量(每个区块每 6 秒发生一次)。
因此,如果使用 1uakt,您将支付=每月 1akt 价值 3.28 美元。((1*((60/6)**60**24*30.436875))/10^6)*3.28``$1.44``31 May 2021

signedBy必须akash1365yvmc4s7awdyj3n2sav7xfx76adc6dnmlx63像文档中一样https://docs.akash.network/guides/deploy
signedBy是一个“验证”的东西,在提供者被 akash 批准后,他们会得到 akash 的签名以确保安全性和可靠性。

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

6. 创建您的部署
akash tx deployment create solana.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","1172777"

查询部署:

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

$ AKASH_DSEQ=1172777
$ AKASH_GSEQ=1
$ AKASH_OSEQ=1

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

deployment:
  created_at: "1172779"
  deployment_id:
    dseq: "1172777"
    owner: akash1h24fljt7p0nh82cq0za0uhsct3sfwsfu9w3c9h
  state: active
  version: R+bMsK3+N7Wtf8MWmUqoIJTgagXPunxFJqV4EXZahYE=
escrow_account:
  balance:
    amount: "5000000"
    denom: uakt
  id:
    scope: deployment
    xid: akash1h24fljt7p0nh82cq0za0uhsct3sfwsfu9w3c9h/1172777
  owner: akash1h24fljt7p0nh82cq0za0uhsct3sfwsfu9w3c9h
  settled_at: "1172791"
  state: open
  transferred:
    amount: "0"
    denom: uakt
groups:
- created_at: "1172779"
  group_id:
    dseq: "1172777"
    gseq: 1
    owner: akash1h24fljt7p0nh82cq0za0uhsct3sfwsfu9w3c9h
  group_spec:
    name: akash
    requirements:
      attributes:
      - key: host
        value: akash
      signed_by:
        all_of: []
        any_of:
        - akash1365yvmc4s7awdyj3n2sav7xfx76adc6dnmlx63
    resources:
    - count: 1
      price:
        amount: "10"
        denom: uakt
      resources:
        cpu:
          attributes: []
          units:
            val: "100"
        endpoints:
        - kind: RANDOM_PORT
        memory:
          attributes: []
          quantity:
            val: "536870912"
        storage:
          attributes: []
          quantity:
            val: "536870912"
  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: "1172777"
      gseq: 1
      oseq: 1
      owner: akash1h24fljt7p0nh82cq0za0uhsct3sfwsfu9w3c9h
      provider: akash10cl5rm0cqnpj45knzakpa4cnvn5amzwp4lhcal
    created_at: "1172780"
    price:
      amount: "1"
      denom: uakt
    state: open
  escrow_account:
    balance:
      amount: "50000000"
      denom: uakt
    id:
      scope: bid
      xid: akash1h24fljt7p0nh82cq0za0uhsct3sfwsfu9w3c9h/1172777/1/1/akash10cl5rm0cqnpj45knzakpa4cnvn5amzwp4lhcal
    owner: akash10cl5rm0cqnpj45knzakpa4cnvn5amzwp4lhcal
    settled_at: "1172780"
    state: open
    transferred:
      amount: "0"
      denom: uakt
- bid:
    bid_id:
      dseq: "1172777"
      gseq: 1
      oseq: 1
      owner: akash1h24fljt7p0nh82cq0za0uhsct3sfwsfu9w3c9h
      provider: akash1f6gmtjpx4r8qda9nxjwq26fp5mcjyqmaq5m6j7
    created_at: "1172780"
    price:
      amount: "1"
      denom: uakt
    state: open
  escrow_account:
    balance:
      amount: "50000000"
      denom: uakt
    id:
      scope: bid
      xid: akash1h24fljt7p0nh82cq0za0uhsct3sfwsfu9w3c9h/1172777/1/1/akash1f6gmtjpx4r8qda9nxjwq26fp5mcjyqmaq5m6j7
    owner: akash1f6gmtjpx4r8qda9nxjwq26fp5mcjyqmaq5m6j7
    settled_at: "1172780"
    state: open
    transferred:
      amount: "0"
      denom: uakt
pagination:
  next_key: null
  total: "0"

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

AKASH_PROVIDER=akash10cl5rm0cqnpj45knzakpa4cnvn5amzwp4lhcal

如果akash query market bid list没有显示任何出价,请确保您的unset 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

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

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

现在,要开始您的 Solana 部署,您需要将您的清单发送给提供者:

akash provider send-manifest solana.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": {
    "solana": {
      "name": "solana",
      "available": 1,
      "total": 1,
      "uris": null,
      "observed_generation": 1,
      "replicas": 1,
      "updated_replicas": 1,
      "ready_replicas": 1,
      "available_replicas": 1
    }
  },
  "forwarded_ports": {
    "solana": [
      {
        "host": "cluster.sjc1p0.mainnet.akashian.io",
        "port": 8899,
        "externalPort": 32509,
        "proto": "TCP",
        "available": 1,
        "name": "solana"
      }
    ]
  }
}

端点 URI 是cluster.sjc1p0.mainnet.akashian.io:32509
现在为什么是端口32509而不是8899你会在这篇文章的结尾找到(见 nodePort)。

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

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

$ akash \
  --node "$AKASH_NODE" \
  provider lease-logs \
  --dseq "$AKASH_DSEQ" \
  --gseq "$AKASH_GSEQ" \
  --oseq "$AKASH_OSEQ" \
  --provider "$AKASH_PROVIDER" \
  --from default \
  --follow
[solana-648bbc8979-hrjq6] solana-faucet 1.6.10 (src:5d4654d2; feat:3533521759)
[solana-648bbc8979-hrjq6] solana-genesis 1.6.10 (src:5d4654d2; feat:3533521759)
[solana-648bbc8979-hrjq6] solana-keygen 1.6.10 (src:5d4654d2; feat:3533521759)
[solana-648bbc8979-hrjq6] solana-validator 1.6.10 (src:5d4654d2; feat:3533521759)
[solana-648bbc8979-hrjq6] + solana address
[solana-648bbc8979-hrjq6] Error: No such file or directory (os error 2)
[solana-648bbc8979-hrjq6] + echo Generating default keypair
[solana-648bbc8979-hrjq6] Generating default keypair
[solana-648bbc8979-hrjq6] + solana-keygen new --no-passphrase
[solana-648bbc8979-hrjq6] Generating a new keypair
[solana-648bbc8979-hrjq6] Wrote new keypair to /root/.config/solana/id.json
[solana-648bbc8979-hrjq6] ==============================================================================
[solana-648bbc8979-hrjq6] pubkey: 2tpqeMBuqQNd2F6pmQmb2Dyj1A6k2yqqCnWXuWh2pX14
[solana-648bbc8979-hrjq6] ==============================================================================
[solana-648bbc8979-hrjq6] Save this seed phrase to recover your new keypair:
[solana-648bbc8979-hrjq6] wagon layer regret misery divorce wild noodle rent actress reflect sister lift
[solana-648bbc8979-hrjq6] ==============================================================================
...
[solana-648bbc8979-hrjq6] [2021-05-31T13:06:27.045978808Z INFO  solana_core::cluster_info] 
[solana-648bbc8979-hrjq6]     IP Address        |Age(ms)| Node identifier                              | Version |Gossip| TPU  |TPUfwd| TVU  |TVUfwd|Repair|ServeR|ShredVer
[solana-648bbc8979-hrjq6]     ------------------+-------+----------------------------------------------+---------+------+------+------+------+------+------+------+--------
[solana-648bbc8979-hrjq6]     127.0.0.1       me|  4558 | 3QDTDmtqV3rLDdkLVPzP5RLg9TdXLFA7QPzv6Eeo72fi | 1.6.10  | 8001 | 8003 | 8004 | 8000 | 8002 | 8006 | 8007 | 48122
[solana-648bbc8979-hrjq6]     Nodes: 1
[solana-648bbc8979-hrjq6]     
[solana-648bbc8979-hrjq6]     RPC Address       |Age(ms)| Node identifier                              | Version | RPC  |PubSub|ShredVer
[solana-648bbc8979-hrjq6]     ------------------+-------+----------------------------------------------+---------+------+------+--------
[solana-648bbc8979-hrjq6]     127.0.0.1       me|  4558 | 3QDTDmtqV3rLDdkLVPzP5RLg9TdXLFA7QPzv6Eeo72fi | 1.6.10  | 8899 | 8900 | 48122
[solana-648bbc8979-hrjq6]     RPC Enabled Nodes: 1
...
11.在Akashnet上查询你的Solana节点

使用Solana 的 json RPC API,您可以查询您的 Solana 节点:

$ curl -s http://cluster.sjc1p0.mainnet.akashian.io:32509 -X POST -H "Content-Type: application/json" -d '
  {"jsonrpc":"2.0","id":1, "method":"getBlockTime","params":[5]}
' | jq -r '.result | todate'
2021-05-31T13:05:39Z

$ curl -s http://cluster.sjc1p0.mainnet.akashian.io:32509 -X POST -H "Content-Type: application/json" -d '
  {"jsonrpc":"2.0","id":1, "method":"getIdentity"}
'
{"jsonrpc":"2.0","result":{"identity":"3QDTDmtqV3rLDdkLVPzP5RLg9TdXLFA7QPzv6Eeo72fi"},"id":1}

$ curl -s http://cluster.sjc1p0.mainnet.akashian.io:32509 -X POST -H "Content-Type: application/json" -d '
  {"jsonrpc":"2.0", "id":1, "method":"getClusterNodes"}
' | jq .
{
  "jsonrpc": "2.0",
  "result": [
    {
      "featureSet": 3533521759,
      "gossip": "127.0.0.1:8001",
      "pubkey": "3QDTDmtqV3rLDdkLVPzP5RLg9TdXLFA7QPzv6Eeo72fi",
      "rpc": "127.0.0.1:8899",
      "shredVersion": 48122,
      "tpu": "127.0.0.1:8003",
      "version": "1.6.10"
    }
  ],
  "id": 1
}
12. 终止部署

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

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
13. 为部署存入更多 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
14. 生产 Solana 验证器节点

对于生产 Solana 验证器节点部署,您需要按如下方式修改清单文件,还可能按照建议解除 cpu、内存、存储限制。

---
version: "2.0"

services:
  solana:
    image: solanalabs/solana:v1.6.10
    expose:
      - port: 8899
        as: 8899
        proto: tcp
        to:
          - global: true
      - port: 8001
        as: 8001
        proto: tcp
        to:
          - global: true
      - port: 8900
        as: 8900
        proto: tcp
        to:
          - global: true
      - port: 8010
        as: 8010
        proto: udp
        to:
          - global: true
      - port: 8011
        as: 8011
        proto: udp
        to:
          - global: true
      - port: 8012
        as: 8012
        proto: udp
        to:
          - global: true
      - port: 8013
        as: 8013
        proto: udp
        to:
          - global: true
      - port: 8014
        as: 8014
        proto: udp
        to:
          - global: true
      - port: 8015
        as: 8015
        proto: udp
        to:
          - global: true
      - port: 8016
        as: 8016
        proto: udp
        to:
          - global: true
      - port: 8017
        as: 8017
        proto: udp
        to:
          - global: true
      - port: 8018
        as: 8018
        proto: udp
        to:
          - global: true
      - port: 8019
        as: 8019
        proto: udp
        to:
          - global: true
      - port: 8020
        as: 8020
        proto: udp
        to:
          - global: true
    env:
      - SOLANA_RUN_SH_CLUSTER_TYPE=mainnet-beta
      - |
        SOLANA_RUN_SH_VALIDATOR_ARGS=
        --trusted-validator 7Np41oeYqPefeNQEHSv1UDhYrehxin3NStELsSKCT4K2
        --trusted-validator GdnSyH3YtwcxFvQrVVJMm1JhTS4QVX7MFsX56uJLUfiZ
        --trusted-validator DE1bawNcRJB9rVm3buyMVfr8mBEoyyu73NBovf2oXJsJ
        --trusted-validator CakcnaRDHka2gXyfbEd2d3xsvkJkqsLw2akB3zsN1D2S
        --no-untrusted-rpc
        --private-rpc
        --entrypoint entrypoint.mainnet-beta.solana.com:8001
        --entrypoint entrypoint2.mainnet-beta.solana.com:8001
        --entrypoint entrypoint3.mainnet-beta.solana.com:8001
        --entrypoint entrypoint4.mainnet-beta.solana.com:8001
        --entrypoint entrypoint5.mainnet-beta.solana.com:8001
        --expected-genesis-hash 5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d
        --wal-recovery-mode skip_any_corrupted_record
        --limit-ledger-size
        --dynamic-port-range 8010-8020

profiles:
  compute:
    solana:
      resources:
        cpu:
          units: 0.1
        memory:
          size: 512Mi
        storage:
          size: 512Mi
  placement:
    akash:
      attributes:
        host: akash
      signedBy:
        anyOf:
          - "akash1365yvmc4s7awdyj3n2sav7xfx76adc6dnmlx63"
      pricing:
        solana: 
          denom: uakt
          amount: 10

deployment:
  solana:
    akash:
      profile: solana
      count: 1

您可能需要公开更多端口,例如--dynamic-port-range 8010-8020参数中指定的端口。

唯一要注意的是,它是无法导出非HTTP / HTTPS(80/443)TCP端口。

所谓nodePort端口,如8899/tcp8010:8020/udp按照原样,不做修改。

Akashnet 提供商在幕后使用 Kubernetes 来实际运行您的容器。Kubernetes 控制平面从--service-node-port-range标志(default: 30000-32767)(nodePort)指定的范围内分配端口,这意味着运营商必须首先部署 Solana 节点,然后检查提供商的 Kubernetes 分配给您的 Akash 部署的端口。

然后使用一些负载均衡器/反向代理(即nginx/haprxy/traefik)转发到这些端口。

您还需要通过--public-rpc-address <HOST:PORT>Solana 验证器节点的参数指定它来告诉 Solana 验证器使用负载平衡器的主机名。

然而,这篇文章大的目标是展示 Akashnet 而不是部署完整的生产 Solana 节点。
Solana 官方文档不推荐将Docker 用于生产部署,尽管生产 Solana 节点应该在12 核、128Gi RAM、500Gi+ SSD 上运行,但 Akashnet目前还没有提供,因为它是一个新兴的的网络,而且没有足够的提供商可以支持这样的部署环境。

上述观点不能作为投资建议。

如果你喜欢这篇文章,请在这里投票https://forum.akash.network/t/twitter-deploy-challenge-solana-on-akash/160

PS
对我自己(或其他任何想从这里学习并进一步推动它的人)的注意事项: