Erstellen einer Transaktion aus einem Webformular – ungültige Anzahl von Argumenten

Ich habe eine HTML-Webseite, auf der ich Benutzereinträge in einen intelligenten Vertrag einfüge, der die Einträge in Transaktionen "speichern" soll. Die Anwendung funktioniert größtenteils, aber ich habe Probleme mit dem Transaktionsaufruf. Ich erhalte immer wieder den Fehler „Ungültige Anzahl von Argumenten“ oder einen Typenkonflikt.

Hier ist der Code des Webformulars:

<form class="form-group" role="form">                   
    <div class="form-group">
        <label for="id">ID:</label>
        <input type="number" class="form-control" id="id" placeholder="123"> 
    </div>
    <br>

    <div class="form-group">
        <label for="name">Name (First and Last:</label>
        <input type="text" class="form-control" id="name" placeholder="John Stamos">
    </div>
    <br>

    <div class="form-group">
        <label for="email">Email Address:</label>
        <input type="email" class="form-control" id="email" placeholder="blockchain@gmail.com">
    </div>
    <br>

    <div class="form-group">
        <label for="comment">Comment:</label>
        <textarea class="form-control" rows="5" id="comment" placeholder="I learned..."></textarea>
    </div>
</form>

Hier ist der Soliditätsvertragscode:

pragma solidity ^0.4.15;

contract simpleStorage {
    struct BizCard {
        uint id;
        bytes32 name;
        bytes32 email;
        string comment;
    }

    //sets counter of cards
    uint public count = 0;

    //creates a map of key values where key is an unsigned int and value is an instance of a card
    mapping (uint => BizCard) cards;

    //creates card object; adds data to the mapping and increments the shadow key count
    function createCard(uint id, bytes32 name, bytes32 email, string comment) {
        cards[count] = BizCard(id, name, email, comment);
        count++;
    }

    //constant method to get card information, does not cost gas or change contract state
    function getCard(uint index) constant returns (uint id, bytes32 name, bytes32 email, string comment) {
        id = cards[index].id;
        name = cards[index].name;    
        email = cards[index].email;
        comment = cards[index].comment;
    }

    function getCardById(uint id) constant returns (uint idRet, bytes32 name, bytes32 email, string comment, uint status) {
        for (var i = 0; i < count; i++) {
            if (cards[i].id == id) {
                idRet = cards[i].id;
                name = cards[i].name;
                email = cards[i].email;
                comment = cards[i].comment;
                return;
            }
        }
    }
}

Hier ist der Javascript-Code über web3:

function createCard() {
    web3.personal.unlockAccount(web3.eth.accounts[0], 'scrubbed');
    var txn = contract_instance.createCard($("id").val(), $("name").val(), $("email").val(), $("comment").val(), { from: web3.eth.accounts[0], gas: 300000 }, function (error, result) {
        if (error) {
            console.log(error);
        } else {
            var txhash = result;
            console.log(result);
            console.log(txn);
        }
    });
}

Ich bin mir zu 99% sicher, dass eines der Probleme darin besteht, dass Eingaben von "Name" und "E-Mail" als Zeichenfolge eingegeben werden, aber der Vertrag nach bytes32 sucht. Ich bin mir nicht sicher, wie ich das syntaktisch umcodieren soll. Es ist auch möglich, dass das Jquery, das ich zum Abrufen der Daten aus dem Formular verwende, nicht funktioniert, aber ich denke, es ist richtig codiert

Uncaught Error: Invalid number of arguments to Solidity function 
at Object.InvalidNumberOfSolidityArgs (web3.min.js:1) 
at c.validateArgs (web3.min.js:1) 
at c.toPayload (web3.min.js:1) 
at c.sendTransaction (web3.min.js:1) 
at c.execute (web3.min.js:1) 
at createCard ((index):52) 
at HTMLButtonElement.onclick ((index):165) 

InvalidNumberOfSolidityArgs @ web3.min.js:1 
c.validateArgs @ web3.min.js:1 
c.toPayload @ web3.min.js:1 
c.sendTransaction @ web3.min.js:1 
c.execute @ web3.min.js:1 
createCard @ (index):52 
onclick @ (index):165
Hier ist die Fehlerinfo: Uncaught Error: Invalid number of arguments to Solidity function at Object.InvalidNumberOfSolidityArgs (web3.min.js:1) at c.validateArgs (web3.min.js:1) at c.toPayload (web3.min .js:1) bei c.sendTransaction (web3.min.js:1) bei c.execute (web3.min.js:1) bei createCard ((index):52) bei HTMLButtonElement.onclick ((index):165 ) InvalidNumberOfSolidityArgs @ web3.min.js:1 c.validateArgs @ web3.min.js:1 c.toPayload @ web3.min.js:1 c.sendTransaction @ web3.min.js:1 c.execute @ web3.min .js:1 createCard @ (Index):52 onclick @ (Index):165
Ich habe Ihre Frage bearbeitet, um den formatierten Fehler hinzuzufügen. Möglicherweise ist er falsch. Bitte überprüfen und bearbeiten Sie ihn. Meine Vermutung ist, dass einer der Werte im Aufruf createCardundefiniert ist, und daher glaubt web3, dass er weniger Parameter als erwartet hat.

Antworten (1)

Wenn Sie bytes32 verwenden, müssen Sie sicherstellen, dass die Größe der übergebenen Werte auf 32 Bytes begrenzt ist. (Sie können einige Front-End-Validierungen verwenden, ich sehe keine Validierung in dem von Ihnen geposteten Code.)

Wenn es nicht garantiert oder praktisch ist, es zu begrenzen, können Sie eine Zeichenfolge beliebiger Länge verwenden.

Eine gute Erklärung, warum und wann bytes32 und string verwendet werden, finden Sie hier .

Danke, ich füge am Ende eine Validierung hinzu - ich werde einige Nachforschungen über die Verwendung von Zeichenfolgen/Bytes anstellen
Hast du den Punkt, wo es schief geht?
Erhalten Sie den gleichen Fehler, wenn Eingaben kürzer als 32 Bytes sind?
Der Fehler wird in der Zeile ausgegeben, in der der Funktionsaufruf aktiviert ist - createCard () ... da ich Zeichenfolgen in die Webformular-Eingabe eingebe, wette ich, dass dies das Problem ist
Ich habe versucht, 0x1231232 in die Formulare einzugeben, und es geht immer noch nicht - also kann die Typanpassung nicht das Problem sein
Versuchen Sie, einfache Zeichenfolgen wie name = "name"und zu geben email = "email@email.com"und das Gaslimit zu erhöhen
Wenn es immer noch nicht funktioniert, posten Sie hier den vollständigen Vertragssoliditätscode.
vollständigen Soliditätscode hinzugefügt
entschuldigen Sie die späte Antwort, haben Sie gerade die Werte überprüft, indem $("id").val(), $("name").val(), $("email").val(), $("comment").val()Sie sie in der Konsole protokolliert haben?
Und überprüfen Sie die ABI-Definition korrekt für den Vertrag
Hast du das gelöst bekommen?