hyperledger sawtooth передают ошибку транзакции «Попытка получить неавторизованный адрес» с недействительным статусом - PullRequest
1 голос
/ 23 марта 2020

здесь задавался тот же вопрос -> Ошибка транзакции Sawtooth: «Попытка установить неавторизованный адрес» , и я попробовал этот ответ. Но этот ответ не сработал для меня.

Я использую пилообразную гиперпереключатель docker compose для запуска своих служб. Я делаю то же самое в этой документации, которая предоставляется Hyperledger-sawtooth -> https://sawtooth.hyperledger.org/docs/core/releases/1.0/_autogen/sdk_submit_tutorial_js.html#create -the-транзакция-заголовок

Моя полезная нагрузка

const payload = {
    Verb: 'set',
    Name: 'test',
    Value: 32
}

Мой заголовок транзакции

const transactionHeaderBytes = protobuf.TransactionHeader.encode({
    familyName: 'intkey',
    familyVersion: '1.0',
    inputs: ['1cf1266e282c41be5e4254d8820772c5518a2c5a8c0c7f7eda19594a7eb539453e1ed7'],
    outputs: ['1cf1266e282c41be5e4254d8820772c5518a2c5a8c0c7f7eda19594a7eb539453e1ed7'],
    nonce: (Math.random() * 10 ** 18).toString(36),
    signerPublicKey: signer.getPublicKey().asHex(),
    batcherPublicKey: signer.getPublicKey().asHex(),
    dependencies: [],
    payloadSha512: createHash('sha512').update(payloadBytes).digest('hex')
}).finish()

Затем я выполнил тот же процесс, что и в документации, и когда я проверяю статус этой транзакции, он дает мне ответ ниже.

enter image description here

Затем я проверяю журнал пилообразного сервера, и он выглядел так, как показано ниже.

enter image description here

Затем после видя ответ на тот же вопрос здесь ( Ошибка транзакции Sawtooth: «Попытка установить неавторизованный адрес» ), я попытался использовать массивы inputs и outputs в виде пустых массивов, таких как []. Но ответ был таким же.

Мой docker -композитный файл содержит ниже контейнеров

enter image description here

1 Ответ

1 голос
/ 23 марта 2020

Установка пустых массивов, таких как [], на inputs и outputs - не вариант. Это означало бы, что вы не позволяете ни одному из адресов считывать и писать через процессор транзакций. Однако вы можете установить частичный адрес в inputs и outputs. Например, вы можете установить 1cf126 для inputs и outputs, и ваш код начнет работать.

Установка частичного адреса позволит вашему TP читать и / или записывать любой листовой узел в поддерево, на которое указывает ваш адрес. Чтобы понять, как это работает, обратитесь к разделу https://sawtooth.hyperledger.org/docs/core/releases/1.0/architecture/global_state.html?#radix -merkle-tree-review .

Пример, приведенный в документации, относится к семейству транзакций intkey, а ввод

const payload = {
    Verb: 'set',
    Name: 'foo',
    Value: 32
}

Но если вы хотите установить test вместо foo, вам придется рассчитать адрес для него и поместить его в inputs и outputs. Расчет адреса примечания - это то, что вы поддерживаете для клиента и TP для конкретного семейства транзакций. intkey делает это путем объединения двух из следующих

  1. Sha512 (intkey) - первые 6 символов в шестнадцатеричном представлении
  2. Sha512 (foo) - остальные символов из 64-го индекса

для foo.

Ссылка: https://github.com/hyperledger/sawtooth-sdk-rust/blob/190861a14046122ce6ecd684908c3d7a877e26ca/examples/intkey_rust/src/handler.rs#L175

В случае test это будет конкатенация

  1. Sha512 (intkey) - первые 6 символов в шестнадцатеричном представлении
  2. Sha512 (test) - Остальные символы из 64-го индекса

Надеюсь, это прояснит. Также, пожалуйста, обратитесь к определению Merkle-Radix выше, оно содержит подробную информацию о том, как можно рассчитать адрес. Это до реализации семейства транзакций.

...