Состояние проблемы с корнем хеширования (т.е.) Валидатор не добавляет блок

Клиент вызывает rest-api, затем отправляет данные валидатору, процессор транзакций и валидатор разговаривают, наконец, когда валидатор обрабатывает транзакцию и создает блок. На этом этапе в моем случае отображается следующий журнал ошибок:

> sawtooth-validator-default | [2018-12-31 07:36:44.519 DEBUG   
> block_validator] Adding block
> 5cad74473aec314bae031acece18fd2b3866ace5c53652118440204e71fc493f4e2251f76298dc7721e8476ad629e0ba0ac533b9fe925bcc63f29c1a6c60795a
> for processing sawtooth-validator-default | [2018-12-31 07:36:44.532
> WARNING  block_validator] Block
> 5cad74473aec314bae031acece18fd2b3866ace5c53652118440204e71fc493f4e2251f76298dc7721e8476ad629e0ba0ac533b9fe925bcc63f29c1a6c60795a
> (block_num:3,
> state:08afc967eb593120ba5db6d1db548c4b91f26801c3d290fd655a789d51753114,
> previous_block_id:b79c22c94151e76cefcb21ed3c374aa512bff68981bb6b677610e76a8c12a6b2211c3634deb31c0d46ec26f568ed98f27f571625d76e37ee160ca0a9c071ff37)
> failed validation: Block
> 5cad74473aec314bae031acece18fd2b3866ace5c53652118440204e71fc493f4e2251f76298dc7721e8476ad629e0ba0ac533b9fe925bcc63f29c1a6c60795a
> (block_num:3,
> state:08afc967eb593120ba5db6d1db548c4b91f26801c3d290fd655a789d51753114,
> previous_block_id:b79c22c94151e76cefcb21ed3c374aa512bff68981bb6b677610e76a8c12a6b2211c3634deb31c0d46ec26f568ed98f27f571625d76e37ee160ca0a9c071ff37)
> 
> failed state root hash validation. Expected
> 08afc967eb593120ba5db6d1db548c4b91f26801c3d290fd655a789d51753114 but
> got 92673edb4422d913aadb6e49fa1e82688a27589ac98acdd7a8f713d6accd1f25
> 
> ========================================================================
> 
> sawtooth-validator-default | [2018-12-31 07:36:44.532 DEBUG   
> block_validator] Removing block from processing
> 5cad74473aec314bae031acece18fd2b3866ace5c53652118440204e71fc493f4e2251f76298dc7721e8476ad629e0ba0ac533b9fe925bcc63f29c1a6c60795a

Фактический ожидаемый результат: блок должен быть создан и добавлен в блокчейн.


person Gowrishankar R    schedule 31.12.2018    source источник
comment
Возвращают ли результат операции записи состояния от TP? Это могло быть причиной. Не могли бы вы поделиться кодом?   -  person shonjs    schedule 24.01.2019
comment
@ 1sn0s да, проблема возникла при возврате операции записи состояния от TP. код процессора транзакций, написанный на Javascript, который имеет несколько проблем с цепочкой обещаний при установке состояния. Старый TP в сущности gist.github.com/KarthickLinganathan/ теперь изменен, обещания в хороший способ   -  person Gowrishankar R    schedule 25.01.2019


Ответы (2)


Валидатор отправит вашему TP один и тот же запрос транзакции несколько раз. Если ваш TP устанавливает данные в цепочке с другим адресом и / или хешем данных, чем валидатор, завершает транзакцию. Это делается для безопасности, но это имеет значение для вашего TP.

Ваш TP не должен создавать адреса или данные в TP, которые при одном и том же вводе будут давать разные выходные данные. Адрес TP и набор данных в транзакции должны быть детерминированными.

Если вы генерируете какой-то уникальный бит информации (например, время или шифрование), вам следует сделать это в клиенте, прежде чем отправлять его на TP.

Обновлено:

