INVOKE_CHAINCODE не удалось: идентификатор транзакции существует - PullRequest
0 голосов
/ 09 июля 2020

У меня есть цепной код с двумя контрактами, так что второй контракт вызывает транзакцию первого, как показано ниже:

class ContractA implements ContractInterface{
     .....
     @Transaction
     public boolean trans1(MyContext ctx, String data) {
         ...
         return result;
     }
}

class ContractB implements ContractInterface{
     .....
     @Transaction
     public boolean trans2(MyContext ctx, String data) {
         ...
         Chaincode.Response response = ctx.getStub().invokeChaincode(chaincodeId,
                    new String[]{ContractA:trans1, "data"});
         ...
     }
}

Во время выполнения trans2 invokeChaincode не выполняется с ошибка: «Ошибка INVOKE_CHAINCODE: существует идентификатор транзакции». Согласно документации , при вызове invokeChaincode не будет создана никакая другая транзакция, поэтому правильно, что вызов создается с тем же идентификатором транзакции.

Это ошибка или я что-то не так в моем дизайне?

Заранее большое спасибо, Роксана

1 Ответ

1 голос
/ 10 июля 2020

Выполнение ctx.getStub().invokeChaincode(chaincodeId, new String[]{ContractA:trans1, "data"}); запрашивает у партнера выполнение чейнкода для вызова чейнкода самому себе. Рекурсивный вызов цепного кода не поддерживается.

Сообщение об ошибке здесь, вероятно, можно было бы улучшить, но, по сути, ресурсы выделяются для вызова цепного кода, связанного с txid, которые затем очищаются после завершения транзакции. Поскольку ваша транзакция уже взаимодействует с вашим цепным кодом, эти ресурсы уже существуют, и попытка их создания приводит к возвращаемой ошибке.

Если вы sh вызываете другую функцию в вашем собственном цепном коде, просто вызывать его как обычную функцию, а не пытаться вызвать его через заглушку чейнкода.

...