红军大叔
2021/06/01阅读:146主题:自定义主题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日都不支持)
微信外链
交易所购买: 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
作者介绍