Hyperledger锯齿JavaScript SDK:提交的批无效

Hyperledger锯齿JavaScript SDK:提交的批无效,javascript,node.js,express,hyperledger-sawtooth,Javascript,Node.js,Express,Hyperledger Sawtooth,下面我将尝试通过javascript SDK实现hyperledger锯齿事务 在提交事务时,我从RESTAPI得到以下错误 { "error": { "code": 30, "message": "The submitted BatchList was rejected by the validator. It was poorly formed, or has an invalid signature.", "title": "Submitted Batches

下面我将尝试通过javascript SDK实现hyperledger锯齿事务

在提交事务时,我从RESTAPI得到以下错误

{
  "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"
  }
}
发现以下与我的问题类似的问题


但是它是用java实现的解决方案不适用于我的案例

这应该可以,试试这个:

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(上下文).newSigner(私钥);
//下面是如何生成输入输出地址
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);
常数有效载荷={
动词“set”,
名称:“foo”,
价值:42
};
const payloadBytes=cbor.encode(有效载荷);
const transactionHeaderBytes=protobuf.TransactionHeader.encode({
familyName:“intkey”,
家庭版本:“1.0”,
输入:[地址],
输出:[地址],
signerPublicKey:signer.getPublicKey().asHex(),
batcherPublicKey:signer.getPublicKey().asHex(),
依赖项:[],
payloadSha512:createHash('sha512').update(payloadBytes.digest('hex'))
}).finish();
const transactionHeaderSignature=signer.sign(transactionHeaderBytes);
const transaction=protobuf.transaction.create({
标题:transactionHeaderBytes,
headerSignature:transactionHeaderSignature,
有效载荷:payloadBytes
});
const transactions=[事务]
常量batchHeaderBytes=protobuf.BatchHeader.encode({
signerPublicKey:signer.getPublicKey().asHex(),
TransactionId:transactions.map((txn)=>txn.headerSignature),
}).finish();
常量batchHeaderSignature=signer.sign(batchHeaderBytes)
const batch=protobuf.batch.create({
标题:batchHeaderBytes,
headerSignature:batchHeaderSignature,
交易:交易
};
const batchListBytes=protobuf.BatchList.encode({
批次:[批次]
}).finish();
请寄({
网址:'http://rest.api.domain/batches',
正文:batchListBytes,
标题:{'Content-Type':'application/octet-stream'}
},(错误,响应)=>{
如果(错误){
返回console.log(err);
}
console.log(response.body);
});

您是否创建了一个批并将事务推送到该批,然后提交了该批?如何获取输入和输出您对此@iambatman有何评论?我已使用
输入-输出
地址生成代码更新了答案。@iambatman基本上是一个资源地址,它将保持某些资产的状态,并将被更改通过事务进行加密,并以
系列名称空间
作为前缀以保持其唯一性。当我第一次创建代理注册时,我将私钥存储在数据库中以供进一步事务使用。但是如果我尝试使用相同的私钥提交事务,则会出现错误。错误为“私钥应为缓冲区”。我如何对tr进行签名具有相同私钥的操作。
{
  "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"
  }
}