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?
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.
generateId
función es sospechosa y no se muestra.{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 gasLimit
necesita más explicación. Esta es una propiedad de red votada por los mineros. En la ganache-cli
simulació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 gasLimit
bueno 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;
}
}
anuyog
anuyog
Rob Hitchens
constant
apure
en un lugar y cambiépragma
a 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.