在这里-> Sawtooth Transaction error: "Tried to set unauthorized address"提出了相同的问题,我尝试了该答案。但是这个答案对我不起作用。
我正在使用Hyperleder锯齿docker compose启动我的服务。我在hyperledger-sawtooth-> https://sawtooth.hyperledger.org/docs/core/releases/1.0/_autogen/sdk_submit_tutorial_js.html#create-the-transaction-header
提供的本文档中所做的完全相同我的有效载荷是
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()
然后,我执行了与文档中相同的过程,当我检查该交易的状态时,它给了我以下的答复。
然后我检查锯齿服务器的日志,如下所示。
然后,在此处(Sawtooth Transaction error: "Tried to set unauthorized address")上看到相同问题的答案后,我尝试将inputs
和outputs
数组作为像[]这样的空数组。但是回应是一样的。
我的docker-compose文件包含以下容器
答案 0 :(得分:1)
不能将[]之类的空数组设置为inputs
和outputs
。这意味着您不允许通过事务处理器进行任何地址的读写操作。但是,您可以在inputs
和outputs
中设置部分地址。例如,您可以为1cf126
和inputs
设置outputs
,代码将开始工作。
设置部分地址将使您的TP可以读写地址所指向的子树下的任何叶节点。请参阅https://sawtooth.hyperledger.org/docs/core/releases/1.0/architecture/global_state.html?#radix-merkle-tree-overview部分以了解其工作原理。
文档中给出的示例适用于intkey
交易系列,输入为
const payload = {
Verb: 'set',
Name: 'foo',
Value: 32
}
但是,如果您想设置test
而不是foo
,则必须计算其地址并将其放在inputs
和outputs
中。注释地址的计算可以使客户和特定交易族的TP保持一致。 intkey
的实现方式是将以下两个连接起来
intkey
)-十六进制表示形式的前6个字符foo
)-第64个索引中的其余字符 foo
。
在test
的情况下,这将是
intkey
)-十六进制表示形式的前6个字符test
)-第64个索引中的其余字符希望这可以澄清。另外,请参考上面的Merkle-Radix定义,其中包含有关如何计算地址的详细信息。它取决于交易系列的实现者。