Nervos 开发入门集合 2


#1
  1. 问题:在docker中安装节点没有起来,docker使用版本是:Docker version 1.6.2, build 7c8fca2,是什么原因没有起来?
    ./env.sh ./bin/cita setup node/1
    Start docker container cita_run_mnt_cita_target_install …
    Unable to find image ‘cita/cita-run:ubuntu-18.04-20180523’ locally
    Repository cita/cita-run already being pulled by another client. Waiting.
    bd41c04f2e700384f45894ce077842215484896267cd8629ebaec164dfa6c58f
    上面的参数表示正常吗?
    回答:这输出信息…不对的,你可以看看镜像有没有拉下来。
    问题:是bin目录下的文件么?例如:

输入“ docker image ls ”命令时,显示如下:

4台vps都是这样,都没有建立起节点。例如,输入命令时,出现了没有image这个命令,

image
docker image ls
docker: ‘image’ is not a docker command. See ‘docker --help’.
docker ps –a

但是启动节点提示已经在运行了
./daemon.sh ./bin/cita start node/0
docker container cita_run_mnt_cita_target_install is already running
有ps查询进程可以看到cita在运行
ps -ef | grep cita
root 19057 2824 0 08:52 ? 00:00:00 /bin/bash ./bin/cita start node/0
root 19087 16642 0 08:52 ? 00:00:00 cita-forever
root 19254 16341 0 08:52 pts/1 00:00:00 grep --color=auto cita
但是netstat -nl查询发现端口没有监听,会是log的问题吗?

请看代码显示:
/opt/cita-run/node/0/logs# ls -la
total 188
drwxr-xr-x 2 root user 4096 Jun 5 07:44 .
drwxr-xr-x 3 root user 4096 Jun 5 08:52 …
-rw-r–r-- 1 root user 28496 Jun 5 08:52 cita-auth.log
-rw-r–r-- 1 root user 28552 Jun 5 08:52 cita-bft.log
-rw-r–r-- 1 root user 28520 Jun 5 08:52 cita-chain.log
-rw-r–r-- 1 root user 28592 Jun 5 08:52 cita-executor.log
-rw-r–r-- 1 root user 37320 Jun 5 08:52 cita-jsonrpc.log
-rw-r–r-- 1 root user 28568 Jun 5 08:52 cita-network.log
应该看哪个log呢?
回答:cita没起来,镜像做的有点问题。
问题:是root跑的,需要创建一个另外的账户来启动么
回答:代码是最新的吗,脚本改过一次,vps恢复过系统,代码是上午刚从git clone下来的,暂时先创建个账户吧,这个问题我们会尽快修改。
问题:创建新账户可以用刚才root创建的么?还是需要重新创建一次?
回答:不是root用户运行就行

2.问:配置节点的时候报错,能看下是什么问题?
答:这个命令需要在 target/install目录下运行

3.问:上面的cita是nervos的链的部分吧,有没有nervos的ckb部分的可测试开发模块?
答:cita是应用链的底层,ckb还没有。

4.问:CITA Plus的共识是可以插拔的吧?
答:CITA plus的共识是可插拔的

5.问:1 ibgmssl.so 应该是gmssl密码库,请问编译的是哪个版本?libgmssl.so 文件,应该是Gmssl 编译后libssl.so文件改名字然后复制过来的吧?
答:例如,Francis OpenSSL 1.0.2d,strings libgmssl.so.1.0.0 | grep “1.0.”

  1. 问:那就直接那openssl 1.0.2d版本的lib就可以了吧?
    答:理论上是这样。

  2. 问:要改名为libgmssl.so.1.0.0 吗?
    答:COPY entrypoint.sh /usr/bin/

  3. 问:这个文件麻烦问一下是什么?有没有
    答:可到Nervos的 Docker 仓库的地址查看,
    https://github.com/cryptape/cita-build/tree/ubuntu-18.04-20180523
    https://github.com/cryptape/cita-run/tree/ubuntu-18.04-20180523
    在那边就可以找到,cita-build 用来跑 CI 的,cita-run 用来跑生产环境。

  4. 问:那build也能跑生产环境吗?
    答:我们下月初会有一个0.17的版本,会在现在版本基础上接口有一些修改,如果您要跑生产的话,建议用新版本。

