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?
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.
vhi
Adler
Richard Horrocks
Hermes Keng
Rob Hitchens
for
Schleifen, die ein bekanntes Anti-Muster sind.vhi
Hermes Keng