错误:事务已恢复为初始状态

时间:2019-04-10 07:49:53

标签: solidity tron

我在 solidity 中有以下代码。

pragma solidity ^0.5.2;


contract Image{

    struct User {
    uint32 pixelsPainted;
    uint32 pixelsOwned;
    uint balance;
    uint earning;
    uint referrerAward;
    uint bonusCollected;
    uint bonusMask;
    uint bonusSettled;
    address referrer;
  }

  struct Pixel {
    address owner;
    //uint32 color;
    uint price;
  }

  struct PaintLog {
    address user;
    uint price;
    bytes32 coordinate;
    //uint32 color;
  }

  uint32 constant public activatePixelThreshold = 80000;
  uint constant public lastStageIncomeThreshold = 10000000000;
  uint32 constant public lastStageDuratio = 28800;
  uint constant public defaultPrice = 20000000;
  uint8 constant public incrementRate = 35;
  uint8 constant public potRatio = 10;
  uint8 constant public referrerRatio = 5;
  uint8 constant public feeRatio = 25;

  uint8 public stage;
  uint public endTime;
  uint public lastStageIncome;
  address public lastPainter;
  uint public lastPaintedAt;
  uint public bonusIndex;
  uint32 public allPixelsPainted;
  uint public grossIncome;
  uint public teamBalance;
  uint public marketValue;
  uint public finalPotAmount;
  uint8 public bonusRatio;
  uint8 public teamRatio;


  mapping(address=>imagestruct) public images;
  mapping(address => User) users;
  mapping(bytes32 => Pixel) pixels;
  PaintLog[] public logs;

   struct imagestruct{
      address adr;
      string imageHash;
   }

   function uploadImage(string memory hash) public{
       imagestruct memory img = imagestruct(msg.sender,hash);
       images[msg.sender]=img; //
   }

   function updateOwnerInfo(address addr, uint _balance, uint _earning, uint _bonus) public {
    User storage user = users[addr];
    user.balance += _balance;
    user.earning += _earning;
    user.bonusSettled += _bonus;
    user.pixelsOwned--;
  }

  function stringToBytes32(string memory source) public pure returns (bytes32 result) {
        assembly {
        result := mload(add(source, 32))
        }
        return result;
    }


  function buyImageTest(string memory ImageToBuy) public payable returns (uint32) {

    bytes32 input = stringToBytes32(ImageToBuy);

    uint totalSpent = 0;
    uint totalFees = 0;
    uint32 successCount = 0;
    User storage u = users[msg.sender];
    for (uint32 i = 0; i < input.length - 1; i += 2) {
      bytes32 coordinate = input[i];
      //uint32 color = pixelsToBuy[i+1];
      Pixel storage p = pixels[coordinate];
      if (p.owner == address(0)) {
          // blank pixel, no owner
        if (msg.value < totalSpent + defaultPrice) {
            break;
        }
        totalSpent += defaultPrice;
        totalFees += defaultPrice;
        marketValue += defaultPrice;
        p.owner = msg.sender;
        //p.color = color;
        p.price = defaultPrice;
        allPixelsPainted++;
        u.pixelsOwned++;
        logs.push(PaintLog(msg.sender, defaultPrice, coordinate));
      } else {
        // uint increment = SafeMath.div(SafeMath.mul(price, incrementRate), 100);
        uint increment = p.price * incrementRate / 100; 
        uint newPrice = p.price + increment;
        if (msg.value < totalSpent + newPrice) {
          break;
        }
        totalSpent += newPrice;
        totalFees += increment * feeRatio / 100;
        marketValue += increment;

        uint ownerEarning = increment * (100 - feeRatio) / 100;
        updateOwnerInfo(p.owner, p.price + ownerEarning, ownerEarning, bonusIndex);

        u.pixelsOwned++;
        //p.color = color;
        p.price = newPrice;
        p.owner = msg.sender;
        logs.push(PaintLog(msg.sender, newPrice, coordinate));
      }
      successCount++;
    }
    require(successCount > 0);
    if (msg.value > totalSpent) {
      u.balance += (msg.value - totalSpent);
    }
    if (successCount > 0) {
      if (stage == 0) {
        if (block.number >= endTime) {
          // trigger pot
          finalPotAmount = grossIncome * potRatio / 100;
          users[lastPainter].balance += finalPotAmount;
          bonusRatio += potRatio;
          stage = 1;
        } else {
          lastStageIncome += totalFees;
          if (lastStageIncome >= lastStageIncomeThreshold) {
            endTime = block.number + lastStageDuratio;
            lastStageIncome = 0;
          }
          lastPaintedAt = block.number;
          lastPainter = msg.sender;
        }
      }
      grossIncome += totalFees;
      u.pixelsPainted += successCount;
      u.bonusMask += (bonusIndex * successCount);
      bonusIndex += (totalFees * bonusRatio / 100 / allPixelsPainted);
      if (u.referrer != address(0)) {
        //updateReferrerAward(u.referrer, totalFees * referrerRatio / 100);
        teamBalance += (totalFees * (teamRatio - referrerRatio) / 100);
      } else {
        teamBalance += (totalFees * teamRatio / 100);
      }
    }
    return successCount;
  }

}

我只是在学习并尝试使用Tron像素之类的代码来发送图像哈希。当我尝试通过传递参数一些字符串在remix IDE中运行 buyImageTest 时,它给出了以下错误:

  

交易到Image.buyImageTest错误:VM错误:恢复。还原   交易已恢复为初始状态。注意:   如果您发送值,则应向构造函数付款。调试交易   以获得更多信息。

有人可以帮我吗?

0 个答案:

没有答案