Data Location Assignment

contract MemoryAndStorage {

    mapping(uint => User) users;

    struct User{
        uint id;
        uint balance;
    }

    function addUser(uint id, uint balance) public {
        users[id] = User(id, balance);
    }

    function updateBalance(uint id, uint balance) public {
         users[id].balance = balance;
    }

    function getBalance(uint id) view public returns (uint) {
        return users[id].balance;
    }

}
1 Like

I just changed data location to storage and it worked!

pragma solidity 0.7.5;
contract MemoryAndStorage {

mapping(uint => User) users;

struct User{
    uint id;
    uint balance;
}

function addUser(uint id, uint balance) public {
    users[id] = User(id, balance);
}

function updateBalance(uint id, uint balance) public {
     User storage user = users[id];
     user.balance = balance;
}

function getBalance(uint id) view  public returns (uint) {
    return users[id].balance;
}

}

1 Like

I changed memory to storage in updateBalance.

pragma solidity 0.7.5;
contract MemoryAndStorage {

mapping(uint => User) users;

struct User{
    uint id;
    uint balance;
}

function addUser(uint id, uint balance) public {
    users[id] = User(id, balance);
}

function updateBalance(uint id, uint balance) public {
     User `storage` user = users[id];
     user.balance = balance;
}

function getBalance(uint id) view public returns (uint) {
    return users[id].balance;
}

}

1 Like
pragma solidity 0.7.5;
contract MemoryAndStorage {

    mapping(uint => User) users;

    struct User{
        uint id;
        uint balance;
    }

    function addUser(uint id, uint balance) public {
        users[id] = User(id, balance);
    }

    function updateBalance(uint id, uint balance) public {
         users[id].balance = balance;
    }

    function getBalance(uint id) view public returns (uint) {
        return users[id].balance;
    }

}
1 Like
pragma solidity 0.7.5;
contract MemoryAndStorage {

    mapping(uint => User) users;

    struct User{
        uint id;
        uint balance;
    }

    function addUser(uint id, uint balance) public {
        users[id] = User(id, balance);
    }

    function updateBalance(uint id, uint balance) public {
        users[id].balance = balance;
    }

    function getBalance(uint id) view public returns (uint) {
        return users[id].balance;
    }

}
1 Like
pragma solidity 0.7.5;
contract MemoryAndStorage {

    mapping(uint => User) users;

    struct User{
        uint id;
        uint balance;
    }

    function addUser(uint id, uint balance) public {
        users[id] = User(id, balance);
    }

    function updateBalance(uint id, uint balance) public {
         users[id].balance = balance;
    }

    function getBalance(uint id) view public returns (uint) {
        return users[id].balance;
    }
}
1 Like

contract MemoryAndStorage {

mapping(uint => User) users;

struct User{
    uint id;
    uint balance;
}

function addUser(uint id, uint balance) public {
    users[id] = User(id, balance);
}

function updateBalance(uint id, uint balance) public {
     User memory user = users[id];
     users**[id]**.balance = balance;
}

function getBalance(uint id) view public returns (uint) {
    return users[id].balance;
}

}

//This was the easiest way to do, using the userS[ID], the only thing is that it now also provide the addUser function so that is not the nicest way, hope to see some comment about that

edit: i didnt remove the line: User memory user = users[id]; but either when i remove or not remove this same line my result is the same, this stays also the same when i mention that the updateBalance function operates the same as the addUser function

1 Like
pragma solidity 0.7.5;
//"SPDX-License-Identifier: UNLICENSED"
contract MemoryAndStorage {

    mapping(uint => User) users;

    struct User{
        uint id;
        uint balance;
    }

    function addUser(uint id, uint balance) public {
        users[id] = User(id, balance);
    }

    function updateBalance(uint id, uint balance) public {
         User storage user = users[id];
         user.balance = balance;
    }

    function getBalance(uint id) view public returns (uint) {
        return users[id].balance;
    }

}
1 Like

