Tokens
所需氣體超過限額 (8000029) 或交易總是失敗
執行此功能時,我收到一個錯誤,
gas required exceeds allowance (8000029) or always failing transaction
我知道使用transferFrom
功能時會出現此錯誤。我哪裡錯了?請幫幫我。謝謝。編輯:
walletOfGoods[msg.sender][_nameOfgood].price
它是 struct 的元素, typeuint
。walletOfGoods
這是我節省商品數量的結構。結構包含是uint amounOfgood
和uint 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。