Error al implementar un contrato que tiene una estructura con muchas cadenas

Estoy usando Truffle con Ganache y MetaMask. Tengo una estructura en mi contrato que contiene muchos campos como tipo de datos de cadena

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;
    }

En el código front-end, tengo un formulario que ingresa estos detalles y luego llama al método registerUser del contrato

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

Sin embargo, si modifico la estructura para tener solo un campo de cadena, digamos

struct User {
        string firstName;
    }

Funciona perfectamente bien y la identificación del usuario se muestra correctamente. ¿Este problema se debe a que el tamaño del contrato es demasiado grande?

Respuestas (1)

Dejando a un lado las preocupaciones sobre el contenido de los datos y la elección de convertir todo como una cadena, hay algunas cosas que debe verificar/probar.

  1. Parece estar dentro del presupuesto pero cerca de la ABI. Tu máximo es 16 de longitud fija u 8 cuerdas (porque cuentan por 2).
  2. La generateIdfunción es sospechosa y no se muestra.
  3. Se sabe que la estimación de gas falla, por lo que es posible que deba aumentar el nivel de gas en el lado del cliente con {gas: 5000000}. Es útil y exploratorio subirlo alto (no más allá de la red gaslimit) para confirmar que es un factor, y luego calibrar desde allí si estás en el camino correcto.

La red gasLimitnecesita más explicación. Esta es una propiedad de red votada por los mineros. En la ganache-clisimulación, el valor predeterminado es un conservador 3.000.000. Eso puede no ser suficiente. Puede aumentar eso con un parámetro de línea de comando. $ ganache-cli -l 7000000- 7 millones.

Es gasLimitbueno descartar el problema para que pueda saber si su problema es sobre el costo de transacción, la lógica en el contrato o la forma en que lo llama.

Si el costo no parece ser el problema, lo siguiente que haría sería cargarlo en Remix y asegurarme de que el contrato en sí funcione y devuelva los valores esperados. Con esas dos cosas fuera del camino, podría concentrarse en la forma en que el cliente interactúa con él.

Espero eso ayude.

ACTUALIZAR

Aquí hay una versión limpia que aborda múltiples preocupaciones con el estilo del contrato.

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;
    }

}
hola roberto Gracias por su ayuda. Aumenté el gas en truffle.js a 6000000, pero el error aún persiste. Además, si interactúo con el contrato a través de la consola truffle, el contrato se ejecuta exactamente como se esperaba. El problema surge cuando interactúo con el contrato a través del navegador.
Aquí está el código completo github.com/anuyog1004/EthIdManagement
El contrato parece estar bien. Cambié constanta pureen un lugar y cambié pragmaa ninguno ^que recomendaría. Esos ajustes solo limpian las advertencias y la incertidumbre. El costo de gas para implementar es solo 1.8M. Cuando dice que los problemas solo aparecen al acceder a través del navegador, no estoy 100% seguro de lo que quiere decir. El ganache-gui es bastante nuevo y no soy un gurú. Es posible que esté persiguiendo un problema con las herramientas en sí. Me inclinaría por llevar uno que haga una aplicación JS usando comandos de consola que se sabe que funcionan.