codechain基于Tendermint(以拜占庭容错BFT实现多台机器安全共识的应用)采用golang开发,操作系统选用了ubuntu16.04,为了便于开发,在ubuntu上安装vscode用于go开发的IDE。在开发环境建立之初,初步先建立Tendermint单节点(Single node),基本上能够满足开发的要求,随着项目的进展再扩展到4个节点组成一个最基本的BFT网络。
Tendermint有两种安装方式,用压缩包直接解压和最新源码编译安装,由于Tendermint在快速开发中,且项目主要要用go实现,所以建议安装go环境和用源码方式安装。安装过程比较简单,但不能按照Tendermint官方的文档安装,那个文档跟不上Tendermint开发的进度,对go的依赖和编译命令都存在问题,我已在Tendermint的github中提了issues( tendermint/tendermint#4499 ),给出了目前为止正确的安装脚本。
执行脚本注意以下问题:
- 不要用sudo执行脚本,用当前用户
- 由于网络原因,从github下载源码经常会中断,所以一般可能会多次执行,除第一次执行以外,后续的执行都要把echo那三行注释掉,不然会重复往~/.profile文件中增加环境变量。
- 另外一种方法是一句一句执行,保证每一步都成功即可
脚本如下:
#!/usr/bin/env bash
## install tools
sudo apt-get install curl
sudo apt-get install git
sudo apt install make
## download golang
curl -O https://dl.google.com/go/go1.14.linux-amd64.tar.gz
tar -xvf go1.14.linux-amd64.tar.gz
## install golang
sudo rm -fr /usr/local/go
sudo mv go /usr/local
mkdir goApps
## init environment variable
## execute next time, comment 3 lines "echo"
echo "export GOPATH=~/goApps" >> ~/.profile
echo "export PATH=\$PATH:/usr/local/go/bin" >> ~/.profile
echo "export PATH=\$PATH:\$GOPATH/bin" >> ~/.profile
## apply variable
source ~/.profile
## clone tendermint
REPO=github.com/tendermint/tendermint
go get $REPO
cd $GOPATH/src/$REPO
## build tendermint
git checkout master
make tools
make install
make build
参考https://github.com/tendermint/tendermint/blob/master/docs/introduction/quick-start.md
# 初始tendermint节点,会在~/.tendermint目录下生成配置和密钥文件
tendermint init
# 启动内部应用kvstore
tendermint node --proxy_app=kvstore
# 检查应用状态
curl -s localhost:26657/status
# 发送交易
curl -s 'localhost:26657/broadcast_tx_commit?tx="abcd"'
# 查询交易状态
curl -s 'localhost:26657/abci_query?data="abcd"'
要在ubuntu16.04上安装vscode,必须要用linux桌面系统,如果是远程操作,需要先安装vncserver。安装过程如下:
sudo apt-get install gnome-session-flashback
sudo apt install ubuntu-desktop gnome-panel gnome-settings-daemon metacity nautilus gnome-terminal -y
sudo apt-get install vnc4server
vncserver
cd ~/.vnc
vi xstartup
xstartup原来的内容删除掉,改成以下内容:
#!/bin/sh
export XKL_XMODMAP_DISABLE=1
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic &
gnome-session &
gnome-panel &
gnome-settings-daemon &
metacity &
nautilus &
gnome-terminal &
然后重启vncserver,指定分辨率,不然分辨率是800*600,且没办法修改:
# 重启vncserver
vncserver -kill :1
# 启动vncserver并指分辨率
vncserver -geometry 1440x900
以后每次开机时要调用上面这句起vnc服务
ubuntu下安装vscode,有多种方法,建议采用deb包安装,从 https://code.visualstudio.com/Download# 下载最新版的vscode,用dpkg安装:
sudo dpkg -i code_xxxx.deb
安装后,快捷方式会出现在ubuntu主菜单的“编程”下,但点不开,需要改以下文件:
sudo cp /usr/lib/x86_64-linux-gnu/libxcb.so.1 /usr/share/code/
cd /usr/share/code
sudo sed -i 's/BIG-REQUESTS/_IG-REQUESTS/' libxcb.so.1
Tendermint的hello world!参照: https://docs.tendermint.com/master/guides/go.html ,但由于文档的叙述顺序问题,极易出错,而且要考虑到golang的包依赖和包下载速度的问题,照搬文档问题很多,所以将文档中的代码进行了整理。
cd ~
git clone https://github.com/little51/codechain
在~/codechain/example/kvstore目录下,有三个文件:main.go和app.go是文档中提到的。go.mod用于go的包管理,类似于node.js的npm使用的package.json。首次用以下命令生成后,以后用go build时,会自动下载源码中用到的依赖包,比npm更智能一些。
go mod init github.com/codechain/example/kvstore
这样,就用使用到go的新特性:Go modules,而不是用传统的gopath,这样的好处有二:1、源程序不需要再放到gopath下 2、可以使用goproxy下载依赖包(如果不用goproxy,网速慢得几乎无法下载go依赖包),在go build之前,确保以下命令被执行:
export GO111MODULE=on
export GOPROXY=https://goproxy.io
cd ~/codechain/example/kvstore
go build
rm -rf /tmp/kvstore
TMHOME="/tmp/kvstore" tendermint init
rm example.sock
./kvstore
在另一个控制台中,执行
TMHOME="/tmp/kvstore" tendermint node --proxy_app=unix://example.sock
再开一个控制台,执行
curl -s 'localhost:26657/broadcast_tx_commit?tx="tendermint=rocks"'