Solidity

虛擬機錯誤:還原。revert 事務已恢復到初始狀態。注意:被呼叫的函式應該是應付的,如果

  • August 23, 2021

嗨伙計們👋

我有兩個聯繫人,第一個是 SubToken,第二個是 MainContract。

首先我部署 MainContract,然後我使用 createNewContract 函式並創建新的 SubToken。

進而

我使用來自我的 MainContract 中的創建合約功能的地址部署 SubToken。

我想訪問我的名字,並為此在 SubToken 契約中創建了一些函式,但我看到了還原錯誤:(

虛擬機錯誤:還原。revert 事務已恢復到初始狀態。注意:如果您發送值並且您發送的值應該小於您目前的餘額,則呼叫的函式應該是應付的。調試事務以獲取更多資訊。

我不知道我該怎麼做。任何人都可以幫助我:)

這是我的程式碼的幾個ss:

https://eksiup.com/p/aj79538kzmgp

https://eksiup.com/p/w779539wzqmc

https://eksiup.com/p/9t79541aevh6

pragma solidity ^0.5.0; 
import 'https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/SafeMath.sol'; 

contract SubToken{ 
   MainContract mc;

   constructor(address _address) public{  
      mc=MainContract(_address);

   }  

   function getName1() view public returns(string memory){
       return mc.getNameMain(address(this));
   }



   //function transferFrom(address from, address to, uint tokens) public returns (bool success); 
   //function allowance(address tokenOwner, address spender) public view returns (uint remaining);  
   //function transfer(address to, uint tokens) public returns (bool success) ;  
   //function approve(address spender, uint tokens) public returns (bool success);  
   //function transferFrom(address from, address to, uint tokens) public returns (bool success);  

   event Transfer(address indexed from, address indexed to, uint tokens); 
   event Approval(address indexed tokenOwner, address indexed spender, uint tokens); 

} 
contract MainContract {
   //mapping(address => mapping(address=>uint)) balances;

   //mapping(address => mapping(address => uint)) allowed;

   address[] public contracts;

   using SafeMath for uint;

   address contract_address;

   struct token{ 
       string  name; 
       string   symbol; 
       uint8  decimals; 
       uint  totalSupply; 
       uint balances;
   } 
   mapping(address => token) public tokens;

   address mycontraddress;

   function createNewContract(string memory _name,string memory _symbol,uint8 _decimals,uint256 _totalSupply,uint _balance) public returns(address youraddress){ 
       SubToken st = new SubToken(address(this));//address(this)
       tokens[address(st)] = token(_name,_symbol,_decimals,_totalSupply,_balance);
       mycontraddress=address(st);
       return mycontraddress;
   } 
   function seeContracttAddress() public view returns(address){
       return mycontraddress;
   }

   function getNameMain(address _address) public view returns(string memory){
       return tokens[_address].name;
   }

   event Transfer(address indexed _from, address indexed _to, uint256 _value);
   event Approval(address indexed _owner, address indexed _spender, uint256 _value);

}

問題不在於您的程式碼。問題是發出交易的順序。您應該遵循以下步驟:

  1. 部署MainContract
  2. 發出createNewContract並獲取部署的SubToken Contract 的返回地址。

** 注意這個地址是在createNewContract方法中部署的SubToken合約的地址。您無需再次部署SubToken。 3. 使用步驟 2 中檢索到的地址獲取SubToken Contract 的實例。 4. 呼叫步驟3的SubToken Contract實例的getName1 ()方法。

問題是您再次部署SubToken Contract 並呼叫getName1 ()。在getName1 () 中,您呼叫了 mc.getNameMain(address(this)); 您作為參數傳遞的地址尚未映射到MainContract的****令牌中。因此,由於該地址沒有條目,因此引發了錯誤。

引用自:https://ethereum.stackexchange.com/questions/73969