简体   繁体   中英

Using the counter as ID - is it a good idea in a smart contract?

I have coded the following to keep track of deposits into a smart contract. I need to be able to reference individual deposits in future functions.

pragma solidity ^0.8.4;

contract DepositsWithIds {
    address owner;

    struct Deposit {
        uint256 depositAmount;
        address depositor;
        uint256 counter;
    }

    constructor() payable {
    owner = msg.sender;
    }
  
    Deposit[] public activeDeposits;

    event DepositMade(address, uint256, uint256);

    function deposit() public payable returns (uint256 counter) {

        return ++counter;

        Deposit memory newDeposit = Deposit(

        msg.value,
        msg.sender,
        counter
    );

    activeDeposits.push(newDeposit);

    emit DepositMade(msg.sender, msg.value, counter);

    }
}

Is it a good idea to use the counter as a unique deposit ID? How would you be able to connect activeDeposits.counter to activeDeposits.depositor when writing the next function?

You could take the counter out of struct:

struct Deposit {
    uint256 depositAmount;
    address depositor;
}

You set the counter as top state variable

uint256 counter;

you could have a mapping that maps the counterId to Deposit

mapping(uint156=>Deposti) public idToDeposit;

then get the deposit by id

function getDepositByID(uint id)public view {
     idToDeposit[id]
}

you install npm i @openzeppelin/contracts , import the ``Counters

 import "../node_modules/@openzeppelin/contracts/utils/Counters.sol";

in your contract:

contract Test{
       // this means all Counters.Counter types in your contract loaded with the methods of Counters library
       using Counters for Counters.Counter;
       Counters.Counter private depositIds;
}
uint public counter;

mapping(uint = > Deposit) public ids; 

function deposit() public payable {

    Deposit storage _deposit = ids[_counter]; 

    _deposit.depositAmount = msg.value; 

    _deposit.depositor = msg.sender;
    
    activeDeposits.push(_deposit);

    _counter++; 

    emit DepositMade(msg.sender, msg.value);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM