---
# System prepended metadata

title: Solidity練習 - 上鏈的member資料
tags: [Block Chain]

---

###### tags: `Block Chain`

# Solidity練習 - 上鏈的member資料 


## Feature
* 新增會員
* 會員資料含(name,age,email)
* 更新會員
* 刪除會員
* 只有自己可以更新自己的資料
* 取得所有會員名稱
* 取得特定會員
* 若會員不存在報錯

```solidity=
// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.14;

// Target
// 新增會員
// 會員資料含(name,age,email)
// 更新會員
// 刪除會員
// 只有自己可以更新自己的資料
// 取得所有會員
// 取得特定會員
// 若會員不存在報錯
// owner為第一個會員
 
 contract MEMBER {
     // member
     struct member {
        // 姓名
        string name;
        // 年齡
        uint8 age;
        // e-mail
        string email;
     }

    uint userId;

    // address to id
    mapping(address => uint) memberAddress;
     // id to address
    mapping(uint => member) memberList;
 

     
     // 第一位會員是合約擁有者
     // constructor會在合約一部署完成就執行
     constructor(string memory name,uint8 age, string memory email)  {
         userId ++;
         memberAddress[msg.sender] = userId;
         memberList[userId] = member({
             name:name,
             age:age,
             email:email
         });

         
     }


    // 地址必須存在
     modifier addressMustExist(address addr){
        // 當此地址沒有userId
        require(memberAddress[addr] != 0, "this address is not exist"); 
        _;
     }

     // 地址必須不存在
     modifier addressMustNotExist(address addr){
        // 當此地址有userId
        require(memberAddress[addr] == 0, "this address is exist"); 
        _;
     }

    // 建立會員
     function create(string memory name, uint8 age, string memory email) public addressMustNotExist(msg.sender) returns(bool success) {

        // 賦予此地址userId
        userId ++ ; 
        memberAddress[msg.sender] = userId ;
        // 放入會員資料
        memberList[userId] = member({
                    name:name,
                    age:age,
                    email:email
                });
        return true;
     }
     
     // 刪除會員
     function deleteMember() public addressMustExist(msg.sender) returns(bool) {
         // delete賦予變量初始值，同時釋放空間，返回gas
         // 不可對storage的變數進行delete
         uint memberId;
         // 取得userId
         memberId = memberAddress[msg.sender];

        // 清除memberLsit
        delete memberList[memberId];
        // 清除memberAddress
        delete memberAddress[msg.sender];

         return true;
     }

     // 更新會員
     function update(string memory newName, uint8 newAge, string memory newEmail)public addressMustExist(msg.sender) returns(bool) {
            
            uint memberId;
            // 取得會員編號
            memberId = memberAddress[msg.sender];
            

            // 更新會員資訊
            memberList[memberId].name = newName;
            memberList[memberId].age = newAge;
            memberList[memberId].email =newEmail;

            return true;
     }



    // 取得所有會員的name
    function GetAllMember() public view  returns(string[] memory){
        // 與golang相同，須先宣告長度
        string[] memory result = new string[](userId);
        
        for (uint i = 0;i < userId; i++){
            result[i] =  memberList[i+1].name;
        }

        return result;
    }

    // 取得特定地址會員資料
    function GetMemberByAddress(address addr) public addressMustExist(addr)  view  returns(member memory) {
        // 取得memberId
        uint memberId = memberAddress[addr];

        return memberList[memberId];
    }

 }
```