//tips
//基本情報理解
タスクのスケジュール関係を表すプレジデンスダイアグラム法の確認を行う際、
リード:後続のアクティビティを前倒しで開始できる時間
ラグ:後続アクティビティの開始を遅らせる時間
という用語が使われるのでそれぞれの意味を理解しておく必要がある。
逓減課金方式とは、課金対象の使用量が増えれば増えるほど、単価が安くなっていく課金方式で、使用量に対する課金額の増加額が小さくなっていく。
可用性はシステムが故障などで運用を停止することなく、正常に稼働し続けられる能力のことで、%を求められた場合は、サービス提供時間中に正常に稼働している時間の割合で表される。
//pitch deck
スタートアップ会社の資産の調達をサポートするサービスを提供するEquity Beeは起業時の人的コストとリスクへの解決策で、従業員へのストックオプション制度を手助けする方法と投資家とのうまい橋渡しを行う。
100社を超える導入起業一覧とトランザクションの成長性のグラフから商品の品質としては一定以上の信頼は得られそうだと考えた。商品内容についてはtalkで補足されたのだろうか。pitchの流れとしては参考にできそうなコンテンツ。
https://www.pitchdeckhunt.com/pitch-decks/equity-bee
//smartcontract
ERC20などのトークン規格は、トークンが持つ性質・機能が決まっており、total supplyの関数やbalanceOfなどの関数など記述名も含め全て決まっている。
開発側にとってはコーディングに直結する部分であることがわかった。
プロジェクトフォルダを作るところから動かしてみる。
mkdir dex
cd dex
npm init -y
truffle init
としたがThis directory is non-empty…のエラーが出ている。
再度試してEnterを押したらうまくいった。押し忘れていた模様。
ターミナルからvscodeを開けるようで試してみるも失敗。
方法を探しているとか下記方法を見つけた。vscodeで⇧⌘Pを押したら無事にパスが通ったよう。
ターミナルにて、「code .」codeと.の間は半角スペース込みで入れると無事にターミナルからvscodeがひらけた。感動。「code」だけでも開ける。
https://zenn.dev/ryuu/scraps/4061aaee059d89
さらにvscodeでdexフォルダこと読み込んでくれているので、中身を見ていく。
先日と同様にtruffle-config.jsのversionのコメントアウトを外しにいく。
compilers: {
solc: {
version: “0.5.1”,//solidityのバージョン
これはsolidityのバージョンなので”0.8.4”に変更。
Source file requires different compiler version (current compiler is 0.8.9+commit.e5eed63a.Emscripten.clang)
0.8.9以上にしてくれとのエラーが発生。^をつけて対応。
pragma solidity ^0.8.4;
Pragamaのwarningが気になる場合は// SPDX-License-Identifier: MITなどを記載することで消せる。どのような使い方をするかということ。
https://stackoverflow.com/questions/65234522/warning-spdx-license-identifier-not-provided-in-source-file
https://forum.openzeppelin.com/t/solidity-0-6-8-introduces-spdx-license-identifiers/2859
Eventの使い方を忘れてしまったので調べ直したら、関数にセットすることで、コントラクト上で発生した結果をログに保存したり、フロントに伝えることができるものとのこと。
その中に用いられる、indexedは、Eventのパラメーターに付与することができ、付与するとパラメーターの名前でなく値でフィルタリングを行うことができるするよう。このフィルタリングをさせることで後でデータを見やすくすることができる。
addressがindexedで定義されているため、あとでEventのデータを閲覧する際に、アドレス単位でフィルタリングをしてデータを確認できるようになる。
indexedを付与しなかった場合、Event単位でしか値を見ることができない。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
contract ERC20{
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;
//indexedを使うことで後でそのaddressをもとに検索できる
event Transfer(address indexed _from,address indexed _to,uint256 _value);
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;//創造主にコインを渡す
}
//外部からしか見ないためexternal
function balanceOf(address _owner)external view returns(uint256){
return balances[_owner];
}
//どれだけ使ってもいいかを見れる関数
function allowance(address _owner,address _spender)public view returns(uint256){
return allowances[_owner][_spender];
}
function transfer(address _to,uint256 _value) external returns(bool){
_transfer(msg.sender, _to, _value);
return true;//うまくいったらtrue
}
function transferFrom(address _from,address _to,uint256 _value)external returns(bool){
//きちんとそれだけ送れるかの確認
require(allowances[_from][msg.sender]>=_value,"Transfer amount exeeds allownaces");
_transfer(_from, _to, _value);
allowances[_from][msg.sender]-=_value;
return true;
}
//第三者が他社の資金を移動させられる状態
//なので制御する
//ダブルマッピングを使用
function approve(address _spender,uint256 _value)public returns(bool){
//どれだけ使っても良いかを決める
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);
}
}
やっとこさERC20をかけた。内容を理解するのはしんどかったが。意外にシンプル。
これは自分で作成しなくてもOpenZeppelinにて型が提供されているのでそちらを流用すれば自分版のを作れる。
https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol