事务承诺超时错误
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。
我正在尝试通过交易 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。