Warum ist der Aufruf von .at() viel langsamer als .deployed()?

Ich versuche, eine Hilfsfunktion zu erstellen, mit der ich zwischen einem .deployed()Anruf zu meinem Vertrag und einem Anruf mit fester Adresse wechseln kann, indem ich .at(). Der zweite Aufruf (der im Code unten auskommentiert ist) ist also extrem langsam. Ich mache ungefähr 1-2 Aufrufe pro Sekunde (Abfrage für ein Ereignis) gegen ein lokales Testnetz und es hält Chrome mit der zweiten Methode bei 100 %. Die erste Methode ist etwa 20 Mal schneller. Warum ist das so und wie kann ich das beheben?

getContractDeploy: function() {
    contract_deploy = App.contracts.CONTRACTX.deployed();
    //contract_deploy = App.contracts.CONTRACTX.at(contract_address);
  return contract_deploy;
},

Antworten (1)

Wenn Sie Truffle verwenden, verwenden Sie Truffle-Contract , um Verträge zu verwalten.

Betrachtet man die Implementierung von at, ruft es zusätzlich an web3.eth.getCode, um sicherzustellen, dass an der angegebenen Adresse ein Vertrag besteht.

Die Implementierung von deployedist einfacher und stützt sich nur auf die Informationen aus dem Vertragsartefakt.

Es ist keine gute Idee, .at()den Hot Path aufgerufen zu haben oder zumindest das Ergebnis zwischenzuspeichern, wenn sich die Adresse nicht häufig ändert.

Wenn Sie die Überprüfung nicht möchten, können Sie ein JSON-Artefakt im Speicher fälschen und damit den Vertrag mit deployed()... instanziieren.