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
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 .
name = "name"
und zu geben email = "email@email.com"
und das Gaslimit zu erhöhen$("id").val(), $("name").val(), $("email").val(), $("comment").val()
Sie sie in der Konsole protokolliert haben?
Wald
Ismael
createCard
undefiniert ist, und daher glaubt web3, dass er weniger Parameter als erwartet hat.