Hyperledger Fabric: проверьте, была ли сделка зафиксирована в регистре - PullRequest
2 голосов
/ 12 мая 2019

У меня есть три клиентских приложения, которые используют соответственно Java, Node.js и Go SDK для взаимодействия с моим блокчейном Fabric.Используя их, я могу успешно запрашивать и обновлять книгу.

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

Моя проблема в том, что я могуЯ не могу найти полную документацию по API SDK для Java, Go и Node.js, поэтому я не знаю, смогу ли я, если после возвращения метода отправки транзакция будет корректно передана в книгу.

Это код моего трех клиентов.Java:

NetworkConfig ccp = NetworkConfig.fromJsonFile(networkConfigPath.toFile());
// initialize default cryptosuite and setup the client
CryptoSuite cryptoSuite = CryptoSuite.Factory.getCryptoSuite();
HFClient client = HFClient.createNewInstance();
client.setCryptoSuite(cryptoSuite);

Channel channel = client.loadChannelFromConfig(ccp.getChannelNames().iterator().next(), ccp);
channel.initialize();

TransactionProposalRequest transactionProposal = client.newTransactionProposalRequest();
// build chaincode id providing the chaincode name
ChaincodeID mychaincodeID = ChaincodeID.newBuilder().setName("mychaincode").build();
transactionProposal.setChaincodeID(mychaincodeID);
// calling chaincode function
transactionProposal.setFcn("mymethod");
transactionProposal.setArgs("a1");

Collection<ProposalResponse> res = channel.sendTransactionProposal(transactionProposal);
channel.sendTransaction(res);

Node.js:

const gateway = new Gateway();
await gateway.connect(ccp, { wallet: wallet, identity: userName, discovery: { enabled: false } });

// Get the network (channel) our contract is deployed to.
const network = await gateway.getNetwork('mychannel');

// Get the contract from the network.
const contract = network.getContract('mychaincode');

const result = await contract.submitTransaction('mymethod', 'a1');

Go:

sdk, err := fabsdk.New(config.FromFile(configFile))
if err != nil {
    fmt.Printf("failed to create SDK: %v\n", err)
    return
}
fmt.Println("SDK created")

// Prepare channel client context using client context
clientChannelContext := sdk.ChannelContext(channelID, fabsdk.WithUser(userName), fabsdk.WithOrg(orgName))
// ChannelClient is used to query and execute transactions
client, err := channel.New(clientChannelContext)
if err != nil {
    fmt.Printf("failed to create new channel client: %v\n", err)
    return
}
fmt.Println("channel client created")

response, err := client.Execute(channel.Request{ChaincodeID: ccID, Fcn: "mymethod", Args: [][]byte{[]byte("a1")}}, channel.WithRetry(retry.DefaultChannelOpts))
if err != nil {
    fmt.Printf("failed to execute the invoke function: %v\n", err)
} else {
    fmt.Println("Proposal responses: ")
    for _, element := range response.Responses {
        fmt.Printf("Endorser: %s Status: %d ChaincodeStatus: %d\n", element.Endorser, element.Status, element.ChaincodeStatus)
    }
    fmt.Println("chaincode transaction completed: " + string(response.Payload))
}
// Close SDK
sdk.Close()

Эти коды работают.Моя проблема: Могу ли я быть уверен, что после строк

channel.sendTransaction(res)

(на Java)

const result = await contract.submitTransaction('mymethod', 'a1');

(в Node.js)

response, err := client.Execute(channel.Request{ChaincodeID: ccID, Fcn: "mymethod", Args: [][]byte{[]byte("a1")}}, channel.WithRetry(retry.DefaultChannelOpts))

(в Go) транзакция была передана в бухгалтерскую книгу?

Я обнаружил, что только в документах:

"Отправить транзакцию в бухгалтерскую книгу. Имя функции транзакции будет оценено при подтверждениисверстники, а затем переданы в службу заказа для совершения в книгу. "для submitTransaction в Node.js по https://fabric -sdk-node.github.io / release-1.4 / module-fabric-network.Contract.html # submitTransaction__anchor

и

«Выполнить готовит и выполняет транзакцию, используя запрос и дополнительные параметры запроса» для «Выполнить в Go» на https://godoc.org/github.com/hyperledger/fabric-sdk-go/pkg/client/channel#Client.Execute