We were using the local function memory. Need to update the balance of the user in storage instead.

pragma solidity 0.7.5;
contract MemoryAndStorage {

mapping(uint => User) users;

struct User{
    uint id;
    uint balance;
}

function addUser(uint id, uint balance) public {
    users[id] = User(id, balance);
}

function updateBalance(uint id, uint balance) public {
     users[id].balance = balance;
}

function getBalance(uint id) view public returns (uint) {
    return users[id].balance;
}

}

1 Like

Hi everyone,
I created 4 working versions of function to update balance. I also made some tests and calculations of costs of my solutions. I added calculations in comments. My tests and calculations show that cheapest solution is simple update balance in users map. The most expensive is creating copy of user in memory, updating balance and overwriting user in users map.

pragma solidity 0.7.5;

contract MemoryAndStorage {

    mapping(uint => User) users;

    struct User {
        uint id;
        uint balance;
    }

    /* 
        100 ETH - 99.999999999999976232 ETH = 23768 WEI 
    */
    function addUser(uint id, uint balance) public {
        users[id] = User(id, balance);
    }

    /*  
        Original function. Creating copy of user, updating balance in new created copy.
        [2] 100 ETH - 99.999999999999948203 ETH = 51797 WEI
        51797 WEI - (23768 + 4200) = 23829 WEI
    */
    function updateBalanceOriginal(uint id, uint balance) public {
        User memory user = users[id];
        user.balance = balance;
    }

    /*  
        Balance updated in users map.
        [1] 100 ETH - 99.999999999999949157 ETH = 50843 WEI
        50843 WEI - (23768 + 4200) = 22875 WEI
    */
    function updateBalanceWithBalanceOverwriting(uint id, uint balance) public {
        users[id].balance = balance;
    }

    /*  
        Variable type changed from memory (copy) to storage (pointer).
        [3] 100 ETH - 99.999999999999944922 ETH = 55078 WEI
        55078 WEI - (23768 + 4200) = 27110 WEI
    */
    function updateBalanceWithPointer(uint id, uint balance) public {
        User storage user = users[id];
        user.balance = balance;
    }

    /*  
        To original function added overwriting user in users map by user copy with updated balance.
        [5] 100 ETH - 99.999999999999942205 ETH = 57795 WEI
        57795 WEI - (23768 + 4200) = 29827 WEI
    */
    function updateBalanceWithUserCopy(uint id, uint balance) public {
        User memory user = users[id];
        user.balance = balance;
        users[id] = user;
    }

    /*  
        Overwriting user in users map with new user created from struct. 
        [4] 100 ETH - 99.999999999999944043 ETH = 55957 WEI
        55957 WEI - (23768 + 4200) =  27989 WEI
    */
    function updateBalanceWithUserOverwriting(uint id, uint balance) public {
        users[id] = User(id, balance);
    }

    /* 
        100 ETH - 99.999999999999972032 ETH = 27968 WEI
        27968 WEI - 23768 WEI =  4200 WEI
     */
    function getBalance(uint id) view public returns(uint) {
        return users[id].balance;
    }

}
2 Likes

I changed the data storage location from memory to storage.

mapping(uint => User) users;

struct User{
    uint id;
    uint balance;
}

function addUser(uint id, uint balance) public {
    users[id] = User(id, balance);
}

function updateBalance(uint id, uint balance) public {
     User storage user = users[id];
    user.balance = balance;
}

function getBalance(uint id) view public returns (uint) {
    return users[id].balance;
}

}

1 Like

Hello, my solution to the coding assignment was to change the data location of the User variable in updateBalance function from “memory” to “storage”. I may just be overthinking it, but the solution seems to be too simple to be correct. :stuck_out_tongue: Anyways, here’s the code:

