solidity dynamisches Struct-Array

Wenn ich meinen Smart Contract solide entwickle, stoße ich auf ein Problem. Und unten ist mein Soliditätscode.

pragma solidity ^0.4.0;

contract RegisterContract{

event setNewUser(bytes32 name,address etherAddr, address contractAddr,uint now);
address owner;
struct User{
    bytes32 name;
    address etherAddr;
    address contractAddr;
}
User[] private users;

constructor() public{
    owner = msg.sender;
}
modifier checkOwner(){
    require(msg.sender == owner);
    _;
}
function getOwner() public view returns (address){
    return owner;
}
// for a new user create a contract 
function registerUser(bytes32 name,address etherAddr, address contractAddr) public checkOwner{
    User memory newUser;
    newUser.name = name;
    newUser.etherAddr = etherAddr;
    newUser.contractAddr = contractAddr;
    users.push(newUser);
    emit setNewUser(name,etherAddr,contractAddr,now);
}
// 
function setAddress(bytes32 name,address etherAddr, address contractAddr) public checkOwner{
    for(uint8 i=0;i<users.length;i++){
        if(users[i].name==name){
            users[i].etherAddr=etherAddr;
            users[i].contractAddr=contractAddr;
        }
    }
}
// when systems assess all user
function getUsers() public checkOwner view returns (bytes32[],address[],address[]) {
    bytes32[] memory names= new bytes32[](users.length);
    address[] memory etherAddr = new address[](users.length);
    address[] memory contractAddr = new address[](users.length);
    for(uint8 i=0;i<users.length;i++){
        names[i]= users[i].name;
        etherAddr[i] = users[i].etherAddr;
        contractAddr[i] = users[i].contractAddr;
    }
    return (names,etherAddr,contractAddr);
}
//for a user who import contract 
function getContractAddress(address etherAddr) public checkOwner view returns (bytes32,address) {
    for(uint8 i=0;i<users.length;i++){
        if(users[i].etherAddr==etherAddr){
            return (users[i].name,users[i].contractAddr);
        }
    }
}
}

Die Frage ist, wann ich registerUser aufrufen möchte und wenn ich mit web3.js registerContract.methods.registerUser(name,etheraddress,contractaddress) aufrufe . Es wird ein Fehler auf der Geth-Konsole ausgegeben. Der Fehler ist

Error: Transaction has been reverted by the EVM: { "blockHash": "0x45fe755c8c1f600108b55a12fa3bdf59dac0fe76d39883f23d15b2f9603d868d", "blockNumber": 22339, "contractAddress": null, "cumulativeGasUsed": 90000, "from": "0x5869c2317ce2df31cb1269d8028e9062ff470749", "gasUsed": 90000 , "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "status": false, "to": "0xc249fa432a1c659e7aa4ad57e24e405215461afa", "transactionHash": "0xb52e0fabe160070597bd40192658b6f84779d52d4b295b39295d381eb0856f2d", "transactionIndex": 0, "events": {} }false, "to": "0xc249fa432a1c659e7aa4ad57e24e405215461afa", "transactionHash": "0xb52e0fabe160070597bd40192658b6f84779d52d4b295b39295d381eb0856f2d", "transactionIndexs": {0,} "event}false, "to": "0xc249fa432a1c659e7aa4ad57e24e405215461afa", "transactionHash": "0xb52e0fabe160070597bd40192658b6f84779d52d4b295b39295d381eb0856f2d", "transactionIndexs": {0,} "event}

Ist etwas falsch, wenn ich struct User und array push angesprochen habe? Oder gibt es Probleme, die mir zum Zeitpunkt der Entwicklung nicht bewusst waren?

Haben Sie überprüft, ob der msg.sender der Eigentümer ist? Es könnte am Modifikator checkOwner() liegen. Möglicherweise senden Sie die Transaktion von einem anderen Benutzer als dem Eigentümer.
Es wäre besser, Ihren Ausführungscode zu teilen, da der Vertrag in Ordnung aussieht (ich habe es über Remix überprüft, es funktioniert)
Damit ist die Frage nicht beantwortet. Sobald Sie über einen ausreichenden Ruf verfügen , können Sie jeden Beitrag kommentieren . Geben Sie stattdessen Antworten an, die keine Klärung durch den Fragesteller erfordern . - Aus Bewertung
@vhie ja, ich habe es überprüft. Ich laufe auch erfolgreich in Remix, aber ich weiß nicht, warum ich in meiner eigenen Umgebung nicht normal laufen kann
Hier geht es zugegebenermaßen nicht um die Frage des OP. Ich denke, es muss erwähnt werden, dass dieser Ansatz einfach scheitern wird, wenn es zu viele Benutzer gibt. Das Problem ist in der Datenstruktur verwurzelt und manifestiert sich in den unbegrenzten forSchleifen, die ein bekanntes Anti-Muster sind.
Haben Sie versucht, das Gaslimit wie die vorgeschlagene Antwort unten zu erhöhen? Es kann auch hilfreich sein, festzulegen, wie Sie die Methode in Ihrer Umgebung ausführen.
@vhie danke für die Hilfe, ich habe mein Problem bereits gelöst, das Problem dreht sich wirklich um das Gaslimit. Nachdem ich Mycontract.methods.Mymethod().estimateGas() aufgerufen und das Gaslimit in der send-Methode eingerichtet habe, löse ich das Problem

Antworten (1)

Ich vermute, dass Sie das Gaslimit zu niedrig eingestellt haben – versuchen Sie es von 90000 auf 1000000 zu erhöhen und sehen Sie, ob die Transaktion durchgeht.

Der Grund dafür ist, dass, wenn es aus folgenden Gründen fehlschlägt,
require(msg.sender == owner);
weniger Gas von der Funktion verbraucht wird (da dies der erste Code ist, der ausgeführt wird, und require ungenutztes Gas zurückerstattet). Die Tatsache, dass Sie Ihre gesamte Gasreserve von 90.000 aufbrauchen, impliziert, dass Sie entweder einen Assertion treffen (den Sie nicht haben) oder dass Ihnen das Benzin ausgeht.

Danke, das Problem liegt wirklich im Gas, ich fand, dass mein Code nur Mycontract.methods.Mymethod().send() aufruft , aber ich gebe keinen Parameter an, um zu zeigen, wie viel Gas verbraucht werden soll. Übrigens, wissen Sie, wenn ich kein Gaslimit einrichte, was ist das Standard-Gaslimit ohne ein bestimmtes spezifisches Gas?
Für Trüffel kann das Standardgaslimit in truffle.js definiert werden: