Tokens

所需氣體超過限額 (8000029) 或交易總是失敗

  • March 11, 2020

執行此功能時,我收到一個錯誤,gas required exceeds allowance (8000029) or always failing transaction我知道使用transferFrom功能時會出現此錯誤。我哪裡錯了?請幫幫我。謝謝。

編輯:walletOfGoods[msg.sender][_nameOfgood].price 它是 struct 的元素, type uintwalletOfGoods這是我節省商品數量的結構。結構包含是uint amounOfgooduint price。我使用 ropsten 測試

contract TRC20{
    event Approval(address indexed _owner, address indexed _spender, uint256 value);

    function approve(address _sender, address _spender, uint256 _value) public returns (bool success){
        allowance[_sender][_spender] = _value;
        emit Approval(_sender, _spender, _value);
        return true;

    }
    function transferFrom(address _from, address _to, uint256 _value) public returns(bool success){

        require(_value<= allowance[_from][msg.sender]);
        _transfer(_from, _to, _value);
        return true;
}
   function _transfer(address _from, address _to, uint _value) internal{

      //require(_to!=0x0);
      require(balanceOf[_from]>=_value);
      require(balanceOf[_to] + _value>=balanceOf[_to]);
      uint previousBalances = balanceOf[_from] + balanceOf[_to];

      balanceOf[_from] -= _value;
      balanceOf[_to] +=_value;
      emit Transfer(_from, _to, _value);
      assert(balanceOf[_from]+balanceOf[_to]==previousBalances);

}




function saleOfGoods(string memory _nameOfgood, uint _amountOfgood) public{

  trc20 = TRC20(address(0x235F857D7947b9bC5Dc73f489B70Ef870e6263ed));

  walletOfGoods[msg.sender][_nameOfgood].amountOfgood = walletOfGoods[msg.sender][_nameOfgood].amountOfgood.sub(_amountOfgood);

  trc20.approve(address(0xeBa84a3f7d8d70955bEFF633098D8d6A3a6c18e5), msg.sender, walletOfGoods[msg.sender][_nameOfgood].price);

  // Move to tokens to contract address
  trc20.transferFrom(address(0xeBa84a3f7d8d70955bEFF633098D8d6A3a6c18e5), msg.sender, walletOfGoods[msg.sender][_nameOfgood].price);

  }

假設有兩個合約 TRC20 是一個代幣,而 SaleOfGoods 具有 salesOfGood 功能。

問題出在 saleOfGoods 函式中

function saleOfGoods(string memory _nameOfgood, uint _amountOfgood) public {
  // ....

  trc20.approve(address(0xeBa84a3f7d8d70955bEFF633098D8d6A3a6c18e5), msg.sender, walletOfGoods[msg.sender][_nameOfgood].price);

  // Move to tokens to contract address
  trc20.transferFrom(address(0xeBa84a3f7d8d70955bEFF633098D8d6A3a6c18e5), msg.sender, walletOfGoods[msg.sender][_nameOfgood].price);

}
  • 批准告訴 TRC20 代幣,使用者 (msg.sender) 可以從 0xeBa84a3f7d8d70955bEFF633098D8d6A3a6c18e5 消費代幣。
  • transferFrom 告訴代幣,如果代表 SaleOfGoods 合約將代幣從 0xeBa84a3f7d8d70955bEFF633098D8d6A3a6c18e5 轉移給使用者(msg.sender)。

transferFrom 將失敗,因為 SaleOfGoods 契約尚未獲得授權。

問題是您缺少 ERC20 規範的語義。通常approve和transferFrom不是由同一個賬戶呼叫的。代幣所有者呼叫批准,花費者呼叫 transferFrom。

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