//tips
//基本情報理解
定量発注方式は、在庫が発注点以下になった時に、在庫総費用が最小となる発注量(経済的発注量)を計算して発注する在庫管理方法。
連関図法とは、複雑な要因の絡む問題について因果関係を明らかにすることによって、問題の要因を究明する手法。問題点とその要因間の因果関係を論理的に関連付けるために連関図を作成。問題の構造と重要事項を絞り込むために用いられる。
//crypto
インターオペラビリティという言葉を調べてみると、相互運用性のことを指すよう。
各ブロックチェーンネットワークは異なるルール・仕様に基づいており、異なるブロックチェーン間のデータのやり取りが困難なので、ダイレクトに他のチェーンに送るのではなく、取引所やブリッジ、Wrapped tokenなどを使う必要があるというもの。
ブロックチェーンには独自のトークン規格(イーサリウムならERC20、BSCならBEP20など)があるためこのような対応が必要になっている。
Wrapped tokenについてもう少し調べていく。
これは他の仮想通貨の価値とペッグされている仮想通貨で、オリジナルとと同等の資産を保有し、他のブロックチェーン上でラップバージョンを発行するためには、デジタル金庫にオリジナルの資産がロックされ流ことになる。
基本的には任意のタイミングで、オリジナルの資産に償還することが可能。
投資家に代わって有価証券の管理を行う機関であるカストディアン(会社、マルチシグウォレット、DAO、スマートコントラクトなど)が必要で、カストディアンがWrappedの管理を行い、そのオリジナルの仮想通貨を保有していることの証明はオンチェーンに存在している。
AがWBTCの発行のためにBTCを送金すると、カストディアンは送られてきたBTCの枚数に応じて、イーサリウム上でWBTCを発行、WBTCをBTCに戻す時は、Aはカストディアンにバーン(焼却)リクエストを出すことでBTCがリザーブからリリースされる。
ラッピングを行うことで、持っている仮想通貨を他のチェーンに対応するものに変えられるので、それらを別チェーン上でのトレードやイールドファーミングに用いることが可能になる。ただ、ラッピングとアンラッピングにはガス代がかかるというデメリットもあることを忘れない。
また、ラッピングをする主体によってtokenの先頭に付加される英語が異なり、wBTC, hBTC, tBTC,などがある。例えばhBTCはCrypto exchange Huobi Globalが発行しているwrapped bitcoinである。
どこが発行主体かもきちんと確認しておく必要がありそう。
//smart contract
Chaiとmochaをターミナルで導入。
そもそもこれらは何ぞやというと、テストを行うために必要なもので、Mochaはjsのユニットテストツール、Chaiはassert()系のメソッドを提供するアサーションツールと呼ばれるものらしい。
もう少し調べると。
テストを行うためには、テスティングフレームワークとアサーションライブラリというものが必要で、テスティングフレームワークは、テスト全体を取りまとめて管理したり、画面に表示したりするためのもの、アサーションは、個々のテストの判定を行いその結果を返すための機能、それらのアサーションを一つにパッケージしたものが、アサーションライブラリということのよう。
若干わかってきた。
MochaとChaiを使用することでJavascriptでTDD(テスト駆動開発)やBDD(振る舞い駆動開発)を実現することができるようになるとのこと。
まずはこれらをターミナルからインストールしていく。
i chai chai-bn truffle-assertions
このコマンドが弾かれたので下記で進める。
npm install --save-dev chai truffle-assertions
npm install --save-dev chai-bn
参考:
https://kalis.me/check-events-solidity-smart-contract-test-truffle/
https://www.npmjs.com/package/chai
※またBNビッグナンバーとはjsでセーフティに扱えない数字領域を扱うもののよう。
Many operations in Ethereum operate on numbers which are outside the range of safe values to use in JavaScript.
一旦インストールできたようなので、2_migrations.jsの修正を行う。dai,link.compを全てERC20コントラクトからデプロイしていたのでそちらを変更する。
tokens.solを新たに作成。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
import "./ERC20.sol";
contract Dai is ERC20{
constructor(string memory _name,string memory _symbol,uint256 _totalSupply)ERC20(_name,_symbol,_totalSupply){
}
}
contract Link is ERC20{
constructor(string memory _name,string memory _symbol,uint256 _totalSupply)ERC20(_name,_symbol,_totalSupply){
}
}
contract Comp is ERC20{
constructor(string memory _name,string memory _symbol,uint256 _totalSupply)ERC20(_name,_symbol,_totalSupply){
}
}
一旦buildファイルを削除してから再度コンパイルを行う。
rm -rf build
truffle compile
これが終わったら、2_migrations.jsの書き換えを行う。ERC20コントラクトを使用していたものを各通貨のものに変更。
const Dai = artifacts.require("Dai");
const Link = artifacts.require("Link");
const Comp = artifacts.require("Comp");
これでデプロイしてみる。
truffle develop
migrate
問題なくデプロイできたので、dexフォルダの中にテストファイルerc20.test.jsを作成していく。
テストを行うために2_migrations.jsのdai.transfer部分をコメントアウトし、dexに送金させないようにする。
下記のようなjsのテストプログラムを作成。
const Dai = artifacts.require("Dai");
const Link = artifacts.require("Link");
const Comp = artifacts.require("Comp");
//コントラクトのビルドファイルから取得する
//rm -rf buildした理由
const BN=require("bn.js");//truffle install時に一緒に入手されている
const chai=require("chai");
const{expect}=chai;
chai.use(require("chai-bn")(BN));
const truffleAssert = require("truffle-assertion");
//ここまでがインポート
contract("ERC20 token test",(account)=>{
let dai,link,comp;
const owner=accounts[0];
const alice=accounts[1];
const bob=accounts[2];
//ここはテストを始める前に行う作業
//asyncをbeforeにつけawaitが必要なものを入れる
//非同期処理
before(async ()=>{
dai=await Dai.deployed();
link=await Link.deployed();
commp=await Comp.deployed();
});
it("Should return token names and symbols correctly",async()=>{
expect(await dai.name().to.equal("Dai"));
//dai.nameを読んだ後Daiになるかチェック
});
});
これをテストしていく。エラー。
Error: Cannot find module 'bn.js'
truffle install時に一緒に入手されているはずのbn.jsがないとのこと。
こちらをインストールして実行。すると下記のエラー。
ReferenceError: accounts is not defined
再起動して、もう一回下記の流れを実行するもエラー。
Truffle develop
Migrate
Test
Testのaccountsのsが抜けていた。typo。これを修正すると、きちんとテストが成功し、
Contract: ERC20 token test
✓ Should return token names and symbols correctly
表示がなされた。