11.问:libgmssl.so.1.0.0 文件,是哪个文件改名过来的?还是单独编译的?
答:找 ubuntu-18.04 分支,下面有 entrypoint.sh 文件这里的 so 只适用于 对应系统。

  1. 问题:如果开发测试的时候,起一个节点也能够正常出块吗?
    取决于共识列表的数量,默认创建的节点都是共识节点,创建 4个节点起,区块达到共识需要超过2/3数量,一个节点或两个节点是无实现的。

  2. 问:如果要基于 CITA的底层做一些应用,而不是只做智能合约的开发。这块有什么参考的例子吗?
    答:我们的使用场景是,我们在做一个基于Plasma的交易所,目前MVP是单节点的。接下来希望能够基于 cita 或者 tindermint 提供的网络、共识这些底层模块来扩展。

问:另外,可以支持多种语言吗?还是只支持 rust?
答:合约语言目前有支持其他的。。。然后你说的做扩展的话,我理解是替换掉某些模块,这个只要协议解析一致就可以替换

  1. 问:我们把cita服务拆分后部署到多太机子后,服务都起来了,但是怎么不出块,而且通过rpc执行一个交易返回也是null。我们拉的是最新源码编译的。哪位大神知道什么原因吗?
    回答:没有找到什么错误日志,服务拆分以后,是不是只有部署cita-chain的节点才会出块?还有单独起服务时,我们没找到怎么以debug的模式启动服务。
    答:对外端口是通的,我们执行peerCount这样的接口是可以的。
    还有cita在ubuntu16.04你们有测试过吗?因为我们在阿里云上租了云服务器,他们目前只支持ubuntu16.04,还没有ubuntu18.04。
    16.04 可以跑,需要装一堆东西,而且有推荐用的 docker 。

  2. 问:cita文档打不开了?
    答:如果打不开,去 github 上看最新的

  3. 问:docker节点部署完成之后启动出错,这是什么问题?
    错误显示:
    2018-06-28T16:27:39.946477445+08:00 - INFO - CITA:executor
    2018-06-28T16:27:39.946686688+08:00 - INFO - Version: v0.16
    2018-06-28T16:27:39.957364155+08:00 - ERROR -
    ============================
    stack backtrace:
    0: 0x7fc7bbfb6684 - backtrace::backtrace::libunwind::trace
    at /root/.cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.6/src/backtrace/libunwind.rs:53
    - backtrace::backtrace::trace
    at /root/.cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.6/src/backtrace/mod.rs:42
    1: 0x7fc7bbfb05ac - backtrace::capture::{{impl}}::new_unresolved
    at /root/.cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.6/src/capture.rs:88
    2: 0x7fc7bbfb04fe - backtrace::capture::{{impl}}::new
    at /root/.cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.6/src/capture.rs:63
    3: 0x7fc7bbfac206 - panic_hook::panic_hook
    at /root/.cargo/git/checkouts/cita-common-1aad419f3e80ba17/3eaa27a/panic_hook/src/lib.rs:51
    4: 0x7fc7bbfad888 - core::ops::function::Fn::call<fn(&std::panicking::PanicInfo),(&std::panicking::PanicInfo)>
    at /checkout/src/libcore/ops/function.rs:73
    5: 0x7fc7bc4f6f35 - std::panicking::rust_panic_with_hook
    at /checkout/src/libstd/panicking.rs:578
    6: 0x7fc7bc4f6d4e - std::panicking::begin_panicalloc::string::String
    at /checkout/src/libstd/panicking.rs:538
    7: 0x7fc7bc4f6cba - std::panicking::begin_panic_fmt
    at /checkout/src/libstd/panicking.rs:522
    8: 0x7fc7bbdbbdd8 - pubsub_rabbitmq::start_rabbitmq
    at /root/.cargo/git/checkouts/cita-common-1aad419f3e80ba17/3eaa27a/pubsub_rabbitmq/src/lib.rs:53
    9: 0x7fc7bb028448 - pubsub::start_pubsublibproto::router::RoutingKey
    at /root/.cargo/git/checkouts/cita-common-1aad419f3e80ba17/3eaa27a/pubsub/src/lib.rs:46
    10: 0x7fc7bafde952 - cita_executor::main
    at cita-executor/src/main.rs:124
    11: 0x7fc7bc50f87e - panic_unwind::__rust_maybe_catch_panic
    at /checkout/src/libpanic_unwind/lib.rs:101
    12: 0x7fc7bc4f2073 - std::panic::catch_unwind<closure,()>
    at /checkout/src/libstd/panicking.rs:459
    - std::rt::lang_start
    at /checkout/src/libstd/rt.rs:58
    13: 0x7fc7bafdf5dd - main
    14: 0x7fc7b8fc482f - __libc_start_main
    15: 0x7fc7bafae3e8 - _start
    16: 0x0 - <unknown

