Fehler beim Bereitstellen eines Vertrags mit einer Struktur mit vielen Zeichenfolgen

Ich verwende Trüffel mit Ganache und MetaMask. Ich habe eine Struktur in meinem Vertrag, die viele Felder als String-Datentyp enthält

struct User {
        string firstName;
        string lastName 
        string dateOfBirth;
        string addressOfUser;
        string emailId;
        string password;
    }  
mapping (string => User) registeredUsers;  
function registerUser(string _firstName, string _lastName,string _dateOfBirth, string _addressOfUser, string _emailId, string _password) public returns (string) {
        totalRegisteredUsers++;
        string memory userId = generateId(_firstName, _lastName);
        registeredUsers[userId] = User(_firstName, _lastName, _dateOfBirth, _addressOfUser, _emailId,  _password);
        return userId;
    }

Im Frontend-Code habe ich ein Formular, das diese Details eingibt und dann die Methode registerUser des Vertrags aufruft

register: function() {
    let firstName = $("#first-name").val();
    let lastName = $("#last-name").val();
    let dob = $("#date-of-birth").val();
    let address = $("#address").val();
    let emailId = $("#email-id").val();
    let password = $("#password").val();
    App.contracts.Identity.deployed().then(function(instance) {
      instance.registerUser.call(firstName, lastName, dob, address, emailId, password).then(function(userId) {
        $("#user-id").html("User id is : " + userId);
      });
    });
  }
</code>

When i try to run this, I always get the following error : 
<code> 
Uncaught (in promise) Error: Invalid JSON RPC response: {"id":2,"jsonrpc":"2.0","error":{"code":-32603}}
    at Object.InvalidResponse (inpage.js:445)
    at inpage.js:445
    at inpage.js:336
    at inpage.js:18
    at u (inpage.js:18)
    at inpage.js:18
    at inpage.js:18
    at a (inpage.js:18)
    at c (inpage.js:18)
    at inpage.js:18

Wenn ich jedoch die Struktur so ändere, dass sie nur ein Zeichenfolgenfeld enthält, sagen wir

struct User {
        string firstName;
    }

Es funktioniert einwandfrei und die Benutzer-ID wird korrekt angezeigt. Liegt dieses Problem daran, dass die Vertragsgröße zu groß wird?

Antworten (1)

Abgesehen von Bedenken hinsichtlich des Inhalts von Daten und der Wahl, alles als Zeichenfolge umzuwandeln, gibt es ein paar Dinge zu überprüfen/auszuprobieren.

  1. Sie scheinen im Budget zu sein, aber kurz vor dem ABI. Ihr Maximum sind 16 feste Länge oder 8 Saiten (weil sie für 2 zählen).
  2. Die generateIdFunktion ist verdächtig und wird nicht angezeigt.
  3. Es ist bekannt, dass die Gasschätzung fehlschlägt, daher müssen Sie möglicherweise das Gas auf der Clientseite mit erhöhen {gas: 5000000}. Es ist nützlich und explorativ, es hoch zu heben (nicht über das Netzwerk hinaus gaslimit), um zu bestätigen, dass es sich um einen Faktor handelt, und dann von dort aus zu kalibrieren, wenn Sie auf dem richtigen Weg sind.

Das Netzwerk gasLimitbraucht mehr Erklärung. Dies ist eine Netzwerk-Eigenschaft, über die die Miner abgestimmt haben. In der ganache-cliSimulation wird standardmäßig ein konservativer Wert von 3.000.000 verwendet. Das reicht vielleicht nicht. Sie können dies mit einem Befehlszeilenparameter erhöhen. $ ganache-cli -l 7000000- 7 Millionen.

Es gasLimitist gut, das Problem auszuschließen, damit Sie wissen, ob es sich bei Ihrem Problem um Transaktionskosten, Logik im Vertrag oder die Art und Weise handelt, wie Sie es nennen.

Wenn die Kosten nicht das Problem zu sein scheinen, würde ich es als Nächstes in Remix laden und sicherstellen, dass der Vertrag selbst wie erwartet funktioniert und Werte zurückgibt. Wenn diese beiden Dinge aus dem Weg geräumt sind, können Sie sich darauf konzentrieren, wie der Kunde damit interagiert.

Ich hoffe es hilft.

AKTUALISIEREN

Hier ist eine bereinigte Version, die mehrere Bedenken hinsichtlich des Vertragsstils anspricht.

pragma solidity 0.5.1;

contract Stringy {

    struct User {
        bytes32 firstName;
        bytes32 lastName;
        uint dateOfBirth;
        bytes32 email;
    } 

    mapping (address => User) registeredUsers;  // address is the natural key to use
    address[] public userAddressList;

    event LogNewUser(address user, bytes32 firstName, bytes32 lastName, uint dateOfBirth, bytes32 email);

    function isUser(address user) public view returns(bool isIndeed) {
        return(registeredUsers[user].dateOfBirth > 0);
    }

    function registerUser(bytes32 _firstName, bytes32 _lastName, uint _dateOfBirth, bytes32 _email) public returns (bool success) {
        require(!isUser(msg.sender));
        require(_firstName != 0x0);
        require(_lastName != 0x0);
        require(_dateOfBirth > 0);
        require(_email > 0x0);

        registeredUsers[msg.sender] = User(_firstName, _lastName, _dateOfBirth, _email);
        userAddressList.push(msg.sender);
        emit LogNewUser(msg.sender, _firstName, _lastName, _dateOfBirth, _email);
        return true;
    }

}
Hallo Rob. Vielen Dank für Ihre Hilfe. Ich habe das Gas in truffle.js auf 6000000 erhöht, aber der Fehler bleibt bestehen. Auch wenn ich mit dem Vertrag über die Truffle-Konsole interagiere, läuft der Vertrag genau wie beabsichtigt. Das Problem tritt auf, wenn ich über den Browser mit dem Vertrag interagiere.
Hier ist der gesamte Code github.com/anuyog1004/EthIdManagement
Der Vertrag scheint in Ordnung zu sein. Ich constanthabe an pureeiner Stelle gewechselt und die geändert pragma, um keine zu haben, ^was ich empfehlen würde. Diese Optimierungen beseitigen nur Warnungen und Unsicherheiten. Die Gaskosten für den Einsatz betragen nur 1,8 Millionen. Wenn Sie sagen, dass die Probleme nur beim Zugriff über den Browser auftreten, bin ich mir nicht 100% sicher, was Sie meinen. Die Ganache-GUI ist ziemlich neu und ich bin kein Guru. Möglicherweise suchen Sie ein Problem mit den Werkzeugen selbst. Ich wäre geneigt, eine JS-App mit Konsolenbefehlen zu erstellen, von denen bekannt ist, dass sie funktionieren.