Der Aufruf von Drizzle Contract gibt ein unerwartetes Objekt zurück

Ich habe eine View-Funktion in meinem Smart Contract, die ein uint zurückgibt.

Auf der Javascript-Seite von Truffle Drizzle mache ich den Aufruf, wenn die Seite geladen wird:

this.contracts.TheContract.methods.getNumber.call()

Ich hätte ein Big Number Object erwartet. stattdessen:

arguments:[]
call: ƒ () 
encodeABI: ƒ () 
estimateGas:ƒ ()
send: ƒ ()
_ethAccounts:
Accounts {_requestManager: RequestManager, givenProvider: MetamaskInpageProvider, providers: {…}, _provider: MetamaskInpageProvider, …}
_method:
{constant: true, inputs: Array(0), name: "getNumber", outputs: Array(1), payable: false, …}
_parent:
Contract {_requestManager: RequestManager, givenProvider: MetamaskInpageProvider, providers: {…}, _provider: MetamaskInpageProvider, …}
__proto__:Object

Wenn ich dieses Objekt aufrufe, gibt es ein Promise zurück; nicht das, was ich für einen Standardanruf erwartet hatte.

cacheCall gibt 0x0 zurück; eine leere Adresse? hm? Hat jemand Trüffel und Nieselregen verwenden können, ohne auf Standard-Web3 zurückgreifen zu müssen?

Ideen?

Danke

Antworten (2)

Der Standardaufruf gibt auch in web3 ein Promise zurück. Das ist also das erwartete Ergebnis.

myContract.methods.myMethod([param1[, param2[, ...]]]).call(options[, callback])

entweder Sie verwenden die Callback-Methode oder das Versprechen, dass Sie das erwartete Ergebnis erhalten

// Verwenden des Rückrufs
myContract.methods.myMethod(123).call({von: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'}, function(error, result){
    ...
});

// das Versprechen verwenden
myContract.methods.myMethod(123).call({von: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'})
.then(Funktion(Ergebnis){
    ...
});

// asynchron / warten
const result = await myContract.methods.myMethod(123).call({from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'})

Ref

Mein Problem stellte sich als Trüffel-Nieselregen heraus, trotzdem funktioniert es immer noch nicht wie erwartet

Wenn Sie Drizzle verwenden, verwenden Sie am besten cacheCall(). Wie in anderen Antworten erläutert wurde, gibt der Standardaufruf in web3 ein Versprechen anstelle des Rückgabewerts zurück, den Sie möglicherweise vom Vertragscode erwarten. Dies liegt daran, dass der Aufruf bei der Ausführung asynchron ausgeführt wird und der Wert nicht sofort bekannt ist. Der Umgang mit einem Versprechen wurde durch andere Antworten gut erklärt, daher werde ich es hier nicht noch einmal schreiben.

Drizzle cacheCall()ist leistungsfähiger und teilt Drizzle mit, dass Sie die Daten im Drizzle-Speicher verfolgen möchten. Drizzle überwacht die Blockchain auf Transaktionen, die mit Ihrem Vertrag interagieren, und aktualisiert automatisch den Wert im Store, wenn die Vertragsdaten geändert werden. Der Rückgabewert von cacheCall()ist nicht der Wert aus dem Vertrag, sondern gibt den Schlüssel zurück, der dem Wert im Drizzle-Speicher entspricht. In Ihrem Beispiel lautet der Geschäftsschlüssel 0x0. Um den Wert von getNumber anzuzeigen, müssen Sie ihn aus dem Drizzle Store abrufen. Sie finden es unter, this.props.TheContract.getNumber['0x0']wenn Sie es in der Funktion Ihres Dapp render()verwenden. Jedes Mal, wenn eine Transaktion zu Ihrem Vertrag diesen Wert ändern würde, ändert Drizzle ihn automatisch im Geschäft, sodass die Anzeige sofort aktualisiert wird. Dieser Leitfadenwar immens nützlich, um zu erklären, wie man Drizzle-Anrufe verwendet. Es erklärt viel ausführlicher, wie und wo Sie diese Funktion verwenden.