如何在不覆盖 Solidity 中先前数据的情况下通过映射跟踪交易?

How to track transactions with mapping without overwriting previous data in Solidity?

我正在尝试记录任何地址完成的所有交易细节,如下所示:

contract GetPayment {

    struct Payment {
        uint amount;
        uint timestamp;
    }

    mapping(address => Payment) public mainMap;

    function pay() public payable {
    mainMap[msg.sender].amount = msg.value;
    mainMap[msg.sender].timestamp = now;
    }
}

此代码的问题在于,每次 msg.sender 进行新交易时,它都会覆盖以前的数据。

如何保存数据而不覆盖之前的数据?

也许您想使用动态支付数组的映射并在每次进行支付时推送新的支付?

mapping(address => Payment[]) public mainMap;

function pay() public payable {
    Payment[] storage payment = mainMap[msg.sender];
    payment.push(Payment({amount: msg.value, timestamp: block.timestamp}));
    mainMap[msg.sender] = payment;
}

也就是说如果你想在合约中访问它。

否则,如果你想在前端使用它,你可以使用带有地址不可错元素的事件来解析它。