0

我无法将新块添加到链中,因为锯齿验证器默认值正在报告: [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 次:

  1. 码头工人-撰写下来
  2. gradle clean build fatJar docker
  3. 码头工人组成 --build
  4. GET localhost:8008/blocks --> 1 块如预期
  5. POST locApplication 到链
  6. GET localhost:8008/blocks --> 显示是否添加了块...
  7. 获取 localhost:20005/api/v1/lettersofcredit/applications/?id=d26...f2d

作品?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

任何有关我如何调试此问题的建议都将不胜感激。谢谢。

4

3 回答 3

1

您是否尝试删除 docker 中的所有容器、图像和卷?这个对我有用。Docker 移除所有容器、镜像和卷

于 2019-02-21T04:40:55.810 回答
1

在理想世界中,失败的块验证等同于网络中的拜占庭行为。这里的拜占庭行为可能在您的节点或发布区块的节点中。

鉴于此,如果您认为在您的网络中没有拜占庭节点并且所有节点都是可信的。您需要检查您的部署环境或智能合约。

部署:当您设置 Hyperledger Sawtooth 网络节点时,它可能会拾取现有的块存储文件并使用意外块进行初始化。所有后来的块验证都会失败,因为您的最终全局状态与新块中的状态不匹配。请在运行新的网络设置之前清除您的环境/陈旧文件。

智能合约/交易处理器 (TP):如果您的 TP 未编写为您获得确定性结果,那么您需要深入研究您的应用程序并识别它。这意味着您的 TP 在不同的机器或不同的时间实例上产生独特的结果,因此您的一个节点正在产生一个与新块中的不匹配的全局状态哈希。确保您的 TP 是确定性的。

于 2019-10-29T07:04:46.053 回答
1

要在 Developer Mod 中使用,您应该安装并运行 DevMod 共识。
安装

sudo apt-get install sawtooth-devmode-engine-rust   

启动验证器后,在另一个终端启动共识

sudo -u sawtooth devmode-engine-rust -vv --connect tcp://localhost:5050
于 2019-02-07T12:58:52.567 回答