Solidity Truffle React TestRPC: Ungültiger Adressfehler beim Erstellen von Transaktionen über die React-App

Ich schreibe einen einfachen Vertrag, der im Grunde eine Registrierung ist. Ich verwende testRPC für meine Ethereum-Tests. Das Folgende ist mein Vertrag auf Truffle:

notar.sol

pragma solidity ^0.4.11;

contract notary {
    struct individual {
        bytes32 firstname;
        bytes32 lastname;
        uint yob;
        bytes32 pancard;
        uint aadhar;
    }
    mapping(address => individual) public user;
    function Register(address _to, bytes32 _firstname, bytes32 _lastname, uint _yob, bytes32 _pancard, uint _aadhar) returns (bool success) {
        if (user[_to].aadhar != 0) {
            return false; 
        }
        user[_to].firstname = _firstname;
        user[_to].lastname = _lastname;
        user[_to].yob = _yob;
        user[_to].pancard = _pancard;
        user[_to].aadhar = _aadhar;

        return true;
    }

    function getDetails(address _to) constant returns (bytes32 _firstname, bytes32 _lastname, uint _yob, bytes32 _pancard, uint _aadhar) {
        return (user[_to].firstname, user[_to].lastname, user[_to].yob, user[_to].pancard, user[_to].aadhar);
    }
}

Wenn ich den Vertrag bereitgestellt habe, truffle compile and truffle migrate --resetfunktioniert alles wie vorgesehen. Ich habe bereits einen Eintrag zum Vertrag gemacht:

Aktion über Konsole

> notary.deployed().then(function(instance) {NOTR = notary.deployed.at(instance.address)})
> NOTR.Register(web3.eth.accounts[9], 'mukesh', 'kumar', 1987, 'fbjsdkfd67', 324234)
> NOTR.getDetails(web3.eth.accounts[9])

[ '0x6d756b6573680000000000000000000000000000000000000000000000000000',
  '0x6b756d6172000000000000000000000000000000000000000000000000000000',
  { [String: '1987'] s: 1, e: 3, c: [ 1987 ] },
  '0x66626a73646b6664363700000000000000000000000000000000000000000000',
  { [String: '324234'] s: 1, e: 5, c: [ 324234 ] } ]

Als nächstes versuche ich, dies mit React als Schnittstelle zu erreichen. Mein React-Code ist länger, als ich hier einfügen möchte. Hauptsächlich ist die Schnittstelle einfach wie folgt:

Geben Sie hier die Bildbeschreibung ein

