2021-11-03 00:08 | 出处: Akash
“重要提醒:
因为缺少引导节点、网络配置(config.toml、genesis.json),这不会将您连接到真正的 PulseChain 节点。
这里需要等 PulseChain 开发人员提供的完整说明(README.md · 16178c59 · PulseChain / Go-Pulse · GitLab)。
”
“注:
确保在带有 SSD 的供应商上部署 geth。不能在 HDD 上运行 geth,因为将 geth 数据存储在磁盘上是一种糟糕的方式。
更多常见问题解答:https://geth.ethereum.org/docs/faq。
”
“译者注:
Q:为什么我无法在 HDD 上运行完整节点?
A:在 HDD 上执行快速同步将花费比您愿意等待的当前数据架构更多的时间。即使你等待它,硬盘也无法跟上主网上交易处理的读/写要求。
但是,您应该能够在对系统资源影响最小的情况下在 HDD 上运行轻客户端。但是,如果您希望运行完整节点,则 SSD 是您唯一的选择。
”
我使用Ubuntu 20.04.2 LTS Linux发行版及以下软件:
先认识这两个新东西:
这个想法很简单–利用 Akashnet decloud 来部署 PulseChain 节点。
在运行一个实例的情况下,Akashnet 要比亚马逊 AWS 服务器便宜将近 86%,这是 Akashlytics 给出的几个云平台价格对比:Akashlytics
话不多说,为了节省你我的时间,以下让我们直接跳到命令行界面的步骤。
AKASH_VERSION="¥(curl -s "¥AKASH_NET/version.txt")"
curl https://raw.githubusercontent.com/ovrclk/akash/master/godownloader.sh | sh -s -- "v¥AKASH_VERSION"
“译者注:
为了后续命令能执行,你需要安装 jq 工具,对命令的 JSON 结果美化和过滤。
检查 jq 工具是否安装:
jq --version
jq-1.6安装后将返回 jq 版本,如果没有安装,可以使用如下命令:
”
sudo apt install -y jq
akash keys add default
这个命令将输出助记词,确保将其保存在一个安全的地方。
它还会输出你的地址,在我的例子中,地址是 akash1h24fljt7p0nh82cq0za0uhsct3sfwsfu9w3c9h。
export AKASH_ACCOUNT_ADDRESS=akash1h24fljt7p0nh82cq0za0uhsct3sfwsfu9w3c9h
更多关于 Akash 钱包介绍请参考:Page not found - Akash Guidebook
你需要大约10个 AKT(Akash 代币)来开始,你可以在这里提到的任何一个交易所购买:https://akash.network/token。
“译者注:
这里实际只需要大于 5AKT即可。
”
查询你的钱包的余额:
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)
或者你也可以执行如下命令进行换算:
akash
--node "¥AKASH_NODE"
query bank balances "¥AKASH_ACCOUNT_ADDRESS"
-o json | jq -r ‘(.balances[0].amount | tonumber / pow(10; 6))‘
我正在使用生产环境 Akashnet-2 网络,更多关于 Akash 不同网络的信息请参考:Page not found - Akash Guidebook
四、创建证书文件 要创建一个部署,首先必须创建一个证书。命令如下:
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="****" --gas-adjustment=1.15
每个帐户只需要创建一次证书,并且可以在所有部署中使用。
更多关于证书的信息请参考:Page not found - Akash Guidebook
创建一个名为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=0 xabcdef...."
##- "--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
清单文件中的关键字说明:
pricing
请注意,可能有多个不同供应商的出价。在这种情况下,两个供应商恰好都愿意接受 1uAKT 的价格,这意味着可以使用每个区块 1 uAKT或 0.000001 AKT 创建租赁来执行容器。
有了定价的限制,供应商就能知道如何对你的部署进行投标。即您愿意支付的每个区块的 uakt 数量(每个区块每 6 秒发生一次)。
因此,如果使用 1uakt,您将每月支付 1.17 美元(截至 2021年7月25日 1akt 价值2.68美元)。
计算公式:((1*((60/6)6024*30.436875))/10^6)*2.68=¥1.17
signedBy
必须是:akash1365yvmc4s7awdyj3n2sav7xfx76adc6dnmlx63
相关文档:Akash Deploy UI (Web App) - Akash Guidebook
signedBy是一种“验证”,在供应商获得 akash 批准后,他们会得到 akash 的签名以确保安全性和可靠性。
“注:
更多关于编写 Akash 清单的 SDL(堆栈定义语言)的信息:Page not found - Akash Guidebook
”
您可以使用我的容器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
“译者注:
”
andrey01/go-pulse-geth:0.2.0-6abf18d00:其中 andrey01 是你的 docker hub 账户名;
最后一步推送镜像需要用到你自己的 docker hub 账号,你需要提前在 https://hub.docker.com 网站上注册好账号。
akash tx deployment create go-pulse-geth.yml
--from default
--node ¥AKASH_NODE
--chain-id ¥AKASH_CHAIN_ID
--gas-prices="0.025uakt" --gas="****" --gas-adjustment=1.15
如果这个命令出现如下错误: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 999999
| jq -r ‘.txs[] | [ .tx.body.messages[].id[] ] | @csv‘ |
tail -5
# 下面是命令返回:
"akash1h24fljt7p0nh82cq0za0uhsct3sfwsfu9w3c9h","1933977"
“译者注:
执行后会返回部署的DSEQ,后面会使用到。例如这里的1933977。
”
查询部署情况:
“注:
为了避免后面执行命令akash tx deployment create出现这个错误:failed to execute message; message index: 0: Deployment closed,我实际没有“导出”以下 3 个“SEQ”变量。
如果你遇到了这个错误,可以使用 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 钱包余额也相应减少。在你创建一个租赁时,这些代币将被此部署使用。当你关闭租赁/部署时,它们将被退回(除去少数用于租赁本身的代币)。
更多关于部署的信息:Page not found - Akash Guidebook
现在,我们想实际运行我们的部署,我们需要看看市场的报价,接受我们感到满意的出价,创建租赁并发送部清单,使其启动并运行。
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=akash10cl5rm0cqnpj45knzakpa4cnvn5amzwp4lhcal
如果akash query market bid list没有显示任何出价,请确保使用这个命令unset AKASH_PROVIDER来重置环境变量。
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="****" --gas-adjustment=1.15
“注:
一旦创建租约,提供商将开始从您部署的托管账户中扣除费用,即使您尚未通过在以下步骤中上传清单来完成部署过程。
”
现在,为了开始部署你的 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 端口。
Akashnet 供应商在后台使用 Kubernetes 来实际运行您的容器。Kubernetes 控制平面从--service-node-port-range标志(default: 30000-32767)(nodePort)指定的范围内分配一个端口,这意味着您应该始终检查提供商的 Kubernetes 为您的 Akash 部署分配了哪些端口。
如果你真的需要暴露确切的端口,你可以与 Akash 提供商协商或使用一些负载均衡器/反向代理(即 nginx/haprxy/traefik)转发到这些端口。
您可以在这里看到 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>, MirrorSy