有时我会在以太坊智能合约

时间:2017-11-11 17:05:41

标签: ethereum solidity metamask

我在智能合约中发现了一个奇怪的问题。我使用testrpc(v4.1.3)和最后一个MetaMask作为本地开发环境。 请看下面的代码(它是短版本,只是有问题的地方):

struct PayRecord {
    address sender;
    uint256 sum;
    uint256 blockNumber;
    uint256 status;
}

event PaymentPlaced(address senderAddress, uint256 blockNumber, uint256 payIndex, string guid);

PayRecord[] public payments;

function payForSomething(string guid) payable {
    uint256 newLength = payments.push(PayRecord(msg.sender, msg.value, block.number, 0));
    PaymentPlaced(msg.sender, block.number, newLength-1, guid);
}

function changeSomething(uint256 paymentIndex) {
    if(payments[paymentIndex].status == 0){
        payments[paymentIndex].status == 1;
    }
}

通常一切正常:

  1. 用户调用函数payForSomething()
  2. 用户在浏览器中获取事件PaymentPlaced
  3. 用户调用changeSomething()
  4. 但是...

    有时我有下一个问题:

    1. 用户调用payForSomething()
    2. 用户获取事件PaymentPlaced(例如:blockNumber = 10,payIndex = 5)。
    3. 用户调用changeSomething() - 并获取错误“无效操作码”
    4. 如果用户再次调用payForSomething() - 他会使用数据获取事件PaymentPlaced(blockNumber == 15,payIndex = 5)
    5. 相同的数组长度,不同的块编号,两个插入事件......

      所以...有时它会发生,有时候一切正常。我总是只有一个用户,只有我使用这个智能合约(我还在开发它)。

      为什么我会丢失数组中的项目?

0 个答案:

没有答案