CKB testnet 挖矿 300s 速成

摘要

Docker 环境中主要分为 node 容器和 miner 容器;
ckb_tools 环境基于 Ruby SDK 提供交互接口;
本文档将会把 Docker 部署中所需要的文件进行分类,存储在主机的 /data/ckb 目录下;

为什么选择 Docker ?

如果你的本地环境无法支持 rust,ruby 等编程语言的运行,或者你希望快速的运行 CKB node 或者 miner 进程进行测试,那么 Docker 将是最好的选择,在 container 和 vm 的性能对比中,container 更接近于原生的资源利用;

安装 DOCKER

Ubuntu

  • platform ubuntu 16.04(本文档运行环境基于此平台)
apt install docker-ce -y && service docker start

or

curl -fsSL https://get.docker.com/ | sh && service docker start

windows

更多软件版本安装 DOCKER 参考 : Get Docker | Docker Docs

获取 CKB 镜像

docker pull nervos/ckb:latest

初始化 CKB 配置文件

创建 CKB 节点配置文件目录

mkdir -p /data/ckb/conf
chmod 777 /data/ckb/conf

创建 CKB 配置文件

docker run --rm -it \
-v "/data/ckb/conf:/var/lib/ckb" \
--net=host \
--name=ckb_init_conf \
nervos/ckb:latest init --spec testnet --force

启动 CKB 节点

修改 node 存储路径

cd /data/ckb/conf
sed -i "s/\"data\"/\"\.\.\/data\"/g" ckb.toml

创建 CKB 节点存储目录

mkdir -p /data/ckb/data
chmod 777 /data/ckb/data

启动节点

docker run -d \
-v "/data/ckb/data:/var/lib/data" \
-v "/data/ckb/conf:/var/lib/ckb" \
--net=host \
--name=ckb_node \
nervos/ckb:latest run

查看容器运行日志信息(正常状态下会出现 testnet 的数据同步信息)

docker logs -f ckb_node

创建 CKB 钱包地址

该示例使用 Docker 部署官方的 Ruby SDK 环境进行演示,如果本地有 Ruby 环境,可直接参考 https://docs.staging.nervos.org/getting-started/interact/#use-api 进行钱包创建

创建 CKB 工具目录

mkdir -p /data/ckb/tools
cd /data/ckb/tools

下载工具运行所需要的依赖文件

git clone https://github.com/bitcoin-core/secp256k1.git
git clone https://github.com/nervosnetwork/ckb-sdk-ruby
wget https://github.com/jedisct1/libsodium/releases/download/1.0.16/libsodium-1.0.16.tar.gz

编写 Dockerfile

vim Dockerfile
FROM ruby:latest

WORKDIR /opt

ADD . /packets

