我做了一个简单的合约,存储以太坊,然后可以发送以太坊。发送以太币的功能要求只有合同的所有者才能从合同中发送以太币。
该合同神秘地未能在第一个之后的每个后续调用中发送以太币。
我创建了一个函数来检索合同中的所有者地址值,结果发现,在第一个函数调用之后,它将数据更改为0x000000000000000000000000000000000000000a
发送功能:
function SendToAddress (uint8 amt, address adr) isOwner {
/* Have we transferred over the maximum amount in
the last 24 hours? */
if ((now - dayStartTime) >= secondsInADay) {
dayStartTime = now;
curDayTransfer = 0;
}
if ((curDayTransfer + amt) < dayMaxTransfer) {
adr.transfer (amt);
walletBalance -= amt;
curDayTransfer += amt;
MoneyTransfer newTransfer;
newTransfer.amount = amt;
newTransfer.target = adr;
newTransfer.timeStamp = now;
if (transferHistory.length == 100) {
// Shift all of the transactions in the history list forward
// to make space for the transaction.
for (uint8 i = 1; i < 100; i++) {
transferHistory[i] = transferHistory[i-1];
}
transferHistory[0] = newTransfer;
} else {
transferHistory.push (newTransfer);
}
}
}
isOwner修饰符:
modifier isOwner() {
require(msg.sender == creatorAddress);
_;
}
构造函数:
constructor () public {
creatorAddress = msg.sender;
}
答案 0 :(得分:0)
我假设编译器在行MoneyTransfer newTransfer;
上警告您有关将数据隐式存储在storage
中。如果您明确使用MoneyTransfer storage newTransfer;
,则会收到警告,提示您正在使用未初始化的存储引用。这意味着您在newTransfer
中输入的任何值都将覆盖前几个存储插槽中的任何值。
改为使用MoneyTransfer memory newTransfer;
。