solana-test-validator 部署失败。区块哈希过期
solana-test-validator deploy fail. Blockhash expired
我正在尝试在本地 solana-test-validator 上部署一个简单的程序
我启动验证器
docker run -it --entrypoint solana-test-validator -p 8899:8899 -p 8900:8900 -p 9900:9900 solanalabs/solana:v1.8.11
然后我用一个钱包创建了一个账户,里面有一些 SOL
solana config set --url http://localhost:8899
KEYPAIR_ACCOUNT1="/root/.config/solana/id1.json"
solana-keygen new -o $KEYPAIR_ACCOUNT1 --force
PUBKEY_ACCOUNT1=`solana-keygen pubkey $KEYPAIR_ACCOUNT1`
solana-keygen verify $PUBKEY_ACCOUNT1 $KEYPAIR_ACCOUNT1
solana balance $PUBKEY_ACCOUNT1
solana airdrop 10 $PUBKEY_ACCOUNT1
我正在构建这个简单的程序:
https://gitlab.com/rahasak-labs/solana-localnet/-/tree/master/contract
我确保本地 solana 也是 1.8.11(我也尝试使用 1.9.2)
cd solanaworkspace/contract_helloworld
# lib for building smartcontract
cargo install rustfilt
# build helloworld
cargo build-bpf --dump
部署我做的程序:
我使用 --keypair $KEYPAIR_ACCOUNT1 部署 /solanaworkspace/contract_helloworld/target/deploy/helloworld.so
,它将使用 $KEYPAIR_PROGRAM1
处的默认 .json 密钥对
KEYPAIR_PROGRAM1=/solanaworkspace/contract_helloworld/target/deploy/helloworld-keypair.json
PUBKEY_PROGRAM1=`solana-keygen pubkey $KEYPAIR_PROGRAM1`
# solana account $PUBKEY_PROGRAM1
solana program deploy --keypair $KEYPAIR_ACCOUNT1 /solanaworkspace/contract_helloworld/target/deploy/helloworld.so
这将尝试提交 5 次,直到失败 Blockhash expired
在尝试部署时,我看到了这样的日志:
Waiting for next block, 60 pending... [block height 693; re-sign in 285 ]
它还说直到 60 但随后重置为 Waiting for next block
:
Sending 36/60 transactions
我做错了什么?
我想用 docker 容器复制起来很容易。
非常感谢。
编辑:嗯,当它不在 运行 容器中时,它可以工作。
我还在想with是不是错了。
程序部署是通过验证器的 TPU(事务处理单元)完成的,它监听不同的端口,8003
。如果该端口不可访问,则发送程序部署事务将失败。
您可以先在启动中添加端口 8003
,如果仍然失败,请打开 Dockerfile 中列出的每个端口:https://github.com/solana-labs/solana/blob/005592998dd107b3d54d9203babe24da681834f5/sdk/docker-solana/Dockerfile#L3
我正在尝试在本地 solana-test-validator 上部署一个简单的程序
我启动验证器
docker run -it --entrypoint solana-test-validator -p 8899:8899 -p 8900:8900 -p 9900:9900 solanalabs/solana:v1.8.11
然后我用一个钱包创建了一个账户,里面有一些 SOL
solana config set --url http://localhost:8899
KEYPAIR_ACCOUNT1="/root/.config/solana/id1.json"
solana-keygen new -o $KEYPAIR_ACCOUNT1 --force
PUBKEY_ACCOUNT1=`solana-keygen pubkey $KEYPAIR_ACCOUNT1`
solana-keygen verify $PUBKEY_ACCOUNT1 $KEYPAIR_ACCOUNT1
solana balance $PUBKEY_ACCOUNT1
solana airdrop 10 $PUBKEY_ACCOUNT1
我正在构建这个简单的程序:
https://gitlab.com/rahasak-labs/solana-localnet/-/tree/master/contract
我确保本地 solana 也是 1.8.11(我也尝试使用 1.9.2)
cd solanaworkspace/contract_helloworld
# lib for building smartcontract
cargo install rustfilt
# build helloworld
cargo build-bpf --dump
部署我做的程序:
我使用 --keypair $KEYPAIR_ACCOUNT1 部署 /solanaworkspace/contract_helloworld/target/deploy/helloworld.so
,它将使用 $KEYPAIR_PROGRAM1
KEYPAIR_PROGRAM1=/solanaworkspace/contract_helloworld/target/deploy/helloworld-keypair.json
PUBKEY_PROGRAM1=`solana-keygen pubkey $KEYPAIR_PROGRAM1`
# solana account $PUBKEY_PROGRAM1
solana program deploy --keypair $KEYPAIR_ACCOUNT1 /solanaworkspace/contract_helloworld/target/deploy/helloworld.so
这将尝试提交 5 次,直到失败 Blockhash expired
在尝试部署时,我看到了这样的日志:
Waiting for next block, 60 pending... [block height 693; re-sign in 285 ]
它还说直到 60 但随后重置为 Waiting for next block
:
Sending 36/60 transactions
我做错了什么?
我想用 docker 容器复制起来很容易。 非常感谢。
编辑:嗯,当它不在 运行 容器中时,它可以工作。 我还在想with是不是错了。
程序部署是通过验证器的 TPU(事务处理单元)完成的,它监听不同的端口,8003
。如果该端口不可访问,则发送程序部署事务将失败。
您可以先在启动中添加端口 8003
,如果仍然失败,请打开 Dockerfile 中列出的每个端口:https://github.com/solana-labs/solana/blob/005592998dd107b3d54d9203babe24da681834f5/sdk/docker-solana/Dockerfile#L3