RUN cp -R /packets/* . \
&& cd secp256k1 \
&& echo " +++ build secp256k1 " && ./autogen.sh \
&& ./configure && make && make install \
&& echo " +++ install bitcoin-secp256k1 " && gem i bitcoin-secp256k1 \
&& echo " +++ install rbnacl " && gem install rbnacl \
&& cd .. && tar zxf libsodium-1.0.16.tar.gz && cd libsodium-1.0.16 \
&& echo " +++ install libsodium " && ./configure && make -j3 && make install \
&& cd .. && cd ckb-sdk-ruby \
&& echo " +++ install bundler " && gem install bundler \
&& echo " +++ start bundle, need 5 - 10 min. " && bundle

WORKDIR /opt/ckb-sdk-ruby

CMD "./bin/console"

构建 Docker 镜像(编译过程需要一些时间,具体时长由本地网络质量决定)

docker build -t ckb_tools .

通过 ckb_tools 镜像创建并进入 ckb_tx_tool 容器

docker run --rm -it \
--name="ckb_tx_tool" \
ckb_tools

通过容器创建 CKB 钱包

#连接 CKB 节点(该地址填写的私网 IP 为宿主机的网卡 IP,因为节点使用的容器网络为 host 模式)
[1] pry(main)> api = CKB::API.new(host:"http://192.168.0.3:8114")
=> #<API@http://192.168.0.3:8114>

#创建私钥
[2] pry(main)> privkey = "0x" + SecureRandom.hex(32)
=> "0x4612a386e7d9064b20413c85fc5ccdabfb458d4e350621994ffc12ba8e6831a8"

#构建 CKB 钱包信息
[3] pry(main)> wallet = CKB::Wallet.from_hex(api, privkey)
=> #<CKB::Wallet:0x0000557cb65ff4a0
 @api=#<API@http://192.168.0.3:8114>,
 @key=
  #<CKB::Key:0x0000557cb663fa00
   @address=#<CKB::Address:0x0000557cb65ff540 @blake160="0x12ffed4637a6a5086ab57ae9b5c8e139f16ce803", @prefix="ckt">,
   @privkey="0x4612a386e7d9064b20413c85fc5ccdabfb458d4e350621994ffc12ba8e6831a8",
   @pubkey="0x022c309c52fe6ea37570a0e203f88a0afc956b82dc37398687ec2eef157a06a649">>

#打印钱包的配置信息
[5] pry(main)> puts wallet.block_assembler_config   
[block_assembler]
code_hash = "0x9e3b3557f11b2b3532ce352bfe8017e9fd11d154c4c7f9b7aaaa1e621b539a08"
args = ["0x12ffed4637a6a5086ab57ae9b5c8e139f16ce803"]
=> nil

#获取 CKB 钱包的地址
[6] pry(main)> wallet.address
=> "ckt1q9gry5zgju0kszjv0nml26whh6kchferqvaxyk29zcd44d"

#退出容器
[7] pry(main)> quit

修改 CKB 节点配置文件,填写创建的 CKB 钱包配置信息

cd /data/ckb/conf
echo '[block_assembler]' >> ckb.toml
echo 'code_hash = "0x9e3b3557f11b2b3532ce352bfe8017e9fd11d154c4c7f9b7aaaa1e621b539a08"' >> ckb.toml
echo 'args = ["0x12ffed4637a6a5086ab57ae9b5c8e139f16ce803"]' >> ckb.toml

重启 CKB 节点容器,应用配置文件

docker restart ckb_node 

查看运行 CKB 节点的的容器日志

docker logs ckb_node | tail -n 30

启动 CKB 挖矿进程

修改 miner 存储路径

cd /data/ckb/conf
sed -i "s/\"data\"/\"\.\.\/miner\"/g" ckb-miner.toml

修改 miner 的 node rpc 地址

sed -i "s/0.0.0.0/192.168.0.3/g" ckb-miner.toml

创建 CKB 节点存储目录

mkdir -p /data/ckb/miner
chmod 777 /data/ckb/miner

启动节点

docker run -d \
-v "/data/ckb/miner:/var/lib/miner" \
-v "/data/ckb/conf:/var/lib/ckb" \
--net=host \
--name=ckb_miner \
nervos/ckb:latest miner

查看容器运行日志信息

docker logs -f ckb_miner

更多

最大化资源利用率

每个 miner 进程会占用 1 个核心,所以如果是多核心主机可以通过启动多个 miner 容器实现资源利用率最大化

docker run -d \
-v "/data/ckb/miner:/var/lib/miner" \
-v "/data/ckb/conf:/var/lib/ckb" \
--net=host \
--name=ckb_miner(n) \
nervos/ckb:latest miner

分布式 miner

通过修改 miner 配置文件中的 rpc_url 参数,来指定 node 接口,从而可以在多台主机运行 miner 进程,监听同一个 node

不定时更新 …


感谢您的阅读,如有出入请您不吝提出;

6 Likes

2019年6月2日 10:14分,测试该文档可正常部署并出块;
https://explorer.nervos.org/address/ckt1q9gry5zg768f7a32vg79jer4wezkdez786nk3tykm2zfsk

在ckb_node里面遇到这么一个问题“ client ERROR miner rpc call get_block_template error: Http(Error(Connect, Os { code: 111, kind: ConnectionRefused, message: “Connection refused” }))”

这是需要自己修改ckb-miner.toml,把rpc ip改成宿主机的网卡ip么?

是的, 我的宿主机 IP 被写入文档中,你应该配置正确的 IP 地址

[7] pry(main)> api = CKB :: API .new(host: " http://172.18.153.125:8114 " )

RuntimeError: System script code_hash error!

from /opt/ckb-sdk-ruby/lib/ckb/api.rb:32:in `initialize

报错

RuntimeError: System script code_hash error!

可以 push 一下 ckb.toml

谢谢,使用官方的二进制cli工具搞定了

我也遇到了RuntimeError: System script code_hash error!,但是我ckb.toml里hash_code和args设置都是对的啊…