Wenn ich auf Senden klicke, möchte ich im Grunde eine neue Registrierung erstellen. Ich habe ABI, Vertragsadresse und andere Parameter wie erforderlich in meiner React-App angegeben, zusätzlich zu allen darin erforderlichen ordnungsgemäßen Importen usw. Tatsächlich funktionieren die folgenden tatsächlich auf meiner React-Oberfläche:

  handleSubmit(event) {
    // alert(notaryContract.getDetails(ETHEREUM_CLIENT.eth.accounts[9]))
    // alert(JSON.stringify(this.state))
    // alert(ETHEREUM_CLIENT.isAddress(ETHEREUM_CLIENT.eth.accounts[0]))

Aber sobald ich notaryContract.Register('0xcc82fa55789663402c013a497eac268172af7f9d', this.state.setFirstName, this.state.setLastName, this.state.setYearofBirth, this.state.setPanCard, this.state.setAadhar)es versuche, bekomme ich einen Fehler wie folgt (die _toenthaltene Adresse ist eine der testrpc-Adressen:

    Uncaught Error: invalid address
        at inputAddressFormatter (http://localhost:3000/static/js/bundle.js:59056:11)
        at inputTransactionFormatter (http://localhost:3000/static/js/bundle.js:34345:27)
...long list...
        at dispatchEvent (http://localhost:3000/static/js/bundle.js:31505:20)

Entschuldigung für eine lange Frage, aber ich bin sicher, dass mir hier etwas Kleines fehlt, und ich musste die Reproduktion Schritt für Schritt hinzufügen, damit andere auf das Problem hinweisen können. Ich habe versucht, die Adresse in Zeichenfolgenform einzugeben und dann auch einfach web3.eth.accounts[x]die [_to]Adresse einzufügen, aber ohne Erfolg. Ich denke möglicherweise, weil getDetailses eine konstante Funktion ist, die funktioniert, da es kein Gas verbraucht, während Registerkeine Transaktion erstellt und eine Zustandsänderung verursacht wird. Ich kann jedoch nicht nachvollziehen, warum es truffle consolein der React-App funktioniert, während es nicht funktioniert. Ich habe die bundle.js überprüft, aus der der Fehler wegen ungültiger Adresse stammt, aber da es noch keine richtigen Debugging-Protokolle gibt, um die Probleme zu verstehen, kann ich sie nicht zum Laufen bringen. Jede Hilfe wird sehr geschätzt.

Antworten (1)

Jeder Transaktion sollte eine Kontoadresse zugeordnet sein. Bei der Verwendung der Truffle-Konsole wird automatisch das Standardkonto verwendet, jedoch nicht bei der Verwendung von web3.

Versuchen Sie, Ihrer Transaktion eine Kontoadresse wie unten zuzuordnen:

notaryContract.Register('0xcc82fa55789663402c013a497eac268172af7f9d', this.state.setFirstName, this.state.setLastName, this.state.setYearofBirth, this.state.setPanCard, this.state.setAadhar, {from: eth.accounts[0]})

oder

notaryContract.Register('0xcc82fa55789663402c013a497eac268172af7f9d', this.state.setFirstName, this.state.setLastName, this.state.setYearofBirth, this.state.setPanCard, this.state.setAadhar, {from: <your account address>})
Habe das gemacht, muss sagen es funktioniert danke, allerdings bekomme ich einen Runtime Error: out of gas, immer wenn ich eine Anmeldung erstelle (90000 Gas erforderlich). Irgendeine Idee warum? Müssen Sie auch die Gasschätzung hinzufügen, wenn wir keine Konsole verwenden?
Die Transaktion kostet fast 120.000 Gas durch die Konsole und 90.000 durch die Anwendung, aber die Anwendung schlägt immer noch mit einem Laufzeitfehler des Gasauslaufs fehl. Soll ich dazu eine separate Frage erstellen?
Überprüfen Sie das geschätzte Gas im Testprc-Protokoll. Konvertieren Sie es in Dezimalzahlen. So viel Gas wird benötigt. Versuchen Sie, diese Gasmenge in der Transaktion zu übergeben: notaryContract.Register('0xcc82fa55789663402c013a497eac268172af7f9d', this.state.setFirstName, this.state.setLastName, this.state.setYearofBirth, this.state.setPanCard, this.state.setAadhar, {aus: eth.accounts[0], gas: 2000000}).
Perfekt, es ist ein bisschen seltsam, aber jedes Mal, wenn ich versuche, einen Vertrag und eine nachfolgende Transaktion zu erstellen, muss ich Gas schätzen ... wird es immer so sein? Wenn es über die Konsole passiert, werden diese Dinge automatisch erledigt. Gibt es eine Möglichkeit, dies auch in Anwendungen zu tun (web3)?
Ich denke, wenn Sie "Gas: 2000000" einstellen, sollte es genug Gas geben, um jeden Vertrag auszuführen. Sie können ein Standardgaslimit wie "var myContract = MyContract.at(web3.eth.accounts[0], {gasLimit: "2000000"});" festlegen.
Interessanter Punkt, gemäß der aktuellen Logik wird das Gas, das nicht verbraucht wird, zu mir zurückkehren. Aber wird/sollte dies den Prozess nicht ineffizient machen? Jedes Mal, wenn Gas eingefüllt wird, kommt das zurück, was nicht verbraucht wird. Klingt für mich nicht nach einer guten Lösung, sondern eher nach einem Workaround, was meint ihr?
Ich würde Sie gerne einholen, vorausgesetzt, Sie sind in Bangalore, schätze ich? Ihr FB/Twitter-Profil, wenn Sie denken, dass wir aufholen können? Ich bin bei Twitter: @abhinavpraksh
Gemäß dem Verständnis schafft das Festlegen des Gaslimits einen Gaspool, aus dem das Gas so viel verwendet wird, wie es ein Vertrag während der Ausführung erfordert, und wirft einen Fehler, wenn es die maximale Menge erreicht. Also ich glaube nicht, dass es einen Overhead gibt. Außerdem ist Benzin in testrpc kostenlos :).. (@kabhishekora)
Ja, stimmt, in diesem Fall wäre es wahrscheinlich besser, diese Grenze in der Truffle-Konfiguration selbst festzulegen, oder? Würde es später abdecken. Stack schlug mir vor, die Diskussion in den Chat zu verschieben.