如何搭建见证人节点[过时]
注意:该篇文章虽有参考价值但已过时,请参考这篇
https://steemit.com/steem/@ety001/a-simple-tuturial-for-a-dockerize-steem-witness-deployment
(图片制作于 Pix)
最近运行了一个见证人节点,并且发布了 见证人公告,欢迎各位给我投上一票,投票链接:https://v2.steemconnect.com/sign/account-witness-vote?witness=ety001&approve=1
为了成为 见证人,我搜索了很多的资料,中文资料目前应该是没有,基本上都是英文的,并且每一篇都只是介绍了某一点,尤其是如何把自己的账号升级为见证人,这方面的资料几乎就没有。这里我将介绍下如何快速搭建成为见证人。(为了重现这个过程,我拿我的另外一个账号 liuye
来重新走一遍流程)
注意1:教程将以Ubuntu16.04作为操作环境,如果你用其他的Linux系统,需要自己解决各种依赖等问题。
注意2:目前网上建议最小内存 32GB,最小硬盘 100GB(当前时间:2018.01.30)为了写这个教程,现买了几个小时的 VPS 用来测试。小内存似乎也可以跑,文末总结有彩蛋。
把账号升级为见证人
目前最便利的方法就是使用 Conductor 了。建议把 Conductor
安装在本地,毕竟这一步需要导入你的账号信息,如果在服务器操作,可能安全度不高。另外,确保你的本地安装了 Python3
。
1.安装必要的依赖
sudo apt install libffi-dev libssl-dev python3 python3-dev python3-pip
2.安装 steem-python
pip3 install -U git+git://github.com/Netherdrake/steem-python
3.安装 conductor
pip3 install -U git+https://github.com/Netherdrake/conductor
4.使用 steem-python
创建本地钱包,并导入你的账号
$ steempy addkey
弹出下面的提示
Private Key (wif) [Enter to quit]:
在这里输入你账号的活跃权限的私钥,在你的 steemit
的网站钱包页面的权限中可以找到。
输入完,回车,会提示下面的信息
Please provide a password for the new wallet
这里输入一个你自己的密码,用于加密你本地的钱包,假如这里我们设置的是 123456
。
当再次弹出 Private Key (wif) [Enter to quit]:
时表明添加成功,直接回车退出。
5.初始化见证人
conductor init
回车后会依次让你输入下面的内容
What is your witness account name?: liuye
Witness liuye does not exist. Would you like to create it? [y/N]: y
What should be your witness URL? [https://steemdb.com/witnesses]: https://steemit.com/@liuye
How much do you want the account creation fee to be (STEEM)? [0.500 STEEM]: 0.200 STEEM
What should be the maximum block size? [65536]:
What should be the SBD interest rate? [0]:
BIP38 Wallet Password:
Witness liuye created!
其中 account creation fee
,maximum block size
,SBD interest rate
这几个参数我也不清楚具体干什么的,
我是按照多数见证人的设置来配置的,其中注意 account creation fee
的格式。另外那个 BIP38 Wallet Password
就是上一步里设置的钱包密码,即那个 123456
。
6.生成打包区块所要用的公私钥对
conductor keygen
这一步生成的公钥将用来激活你的见证人,生成的私钥将配置在服务器节点的 config.ini
文件中。
比如这里我生成的是
+-----------------------------------------------------+-------------------------------------------------------+
| Private (install on your witness node) | Public (publish with 'conductor enable' command) |
+-----------------------------------------------------+-------------------------------------------------------+
| 5JEREu41d6zdBsFHjKx3PumyHMhydUH5DCPFejRiBTyQLg3rGgt | STM6fhWKaF4okgbjeAZrQg7mc7fNUKT7BtyevHAF9Qtfe666RDaEp |
+-----------------------------------------------------+-------------------------------------------------------+
7.激活见证人
conductor enable STM6fhWKaF4okgbjeAZrQg7mc7fNUKT7BtyevHAF9Qtfe666RDaEp
回车后会要求输入钱包密码,等看到一堆信息后,如果 block_signing_key
里是你设置的公钥,
那么就激活成功了。
8.临时关闭见证人
conductor disable
按照提示输入完信息后,当看到一堆信息后,其中的 block_signing_key
变为 STM1111111111111111111111111111111114T1Anm
则表明见证人临时关闭成功。
如果目前你的节点不在运行,则需要临时关闭见证人,否则如果轮到你出块了,而你不在线,则将记录一次你丢块。(PS: 通过我这一周的观察,目前我的这些票数,完全轮不到我出块,所以关不关掉都是一个样。。。😂)
部署见证人节点
我自己搭建见证人节点的时候,是使用的官方的 Docker
镜像。
本教程则使用更傻瓜化的一个 Docker
镜像 来完成。
再次注意:服务器环境是ubuntu16.04
1.更新系统,安装依赖,获取 steem-docker 的安装脚本。
sudo apt update
sudo apt install git curl wget
git clone https://github.com/Someguy123/steem-docker.git
cd steem-docker
2.安装 Docker
,如果你的系统目前已经安装,则跳过该步
./run.sh install_docker
3.拉取 steem-docker
镜像
./run.sh install
4.同步区块数据,目前区块数据大约23GB,该步是从大佬@gtg 维护的节点下载已经打包好的区块数据(同步和解压都需要很久,尤其是解压)。
./run.sh dlblocks
如果你想跳过下载这一步,而是想直接通过
P2P
网络来同步区块数据,那么在执行第7步之前,可以修改一下run.sh
的 170 行,
我们删除掉,最后的那个--replay
参数,然后执行./run.sh replay
。
通过读取日志,看到有区块数据同步后,再次修改run.sh
的 170 行,把刚才去掉的参数再加回来,加回参数后,再执行./run.sh replay
即可。
如果提示类似下面的错误Error response from daemon: You cannot remove a running container c083355ec3960722bee080cff5c1bb13c225f5b9a3e0ae8ea63b4f73ce531992. Stop the container before attempting removal or force remove
执行下面的命令后再执行
./run.sh deplay
,其中c08
是报错中提到的那个container id
的头几位docker stop c08
5.调整内存。由于要使用 /dev/shm
来作为 shared-file-dir
,而默认 /dev/shm
是机器内存的一半,为了更好的利用内存,我们需要把这个内存调大,我的服务器是32GB的,因此我调到30GB,留下2GB给系统自己。(啥是 shm。)
sudo ./run.sh shm_size 30G
6.修改 config.ini
配置文件
vim data/witness_node_data_dir/config.ini
只需要参照下面的内容修改几项即可,
p2p-endpoint = 0.0.0.0:2001 # 做种子
shared-file-size = 30G
shared-file-dir = /shm # 如果注释掉这行,在小内存机器上也可以跑
witness = "liuye" # 这里填写你的 steem 账号,注意要加双引号!!
private-key = 5JEREu41d6zdBsFHjKx3PumyHMhydUH5DCPFejRiBTyQLg3rGgt # 这里填写 conductor 生成的私钥,不需要引号
7.启动见证人节点
./run.sh replay
运行成功后,可以通过 ./run.sh logs
命令,查看 Docker容器
的运行情况,如图
Log
信息中出现见证人信息了,就代表配置成功了。等待区块链同步到最新后,显示类似下面的内容时,就一切正常了,这时别忘了用 conductor
激活见证人。
8.发布见证人公告到 witness-category
下面,以表示你开始了见证人之旅。写一写你能为社区做啥,为啥大家要给你投票之类的。
关于喂价
见证人除了打包这个工作外,还有一个重要的工作就是给系统提供喂价。
目前有好几个版本的喂价脚本, 这里我们使用 conductor
提供的喂价功能即可。
conductor feed
第一次运行会出现类似的错误提示
BIP38 Wallet Password:
Tue Jan 30 21:18:48 2018
Old Price: 0.000
New Price: 5.165
Current STEEM price: 5.165 USD
Current SBD price: 5.767 USD
Quote: 1.000 STEEM
Spread between prices: 100.000%
Possibly invalid spread (100.00%), ignoring...
查看源代码发现,之所以 ignoring
是因为我们目前在区块上存储的喂价是0,也就是我们还没有提供过喂价,这就导致新旧价格差价过大,即 Spread between prices
过大,超过了代码中设置的 20%
,因此被忽略了。这应该是这个喂价程序的一个缺陷,没有考虑第一次喂价更新。
所以我们需要手动使用 Python
完成第一次喂价更新。在终端中打开 Python3
,然后按照下面的命令进行输入:
Python 3.6.3 (default, Oct 24 2017, 14:48:20)
[GCC 7.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from steem import Steem
>>> steem = Steem()
>>> steem.commit.witness_feed_publish(5.165, quote=1.000, account="liuye")
Passphrase:
{'ref_block_num': 33686, 'ref_block_prefix': 2156333139, 'expiration': '2018-01-30T13:37:05', 'operations': [['feed_publish', {'publisher': 'liuye', 'exchange_rate': {'base': '5.165 SBD', 'quote': '1.000 STEEM'}}]], 'extensions': [], 'signatures': ['202c413bf800c51e583a30687954fa5e77b052bd90e3e4834d5fa82a817121ebb40677fbf1351abcd70e656eb7fc97e16e236aa5092960ec87e6f0a0531ba982b6']}
其中 witness_feed_publish
的参数中,5.165
是 Current STEEM price: 5.165 USD
,quote
是 Quote: 1.000 STEEM
。
完成手动更新后,再次使用 conductor feed
执行就成功了。
如果想要使用 Docker
化的 conductor
,可以参考 这里,我自己封装了一个。
总结
前前后后连写加调试,完成这篇教程花了有那么几个小时,这应该是目前中文版教程里最全的了,没有之一。
这里有个小技巧,如果你内存不够,在配置文件中不要用 /dev/shm
作为 shared-file-dir
,节点依然可以运行,也就是说可以注释掉 shared-file-dir = /shm
。之所以把这个放在最后说,是因为我并没有完全测试这种情况。其他人貌似都是用 /dev/shm
来作为 shared-file-dir
的。
总的来说,搭建见证人节点就是会者不难,难者不会。虽然见证人节点的资源消耗不及全节点,但是也是够费资源的。我目前并不理解,为何见证人节点需要同步全量数据,难道只获取目前区块链全部数据的最近25%的数据,不能完成打包工作吗?看来这个还有待等到进一步去看源代码的时候思考。
最后,再拉一拉票,欢迎通过 SteemConnect
来给我投一票,投票地址:https://v2.steemconnect.com/sign/account-witness-vote?witness=ety001&approve=1
想问一下,增加国内的见证人节点,会提高国内用户的访问速度吗?
不会,见证人节点只是负责打包块。
得需要搭建服务节点提供API,这需要不小的开销。
刚看了下阿里云国内的报价,预计搭建个全服务节点一年开销可能要将近4w。。。我是一直想搞一个国内节点,但是实在是承受不住这个开销。。。
确实开支好大的。看来只能众筹的形式了。
教程很详细,很不错!早就希望有这么一篇教程了!
请教一个问题:目前见证人出块主要靠得票数么??
只看票数。
现在的区块总量是多大啊?
看 <steemd.com> 显示,目前总量 20,198,515
如果用云服务器运行一个见证人节点,不知有多大利润?
排名19之后的见证人,每个块0.961sp,多久打一个块看具体排名。
可以看看这个网页 steemian
目前我排名在活跃见证人倒数第4,8天出一个块。
目前中文的见证人是比较吃亏的,支持的票数比较少!
这样的出块率还不够电费的。
目前中文见证人最高的也就是@abit 了。得混迹在国外开发人群里才行。
A神是最早期的见证人了!一度都是前20,只是后来排名有所下降。
新机器少了 apt-get install git
投了,这个节点有什么用老哥
多谢,理论上讲见证人每打包一个块会有收益。参见这篇文章 https://steemit.com/cn/@oflyhigh/6dbdqm
你参选的话,我帮你拉票,虽然也没啥大力度,但我一定尽全力。
你将是离我最近的节点!
多谢大姐鼎力支持,这是我的参选公告,https://steemit.com/witness-category/@ety001/to-be-a-witness-i-need-your-vote,就是写的比较单薄😂
谢谢整理,收藏了。
收藏了!
这么好的文章刚刚看到
点赞没用了,投你见证人票吧😀
投票比点赞给力多了~~😛
每次run 的是始终config不好。 怎么debug config哪里出错了?
Error parsing logging config from config file /steem/witness_node_data_dir/config.ini, using default config
docker logs 容器名字
你用这条指令查看容器的输出。
也是这个错误
3501216ms th_a main.cpp:133 main ] Error parsing logging config from config file /steem/witness_node_data_dir/config.ini, using default config
3501216ms th_a main.cpp:172 main ] parsing options
3501216ms th_a main.cpp:174 main ] initializing node
3501216ms th_a main.cpp:176 main ] initializing plugins
3501216ms th_a application.cpp:1148 initialize_plugins ] Initializing plugin witness
3501335ms th_a main.cpp:179 main ] starting node
3501335ms th_a application.cpp:259 startup ] Backtrace on segfault is enabled
3501335ms th_a application.cpp:263 startup ] shared_file_size is 16106127360 bytes
3501336ms th_a application.hpp:105 register_api_factory ] name: login_api
3501336ms th_a application.hpp:105 register_api_factory ] name: database_api
3501336ms th_a application.hpp:105 register_api_factory ] name: network_node_api
3501336ms th_a application.hpp:105 register_api_factory ] name: network_broadcast_api
3501336ms th_a application.cpp:281 startup ] Starting Steem node in write mode.
3501336ms th_a application.cpp:304 startup ] Replaying blockchain on user request.
3501337ms th_a database.cpp:151 reindex ] Reindexing Blockchain
3501465ms th_a block_log.cpp:130 open ] Log is nonempty
3501471ms th_a block_log.cpp:161 open ] Index is empty
3501471ms th_a block_log.cpp:283 construct_index ] Reconstructing Block Log Index...
^C
你第四步执行了吗?就是这个命令
./run.sh dlblocks
。如果你执行了
./run.sh dlblocks
,那么就用./run.sh replay
启动,否则用./run.sh start
启动。我第四部已经下好了block
你可以看到90G
然后也启动好了dockercontainer
但是./run.sh logs 去 check logs里面始终是下面的这个错误
删掉 block_log.index,然后用
./run.sh replay
重启容器试试。还是一样的结果
你在reconstructing block log index这一步最长等了多久,这一步是重建索引,现在的一般可能需要大约2、3天。
可以再问一个问题现在同步好了区块了后
我通过这个帖子连接到自己的blockchain
https://steemkr.com/steem/@crokkon/using-piston-with-a-local-steem-blockchain
始终是connect refuses
有没有什么方法去debug为啥connection refuses
如果你没有配置ssl证书,就不要用wss
另外就是检查你的config.ini文件里面配置8090端口了么
8090 配了。 ssl证书怎么设置? 我想用一个client可以连接我的local的node 但是不知道怎么连接
如果你只是本地用,那么直接 ws://
我是直接用的ws
dan'sh
但是到了本地发现没有permission to api
这个就不清楚了。
能顺便问一个问题么?这个你是之后通过什么方式去访问下载好的区块的? 我发现我下载好了。 但是没有办法去访问?
我是做见证人节点,并不去访问区块链数据,如果需要访问的话,得需要把其他的插件打开。目前我只开了witness插件。