###### 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];
}
}
```