以太坊合约,运行 一个函数腐蚀了合约成员

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;