Kit de développement JavaScript JavaScript en dents de scie Hyperledger: les lots soumis ne sont pas valides

J’essaie d’implémenter une transaction en dents de scie hyperledger via le SDK javascript en suivant cette https://sawtooth.hyperledger.org/docs/core/releases/1.0/_autogen/sdk_submit_tutorial_js.html .

/* *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').toSsortingng('hex'), payload: payloadBytes }); } 

Lors de la soumission de la transaction, le message d’erreur suivant de l’API REST s’affiche:

 { "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" } } 

Le problème suivant est similaire à mon problème

Lot ou signature non valide en dents de scie

Mais sa mise en œuvre en Java la solution ne fonctionne pas pour mon cas

    Cela devrait fonctionner, essayez ceci:

     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); });