以太坊合约,运行 一个函数腐蚀了合约成员
Ethereum contract, running a function corrupts contract members
我做了一个简单的合约来存储以太币然后发送以太币。发送以太币的功能有一个要求,只有合约的所有者才能从合约中发送以太币。
合同神秘地未能在第一次调用后的每次后续调用中发送以太币。
我创建了一个函数来检索合约中的所有者地址值,结果发现在第一次函数调用后,它将数据更改为 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;
}
我假设编译器在行 MoneyTransfer newTransfer;
上给了你一个关于隐式存储数据到 storage
的警告。如果您明确使用 MoneyTransfer storage newTransfer;
,那么您将收到一条警告,提示您正在使用未初始化的存储引用。这意味着您在 newTransfer
中输入的任何值都将覆盖前几个存储槽中的任何值。
改用MoneyTransfer memory newTransfer;
。
我做了一个简单的合约来存储以太币然后发送以太币。发送以太币的功能有一个要求,只有合约的所有者才能从合约中发送以太币。
合同神秘地未能在第一次调用后的每次后续调用中发送以太币。
我创建了一个函数来检索合约中的所有者地址值,结果发现在第一次函数调用后,它将数据更改为 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;
}
我假设编译器在行 MoneyTransfer newTransfer;
上给了你一个关于隐式存储数据到 storage
的警告。如果您明确使用 MoneyTransfer storage newTransfer;
,那么您将收到一条警告,提示您正在使用未初始化的存储引用。这意味着您在 newTransfer
中输入的任何值都将覆盖前几个存储槽中的任何值。
改用MoneyTransfer memory newTransfer;
。