pragma solidity 0.7.5;
contract MemoryAndStorage {

    mapping(uint => User) users;

    struct User{
        uint id;
        uint balance;
    }

    function addUser(uint id, uint balance) public {
        users[id] = User(id, balance);
    }

    function updateBalance(uint id, uint balance) public {
         User storage user = users[id];
         user.balance = balance;
    }

    function getBalance(uint id) view public returns (uint) {
        return users[id].balance;
    }

}
1 Like

pragma solidity 0.7.5;
contract MemoryAndStorage {

mapping(uint => User) users;

struct User{
    uint id;
    uint balance;
}

function addUser(uint id, uint balance) public {
    users[id] = User(id, balance);
}

function updateBalance(uint id, uint balance) public {
     users[id].balance = balance;
}

function getBalance(uint id) view public returns (uint) {
    return users[id].balance;
}

}

1 Like
pragma solidity 0.7.5;
contract MemoryAndStorage {

    mapping(uint => User) users;

    struct User{
        uint id;
        uint balance;
    }

    function addUser(uint id, uint balance) public {
        users[id] = User(id, balance);
    }

    function updateBalance(uint id, uint balance) public {
         users[id].balance = User(id,balance)
    }

    function getBalance(uint id) view public returns (uint) {
        return users[id].balance;
    }

}

1 Like
pragma solidity 0.7.5;
contract MemoryAndStorage {

    mapping(uint => User) users;

    struct User{
        uint id;
        uint balance;
    }

    function addUser(uint id, uint balance) public {
        users[id] = User(id, balance);
    }

    function updateBalance(uint id, uint balance) public {
         User storage user = users[id];
         user.balance = balance;
    }

    function getBalance(uint id) view public returns (uint) {
        return users[id].balance;
    }

}
2 Likes

pragma solidity 0.7.5;
contract MemoryAndStorage {

mapping(uint => User) users;

struct User{
    uint id;
    uint balance;
}

function addUser(uint id, uint balance) public {
    users[id] = User(id, balance);
}

function updateBalance(uint id, uint balance) public {
     users[id] = User(id, balance);
}

function getBalance(uint id) view public returns (uint) {
    return users[id].balance;
}

}

1 Like
pragma solidity 0.7.5;

contract MemoryAndStorage {

    mapping(uint => User) users;

    struct User{
        uint id;
        uint balance;
    }

    function addUser(uint id, uint balance) public {
        users[id] = User(id, balance);
    }

    function updateBalance(uint id, uint balance) public {
         users[id] = User(id, balance);
    }

    function getBalance(uint id) view public returns (uint) {
        return users[id].balance;
    }

}
1 Like
pragma solidity 0.7.5;
contract MemoryAndStorage {

    mapping(uint => User) users;

    struct User{
        uint id;
        uint balance;
    }

    function addUser(uint id, uint balance) public {
        users[id] = User(id, balance);
    }

    function updateBalance(uint id, uint balance) public {
         User storage user = users[id];
         user.balance = balance;
    }

    function getBalance(uint id) view public returns (uint) {
        return users[id].balance;
    }

}

1 Like
pragma solidity 0.7.5;
contract MemoryAndStorage {

    mapping(uint => User) users;

    struct User{
        uint id;
        uint balance;
    }

    function addUser(uint id, uint balance) public {
        users[id] = User(id, balance);
    }

    function updateBalance(uint id, uint balance) public {
        users[id] = User(id, balance);
        balance = balance;
    }

    function getBalance(uint id) view public returns (uint) {
        return users[id].balance;
    }

}
1 Like

hey guys,

I ended up finding out that the user was not able to get the data from the rest of the function so i ended up replacing memory in update balance with storage so it was throughout the whole function

pragma solidity 0.7.5;
contract MemoryAndStorage {

mapping(uint => User) users;

struct User{
    uint id;
    uint balance;
}

function addUser(uint id, uint balance) public {
    users[id] = User(id, balance);
}

function updateBalance(uint id, uint balance) public {
     User storage user = users[id];
     user.balance = balance;
}

function getBalance(uint id) view public returns (uint) {
    return users[id].balance;
}

}

1 Like