Loading...
墨滴

红军大叔

2021/06/01  阅读:45  主题:自定义主题1

如何在Akashnet上部署Solana节点

本篇文章将指导你在Akashnet上部署Solana节点。 我将尽量使其简短,同时保持所有必要的步骤,并贯穿整个部署流程。

我必须指出,这不是Solana节点的生产环境部署,而是测试环境的部署,原因在文末有提到。

我使用Ubuntu 20.04.2 LTS Linux发行版及以下软件:

  • akash: v0.12.1 (在Akashnet上运行)。
  • solana:v1.6.10(用于在Akashnet上部署)。

先认识这两个新东西:

  • Akashnet是未来的去中心化云;
  • Solana是一个高性能的区块链,支持全球范围内的开发者创建如今可扩展的加密货币应用程序。

这个想法很简单--利用Akashnet decloud来部署Solana节点。

话不多说,为了节省你我的时间,以下让我们直接跳到命令行界面的步骤。

1.安装akash客户端

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

请同时安装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代币)来开始。 你可以在这里提到的任何一个交易所购买[1]

你可以查询你的钱包的余额。

export AKASH_ACCOUNT_ADDRESS=akash1h24fljt7p0nh82cq0za0uhsct3sfwsfu9w3c9h

计价方式:1 akt = 1000000 uakt (akt*10^6)

我正在使用生产环境akashnet-2 Akash网络。更多关于Akash不同网络的信息[2]请参考。

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 \
  --fees 200uakt 

证书只需要为每个账户创建一次,并且可以在所有部署中使用。更多关于证书的信息[3]请参考。

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

定价--请注意,可能有多个不同供应商的出价。在这种情况下,两个供应商恰好都愿意接受1uAKT的价格。这意味着可以使用每个区块1 uAKT或0.000001 AKT创建租赁来执行容器。

有了定价的限制,供应商就能知道如何对你的部署进行投标。例如,你愿意支付的每个区块的uakt数量(每个区块每6秒发生一次)。 所以对于1uakt,你将每月支付(1*((60/6) 6024*30.436875))/10^6)*3.28 = 1.44美元,截至2021年5月31日1akt价值3.28美元。

signedBy必须是akash1365yvmc4s7awdyj3n2sav7xfx76adc6dnmlx63,signedBy文件[4]

signedBy是一种 "验证",在供应商被akash批准后,他们会被akash签署,以确保安全性和可靠性。

更多关于用于编写Akash清单的SDL[5]((Stack Definition Language) 。

6.创建你的部署

akash tx deployment create solana.yml \
  --from default \
  --node $AKASH_NODE \
  --chain-id $AKASH_CHAIN_ID \
  --fees 200uakt

如果这个命令出现如下错误 Error:RPC error -32603 - Internal error: timed out waiting for tx to be included in a block,请不用担心,你可以查询akash区块链,以找到你的部署ID。

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

查询部署情况:

export AKASH_DSEQ=1172777
export AKASH_GSEQ=1
export 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钱包余额也相应减少。在你创建一个租赁时这些代币将被此部署使用。当你关闭租赁/部署时,它们将被退回(除去少数用于租赁本身的代币)。

更多关于部署的信息[6]

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环境变量设置为你从可用的市场出价中挑出的那一个:

export AKASH_PROVIDER=akash10cl5rm0cqnpj45knzakpa4cnvn5amzwp4lhcal

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 \
  --fees 200uakt

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. sjc1p1 .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[7],你可以查询你的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 \
  --fees 200uakt

13. 存放更多的AKT供部署

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

akash tx deployment deposit \
  --from default \
  --chain-id $AKASH_CHAIN_ID \
  --node $AKASH_NODE 1000000uakt \
  --dseq $AKASH_DSEQ \
  --fees=200uakt

14. 生产环境Solana验证器节点

对于生产环境Solana验证器节点部署,您将需要按照如下方式修改您的清单文件,可能还需要按照推荐的方式提高cpu、内存和储存限制[8]

---
version: "2.0"

services:
  solana:
    image: solanalabs/solana:v1.6.10
    expose:
      - port: 8899
        as: 8899
        proto: tcp
        to:
          - global: true
      - port: 8000
        as: 8000
        proto: tcp
        to:
          - global: true
      - port: 8001
        as: 8001
        proto: tcp
        to:
          - global: true
      - port: 8002
        as: 8002
        proto: tcp
        to:
          - global: true
      - port: 8003
        as: 8003
        proto: tcp
        to:
          - global: true
      - port: 8004
        as: 8004
        proto: tcp
        to:
          - global: true
      - port: 8005
        as: 8005
        proto: tcp
        to:
          - global: true
      - port: 8006
        as: 8006
        proto: tcp
        to:
          - global: true
      - port: 8007
        as: 8007
        proto: tcp
        to:
          - global: true
      - port: 8008
        as: 8008
        proto: tcp
        to:
          - global: true
      - port: 8009
        as: 8009
        proto: tcp
        to:
          - global: true
      - port: 8010
        as: 8010
        proto: tcp
        to:
          - global: true
    env:
      - |
        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 8000-8010

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 8000-8010 参数中指定的端口。

唯一需要注意的是,不可能按原样导出非http/https (80/443) TCP端口,即所谓的nodePort,例如8899/ TCP、8000:8010/ TCP。

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

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

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

然而,我们的目标是展示Akashnet,而不是完成生产环境Solana节点的部署。

官方的Solana文档并不推荐将Docker用于生产环境部署,尽管生产环境的Solana节点应该运行在12cores, 128Gi RAM, 500Gi+ SSD上,但Akashnet目前还没有提供,因为它是一个非常新的网络,还没有那么多供应商。这也不是一个投资建议。

附加说明:

1.solana docker容器运行solana-run.sh: https://github.com/solana-labs/solana/blob/v1.6.10/sdk/docker-solana/build.sh#L26

2.在实际运行Solana验证器之前,看看运行solana-sys-tuner的可行性如何: https://docs.solana.com/running-validator/validator-start#system-tuning

3.设置ulimit nofile=700000 (看来akash SDL到2021年5月31日都不支持)

微信外链

[1]

交易所购买: https://akash.network/token/

[2]

Akash不同网络的信息: https://docs.akash.network/guides/version

[3]

证书的信息: https://docs.akash.network/design/mtls

[4]

signedBy文件: https://docs.akash.network/guides/deploy

[5]

Akash清单的SDL: https://docs.akash.network/documentation/sdl

[6]

关于部署的信息: https://docs.akash.network/guides/deployl

[7]

Solana的json RPC API: https://docs.solana.com/developing/clients/jsonrpc-api

[8]

储存限制: https://docs.solana.com/running-validator/validator-reqs

红军大叔

2021/06/01  阅读:45  主题:自定义主题1

作者介绍

红军大叔