position:
Thread main panicked at failed to open url amqp://guest:guest@localhost/node/0 : IoError(ConnectionRefused), /root/.cargo/git/checkouts/cita-common-1aad419f3e80ba17/3eaa27a/pubsub_rabbitmq/src/lib.rs:53

答:This is a bug.

  1. 问:https://github.com/cryptape/cita/issues/new rabbitmq 检查下有没有起来,这个报错就是连不上 rabbitmq?
    答:setup 做了么,里面没有 /node/0 这个 vhost

ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Jun28 ? 00:00:01 /bin/bash -c while true;do sleep 100;done
root 228 0 0 Jun28 ? 00:00:42 /bin/bash ./bin/cita start node/0
root 253 0 0 Jun28 ? 00:00:09 cita-forever
root 777 0 0 Jun28 pts/0 00:00:00 /bin/bash -c stty cols 318 rows 82 && bash
root 784 777 0 Jun28 pts/0 00:00:00 bash
root 19691 1 0 17:08 ? 00:00:00 sleep 100
root 19703 228 0 17:08 ? 00:00:00 sleep 3
root 19704 784 0 17:08 pts/0 00:00:00 ps -ef

docker里面用ps看没有rabbitmp进程

问:setup做了,有node/0,里面是配置不是vhost吧。
我是在一台服务器上用create_cita_config.py create脚本创建4个节点配置,然后0节点在本地运行,1,2,3拷贝到其它vps运行,但是现在4台vps都起不来,docker 没做网络隔离,外部 rabbitmq 与 docker 内部的是冲突的。./env.sh ./bin/cita setup xxx 就是启动 docker 内部的 rabbit
我的vps是新恢复的系统,没有安装rabbitmq,不应该有冲突。
答:那重新 setup 看看 rabbitmq 状态

citest@ip-10-10-2-51:~/cita$ ./env.sh ./scripts/create_cita_config.py create --nodes “211.152.2.50:4000,211.152.2.51:4000,211.152.2.57:4000,211.152.2.69:4000”
docker container cita_build_home_citest_cita is already running
sh: 1: create_key_addr: not found
sh: 1: create_key_addr: not found
Traceback (most recent call last):
File “./scripts/create_cita_config.py”, line 450, in
main()
File “./scripts/create_cita_config.py”, line 438, in main
args = parse_arguments()
File “./scripts/create_cita_config.py”, line 405, in parse_arguments
authorities, signers = generate_authorities(len(args.nodes))
File “./scripts/create_cita_config.py”, line 67, in generate_authorities
with open(address_path, ‘rt’) as stream:
IOError: [Errno 2] No such file or directory: ‘/tmp/tmpLHRUzk’

重新setup说docker container已经运行,不能setup
它说环境已经启动,这是正常提示
回答:setup 和 create 不是一个命令。。你这个是 create 而且是报错的
citest@ip-10-10-2-51:~/cita/target/install$ ./env.sh ./bin/cita setup node/0
docker container cita_run_home_citest_cita_target_install is already running

