Ich habe Probleme beim Aufrufen des Vertrags über Web 3 js im Browser. Ich verwende Truffle Develop und habe erfolgreich migriert und Tests durchgeführt.
Ich erhalte die Informationen auch, wenn ich die contract.at () console.log;
eventHost.createEvent("testevent1",5,30);
Wenn ich das obige in der Konsole von Chrome ausführe
web3.min.js:2 Uncaught Error: VM Exception while processing transaction: out of gas
at Object.InvalidResponse (web3.min.js:1)
at s.send (web3.min.js:2)
at r.e [as sendTransaction] (web3.min.js:2)
at c.sendTransaction (web3.min.js:2)
at c.execute (web3.min.js:2)
at <anonymous>:1:11
Ich verstehe das
Mein Vertrag Event.sol
contract Event {
uint32 currentMaxNumOfEvents=0;
struct eventDetail{
uint32 eventId;
address eventHost;
string eventName;
uint32 noOfDaysToRegsiter;
uint32 maxMembers;
address[] memberAddress;
}
mapping(uint32 => eventDetail) public events;
function joinEvent(uint32 selectedEventId)public returns (uint32){
for (uint i = 0; i<events[selectedEventId].memberAddress.length; i++) {
assert(events[selectedEventId].memberAddress[i]==msg.sender);
}
require(selectedEventId>=0&&selectedEventId<=currentMaxNumOfEvents);
require(events[selectedEventId].memberAddress.length < events[selectedEventId].maxMembers);
events[selectedEventId].memberAddress.push(msg.sender);
return selectedEventId;
}
function createEvent(string eventName,uint32 noOfdays,uint32 maxMembers) public returns (uint32){
events[currentMaxNumOfEvents].eventId= currentMaxNumOfEvents;
events[currentMaxNumOfEvents].eventHost =msg.sender;
events[currentMaxNumOfEvents].eventName = eventName;
events[currentMaxNumOfEvents].noOfDaysToRegsiter = noOfdays;
events[currentMaxNumOfEvents].maxMembers = maxMembers;
currentMaxNumOfEvents += 1;
return events[currentMaxNumOfEvents].eventId;
}
}
Mein Skript läuft im Browser
if (typeof web3 !== 'undefined') {
web3 = new Web3(web3.currentProvider);
} else {
// set the provider you want from Web3.providers
web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:9545"));
}
web3.eth.defaultAccount = web3.eth.accounts[0];
var contract = web3.eth.contract([{"constant":true,"inputs":[{"name":"","type":"uint32"}],"name":"events","outputs":[{"name":"eventId","type":"uint32"},{"name":"eventHost","type":"address"},{"name":"eventName","type":"string"},{"name":"noOfDaysToRegsiter","type":"uint32"},{"name":"maxMembers","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"selectedEventId","type":"uint32"}],"name":"joinEvent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"eventName","type":"string"},{"name":"noOfdays","type":"uint32"},{"name":"maxMembers","type":"uint32"}],"name":"createEvent","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]);
var eventHost = contract.at('0x345ca3e014aaf5dca488057592ee47305d9b3e10');
console.log(eventHost);
„Kein Gas mehr“ ist ein Fehler, den Sie im Allgemeinen erhalten, wenn es ein Problem mit der Methodenausführung gibt, normalerweise, wenn ein Fehler ausgegeben wird.
Sie müssen zusätzliche Parameter übergeben, um das Konto anzugeben, das die Methode aufruft, und Sie müssen sicherstellen, dass das Konto entsperrt ist und über Ether verfügt, um das Gas abzudecken:
eventHost.createEvent("testevent1",5,30, { from: _account, gas: _gasLimit });
Außerdem sollten Sie ein Gaslimit angeben.
Überprüfen Sie, ob Sie ETH in dem Konto (Adresse) haben, von dem aus Sie die Vertragsfunktion für Gas aufrufen.