fabri c -sdk- go Execute Не всегда обновляет регистр - PullRequest
2 голосов
/ 28 мая 2020

Я использую client.channel.Execute API в fabri c -sdk- go для вызова Txs обновления леджера в чейнкоде.

Я знаю, что мой чейнкод для обновления леджера правильный, потому что вызываю Tx при запуске из контейнера cli командная строка работает безупречно все время.

Несколько раз случайным образом обновления бухгалтерской книги не отражаются при выполнении как вызов REST API из POSTMAN, как показано ниже. В этих случаях код ответа - 200 с правильной полезной нагрузкой ответа, указывающей на успешное выполнение цепного кода.

`

chaincodeID := "hcc"
fcn := "GiftToken"
args := [][]byte{
    []byte(reqBody.TokenID),
    []byte(reqBody.GiftToUserID),
    []byte(GiftTokenCountAsString),
}

setup := lib.GetFabricSetup()

transientDataMap := make(map[string][]byte)
transientDataMap["result"] = []byte("Transient data in GiftToken invoke")

response, err := setup.Client.Execute(channel.Request{ChaincodeID: chaincodeID, Fcn: fcn, Args: args, TransientMap: transientDataMap})

Я использую изображения Fabri c 1.4.4 в контейнерах docker . В моей сети 1 организация с 4 равноправными узлами.

Конечно, не хватает какого-то аспекта, который приводит к такому поведению. Заранее спасибо.

1 Ответ

1 голос
/ 28 мая 2020

Всем одноранговым узлам требуется время, чтобы c синхронизировать свои блоки. Как только одноранговые узлы получают эти блоки, они обновляют свое состояние мира, поэтому вы можете увидеть свое изменение с помощью запросов.

Когда вы запрашиваете "только что выполненную" транзакцию, вы можете попасть в один из других пиров. Если вам нужен немедленный результат, убедитесь, что вы запрашиваете тот же одноранговый узел (а), где вы фактически выполнили свою транзакцию. Вы можете попробовать установить некоторую задержку, чтобы увидеть, как другие одноранговые узлы также получают блок.

Причина, по которой вы сразу видите изменение в CLI, связана со способом реализации клиента. При выполнении команды CLI вы явно указываете партнера. Таким образом, транзакция выполняется на одном узле и запрашивается на одном узле (без проблем). Вы можете доказать это поведение, немедленно запросив (через интерфейс командной строки) однорангового узла другой организации сразу после выполнения транзакции (через интерфейс командной строки). SDK использует службу обнаружения одноранговых узлов и находит для вас одноранговый узел в сети и использует его.

По этой причине, когда политика подтверждения сформирована как «И (org1, org2)», клиентский SDK фактически запрашивает 2 сверстники (по одной в каждой организации) и сравните результаты.

...