Solidity

在主網上需要的氣體超過限額或總是失敗的交易

  • December 30, 2021

當我嘗試部署契約時,出現錯誤:

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

有聲望。

contract Crowdsale {
 using SafeMath for uint256;

 // The token being sold
 MintableToken public token;

 // start and end timestamps where investments are allowed (both inclusive)
 uint256 public startTime;
 uint256 public endTime;

 // address where funds are collected
 address public wallet;

 // how many token units a buyer gets per wei
 uint256 public rate;

 // amount of raised money in wei
 uint256 public weiRaised;

 /**
  * event for token purchase logging
  * @param purchaser who paid for the tokens
  * @param beneficiary who got the tokens
  * @param value weis paid for purchase
  * @param amount amount of tokens purchased
  */
 event TokenPurchase(address indexed purchaser, address indexed beneficiary, uint256 value, uint256 amount);


 function Crowdsale(uint256 _startTime, uint256 _endTime, uint256 _rate, address _wallet, MintableToken _token) public {
   require(_startTime >= now);
   require(_endTime >= _startTime);
   require(_rate > 0);
   require(_wallet != address(0));
   require(_token != address(0));

   startTime = _startTime;
   endTime = _endTime;
   rate = _rate;
   wallet = _wallet;
   token = _token;
 }

 // fallback function can be used to buy tokens
 function () external payable {
   buyTokens(msg.sender);
 }

 // low level token purchase function
 function buyTokens(address beneficiary) public payable {
   require(beneficiary != address(0));
   require(validPurchase());

   uint256 weiAmount = msg.value;

   // calculate token amount to be created
   uint256 tokens = getTokenAmount(weiAmount);

   // update state
   weiRaised = weiRaised.add(weiAmount);

   token.mint(beneficiary, tokens);
   TokenPurchase(msg.sender, beneficiary, weiAmount, tokens);

   forwardFunds();
 }

 // @return true if crowdsale event has ended
 function hasEnded() public view returns (bool) {
   return now > endTime;
 }

 // Override this method to have a way to add business logic to your crowdsale when buying
 function getTokenAmount(uint256 weiAmount) internal view returns(uint256) {
   return weiAmount.mul(rate);
 }

 // send ether to the fund collection wallet
 // override to create custom fund forwarding mechanisms
 function forwardFunds() internal {
   wallet.transfer(msg.value);
 }

 // @return true if the transaction can buy tokens
 function validPurchase() internal view returns (bool) {
   bool withinPeriod = now >= startTime && now <= endTime;
   bool nonZeroPurchase = msg.value != 0;
   return withinPeriod && nonZeroPurchase;
 }

}

我認為問題在於聲明:

require(_startTime >= now);

僅出於測試目的嘗試now使用特定的 epoch 值進行更改,例如1517784279.

這組有效性檢查需要輸入參數,但沒有提及部署方法。

require(_startTime >= now);
require(_endTime >= _startTime);
require(_rate > 0);
require(_wallet != address(0));
require(_token != address(0));

在建構子中佈置了一系列輸入參數:

function Crowdsale(uint256 _startTime, uint256 _endTime, uint256 _rate, address _wallet, MintableToken _token)

如果輸入不滿足要求的條件,上述任何要求都將導致中止。為了進一步查明問題的確切原因,我們必須查看要部署的命令,以便我們可以調查每個輸入。

同樣值得注意的是,這是 Solidity 的一個古老方言(也是一個古老的問題)。程式碼可能是使用拜占庭之前的編譯器(0.4.21 或更低版本)編譯的,在這種情況下,它可能不會部署在目前的公共區塊鏈上。

希望能幫助到你。

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