setup只是提示container已经运行,然后就退出了,没有更多信息
我怀疑你的初始化并没有完全做成功,有报错,无法生成公私钥对,setup 的信息是正常的,其他信息都丢到 /dev/null 里面去了
应该没啥问题,0.16 后面的版本有做调整,按照操作手册 setup 节点,再 start 应该就好了
我这就是一直不能正常运行,现在能怎么处理呢
setup 看 rabbitmq 是否正常运行,然后 start
setup之后进入docker用ps看进程还是和刚才一样,没有rabbitmq进程
你单机先起来再考虑多机的问题,检查 docker image 版本,检查 binary 等东西
/env.sh tests/integrate_test/cita_start.sh 这个脚本能运行么?
能跑起来的话,你就看看少操作了什么吧,所有起链操作都在里面了

  1. 问:CITA获取区块信息接口返回的number和proposer具体是什么?
    答:proposer 出块节点 地址
    number 块高度
    proof里的height不是块高吗?
    proof 里面的 height 是上一个块的高度

  2. 问:在CITA中根据交易hash查询交易信息,发现接口返回的数据比较少,比如发出地址,接收地址、交易数量等等信息都没有,请问是否有其他方式获得?
    答:content 解出来就有了
    通过 Protobuf 解析 transaction.content 可以获得 交易中的 to, value, data, signature 字段, 结合 data 和 signature 通过签名库可以恢复出 msg.sender 的public key, 然后算出 msg.sender
    通过 Protobuf 解析 transaction.content 可以获得 交易中的 to, value, data, signature 字段,依然得不到该笔交易的发出地址(from)?
    比较麻烦,data 是加密前的交易信息,signature 是根据私钥生成的一个字段,要根据这两个去恢复 public key 以及 address

  3. 问:我内网下有两台机器,都装了CITA,ip分别是192.168.0.11,192.168.0.12。我在11这台机器上创建了链test_chain,并生成节点192.168.0.12:4000。这里不太理解的就是ip为12的这台机器如何知道test_chain链,如何才能同步这条链上的数据?
    答:在 test_chain 下新增一个节点,然后移到 12 上,配好 ip 信息,ip 信息在 network.toml 里面,新增节点会自动加入,如果要手动调整也可以。
    问:比如我在 test_chain 新增一个节点,目录名为1,是将1目录直接复制到12这台机器下就可以?
    答:和bin 文件 1 只是配置。
    问:这是唯一的方式吗? 如果要弄很多节点,都需要一个个这么做吗?
    答:目前来说这是唯一的方式,在考虑做注册中心之类的东西。。但是现阶段,只能这样操作

  4. 问:在CITA版本的web3j里,我发起一笔交易,该交易是部署智能合约的交易,交易返回我txHash,我通过txHash去查询getTransactionReceipt()接口返回错误说交易成本超过发件人余额。难道CITA交易也要花费类似以太坊的矿工费吗?
    答:cita 有两种模式,收费和不收费,你发交易的链应该是收费模式的。

  5. 问:CIAT的web3j中部署智能合约交易回执中的errorMessage的内容是“Reverted.”表达的是什么意思?什么还原了?
    答:可能性太多了,没权限、发送错误的交易等一些乱七八糟的原因。综合原因就是,evm 执行不下去了。

  6. 问:使用metamask连接不上测试网络
    答:metamask只能连接以太坊,不能连接AppChain,可以用neuron连接。

  7. 问:我部署的microscope,不能正常使用,appchain上api\trasactions 404,怎么解决?
    答:api/xxx 的接口需要缓存服务器的支持, 我们还没把这个项目正式发布, 需要使用可以 clone 这个 repo(https://github.com/Keith-CY/agera_one) 本地部署
    或者可以使用我们的缓存服务器, 你在使用那条链

  8. 问:我在你们测试链发起一笔创建合约交易,返回交易hash,通过交易hash返回errormessage没有错误并拿到合约地址。然后通过getCode()接口将合约地址做参数获取合约代码,总是返回“0x”,没有任何内容,测过了没有问题,哪里错了呢?
    答:你合约似乎没部署上去,只花了 100 gas 的基本费用 理论上这么大的bincode,消耗不止这一点的,而且, bincode,似乎少了一段。。正常最开始是有一段部署的代码的。

问:bincode少了一段?
答:感觉上,因为你的bincode 从开始就是00000 ,但是一般情况下,最前面那段是有东西的 因为合约是有构造的,前面放的是构造参数 拼在了bincode的前面,事实上,我尝试部署了就是一个ERC20合约,构造参数拼在bin后面是支持evm合约。

  1. 问题:我用的编译好的发布包,先配置节点再启动节点。 然后我 rpc peerCount 返回 Connection refused
    关掉外面的rabbitmq 重新 setup && start
    又出现了 Connection refused,这次我是编译了rust合约,日志里什么都没有报错,确认端口是不是被占用了。

27.问:再次搭建链是,又Connection refused 了,每次重启都要重新setup吗?
** 答:你可以看下cita文档里,快速入门里快速搭链这部分。重启直接用cita start 就好了,但是直接start不行,不能用docker skill 直接关闭链,setup 在做 rabbitmq 的初始化,你 kill 掉 docker 之后,是需要重新初始化。**

28.问:用rust写合约的时候 能请求 jsonrpc 吗?
答:rust 写合约要重新编译 Executor ,有些 jsonrpc 的请求会用到 Executor