1

我在我的智能合约中发现了奇怪的问题。我使用 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()

但...

有时我有下一个问题:

  1. 用户调用 payForSomething()
  2. 用户获取事件 PaymentPlaced(例如:blockNumber = 10,payIndex = 5)。
  3. 用户调用 changeSomething() - 并得到错误“无效的操作码”
  4. 如果用户再次调用 payForSomething() - 他会收到事件 PaymentPlaced 和数据 (blockNumber == 15, payIndex = 5)

相同的数组长度,不同的块号,两个插入事件……

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

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

4

0 回答 0