fromAccount und web3.js

Das ist meine Funktion in Solidität

function transferForm(address _from, address _to, uint256 _value) public returns (bool success) {
}

Jetzt rufe ich dieselbe Funktion in der Testdatei auf, um meinen Smart Contract zu testen

tokenInstance.transferForm(spendingAccount,10,{from : fromAccount})

Ich habe von Konto zu Konten initialisiert[3]

Warum senden wir die Daten mit{from : fromAccount}

Warum können wir keine Daten wie z

tokenInstance.transferForm(from,spendingAccount,10,)

Gibt es einen Unterschied?

Woher weiß die Funktion, wann wir die Position der von uns gesendeten Funktionseingabeparameter ändern?

Bitte helfen Sie mir, die Logik zu verstehen

transferFormsollte wohl seintransferFrom

Antworten (1)

Obwohl sie ähnlich verwirrende Namen haben, beziehen sie sich auf verschiedene Dinge.

Das Format { key: value }ist das Web3-Format zum Bereitstellen zusätzlicher Metadaten für die Funktion. Diese werden nicht als Parameter an die Funktion weitergegeben, sondern intern behandelt. Beispielsweise kann der Schlüssel fromverwendet werden, um festzulegen, von welchem ​​der verfügbaren Konten die Transaktion gesendet wird. Dieser Wert wird nicht direkt an die Funktion weitergegeben, sondern die Transaktion wird von diesem Konto erstellt.

Die transferFromFunktion erwartet ein erstes Argument vom Typ addressund muss bereitgestellt werden. Die Funktionssignatur hat keine Ahnung, von welchem ​​Konto die eigentliche Transaktion stammt - das kann später in der Funktion mit überprüft werden msg.sender. Wenn Sie also ein { from: fromAccount }für den Funktionsaufruf angeben, fromAccountwird das msg.senderinnerhalb der Funktion.

BEARBEITEN

Außerdem transferFromerwartet die Funktion 3 Parameter, aber Sie übergeben ihr in Ihrem ersten Beispiel nur zwei Parameter. Die Funktion kann die Parameter in keiner Weise aus Metadaten "neu zuordnen", sodass Sie einen Fehler erhalten, da eine Funktion mit Ihrer Signatur (2 Parameter) nicht existiert.

Danke. Aber etwas verwirrend erwartet die Funktion drei Parameter, aber wir geben nur zwei Parameter direkt an, als es einen Fehler auslösen sollte. Der dritte Parameter, den wir in Metadaten übergeben, die intern richtig verwendet werden. korrigiere mich, wenn ich falsch liege
Sorry, das Problem hatte ich auch übersehen. Habe jetzt meine Antwort bearbeitet.
Danke Eine weitere Sache ist, dass aber wie web3.js enthalten ist, ich nie injiziert habe, aber im Browser verwenden wir Metmask zum Injizieren, aber wie können wir hier web3.js-Aufrufe verwenden