我无法向链中添加新块,因为sawtooth-validator-default正在报告:
[2019-01-25 18:18:54.029 WARNING block_validator] Block 7f3...370e (block_num:1, state:c3a...954, previous_block_id:0d8...09d) failed validation: Block 7f3...370e (block_num:1, state:c3a...954, previous_block_id:0d8...09d) rejected due to invalid predecessor 0d8...09d (block_num:0, state:66e...ee1, previous_block_id:0000000000000000)
我猜这是一个时间问题,因为它刚刚开始发生并且在同事的环境中仍然可以正常工作。
今天早上,我尝试执行以下操作顺序7次:
有效吗? Y | N | N | Y | Y | Y | N
我没有看到settings_tp的任何输出,只有默认验证器的输出。每次新的阻止提交返回202 ACCEPTED。
我正在开发人员模式下运行,使用docker-compose在单个Ubuntu 18.0.4 VM上运行所有容器。这是docker-compose.yaml:
version: "2.1"
services:
settings-tp:
image: hyperledger/sawtooth-settings-tp:1.1
container_name: sawtooth-settings-tp-default
depends_on:
- validator
entrypoint: settings-tp -vv -C tcp://validator:4004
intkey-tp-python:
image: hyperledger/sawtooth-intkey-tp-python:1.1
container_name: sawtooth-intkey-tp-python-default
depends_on:
- validator
entrypoint: intkey-tp-python -vv -C tcp://validator:4004
xo-tp-python:
image: hyperledger/sawtooth-xo-tp-python:1.1
container_name: sawtooth-xo-tp-python-default
depends_on:
- validator
entrypoint: xo-tp-python -vv -C tcp://validator:4004
validator:
image: hyperledger/sawtooth-validator:1.1
container_name: sawtooth-validator-default
expose:
- 4004
ports:
- "4004:4004"
# start the validator with an empty genesis batch
entrypoint: "bash -c \"\
sawadm keygen && \
sawtooth keygen my_key && \
sawset genesis -k /root/.sawtooth/keys/my_key.priv && \
sawadm genesis config-genesis.batch && \
sawtooth-validator -vv \
--endpoint tcp://validator:8800 \
--bind component:tcp://eth0:4004 \
--bind network:tcp://eth0:8800 \
--bind consensus:tcp://eth0:5050 \
\""
devmode-engine:
image: hyperledger/sawtooth-devmode-engine-rust:1.1
container_name: sawtooth-devmode-engine-rust-default
depends_on:
- validator
entrypoint: devmode-engine-rust -C tcp://validator:5050
rest-api:
image: hyperledger/sawtooth-rest-api:1.1
container_name: sawtooth-rest-api-default
expose:
- 8008
ports:
- "8008:8008"
depends_on:
- validator
entrypoint: sawtooth-rest-api -C tcp://validator:4004 --bind rest-api:8008
shell:
image: hyperledger/sawtooth-all:1.1
container_name: sawtooth-shell-default
depends_on:
- rest-api
entrypoint: "bash -c \"\
sawtooth keygen && \
tail -f /dev/null \
\""
importer-webserver:
image: sawtooth-trade-finance/importer-web:latest
container_name: importer-webserver
depends_on:
- rest-api
ports:
- "20005:8080"
importer-processor:
container_name: importer-processor
image: sawtooth-trade-finance/importer-processor:latest
build:
context: .
dockerfile: ./tf_processor/Dockerfile
depends_on:
- validator
任何有关如何调试此问题的建议将不胜感激。谢谢。
答案 0 :(得分:1)
要在Developer Mod中使用,应安装并运行DevMod共识。
安装
sudo apt-get install sawtooth-devmode-engine-rust
启动验证程序后,在另一个终端上启动共识
sudo -u sawtooth devmode-engine-rust -vv --connect tcp://localhost:5050
答案 1 :(得分:1)
在理想情况下,失败的块验证等效于网络中的拜占庭行为。拜占庭的行为可能在您的节点或发布该块的节点中。
鉴于此,如果您认为网络中没有拜占庭节点,则所有节点都是受信任的。您需要检查您的部署环境或智能合约。
部署:设置Hyperledger Sawtooth网络节点时,它可能会拾取现有的块存储文件并使用意外块进行初始化。以后所有的块验证都将失败,因为您的最终全局状态将与新块中的状态不匹配。在运行新的网络设置之前,请清除环境/旧文件。
智能合约/交易处理器(TP)::如果未编写TP以获得确定性的结果,则需要深入研究并确定应用程序。这意味着您的TP在不同的机器或不同的时间实例上产生唯一的结果,因此,您的节点之一正在产生与新块中的状态不匹配的全局状态哈希。确保您的目标价格是确定的。
答案 2 :(得分:0)
您是否尝试删除Docker中的所有容器,图像和卷? 这个对我有用。 Docker remove all containers, images, and volumes