我在我的智能合约中发现了奇怪的问题。我使用 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;
}
}
通常一切正常:
- 用户调用函数 payForSomething()
- 用户在浏览器中获取事件 PaymentPlaced
- 用户调用 changeSomething()
但...
有时我有下一个问题:
- 用户调用 payForSomething()
- 用户获取事件 PaymentPlaced(例如:blockNumber = 10,payIndex = 5)。
- 用户调用 changeSomething() - 并得到错误“无效的操作码”
- 如果用户再次调用 payForSomething() - 他会收到事件 PaymentPlaced 和数据 (blockNumber == 15, payIndex = 5)
相同的数组长度,不同的块号,两个插入事件……
所以......有时会发生,有时一切正常。我总是只有一个用户,只有我使用这个智能合约(我还在开发它)。
为什么我会丢失数组中的项目?