Ethereumのミートアップの課題「アドレス帳を作ろう」
2019/07/06 SingularityHIVE 開催
Ethereum Solidity入門課題
仕様
- set(string, uint8): 送信者は名前と年齢を登録する.
- getAge(address, a): アドレスに登録された年齢を得る.
- getName(address, a): アドレスに登録された名前を得る.
- getDate(address, a): アドレスに登録された日付を得る.
- hello(): 送信者へ挨拶を返す.「Hello, xxx!!」(xxxは予め登録されている名前).
アドレス帳のコード例
AddressBook.sol
pragma solidity >=0.4.22 <0.6.0;
contract AddressBook {
// 登録情報の構築
struct Info {
string name;
uint8 age;
uint date;
}
// アドレスと登録情報を紐付ける
mapping(address => Info) book;
// 挨拶の雛形
string left;
string right;
// 雛形を初期化
constructor() public {
left = "Hello, ";
right = "!!";
}
// 送信者情報を登録
function set(string name, uint8 age) public {
Info storage info = book[msg.sender];
info.name = name;
info.age = age;
info.date = now;
}
// アドレスに登録された名前を取得
function getName(address a) public view returns(string name){
Info memory info = book[a];
name = info.name;
}
// アドレスに登録された年齢を取得
function getAge(address a) public view returns(uint8 age){
Info memory info = book[a];
age = info.age;
}
// 情報が登録されたを日時を取得
function getDate(address a) public view returns(uint date) {
Info memory info = book[a];
date = info.date;
}
// 送信者に挨拶を返す
function hello() public view returns(string greet) {
Info memory sender = book[msg.sender];
string memory name = sender.name;
string memory hellox = strConnect(left, name);
greet = strConnect(hellox, right);
}
// 文字列の結合を行う
function strConnect(string str1, string str2) private pure returns(string){
bytes memory strbyte1 = bytes(str1);
bytes memory strbyte2 = bytes(str2);
bytes memory str = new bytes(strbyte1.length + strbyte2.length);
uint8 point = 0;
for(uint8 j = 0; j < strbyte1.length;j++){
str[point] = strbyte1[j];
point++;
}
for(uint8 k = 0; k < strbyte2.length;k++){
str[point] = strbyte2[k];
point++;
}
return string(str);
}
}
軽く解説
mappingでアドレスと登録情報を紐づけ
登録情報はstructで一括管理(名前,年齢,登録日時)
挨拶の雛形としてleftとrightを定義し,コンストラクタで初期化
文字列の結合を行うstrConnectメソッドを実装(参考: Solidityで文字列連結)