以太坊合约,运行功能会破坏合约成员

时间:2018-07-13 05:39:53

标签: solidity

我做了一个简单的合约,存储以太坊,然后可以发送以太坊。发送以太币的功能要求只有合同的所有者才能从合同中发送以太币。

该合同神秘地未能在第一个之后的每个后续调用中发送以太币。

我创建了一个函数来检索合同中的所有者地址值,结果发现,在第一个函数调用之后,它将数据更改为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;
}

1 个答案:

答案 0 :(得分:0)

我假设编译器在行MoneyTransfer newTransfer;上警告您有关将数据隐式存储在storage中。如果您明确使用MoneyTransfer storage newTransfer;,则会收到警告,提示您正在使用未初始化的存储引用。这意味着您在newTransfer中输入的任何值都将覆盖前几个存储插槽中的任何值。

改为使用MoneyTransfer memory newTransfer;