Цепной код Hyperledger: функция, вызывающая другую функцию из цепного кода? - PullRequest
0 голосов
/ 03 января 2019

У меня есть сценарий, в котором мне нужно вызвать какую-то другую (скажем, запрос) функцию из функции цепного кода (скажем, обновление).Имеет ли Hyperledger Fabric какой-либо интерфейс для этогоНапример:

   ...
    async query(stub, args) {
    }
    async update(stub, args) {
      if(condition) {
        call query();
      }
    }
    ...

Я попытался ответить на следующий пост, но он не сработал. как вызвать функцию цепного кода из себя, чтобы записать под транзакции .Хотя с помощью invokeChaincode () я могу вызывать функцию из другого цепного кода.

Заранее спасибо.

Код цепочки:

    let Chaincode = class {

    async Init(stub) {
        return shim.success();
    }

    async Invoke(stub) {

        let ret = stub.getFunctionAndParameters();

        console.info(ret);

        let method = this[ret.fcn];

        if (!method) {
            throw new Error('Received unknown function ' + ret.fcn + ' invocation');
        }
        try {
            let payload = await method(stub, ret.params);
            return shim.success(payload);
        } catch (err) {
            return shim.error(err);
        }
    }

    async init(stub, args) {

        if (args.length != 1) {
            throw new Error('Invalid args. Expects no args');
        }
    }

    async query(stub, args) {
        ...
    }

    async dummy(stub, args) {
        return Buffer.from('Hello');
    }


    async update(stub, args) {
    ...
        let resp = await dummy(); // gives error
        //let resp = await stub.invokeChaincode('cc2', ['dummy'] );  // working
        console.log(resp)
    ...
    }    
};
shim.start(new Chaincode());

Ответы [ 2 ]

0 голосов
/ 19 марта 2019

Иногда нам следует подумать, что это проще. Ну, ответ таков: позвоните прямо. Например: мы получили две функции A и B

func (s *SmartContract) A(APIstub shim.ChaincodeStubInterface, args []string) sc.Response {}
func (s *SmartContract) B(APIstub shim.ChaincodeStubInterface, args []string) sc.Response {}

если мы хотим вызвать функцию A внутри функции B, просто сделайте это как

func (s *SmartContract) B(APIstub shim.ChaincodeStubInterface, args []string) sc.Response {

 s.A(APIstub,args)

}
0 голосов
/ 03 января 2019

В качестве альтернативного подхода я устанавливаю и создаю один и тот же цепной код с двумя именами, скажем, cc1 и cc2 на одном канале, скажем, ch1. Тогда я использую:

 invokeChaicode('cc2', ['function', 'arg1', arg2]);

из первой цепочки (cc1).

Но проблема в том, что мне нужно установить и создать один и тот же цепной код дважды с разными именами на одном канале.

Любые другие идеи приветствуются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...