事务承诺超时错误

Transaction Promise Timeout Error

我正在尝试通过交易 enrollPeer 动态创建 Peer(参与者)。我希望链代码通过获取 num of peers 并添加 1 来自行生成 peerID。

当我让链代码自行创建 peerID 时,我遇到了超时。当我在交易(可选字段)中传递 peerID 时,它已成功添加到注册表中。我兑现承诺的方式有问题吗?

function enrollNewPeer(enroll){
    var factory = getFactory();
    var NS = 'org.acme.destro';

    if(enroll.typeOfPeer == null){
        enroll.typeOfPeer = 'Peer';
    }

    /* Make sure type exists */
    enroll.typeOfPeer = 'Peer';
    /* Make sure peerID does not exist */
    return getParticipantRegistry(NS + '.Peer')
    .then(function (peerRegistry) {            
        return peerRegistry.exists(enroll.peerID);  
    }).then(function (assetFound) {
        if (assetFound) {
            throw new Error("Peer Already Exitsts");
        }
        if(enroll.peerID == null){
            getParticipantRegistry(NS + '.Peer')
            .then(function (peerRegistry) {            
                return peerRegistry.getAll(); //returns list of Peers
            }).then(function(allPeers){ 
                var peerNum = (allPeers.length) + 1; // get #of peers and add 1
                var event = factory.newEvent(NS,'numPeers');
                event.peers = peerNum;
                emit(event);
            }).then(function() {
                enroll.peerID = 'peer' + peerNum;
            });
        }
    }).then(function() {
        var peer = factory.newResource(NS, enroll.typeOfPeer, enroll.peerID);
        peer.peerPubKey = assignKey(peer.peerID);

        var event = factory.newEvent(NS,'newPeer');
        event.peer = peer;
        emit(event);

        return getParticipantRegistry(NS + '.' + enroll.typeOfPeer)
        .then(function(participantRegistry) {
            return participantRegistry.add(peer);
        });
    });
}

一旦您 运行 在真正的分布式网络中跨多个对等点,您获取对等点数量然后加 1 的逻辑可能会失败。每个 Fabric peer 都将查询 peer 的数量,并且可能存在竞争条件,不同的 peer 获得不同的值——导致事务因共识失败而回滚。您应该在客户端分配 "new peer ID" 并将其与事务一起传递 - 这将确保所有 Fabric 节点使用相同的 id。