//tips
//smart contract
Mappingにstructを絡めて、番号やアドレスから構造体を返すmappingを作成していく。
pragma solidity ^0.5.13;
contract MappingStructExample{
//支払い金額だけではなくタイムスタンプも組み込む
struct Payment{
uint amount;
uint timestamps;
}
//balanceReceivedのアウトプットに指定することで詳細を見られる
struct Balance{
uint totalBalance;
uint numPayments;
mapping(uint =>Payment)payments;
}
//各アドレスがコントラクトに送金した額
mapping(address =>Balance)public balanceReceived;
function getBalance()public view returns(uint){
return address (this).balance;
}
function sendMoney()public payable{
//コントラクトの財布内に小分けに格納していく形
balanceReceived[msg.sender].totalBalance+=msg.value;
//構造体を新たに定義するときはmemory
//newは宣言する必要がないとのこと
Payment memory payment =Payment(msg.value,now);
balanceReceived[msg.sender].payments[balanceReceived[msg.sender].numPayments]=payment;
balanceReceived[msg.sender].numPayments++;
}
function withdrawMoney(address payable _to,uint _amount)public {
//自分の保有残高分>要求引き出し額
require(balanceReceived[msg.sender].totalBalance>=_amount,"not enough funds");
balanceReceived[msg.sender].totalBalance-=_amount;
_to.transfer(_amount);
}
function withdrawAllMoney(address payable _to)public{
uint balanceToSend=balanceReceived[msg.sender].totalBalance;
balanceReceived[msg.sender].totalBalance=0;
_to.transfer(balanceToSend);
}
}
Requireとassertの使い分けとしてはrequireがユーザーに対してリターンする場合、assertはcontractのwallet内で処理が完結する場合の検証に使用するのが一般的なよう。
function withdrawMoney(address payable _to,uint _amount)public {
//自分の保有残高分>要求引き出し額
require(balanceReceived[msg.sender]>=_amount,"not enough funds");
assert(balanceReceived[msg.sender]>=balanceReceived[msg.sender] - _amount);
balanceReceived[msg.sender]-=_amount;
_to.transfer(_amount);
}
Externalを使用することで外部コントラクトからの呼び出しができるが、今のところ使い道がいまいちわかっていない。複数コントラクトなどで参照・値の取得ができるようにする形になるのだろう。coingeckoのトークン情報取得apiがこれに当たるのか。確かに今まではgetter情報はmanagerしか見られなかったので有効かもしれない。