Ich bin neu bei Node.js und asynchronen Aufrufen, aber ich versuche ein Programm zu erstellen, das automatisch mehrere Transaktionen vornehmen kann. Die Sache ist, gerade stelle ich zuerst eine Verbindung zu Hyperledger Fabric her und führe dann die Funktion durch eine for-Schleife aus.Schleife durch mehrere Versprechen effizient
Das ist ziemlich schnell, aber ich freue mich auf die Geschwindigkeit zu verbessern. Dies ist der Code, den die Verbindung initiiert:
init() {
return this.businessNetworkConnection.connect(this.connectionProfile, this.businessNetworkIdentifier, participantId, participantPwd)
.then((result) => {
console.log(chalk.green('Connected to Hyperledger!'));
this.businessNetworkDefinition = result;
})
.catch(function (error) {
console.log('An error occured: ', chalk.bold.red(error));
});
}
Dies ist der Code, den ich Transaktionen auf dem Hauptbuch machen kann:
makeTransaction(fromID, toID, funds) {
const METHOD = 'makeTransaction';
let from;
let walletRegistry;
let to;
return this.businessNetworkConnection.getAssetRegistry('org.acme.Wallet')
.then((registry) => {
console.log(1);
walletRegistry = registry;
return walletRegistry.get(fromID);
})
.then((fromm) => {
console.log(2);
from = fromm;
return walletRegistry.get(toID);
})
.then((too) => {
to = too;
})
.then(() => {
let serializer = this.businessNetworkDefinition.getSerializer();
let resource = serializer.fromJSON({
"$class": "org.acme.Transfer",
"amount": funds,
"from": {
"$class": "org.acme.Wallet",
"id": from.getIdentifier(),
"balance": from.balance,
"owner": "resource:org.acme.Client#" + from.owner.getIdentifier()
},
"to": {
"$class": "org.acme.Wallet",
"id": to.getIdentifier(),
"balance": to.balance,
"owner": "resource:org.acme.Client#" + to.owner.getIdentifier()
}
});
return this.businessNetworkConnection.submitTransaction(resource);
})
.catch(function (error) {
throw (error);
})
}
Aber die Funktion, die jetzt die Transaktion wie folgt geschehen Aussehen macht .
static transfer(fromID, toID, funds) {
let bm = new BlockchainManager();
return bm.init()
.then(() => {
return bm.makeTransaction(fromID, toID, funds);
})
.then(() => {
console.log('Success!');
})
.catch(function (error) {
console.log('An error occured: ', chalk.bold.red(error));
process.exit(1);
});
}
Ich glaube nicht, dies der beste Weg ist, eine Menge von Transaktionen zu machen (ich bin auf der Suche mehr als 1000 pro Sekunde zu einem bestimmten Zeitpunkt laufen). Was wäre der beste Weg dies zu programmieren?
In Bezug auf 'walletRegistry',' from' und 'to', siehe [Wie kann ich auf vorherige Versprechen Ergebnisse in einer' .then() 'Kette zugreifen?] (https: //stackoverflow.com/q/28250680/1048572) – Bergi
Wo ist die Schleife? Was ist "ziemlich schnell" (was hast du gemessen)? Was kann Ihrer Meinung nach verbessert werden? Haben Sie Profiling gemacht, wissen Sie, was der Engpass ist? – Bergi
Sind BlockChainManager wiederverwendbar? Wenn dies der Fall ist, ziehen Sie es in Betracht, einen Pool von ihnen zu erstellen, anstatt für jede Übertragung neu zu erstellen und zu initialisieren. Ich bin sicher, dass es ein passendes Standard-Paradigma für die Verwaltung des Pools geben muss ... –