//tips
//smart contract
まずはdexフォルダの作成。
cd dex
npm init -y
truffle init
-yをすることで、項目の入力を省略してpackage.jsonを作成できる。いつもenterでスキップしている部分を-yにすると省略できるというもの。
生成されたtruffle configの.solバージョンを設定するためコメントアウトを外し、下記のように設定。
solc: {
version: "0.8.4",
Dexのベースとなる.solコントラクトの作成。
//SPDX-License-Identifier:MIT
pragma solidity 0.8.4;
contract ERC20{
//学習版。本利用時にはopenzeppelinを使用する
string public name;
string public symbol;
uint8 public decimals=18;//少数桁数
uint256 public totalSupply;
mapping(address=>uint256) private balances;
mapping(address=>mapping(address=>uint256)) private allowances;
//transferの際にはeventを発生させる方がわかりやすい?
event Transfer(address indexed _from,address indexed _to,uint256 _value);
//documentによればapproveを実行するために使用がmustのよう
event Approval(address indexed _owner,address indexed _spender,uint256 _value);
constructor(string memory _name,string memory _symbol,uint256 _totalSupply){
name=_name;
symbol=_symbol;
totalSupply=_totalSupply;
balances[msg.sender]=totalSupply;
}
//mapから該当アドレスのdeposit残高を返す
//public でもいいが外部の人しか利用しない関数のためexternal
function balanceOf(address _owner)external view returns(uint256){
return balances[_owner];
}
//allowanaces確認用
function allowance(address _owner,address _spender)public view returns(uint256){
return allowances[_owner][_spender];//ownerのものをspenderがいくら使える権限があるか
}
function transfer(address _to,uint256 _value)external returns(bool) {
//_transferで簡略化
_transfer(msg.sender, _to, _value);
return true;//完了サインを出す
}
//第三者のfromからtoへ送金
function transferfrom(address _from,address _to,uint256 _value)external returns(bool) {
//第三者への送金なのでallowanesの送金権限確認が必要
require(allowances[_from][msg.sender>=_value],"transfer amount exceeds allowance");
//trueなどをreturnさせるよう
_transfer(_from, _to, _value);
//transferが終わったら-
allowances[_from][msg.sender]-=_value;
return true;//完了サインを出す
}
//approveは他の人の残高をどれだけ動かして良いか決めるもの
function approve(address _spender, uint256 _value)public returns(bool){
//msg.senderの残高を_spenderがどれだけ使っても良いかを決める
allowances[msg.sender][_spender]=_value;
emit Approval(msg.sender, _spender, _value);
return true;
}
function _transfer(address _from,address _to,uint256 _value)private {
//内部計算用のメソッド
require(_value <= balances[_from],"Insufficient balance");
require(_from != _to,"from=to");
balances[_from] -= _value;
balances[_to] += _value;
emit Transfer(_from, _to, _value);
}
}
.solのイベントについて調べていたら、発行されたイベントはトランザクションのレシートに記録される以上のことがわかってきたので記載。
内容としては、Solidityのeventでバックエンドであるスマートコントラクトから、フロントエンドであるクライアントへ向けたメッセージ伝達を行う役割を担えるとのこと。
要するに、フロントエンド側で通知を行うためにバックエンド側での手助けとしてイベントを使用する。
スマートコントラクトはユーザーの現在の残高など現在の状況を扱えるが、昨日受け取った ETH の合計というような状況の変化を扱うのは得意ではない。
そこでフロントエンドにその役割を託すことになるが、その際にイベントを発行することで、フロントエンドの定期チェック機能がイベントを発見し、それを通知という形でユーザーに教えることができる。
参照: