SDK Hyperledger sawtooth JavaScript: отправленные пакеты недействительны

Я пытаюсь реализовать пилообразную транзакцию гиперледжера через javascript SDK после этого https://sawtooth.hyperledger.org/docs/core/releases/1.0/_autogen/sdk_submit_tutorial_js.html#encoding-your-payload.

/*
*Create the transaction header
*/
const createTransactionHeader = function createTransactionHeader(payloadBytes) {

    return  protobuf.TransactionHeader.encode({
        familyName: 'intkey',
        familyVersion: '1.0',
        inputs: [],
        outputs: [],
        signerPublicKey: '02cb65a26f7af4286d5f8118400262f7790e20018f2d01e1a9ffc25de1aafabdda',

        batcherPublicKey: '02cb65a26f7af4286d5f8118400262f7790e20018f2d01e1a9ffc25de1aafabdda',
        dependencies: [],
        payloadSha512: createHash('sha512').update(payloadBytes).digest('hex')
    }).finish();


}
/*
* Create the transactions
*/
const createTransaction = function createTransaction(transactionHeaderBytes, payloadBytes) {

    const signature = signer.sign(transactionHeaderBytes)

    return transaction = protobuf.Transaction.create({
        header: transactionHeaderBytes,
        headerSignature: Buffer.from(signature, 'utf8').toString('hex'),
        payload: payloadBytes
    });
}

При отправке транзакции я получаю следующую ошибку от REST API

{
  "error": {
    "code": 30,
    "message": "The submitted BatchList was rejected by the validator. It was poorly formed, or has an invalid signature.",
    "title": "Submitted Batches Invalid"
  }
}

Обнаружена следующая проблема, похожая на мою проблему

Неверная партия или подпись Sawtooth

Но его реализовано в java, решение не работает для моего случая


person iam batman    schedule 23.06.2018    source источник
comment
Вы создали пакет и отправили транзакцию в пакет, а затем отправили пакет?   -  person Rohit Khatri    schedule 29.06.2018


Ответы (1)


Это должно сработать, попробуйте следующее:

const cbor = require('cbor');
const {createContext, CryptoFactory} = require('sawtooth-sdk/signing');
const {createHash} = require('crypto');
const {protobuf} = require('sawtooth-sdk');
const request = require('request');
const crypto = require('crypto');

const context = createContext('secp256k1');
const privateKey = context.newRandomPrivateKey();
const signer = CryptoFactory(context).newSigner(privateKey);


// Here's how you can generate the input output address
const FAMILY_NAMESPACE = crypto.createHash('sha512').update('intkey').digest('hex').toLowerCase().substr(0, 6);
const address = FAMILY_NAMESPACE + crypto.createHash('sha512').update('foo').digest('hex').toLowerCase().substr(0, 64);

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

const payloadBytes = cbor.encode(payload);

const transactionHeaderBytes = protobuf.TransactionHeader.encode({
  familyName: 'intkey',
  familyVersion: '1.0',
  inputs: [address],
  outputs: [address],
  signerPublicKey: signer.getPublicKey().asHex(),
  batcherPublicKey: signer.getPublicKey().asHex(),
  dependencies: [],
  payloadSha512: createHash('sha512').update(payloadBytes).digest('hex')
}).finish();

const transactionHeaderSignature = signer.sign(transactionHeaderBytes);

const transaction = protobuf.Transaction.create({
  header: transactionHeaderBytes,
  headerSignature: transactionHeaderSignature,
  payload: payloadBytes
});

const transactions = [transaction]

const batchHeaderBytes = protobuf.BatchHeader.encode({
  signerPublicKey: signer.getPublicKey().asHex(),
  transactionIds: transactions.map((txn) => txn.headerSignature),
}).finish();

const batchHeaderSignature = signer.sign(batchHeaderBytes)

const batch = protobuf.Batch.create({
  header: batchHeaderBytes,
  headerSignature: batchHeaderSignature,
  transactions: transactions
};

const batchListBytes = protobuf.BatchList.encode({
  batches: [batch]
}).finish();

request.post({
  url: 'http://rest.api.domain/batches',
  body: batchListBytes,
  headers: {'Content-Type': 'application/octet-stream'}
}, (err, response) => {
  if(err) {
    return console.log(err);
  }

  console.log(response.body);
});
person Rohit Khatri    schedule 29.06.2018
comment
Как я могу получить ввод и вывод - person iam batman; 02.07.2018
comment
Есть ли у вас какие-либо комментарии к этому stackoverflow.com / questions / 51131415 / - person iam batman; 02.07.2018
comment
@iambatman Я обновил ответ кодом генерации адреса input output. - person Rohit Khatri; 02.07.2018
comment
По сути, @iambatman. Это адрес ресурса, который будет сохранять состояние некоторого актива и будет изменяться посредством транзакций, и он имеет префикс family namespace, чтобы сохранить его уникальность. - person Rohit Khatri; 02.07.2018
comment
Когда я впервые создаю регистрацию агента, я сохраняю закрытый ключ в своей базе данных для дальнейших транзакций. Но если я попытаюсь отправить транзакцию с тем же закрытым ключом, появится ошибка. Ошибка: «Личный ключ должен быть буфером». Как я могу подписать транзакцию тем же закрытым ключом. - person U rock; 28.01.2019