matriz de estructura dinámica de solidez

cuando desarrollo mi contrato inteligente con solidez, me encuentro con un problema. Y debajo está mi código de solidez.

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);
        }
    }
}
}

La pregunta es cuándo quiero llamar a registerUser y cuando uso web3.js llamando a registerContract.methods.registerUser(name,ethaddress,contractaddress) Se produce un error en la consola geth. el error es

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": {} }falso, "a": "0xc249fa432a1c659e7aa4ad57e24e405215461afa", "transactionHash": "0xb52e0fabe160070597bd40192658b6f84779d52d4b295b39295d381eb0856f2d", "transactionIndex": 0, "transactionIndex":falso, "a": "0xc249fa432a1c659e7aa4ad57e24e405215461afa", "transactionHash": "0xb52e0fabe160070597bd40192658b6f84779d52d4b295b39295d381eb0856f2d", "transactionIndex": 0, "transactionIndex":

¿Hay algún problema cuando me dirigí a struct User y array push? ¿O hay algún problema del que no estaba al tanto en el momento en que lo desarrollé?

¿Ha comprobado si el msg.sender es el propietario? Puede ser debido al modificador checkOwner(). Tal vez esté enviando la transacción desde un usuario que no sea el propietario.
Sería mejor compartir su código de ejecución, porque el contrato se ve bien (lo he comprobado a través de Remix, funciona)
Esto no proporciona una respuesta a la pregunta. Una vez que tenga suficiente reputación, podrá comentar cualquier publicación ; en su lugar, proporcione respuestas que no requieran aclaración por parte del autor de la pregunta . - De la revisión
@vhie sí, lo he comprobado. También ejecuto con éxito en remix, pero no sé por qué no puedo ejecutar normalmente en mi propio entorno
Es cierto que esto no se trata de la pregunta del OP. Creo que vale la pena mencionar que este enfoque simplemente fallará cuando haya demasiados usuarios. El problema tiene sus raíces en la estructura de datos y se manifiesta en los forbucles ilimitados, que es un antipatrón muy conocido.
¿Ha intentado aumentar el límite de gas como la respuesta sugerida a continuación? También puede ayudar poner cómo ejecuta el método en su entorno.
@vhie gracias por la ayuda, ya resolví mi problema, el problema es realmente sobre el límite de gas. Después de llamar a Mycontract.methods.Mymethod().estimateGas() y configurar el límite de gas en el método de envío, y resuelvo el problema

Respuestas (1)

Mi suposición es que está configurando el límite de gas demasiado bajo: intente aumentarlo de 90000 a 1000000 y vea si la transacción se lleva a cabo.

El razonamiento es que si estaba fallando debido a:
require(msg.sender == owner);
vería que la función consumía menos gas (ya que este es el primer código que se ejecuta, y require reembolsará el gas no utilizado). El hecho de que esté usando toda su asignación de gasolina de 90,000 implica que o está golpeando una afirmación (que no tiene) o se está quedando sin gasolina.

Gracias, el problema realmente está en el gas, encontré que mi código solo llama a Mycontract.methods.Mymethod().send() pero no doy ningún parámetro para indicar cuánto gas se debe consumir. Por cierto, ¿sabe si no configuro el límite de gas, cuál es el límite de gas predeterminado sin ningún gas específico?
Para truffle, el límite de gas predeterminado se puede definir en truffle.js: