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?
Abgesehen von Bedenken hinsichtlich des Inhalts von Daten und der Wahl, alles als Zeichenfolge umzuwandeln, gibt es ein paar Dinge zu überprüfen/auszuprobieren.
generateId
Funktion ist verdächtig und wird nicht angezeigt.{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 gasLimit
braucht mehr Erklärung. Dies ist eine Netzwerk-Eigenschaft, über die die Miner abgestimmt haben. In der ganache-cli
Simulation 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 gasLimit
ist 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;
}
}
anuyog
anuyog
Rob Hitchens
constant
habe anpure
einer Stelle gewechselt und die geändertpragma
, 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.