新手教程 最新版 EOS 在 Ubuntu 18.04.1 LTS 环境上的安装测试

yaoyh · 2018年08月08日 · 最后由 yaoyh 回复于 2018年08月29日 · 7220 次阅读
本帖已被设为精华帖!

EOS主网上线后,本地的开发环境一直没有升级。最近要启动新项目了,所以借着这个计划,彻底重新安装一下环境。
环境安装和配置的文章,已经很多了,但基本都是针对前期版本的。这里我把新旧版本的不同之处,罗列一下,希望能对新人有所帮助。

环境:
Ubuntu 18.04.1 LTS

1,github库下载源码。(新旧版本无变化)

$ git clone https://github.com/EOSIO/eos --recursive

2,编译。(新旧版本无变化)

代码下载成功后,进入eos目录,执行eosio_build.sh脚本就OK了。
第一次会很花时间,耐心等待。第二次以后就快多了。(祝愿各位一次成功。😜

$ cd eos
$ ./eosio_build.sh

编译成功后的样子。

(注意上面,我只用了6秒!😝
另外,注意上面有两句,明确指明了道路,一定要顺着走,会少很多麻烦。

To verify your installation run the following commands:

export PATH=${HOME}/opt/mongodb/bin:$PATH

/root/opt/mongodb/bin/mongod -f /root/opt/mongodb/mongod.conf &

cd /home/yaoyh/app/eos/build; make test

3,老老实实执行下面命令。

$ export PATH=${HOME}/opt/mongodb/bin:$PATH
$ /root/opt/mongodb/bin/mongod -f /root/opt/mongodb/mongod.conf &
$ cd /home/yaoyh/app/eos/build; make test

解释一下,make test 就是要测试一下,跑一下测试用例。

新版本有41项,老的是35项(记不太清了)。

全部测试完也要一段时间,需要耐心等待。有测试失败的话,可以中途中断,用下面命令单独测试和参看原因。

4,测试失败的对策。(希望大家用不上。)

假设我的芒果有问题,我单独测试一下,看看log。(我的芒果却是测试失败了)

$ cd /yourpath/eos/build/programs/nodeos
$ ./nodeos_run_test.py --mongod -v --dump-error-detail >& mongod_test.out

简单说明一下,首先进入到nodeos目录。

不熟悉EOS结构的,先记住下面这张图。

一会,我们会逐渐用到其他目录下工具。

进入目录后,在/nodeos_run_test.py命令后,指定mongod ,并且用管道把log写入 mongod_test.out。

这样我们看这个log文件,就知道那里有问题了。

有一些问题,重新启动一下ubuntu可能就莫名其妙的解决了。实在没有办法的时候,可以试试。

5,安装

如果41项测试都OK了,恭喜你,可以安装了。

$ cd build
$ make install

安装一般不会出问题。而且很快。

不用make安装,用/eos下的eosio_install.sh安装,也可以,而且画面更有成就感。

$ cd /yourPath/eos
$ eosio_install.sh

到此为止,安装结束了。下面使用我们的EOS。

6,启动节点

$  nodeos -e -p eosio --plugin eosio::chain_api_plugin --plugin eosio::history_api_plugin

别忘了去nodeos 的目录。

上面命令执行后,会每秒产生2个区块。

7,查看节点信息。

$  cd /youpath/eos/build/programs/cleos
$  cleos get info

这次要去cleos目录执行命令。

因为区块在不断的产生,所以连续执行这个命令,会发现,"head_block_num"和 "last_irreversible_block_num": 不断在递增。

共收到 13 条回复
strahe 将本帖设为了精华贴 08月08日 23:29

赞, 我记得默认的代币名字是SYS

./eosio_build.sh -s EOS 可以在编译时改成EOS.

strahe 回复

多谢补充。

我也是同样的环境,以上步骤均正常,但编译合约出错fatal error: 'eosiolib/eosio.hpp' file not found
。你的eosiocpp 能编译hello智能合约吗?

我也遇到了这样的问题,网上很多人问,但好像没有解决的方法。我用EOS根目录下面的sh批处理,重新安装EOS,也没有解决。最后,用暴力的方式解决的。就是改写,eosiocpp.sh

我把我改写后的贴到下面,你对照着该一下,应该可以解决。(原来的目录取得处理逻辑太差了。)

#!/bin/bash

#EOSIO_BIN_INSTALL_DIR=`dirname $0`
#if [ "${EOSIO_BIN_INSTALL_DIR}" == "." ]; then
#  EOSIO_BIN_INSTALL_DIR=`pwd`
#fi
#EOSIO_INSTALL_DIR=`dirname ${EOSIO_BIN_INSTALL_DIR}`
EOSIO_INSTALL_DIR="/home/yaoyh/app/eos"

echo $EOSIO_INSTALL_DIR

ABIGEN=${EOSIO_INSTALL_DIR}/bin/eosio-abigen
BOOST_INCLUDE_DIR=/home/yaoyh/opt/boost/include
function copy_skeleton {
    set -e
#    cp -r "${EOSIO_INSTALL_DIR}/share/eosio/skeleton/." $newname
    cp -r "${EOSIO_INSTALL_DIR}/contracts/skeleton/." $newname

    for file in $(find ./$newname -name 'skeleton.*')
    do
        newfile=`echo $file | sed 's/skeleton\./'"$newname"'./'`
#        echo mv "${file}" "${newfile}"
        mv "${file}" "${newfile}"
        exp=s/skeleton/${newname}/g
#        echo sed -i ${exp}  ${newfile}
        sed ${exp}  ${newfile} > ${newfile}1
        mv ${newfile}1 ${newfile}
    done
    echo "created $newname from skeleton"
    set +e
}

function build_contract {
    set -e
    workdir=`mktemp -d`

    if [[ ${VERBOSE} == "1" ]]; then
       PRINT_CMDS="set -x"
    fi

    ($PRINT_CMDS; mkdir $workdir/built)

    for file in $@; do
        name=`basename $file`
        filePath=`dirname $file`

        ($PRINT_CMDS; /home/yaoyh/opt/wasm/bin/clang -emit-llvm -O3 --std=c++14 --target=wasm32 -nostdinc \
                                   -DBOOST_DISABLE_ASSERTS -DBOOST_EXCEPTION_DISABLE \
                                   -nostdlib -nostdlibinc -ffreestanding -nostdlib -fno-threadsafe-statics -fno-rtti \
                                   -fno-exceptions -I ${EOSIO_INSTALL_DIR}/include \
                                   -I${EOSIO_INSTALL_DIR}/contracts/libc++/upstream/include \
                                   -I${EOSIO_INSTALL_DIR}/contracts/musl/upstream/include \
                                   -I${BOOST_INCLUDE_DIR} \
                                   -I $filePath \
                                   -I${EOSIO_INSTALL_DIR}/contracts \
                                   -I${EOSIO_INSTALL_DIR}/externals/magic_get/include \
                                   ${EOSIOCPP_CFLAGS} \
                                   -c $file -o $workdir/built/$name
        )

    done

    ($PRINT_CMDS; /home/yaoyh/opt/wasm/bin/llvm-link -only-needed -o $workdir/linked.bc $workdir/built/* \
                                   ${EOSIO_INSTALL_DIR}/build/contracts/eosiolib/eosiolib.bc \
                                   ${EOSIO_INSTALL_DIR}/build/contracts/libc++/libc++.bc \
                                   ${EOSIO_INSTALL_DIR}/build/contracts/musl/libc.bc


    )
    ($PRINT_CMDS; /home/yaoyh/opt/wasm/bin/llc -thread-model=single --asm-verbose=false -o $workdir/assembly.s $workdir/linked.bc)
    ($PRINT_CMDS; ${EOSIO_INSTALL_DIR}/build/externals/binaryen/bin/eosio-s2wasm -o $outname -s 16384 $workdir/assembly.s)
    ($PRINT_CMDS; ${EOSIO_INSTALL_DIR}/build/libraries/wasm-jit/Source/Programs/eosio-wast2wasm $outname ${outname%.*}.wasm -n)

    ($PRINT_CMDS; rm -rf $workdir)
    set +e
}

function generate_abi {

    if [[ ! -e "$1" ]]; then
        echo "You must specify a file"
        exit 1
    fi

    context_folder=$(cd "$(dirname "$1")" ; pwd -P)

    ${ABIGEN} -extra-arg=-c -extra-arg=--std=c++14 -extra-arg=--target=wasm32 \
        -extra-arg=-nostdinc -extra-arg=-nostdinc++ -extra-arg=-DABIGEN \
        -extra-arg=-I${EOSIO_INSTALL_DIR}/include/libc++/upstream/include \
        -extra-arg=-I${EOSIO_INSTALL_DIR}/include/musl/upstream/include \
        -extra-arg=-I${BOOST_INCLUDE_DIR} \
        -extra-arg=${EOSIOCPP_CFLAGS}  \
        -extra-arg=-I${EOSIO_INSTALL_DIR}/include -extra-arg=-I$context_folder \
        -extra-arg=-fparse-all-comments -destination-file=${outname} -verbose=0 \
        -context=$context_folder $1 --

    if [ "$?" -ne 0 ]; then
        exit 1
    fi    

    echo "Generated ${outname} ..."
}

function print_help {
    echo "Usage: $0 -o output.wast contract.cpp [other.cpp ...]"
    echo "       OR"
    echo "       $0 -n mycontract"
    echo "       OR"
    echo "       $0 -g contract.abi types.hpp"
    echo
    echo "Options:"
    echo "   -n | --newcontract [name]"
    echo "      Create a new contract in the [name] folder, based on the example contract"
    echo "   OR"
    echo "   -o | --outname [output.wast] [input.cpp ...]"
    echo "      Generate the wast output file based on input cpp files"
    echo "      The wasm output will also be created as output.wasm"
    echo "   OR"
    echo "   -g | --genabi contract.abi types.hpp"
    echo "      Generate the ABI specification file [EXPERIMENTAL]"
}

command=""

while [[ $# -gt 1 ]]
do
key="$1"

case $key in
    -h|--help)
        print_help
        break;
        ;;
    -n|--newcontract)
        newname="$2"
        command="newcontract"
        shift 2
        break
        ;;
    -o|--outname)
        outname="$2"
        command="outname"
        shift 2
        break
        ;;
    -g|--genabi)
        outname="$2"
        command="genabi"
        shift 2
        ;;
    *)
        echo "Unrecognized option: $1"
        exit 1
        ;;
esac
done

if [[ "outname" == "$command" ]]; then
    build_contract $@
elif [[ "newcontract" == "$command" ]]; then
    copy_skeleton
elif [[ "genabi" == "$command" ]]; then
    generate_abi $@
else
    print_help
    exit 1
fi

写了一个稍微有说明的,希望能帮到你。
https://eosfans.strahe.com/topics/1092

@yaoyh的方法亲测可用:😀

另外function generate_abi也要修改下ABIGEN所在目录和编译时的 -I选项:
1.
EOSIO_ABIGEN_DR="/usr/local/eosio"
ABIGEN=${EOSIO_ABIGEN_DR}/bin/eosio-abigen

2.
${ABIGEN} -extra-arg=-c -extra-arg=--std=c++14 -extra-arg=--target=wasm32 \
-extra-arg=-nostdinc -extra-arg=-nostdinc++ -extra-arg=-DABIGEN \
-extra-arg=-I${EOSIO_INSTALL_DIR}/contracts/libc++/upstream/include \
-extra-arg=-I${EOSIO_INSTALL_DIR}/contracts/musl/upstream/include \
-extra-arg=-I${BOOST_INCLUDE_DIR} \
-extra-arg=${EOSIOCPP_CFLAGS} \
--extra-arg=-I${EOSIO_INSTALL_DIR}/externals/magic_get/include \
-extra-arg=-I${EOSIO_INSTALL_DIR}/contracts -extra-arg=-I$context_folder \
-extra-arg=-fparse-all-comments -destination-file=${outname} -verbose=0 \
-context=$context_folder $1 --

yaoyh 回复

赞, 另外如果主站eosfans.io 无法打开的话, 建议用这个: https://eosfans.tc.ink/, 和 https://eosfans.strahe.com/ 类似, 但是 https://eosfans.strahe.com 可能会在不久后下线.

@yaoyh 大神,这种启动方式是主网还是 测试网啊,能留了qq吗

$ nodeos -e -p eosio --plugin eosio::chain_api_plugin --plugin eosio::history_api_plugin
出现command nodeos not found怎么解决啊

你好,你这里的测试网络只是自己在生产block,没有同步测试网络上的block,请问如何同步测试网络的block,期待您的回复,谢谢!

vae520283995 回复

抱歉回复晚了,最近不务正业,去研究交易所了。

不见得能帮上忙啊,但是欢迎交流技术问题。
微信: Singularity-tech
QQ:3508555457

1309091316 回复

抱歉哦,回复晚了,最近不务正业,去研究交易所了。

很想帮助你,但能给点儿,更详细的错误信息吗?

如果已经解决了,那太好了。

Yi_think 回复

抱歉哦,回复晚了,最近不务正业,去研究交易所了。

我产生的确实是本地的block,并且是单个node节点,多节点的测试网络(2节点),我正在搭建,网上也有手顺。稍等我整理出来一份,分享给大家。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册