hyperledger 锯齿提交交易错误 "Tried to get unauthorized address",状态无效
hyperledger sawtooth submit transaction error "Tried to get unauthorized address" with status invalid
这里有人问过同样的问题 -> 我试过那个答案。但是这个答案对我不起作用。
我正在使用 hyperleder sawtooth 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
}
我的交易 header 是
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()
然后我做了与文档中相同的过程,当我检查该交易的状态时,它给出了以下响应。
然后我查看锯齿波服务器的日志,如下所示。
然后在此处 () 看到相同问题的答案后,我尝试将 inputs
和 outputs
数组作为空数组,如 []。但反应是一样的。
我的 docker-compose 文件包含以下容器
将 [] 之类的空数组设置为 inputs
和 outputs
不是一个选项。这意味着您不会让任何地址通过您的交易处理器进行读写。但是,您可以在 inputs
和 outputs
中设置部分地址。例如,您可以为 inputs
和 outputs
设置 1cf126
,您的代码将开始工作。
设置部分地址将使您的 TP 读取 and/or 写入您的地址指向的子树下的任何叶节点。请参阅 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
的方法是连接以下两个
- Sha512(
intkey
) - 十六进制表示的前 6 个字符
- Sha512(
foo
) - 第 64 个索引中的其余字符
对于 foo
。
在 test
的情况下,这将是
的串联
- Sha512(
intkey
) - 十六进制表示的前 6 个字符
- Sha512(
test
) - 第 64 个索引中的其余字符
希望这能澄清。另外,请参考上面的 Merkle-Radix 定义,它有关于如何计算地址的详细信息。这取决于交易家族的实施者。
这里有人问过同样的问题 ->
我正在使用 hyperleder sawtooth 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
}
我的交易 header 是
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()
然后我做了与文档中相同的过程,当我检查该交易的状态时,它给出了以下响应。
然后我查看锯齿波服务器的日志,如下所示。
然后在此处 (inputs
和 outputs
数组作为空数组,如 []。但反应是一样的。
我的 docker-compose 文件包含以下容器
将 [] 之类的空数组设置为 inputs
和 outputs
不是一个选项。这意味着您不会让任何地址通过您的交易处理器进行读写。但是,您可以在 inputs
和 outputs
中设置部分地址。例如,您可以为 inputs
和 outputs
设置 1cf126
,您的代码将开始工作。
设置部分地址将使您的 TP 读取 and/or 写入您的地址指向的子树下的任何叶节点。请参阅 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
的方法是连接以下两个
- Sha512(
intkey
) - 十六进制表示的前 6 个字符 - Sha512(
foo
) - 第 64 个索引中的其余字符
对于 foo
。
在 test
的情况下,这将是
- Sha512(
intkey
) - 十六进制表示的前 6 个字符 - Sha512(
test
) - 第 64 个索引中的其余字符
希望这能澄清。另外,请参考上面的 Merkle-Radix 定义,它有关于如何计算地址的详细信息。这取决于交易家族的实施者。