Как уже указывалось, сохраняемые данные представляют собой ассоциативную структуру. Поскольку порядок в собственной ассоциации не является детерминированным, скорее всего, это основная проблема. Добавление другой структуры protobuf для захвата name/value и добавление ее к упорядоченному массиву перед сохранением данных (набора) в цепочке решит эту проблему.

Согласно документации:

Следует избегать структур данных, которые не обеспечивают упорядоченную сериализацию (например, наборы, карты, словари).

person Frank C.    schedule 31.12.2018
comment
Привет, Фрэнк! Даже после того, как адрес не был создан и не сгенерирован, мы все равно получаем ту же ошибку. - person Gowrishankar R; 01.01.2019
comment
Данные, которые вы set по адресу, создают ли TP какое-либо содержимое или они идентичны полезной нагрузке, отправленной в транзакции? - person Frank C.; 01.01.2019
comment
пусть адрес = d990b8c7eac5759277b2ac7664935e3782e34d26b56aa22f21c7fc988e9f13e238353a; Это было так, как показано ниже, но позже я перешел на приведенный выше. // пусть адрес = NAMESPACE [2] + hash (payload.id) .substring (0, 64); //console.log(адрес:, адрес) - person Gowrishankar R; 01.01.2019
comment
А как насчет самих данных, которые вы помещаете по этому адресу? - person Frank C.; 01.01.2019
comment
{Location: test, Latitude: 1, Longitude: 8} - это данные, которые мы храним по этому адресу. - person Gowrishankar R; 03.01.2019
comment
Также не удалось выполнить проверку хэша корня состояния. Ожидается ›08afc967eb593120ba5db6d1db548c4b91f26801c3d290fd655a789d51753114, но› получил 92673edb4422d913aadb6e49fa1e82688a27589ac98acdd7a8f713d6ac, состояние rooth которого не соответствует ожидаемому, состояние rooth больше, чем ожидалось. - person Gowrishankar R; 03.01.2019
comment
Это карта / словарь Python? Если да, то это может быть вашей проблемой. - person Frank C.; 04.01.2019
comment
Спасибо, @ Фрэнк К. - person Gowrishankar R; 25.01.2019
comment
@GowrishankarR - Если вы думаете, что это правильный ответ, отметьте это для других. - person Frank C.; 25.01.2019

Вышеупомянутая проблема корня состояния возникает из-за кода процессора транзакций, написанного на Javascript, который имеет несколько обещаний, сделанных проблемой цепочки обещаний при установке состояния. Успел написать обещания, правильно решил мою проблему.

apply(transactionRequest, context) {
  var payload=cbor.decode(transactionRequest.payload)
  if (!payload.action) {
    throw new InvalidTransaction("Payload doesn't contain the 
    action");
  }                
  if (!payload.data) {
    throw new InvalidTransaction("Payload doesn't contain the Data");
  }
  let action = payload.action;
  let address = NAMESPACE + hash(payload.data.productID).substring(0, 
  64);
  switch (action) {
case "updateProduct":
      return context.getState([address])
        .then((possibleAddressValues)=>{
            let stateValue = possibleAddressValues[address];
            if (stateValue && stateValue.length) {
              let value = JSON.parse(cbor.decode(stateValue));
              console.log("decoded values : ",value)
              if (payload.data.price) {
               value.price = payload["data"]["price"]
              }
              if (payload.data.itemsInInventory) {
               value.itemsInInventory = payload["data"]["itemsInInventory"]
              }
              console.log("values after updating status : ",value)                                                   
              let entries = {
                  [address]: cbor.encode(JSON.stringify(value))
              }
              return context.setState(entries);

            }else{
                throw new InvalidTransaction("there is no Product for given Product ID : ",payload.data.purchaseId); 
            }
        })
        .catch((err)=>{
            console.log(new Date()+"Error while getting and setting confirm status for Product ID : ",payload.purchaseId );
        })
    break;
    default:
    throw new InvalidTransaction("The action is Invalid or not supported by this transaction processor");
  }
  }
person Gowrishankar R    schedule 25.01.2019