Ethereum 有时我会在以太坊智能合约中丢失阵列项目

Ethereum 有时我会在以太坊智能合约中丢失阵列项目,ethereum,solidity,metamask,Ethereum,Solidity,Metamask,我在智能合约中发现了一个奇怪的问题。我使用testrpc(v4.1.3)和最后一个元掩码作为本地开发环境。 请参阅下面的代码(这是一个简短的版本,只是有问题的地方): 通常,一切正常: 用户调用函数payForSomething() 用户获取放置在浏览器中的事件付款 用户调用changeSomething() 但是 有时我会遇到下一个问题: 用户调用payForSomething() 用户获取事件PaymentPlaced(例如:blockNumber=10,payIndex=5) 用户调用ch

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

通常,一切正常:

  • 用户调用函数payForSomething()
  • 用户获取放置在浏览器中的事件付款
  • 用户调用changeSomething()
  • 但是

    有时我会遇到下一个问题:

  • 用户调用payForSomething()
  • 用户获取事件PaymentPlaced(例如:blockNumber=10,payIndex=5)
  • 用户调用changeSomething()-并获取错误“无效操作码”
  • 如果用户再次调用payForSomething(),他将获得事件PaymentPlaced和数据(blockNumber==15,payIndex=5)
  • 相同的数组长度、不同的块号、两个插入事件

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


    为什么我会丢失阵列中的物品?

    这个问题太复杂还是太愚蠢?这个问题太复杂还是太愚蠢?
    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;
        }
    }