Для Java я не могу найти документацию ... и я не уверен также насчет узла.JS и Go.

Ответы [ 3 ]

2 голосов
/ 14 мая 2019

Еще один ответ, чтобы помочь тем, кому, возможно, нужна эта функция от CLI.

По умолчанию CLI возвращает успех, когда заказ получает транзакцию.

Ожидание, пока фиксация на peer chaincode invokecommnad добавляет флаг --waitForEvent

Таким образом, cli будет ожидать события фиксации от пиров.

Надеюсь, это поможет.

1 голос
/ 15 мая 2019

Я думаю, что лучший способ сделать это - использовать Fabric EventHub, таким образом вы регистрируете слушателя и получаете событие, когда оно зафиксировано.Использование запросов может привести к противоречивым результатам и выполнению повторных попыток для отложенных транзакций.

Приведенный ниже фрагмент кода можно использовать с NodeSDK, и я думаю, что он будет полезен, дополнительные примеры и документацию можно найти здесь: https://fabric -sdk-node.github.io / release-1.4 / tutorial-listen-to-events.html

var options = {
    wallet_path: path.join(__dirname, './creds'),
    user_id: 'PeerAdmin',
    channel_id: 'mychannel',
    chaincode_id: 'fabcar',
    peer_url: 'grpc://localhost:7051',
    event_url: 'grpc://localhost:7053',
    orderer_url: 'grpc://localhost:7050'
};



    let eh = client.newEventHub();
    eh.setPeerAddr(options.event_url);
    eh.connect();


    let txPromise = new Promise((resolve, reject) => {
        let handle = setTimeout(() => {
            eh.disconnect();
            reject();
        }, 30000);

        eh.registerTxEvent(transactionID, (tx, code) => {
            clearTimeout(handle);
            eh.unregisterTxEvent(transactionID);
            eh.disconnect();

            if (code !== 'VALID') {
                console.error(
                    'The transaction was invalid, code = ' + code);
                reject();
            } else {
                console.log(
                    'The transaction has been committed on peer ' +
                    eh._ep._endpoint.addr);
                resolve();
            }
        });
    });
    eventPromises.push(txPromise);
1 голос
/ 13 мая 2019

Я думаю, что решил. В каждом клиентском приложении я пытался добавить запрос в книгу в строку после запроса. Результатом этого теста является то, что версии Node.js и Go работают хорошо: после

const result = await contract.submitTransaction('mymethod', 'a1');

и

response, err := client.Execute(channel.Request{ChaincodeID: ccID, Fcn: "mymethod", Args: [][]byte{[]byte("a1")}}, channel.WithRetry(retry.DefaultChannelOpts))

результат запроса в порядке, я получил правильное новое значение. Таким образом, это означает, что регистр корректно обновляется после выполнения метода.

Для версии Java, которую я решил следующим образом:

NetworkConfig ccp = NetworkConfig.fromJsonFile(networkConfigPath.toFile());
// initialize default cryptosuite and setup the client
CryptoSuite cryptoSuite = CryptoSuite.Factory.getCryptoSuite();
HFClient client = HFClient.createNewInstance();
client.setCryptoSuite(cryptoSuite);

Channel channel = client.loadChannelFromConfig(ccp.getChannelNames().iterator().next(), ccp);
channel.initialize();

TransactionProposalRequest transactionProposal = client.newTransactionProposalRequest();
// build chaincode id providing the chaincode name
ChaincodeID mychaincodeID = ChaincodeID.newBuilder().setName("mychaincode").build();
transactionProposal.setChaincodeID(mychaincodeID);
// calling chaincode function
transactionProposal.setFcn("mymethod");
transactionProposal.setArgs("a1");

Collection<ProposalResponse> res = channel.sendTransactionProposal(transactionProposal);
CompletableFuture<TransactionEvent> cf = channel.sendTransaction(res);
TransactionEvent te = cf.get();

logger.info("Status: " + te.isValid());
logger.info("Committed the transaction with transactionID + " + te.getTransactionID());

Надеюсь, это поможет. Конечно, если у кого-то есть комментарии, они хорошо приняты.

...