Solidity
虛擬機錯誤:還原。revert 事務已恢復到初始狀態。注意:被呼叫的函式應該是應付的,如果
嗨伙計們👋
我有兩個聯繫人,第一個是 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); }
問題不在於您的程式碼。問題是發出交易的順序。您應該遵循以下步驟:
- 部署MainContract
- 發出createNewContract並獲取部署的SubToken Contract 的返回地址。
** 注意這個地址是在createNewContract方法中部署的SubToken合約的地址。您無需再次部署SubToken。 3. 使用步驟 2 中檢索到的地址獲取SubToken Contract 的實例。 4. 呼叫步驟3的SubToken Contract實例的getName1 ()方法。
問題是您再次部署SubToken Contract 並呼叫getName1 ()。在getName1 () 中,您呼叫了 mc.getNameMain(address(this)); 您作為參數傳遞的地址尚未映射到MainContract的****令牌中。因此,由於該地址沒有條目,因此引發了錯誤。